Richtiger Weg, denselben Code zweimal in v8 auszuführen (Array außerhalb der Grenzen schlägt beim zweiten Durchlauf fehl - deoptimizer)

8

Das folgende Programm basiert auf dem Beispiel auf der Seite Erste Schritte . Ich habe drei Änderungen vorgenommen, um ein Problem zu demonstrieren:

  • Ich erstelle ein leeres Array und lege es in den globalen Kontext.
  • Das ausgeführte Skript verweist auf das nullte Element im Array, das undefined zurückgeben soll.
  • Ich führe das kompilierte Skript zweimal aus.

Der erste Lauf funktioniert gut. Der zweite Fehler: v8 ruft V8_Fatal () in Deoptimizer :: DoComputeCompiledStubFrame () auf, weil descriptor- & gt; register_param_count_ == -1.

Mache ich hier etwas falsch? Wie kann ich es beheben?

%Vor%

HINWEISE:

  • Dies ist der gesamte Hauptteil von main ().
  • Andere Fragmente von JavaScript-Code werden zweimal ohne Probleme ausgeführt. Irgendwie bezieht sich das auf die Out-of-Bound-Array-Referenz, die möglicherweise eine De-Optimierung auslöst.
  • Ich möchte das Skript nicht jedes Mal neu kompilieren, weil ich diese Skripts normalerweise tausende Male und manchmal millionenfach durchführe.
  • Ich habe versucht, das Skript als UnboundScript zu kompilieren und dann für jede Ausführung zu binden, aber das Ergebnis ist dasselbe.
  • Ich habe dies als v8-Problem gemeldet, aber niemand hat geantwortet, also ich Hoffe, dass die StackOverflow-Community helfen kann.
  • Ich sehe das auf VS2012 Update 4, aber ich sehe es auch auf VS2008, sowohl in x64 und x86 als auch in Debug und Release.
Oliver Bock 16.07.2014, 01:59
quelle

1 Antwort

4

OK, habe es gefunden. Das Problem ist ein nicht initialisierter Code-Stub für Wörterbuchlasten - Ihr Anwendungsfall löst dies als Fehler aus, da der Stub nicht auf andere Weise initialisiert wird, zB durch Kompilierung.

Unten ist ein Patch gegen die v8-Stammversion 22629, der das Problem für mich behebt, getestet unter Windows 2010 mit VS 2010 und Linux mit g ++ 4.9. Bitte lassen Sie mich wissen, wie Sie damit umgehen:

%Vor%

Um das Problem zu umgehen, wenn Sie vorerst keinen eigenen V8 kompilieren möchten, können Sie Code für jedes Isolate ausführen, das KeyedLoadDictionaryElementStub direkt verwendet, bevor Sie den Code ausführen Stub. So etwas wie das Folgende funktioniert für mich:

%Vor%     
msandiford 27.07.2014, 10:42
quelle

Tags und Links