diff --git a/source/funkin/backend/system/macros/Utils.hx b/source/funkin/backend/system/macros/Utils.hx new file mode 100644 index 00000000..f55797d2 --- /dev/null +++ b/source/funkin/backend/system/macros/Utils.hx @@ -0,0 +1,39 @@ +package funkin.backend.system.macros; + +#if macro +import haxe.macro.Expr.ExprDef; +#end + +class Utils { + macro public static function generateReflectionLike(totalArguments:Int, funcName:String, argsName:String) { + #if macro + totalArguments++; + + var funcCalls = []; + for(i in 0...totalArguments) { + var args = [ + for(d in 0...i) macro $i{argsName}[$v{d}] + ]; + + funcCalls.push(macro $i{funcName}($a{args})); + } + + var expr = { + pos: Context.currentPos(), + expr: ESwitch( + macro ($i{argsName}.length), + [ + for(i in 0...totalArguments) { + values: [macro $v{i}], + expr: funcCalls[i], + guard: null, + } + ], + macro throw "Too many arguments" + ) + } + + return expr; + #end + } +} \ No newline at end of file diff --git a/source/funkin/backend/utils/NdllUtil.hx b/source/funkin/backend/utils/NdllUtil.hx index 8b4eb79b..f50d0026 100644 --- a/source/funkin/backend/utils/NdllUtil.hx +++ b/source/funkin/backend/utils/NdllUtil.hx @@ -26,7 +26,7 @@ class NdllUtil { /** * Returns an function from a Haxe NDLL. - * Limited to 20 argument due to a limitation + * Limited to 25 argument due to a limitation * * @param ndll Name of the NDLL. * @param name Name of the function. @@ -36,32 +36,9 @@ class NdllUtil { #if NDLLS_SUPPORTED var func:Dynamic = getFunctionFromPath(Paths.ndll('$ndll-$os'), name, args); - // I hate this code below, at least it wasnt 390625 switch cases, but like reflect.callmethod doesnt work with c++ functions return Reflect.makeVarArgs(function(a:Array) { - return switch(a.length) { - case 0: func(); - case 1: func(a[0]); - case 2: func(a[0], a[1]); - case 3: func(a[0], a[1], a[2]); - case 4: func(a[0], a[1], a[2], a[3]); - case 5: func(a[0], a[1], a[2], a[3], a[4]); - case 6: func(a[0], a[1], a[2], a[3], a[4], a[5]); - case 7: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6]); - case 8: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]); - case 9: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]); - case 10: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]); - case 11: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10]); - case 12: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]); - case 13: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12]); - case 14: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13]); - case 15: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14]); - case 16: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); - case 17: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15], a[16]); - case 18: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15], a[16], a[17]); - case 19: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15], a[16], a[17], a[18]); - case 20: func(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15], a[16], a[17], a[18], a[19]); - default: throw "Too many arguments"; - }; + // This generates horrific code + return funkin.backend.system.macros.Utils.generateReflectionLike(25, "func", "a"); //return Reflect.callMethod(null, func, a); // wouldnt work for some reason, maybe cause like c++ functions doesnt have reflection enabled }); #else