OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Flags: --expose-wasm | 5 // Flags: --expose-wasm |
6 | 6 |
7 'use strict'; | 7 'use strict'; |
8 | 8 |
9 load("test/mjsunit/wasm/wasm-constants.js"); | 9 load("test/mjsunit/wasm/wasm-constants.js"); |
10 load("test/mjsunit/wasm/wasm-module-builder.js"); | 10 load("test/mjsunit/wasm/wasm-module-builder.js"); |
11 | 11 |
12 // Basic tests. | 12 // Basic tests. |
13 | 13 |
14 var outOfUint32RangeValue = 1e12; | 14 var outOfUint32RangeValue = 1e12; |
15 var int32ButOob = 1073741824; | 15 var int32ButOob = 1073741824; |
16 var kMaxUint32 = (4 * 1024 * 1024 * 1024) - 1; | 16 var kMaxUint32 = (4 * 1024 * 1024 * 1024) - 1; |
| 17 var kMaxUint31 = (2 * 1024 * 1024 * 1024) - 1; |
17 var kV8MaxWasmTableSize = 10000000; | 18 var kV8MaxWasmTableSize = 10000000; |
18 | 19 |
19 function assertTableIsValid(table) { | 20 function assertTableIsValid(table, length) { |
20 assertSame(WebAssembly.Table.prototype, table.__proto__); | 21 assertSame(WebAssembly.Table.prototype, table.__proto__); |
21 assertSame(WebAssembly.Table, table.constructor); | 22 assertSame(WebAssembly.Table, table.constructor); |
22 assertTrue(table instanceof Object); | 23 assertTrue(table instanceof Object); |
23 assertTrue(table instanceof WebAssembly.Table); | 24 assertTrue(table instanceof WebAssembly.Table); |
| 25 assertEquals(length, table.length); |
24 } | 26 } |
25 | 27 |
26 (function TestConstructor() { | 28 (function TestConstructor() { |
27 assertTrue(WebAssembly.Table instanceof Function); | 29 assertTrue(WebAssembly.Table instanceof Function); |
28 assertSame(WebAssembly.Table, WebAssembly.Table.prototype.constructor); | 30 assertSame(WebAssembly.Table, WebAssembly.Table.prototype.constructor); |
29 assertTrue(WebAssembly.Table.prototype.grow instanceof Function); | 31 assertTrue(WebAssembly.Table.prototype.grow instanceof Function); |
30 assertTrue(WebAssembly.Table.prototype.get instanceof Function); | 32 assertTrue(WebAssembly.Table.prototype.get instanceof Function); |
31 assertTrue(WebAssembly.Table.prototype.set instanceof Function); | 33 assertTrue(WebAssembly.Table.prototype.set instanceof Function); |
32 let desc = Object.getOwnPropertyDescriptor(WebAssembly.Table.prototype, 'lengt
h'); | 34 let desc = Object.getOwnPropertyDescriptor(WebAssembly.Table.prototype, 'lengt
h'); |
33 assertTrue(desc.get instanceof Function); | 35 assertTrue(desc.get instanceof Function); |
(...skipping 16 matching lines...) Expand all Loading... |
50 | 52 |
51 assertThrows(() => new WebAssembly.Table( | 53 assertThrows(() => new WebAssembly.Table( |
52 {element: "anyfunc", initial: 10, maximum: -1}), RangeError); | 54 {element: "anyfunc", initial: 10, maximum: -1}), RangeError); |
53 assertThrows(() => new WebAssembly.Table( | 55 assertThrows(() => new WebAssembly.Table( |
54 {element: "anyfunc", initial: 10, maximum: outOfUint32RangeValue}), RangeErr
or); | 56 {element: "anyfunc", initial: 10, maximum: outOfUint32RangeValue}), RangeErr
or); |
55 assertThrows(() => new WebAssembly.Table( | 57 assertThrows(() => new WebAssembly.Table( |
56 {element: "anyfunc", initial: 10, maximum: 9}), RangeError); | 58 {element: "anyfunc", initial: 10, maximum: 9}), RangeError); |
57 | 59 |
58 let table; | 60 let table; |
59 table = new WebAssembly.Table({element: "anyfunc", initial: 1}); | 61 table = new WebAssembly.Table({element: "anyfunc", initial: 1}); |
60 assertTableIsValid(table); | 62 assertTableIsValid(table, 1); |
61 assertEquals(1, table.length); | |
62 assertEquals(null, table.get(0)); | 63 assertEquals(null, table.get(0)); |
63 assertEquals(undefined, table[0]); | 64 assertEquals(undefined, table[0]); |
64 | 65 |
65 table = new WebAssembly.Table({element: "anyfunc", initial: "2"}); | 66 table = new WebAssembly.Table({element: "anyfunc", initial: "2"}); |
66 assertTableIsValid(table); | 67 assertTableIsValid(table, 2); |
67 assertEquals(2, table.length); | |
68 assertEquals(null, table.get(0)); | 68 assertEquals(null, table.get(0)); |
69 assertEquals(null, table.get(1)); | 69 assertEquals(null, table.get(1)); |
70 assertEquals(undefined, table[0]); | 70 assertEquals(undefined, table[0]); |
71 assertEquals(undefined, table[1]); | 71 assertEquals(undefined, table[1]); |
72 | 72 |
73 table = new WebAssembly.Table({element: "anyfunc", initial: {valueOf() { retur
n "1" }}}); | 73 table = new WebAssembly.Table({element: "anyfunc", initial: {valueOf() { retur
n "1" }}}); |
74 assertTableIsValid(table); | 74 assertTableIsValid(table, 1); |
75 assertEquals(1, table.length); | |
76 assertEquals(null, table.get(0)); | 75 assertEquals(null, table.get(0)); |
77 assertEquals(undefined, table[0]); | 76 assertEquals(undefined, table[0]); |
78 | 77 |
79 table = new WebAssembly.Table({element: "anyfunc", initial: undefined}); | 78 table = new WebAssembly.Table({element: "anyfunc", initial: undefined}); |
80 assertTableIsValid(table); | 79 assertTableIsValid(table, 0); |
81 assertEquals(0, table.length); | |
82 | 80 |
83 table = new WebAssembly.Table({element: "anyfunc"}); | 81 table = new WebAssembly.Table({element: "anyfunc"}); |
84 assertTableIsValid(table); | 82 assertTableIsValid(table, 0); |
85 assertEquals(0, table.length); | |
86 | 83 |
87 table = new WebAssembly.Table({element: "anyfunc", maximum: 10}); | 84 table = new WebAssembly.Table({element: "anyfunc", maximum: 10}); |
88 assertTableIsValid(table); | 85 assertTableIsValid(table, 0); |
89 assertEquals(0, table.length); | |
90 | 86 |
91 table = new WebAssembly.Table({element: "anyfunc", maximum: "10"}); | 87 table = new WebAssembly.Table({element: "anyfunc", maximum: "10"}); |
92 assertTableIsValid(table); | 88 assertTableIsValid(table, 0); |
93 assertEquals(0, table.length); | |
94 | 89 |
95 table = new WebAssembly.Table({element: "anyfunc", maximum: {valueOf() { retur
n "10" }}}); | 90 table = new WebAssembly.Table({element: "anyfunc", maximum: {valueOf() { retur
n "10" }}}); |
96 assertTableIsValid(table); | 91 assertTableIsValid(table, 0); |
97 assertEquals(0, table.length); | |
98 | 92 |
99 table = new WebAssembly.Table({element: "anyfunc", initial: 0, maximum: undefi
ned}); | 93 table = new WebAssembly.Table({element: "anyfunc", initial: 0, maximum: undefi
ned}); |
100 assertTableIsValid(table); | 94 assertTableIsValid(table, 0); |
101 assertEquals(0, table.length); | 95 |
| 96 table = new WebAssembly.Table({element: "anyfunc", maximum: kMaxUint31}); |
| 97 assertTableIsValid(table, 0); |
102 | 98 |
103 table = new WebAssembly.Table({element: "anyfunc", maximum: kMaxUint32}); | 99 table = new WebAssembly.Table({element: "anyfunc", maximum: kMaxUint32}); |
104 assertTableIsValid(table); | 100 assertTableIsValid(table, 0); |
105 assertEquals(0, table.length); | |
106 | 101 |
107 table = new WebAssembly.Table({element: "anyfunc", maximum: kV8MaxWasmTableSiz
e + 1}); | 102 table = new WebAssembly.Table({element: "anyfunc", maximum: kV8MaxWasmTableSiz
e + 1}); |
108 assertTableIsValid(table); | 103 assertTableIsValid(table, 0); |
109 assertEquals(0, table.length); | |
110 })(); | 104 })(); |
111 | 105 |
112 (function TestMaximumIsReadOnce() { | 106 (function TestMaximumIsReadOnce() { |
113 var a = true; | 107 var a = true; |
114 var desc = {element: "anyfunc", initial: 10}; | 108 var desc = {element: "anyfunc", initial: 10}; |
115 Object.defineProperty(desc, 'maximum', {get: function() { | 109 Object.defineProperty(desc, 'maximum', {get: function() { |
116 if (a) { | 110 if (a) { |
117 a = false; | 111 a = false; |
118 return 16; | 112 return 16; |
119 } | 113 } |
120 else { | 114 else { |
121 // Change the return value on the second call so it throws. | 115 // Change the return value on the second call so it throws. |
122 return -1; | 116 return -1; |
123 } | 117 } |
124 }}); | 118 }}); |
125 let table = new WebAssembly.Table(desc); | 119 let table = new WebAssembly.Table(desc); |
126 assertTableIsValid(table); | 120 assertTableIsValid(table, 10); |
127 })(); | 121 })(); |
128 | 122 |
129 (function TestMaximumDoesHasProperty() { | 123 (function TestMaximumDoesHasProperty() { |
130 var hasPropertyWasCalled = false; | 124 var hasPropertyWasCalled = false; |
131 var desc = {element: "anyfunc", initial: 10}; | 125 var desc = {element: "anyfunc", initial: 10}; |
132 var proxy = new Proxy({maximum: 16}, { | 126 var proxy = new Proxy({maximum: 16}, { |
133 has: function(target, name) { hasPropertyWasCalled = true; } | 127 has: function(target, name) { hasPropertyWasCalled = true; } |
134 }); | 128 }); |
135 Object.setPrototypeOf(desc, proxy); | 129 Object.setPrototypeOf(desc, proxy); |
136 let table = new WebAssembly.Table(desc); | 130 let table = new WebAssembly.Table(desc); |
137 assertTableIsValid(table); | 131 assertTableIsValid(table, 10); |
138 })(); | 132 })(); |
139 | 133 |
140 (function TestLength() { | 134 (function TestLength() { |
141 for (let i = 0; i < 10; ++i) { | 135 for (let i = 0; i < 10; ++i) { |
142 let table = new WebAssembly.Table({element: "anyfunc", initial: i}); | 136 let table = new WebAssembly.Table({element: "anyfunc", initial: i}); |
143 assertEquals(i, table.length); | 137 assertEquals(i, table.length); |
144 } | 138 } |
145 | 139 |
146 assertThrows(() => WebAssembly.Table.prototype.length.call([]), TypeError); | 140 assertThrows(() => WebAssembly.Table.prototype.length.call([]), TypeError); |
147 })(); | 141 })(); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 assertThrows(() => table.grow(1), RangeError); | 266 assertThrows(() => table.grow(1), RangeError); |
273 assertThrows(() => table.grow(-10), RangeError); | 267 assertThrows(() => table.grow(-10), RangeError); |
274 | 268 |
275 assertThrows(() => WebAssembly.Table.prototype.grow.call([], 0), TypeError); | 269 assertThrows(() => WebAssembly.Table.prototype.grow.call([], 0), TypeError); |
276 | 270 |
277 table = new WebAssembly.Table( | 271 table = new WebAssembly.Table( |
278 {element: "anyfunc", initial: 0, maximum: kV8MaxWasmTableSize}); | 272 {element: "anyfunc", initial: 0, maximum: kV8MaxWasmTableSize}); |
279 table.grow(kV8MaxWasmTableSize); | 273 table.grow(kV8MaxWasmTableSize); |
280 assertThrows(() => table.grow(1), RangeError); | 274 assertThrows(() => table.grow(1), RangeError); |
281 })(); | 275 })(); |
OLD | NEW |