0

这段代码在 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));

还有一件事 - 是否可以发送一个数组缓冲区,并引用它产生的最终数组,也可以使用 C++ emscriptem 编译的 asm.js?

4

1 回答 1

1

看起来 asm.js 只允许使用 (foo >> 2) 形式的表达式对 Int32Array 或 Uint32Array 进行索引,尽管我在规范中找不到对此的任何引用。也就是说,它假定您拥有的是一个地址,并试图在该地址查找整数。我想这是有道理的,有点像这样的 C 代码:

int32_t arr[5];
arr[i];

会被编译成机器代码,相当于*((char*)arr + 4*i)......无论如何,els[i] = i在你的代码中替换为:

  els[(i<<2)>>2] = i;

似乎使事情与 Uint32Array 一起工作。

于 2014-03-08T06:31:29.583 回答