From b48e4de5ea13434ded315b2bc99a713db0361f63 Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Mon, 7 Nov 2022 12:45:01 -0800 Subject: Implement `array.new_data` and `array.new_elem` (#5214) In order to test them, fix the binary and text parsers to accept passive data segments even if a module has no memory. In addition to parsing and emitting the new instructions, also implement their validation and interpretation. Test the interpretation directly with wasm-shell tests adapted from the upstream spec tests. Running the upstream spec tests directly would require fixing too many bugs in the legacy text parser, so it will have to wait for the new text parser to be ready. --- test/spec/array-new-data.wast | 79 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 test/spec/array-new-data.wast (limited to 'test/spec/array-new-data.wast') diff --git a/test/spec/array-new-data.wast b/test/spec/array-new-data.wast new file mode 100644 index 000000000..8ef62cb87 --- /dev/null +++ b/test/spec/array-new-data.wast @@ -0,0 +1,79 @@ +(module + (type $vec (array i8)) + (type $mvec (array (mut i8))) + + (data "\00\01\02\03\04") + + (func $new (export "new") (result (ref $vec)) + (array.new_data $vec 0 (i32.const 1) (i32.const 3)) + ) + + (func $get (param $i i32) (param $v (ref $vec)) (result i32) + (array.get_u $vec (local.get $v) (local.get $i)) + ) + (func (export "get") (param $i i32) (result i32) + (call $get (local.get $i) (call $new)) + ) + + (func $set_get (param $i i32) (param $v (ref $mvec)) (param $y i32) (result i32) + (array.set $mvec (local.get $v) (local.get $i) (local.get $y)) + (array.get_u $mvec (local.get $v) (local.get $i)) + ) + (func (export "set_get") (param $i i32) (param $y i32) (result i32) + (call $set_get (local.get $i) + (array.new_data $mvec 0 (i32.const 1) (i32.const 3)) + (local.get $y) + ) + ) + + (func $len (param $v (ref array)) (result i32) + (array.len (local.get $v)) + ) + (func (export "len") (result i32) + (call $len (call $new)) + ) +) + +(assert_return (invoke "get" (i32.const 0)) (i32.const 1)) +(assert_return (invoke "set_get" (i32.const 1) (i32.const 7)) (i32.const 7)) +(assert_return (invoke "len") (i32.const 3)) + +(module + (type $vec (array i32)) + (type $mvec (array (mut i8))) + + (data "\00\01\00\00\00\02\00\00\00\03\00\00\00\04\00\00\00") + + (func $new (export "new") (result (ref $vec)) + (array.new_data $vec 0 (i32.const 1) (i32.const 3)) + ) + + (func $get (param $i i32) (param $v (ref $vec)) (result i32) + (array.get $vec (local.get $v) (local.get $i)) + ) + (func (export "get") (param $i i32) (result i32) + (call $get (local.get $i) (call $new)) + ) + + (func $set_get (param $i i32) (param $v (ref $mvec)) (param $y i32) (result i32) + (array.set $mvec (local.get $v) (local.get $i) (local.get $y)) + (array.get $mvec (local.get $v) (local.get $i)) + ) + (func (export "set_get") (param $i i32) (param $y i32) (result i32) + (call $set_get (local.get $i) + (array.new_data $mvec 0 (i32.const 1) (i32.const 3)) + (local.get $y) + ) + ) + + (func $len (param $v (ref array)) (result i32) + (array.len (local.get $v)) + ) + (func (export "len") (result i32) + (call $len (call $new)) + ) +) + +(assert_return (invoke "get" (i32.const 0)) (i32.const 1)) +(assert_return (invoke "set_get" (i32.const 1) (i32.const 7)) (i32.const 7)) +(assert_return (invoke "len") (i32.const 3)) -- cgit v1.2.3