问题标签 [embedded-v8]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
node.js - 使指向已删除 C++ 对象的句柄无效
当一个暴露给 v8 的 C++ 对象被删除时,如何使可能指向该对象的句柄无效。
我使用 v8 作为更大应用程序的脚本接口。大型应用程序中的对象在 v8 中使用节点的 ObjectWrap 类进行包装和访问。
问题是,包装对象的生命周期是有限的。如果,在 javascript 中,我执行类似:
我希望它的行为就像评论所说的那样。在 win.close() 之后(或其他一些可能超出 JS 控制的事件),任何对 win 或重复句柄的访问都需要失败。
目前,我必须将包装的 C++ 对象标记为无效并检查每个方法调用的有效性。这是唯一的方法,还是有办法将句柄标记为不再有效?
javascript - Rubyracer(Ruby 的 V8 绑定)执行速度非常慢
因此,我在eventmachine中有一个 TCP 服务器,而rubyracer被用作将操作(如过滤器或扩展)预置到服务器的一种方式。当服务器没有接收到大量数据时,这一切都很有趣,但是当它被淹没(有时需要)时,它变得非常慢。
所以,我做了一个小基准测试,看看 rubyracer 与 Ruby 相比有多慢,当我看到结果时我很震惊:
老实说,我不介意它是否很慢,但我不希望它在完成数据处理之前锁定我的整个服务器。使用EM::defer
并不是一个真正的选择(我试过了,但它有时会产生大量线程,具体取决于洪水的强度)。我无法绕过洪水,因为我没有设计协议,而客户端要求它们像那样(尽管它很可怕)。
基准代码:
编辑
问题:有没有办法消除由 therubyracer 引起的瓶颈?通过其他方式将 JavaScript 实现到 Ruby 中是可以接受的。
2012 年 3 月 7 日更新
因此,我设法优化了代码,因为我发现导致瓶颈的原因是 Ruby<->JS 通信,每次[native code]
执行时都会发生这种情况,因为 ruby 对类使用 getter 和 setter 方法,或者当对象在语言之间直接传递时。
因此,我通过在 JS 端缓存来减少 Ruby 和 JS 之间的调用次数,但这并没有像我希望的那样优化它,因为至少必须将一个对象传递给函数:aHash
或至少一个 JSON String
,我什至达到了传递 a 的长度Fixnum
——这让我惊呼 FML——这并没有比传递一个字符串(如果有的话)有很大的改进。
我仍然希望有一个比我更好更快的解决方案。
python - 从具有无效 xpath 的 PyV8 上下文中调用 lxml 的 .xpath() 会使 Python 崩溃。为什么?
从具有无效 xpath 的 PyV8 上下文中调用 lxml 的 .xpath() 会使 Python 崩溃。为什么?
有没有一种方法可以在尝试调用 .xpath 之前使用 lxml 来检查 s 是否是有效的 xpath 表达式?
PS:如果相关,请提供额外信息:我使用的是 Python 2.6,在 Macbook 上运行的 Win 7 32 位(英特尔的 Core2 Duo P7450 CPU)
重现错误的脚本:
编辑:更改标题并添加脚本以重现错误。最初的问题是为什么 xpath 表达式中的前导 ':' 字符会导致错误,但是当从 PyV8 上下文中调用 xpath 时,任何无效的 xpath 表达式都可能导致问题。
javascript - 如何“锁定”V8?
我是 V8 的新手,并计划在 python Web 应用程序中使用它。目的是让用户提交和执行某些 JS 脚本。显然这是一种安全威胁,因此我正在寻找资源来记录人们可能“锁定”v8 的方式。例如,我可以创建一个允许调用的函数的白名单吗?还是不允许引用的库黑名单?
c++ - 作用域和线程局部变量如何在(V8 的)C++ 中工作?
我对 V8 的作用域如何工作很感兴趣。
堆栈上的范围对象如何在堆栈中找到其他范围对象和上下文?
深入研究 HandleScopes 是如何工作的,我发现它们依赖于线程局部变量。这让我想知道这些在 C++ 中是如何工作的,我已经找到了实现,但仍然觉得我不明白发生了什么。
api.cc -- HandleScope 查找当前 Isolate
隔离.cc -- 静态方法查找当前隔离作为线程本地
platform.h -- 调用低级方法来检索线程本地
platform-tls-win32.h——奇迹发生了
- 最后一种方法到底是如何工作的?
- 它怎么知道去哪里看?
- 栈的结构是什么?
c99 - 将 Google V8 嵌入 ANSI C 应用程序 - 从哪里开始?
我想将 javascript 引擎嵌入到 ANSI C 应用程序中。
事实上,我希望能够运行一些在运行时输入的代码,同时能够与一些 C 变量和函数进行交互。
那么,V8 是唯一的选择吗?我应该从哪里开始?
c++ - 使用参数从 c++ 调用 v8 javascript 函数
我正在使用 c++ 和 v8,并且遇到了以下挑战:我希望能够使用 v8 在 javascript 中定义一个函数,然后稍后通过 c++ 调用该函数。此外,我希望能够将参数从 c++ 传递给 javascript 函数。我认为下面的示例源代码可以最好地解释它。检查示例代码的末尾,看看我想要完成什么。
有小费吗?
更新:
根据给出的建议,我已经能够整理出以下代码。它已经过测试并且可以工作:
javascript - glBindTexture() 是否需要 GLuint 指针?
我正在尝试为 OpenGL/V8/JavaScript 中的纹理使用实现 OpenGL 绑定。
我的问题很简单:
OpenGL 的 glBindTexture() 方法是否需要指向 GLuint 的指针,还是只需要有效的 GLuint?
这里的khronos 文档说它只需要一个GLuint。
http://www.khronos.org/opengles/documentation/opengles1_0/html/glBindTexture.html
问题如下:
我在 v8 JavaScript 上下文中有一个自定义数据类型,用于初始化和加载纹理。加载后,纹理通过以下方式生成:
因此,此方法从 c++ 端返回 GLuint,并将转换后的 Integer 值作为属性“id”附加到 JavaScript 上下文中的对象:
在 v8 中对全局 gl(命名空间)对象使用 bindTexture 方法时,它在本机端执行以下操作:
c++ - 如何使用自定义修改的 v8::Arguments 调用 v8::Function?
我想用修改过的参数从 C++ 端调用 JSON.stringify 方法,但是我想到的任何解决方案都会导致一个奇怪的段错误,所有帧都在“??”。
我想做以下事情:api::Console 是用于调试目的的自定义控制台实现,因此具有静态方法,如 api::Console::handleLog 或 api::Console::handleDebug。
对于正确传递给控制台的 ObjectTemplate 的 handleDebug,以下内容不起作用,v8gl::context 是当前执行上下文,并且可以在其他 api 实现中正确使用:
gdb 中的回溯有点奇怪,我不知道为什么:
所以我的问题如下:
如何正确地从本地值“v8::Arguments& args”转换为“v8::Handle<v8::Value>*”以便与 v8::Function 的 Call() 方法一起使用?
如果我想直接在循环中使用 args[a],编译器会因 v8::Function::Call 的不同签名引发编译器错误,这是正确的,因为 args 是本地值。v8::Function::Call 的签名如下:
v8::Local<v8::Value> v8::Function::Call(v8::Handle<v8::Object>, int, v8::Handle <v8::Value>*)
// 编辑:更新 passargs[false index]
c++ - 如何使用多个 v8::Context 正确重用 global_object?
我正在使用 OpenGL 实现重构我的 V8,但遇到了执行上下文的问题。
概念如下:
V8GL::initialize()
此方法初始化上下文和全局模板。它还使用 glut 的上下文,因为有几个循环也在运行,这些循环也暴露在 JS 上下文中。(例如glut.mainLoop()
)V8GL::execute(context, source, url)
此方法主要在给定上下文中执行字符串。我认为它必须是这种方式,以便以后使用间隔/超时来隔离使用。
什么不起作用:
V8GL::initialize()
还附加内置的 JavaScript 文件并执行它们。这工作得很好。
简化代码:
问题:
那是初始化。这很好用,所以我自己的库中的东西可以在 JavaScript 执行中使用。但是我想执行另一个文件,该文件是通过参数传递的。所以 main.cppmain()
看起来像这样。
问题:
- 我是否必须缓存 global 的 objectTemplate 以供使用
v8::Context::New()
? - global_object 必须是持久的还是本地的?
- 我怎样才能重复使用它?
DetachGlobal()
and东西只适用于单一的ReattachGlobal()
上下文,而不是多个上下文。我的案例需要多个上下文。