Even more cleanup

This commit is contained in:
NeeEoo
2023-08-16 11:09:42 +02:00
parent eb6991dcfc
commit 8224293439
2 changed files with 42 additions and 26 deletions
@@ -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
}
}
+3 -26
View File
@@ -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<Dynamic>) {
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