Ich arbeite an einem Compiler mit System.Reflection.Emit
, und ich bekomme JIT Limitierungsfehler, die ich nicht herausfinden kann. Das Problem tritt bei meiner Implementierung von Funktionshandles auf. I.e. Generieren des Codes für
Aufgrund von Spezifikationen, auf die ich keinen Einfluss habe, wird die Sprache dynamisch typisiert, sodass ich nicht wissen kann, wie viele Argumente f
zur Kompilierzeit erwartet. Um dem entgegenzuwirken, erzeuge ich eine neue Methode, Ldftn
, anstatt ein foo
für λfoo
auszugeben, das ein Array der im Aufrufausdruck angegebenen Argumente entgegennimmt und sie auf den Evaluierungsstapel für foo
verschiebt. Ist das in der CLR erlaubt?
Was ich jetzt bekomme, ist eine "JIT hat eine interne Begrenzung gefunden" -Ausnahme (oder "CLR hat ein ungültiges Programm entdeckt", wenn ich die Assembly speichere und sie ausführe, anstatt sie aus dem Speicher aufzurufen) mit einem Stack-Trace passiert in λfoo
. Dies ist die IL, die ich erzeuge.
@leppie hat es in den Kommentaren bekommen: der Stack muss deterministisch sein; Es ist nicht in dem Code, den ich generiert habe (auch wenn ich weiß, dass es die richtige Anzahl von Argumenten drückt). Ich konnte das umgehen, weil der Compiler genug Informationen hatte, um die Schleife (daher die Konstanten in der generierten IL) zu entrollen und so einen deterministischen Stack zu erzeugen.
Tags und Links c# reflection.emit il