Comment puis-je inclure un autre fichier js dans la v8 d'aujourd'hui?

Nov 23 2020

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:

  1. String::Newest supprimé et maintenant un String::NewFromUtf8Literalbesoin Isolate* isolatedont je ne sais pas comment passer à la fonction Include, dois-je juste ajouter ceci avant const Arguments& args?
  2. Script::Compileprend un Contextobjet comme paramètre maintenant
  3. 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:

  1. Il semble que je ne puisse pas obtenir Localde a Persistent, 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>
    
  2. Il y a des erreurs String::NewFromUtf8Literalici

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

Réponses

1 jmrk Nov 24 2020 at 12:15

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::Compileprend un Contextobjet 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::Persistentfichier et créez-en un v8::Localchaque 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 Loadfonction fait à peu près ce que vous voulez.