Почему я не могу использовать 32-битный массив int в 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));

И еще одна вещь - возможно ли отправить массив буферов и иметь ссылку на окончательный массив, который он создает, а также скомпилированный в C++ emscriptem asm.js?

1 ответ

Решение

Похоже, asm.js позволяет индексировать только в Int32Array или Uint32Array, используя выражение формы (foo >> 2), хотя я не могу найти ссылку на это в спецификации. То есть предполагается, что у вас есть адрес, и вы пытаетесь найти целое число по этому адресу. Я думаю, это имеет смысл, вроде как на C-коде:

int32_t arr[5];
arr[i];

будет скомпилирован в машинный код, который делает эквивалент *((char*)arr + 4*i)... В любом случае, замена els[i] = i в вашем коде с:

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

кажется, заставляет вещи работать с Uint32Array.

Другие вопросы по тегам