"""Tweede eval-plek in de embind-lijmcode: __emval_create_invoker. Zelfde vier gevallen, zonder new Function."""
import sys

path = sys.argv[1]
s = open(path).read()
a = s.index('var functionBody;switch(kind){', s.index('var __emval_create_invoker='))
end_marker = '(...Object.values(captures));'
b = s.index(end_marker, a) + len(end_marker)
assert 'new Function(Object.keys(captures),functionBody)' in s[a:b], 'onverwachte versie'

NEW = (
    "var invokerFunction=function(handle,methodName,destructorsRef,argsPtr){"
    "var vals=new Array(argFromPtr.length);"
    "for(var q=0;q<argFromPtr.length;++q){vals[q]=argFromPtr[q](argsPtr+q*GenericWireTypeSize)}"
    "var rv;"
    "if(kind===0){var f0=Emval.toValue(handle);rv=f0.apply(undefined,vals)}"
    "else if(kind===1){var obj=Emval.toValue(handle);rv=obj[getStringOrSymbol(methodName)].apply(obj,vals)}"
    "else if(kind===2){var C=Emval.toValue(handle);rv=Reflect.construct(C,vals)}"
    "else{rv=vals[vals.length-1]}"
    "if(!retType.isVoid){return emval_returnValue(toReturnWire,destructorsRef,rv)}"
    "};"
)
s = s[:a] + NEW + s[b:]
open(path, 'w').write(s)
print('gepatcht | resterende new Function:', s.count('new Function('), '| eval(:', s.count('eval('))
