michael@0: load(libdir + "asm.js"); michael@0: michael@0: function f(stdlib, foreign, buffer) { michael@0: "use asm"; michael@0: var i32 = new stdlib.Int32Array(buffer); michael@0: function set(i,j) { michael@0: i=i|0; michael@0: j=j|0; michael@0: i32[i>>2] = j; michael@0: } michael@0: function get(i) { michael@0: i=i|0; michael@0: return i32[i>>2]|0 michael@0: } michael@0: return {get:get, set:set} michael@0: } michael@0: if (isAsmJSCompilationAvailable()) michael@0: assertEq(isAsmJSModule(f), true); michael@0: michael@0: var i32 = new Int32Array(1024); michael@0: var buffer = i32.buffer; michael@0: var {get, set} = f(this, null, buffer); michael@0: if (isAsmJSCompilationAvailable()) michael@0: assertEq(isAsmJSFunction(get) && isAsmJSFunction(set), true); michael@0: michael@0: set(4, 42); michael@0: assertEq(get(4), 42); michael@0: michael@0: neuter(buffer, "change-data"); michael@0: neuter(buffer, "same-data"); michael@0: michael@0: // These operations may throw internal errors michael@0: try { michael@0: assertEq(get(4), 0); michael@0: set(0, 42); michael@0: assertEq(get(0), 0); michael@0: } catch (e) { michael@0: assertEq(String(e).indexOf("InternalError"), 0); michael@0: } michael@0: michael@0: function f2(stdlib, foreign, buffer) { michael@0: "use asm"; michael@0: var i32 = new stdlib.Int32Array(buffer); michael@0: var ffi = foreign.ffi; michael@0: function inner(i) { michael@0: i=i|0; michael@0: ffi(); michael@0: return i32[i>>2]|0 michael@0: } michael@0: return inner michael@0: } michael@0: if (isAsmJSCompilationAvailable()) michael@0: assertEq(isAsmJSModule(f2), true); michael@0: michael@0: var i32 = new Int32Array(1024); michael@0: var buffer = i32.buffer; michael@0: var threw = false; michael@0: function ffi() { michael@0: try { michael@0: neuter(buffer, "same-data"); michael@0: } catch (e) { michael@0: assertEq(String(e).indexOf("InternalError"), 0); michael@0: threw = true; michael@0: } michael@0: try { michael@0: neuter(buffer, "change-data"); michael@0: } catch (e) { michael@0: assertEq(String(e).indexOf("InternalError"), 0); michael@0: threw = true; michael@0: } michael@0: } michael@0: var inner = f2(this, {ffi:ffi}, buffer); michael@0: if (isAsmJSCompilationAvailable()) michael@0: assertEq(isAsmJSFunction(inner), true); michael@0: i32[2] = 13; michael@0: var result = inner(8); michael@0: if (threw) michael@0: assertEq(result, 13); michael@0: else michael@0: assertEq(result, 0); michael@0: