Skip to content

Instantly share code, notes, and snippets.

@tabularelf
Last active October 4, 2023 23:46
Show Gist options
  • Save tabularelf/287cf766c00fca09e13bbdd7a4fa0ab2 to your computer and use it in GitHub Desktop.
Save tabularelf/287cf766c00fca09e13bbdd7a4fa0ab2 to your computer and use it in GitHub Desktop.
Executing functions or methods with an array of arguments
/// @func function_execute( function/method, [arguments_in_array])
/// @desc Executes a runtime function, GML function or method, respecting method rules.
/// @param function/method
/// @param [arguments_in_array]
function function_execute(_funcMethod, _args = undefined) {
gml_pragma("forceinline");
if (is_undefined(_args)) return _funcMethod();
var _func = _funcMethod;
var _self = self;
if (is_method(_func)) {
_self = method_get_self(_func) ?? self;
_func = method_get_index(_func);
}
with(_self) {
return script_execute_ext(_func, _args);
}
}
@tinkerer-red
Copy link

tinkerer-red commented Oct 4, 2023

Would like to note this is substantially faster then the waterfall of doom. Even the optimized version suggested by YAL.

Results:
image

/// @func function_execute_waterfall_of_doom( function/method, [arguments_in_array])
/// @desc Executes a runtime function, GML function or method, respecting method rules.
/// @param function/method
/// @param [arguments_in_array]
/// @returns {any}
function function_execute_waterfall_of_doom(_func, _args = undefined) {
  gml_pragma("forceinline");
  var _length = array_length(_args);
	
	//An alternitive to the waterfall of doom as proposed by YellowAfterlife
	if (_length > 16) {
		show_error("Can not run function: \""+script_get_name(_func)+"\" with more then 16 arguments. \nArguments:"+string(_args), true)
	}
	
	if (_length < 8) {
		if (_length < 4) {
			if (_length < 2) {
				if (_length == 1) {
					return _func(_args[0])
				}
				else{
					return _func()
				}
			}
			else {
				if (_length == 3) {
					return _func(_args[0], _args[1], _args[2])
				}
				else{
					return _func(_args[0], _args[1])
				}
			}
		}
		else {
			if (_length < 6) {
				if (_length == 5) {
					return _func(_args[0], _args[1], _args[2], _args[3], _args[4])
				}
				else{
					return _func(_args[0], _args[1], _args[2], _args[3])
				}
			}
			else {
				if (_length == 7) {
					return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6])
				}
				else{
					return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5])
				}
			}
		}
	}
	else {
		if (_length < 12) {
			if (_length < 10) {
				if (_length == 9) {
					return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8])
				}
				else{
					return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7])
				}
			}
			else {
				if (_length == 11) {
					return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8], _args[9], _args[10])
				}
				else{
					return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8], _args[9])
				}
			}
		}
		else {
			if (_length < 14) {
				if (_length == 13) {
					return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8], _args[9], _args[10], _args[11], _args[12])
				}
				else{
					return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8], _args[9], _args[10], _args[11])
				}
			}
			else {
				if (_length < 15) {
					return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8], _args[9], _args[10], _args[11], _args[12], _args[13])
				}
				else{
					if (_length == 16) {
						return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8], _args[9], _args[10], _args[11], _args[12], _args[13], _args[14], _args[15])
					}
					else {
						return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8], _args[9], _args[10], _args[11], _args[12], _args[13], _args[14])
					}
				}
			}
		}
	}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment