这段代码可以很好地在Firefox中运行 - 虽然由于某种原因,将Uint8Array更改为Uint32array会中断。在这种情况下,我是否需要以不同的方式强制改变数字?
function Module(stdlib, foreign, heap) {
"use asm";
// Variable Declarations
var els = new stdlib.Uint8Array(heap);
// Function Declarations
function firstn(x) {
x = x|0 //32-bit (int)
var i=0;
for (; (i|0) < (x|0); i = (i+1)|0) {
els[i] = i;
}
}
return { firstn: firstn };
}
buf = ArrayBuffer(1024*8)
f = Module(window,{},buf).firstn;
f(5)
console.log(new Uint8Array(buf));
还有一件事 - 是否可以发送一个arraybuffer,并引用它生成的最终数组,使用C ++ emscriptem编译为asm.js?
答案 0 :(得分:1)
看起来asm.js只允许使用表单(foo&gt;&gt; 2)的表达式索引到Int32Array或Uint32Array,尽管我在规范中找不到对此的任何引用。也就是说,它假设你拥有的是一个地址,并试图在该地址查找整数。我想这很有意义,因为C代码就像这样:
int32_t arr[5];
arr[i];
会被编译成相当于*((char*)arr + 4*i)
的机器代码...无论如何,用以下代码替换代码中的els[i] = i
:
els[(i<<2)>>2] = i;
似乎可以使用Uint32Array。