मैं आज के v8 में एक और js फ़ाइल कैसे शामिल कर सकता हूँ?

Nov 23 2020

मुझे यहां एक पुरानी anwser और बाद की अपडेट मिलती है , लेकिन मेरे लिए इस कोड को नवीनतम (2020) V8 संस्करण के अनुकूल बनाना कठिन है।

मेरे सामने कई कठिनाइयाँ हैं:

  1. String::Newहटा दिया गया है और अब एक String::NewFromUtf8Literalजरूरत है Isolate* isolateजिसे मैं नहीं जानता कि कैसे कार्य Includeकरना है, क्या मुझे इसे पहले जोड़ना चाहिए const Arguments& args?
  2. Script::CompileContextअब परमट के रूप में एक वस्तु लेता है
  3. और मुझे नहीं पता कि अंतिम दो लाइन कोड कहां रखे जाएं
    Handle<ObjectTemplate> global = ObjectTemplate::New();
    global->Set(String::New("include"), FunctionTemplate::New(Include));
    

-- अपडेट करें --

कुछ काम के बाद, मेरा कोड इस तरह है ।

हालाँकि, यह अभी भी त्रुटियों के कारण संकलित नहीं होगा:

  1. लगता है कि मैं एक Localसे नहीं मिल सकता है Persistent, यहां तक ​​कि मैं danijar की रणनीति का इस्तेमाल किया है । शायद ऐसा इसलिए है क्योंकि मैंने कंस्ट्रक्टर का इस्तेमाल नहीं किया है, लेकिन मुझे नहीं लगता कि मैं इस फंक्शन स्कोप के अंदर यहां कोई पर्सिस्ट बना सकता हूं।

    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. यहां कुछ त्रुटियां String::NewFromUtf8Literalहैं

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

जवाब

1 jmrk Nov 24 2020 at 12:15

मुझे नहीं पता कि फ़ंक्शन को कैसे पास किया जाए, क्या मुझे इसे पहले जोड़ना चाहिए const Arguments& args?

नहीं, आप जेएस से बुलाए जाने वाले कार्यों के हस्ताक्षर को संशोधित नहीं कर सकते हैं, लेकिन आपको इसकी आवश्यकता नहीं है: FunctionCallbackInfo(जिसके लिए प्रतिस्थापन Arguments) एक GetIsolate()विधि है।

Script::CompileContextअब पैरामीटर के रूप में एक वस्तु लेता है

जब से आप इस बारे में सवाल कर रहे हैं, मुझे लगता है कि आप केवल एक ही संदर्भ का उपयोग कर रहे हैं सब कुछ के लिए। बस इसे एक स्टोर में रखें v8::Persistent, और v8::Localजब भी आपको इसकी आवश्यकता हो, तब से इसे बनाएं । (कुछ समय के लिए, आप पदावनत का भी उपयोग कर सकते हैं Isolate::GetCurrentContext(), लेकिन नए लिखित कोड के लिए मैं उसके खिलाफ सलाह दूंगा, क्योंकि आप भविष्य में केवल अपने लिए और अधिक काम पैदा करेंगे, जब आपको इससे दूर भागना होगा।)

मुझे नहीं पता कि आखिरी दो लाइन कोड कहां रखें

कहीं आप अपने ऐप के स्टार्टअप सीक्वेंस में ग्लोबल ऑब्जेक्ट सेट कर रहे हैं।

इन सभी प्रश्नों (और अधिक) का उत्तर "शेल" नमूना ऐप का अध्ययन करके दिया जा सकता है जो V8 प्रोजेक्ट रखता है: https://chromium.googlesource.com/v8/v8/+/master/samples/shell.cc। विशेष रूप से, इसका Loadकार्य बहुत अधिक है जो आप चाहते हैं।