Skip to content

Instantly share code, notes, and snippets.

@Totobal5
Forked from tabularelf/function_execute.gml
Created June 20, 2022 01:50
Show Gist options
  • Save Totobal5/dcf49bfc3e7bc72f89ddbac54e6df1d5 to your computer and use it in GitHub Desktop.
Save Totobal5/dcf49bfc3e7bc72f89ddbac54e6df1d5 to your computer and use it in GitHub Desktop.
A way to execute runtime/gml functions and method functions with one script.
function __func_array_insert(_array) {
var _length = argument_count-2;
var _index = argument[1]-1;
var _i = 1;
array_copy(_array,_index+_length, _array, _index, _length);
repeat(_length) {
_array[@ ++_index] = argument[++_i];
}
}
function __func_ds_list_add(_list) {
var _length = argument_count-1;
var _i = 0;
repeat(_length) {
ds_list_add(_list, argument[++_i]);
}
}
function __func_array_push(_array) {
var _length = argument_count-1;
var _i = 0;
repeat(_length) {
array_push(_array, argument[++_i]);
}
}
/// @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, _argsArray) {
var _func = _funcMethod;
var _args = !is_array(_argsArray) ? undefined : _argsArray;
var _length = !is_array(_args) ? 0 : array_length(_args);
switch(_length) {
case 0: return _func();
case 1: return _func(_args[0]);
case 2: return _func(_args[0], _args[1]);
case 3: return _func(_args[0], _args[1], _args[2]);
case 4: return _func(_args[0], _args[1], _args[2], _args[3]);
case 5: return _func(_args[0], _args[1], _args[2], _args[3], _args[4]);
case 6: return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5]);
case 7: return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6]);
case 8: return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7]);
case 9: return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8]);
case 10: return _func(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8], _args[9]);
case 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]);
case 12: 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]);
case 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]);
case 14: 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]);
case 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], _args[14]);
case 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]);
default:
// We'll call this only if we're executing more than necessary.
var _self = self;
if is_method(_func) {
_self = method_get_self(_func);
// We'll go back to self if it's undefined.
if (_self == undefined) {
_self = self;
}
_func = method_get_index(_func);
}
// Use this switch statement to check against if it matches one of two infinite argument built in functions.
switch(_func) {
case array_insert: _func = __func_array_insert; break;
case ds_list_add: _func = __func_ds_list_add; break;
case array_push: _func = __func_array_push; break;
}
with(_self) {
return script_execute_ext(_func, _args);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment