Comment puis-je inclure un autre fichier js dans la v8 d'aujourd'hui?
Je trouve une ancienne réponse et des mises à jour ultérieures ici , mais il m'est difficile d'adapter ce code à la dernière version (2020) V8.
Il y a de nombreuses difficultés que je rencontre:
String::New
est supprimé et maintenant unString::NewFromUtf8Literal
besoinIsolate* isolate
dont je ne sais pas comment passer à la fonctionInclude
, dois-je juste ajouter ceci avantconst Arguments& args
?Script::Compile
prend unContext
objet comme paramètre maintenant- Et je ne sais pas où mettre les deux derniers codes de ligne
Handle<ObjectTemplate> global = ObjectTemplate::New(); global->Set(String::New("include"), FunctionTemplate::New(Include));
-- METTRE À JOUR --
Après quelques travaux, j'ai mon code comme celui- ci .
Cependant, il ne se compilera toujours pas à cause d'erreurs:
Il semble que je ne puisse pas obtenir
Local
de aPersistent
, même si j'ai utilisé la stratégie de danijar . C'est peut-être parce que je n'ai pas utilisé le constructeur, mais je ne pense pas que je puisse construire un Persist ici dans cette portée de fonction.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>
Il y a des erreurs
String::NewFromUtf8Literal
icisamples/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); |
Réponses
Je ne sais pas comment passer à la fonction Inclure, dois-je simplement ajouter ceci avant
const Arguments& args
?
Non, vous ne pouvez pas modifier la signature des fonctions qui seront appelées à partir de JS, mais vous n'avez pas besoin de: FunctionCallbackInfo
(qui remplace Arguments
) a une GetIsolate()
méthode.
Script::Compile
prend unContext
objet comme paramètre maintenant
Puisque vous avez une question à ce sujet, je suppose que vous n'utilisez qu'un seul contexte pour tout. Stockez-le simplement dans un v8::Persistent
fichier et créez-en un v8::Local
chaque fois que vous en avez besoin. (Pour le moment, vous pouvez également utiliser le Isolate::GetCurrentContext()
code obsolète , mais pour le code nouvellement écrit, je vous le déconseille, car vous ne créeriez plus de travail pour vous-même à l'avenir que lorsque vous devez en migrer.)
Je ne sais pas où mettre les deux derniers codes de ligne
Partout où vous configurez l'objet global, quelque part dans la séquence de démarrage de votre application.
Toutes ces questions (et plus encore) pourraient trouver une réponse en étudiant l'exemple d'application "shell" que le projet V8 gère: https://chromium.googlesource.com/v8/v8/+/master/samples/shell.cc. En particulier, sa Load
fonction fait à peu près ce que vous voulez.