load(libdir + "asm.js" );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i32[0>>2] = 4.0; return i32[0>>2]|0; } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f32[0>>2] = 4; return +f32[0>>2]; } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { var x=0,y=0; return i8[x+y]|0 } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { var x=0,y=0; return u8[x+y]|0 } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return i32[0>>0]|0 }; return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return i32[0>>1]|0 }; return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return i32[0>>4]|0 }; return f' );
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return i32[0]|0 }; return f' ), this , null , new ArrayBuffer(BUF_MIN))(), 0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i = i32[i>>2]|0; return i|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ), 0 );
// In order to allow following tests work on both big-endian and little-
// endian architectures we need to define least significant byte (lsb) and
// least significant word (lsw).
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i32[0] = i; return i8[0]|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
var lsb=0 ;
var lsw=0
if (f(0 x12345678) == 0 x12) {
lsb=3 ;
lsw=1 ;
}
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i32[0] = i; return i8[' + lsb + ']|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ),0 );
assertEq(f(0 x7f),0 x7f);
assertEq(f(0 xff),-1 );
assertEq(f(0 x100),0 );
{
var buf = new ArrayBuffer(BUF_MIN);
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + '/* not a clone */ function f(i) {i=i|0; i32[0] = i; return i8[' + lsb + ']|0}; return f');
var f = asmLink(code, this , null , buf);
assertEq(f(0 ),0 );
assertEq(f(0 x7f),0 x7f);
assertEq(f(0 xff),-1 );
assertEq(f(0 x100),0 );
// Bug 1088655
assertEq(asmLink(asmCompile('stdlib' , 'foreign' , 'heap' , USE_ASM + 'var i32=new stdlib.Int32Array(heap); function f(i) {i=i|0;var j=0x10000;return (i32[j>>2] = i)|0 } return f' ), this , null , buf)(1 ), 1 );
}
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i32[0] = i; return u8[' + lsb + ']|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ),0 );
assertEq(f(0 x7f),0 x7f);
assertEq(f(0 xff),0 xff);
assertEq(f(0 x100),0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i32[0] = i; return i16[' + lsw + ']|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ),0 );
assertEq(f(0 x7fff),0 x7fff);
assertEq(f(0 xffff),-1 );
assertEq(f(0 x10000),0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i32[0] = i; return u16[' + lsw + ']|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ),0 );
assertEq(f(0 x7fff),0 x7fff);
assertEq(f(0 xffff),0 xffff);
assertEq(f(0 x10000),0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i32[0] = i; return i32[0]|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ),0 );
assertEq(f(0 x7fffffff),0 x7fffffff);
assertEq(f(0 xffffffff),-1 );
assertEq(f(0 x100000000),0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i32[0] = i; return u32[0]|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ),0 );
assertEq(f(0 x7fffffff),0 x7fffffff);
assertEq(f(0 xffffffff),-1 );
assertEq(f(0 x100000000),0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i32[0] = i; return i8[' + lsb + ']|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ),0 );
assertEq(f(0 x7f),0 x7f);
assertEq(f(0 xff),-1 );
assertEq(f(0 x100),0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i32[0] = i; return u8[' + lsb + ']|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ),0 );
assertEq(f(0 x7f),0 x7f);
assertEq(f(0 xff),0 xff);
assertEq(f(0 x100),0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i8[0] = i; return i8[0]|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ),0 );
assertEq(f(0 x7f),0 x7f);
assertEq(f(0 xff),-1 );
assertEq(f(0 x100),0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; i8[0] = i; return u8[0]|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 ),0 );
assertEq(f(0 x7f),0 x7f);
assertEq(f(0 xff),0 xff);
assertEq(f(0 x100),0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i,j) {i=i|0;j=+j; f64[i>>3] = j; return (~~+f64[i>>3])|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 , 1 .3 ), 1 );
assertEq(f(BUF_MIN-8 , 2 .5 ), 2 );
assertEq(f(BUF_MIN, 3 .8 ), 0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i,j) {i=i|0;j=+j; f64[i>>3] = j; return (~~f64[i>>3])|0}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 , 1 .3 ), 1 );
assertEq(f(BUF_MIN-8 , 2 .5 ), 2 );
assertEq(f(BUF_MIN, 3 .8 ), 0 );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i,j) {i=i|0;j=+j; f64[i>>3] = j; return +f64[i>>3]}; return f' );
var f = asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
assertEq(f(0 , 1 .3 ), 1 .3 );
assertEq(f(BUF_MIN-8 , 2 .5 ), 2 .5 );
assertEq(f(BUF_MIN, 3 .8 ), NaN);
var i32 = new Int32Array(BUF_MIN);
i32[0 ] = 42 ;
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i32[1] = i32[0] }; return f' ), this , null , i32.buffer)();
assertEq(i32[1 ], 42 );
var f64 = new Float64Array(BUF_MIN);
f64[0 ] = 42 ;
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f64[1] = f64[0] }; return f' ), this , null , f64.buffer)();
assertEq(f64[1 ], 42 );
var i32 = new Int32Array(BUF_MIN/4 );
i32[0 ] = 13 ;
i32[1 ] = 0 xfffeeee;
var f = asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; return i32[((i<<2)+1)>>2]|0 }; return f' ), this , null , i32.buffer);
assertEq(f(0 ), 13 );
assertEq(f(1 ), 0 xfffeeee);
var f = asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; return i32[((i<<2)+2)>>2]|0 }; return f' ), this , null , i32.buffer);
assertEq(f(0 ), 13 );
assertEq(f(1 ), 0 xfffeeee);
var f = asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; return i32[(i<<1)>>2]|0 }; return f' ), this , null , i32.buffer);
assertEq(f(0 ), 13 );
assertEq(f(1 ), 13 );
assertEq(f(2 ), 0 xfffeeee);
assertEq(f(3 ), 0 xfffeeee);
var f = asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; return i32[(i<<2)>>2]|0 }; return f' ), this , null , i32.buffer);
assertEq(f(0 ), 13 );
assertEq(f(1 ), 0 xfffeeee);
var f = asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) {i=i|0; return i32[((i<<2)+4)>>2]|0 }; return f' ), this , null , i32.buffer);
assertEq(f(0 ), 0 xfffeeee);
// For legacy compatibility, test Int8/Uint8 accesses with no shift.
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u8[7&0xffff] = 41 } return f' ), this , null , BUF_64KB)();
assertEq(new Uint8Array(BUF_64KB)[7 ], 41 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i8[7&0xffff] = -41 } return f' ), this , null , BUF_64KB)();
assertEq(new Int8Array(BUF_64KB)[7 ], -41 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u8[(7&0xffff)>>0] = 41 } return f' ), this , null , BUF_64KB)();
assertEq(new Uint8Array(BUF_64KB)[7 ], 41 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i8[(7&0xffff)>>0] = -41 } return f' ), this , null , BUF_64KB)();
assertEq(new Int8Array(BUF_64KB)[7 ], -41 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u16[(6&0xffff)>>1] = 0xabc } return f' ), this , null , BUF_64KB)();
assertEq(new Uint16Array(BUF_64KB)[3 ], 0 xabc);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i16[(6&0xffff)>>1] = -0xabc } return f' ), this , null , BUF_64KB)();
assertEq(new Int16Array(BUF_64KB)[3 ], -0 xabc);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u32[(4&0xffff)>>2] = 0xabcde } return f' ), this , null , BUF_64KB)();
assertEq(new Uint32Array(BUF_64KB)[1 ], 0 xabcde);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i32[(4&0xffff)>>2] = -0xabcde } return f' ), this , null , BUF_64KB)();
assertEq(new Int32Array(BUF_64KB)[1 ], -0 xabcde);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f32[(4&0xffff)>>2] = 1.0 } return f' ), this , null , BUF_64KB)();
assertEq(new Float32Array(BUF_64KB)[1 ], 1 .0 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f64[(8&0xffff)>>3] = 1.3 } return f' ), this , null , BUF_64KB)();
assertEq(new Float64Array(BUF_64KB)[1 ], 1 .3 );
new Float32Array(BUF_64KB)[1 ] = 1 .0 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f32[(4&0xffff)>>2] } return f' ), this , null , BUF_64KB)(), 1 .0 );
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'var toFloat32 = glob.Math.fround; function f() { return toFloat32(f32[(4&0xffff)>>2]) } return f' ), this , null , BUF_64KB)(), 1 .0 );
new Float64Array(BUF_64KB)[1 ] = 1 .3 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f64[(8&0xffff)>>3] } return f' ), this , null , BUF_64KB)(), 1 .3 );
asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) { i=i|0; u8[255]; u8[i] } return f' );
// For legacy compatibility, test Int8/Uint8 accesses with no shift.
asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) { i=i|0; u8[i&0xff]; u8[255] } return f' );
asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) { i=i|0; u8[(i&0xff)>>0]; u8[255] } return f' );
asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) { i=i|0; u32[63]; u32[i>>2] } return f' );
asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) { i=i|0; u32[i>>2]; u32[63] } return f' );
var code = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) { i=i|0; u32[64] } return f' );
asmLink(code, this , null , new ArrayBuffer(BUF_MIN));
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) { i=i|0; u32[12] = i } return f' ), this , null , BUF_64KB)(11 );
assertEq(new Int32Array(BUF_64KB)[12 ], 11 );
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return u32[12]|0 } return f' ), this , null , BUF_64KB)(), 11 );
new Float64Array(BUF_64KB)[0 ] = 3 .5 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +-f64[0] } return f' ), this , null , BUF_64KB)(), -3 .5 );
// Test constant loads.
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u8[1] = -1 } return f' ), this , null , buf)();
assertEq(new Uint8Array(buf)[0 ], 0 );
assertEq(new Uint8Array(buf)[1 ], 255 );
assertEq(new Uint8Array(buf)[2 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u8[4095] = -1 } return f' ), this , null , buf)();
assertEq(new Uint8Array(buf)[4094 ], 0 );
assertEq(new Uint8Array(buf)[4095 ], 255 );
assertEq(new Uint8Array(buf)[4096 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u8[4096] = -1 } return f' ), this , null , buf)();
assertEq(new Uint8Array(buf)[4095 ], 0 );
assertEq(new Uint8Array(buf)[4096 ], 255 );
assertEq(new Uint8Array(buf)[4097 ], 0 );
assertAsmLinkFail(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u8[' + BUF_MIN + '] = -1 } return f' ), this , null , buf);
var buf = new ArrayBuffer(262144 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u8[258048] = -1 } return f' ), this , null , buf)();
assertEq(new Uint8Array(buf)[258047 ], 0 );
assertEq(new Uint8Array(buf)[258048 ], 255 );
assertEq(new Uint8Array(buf)[258049 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i8[1] = -1 } return f' ), this , null , buf)();
assertEq(new Int8Array(buf)[0 ], 0 );
assertEq(new Int8Array(buf)[1 ], -1 );
assertEq(new Int8Array(buf)[2 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i8[4095] = -1 } return f' ), this , null , buf)();
assertEq(new Int8Array(buf)[4094 ], 0 );
assertEq(new Int8Array(buf)[4095 ], -1 );
assertEq(new Int8Array(buf)[4096 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i8[4096] = -1 } return f' ), this , null , buf)();
assertEq(new Int8Array(buf)[4095 ], 0 );
assertEq(new Int8Array(buf)[4096 ], -1 );
assertEq(new Int8Array(buf)[4097 ], 0 );
assertAsmLinkFail(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i8[' + BUF_MIN + '] = -1 } return f' ), this , null , buf);
var buf = new ArrayBuffer(262144 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i8[258048] = -1 } return f' ), this , null , buf)();
assertEq(new Int8Array(buf)[258047 ], 0 );
assertEq(new Int8Array(buf)[258048 ], -1 );
assertEq(new Int8Array(buf)[258049 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u16[1] = -1 } return f' ), this , null , buf)();
assertEq(new Uint16Array(buf)[0 ], 0 );
assertEq(new Uint16Array(buf)[1 ], 65535 );
assertEq(new Uint16Array(buf)[2 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u16[' + (BUF_MIN/2 -1 ) + '] = -1 } return f' ), this , null , buf)();
assertEq(new Uint16Array(buf)[BUF_MIN/2 -2 ], 0 );
assertEq(new Uint16Array(buf)[BUF_MIN/2 -1 ], 65535 );
assertEq(new Uint16Array(buf)[BUF_MIN/2 ], undefined);
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u16[' + (BUF_MIN/4 ) + '] = -1 } return f' ), this , null , buf)();
assertEq(new Uint16Array(buf)[BUF_MIN/4 -1 ], 0 );
assertEq(new Uint16Array(buf)[BUF_MIN/4 ], 65535 );
assertEq(new Uint16Array(buf)[BUF_MIN/4 +1 ], 0 );
assertAsmLinkFail(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u16[' + (BUF_MIN/2 ) + '] = -1 } return f' ), this , null , buf);
var buf = new ArrayBuffer(262144 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u16[126976] = -1 } return f' ), this , null , buf)();
assertEq(new Uint16Array(buf)[126975 ], 0 );
assertEq(new Uint16Array(buf)[126976 ], 65535 );
assertEq(new Uint16Array(buf)[126977 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i16[1] = -1 } return f' ), this , null , buf)();
assertEq(new Int16Array(buf)[0 ], 0 );
assertEq(new Int16Array(buf)[1 ], -1 );
assertEq(new Int16Array(buf)[2 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i16[' + (BUF_MIN/2 -1 ) + '] = -1 } return f' ), this , null , buf)();
assertEq(new Int16Array(buf)[BUF_MIN/2 -2 ], 0 );
assertEq(new Int16Array(buf)[BUF_MIN/2 -1 ], -1 );
assertEq(new Int16Array(buf)[BUF_MIN/2 ], undefined);
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i16[' + (BUF_MIN/4 ) + '] = -1 } return f' ), this , null , buf)();
assertEq(new Int16Array(buf)[BUF_MIN/4 -1 ], 0 );
assertEq(new Int16Array(buf)[BUF_MIN/4 ], -1 );
assertEq(new Int16Array(buf)[BUF_MIN/4 +1 ], 0 );
assertAsmLinkFail(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i16[' + (BUF_MIN/2 ) + '] = -1 } return f' ), this , null , buf);
var buf = new ArrayBuffer(262144 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i16[126976] = -1 } return f' ), this , null , buf)();
assertEq(new Int16Array(buf)[126975 ], 0 );
assertEq(new Int16Array(buf)[126976 ], -1 );
assertEq(new Int16Array(buf)[126977 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u32[1] = -1 } return f' ), this , null , buf)();
assertEq(new Uint32Array(buf)[0 ], 0 );
assertEq(new Uint32Array(buf)[1 ], 4294967295 );
assertEq(new Uint32Array(buf)[2 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u32[' + (BUF_MIN/4 -1 ) + '] = -1 } return f' ), this , null , buf)();
assertEq(new Uint32Array(buf)[BUF_MIN/4 -2 ], 0 );
assertEq(new Uint32Array(buf)[BUF_MIN/4 -1 ], 4294967295 );
assertEq(new Uint32Array(buf)[BUF_MIN/4 ], undefined);
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u32[' + (BUF_MIN/8 ) + '] = -1 } return f' ), this , null , buf)();
assertEq(new Uint32Array(buf)[BUF_MIN/8 -1 ], 0 );
assertEq(new Uint32Array(buf)[BUF_MIN/8 ], 4294967295 );
assertEq(new Uint32Array(buf)[BUF_MIN/8 +1 ], 0 );
assertAsmLinkFail(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u32[' + (BUF_MIN/4 ) + '] = -1 } return f' ), this , null , buf);
var buf = new ArrayBuffer(262144 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { u32[61440] = -1 } return f' ), this , null , buf)();
assertEq(new Uint32Array(buf)[61439 ], 0 );
assertEq(new Uint32Array(buf)[61440 ], 4294967295 );
assertEq(new Uint32Array(buf)[61441 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i32[1] = -1 } return f' ), this , null , buf)();
assertEq(new Int32Array(buf)[0 ], 0 );
assertEq(new Int32Array(buf)[1 ], -1 );
assertEq(new Int32Array(buf)[2 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i32[' + (BUF_MIN/4 -1 ) + '] = -1 } return f' ), this , null , buf)();
assertEq(new Int32Array(buf)[BUF_MIN/4 -2 ], 0 );
assertEq(new Int32Array(buf)[BUF_MIN/4 -1 ], -1 );
assertEq(new Int32Array(buf)[BUF_MIN/4 ], undefined);
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i32[' + (BUF_MIN/8 ) + '] = -1 } return f' ), this , null , buf)();
assertEq(new Int32Array(buf)[BUF_MIN/8 -1 ], 0 );
assertEq(new Int32Array(buf)[BUF_MIN/8 ], -1 );
assertEq(new Int32Array(buf)[BUF_MIN/8 +1 ], 0 );
assertAsmLinkFail(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i32[' + (BUF_MIN/4 ) + '] = -1 } return f' ), this , null , buf);
var buf = new ArrayBuffer(262144 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { i32[61440] = -1 } return f' ), this , null , buf)();
assertEq(new Int32Array(buf)[61439 ], 0 );
assertEq(new Int32Array(buf)[61440 ], -1 );
assertEq(new Int32Array(buf)[61441 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f32[1] = -1.0 } return f' ), this , null , buf)();
assertEq(new Int32Array(buf)[0 ], 0 );
assertEq(new Float32Array(buf)[1 ], -1 .0 );
assertEq(new Int32Array(buf)[2 ], 0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f32[' + (BUF_MIN/4 -1 ) + '] = -1.0 } return f' ), this , null , buf)();
assertEq(new Int32Array(buf)[BUF_MIN/4 -2 ], 0 );
assertEq(new Float32Array(buf)[BUF_MIN/4 -1 ], -1 .0 );
assertEq(new Int32Array(buf)[BUF_MIN/4 ], undefined);
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f32[' + (BUF_MIN/8 ) + '] = -1.0 } return f' ), this , null , buf)();
assertEq(new Int32Array(buf)[BUF_MIN/8 -1 ], 0 );
assertEq(new Float32Array(buf)[BUF_MIN/8 ], -1 .0 );
assertEq(new Int32Array(buf)[BUF_MIN/8 +1 ], 0 );
assertAsmLinkFail(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f32[' + (BUF_MIN/4 ) + '] = -1.0 } return f' ), this , null , buf);
var buf = new ArrayBuffer(262144 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f32[61440] = -1.0 } return f' ), this , null , buf)();
assertEq(new Float32Array(buf)[61439 ], 0 .0 );
assertEq(new Float32Array(buf)[61440 ], -1 .0 );
assertEq(new Float32Array(buf)[61441 ], 0 .0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f64[1] = -1.0 } return f' ), this , null , buf)();
assertEq(new Float64Array(buf)[0 ], 0 .0 );
assertEq(new Float64Array(buf)[1 ], -1 .0 );
assertEq(new Float64Array(buf)[2 ], 0 .0 );
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f64[' + (BUF_MIN/8 -1 ) + '] = -1.0 } return f' ), this , null , buf)();
assertEq(new Float64Array(buf)[BUF_MIN/8 -2 ], 0 .0 );
assertEq(new Float64Array(buf)[BUF_MIN/8 -1 ], -1 .0 );
assertEq(new Float64Array(buf)[BUF_MIN/8 ], undefined);
var buf = new ArrayBuffer(BUF_MIN);
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f64[' + (BUF_MIN/16 ) + '] = -1.0 } return f' ), this , null , buf)();
assertEq(new Float64Array(buf)[BUF_MIN/16 -1 ], 0 .0 );
assertEq(new Float64Array(buf)[BUF_MIN/16 ], -1 .0 );
assertEq(new Float64Array(buf)[BUF_MIN/16 +1 ], 0 .0 );
assertAsmLinkFail(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f64[' + (BUF_MIN/8 ) + '] = -1.0 } return f' ), this , null , buf);
var buf = new ArrayBuffer(262144 );
asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { f64[28672] = -1.0 } return f' ), this , null , buf)();
assertEq(new Float64Array(buf)[28671 ], 0 .0 );
assertEq(new Float64Array(buf)[28672 ], -1 .0 );
assertEq(new Float64Array(buf)[28673 ], 0 .0 );
var buf = new ArrayBuffer(BUF_MIN);
new Uint8Array(buf)[1 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return u8[1]|0; } return f' ), this , null , buf)(),255 );
new Int8Array(buf)[1 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return i8[1]|0; } return f' ), this , null , buf)(),-1 );
var buf = new ArrayBuffer(262144 );
new Uint8Array(buf)[126976 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return u8[126976]|0; } return f' ), this , null , buf)(),255 );
new Int8Array(buf)[126976 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return i8[126976]|0; } return f' ), this , null , buf)(),-1 );
var buf = new ArrayBuffer(BUF_MIN);
new Uint16Array(buf)[1 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return u16[1]|0; } return f' ), this , null , buf)(),65535 );
new Int16Array(buf)[1 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return i16[1]|0; } return f' ), this , null , buf)(),-1 );
var buf = new ArrayBuffer(262144 );
new Uint16Array(buf)[126976 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return u16[126976]|0; } return f' ), this , null , buf)(),65535 );
new Int16Array(buf)[126976 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return i16[126976]|0; } return f' ), this , null , buf)(),-1 );
var buf = new ArrayBuffer(BUF_MIN);
new Uint32Array(buf)[1 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return u32[1]|0; } return f' ), this , null , buf)(),-1 );
new Int32Array(buf)[1 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return i32[1]|0; } return f' ), this , null , buf)(),-1 );
var buf = new ArrayBuffer(262144 );
new Int32Array(buf)[61440 ] = -1 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return i32[61440]|0; } return f' ), this , null , buf)(),-1 );
var buf = new ArrayBuffer(BUF_MIN);
new Float32Array(buf)[1 ] = -1 .0 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f32[1]; } return f' ), this , null , buf)(),-1 .0 );
new Float32Array(buf)[BUF_MIN/4 -1 ] = -1 .0 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f32[' + (BUF_MIN/4 -1 ) + ']; } return f' ), this , null , buf)(),-1 .0 );
new Float32Array(buf)[BUF_MIN/8 ] = -1 .0 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f32[' + (BUF_MIN/8 ) + ']; } return f' ), this , null , buf)(),-1 .0 );
assertAsmLinkFail(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f32[' + (BUF_MIN/4 ) + ']; } return f' ), this , null , buf);
var buf = new ArrayBuffer(262144 );
new Float32Array(buf)[61440 ] = -1 .0 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f32[61440]; } return f' ), this , null , buf)(),-1 .0 );
var buf = new ArrayBuffer(BUF_MIN);
new Float64Array(buf)[1 ] = -1 .0 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f64[1]; } return f' ), this , null , buf)(),-1 .0 );
new Float64Array(buf)[BUF_MIN/8 -1 ] = -1 .0 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f64[' + (BUF_MIN/8 -1 ) + ']; } return f' ), this , null , buf)(),-1 .0 );
new Float64Array(buf)[BUF_MIN/16 ] = -1 .0 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f64[' + (BUF_MIN/16 ) + ']; } return f' ), this , null , buf)(),-1 .0 );
assertAsmLinkFail(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f64[' + (BUF_MIN/8 ) + ']; } return f' ), this , null , buf);
var buf = new ArrayBuffer(262144 );
new Float64Array(buf)[28672 ] = -1 .0 ;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return +f64[28672]; } return f' ), this , null , buf)(),-1 .0 );
// Bug 913867
var buf = new ArrayBuffer(BUF_MIN);
new Int32Array(buf)[0 ] = 0 x55aa5a5a;
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f1() { i32[0] = 1; return 8; }; function f() { return i32[((f1()|0)&0)>>2]|0; } return f' ), this , null , buf)(),1 );
assertEq(new Int32Array(buf)[0 ], 1 );
// Bug 882012
assertEq(asmLink(asmCompile('stdlib' , 'foreign' , 'heap' , USE_ASM + "var id=foreign.id;var doubles=new stdlib.Float64Array(heap);function g(){doubles[0]=+id(2.0);return +doubles[0];}return g" ), this , {id: function (x){return x;}}, BUF_64KB)(), 2 .0 );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return u8[4294967295]|0; } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'const i=4294967295; function f() { return u8[i]|0; } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return u8[-1]|0; } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'const i=-1; function f() { return u8[i]|0; } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return u8[0x80000000]|0; } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'const i=0x80000000; function f() { return u8[i]|0; } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f() { return u8[-2147483648]|0; } return f' );
assertAsmTypeFail('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'const i=-2147483648; function f() { return u8[i]|0; } return f' );
// GVN checks
var buf = new ArrayBuffer(BUF_MIN);
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'var i=0; function f() { var x = 0, y = 0; u8[0] = 1; u8[1] = 2; x = 0|u8[i]; i = x; y = 0|u8[i]; return y|0;} return f' ), this , null , buf)(),2 );
assertEq(asmLink(asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'var i=0; function f() { var x = 0, y = 0; u8[0] = 1; u8[1] = 2; x = 0|u8[i]; y = 0|u8[i]; return (x+y)|0;} return f' ), this , null , buf)(),2 );
// Heap length constraints
var m = asmCompile('glob' , 'imp' , 'b' , USE_ASM + HEAP_IMPORTS + 'function f(i) { i=i|0; return u8[i]|0; } return f' );
assertAsmLinkAlwaysFail(m, this , null , new ArrayBuffer(0 xffff));
assertEq(asmLink(m, this , null , new ArrayBuffer(0 x10000))(0 ),0 );
assertAsmLinkFail(m, this , null , new ArrayBuffer(0 x10010));
assertEq(asmLink(m, this , null , new ArrayBuffer(0 x20000))(0 ),0 );
assertAsmLinkFail(m, this , null , new ArrayBuffer(0 xfe0000));
assertAsmLinkFail(m, this , null , new ArrayBuffer(0 xfe0010));
assertAsmLinkFail(m, this , null , new ArrayBuffer(0 xfe0000));
assertAsmLinkFail(m, this , null , new ArrayBuffer(0 xff8000));
var buf = new ArrayBuffer(0 x100000);
new Uint8Array(buf)[0 x4242] = 0 xAA;
var f = asmLink(m, this , null , buf);
assertEq(f(0 ),0 );
assertEq(f(0 x4242),0 xAA);
assertEq(f(0 x100000),0 );
assertAsmLinkFail(m, this , null , new ArrayBuffer(0 x104000));
assertEq(asmLink(m, this , null , new ArrayBuffer(0 x200000))(0 ),0 );
assertAsmLinkFail(m, this , null , new ArrayBuffer(0 x3f8000));
assertAsmLinkFail(m, this , null , new ArrayBuffer(0 x3fe000));
assertAsmLinkFail(m, this , null , new ArrayBuffer(0 x3fc000));
assertEq(asmLink(m, this , null , new ArrayBuffer(0 x400000))(0 ),0 );
assertAsmLinkFail(m, this , null , new ArrayBuffer(0 x410000));
assertEq(asmLink(m, this , null , new ArrayBuffer(0 x800000))(0 ),0 );
var buf = new ArrayBuffer(0 x1000000);
new Uint8Array(buf)[0 x424242] = 0 xAA;
var f = asmLink(m, this , null , buf);
assertEq(f(0 ),0 );
assertEq(f(0 x424242),0 xAA);
assertEq(f(0 x1000000),0 );
assertEq(asmLink(m, this , null , new ArrayBuffer(0 x2000000))(0 ),0 );
assertEq(asmLink(m, this , null , new ArrayBuffer(0 x3000000))(0 ),0 );
// Heap offsets
var asmMod = function test (glob, env, b) {
'use asm' ;
var i8 = new glob.Int8Array(b);
function f(i) {
i = i | 0 ;
i = i & 1 ;
i = (i - 0 x40000)|0 ;
i8[0 x3ffff] = 0 ;
return i8[(i + 0 x7fffe) >> 0 ] | 0 ;
}
return f;
};
var buffer = new ArrayBuffer(0 x40000);
var asm = asmMod(this , {}, buffer);
assertEq(asm(-1 ),0 );
Messung V0.5 in Prozent C=94 H=96 G=94
¤ Dauer der Verarbeitung: 0.14 Sekunden
¤
*© Formatika GbR, Deutschland