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

时间:2019-06-26 06:51:51

标签: c++ v8

我需要在我的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

我希望应该有一些方法可以使上下文在一定时间内保持活动状态。我只是不明白。

有人可以帮忙学习如何在特定时间之前保持上下文(例如会话的生命周期)。

1 个答案:

答案 0 :(得分:1)

与您存储v8::Isolate的位置相邻,您应该能够将上下文存储在v8::Global中(也就是v8::Global<v8::Context>)。

有关示例,请参见以下Chromium代码。

https://cs.chromium.org/chromium/src/extensions/renderer/script_context.h?l=254&rcl=6f4a318b668d531303276b6bac424ab4bce9911b

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