diff options
-rw-r--r-- | scripts/test/shared.py | 6 | ||||
-rw-r--r-- | src/literal.h | 1 | ||||
-rw-r--r-- | src/parser/wast-parser.cpp | 28 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 24 | ||||
-rw-r--r-- | src/wasm/literal.cpp | 18 |
5 files changed, 52 insertions, 25 deletions
diff --git a/scripts/test/shared.py b/scripts/test/shared.py index 019d2b251..4ca065d03 100644 --- a/scripts/test/shared.py +++ b/scripts/test/shared.py @@ -452,16 +452,16 @@ SPEC_TESTSUITE_TESTS_TO_SKIP = [ 'table.wast', # Requires support for table default elements 'type-equivalence.wast', # Recursive types allowed by GC 'unreached-invalid.wast', # Requires more precise unreachable validation - 'array.wast', # Requires ref.array wast constants + 'array.wast', # Requires support for table default elements 'array_init_elem.wast', # Requires support for elem.drop 'br_if.wast', # Requires more precise branch validation 'br_on_cast.wast', # Requires sending values on br_on_cast 'br_on_cast_fail.wast', # Requires sending values on br_on_cast_fail 'extern.wast', # Requires ref.host wast constants - 'i31.wast', # Requires ref.i31 wast constants + 'i31.wast', # Requires support for table default elements 'ref_cast.wast', # Requires host references to not be externalized i31refs 'ref_test.wast', # Requires host references to not be externalized i31refs - 'struct.wast', # Requires ref.struct wast constants + 'struct.wast', # Duplicate field names not properly rejected 'type-rec.wast', # Requires wast `register` support 'type-subtyping.wast', # ShellExternalInterface::callTable does not handle subtyping 'call_indirect.wast', # Bug with 64-bit inline element segment parsing diff --git a/src/literal.h b/src/literal.h index 882a99027..df9a16d9a 100644 --- a/src/literal.h +++ b/src/literal.h @@ -211,7 +211,6 @@ public: } static Literal makeFromMemory(void* p, Type type); - static Literal makeFromMemory(void* p, const Field& field); static Literal makeSignedMin(Type type) { switch (type.getBasic()) { diff --git a/src/parser/wast-parser.cpp b/src/parser/wast-parser.cpp index 00269a577..5eaf352b7 100644 --- a/src/parser/wast-parser.cpp +++ b/src/parser/wast-parser.cpp @@ -217,6 +217,34 @@ Result<ExpectedResult> result(Lexer& in) { return RefResult{HeapType::func}; } + if (in.takeSExprStart("ref.struct")) { + if (!in.takeRParen()) { + return in.err("expected end of ref.struct"); + } + return RefResult{HeapType::struct_}; + } + + if (in.takeSExprStart("ref.array")) { + if (!in.takeRParen()) { + return in.err("expected end of ref.array"); + } + return RefResult{HeapType::array}; + } + + if (in.takeSExprStart("ref.eq")) { + if (!in.takeRParen()) { + return in.err("expected end of ref.eq"); + } + return RefResult{HeapType::eq}; + } + + if (in.takeSExprStart("ref.i31")) { + if (!in.takeRParen()) { + return in.err("expected end of ref.i31"); + } + return RefResult{HeapType::i31}; + } + if (in.takeSExprStart("ref.i31_shared")) { if (!in.takeRParen()) { return in.err("expected end of ref.i31_shared"); diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 81b755f9f..77349fd33 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -2196,7 +2196,7 @@ public: WASM_UNREACHABLE("unimp"); } -private: +protected: // Truncate the value if we need to. The storage is just a list of Literals, // so we can't just write the value like we would to a C struct field and // expect it to truncate for us. Instead, we truncate so the stored value is @@ -2231,6 +2231,24 @@ private: } return value; } + + Literal makeFromMemory(void* p, Field field) { + switch (field.packedType) { + case Field::not_packed: + return Literal::makeFromMemory(p, field.type); + case Field::i8: { + int8_t i; + memcpy(&i, p, sizeof(i)); + return truncateForPacking(Literal(int32_t(i)), field); + } + case Field::i16: { + int16_t i; + memcpy(&i, p, sizeof(i)); + return truncateForPacking(Literal(int32_t(i)), field); + } + } + WASM_UNREACHABLE("unexpected type"); + } }; // Execute a suspected constant expression (precompute and C-API). @@ -3972,7 +3990,7 @@ public: contents.reserve(size); for (Index i = offset; i < end; i += elemBytes) { auto addr = (void*)&seg.data[i]; - contents.push_back(Literal::makeFromMemory(addr, element)); + contents.push_back(this->makeFromMemory(addr, element)); } return self()->makeGCData(contents, curr->type); } @@ -4052,7 +4070,7 @@ public: } for (size_t i = 0; i < sizeVal; i++) { void* addr = (void*)&seg->data[offsetVal + i * elemSize]; - data->values[indexVal + i] = Literal::makeFromMemory(addr, elem); + data->values[indexVal + i] = this->makeFromMemory(addr, elem); } return {}; } diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index 65c2b4e62..6a4614a90 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -294,24 +294,6 @@ Literal Literal::makeFromMemory(void* p, Type type) { } } -Literal Literal::makeFromMemory(void* p, const Field& field) { - switch (field.packedType) { - case Field::not_packed: - return makeFromMemory(p, field.type); - case Field::i8: { - int8_t i; - memcpy(&i, p, sizeof(i)); - return Literal(int32_t(i)); - } - case Field::i16: { - int16_t i; - memcpy(&i, p, sizeof(i)); - return Literal(int32_t(i)); - } - } - WASM_UNREACHABLE("unexpected type"); -} - Literal Literal::standardizeNaN(const Literal& input) { if (!std::isnan(input.getFloat())) { return input; |