如何维护V8上下文以备将来使用

How to maintain the V8 contexts for future use?

本文关键字:将来 上下文 V8 何维护 维护      更新时间:2023-10-16

我需要在我的C代码中使用V8执行JavaScript。我的C应用程序访问Web服务器链接并获取HTML数据,图像和JavaScript。例如,我有2个JavaScript说JS1.JS和JS2.JS,如下所示。

JS1.JS

function js_add_elements(var1, var2) 
{ 
    var var3 = parseInt(var1) + parseInt(var2); 
    var result = 'Addition of ' + var1 + ' and ' + var2 + ' results ' + var3; 
    return result; 
}

JS2.JS

js_add_elements(2, 3);



通常,我们需要很少的对象来在V8中运行JavaScript。我称其为"全局数据结构"中的一些上下文,我称其为实例。

Instance level contexts    
std::unique_ptr<v8::Platform> platform;
v8::Isolate::CreateParams create_params;
v8::Isolate *isolate;
v8::Isolate::Scope *isolate_scope;



而且,我在下面的功能中保留了一些本地成员的上下文。

Local contexts in a function
v8::HandleScope handle_scope;
v8::Local<v8::Context> context;
v8::Context::Scope context_scope;
v8::Local<v8::String> source;
v8::Local<v8::Script> script;



保留上面的上下文,我可以运行js1.js和js2.js并获得所需的结果。说一段时间后,我从服务器中获得JS3.js,并显示下面的文件。

JS3.JS

js_add_elements(5, 6); 
js_add_elements(7, 8);



现在问题开始了。我将尝试执行JS3.JS。到这个时候,在本地功能中声明的上下文已被删除(垃圾收集器(。当我尝试执行js3.js时,上下文将是新分配的,并且不会具有JS1.JS,因此结果 undefined

我希望应该有某种方法可以在一定时期内保持上下文的活力。我只是没有得到它。

有人可以帮助学习如何保持上下文的活力直到某些时间(例如,会议的一生(。

毗邻您存储的v8::Isolate的位置,您应该能够将上下文存储在v8::Global(因此v8::Global<v8::Context>(中。

示例参见以下铬代码。

https://cs.chromium.org/chromium/src/extensions/renderer/script_context.h?l=254&amp;rcl = 6f4a318b668b668d531303276b6b6bac42424bac4bce999999999999911b>>

https://cs.chromium.org/chromium/src/extensions/renderer/script_context.cc?l=109&amp; amp;rcl = 6f4a318b668b668d531303276b6bac4242424bcc4bce999911b