我们尝试通过ChromeWoker发送500kb并在控制台中出现内存错误。
此代码:
let charArray= ctypes.ArrayType(ctypes.char);
let base641 = new charArray(9999999);
var {ChromeWorker} = Cu.import("resource://gre/modules/Services.jsm", null);
var chworker = new ChromeWorker(self.data.url("async.js"));
chworker.onmessage = function(e){
console.error(e.data);
};
chworker.postMessage(base641);
返回错误:
stack:"@undefined:undefined:undefined
CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:129:9
run@resource://gre/modules/commonjs/sdk/addon/runner.js:169:9
startup/<@resource://gre/modules/commonjs/sdk/addon/runner.js:113:7
Handler.prototype.process@resource://gre/modules/Promise-backend.js:863:11
this.PromiseWalker.walkerLoop@resource://gre/modules/Promise-backend.js:742:7"
什么是未定义的?我们可以通过ChromeWorker设置指向内存的指针吗?
答案 0 :(得分:2)
要传递ctypes
数组,您需要使用address()
并在消息中发布该数组,并从另一侧的该地址构造另一个指针。这有效,但当然是相当讨厌的。您还需要确保垃圾收集不收集内容,而另一方仍然使用它!
您最好使用ArrayBuffer
/类型的数组,pass directly,也可以使用非特权代码。