Wie kann ich eine andere js-Datei in die heutige Version 8 aufnehmen?

Nov 23 2020

Ich finde einen alten anwser und später aktualisiert hier , aber es ist schwer für mich , auf die neueste (2020) V8 - Version diesen Code anzupassen.

Es gibt viele Schwierigkeiten, auf die ich stoße:

  1. String::Newwird entfernt und jetzt ein String::NewFromUtf8LiteralBedarf, Isolate* isolateden ich nicht an die Funktion übergeben kann Include, sollte ich dies einfach vorher hinzufügen const Arguments& args?
  2. Script::Compilenimmt Contextjetzt ein Objekt als Parameter
  3. Und ich weiß nicht, wo ich die letzten beiden Zeilencodes platzieren soll
    Handle<ObjectTemplate> global = ObjectTemplate::New();
    global->Set(String::New("include"), FunctionTemplate::New(Include));
    

- UPDATE -

Nach einiger Arbeit habe ich meinen Code so .

Aufgrund der folgenden Fehler wird es jedoch immer noch nicht kompiliert:

  1. Scheint, dass ich kein Localvon einem bekommen kann Persistent, selbst wenn ich Danijars Strategie angewendet habe . Vielleicht liegt es daran, dass ich den Konstruktor nicht verwendet habe, aber ich glaube nicht, dass ich hier innerhalb dieses Funktionsumfangs einen Persist konstruieren kann.

    samples/import.cc:74:103: Error:cannot convert ‘v8::Local<v8::Context>’ to ‘v8::Context*’
       74 |     global_context = v8::Persistent<v8::Context, CopyablePersistentTraits<v8::Context>>::New(isolate, local_context);
          |                                                                                                       ^~~~~~~~~~~~~
          |                                                                                                       |
          |                                                                                                       v8::Local<v8::Context>
    
  2. Es gibt einige Fehler mit String::NewFromUtf8Literalhier

    samples/import.cc:34:110: Error:‘static v8::Local<v8::String> v8::String::NewFromUtf8Literal(v8::Isolate*, const char*, v8::NewStringType, int)’ is private within this context
       34 |   Handle<String> source = String::NewFromUtf8Literal(args.GetIsolate(), buff, v8::NewStringType::kNormal, len);
          |   
    

Antworten

1 jmrk Nov 24 2020 at 12:15

Ich weiß nicht, wie ich an die Funktion Include übergeben soll. Soll ich das vorher hinzufügen const Arguments& args?

Nein, Sie können die Signatur von Funktionen, die von JS aufgerufen werden, nicht ändern, müssen jedoch nicht: FunctionCallbackInfo(was der Ersatz für ist Arguments) eine GetIsolate()Methode haben.

Script::CompileContextNimmt jetzt ein Objekt als Parameter

Da Sie eine Frage dazu haben, verwenden Sie vermutlich nur einen einzigen Kontext für alles. Speichern Sie es einfach in einem v8::Persistentund erstellen Sie ein v8::Localdaraus, wann immer Sie es benötigen. (Vorerst können Sie auch den veralteten Isolate::GetCurrentContext()Code verwenden , aber für neu geschriebenen Code würde ich davon abraten, da Sie in Zukunft nur dann mehr Arbeit für sich selbst schaffen würden, wenn Sie von ihm weg migrieren müssen.)

Ich weiß nicht, wo ich die letzten beiden Zeilencodes einfügen soll

Überall dort, wo Sie das globale Objekt einrichten, irgendwo in der Startsequenz Ihrer App.

All diese Fragen (und mehr) könnten beantwortet werden, indem Sie die "Shell" -Beispiel-App studieren, die das V8-Projekt verwaltet: https://chromium.googlesource.com/v8/v8/+/master/samples/shell.cc. Insbesondere macht seine LoadFunktion so ziemlich das, was Sie wollen.