Jak mogę dołączyć kolejny plik js do dzisiejszej wersji 8?

Nov 23 2020

Uważam starą anwser a później aktualizuje tutaj , ale jest mi trudno przystosować ten kod do najnowszej wersji (2020) V8.

Jest wiele trudności, które napotykam:

  1. String::Newzostał usunięty, a teraz String::NewFromUtf8Literalpotrzebuje Isolate* isolatei nie wiem, jak przekazać do funkcji Include, czy powinienem to wcześniej dodać const Arguments& args?
  2. Script::Compileprzyjmuje teraz Contextobiekt jako parametr
  3. I nie wiem, gdzie umieścić ostatnie dwa kody linii
    Handle<ObjectTemplate> global = ObjectTemplate::New();
    global->Set(String::New("include"), FunctionTemplate::New(Include));
    

-- AKTUALIZACJA --

Po jakimś pracy, mam kod podobnie do tego .

Jednak nadal nie będzie się kompilować z powodu błędów:

  1. Wygląda na to, że nie mogę dostać Localod a Persistent, nawet ja użyłem strategii danijara . Może to dlatego, że nie użyłem konstruktora, ale nie sądzę, żebym mógł skonstruować Persist w tym zakresie funkcji.

    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. Występują String::NewFromUtf8Literaltutaj błędy

    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);
          |   
    

Odpowiedzi

1 jmrk Nov 24 2020 at 12:15

Nie wiem, jak przejść do funkcji Uwzględnij, czy powinienem to wcześniej dodać const Arguments& args?

Nie, nie możesz modyfikować sygnatury funkcji, które będą wywoływane z JS, ale nie musisz: FunctionCallbackInfo(co jest zamiennikiem Arguments) ma GetIsolate()metodę.

Script::Compileprzyjmuje teraz Contextobiekt jako parametr

Ponieważ masz pytanie na ten temat, domyślam się, że do wszystkiego używasz tylko jednego kontekstu. Po prostu przechowuj go w pliku v8::Persistenti utwórz v8::Localz niego, kiedy tylko tego potrzebujesz. (Na razie możesz również użyć przestarzałego Isolate::GetCurrentContext()kodu, ale w przypadku nowo napisanego kodu odradzam to, ponieważ stworzyłbyś więcej pracy dla siebie w przyszłości, gdy będziesz musiał z niego migrować.)

Nie wiem, gdzie umieścić ostatnie dwa kody linii

Gdziekolwiek konfigurujesz obiekt globalny, gdzieś w sekwencji uruchamiania aplikacji.

Na wszystkie te pytania (i nie tylko) można odpowiedzieć, studiując przykładową aplikację „shell”, którą obsługuje projekt V8: https://chromium.googlesource.com/v8/v8/+/master/samples/shell.cc. W szczególności jego Loadfunkcja robi prawie to, co chcesz.