Jak mogę dołączyć kolejny plik js do dzisiejszej wersji 8?
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:
String::New
został usunięty, a terazString::NewFromUtf8Literal
potrzebujeIsolate* isolate
i nie wiem, jak przekazać do funkcjiInclude
, czy powinienem to wcześniej dodaćconst Arguments& args
?Script::Compile
przyjmuje terazContext
obiekt jako parametr- 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:
Wygląda na to, że nie mogę dostać
Local
od aPersistent
, 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>
Występują
String::NewFromUtf8Literal
tutaj błędysamples/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
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::Compile
przyjmuje terazContext
obiekt 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::Persistent
i utwórz v8::Local
z 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 Load
funkcja robi prawie to, co chcesz.