Habe ich einen Fehler in diesem IL gemacht, den ich nicht sehe?

8

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

%Vor%

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.

%Vor%     
cthom06 04.02.2013, 16:02
quelle

1 Antwort

7

@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.

    
cthom06 04.02.2013 17:08
quelle

Tags und Links