Почему я не могу использовать 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.