Title: [271100] trunk
Revision
271100
Author
[email protected]
Date
2020-12-27 20:41:00 -0800 (Sun, 27 Dec 2020)

Log Message

[WASM-References] Fix table.init and table.grow to satisfy the spec
https://bugs.webkit.org/show_bug.cgi?id=220181

Patch by Dmitry Bezhetskov <[email protected]> on 2020-12-27
Reviewed by Yusuke Suzuki.

JSTests:

Fix behaviour of the previous tests and added ref-types
spec tests for bulk operations and table.grow.

* wasm.yaml:
* wasm/references-spec-tests/bulk.wast.js: Added.
* wasm/references-spec-tests/table_grow.wast.js: Added.
* wasm/references/table_misc.js:
(TableSize.0.End.End.WebAssembly):

Source/_javascript_Core:

Fix and refactor a little bit table.init and
table.grow.

* wasm/WasmOperations.cpp:
(JSC::Wasm::JSC_DEFINE_JIT_OPERATION):
* wasm/WasmOperations.h:
* wasm/WasmSlowPaths.cpp:
(JSC::LLInt::WASM_SLOW_PATH_DECL):

Modified Paths

Added Paths

Diff

Modified: trunk/JSTests/ChangeLog (271099 => 271100)


--- trunk/JSTests/ChangeLog	2020-12-28 02:47:14 UTC (rev 271099)
+++ trunk/JSTests/ChangeLog	2020-12-28 04:41:00 UTC (rev 271100)
@@ -1,5 +1,21 @@
 2020-12-27  Dmitry Bezhetskov  <[email protected]>
 
+        [WASM-References] Fix table.init and table.grow to satisfy the spec
+        https://bugs.webkit.org/show_bug.cgi?id=220181
+
+        Reviewed by Yusuke Suzuki.
+
+        Fix behaviour of the previous tests and added ref-types
+        spec tests for bulk operations and table.grow.
+
+        * wasm.yaml:
+        * wasm/references-spec-tests/bulk.wast.js: Added.
+        * wasm/references-spec-tests/table_grow.wast.js: Added.
+        * wasm/references/table_misc.js:
+        (TableSize.0.End.End.WebAssembly):
+
+2020-12-27  Dmitry Bezhetskov  <[email protected]>
+
         [WASM-References] Adjust table.fill to satisfy the spec
         https://bugs.webkit.org/show_bug.cgi?id=220161
 

Modified: trunk/JSTests/wasm/references/table_misc.js (271099 => 271100)


--- trunk/JSTests/wasm/references/table_misc.js	2020-12-28 02:47:14 UTC (rev 271099)
+++ trunk/JSTests/wasm/references/table_misc.js	2020-12-28 04:41:00 UTC (rev 271100)
@@ -81,9 +81,9 @@
     assert.eq($1.exports.tbl.get(24), "hi")
     assert.eq($1.exports.tbl.get(25), null)
     assert.eq($1.exports.tbl_size(), 30)
-    assert.eq($1.exports.tbl_grow(null, 0), -1)
+    assert.eq($1.exports.tbl_grow(null, 0), 30)
     assert.eq($1.exports.tbl_grow(null, 5), -1)
-    assert.eq($1.exports.tbl_grow(null, 0), -1)
+    assert.eq($1.exports.tbl_grow(null, 0), 30)
 }
 
 assert.throws(() => new WebAssembly.Module((new Builder())

Added: trunk/JSTests/wasm/references-spec-tests/bulk.wast.js (0 => 271100)


--- trunk/JSTests/wasm/references-spec-tests/bulk.wast.js	                        (rev 0)
+++ trunk/JSTests/wasm/references-spec-tests/bulk.wast.js	2020-12-28 04:41:00 UTC (rev 271100)
@@ -0,0 +1,351 @@
+
+// bulk.wast:2
+let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x05\x83\x80\x80\x80\x00\x01\x00\x01\x0b\x86\x80\x80\x80\x00\x01\x01\x03\x66\x6f\x6f");
+
+// bulk.wast:6
+let $2 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x84\x80\x80\x80\x00\x01\x60\x00\x00\x03\x83\x80\x80\x80\x00\x02\x00\x00\x04\x84\x80\x80\x80\x00\x01\x70\x00\x03\x09\x8d\x80\x80\x80\x00\x01\x05\x70\x03\xd2\x00\x0b\xd0\x70\x0b\xd2\x01\x0b\x0a\x8f\x80\x80\x80\x00\x02\x82\x80\x80\x80\x00\x00\x0b\x82\x80\x80\x80\x00\x00\x0b");
+
+// bulk.wast:13
+let $3 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x8c\x80\x80\x80\x00\x02\x60\x03\x7f\x7f\x7f\x00\x60\x01\x7f\x01\x7f\x03\x83\x80\x80\x80\x00\x02\x00\x01\x05\x83\x80\x80\x80\x00\x01\x00\x01\x07\x92\x80\x80\x80\x00\x02\x04\x66\x69\x6c\x6c\x00\x00\x07\x6c\x6f\x61\x64\x38\x5f\x75\x00\x01\x0a\x9d\x80\x80\x80\x00\x02\x8b\x80\x80\x80\x00\x00\x20\x00\x20\x01\x20\x02\xfc\x0b\x00\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x2d\x00\x00\x0b");
+
+// bulk.wast:27
+run(() => call($3, "fill", [1, 255, 3]));
+
+// bulk.wast:28
+assert_return(() => call($3, "load8_u", [0]), 0);
+
+// bulk.wast:29
+assert_return(() => call($3, "load8_u", [1]), 255);
+
+// bulk.wast:30
+assert_return(() => call($3, "load8_u", [2]), 255);
+
+// bulk.wast:31
+assert_return(() => call($3, "load8_u", [3]), 255);
+
+// bulk.wast:32
+assert_return(() => call($3, "load8_u", [4]), 0);
+
+// bulk.wast:35
+run(() => call($3, "fill", [0, 48_042, 2]));
+
+// bulk.wast:36
+assert_return(() => call($3, "load8_u", [0]), 170);
+
+// bulk.wast:37
+assert_return(() => call($3, "load8_u", [1]), 170);
+
+// bulk.wast:40
+run(() => call($3, "fill", [0, 0, 65_536]));
+
+// bulk.wast:43
+assert_trap(() => call($3, "fill", [65_280, 1, 257]));
+
+// bulk.wast:45
+assert_return(() => call($3, "load8_u", [65_280]), 0);
+
+// bulk.wast:46
+assert_return(() => call($3, "load8_u", [65_535]), 0);
+
+// bulk.wast:49
+run(() => call($3, "fill", [65_536, 0, 0]));
+
+// bulk.wast:52
+assert_trap(() => call($3, "fill", [65_537, 0, 0]));
+
+// bulk.wast:57
+let $4 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x8c\x80\x80\x80\x00\x02\x60\x03\x7f\x7f\x7f\x00\x60\x01\x7f\x01\x7f\x03\x83\x80\x80\x80\x00\x02\x00\x01\x05\x84\x80\x80\x80\x00\x01\x01\x01\x01\x07\x92\x80\x80\x80\x00\x02\x04\x63\x6f\x70\x79\x00\x00\x07\x6c\x6f\x61\x64\x38\x5f\x75\x00\x01\x0a\x9e\x80\x80\x80\x00\x02\x8c\x80\x80\x80\x00\x00\x20\x00\x20\x01\x20\x02\xfc\x0a\x00\x00\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x2d\x00\x00\x0b\x0b\x8a\x80\x80\x80\x00\x01\x00\x41\x00\x0b\x04\xaa\xbb\xcc\xdd");
+
+// bulk.wast:71
+run(() => call($4, "copy", [10, 0, 4]));
+
+// bulk.wast:73
+assert_return(() => call($4, "load8_u", [9]), 0);
+
+// bulk.wast:74
+assert_return(() => call($4, "load8_u", [10]), 170);
+
+// bulk.wast:75
+assert_return(() => call($4, "load8_u", [11]), 187);
+
+// bulk.wast:76
+assert_return(() => call($4, "load8_u", [12]), 204);
+
+// bulk.wast:77
+assert_return(() => call($4, "load8_u", [13]), 221);
+
+// bulk.wast:78
+assert_return(() => call($4, "load8_u", [14]), 0);
+
+// bulk.wast:81
+run(() => call($4, "copy", [8, 10, 4]));
+
+// bulk.wast:82
+assert_return(() => call($4, "load8_u", [8]), 170);
+
+// bulk.wast:83
+assert_return(() => call($4, "load8_u", [9]), 187);
+
+// bulk.wast:84
+assert_return(() => call($4, "load8_u", [10]), 204);
+
+// bulk.wast:85
+assert_return(() => call($4, "load8_u", [11]), 221);
+
+// bulk.wast:86
+assert_return(() => call($4, "load8_u", [12]), 204);
+
+// bulk.wast:87
+assert_return(() => call($4, "load8_u", [13]), 221);
+
+// bulk.wast:90
+run(() => call($4, "copy", [10, 7, 6]));
+
+// bulk.wast:91
+assert_return(() => call($4, "load8_u", [10]), 0);
+
+// bulk.wast:92
+assert_return(() => call($4, "load8_u", [11]), 170);
+
+// bulk.wast:93
+assert_return(() => call($4, "load8_u", [12]), 187);
+
+// bulk.wast:94
+assert_return(() => call($4, "load8_u", [13]), 204);
+
+// bulk.wast:95
+assert_return(() => call($4, "load8_u", [14]), 221);
+
+// bulk.wast:96
+assert_return(() => call($4, "load8_u", [15]), 204);
+
+// bulk.wast:97
+assert_return(() => call($4, "load8_u", [16]), 0);
+
+// bulk.wast:100
+run(() => call($4, "copy", [65_280, 0, 256]));
+
+// bulk.wast:101
+run(() => call($4, "copy", [65_024, 65_280, 256]));
+
+// bulk.wast:104
+run(() => call($4, "copy", [65_536, 0, 0]));
+
+// bulk.wast:105
+run(() => call($4, "copy", [0, 65_536, 0]));
+
+// bulk.wast:108
+assert_trap(() => call($4, "copy", [65_537, 0, 0]));
+
+// bulk.wast:110
+assert_trap(() => call($4, "copy", [0, 65_537, 0]));
+
+// bulk.wast:115
+let $5 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x8c\x80\x80\x80\x00\x02\x60\x03\x7f\x7f\x7f\x00\x60\x01\x7f\x01\x7f\x03\x83\x80\x80\x80\x00\x02\x00\x01\x05\x83\x80\x80\x80\x00\x01\x00\x01\x07\x92\x80\x80\x80\x00\x02\x04\x69\x6e\x69\x74\x00\x00\x07\x6c\x6f\x61\x64\x38\x5f\x75\x00\x01\x0c\x81\x80\x80\x80\x00\x01\x0a\x9e\x80\x80\x80\x00\x02\x8c\x80\x80\x80\x00\x00\x20\x00\x20\x01\x20\x02\xfc\x08\x00\x00\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x2d\x00\x00\x0b\x0b\x87\x80\x80\x80\x00\x01\x01\x04\xaa\xbb\xcc\xdd");
+
+// bulk.wast:129
+run(() => call($5, "init", [0, 1, 2]));
+
+// bulk.wast:130
+assert_return(() => call($5, "load8_u", [0]), 187);
+
+// bulk.wast:131
+assert_return(() => call($5, "load8_u", [1]), 204);
+
+// bulk.wast:132
+assert_return(() => call($5, "load8_u", [2]), 0);
+
+// bulk.wast:135
+run(() => call($5, "init", [65_532, 0, 4]));
+
+// bulk.wast:138
+assert_trap(() => call($5, "init", [65_534, 0, 3]));
+
+// bulk.wast:140
+assert_return(() => call($5, "load8_u", [65_534]), 204);
+
+// bulk.wast:141
+assert_return(() => call($5, "load8_u", [65_535]), 221);
+
+// bulk.wast:144
+run(() => call($5, "init", [65_536, 0, 0]));
+
+// bulk.wast:145
+run(() => call($5, "init", [0, 4, 0]));
+
+// bulk.wast:148
+assert_trap(() => call($5, "init", [65_537, 0, 0]));
+
+// bulk.wast:150
+assert_trap(() => call($5, "init", [0, 5, 0]));
+
+// bulk.wast:154
+let $6 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x88\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7f\x00\x03\x85\x80\x80\x80\x00\x04\x00\x01\x00\x01\x05\x83\x80\x80\x80\x00\x01\x00\x01\x07\xbb\x80\x80\x80\x00\x04\x0c\x64\x72\x6f\x70\x5f\x70\x61\x73\x73\x69\x76\x65\x00\x00\x0c\x69\x6e\x69\x74\x5f\x70\x61\x73\x73\x69\x76\x65\x00\x01\x0b\x64\x72\x6f\x70\x5f\x61\x63\x74\x69\x76\x65\x00\x02\x0b\x69\x6e\x69\x74\x5f\x61\x63\x74\x69\x76\x65\x00\x03\x0c\x81\x80\x80\x80\x00\x02\x0a\xb7\x80\x80\x80\x00\x04\x85\x80\x80\x80\x00\x00\xfc\x09\x00\x0b\x8c\x80\x80\x80\x00\x00\x41\x00\x41\x00\x20\x00\xfc\x08\x00\x00\x0b\x85\x80\x80\x80\x00\x00\xfc\x09\x01\x0b\x8c\x80\x80\x80\x00\x00\x41\x00\x41\x00\x20\x00\xfc\x08\x01\x00\x0b\x0b\x8a\x80\x80\x80\x00\x02\x01\x01\x78\x00\x41\x00\x0b\x01\x78");
+
+// bulk.wast:168
+run(() => call($6, "init_passive", [1]));
+
+// bulk.wast:169
+run(() => call($6, "drop_passive", []));
+
+// bulk.wast:170
+run(() => call($6, "drop_passive", []));
+
+// bulk.wast:171
+assert_return(() => call($6, "init_passive", [0]));
+
+// bulk.wast:172
+assert_trap(() => call($6, "init_passive", [1]));
+
+// bulk.wast:173
+run(() => call($6, "init_passive", [0]));
+
+// bulk.wast:174
+run(() => call($6, "drop_active", []));
+
+// bulk.wast:175
+assert_return(() => call($6, "init_active", [0]));
+
+// bulk.wast:176
+assert_trap(() => call($6, "init_active", [1]));
+
+// bulk.wast:177
+run(() => call($6, "init_active", [0]));
+
+// bulk.wast:181
+let $7 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x84\x80\x80\x80\x00\x01\x60\x00\x00\x03\x82\x80\x80\x80\x00\x01\x00\x0c\x81\x80\x80\x80\x00\x41\x0a\x8b\x80\x80\x80\x00\x01\x85\x80\x80\x80\x00\x00\xfc\x09\x40\x0b\x0b\x83\x81\x80\x80\x00\x41\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00");
+
+// bulk.wast:196
+let $8 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x84\x80\x80\x80\x00\x01\x60\x00\x00\x03\x82\x80\x80\x80\x00\x01\x00\x0c\x81\x80\x80\x80\x00\x01\x0a\x8b\x80\x80\x80\x00\x01\x85\x80\x80\x80\x00\x00\xfc\x09\x00\x0b\x0b\x8a\x80\x80\x80\x00\x01\x01\x07\x67\x6f\x6f\x64\x62\x79\x65");
+
+// bulk.wast:199
+let $9 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x90\x80\x80\x80\x00\x03\x60\x00\x01\x7f\x60\x03\x7f\x7f\x7f\x00\x60\x01\x7f\x01\x7f\x03\x85\x80\x80\x80\x00\x04\x00\x00\x01\x02\x04\x84\x80\x80\x80\x00\x01\x70\x00\x03\x07\x8f\x80\x80\x80\x00\x02\x04\x69\x6e\x69\x74\x00\x02\x04\x63\x61\x6c\x6c\x00\x03\x09\x88\x80\x80\x80\x00\x01\x01\x00\x04\x00\x01\x00\x01\x0a\xb0\x80\x80\x80\x00\x04\x84\x80\x80\x80\x00\x00\x41\x00\x0b\x84\x80\x80\x80\x00\x00\x41\x01\x0b\x8c\x80\x80\x80\x00\x00\x20\x00\x20\x01\x20\x02\xfc\x0c\x00\x00\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x11\x00\x00\x0b");
+
+// bulk.wast:219
+assert_trap(() => call($9, "init", [2, 0, 2]));
+
+// bulk.wast:221
+assert_trap(() => call($9, "call", [2]));
+
+// bulk.wast:224
+run(() => call($9, "init", [0, 1, 2]));
+
+// bulk.wast:225
+assert_return(() => call($9, "call", [0]), 1);
+
+// bulk.wast:226
+assert_return(() => call($9, "call", [1]), 0);
+
+// bulk.wast:227
+assert_trap(() => call($9, "call", [2]));
+
+// bulk.wast:230
+run(() => call($9, "init", [1, 2, 2]));
+
+// bulk.wast:233
+run(() => call($9, "init", [3, 0, 0]));
+
+// bulk.wast:234
+run(() => call($9, "init", [0, 4, 0]));
+
+// bulk.wast:237
+assert_trap(() => call($9, "init", [4, 0, 0]));
+
+// bulk.wast:239
+assert_trap(() => call($9, "init", [0, 5, 0]));
+
+// bulk.wast:244
+let $10 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x88\x80\x80\x80\x00\x02\x60\x00\x00\x60\x01\x7f\x00\x03\x86\x80\x80\x80\x00\x05\x00\x00\x01\x00\x01\x04\x84\x80\x80\x80\x00\x01\x70\x00\x01\x07\xbb\x80\x80\x80\x00\x04\x0c\x64\x72\x6f\x70\x5f\x70\x61\x73\x73\x69\x76\x65\x00\x01\x0c\x69\x6e\x69\x74\x5f\x70\x61\x73\x73\x69\x76\x65\x00\x02\x0b\x64\x72\x6f\x70\x5f\x61\x63\x74\x69\x76\x65\x00\x03\x0b\x69\x6e\x69\x74\x5f\x61\x63\x74\x69\x76\x65\x00\x04\x09\x8b\x80\x80\x80\x00\x02\x01\x00\x01\x00\x00\x41\x00\x0b\x01\x00\x0a\xbe\x80\x80\x80\x00\x05\x82\x80\x80\x80\x00\x00\x0b\x85\x80\x80\x80\x00\x00\xfc\x0d\x00\x0b\x8c\x80\x80\x80\x00\x00\x41\x00\x41\x00\x20\x00\xfc\x0c\x00\x00\x0b\x85\x80\x80\x80\x00\x00\xfc\x0d\x01\x0b\x8c\x80\x80\x80\x00\x00\x41\x00\x41\x00\x20\x00\xfc\x0c\x01\x00\x0b");
+
+// bulk.wast:261
+run(() => call($10, "init_passive", [1]));
+
+// bulk.wast:262
+run(() => call($10, "drop_passive", []));
+
+// bulk.wast:263
+run(() => call($10, "drop_passive", []));
+
+// bulk.wast:264
+assert_return(() => call($10, "init_passive", [0]));
+
+// bulk.wast:265
+assert_trap(() => call($10, "init_passive", [1]));
+
+// bulk.wast:266
+run(() => call($10, "init_passive", [0]));
+
+// bulk.wast:267
+run(() => call($10, "drop_active", []));
+
+// bulk.wast:268
+assert_return(() => call($10, "init_active", [0]));
+
+// bulk.wast:269
+assert_trap(() => call($10, "init_active", [1]));
+
+// bulk.wast:270
+run(() => call($10, "init_active", [0]));
+
+// bulk.wast:274
+let $11 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x84\x80\x80\x80\x00\x01\x60\x00\x00\x03\x82\x80\x80\x80\x00\x01\x00\x09\xc4\x81\x80\x80\x00\x41\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x0a\x8b\x80\x80\x80\x00\x01\x85\x80\x80\x80\x00\x00\xfc\x0d
 \x40\x0b");
+
+// bulk.wast:297
+let $12 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x84\x80\x80\x80\x00\x01\x60\x00\x00\x03\x82\x80\x80\x80\x00\x01\x00\x09\x85\x80\x80\x80\x00\x01\x01\x00\x01\x00\x0a\x8b\x80\x80\x80\x00\x01\x85\x80\x80\x80\x00\x00\xfc\x0d\x00\x0b");
+
+// bulk.wast:300
+let $13 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x90\x80\x80\x80\x00\x03\x60\x00\x01\x7f\x60\x03\x7f\x7f\x7f\x00\x60\x01\x7f\x01\x7f\x03\x86\x80\x80\x80\x00\x05\x00\x00\x00\x01\x02\x04\x84\x80\x80\x80\x00\x01\x70\x00\x0a\x07\x8f\x80\x80\x80\x00\x02\x04\x63\x6f\x70\x79\x00\x03\x04\x63\x61\x6c\x6c\x00\x04\x09\x89\x80\x80\x80\x00\x01\x00\x41\x00\x0b\x03\x00\x01\x02\x0a\xb9\x80\x80\x80\x00\x05\x84\x80\x80\x80\x00\x00\x41\x00\x0b\x84\x80\x80\x80\x00\x00\x41\x01\x0b\x84\x80\x80\x80\x00\x00\x41\x02\x0b\x8c\x80\x80\x80\x00\x00\x20\x00\x20\x01\x20\x02\xfc\x0e\x00\x00\x0b\x87\x80\x80\x80\x00\x00\x20\x00\x11\x00\x00\x0b");
+
+// bulk.wast:319
+run(() => call($13, "copy", [3, 0, 3]));
+
+// bulk.wast:321
+assert_return(() => call($13, "call", [3]), 0);
+
+// bulk.wast:322
+assert_return(() => call($13, "call", [4]), 1);
+
+// bulk.wast:323
+assert_return(() => call($13, "call", [5]), 2);
+
+// bulk.wast:326
+run(() => call($13, "copy", [0, 1, 3]));
+
+// bulk.wast:328
+assert_return(() => call($13, "call", [0]), 1);
+
+// bulk.wast:329
+assert_return(() => call($13, "call", [1]), 2);
+
+// bulk.wast:330
+assert_return(() => call($13, "call", [2]), 0);
+
+// bulk.wast:333
+run(() => call($13, "copy", [2, 0, 3]));
+
+// bulk.wast:335
+assert_return(() => call($13, "call", [2]), 1);
+
+// bulk.wast:336
+assert_return(() => call($13, "call", [3]), 2);
+
+// bulk.wast:337
+assert_return(() => call($13, "call", [4]), 0);
+
+// bulk.wast:340
+run(() => call($13, "copy", [6, 8, 2]));
+
+// bulk.wast:341
+run(() => call($13, "copy", [8, 6, 2]));
+
+// bulk.wast:344
+run(() => call($13, "copy", [10, 0, 0]));
+
+// bulk.wast:345
+run(() => call($13, "copy", [0, 10, 0]));
+
+// bulk.wast:348
+assert_trap(() => call($13, "copy", [11, 0, 0]));
+
+// bulk.wast:350
+assert_trap(() => call($13, "copy", [0, 11, 0]));

Added: trunk/JSTests/wasm/references-spec-tests/table_grow.wast.js (0 => 271100)


--- trunk/JSTests/wasm/references-spec-tests/table_grow.wast.js	                        (rev 0)
+++ trunk/JSTests/wasm/references-spec-tests/table_grow.wast.js	2020-12-28 04:41:00 UTC (rev 271100)
@@ -0,0 +1,150 @@
+
+// table_grow.wast:1
+let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x95\x80\x80\x80\x00\x04\x60\x01\x7f\x01\x6f\x60\x02\x7f\x6f\x00\x60\x02\x7f\x6f\x01\x7f\x60\x00\x01\x7f\x03\x85\x80\x80\x80\x00\x04\x00\x01\x02\x03\x04\x84\x80\x80\x80\x00\x01\x6f\x00\x00\x07\x9b\x80\x80\x80\x00\x04\x03\x67\x65\x74\x00\x00\x03\x73\x65\x74\x00\x01\x04\x67\x72\x6f\x77\x00\x02\x04\x73\x69\x7a\x65\x00\x03\x0a\xb1\x80\x80\x80\x00\x04\x86\x80\x80\x80\x00\x00\x20\x00\x25\x00\x0b\x88\x80\x80\x80\x00\x00\x20\x00\x20\x01\x26\x00\x0b\x89\x80\x80\x80\x00\x00\x20\x01\x20\x00\xfc\x0f\x00\x0b\x85\x80\x80\x80\x00\x00\xfc\x10\x00\x0b");
+
+// table_grow.wast:13
+assert_return(() => call($1, "size", []), 0);
+
+// table_grow.wast:14
+assert_trap(() => call($1, "set", [0, externref(2)]));
+
+// table_grow.wast:15
+assert_trap(() => call($1, "get", [0]));
+
+// table_grow.wast:17
+assert_return(() => call($1, "grow", [1, null]), 0);
+
+// table_grow.wast:18
+assert_return(() => call($1, "size", []), 1);
+
+// table_grow.wast:19
+assert_return(() => call($1, "get", [0]), null);
+
+// table_grow.wast:20
+assert_return(() => call($1, "set", [0, externref(2)]));
+
+// table_grow.wast:21
+assert_return(() => call($1, "get", [0]), externref(2));
+
+// table_grow.wast:22
+assert_trap(() => call($1, "set", [1, externref(2)]));
+
+// table_grow.wast:23
+assert_trap(() => call($1, "get", [1]));
+
+// table_grow.wast:25
+assert_return(() => call($1, "grow", [4, externref(3)]), 1);
+
+// table_grow.wast:26
+assert_return(() => call($1, "size", []), 5);
+
+// table_grow.wast:27
+assert_return(() => call($1, "get", [0]), externref(2));
+
+// table_grow.wast:28
+assert_return(() => call($1, "set", [0, externref(2)]));
+
+// table_grow.wast:29
+assert_return(() => call($1, "get", [0]), externref(2));
+
+// table_grow.wast:30
+assert_return(() => call($1, "get", [1]), externref(3));
+
+// table_grow.wast:31
+assert_return(() => call($1, "get", [4]), externref(3));
+
+// table_grow.wast:32
+assert_return(() => call($1, "set", [4, externref(4)]));
+
+// table_grow.wast:33
+assert_return(() => call($1, "get", [4]), externref(4));
+
+// table_grow.wast:34
+assert_trap(() => call($1, "set", [5, externref(2)]));
+
+// table_grow.wast:35
+assert_trap(() => call($1, "get", [5]));
+
+// table_grow.wast:39
+let $2 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x85\x80\x80\x80\x00\x01\x60\x00\x01\x7f\x03\x82\x80\x80\x80\x00\x01\x00\x04\x84\x80\x80\x80\x00\x01\x70\x00\x10\x07\x88\x80\x80\x80\x00\x01\x04\x67\x72\x6f\x77\x00\x00\x09\x85\x80\x80\x80\x00\x01\x03\x00\x01\x00\x0a\x8f\x80\x80\x80\x00\x01\x89\x80\x80\x80\x00\x00\xd2\x00\x41\x70\xfc\x0f\x00\x0b");
+
+// table_grow.wast:47
+assert_return(() => call($2, "grow", []), -1);
+
+// table_grow.wast:50
+let $3 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x86\x80\x80\x80\x00\x01\x60\x01\x7f\x01\x7f\x03\x82\x80\x80\x80\x00\x01\x00\x04\x84\x80\x80\x80\x00\x01\x6f\x00\x00\x07\x88\x80\x80\x80\x00\x01\x04\x67\x72\x6f\x77\x00\x00\x0a\x8f\x80\x80\x80\x00\x01\x89\x80\x80\x80\x00\x00\xd0\x6f\x20\x00\xfc\x0f\x00\x0b");
+
+// table_grow.wast:57
+assert_return(() => call($3, "grow", [0]), 0);
+
+// table_grow.wast:58
+assert_return(() => call($3, "grow", [1]), 0);
+
+// table_grow.wast:59
+assert_return(() => call($3, "grow", [0]), 1);
+
+// table_grow.wast:60
+assert_return(() => call($3, "grow", [2]), 1);
+
+// table_grow.wast:61
+assert_return(() => call($3, "grow", [800]), 3);
+
+// table_grow.wast:64
+let $4 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x86\x80\x80\x80\x00\x01\x60\x01\x7f\x01\x7f\x03\x82\x80\x80\x80\x00\x01\x00\x04\x85\x80\x80\x80\x00\x01\x6f\x01\x00\x0a\x07\x88\x80\x80\x80\x00\x01\x04\x67\x72\x6f\x77\x00\x00\x0a\x8f\x80\x80\x80\x00\x01\x89\x80\x80\x80\x00\x00\xd0\x6f\x20\x00\xfc\x0f\x00\x0b");
+
+// table_grow.wast:71
+assert_return(() => call($4, "grow", [0]), 0);
+
+// table_grow.wast:72
+assert_return(() => call($4, "grow", [1]), 0);
+
+// table_grow.wast:73
+assert_return(() => call($4, "grow", [1]), 1);
+
+// table_grow.wast:74
+assert_return(() => call($4, "grow", [2]), 2);
+
+// table_grow.wast:75
+assert_return(() => call($4, "grow", [6]), 4);
+
+// table_grow.wast:76
+assert_return(() => call($4, "grow", [0]), 10);
+
+// table_grow.wast:77
+assert_return(() => call($4, "grow", [1]), -1);
+
+// table_grow.wast:78
+assert_return(() => call($4, "grow", [65_536]), -1);
+
+// table_grow.wast:81
+let $5 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x8c\x80\x80\x80\x00\x02\x60\x01\x7f\x01\x7f\x60\x02\x7f\x7f\x01\x70\x03\x83\x80\x80\x80\x00\x02\x00\x01\x04\x84\x80\x80\x80\x00\x01\x70\x00\x0a\x07\x9b\x80\x80\x80\x00\x02\x04\x67\x72\x6f\x77\x00\x00\x10\x63\x68\x65\x63\x6b\x2d\x74\x61\x62\x6c\x65\x2d\x6e\x75\x6c\x6c\x00\x01\x09\x85\x80\x80\x80\x00\x01\x03\x00\x01\x01\x0a\xc5\x80\x80\x80\x00\x02\x89\x80\x80\x80\x00\x00\xd0\x70\x20\x00\xfc\x0f\x00\x0b\xb1\x80\x80\x80\x00\x01\x01\x70\xd2\x01\x21\x02\x02\x40\x03\x40\x20\x00\x25\x00\x21\x02\x20\x02\xd1\x45\x0d\x01\x20\x00\x20\x01\x4f\x0d\x01\x20\x00\x41\x01\x6a\x21\x00\x20\x00\x20\x01\x4d\x0d\x00\x0b\x0b\x20\x02\x0b");
+
+// table_grow.wast:103
+assert_return(() => call($5, "check-table-null", [0, 9]), null);
+
+// table_grow.wast:104
+assert_return(() => call($5, "grow", [10]), 10);
+
+// table_grow.wast:105
+assert_return(() => call($5, "check-table-null", [0, 19]), null);
+
+// table_grow.wast:110
+assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x85\x80\x80\x80\x00\x01\x60\x00\x01\x7f\x03\x82\x80\x80\x80\x00\x01\x00\x04\x84\x80\x80\x80\x00\x01\x6f\x00\x00\x0a\x8b\x80\x80\x80\x00\x01\x85\x80\x80\x80\x00\x00\xfc\x0f\x00\x0b");
+
+// table_grow.wast:119
+assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x85\x80\x80\x80\x00\x01\x60\x00\x01\x7f\x03\x82\x80\x80\x80\x00\x01\x00\x04\x84\x80\x80\x80\x00\x01\x6f\x00\x00\x0a\x8d\x80\x80\x80\x00\x01\x87\x80\x80\x80\x00\x00\xd0\x6f\xfc\x0f\x00\x0b");
+
+// table_grow.wast:128
+assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x85\x80\x80\x80\x00\x01\x60\x00\x01\x7f\x03\x82\x80\x80\x80\x00\x01\x00\x04\x84\x80\x80\x80\x00\x01\x6f\x00\x00\x0a\x8d\x80\x80\x80\x00\x01\x87\x80\x80\x80\x00\x00\x41\x01\xfc\x0f\x00\x0b");
+
+// table_grow.wast:137
+assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x85\x80\x80\x80\x00\x01\x60\x00\x01\x7f\x03\x82\x80\x80\x80\x00\x01\x00\x04\x84\x80\x80\x80\x00\x01\x6f\x00\x00\x0a\x92\x80\x80\x80\x00\x01\x8c\x80\x80\x80\x00\x00\xd0\x6f\x43\x00\x00\x80\x3f\xfc\x0f\x00\x0b");
+
+// table_grow.wast:146
+assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x86\x80\x80\x80\x00\x01\x60\x01\x6f\x01\x7f\x03\x82\x80\x80\x80\x00\x01\x00\x04\x84\x80\x80\x80\x00\x01\x70\x00\x00\x0a\x8f\x80\x80\x80\x00\x01\x89\x80\x80\x80\x00\x00\x20\x00\x41\x01\xfc\x0f\x00\x0b");
+
+// table_grow.wast:156
+assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x84\x80\x80\x80\x00\x01\x60\x00\x00\x03\x82\x80\x80\x80\x00\x01\x00\x04\x84\x80\x80\x80\x00\x01\x6f\x00\x01\x0a\x8f\x80\x80\x80\x00\x01\x89\x80\x80\x80\x00\x00\xd0\x6f\x41\x00\xfc\x0f\x00\x0b");
+
+// table_grow.wast:165
+assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x85\x80\x80\x80\x00\x01\x60\x00\x01\x7d\x03\x82\x80\x80\x80\x00\x01\x00\x04\x84\x80\x80\x80\x00\x01\x6f\x00\x01\x0a\x8f\x80\x80\x80\x00\x01\x89\x80\x80\x80\x00\x00\xd0\x6f\x41\x00\xfc\x0f\x00\x0b");

Modified: trunk/JSTests/wasm.yaml (271099 => 271100)


--- trunk/JSTests/wasm.yaml	2020-12-28 02:47:14 UTC (rev 271099)
+++ trunk/JSTests/wasm.yaml	2020-12-28 04:41:00 UTC (rev 271100)
@@ -74,6 +74,10 @@
   cmd: runWebAssemblyReferenceSpecTest :normal
 - path: wasm/references-spec-tests/table_fill.wast.js
   cmd: runWebAssemblyReferenceSpecTest :normal
+- path: wasm/references-spec-tests/table_grow.wast.js
+  cmd: runWebAssemblyReferenceSpecTest :normal
+- path: wasm/references-spec-tests/bulk.wast.js
+  cmd: runWebAssemblyReferenceSpecTest :normal
 
 - path: wasm/multi-value-spec-tests/block.wast.js
   cmd: runWebAssemblySpecTest :normal

Modified: trunk/Source/_javascript_Core/ChangeLog (271099 => 271100)


--- trunk/Source/_javascript_Core/ChangeLog	2020-12-28 02:47:14 UTC (rev 271099)
+++ trunk/Source/_javascript_Core/ChangeLog	2020-12-28 04:41:00 UTC (rev 271100)
@@ -1,5 +1,21 @@
 2020-12-27  Dmitry Bezhetskov  <[email protected]>
 
+        [WASM-References] Fix table.init and table.grow to satisfy the spec
+        https://bugs.webkit.org/show_bug.cgi?id=220181
+
+        Reviewed by Yusuke Suzuki.
+
+        Fix and refactor a little bit table.init and 
+        table.grow.
+
+        * wasm/WasmOperations.cpp:
+        (JSC::Wasm::JSC_DEFINE_JIT_OPERATION):
+        * wasm/WasmOperations.h:
+        * wasm/WasmSlowPaths.cpp:
+        (JSC::LLInt::WASM_SLOW_PATH_DECL):
+
+2020-12-27  Dmitry Bezhetskov  <[email protected]>
+
         [WASM-References] Adjust table.fill to satisfy the spec
         https://bugs.webkit.org/show_bug.cgi?id=220161
 

Modified: trunk/Source/_javascript_Core/wasm/WasmOperations.cpp (271099 => 271100)


--- trunk/Source/_javascript_Core/wasm/WasmOperations.cpp	2020-12-28 02:47:14 UTC (rev 271099)
+++ trunk/Source/_javascript_Core/wasm/WasmOperations.cpp	2020-12-28 04:41:00 UTC (rev 271100)
@@ -696,33 +696,26 @@
     return setWasmTableElement(instance, tableIndex, signedIndex, encValue);
 }
 
-JSC_DEFINE_JIT_OPERATION(operationWasmTableInit, bool, (Instance* instance, unsigned elementIndex, unsigned tableIndex, int32_t dstOffset, int32_t srcOffset, int32_t length))
+JSC_DEFINE_JIT_OPERATION(operationWasmTableInit, bool, (Instance* instance, unsigned elementIndex, unsigned tableIndex, uint32_t dstOffset, uint32_t srcOffset, uint32_t length))
 {
     ASSERT(elementIndex < instance->module().moduleInformation().elementCount());
     ASSERT(tableIndex < instance->module().moduleInformation().tableCount());
 
-    if ((srcOffset < 0) || (dstOffset < 0) || (length < 0))
+    if (WTF::sumOverflows<uint32_t>(srcOffset, length))
         return false;
 
-    Checked<uint32_t, RecordOverflow> lastSrcElementIndexChecked = static_cast<uint32_t>(srcOffset);
-    lastSrcElementIndexChecked += static_cast<uint32_t>(length);
-
-    uint32_t lastSrcElementIndex;
-    if (lastSrcElementIndexChecked.safeGet(lastSrcElementIndex) == CheckedState::DidOverflow)
+    if (WTF::sumOverflows<uint32_t>(dstOffset, length))
         return false;
 
-    if (!instance->elementAt(elementIndex) || lastSrcElementIndex > instance->elementAt(elementIndex)->length())
+    if (dstOffset + length > instance->table(tableIndex)->length())
         return false;
 
-    Checked<uint32_t, RecordOverflow> lastDstElementIndexChecked = static_cast<uint32_t>(dstOffset);
-    lastDstElementIndexChecked += static_cast<uint32_t>(length);
-
-    uint32_t lastDstElementIndex;
-    if (lastDstElementIndexChecked.safeGet(lastDstElementIndex) == CheckedState::DidOverflow)
+    const uint32_t lengthOfElementSegment = instance->elementAt(elementIndex) ? instance->elementAt(elementIndex)->length() : 0U;
+    if (srcOffset + length > lengthOfElementSegment)
         return false;
 
-    if (lastDstElementIndex > instance->table(tableIndex)->length())
-        return false;
+    if (!lengthOfElementSegment)
+        return true;
 
     instance->tableInit(dstOffset, srcOffset, length, elementIndex, tableIndex);
     return true;
@@ -739,7 +732,7 @@
     ASSERT(tableIndex < instance->module().moduleInformation().tableCount());
     auto oldSize = instance->table(tableIndex)->length();
     auto newSize = instance->table(tableIndex)->grow(delta);
-    if (!newSize || *newSize == oldSize)
+    if (!newSize)
         return -1;
 
     for (unsigned i = oldSize; i < instance->table(tableIndex)->length(); ++i)

Modified: trunk/Source/_javascript_Core/wasm/WasmOperations.h (271099 => 271100)


--- trunk/Source/_javascript_Core/wasm/WasmOperations.h	2020-12-28 02:47:14 UTC (rev 271099)
+++ trunk/Source/_javascript_Core/wasm/WasmOperations.h	2020-12-28 04:41:00 UTC (rev 271100)
@@ -67,7 +67,7 @@
 JSC_DECLARE_JIT_OPERATION(operationGetWasmTableElement, EncodedJSValue, (Instance*, unsigned, int32_t));
 JSC_DECLARE_JIT_OPERATION(operationSetWasmTableElement, bool, (Instance*, unsigned, uint32_t, EncodedJSValue encValue));
 JSC_DECLARE_JIT_OPERATION(operationWasmRefFunc, EncodedJSValue, (Instance*, uint32_t));
-JSC_DECLARE_JIT_OPERATION(operationWasmTableInit, bool, (Instance*, unsigned elementIndex, unsigned tableIndex, int32_t dstOffset, int32_t srcOffset, int32_t length));
+JSC_DECLARE_JIT_OPERATION(operationWasmTableInit, bool, (Instance*, unsigned elementIndex, unsigned tableIndex, uint32_t dstOffset, uint32_t srcOffset, uint32_t length));
 JSC_DECLARE_JIT_OPERATION(operationWasmElemDrop, void, (Instance*, unsigned elementIndex));
 JSC_DECLARE_JIT_OPERATION(operationWasmTableGrow, int32_t, (Instance*, unsigned, EncodedJSValue fill, uint32_t delta));
 JSC_DECLARE_JIT_OPERATION(operationWasmTableFill, bool, (Instance*, unsigned, uint32_t offset, EncodedJSValue fill, uint32_t count));

Modified: trunk/Source/_javascript_Core/wasm/WasmSlowPaths.cpp (271099 => 271100)


--- trunk/Source/_javascript_Core/wasm/WasmSlowPaths.cpp	2020-12-28 02:47:14 UTC (rev 271099)
+++ trunk/Source/_javascript_Core/wasm/WasmSlowPaths.cpp	2020-12-28 04:41:00 UTC (rev 271100)
@@ -319,9 +319,9 @@
 WASM_SLOW_PATH_DECL(table_init)
 {
     auto instruction = pc->as<WasmTableInit, WasmOpcodeTraits>();
-    int32_t dstOffset = READ(instruction.m_dstOffset).unboxedInt32();
-    int32_t srcOffset = READ(instruction.m_srcOffset).unboxedInt32();
-    int32_t length = READ(instruction.m_length).unboxedInt32();
+    uint32_t dstOffset = READ(instruction.m_dstOffset).unboxedUInt32();
+    uint32_t srcOffset = READ(instruction.m_srcOffset).unboxedUInt32();
+    uint32_t length = READ(instruction.m_length).unboxedUInt32();
     if (!Wasm::operationWasmTableInit(instance, instruction.m_elementIndex, instruction.m_tableIndex, dstOffset, srcOffset, length))
         WASM_THROW(Wasm::ExceptionType::OutOfBoundsTableAccess);
     WASM_END();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to