|
1 load(libdir + "asm.js"); |
|
2 |
|
3 function f(stdlib, foreign, buffer) { |
|
4 "use asm"; |
|
5 var i32 = new stdlib.Int32Array(buffer); |
|
6 function set(i,j) { |
|
7 i=i|0; |
|
8 j=j|0; |
|
9 i32[i>>2] = j; |
|
10 } |
|
11 function get(i) { |
|
12 i=i|0; |
|
13 return i32[i>>2]|0 |
|
14 } |
|
15 return {get:get, set:set} |
|
16 } |
|
17 if (isAsmJSCompilationAvailable()) |
|
18 assertEq(isAsmJSModule(f), true); |
|
19 |
|
20 var i32 = new Int32Array(1024); |
|
21 var buffer = i32.buffer; |
|
22 var {get, set} = f(this, null, buffer); |
|
23 if (isAsmJSCompilationAvailable()) |
|
24 assertEq(isAsmJSFunction(get) && isAsmJSFunction(set), true); |
|
25 |
|
26 set(4, 42); |
|
27 assertEq(get(4), 42); |
|
28 |
|
29 neuter(buffer, "change-data"); |
|
30 neuter(buffer, "same-data"); |
|
31 |
|
32 // These operations may throw internal errors |
|
33 try { |
|
34 assertEq(get(4), 0); |
|
35 set(0, 42); |
|
36 assertEq(get(0), 0); |
|
37 } catch (e) { |
|
38 assertEq(String(e).indexOf("InternalError"), 0); |
|
39 } |
|
40 |
|
41 function f2(stdlib, foreign, buffer) { |
|
42 "use asm"; |
|
43 var i32 = new stdlib.Int32Array(buffer); |
|
44 var ffi = foreign.ffi; |
|
45 function inner(i) { |
|
46 i=i|0; |
|
47 ffi(); |
|
48 return i32[i>>2]|0 |
|
49 } |
|
50 return inner |
|
51 } |
|
52 if (isAsmJSCompilationAvailable()) |
|
53 assertEq(isAsmJSModule(f2), true); |
|
54 |
|
55 var i32 = new Int32Array(1024); |
|
56 var buffer = i32.buffer; |
|
57 var threw = false; |
|
58 function ffi() { |
|
59 try { |
|
60 neuter(buffer, "same-data"); |
|
61 } catch (e) { |
|
62 assertEq(String(e).indexOf("InternalError"), 0); |
|
63 threw = true; |
|
64 } |
|
65 try { |
|
66 neuter(buffer, "change-data"); |
|
67 } catch (e) { |
|
68 assertEq(String(e).indexOf("InternalError"), 0); |
|
69 threw = true; |
|
70 } |
|
71 } |
|
72 var inner = f2(this, {ffi:ffi}, buffer); |
|
73 if (isAsmJSCompilationAvailable()) |
|
74 assertEq(isAsmJSFunction(inner), true); |
|
75 i32[2] = 13; |
|
76 var result = inner(8); |
|
77 if (threw) |
|
78 assertEq(result, 13); |
|
79 else |
|
80 assertEq(result, 0); |
|
81 |