gpt4 book ai didi

c++ - 如何维护 V8 上下文以供将来使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:41 24 4
gpt4 key购买 nike

我需要在我的 C 代码中使用 V8 执行 Javascript。我的 C 应用程序访问 Web 服务器链接并获取 html 数据、图像和 javascript。例如,我有 2 个 javascripts,分别是 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

我希望应该有一些方法可以让上下文在一定时期内保持事件状态。我就是不明白。

有人可以帮助学习如何将上下文保持事件状态直到特定时间(比如 session 的生命周期)。

最佳答案

靠近您存放 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

关于c++ - 如何维护 V8 上下文以供将来使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56766825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com