- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
使用 Spidermonkey 24、38、45
Spidermonkey documentation说:“堆上的 GC 事物指针必须包装在 JS::Heap 中。唯一的异常(exception)是如果它们作为根添加到 JS_AddRoot() 函数或 JS::PersistentRooted 类中,但是不要'除非确实有必要,否则不要这样做。JS::Heap 指针也必须继续以正常方式进行跟踪,这里不做介绍。”
在这种情况下,跟踪到底意味着什么?以下代码是否遗漏了什么?
struct Foo
{
Foo(JS::HandleObject bar) : _bar(bar) {} // Does that root bar?
~Foo() {_bar = nullptr;} // Does that release memory?
JS::Heap<JSObject*> _bar;
};
Foo *create(JSContext *jscontext, JSObject *parent)
{
JS::RootedObject bar(jscontext, JS_NewObject(jscontext, &SOME_CLASS, NULL, parent));
return new Foo(bar);
}
我需要添加“跟踪”吗?当 bar 对象存储在 Foo 中时,我是否需要 root 对象?我是否应该使用 JS_AddRoot() 函数而不是使用堆来生成根栏?
最佳答案
JS::Heap<T>
用于驻留在堆上的数据结构。跟踪确实是一个要求。没有它,GC 可能会确定您的对象无法访问或重新定位它而不更新您的 JS::Heap<T>
处理。
在 spidermonkey 中追踪对象很简单。您需要使用 JS_AddExtraGCRootsTracer(JSRuntime* rt, JSTraceDataOp traceOp, void* data)
请求额外的 GC root tracer . JSTraceDataOp 是一个带有接口(interface) void traceOp(JSTracer* trc, void* data)
的函数指针.在您的函数中,您必须调用各种 JS_Call<T>Tracer
(在 Tracer.h 中定义)传递跟踪器和您的对象的方法。此外,您应该调用 JS_TraceChildren
必要时。
使用您的示例,添加跟踪器可能如下所示。
Foo* ref = create(cx, nullptr);
void trace_foos(JSTracer* tracer, void* data) {
JS_CallHeapObjectTracer(tracer, &(ref->_bar), "foo");
}
JS_AddExtraGCRootsTracer(rt, trace_foos, nullptr);
每当 GC 运行时,您的跟踪回调就会运行,您应该遍历对象图并随时跟踪 GC 事情。
关于您评论中的问题-
Foo(JS::HandleObject bar) : _bar(bar) {} // Does that root bar?
bar
已经通过 JS::RootedObject
在堆栈上 Root 酒吧 Foo* create
. Heap<T>
句柄不是根 - 这就是必须追踪它们的原因。一旦create
返回时,对象不再有根。
~Foo() {_bar = nullptr;} // Does that release memory?
没有。 _bar
只是 JS::Heap<T>
的一个实例处理。它指向的东西将在后续循环中被垃圾收集。
关于javascript - 如何在 Spidermonkey 中创建、处理和销毁 JS::Heap<T> 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27393732/
当 SpiderMonkey 收集(或即将收集)特定的“GC 事物”时是否可以收到通知? 在 V8 中,存在附加了回调的“弱句柄”,当 V8 GC 确定句柄对象已变得无法访问时,应该调用这些回调。即使
我已经从源代码编译了 SpiderMonkey,并尝试测量某些函数的执行时间。当我使用 Scratchpad 或普通控制台 session 在 Firefox 浏览器中运行代码时,我有如下工具:con
我可以创建一个全局对象 JS_NewCompartmentAndGlobalObject (SM 1.8.5) 或类似函数 但是如何删除全局对象。据我所知,全局对象是 Root过的,因此没有 GC 的
我可以将 SpiderMonkey 构建为一个库,并将其用作我的 C++ 应用程序中的 Javascript 引擎。 在文档中指定 SpiderMonkey 是线程安全的,但这意味着什么,因为 Jav
我正在寻找所有 spidermonkey 字节码的文档,或者至少是一些能大致告诉我字节码用途的文档。 有没有人可以推荐这样的资源? 谢谢! 最佳答案 我知道这不是一个好故事,但我们拥有的最好的文档(除
我正在使用 SpiderMonkey 引擎 1.8,我对它创建堆栈跟踪的方式不满意。我们偶尔会从服务器收到 JavaScript 文件中自动生成的函数名称,这些名称实际上并不可读。在客户端,我可以访问
如何在 Spidermonkey 中设置 Javascript 代码执行超时? 文档说 JS_SetOperationCallback 可以解决这个问题,但是如何定义调用操作回调之间的最大间隔时间?
我刚刚安装了最新版本的 SpiderMonkey,正在尝试运行示例“Hello World”程序以嵌入 JS 引擎。示例程序如下所示: #include "jsapi.h" /* The cl
我有一个 QT 应用程序,我想在其中嵌入 SpiderMonkey。有了它,我想解析 javascript 段(而不是执行它)并在某种结构化树中检索所有变量、函数、对象、数组等,或者只是列出它们……这
我有 spidermonkey 设置来从自定义类创建对象。例如,在脚本中我可以说... var d0 = new MyDog(); ...在我的应用程序的 C++ 端创建并存储了一个 Dog 对象。
我的 libm 没有 sin 和 cos 函数。 是否有配置开关使我能够在没有 JavaScript 的 Math.* 函数的情况下编译 spidermonkey? 问候 最佳答案 也许您可以编写 s
我想知道 JS_CANONICALIZE_NAN 的目的是什么,是否所有平台都需要它? 最佳答案 这是一个有趣的!因此,SpiderMonkey 在内部使用标记值表示来表示 JavScript 的“无
通过 this jsPerf , 结构 var fn2 = new Function('return 1 + 2;'); 产生一个函数,它比以下定义的函数需要更多的时间来调用: var fn1 = f
感谢 python-spidermonkey,从 Python 使用 JavaScript 代码真的很容易。 但是,不是使用 Python 从文件中读取 JS 代码并将字符串传递给 Spidermon
我推出了自己的 javascript 服务器端语言,称为 bondi。最近刚升级到新的蜘蛛猴。 现在 JS enter local roots and leave local roots 功能从 1.
我目前正在处理 Project Euler 中的问题使用 JavaScript。大多数情况下,我一直在使用 for 循环来遍历问题,但我想使用递归函数。然而,似乎所有的 JavaScript 引擎都对
我一直在尝试学习 spidermonkey,因此编写了以下代码,改编自 this guide虽然程序编译正确,但在链接期间出现以下错误: /usr/bin/ld: cannot open linker
我正在开发 C++ 应用程序。我想在应用程序中嵌入 SpiderMonkey。 我正在使用 CMake,但无法构建。因此,为了减少并发症,我尝试了此 page 上的示例代码.这不会从命令行使用 cma
我已经安装了最新版本的 Spidermonkey (JavaScript-C 1.8.5+ 2011-04-16) 并注意到一个奇怪的问题,您可能知道答案。 过去,如果我这样做了: echo -n "
好的,所以我使用命令 wget http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz 下载了 SpiderMonkey 源代码并将其
我是一名优秀的程序员,十分优秀!