为什么我不能在ASM.js中使用32位的int数组?

时间:2014-03-07 07:10:26

标签: javascript firefox emscripten arraybuffer asm.js

这段代码可以很好地在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?

1 个答案:

答案 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。