[wasm-gc] Cleanup: Rename remaining '_static' op codes
Bug: v8:7748 Change-Id: Ie94e8f7f5afdaea7b4406bf8c57b294bf8f5733c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3865959 Reviewed-by: Jakob Kummerow <jkummerow@chromium.org> Commit-Queue: Matthias Liedtke <mliedtke@chromium.org> Cr-Commit-Position: refs/heads/main@{#82851}
This commit is contained in:
parent
c728b8a5aa
commit
ad52bf8a4e
@ -2035,8 +2035,8 @@ class WasmDecoder : public Decoder {
|
||||
if (io) io->ArrayCopy(dst_imm, src_imm);
|
||||
return length + dst_imm.length + src_imm.length;
|
||||
}
|
||||
case kExprArrayNewDataStatic:
|
||||
case kExprArrayNewElemStatic: {
|
||||
case kExprArrayNewData:
|
||||
case kExprArrayNewElem: {
|
||||
ArrayIndexImmediate<validate> array_imm(decoder, pc + length);
|
||||
IndexImmediate<validate> data_imm(
|
||||
decoder, pc + length + array_imm.length, "segment index");
|
||||
@ -2054,15 +2054,15 @@ class WasmDecoder : public Decoder {
|
||||
if (io) io->BranchDepth(imm);
|
||||
return length + imm.length;
|
||||
}
|
||||
case kExprRefTestStatic:
|
||||
case kExprRefCastStatic:
|
||||
case kExprRefCastNopStatic: {
|
||||
case kExprRefTest:
|
||||
case kExprRefCast:
|
||||
case kExprRefCastNop: {
|
||||
IndexImmediate<validate> imm(decoder, pc + length, "type index");
|
||||
if (io) io->TypeIndex(imm);
|
||||
return length + imm.length;
|
||||
}
|
||||
case kExprBrOnCastStatic:
|
||||
case kExprBrOnCastStaticFail: {
|
||||
case kExprBrOnCast:
|
||||
case kExprBrOnCastFail: {
|
||||
BranchDepthImmediate<validate> branch(decoder, pc + length);
|
||||
IndexImmediate<validate> index(decoder, pc + length + branch.length,
|
||||
"type index");
|
||||
@ -2280,17 +2280,17 @@ class WasmDecoder : public Decoder {
|
||||
case kExprArrayNewDefault:
|
||||
case kExprArrayLenDeprecated:
|
||||
case kExprArrayLen:
|
||||
case kExprRefTestStatic:
|
||||
case kExprRefCastStatic:
|
||||
case kExprRefCastNopStatic:
|
||||
case kExprBrOnCastStatic:
|
||||
case kExprBrOnCastStaticFail:
|
||||
case kExprRefTest:
|
||||
case kExprRefCast:
|
||||
case kExprRefCastNop:
|
||||
case kExprBrOnCast:
|
||||
case kExprBrOnCastFail:
|
||||
return {1, 1};
|
||||
case kExprStructSet:
|
||||
return {2, 0};
|
||||
case kExprArrayNew:
|
||||
case kExprArrayNewDataStatic:
|
||||
case kExprArrayNewElemStatic:
|
||||
case kExprArrayNewData:
|
||||
case kExprArrayNewElem:
|
||||
case kExprArrayGet:
|
||||
case kExprArrayGetS:
|
||||
case kExprArrayGetU:
|
||||
@ -4437,7 +4437,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
|
||||
Push(value);
|
||||
return opcode_length + imm.length;
|
||||
}
|
||||
case kExprArrayNewDataStatic: {
|
||||
case kExprArrayNewData: {
|
||||
ArrayIndexImmediate<validate> array_imm(this,
|
||||
this->pc_ + opcode_length);
|
||||
if (!this->Validate(this->pc_ + opcode_length, array_imm)) return 0;
|
||||
@ -4479,7 +4479,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
|
||||
Push(array);
|
||||
return opcode_length + array_imm.length + data_segment.length;
|
||||
}
|
||||
case kExprArrayNewElemStatic: {
|
||||
case kExprArrayNewElem: {
|
||||
ArrayIndexImmediate<validate> array_imm(this,
|
||||
this->pc_ + opcode_length);
|
||||
if (!this->Validate(this->pc_ + opcode_length, array_imm)) return 0;
|
||||
@ -4696,7 +4696,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
|
||||
Push(value);
|
||||
return opcode_length;
|
||||
}
|
||||
case kExprRefTestStatic: {
|
||||
case kExprRefTest: {
|
||||
NON_CONST_ONLY
|
||||
IndexImmediate<validate> imm(this, this->pc_ + opcode_length,
|
||||
"type index");
|
||||
@ -4740,7 +4740,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
|
||||
Push(value);
|
||||
return opcode_length;
|
||||
}
|
||||
case kExprRefCastNopStatic: {
|
||||
case kExprRefCastNop: {
|
||||
// Temporary non-standard instruction, for performance experiments.
|
||||
if (!VALIDATE(this->enabled_.has_ref_cast_nop())) {
|
||||
this->DecodeError(
|
||||
@ -4767,7 +4767,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
|
||||
Push(value);
|
||||
return opcode_length;
|
||||
}
|
||||
case kExprRefCastStatic: {
|
||||
case kExprRefCast: {
|
||||
NON_CONST_ONLY
|
||||
IndexImmediate<validate> imm(this, this->pc_ + opcode_length,
|
||||
"type index");
|
||||
@ -4817,7 +4817,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
|
||||
Push(value);
|
||||
return opcode_length;
|
||||
}
|
||||
case kExprBrOnCastStatic: {
|
||||
case kExprBrOnCast: {
|
||||
NON_CONST_ONLY
|
||||
BranchDepthImmediate<validate> branch_depth(this,
|
||||
this->pc_ + opcode_length);
|
||||
@ -4886,7 +4886,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
|
||||
Push(obj); // Restore stack state on fallthrough.
|
||||
return pc_offset;
|
||||
}
|
||||
case kExprBrOnCastStaticFail: {
|
||||
case kExprBrOnCastFail: {
|
||||
NON_CONST_ONLY
|
||||
BranchDepthImmediate<validate> branch_depth(this,
|
||||
this->pc_ + opcode_length);
|
||||
|
@ -702,16 +702,16 @@ bool V8_EXPORT_PRIVATE IsJSCompatibleSignature(const FunctionSig* sig,
|
||||
V(ArrayNewFixed, 0xfb1a, _, "array.new_fixed") \
|
||||
V(ArrayNew, 0xfb1b, _, "array.new") \
|
||||
V(ArrayNewDefault, 0xfb1c, _, "array.new_default") \
|
||||
V(ArrayNewDataStatic, 0xfb1d, _, "array.new_data_static") \
|
||||
V(ArrayNewElemStatic, 0xfb1f, _, "array.new_elem_static") \
|
||||
V(ArrayNewData, 0xfb1d, _, "array.new_data") \
|
||||
V(ArrayNewElem, 0xfb1f, _, "array.new_elem") \
|
||||
V(I31New, 0xfb20, _, "i31.new") \
|
||||
V(I31GetS, 0xfb21, _, "i31.get_s") \
|
||||
V(I31GetU, 0xfb22, _, "i31.get_u") \
|
||||
V(RefTestStatic, 0xfb44, _, "ref.test_static") \
|
||||
V(RefCastStatic, 0xfb45, _, "ref.cast_static") \
|
||||
V(BrOnCastStatic, 0xfb46, _, "br_on_cast_static") \
|
||||
V(BrOnCastStaticFail, 0xfb47, _, "br_on_cast_static_fail") \
|
||||
V(RefCastNopStatic, 0xfb48, _, "ref.cast_nop_static") \
|
||||
V(RefTest, 0xfb44, _, "ref.test") \
|
||||
V(RefCast, 0xfb45, _, "ref.cast") \
|
||||
V(BrOnCast, 0xfb46, _, "br_on_cast") \
|
||||
V(BrOnCastFail, 0xfb47, _, "br_on_cast_fail") \
|
||||
V(RefCastNop, 0xfb48, _, "ref.cast_nop") \
|
||||
V(RefIsData, 0xfb51, _, "ref.is_data") \
|
||||
V(RefIsI31, 0xfb52, _, "ref.is_i31") \
|
||||
V(RefIsArray, 0xfb53, _, "ref.is_array") \
|
||||
|
@ -469,7 +469,7 @@ WASM_COMPILED_EXEC_TEST(WasmBrOnNonNull) {
|
||||
tester.CheckResult(kNotTaken, 11);
|
||||
}
|
||||
|
||||
WASM_COMPILED_EXEC_TEST(RefCastStatic) {
|
||||
WASM_COMPILED_EXEC_TEST(RefCast) {
|
||||
WasmGCTester tester(execution_tier);
|
||||
|
||||
const byte supertype_index = tester.DefineStruct({F(kWasmI32, true)});
|
||||
@ -503,7 +503,7 @@ WASM_COMPILED_EXEC_TEST(RefCastStatic) {
|
||||
{WASM_LOCAL_SET(
|
||||
0, WASM_STRUCT_NEW(subtype1_index, WASM_I32V(10), WASM_F32(20))),
|
||||
WASM_STRUCT_GET(subtype1_index, 0,
|
||||
WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), subtype1_index)),
|
||||
WASM_REF_CAST(WASM_LOCAL_GET(0), subtype1_index)),
|
||||
WASM_END});
|
||||
|
||||
const byte kTestFailed = tester.DefineFunction(
|
||||
@ -511,26 +511,26 @@ WASM_COMPILED_EXEC_TEST(RefCastStatic) {
|
||||
{WASM_LOCAL_SET(
|
||||
0, WASM_STRUCT_NEW(subtype1_index, WASM_I32V(10), WASM_F32(20))),
|
||||
WASM_STRUCT_GET(subtype2_index, 0,
|
||||
WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), subtype2_index)),
|
||||
WASM_REF_CAST(WASM_LOCAL_GET(0), subtype2_index)),
|
||||
WASM_END});
|
||||
|
||||
const byte kFuncTestSuccessfulSuper = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {ValueType::RefNull(function_type_index)},
|
||||
{WASM_LOCAL_SET(0, WASM_REF_FUNC(function_index)),
|
||||
WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), function_type_index), WASM_DROP,
|
||||
WASM_REF_CAST(WASM_LOCAL_GET(0), function_type_index), WASM_DROP,
|
||||
WASM_I32V(0), WASM_END});
|
||||
|
||||
const byte kFuncTestSuccessfulSub = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {ValueType::RefNull(function_type_index)},
|
||||
{WASM_LOCAL_SET(0, WASM_REF_FUNC(function_index)),
|
||||
WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), function_subtype1_index),
|
||||
WASM_DROP, WASM_I32V(0), WASM_END});
|
||||
WASM_REF_CAST(WASM_LOCAL_GET(0), function_subtype1_index), WASM_DROP,
|
||||
WASM_I32V(0), WASM_END});
|
||||
|
||||
const byte kFuncTestFailed = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {ValueType::RefNull(function_type_index)},
|
||||
{WASM_LOCAL_SET(0, WASM_REF_FUNC(function_index)),
|
||||
WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), function_subtype2_index),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
WASM_REF_CAST(WASM_LOCAL_GET(0), function_subtype2_index), WASM_DROP,
|
||||
WASM_I32V(1), WASM_END});
|
||||
|
||||
tester.CompileModule();
|
||||
tester.CheckResult(kTestSuccessful, 10);
|
||||
@ -540,7 +540,7 @@ WASM_COMPILED_EXEC_TEST(RefCastStatic) {
|
||||
tester.CheckHasThrown(kFuncTestFailed);
|
||||
}
|
||||
|
||||
WASM_COMPILED_EXEC_TEST(RefCastStaticNoChecks) {
|
||||
WASM_COMPILED_EXEC_TEST(RefCastNoChecks) {
|
||||
FlagScope<bool> scope(&v8_flags.experimental_wasm_assume_ref_cast_succeeds,
|
||||
true);
|
||||
WasmGCTester tester(execution_tier);
|
||||
@ -555,14 +555,14 @@ WASM_COMPILED_EXEC_TEST(RefCastStaticNoChecks) {
|
||||
tester.sigs.i_v(), {ValueType::RefNull(supertype_index)},
|
||||
{WASM_LOCAL_SET(0, WASM_STRUCT_NEW_DEFAULT(subtype1_index)),
|
||||
WASM_STRUCT_GET(subtype1_index, 0,
|
||||
WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), subtype1_index)),
|
||||
WASM_REF_CAST(WASM_LOCAL_GET(0), subtype1_index)),
|
||||
WASM_END});
|
||||
|
||||
const byte kTestFailed = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {ValueType::RefNull(supertype_index)},
|
||||
{WASM_LOCAL_SET(0, WASM_STRUCT_NEW_DEFAULT(subtype1_index)),
|
||||
WASM_STRUCT_GET(subtype2_index, 0,
|
||||
WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), subtype2_index)),
|
||||
WASM_REF_CAST(WASM_LOCAL_GET(0), subtype2_index)),
|
||||
WASM_END});
|
||||
|
||||
tester.CompileModule();
|
||||
@ -584,14 +584,13 @@ WASM_COMPILED_EXEC_TEST(BrOnCast) {
|
||||
WASM_LOCAL_SET(1, WASM_STRUCT_NEW(other_type_index, WASM_F32(1.0))),
|
||||
WASM_LOCAL_GET(1),
|
||||
// The type check fails, so this branch isn't taken.
|
||||
WASM_BR_ON_CAST_STATIC(0, type_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST(0, type_index), WASM_DROP,
|
||||
|
||||
WASM_LOCAL_SET(0, WASM_I32V(221)), // (Final result) - 1
|
||||
WASM_LOCAL_SET(1, WASM_STRUCT_NEW(type_index, WASM_I32V(1))),
|
||||
WASM_LOCAL_GET(1),
|
||||
// This branch is taken.
|
||||
WASM_BR_ON_CAST_STATIC(0, type_index),
|
||||
WASM_GC_OP(kExprRefCastStatic), type_index,
|
||||
WASM_BR_ON_CAST(0, type_index), WASM_GC_OP(kExprRefCast), type_index,
|
||||
|
||||
// Not executed due to the branch.
|
||||
WASM_LOCAL_SET(0, WASM_I32V(333))),
|
||||
@ -600,14 +599,13 @@ WASM_COMPILED_EXEC_TEST(BrOnCast) {
|
||||
|
||||
const byte kTestNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {kWasmI32, kWasmDataRef},
|
||||
{WASM_BLOCK_R(ValueType::RefNull(type_index),
|
||||
WASM_LOCAL_SET(0, WASM_I32V(111)),
|
||||
WASM_LOCAL_GET(1), // Put a nullref onto the value stack.
|
||||
// Not taken for nullref.
|
||||
WASM_BR_ON_CAST_STATIC(0, type_index),
|
||||
WASM_GC_OP(kExprRefCastStatic), type_index,
|
||||
{WASM_BLOCK_R(
|
||||
ValueType::RefNull(type_index), WASM_LOCAL_SET(0, WASM_I32V(111)),
|
||||
WASM_LOCAL_GET(1), // Put a nullref onto the value stack.
|
||||
// Not taken for nullref.
|
||||
WASM_BR_ON_CAST(0, type_index), WASM_GC_OP(kExprRefCast), type_index,
|
||||
|
||||
WASM_LOCAL_SET(0, WASM_I32V(222))), // Final result.
|
||||
WASM_LOCAL_SET(0, WASM_I32V(222))), // Final result.
|
||||
WASM_DROP, WASM_LOCAL_GET(0), kExprEnd});
|
||||
|
||||
const byte kTypedAfterBranch = tester.DefineFunction(
|
||||
@ -617,7 +615,7 @@ WASM_COMPILED_EXEC_TEST(BrOnCast) {
|
||||
// The inner block should take the early branch with a struct
|
||||
// on the stack.
|
||||
WASM_BLOCK_R(ValueType::Ref(type_index), WASM_LOCAL_GET(1),
|
||||
WASM_BR_ON_CAST_STATIC(0, type_index),
|
||||
WASM_BR_ON_CAST(0, type_index),
|
||||
// Returning 123 is the unreachable failure case.
|
||||
WASM_I32V(123), WASM_BR(1)),
|
||||
// The outer block catches the struct left behind by the inner block
|
||||
@ -653,9 +651,9 @@ WASM_COMPILED_EXEC_TEST(BrOnCastFail) {
|
||||
WASM_LOCAL_SET(0, WASM_SEQ(value)), \
|
||||
WASM_BLOCK( \
|
||||
WASM_BLOCK_R(kWasmDataRef, WASM_LOCAL_GET(0), \
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, type0), \
|
||||
WASM_BR_ON_CAST_FAIL(0, type0), \
|
||||
WASM_GC_OP(kExprStructGet), type0, 0, kExprReturn), \
|
||||
kExprBrOnNull, 0, WASM_GC_OP(kExprRefCastStatic), type1, \
|
||||
kExprBrOnNull, 0, WASM_GC_OP(kExprRefCast), type1, \
|
||||
WASM_GC_OP(kExprStructGet), type1, 1, kExprReturn), \
|
||||
WASM_I32V(null_value), kExprEnd
|
||||
|
||||
@ -683,9 +681,9 @@ WASM_COMPILED_EXEC_TEST(BrOnCastFail) {
|
||||
0, WASM_STRUCT_NEW(type1, WASM_I64V(10), WASM_I32V(field1_value))),
|
||||
WASM_BLOCK(
|
||||
WASM_BLOCK_R(kWasmDataRef, WASM_LOCAL_GET(0),
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, type0),
|
||||
WASM_BR_ON_CAST_FAIL(0, type0),
|
||||
WASM_GC_OP(kExprStructGet), type0, 0, kExprReturn),
|
||||
kExprBrOnNull, 0, WASM_GC_OP(kExprRefCastStatic), type1,
|
||||
kExprBrOnNull, 0, WASM_GC_OP(kExprRefCast), type1,
|
||||
WASM_GC_OP(kExprStructGet), type1, 1, kExprReturn),
|
||||
WASM_I32V(null_value), kExprEnd});
|
||||
|
||||
@ -1194,79 +1192,75 @@ WASM_COMPILED_EXEC_TEST(RefTrivialCastsStatic) {
|
||||
|
||||
const byte kRefTestNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_REF_TEST_STATIC(WASM_REF_NULL(type_index), subtype_index),
|
||||
kExprEnd});
|
||||
{WASM_REF_TEST(WASM_REF_NULL(type_index), subtype_index), kExprEnd});
|
||||
// Upcasts should be optimized away for nominal types.
|
||||
const byte kRefTestUpcast = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_REF_TEST_STATIC(WASM_STRUCT_NEW_DEFAULT(subtype_index), type_index),
|
||||
{WASM_REF_TEST(WASM_STRUCT_NEW_DEFAULT(subtype_index), type_index),
|
||||
kExprEnd});
|
||||
const byte kRefTestUpcastNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_REF_TEST_STATIC(WASM_REF_NULL(subtype_index), type_index),
|
||||
kExprEnd});
|
||||
{WASM_REF_TEST(WASM_REF_NULL(subtype_index), type_index), kExprEnd});
|
||||
const byte kRefTestUnrelatedNullable = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {refNull(subtype_index)},
|
||||
{WASM_LOCAL_SET(0, WASM_STRUCT_NEW_DEFAULT(subtype_index)),
|
||||
WASM_REF_TEST_STATIC(WASM_LOCAL_GET(0), sig_index), kExprEnd});
|
||||
WASM_REF_TEST(WASM_LOCAL_GET(0), sig_index), kExprEnd});
|
||||
const byte kRefTestUnrelatedNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_REF_TEST_STATIC(WASM_REF_NULL(subtype_index), sig_index),
|
||||
kExprEnd});
|
||||
{WASM_REF_TEST(WASM_REF_NULL(subtype_index), sig_index), kExprEnd});
|
||||
const byte kRefTestUnrelatedNonNullable = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_REF_TEST_STATIC(WASM_STRUCT_NEW_DEFAULT(type_index), sig_index),
|
||||
{WASM_REF_TEST(WASM_STRUCT_NEW_DEFAULT(type_index), sig_index),
|
||||
kExprEnd});
|
||||
|
||||
const byte kRefCastNull =
|
||||
tester.DefineFunction(tester.sigs.i_v(), {},
|
||||
{WASM_REF_IS_NULL(WASM_REF_CAST_STATIC(
|
||||
{WASM_REF_IS_NULL(WASM_REF_CAST(
|
||||
WASM_REF_NULL(type_index), subtype_index)),
|
||||
kExprEnd});
|
||||
const byte kRefCastUpcast = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_REF_IS_NULL(WASM_REF_CAST_STATIC(
|
||||
WASM_STRUCT_NEW_DEFAULT(subtype_index), type_index)),
|
||||
{WASM_REF_IS_NULL(
|
||||
WASM_REF_CAST(WASM_STRUCT_NEW_DEFAULT(subtype_index), type_index)),
|
||||
kExprEnd});
|
||||
const byte kRefCastUpcastNull =
|
||||
tester.DefineFunction(tester.sigs.i_v(), {},
|
||||
{WASM_REF_IS_NULL(WASM_REF_CAST_STATIC(
|
||||
{WASM_REF_IS_NULL(WASM_REF_CAST(
|
||||
WASM_REF_NULL(subtype_index), type_index)),
|
||||
kExprEnd});
|
||||
const byte kRefCastUnrelatedNullable = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {refNull(subtype_index)},
|
||||
{WASM_LOCAL_SET(0, WASM_STRUCT_NEW_DEFAULT(subtype_index)),
|
||||
WASM_REF_IS_NULL(WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), sig_index)),
|
||||
WASM_REF_IS_NULL(WASM_REF_CAST(WASM_LOCAL_GET(0), sig_index)),
|
||||
kExprEnd});
|
||||
const byte kRefCastUnrelatedNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_REF_IS_NULL(WASM_REF_CAST(WASM_REF_NULL(subtype_index), sig_index)),
|
||||
kExprEnd});
|
||||
const byte kRefCastUnrelatedNull =
|
||||
tester.DefineFunction(tester.sigs.i_v(), {},
|
||||
{WASM_REF_IS_NULL(WASM_REF_CAST_STATIC(
|
||||
WASM_REF_NULL(subtype_index), sig_index)),
|
||||
kExprEnd});
|
||||
const byte kRefCastUnrelatedNonNullable = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_REF_IS_NULL(WASM_REF_CAST_STATIC(
|
||||
WASM_STRUCT_NEW_DEFAULT(type_index), sig_index)),
|
||||
{WASM_REF_IS_NULL(
|
||||
WASM_REF_CAST(WASM_STRUCT_NEW_DEFAULT(type_index), sig_index)),
|
||||
kExprEnd});
|
||||
|
||||
const byte kBrOnCastNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_BLOCK_R(refNull(subtype_index), WASM_REF_NULL(type_index),
|
||||
WASM_BR_ON_CAST_STATIC(0, subtype_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST(0, subtype_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
const byte kBrOnCastUpcast = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_BLOCK_R(refNull(type_index), WASM_STRUCT_NEW_DEFAULT(subtype_index),
|
||||
WASM_BR_ON_CAST_STATIC(0, type_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST(0, type_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
const byte kBrOnCastUpcastNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_BLOCK_R(refNull(type_index), WASM_REF_NULL(subtype_index),
|
||||
WASM_BR_ON_CAST_STATIC(0, type_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST(0, type_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
@ -1274,28 +1268,28 @@ WASM_COMPILED_EXEC_TEST(RefTrivialCastsStatic) {
|
||||
tester.sigs.i_v(), {refNull(subtype_index)},
|
||||
{WASM_LOCAL_SET(0, WASM_STRUCT_NEW_DEFAULT(subtype_index)),
|
||||
WASM_BLOCK_R(refNull(sig_index), WASM_LOCAL_GET(0),
|
||||
WASM_BR_ON_CAST_STATIC(0, sig_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST(0, sig_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
const byte kBrOnCastUnrelatedNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_BLOCK_R(refNull(sig_index), WASM_REF_NULL(subtype_index),
|
||||
WASM_BR_ON_CAST_STATIC(0, sig_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST(0, sig_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
const byte kBrOnCastUnrelatedNonNullable = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_BLOCK_R(refNull(sig_index), WASM_STRUCT_NEW_DEFAULT(subtype_index),
|
||||
WASM_BR_ON_CAST_STATIC(0, sig_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST(0, sig_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
const byte kBrOnCastFailNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_BLOCK_R(refNull(type_index), WASM_REF_NULL(type_index),
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, subtype_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST_FAIL(0, subtype_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
@ -1303,14 +1297,14 @@ WASM_COMPILED_EXEC_TEST(RefTrivialCastsStatic) {
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_BLOCK_R(refNull(subtype_index),
|
||||
WASM_STRUCT_NEW_DEFAULT(subtype_index),
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, type_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST_FAIL(0, type_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
const byte kBrOnCastFailUpcastNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_BLOCK_R(refNull(subtype_index), WASM_REF_NULL(subtype_index),
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, type_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST_FAIL(0, type_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
@ -1318,14 +1312,14 @@ WASM_COMPILED_EXEC_TEST(RefTrivialCastsStatic) {
|
||||
tester.sigs.i_v(), {refNull(subtype_index)},
|
||||
{WASM_LOCAL_SET(0, WASM_STRUCT_NEW_DEFAULT(subtype_index)),
|
||||
WASM_BLOCK_R(refNull(subtype_index), WASM_LOCAL_GET(0),
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, sig_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST_FAIL(0, sig_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
const byte kBrOnCastFailUnrelatedNull = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_BLOCK_R(refNull(subtype_index), WASM_REF_NULL(subtype_index),
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, sig_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST_FAIL(0, sig_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
@ -1333,7 +1327,7 @@ WASM_COMPILED_EXEC_TEST(RefTrivialCastsStatic) {
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_BLOCK_R(refNull(subtype_index),
|
||||
WASM_STRUCT_NEW_DEFAULT(subtype_index),
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, sig_index), WASM_DROP,
|
||||
WASM_BR_ON_CAST_FAIL(0, sig_index), WASM_DROP,
|
||||
WASM_RETURN(WASM_I32V(0))),
|
||||
WASM_DROP, WASM_I32V(1), WASM_END});
|
||||
|
||||
@ -1486,7 +1480,7 @@ WASM_COMPILED_EXEC_TEST(FunctionRefs) {
|
||||
const byte cast = tester.DefineFunction(
|
||||
&sig_func, {kWasmFuncRef},
|
||||
{WASM_LOCAL_SET(0, WASM_REF_FUNC(func_index)),
|
||||
WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), sig_index), kExprEnd});
|
||||
WASM_REF_CAST(WASM_LOCAL_GET(0), sig_index), kExprEnd});
|
||||
|
||||
const byte cast_reference = tester.DefineFunction(
|
||||
&sig_func, {}, {WASM_REF_FUNC(sig_index), kExprEnd});
|
||||
@ -1494,12 +1488,12 @@ WASM_COMPILED_EXEC_TEST(FunctionRefs) {
|
||||
const byte test = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {kWasmFuncRef},
|
||||
{WASM_LOCAL_SET(0, WASM_REF_FUNC(func_index)),
|
||||
WASM_REF_TEST_STATIC(WASM_LOCAL_GET(0), sig_index), kExprEnd});
|
||||
WASM_REF_TEST(WASM_LOCAL_GET(0), sig_index), kExprEnd});
|
||||
|
||||
const byte test_fail = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {kWasmFuncRef},
|
||||
{WASM_LOCAL_SET(0, WASM_REF_FUNC(func_index)),
|
||||
WASM_REF_TEST_STATIC(WASM_LOCAL_GET(0), other_sig_index), kExprEnd});
|
||||
WASM_REF_TEST(WASM_LOCAL_GET(0), other_sig_index), kExprEnd});
|
||||
|
||||
tester.CompileModule();
|
||||
|
||||
@ -1604,11 +1598,10 @@ WASM_COMPILED_EXEC_TEST(CastNullRef) {
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_REF_IS_NULL(WASM_REF_AS_I31(WASM_REF_NULL(kNoneCode))), kExprEnd});
|
||||
byte struct_idx = tester.DefineStruct({F(wasm::kWasmI32, true)});
|
||||
byte to_struct =
|
||||
tester.DefineFunction(tester.sigs.i_v(), {},
|
||||
{WASM_REF_IS_NULL(WASM_REF_CAST_STATIC(
|
||||
WASM_REF_NULL(kNoneCode), struct_idx)),
|
||||
kExprEnd});
|
||||
byte to_struct = tester.DefineFunction(
|
||||
tester.sigs.i_v(), {},
|
||||
{WASM_REF_IS_NULL(WASM_REF_CAST(WASM_REF_NULL(kNoneCode), struct_idx)),
|
||||
kExprEnd});
|
||||
tester.CompileModule();
|
||||
// Generic casts trap on null.
|
||||
tester.CheckHasThrown(to_non_null);
|
||||
@ -1878,7 +1871,7 @@ WASM_COMPILED_EXEC_TEST(CastsBenchmark) {
|
||||
WASM_LOCAL_GET(sum),
|
||||
WASM_STRUCT_GET(
|
||||
SuperType, 0,
|
||||
WASM_REF_CAST_STATIC(
|
||||
WASM_REF_CAST(
|
||||
WASM_ARRAY_GET(
|
||||
ListType, WASM_LOCAL_GET(list),
|
||||
WASM_I32_AND(WASM_LOCAL_GET(i),
|
||||
@ -2025,7 +2018,7 @@ WASM_COMPILED_EXEC_TEST(JsAccess) {
|
||||
tester.DefineExportedFunction(
|
||||
"consumer", &sig_i_super,
|
||||
{WASM_STRUCT_GET(type_index, 0,
|
||||
WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), type_index)),
|
||||
WASM_REF_CAST(WASM_LOCAL_GET(0), type_index)),
|
||||
kExprEnd});
|
||||
|
||||
tester.CompileModule();
|
||||
|
@ -521,17 +521,17 @@ inline uint16_t ExtractPrefixedOpcodeBytes(WasmOpcode opcode) {
|
||||
#define WASM_REF_IS_NULL(val) val, kExprRefIsNull
|
||||
#define WASM_REF_AS_NON_NULL(val) val, kExprRefAsNonNull
|
||||
#define WASM_REF_EQ(lhs, rhs) lhs, rhs, kExprRefEq
|
||||
#define WASM_REF_TEST_STATIC(ref, typeidx) \
|
||||
ref, WASM_GC_OP(kExprRefTestStatic), static_cast<byte>(typeidx)
|
||||
#define WASM_REF_CAST_STATIC(ref, typeidx) \
|
||||
ref, WASM_GC_OP(kExprRefCastStatic), static_cast<byte>(typeidx)
|
||||
#define WASM_REF_TEST(ref, typeidx) \
|
||||
ref, WASM_GC_OP(kExprRefTest), static_cast<byte>(typeidx)
|
||||
#define WASM_REF_CAST(ref, typeidx) \
|
||||
ref, WASM_GC_OP(kExprRefCast), static_cast<byte>(typeidx)
|
||||
// Takes a reference value from the value stack to allow sequences of
|
||||
// conditional branches.
|
||||
#define WASM_BR_ON_CAST_STATIC(depth, typeidx) \
|
||||
WASM_GC_OP(kExprBrOnCastStatic), static_cast<byte>(depth), \
|
||||
#define WASM_BR_ON_CAST(depth, typeidx) \
|
||||
WASM_GC_OP(kExprBrOnCast), static_cast<byte>(depth), \
|
||||
static_cast<byte>(typeidx)
|
||||
#define WASM_BR_ON_CAST_STATIC_FAIL(depth, typeidx) \
|
||||
WASM_GC_OP(kExprBrOnCastStaticFail), static_cast<byte>(depth), \
|
||||
#define WASM_BR_ON_CAST_FAIL(depth, typeidx) \
|
||||
WASM_GC_OP(kExprBrOnCastFail), static_cast<byte>(depth), \
|
||||
static_cast<byte>(typeidx)
|
||||
|
||||
#define WASM_GC_INTERNALIZE(extern) extern, WASM_GC_OP(kExprExternInternalize)
|
||||
|
@ -23,12 +23,12 @@ builder.addFunction('main', sig_index)
|
||||
.addBody([
|
||||
// Cast to sub1 and write field 0.
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefCastStatic, sub1,
|
||||
kGCPrefix, kExprRefCast, sub1,
|
||||
kExprI32Const, 42,
|
||||
kGCPrefix, kExprStructSet, sub1, 0,
|
||||
// Cast to sub2 and read field 0.
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefCastStatic, sub2,
|
||||
kGCPrefix, kExprRefCast, sub2,
|
||||
kGCPrefix, kExprStructGet, sub2, 0])
|
||||
.exportFunc();
|
||||
|
||||
|
@ -15,15 +15,15 @@ let sig = makeSig([wasmRefNullType(supertype)], [kWasmI32]);
|
||||
|
||||
let callee = builder.addFunction("callee", sig).addBody([
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefTestStatic, sub1,
|
||||
kGCPrefix, kExprRefTest, sub1,
|
||||
kExprIf, kWasmVoid,
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefCastStatic, sub1,
|
||||
kGCPrefix, kExprRefCast, sub1,
|
||||
kGCPrefix, kExprStructGet, sub1, 0,
|
||||
kExprReturn,
|
||||
kExprElse,
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefCastStatic, sub2,
|
||||
kGCPrefix, kExprRefCast, sub2,
|
||||
// This {ref.as_non_null} initially believes that it operates on a
|
||||
// (ref null sub2), and when getting inlined into {crash} realizes
|
||||
// that its actual type is {bottom} because this branch is unreachable.
|
||||
|
@ -19,8 +19,8 @@ let sig = makeSig([wasmRefNullType(supertype)], [kWasmI32]);
|
||||
let callee1 = builder.addFunction('callee1', sig).addBody([
|
||||
kExprBlock, kWasmRef, subtype,
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprBrOnCastStatic, 0, subtype,
|
||||
kGCPrefix, kExprRefCastStatic, unused_type,
|
||||
kGCPrefix, kExprBrOnCast, 0, subtype,
|
||||
kGCPrefix, kExprRefCast, unused_type,
|
||||
kGCPrefix, kExprStructGet, unused_type, 0,
|
||||
kExprReturn,
|
||||
kExprEnd,
|
||||
@ -30,7 +30,7 @@ let callee1 = builder.addFunction('callee1', sig).addBody([
|
||||
let callee2 = builder.addFunction('callee2', sig).addBody([
|
||||
kExprBlock, kWasmRef, subtype,
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprBrOnCastStatic, 0, subtype,
|
||||
kGCPrefix, kExprBrOnCast, 0, subtype,
|
||||
kExprUnreachable,
|
||||
kExprReturn,
|
||||
kExprEnd,
|
||||
@ -44,7 +44,7 @@ let callee3 = builder.addFunction('callee3', sig).addBody([
|
||||
kExprUnreachable,
|
||||
kExprReturn,
|
||||
kExprEnd,
|
||||
kGCPrefix, kExprRefCastStatic, subtype,
|
||||
kGCPrefix, kExprRefCast, subtype,
|
||||
kGCPrefix, kExprStructGet, subtype, 1
|
||||
]);
|
||||
|
||||
|
@ -24,7 +24,7 @@ let crash = builder.addFunction("crash", kSig_v_i).exportFunc()
|
||||
kExprDrop,
|
||||
kExprElse,
|
||||
kExprLocalGet, 1,
|
||||
kGCPrefix, kExprRefCastStatic, sub2,
|
||||
kGCPrefix, kExprRefCast, sub2,
|
||||
kGCPrefix, kExprStructGet, sub2, 0,
|
||||
kExprDrop,
|
||||
kExprEnd]);
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function TestArrayNewElemStatic() {
|
||||
(function TestArrayNewElem() {
|
||||
print(arguments.callee.name);
|
||||
let builder = new WasmModuleBuilder();
|
||||
let struct_type_index = builder.addStruct([makeField(kWasmI32, false)]);
|
||||
@ -36,7 +36,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
.addBody([
|
||||
kExprI32Const, 0, // offset
|
||||
kExprLocalGet, 0, // length
|
||||
kGCPrefix, kExprArrayNewElemStatic, array_type_index,
|
||||
kGCPrefix, kExprArrayNewElem, array_type_index,
|
||||
segment,
|
||||
kExprLocalGet, 1, // index in the array
|
||||
kGCPrefix, kExprArrayGet, array_type_index,
|
||||
@ -78,7 +78,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
assertTraps(kTrapElementSegmentOutOfBounds, () => init_and_get_active(1, 0));
|
||||
})();
|
||||
|
||||
(function TestArrayNewElemStaticConstant() {
|
||||
(function TestArrayNewElemConstant() {
|
||||
print(arguments.callee.name);
|
||||
let builder = new WasmModuleBuilder();
|
||||
let struct_type_index = builder.addStruct([makeField(kWasmI32, false)]);
|
||||
@ -107,10 +107,10 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
let array_segment = builder.addPassiveElementSegment(
|
||||
[[...wasmI32Const(0), ...wasmI32Const(3),
|
||||
kGCPrefix, kExprArrayNewElemStatic,
|
||||
kGCPrefix, kExprArrayNewElem,
|
||||
array_type_index, passive_segment],
|
||||
[...wasmI32Const(0), ...wasmI32Const(0),
|
||||
kGCPrefix, kExprArrayNewElemStatic,
|
||||
kGCPrefix, kExprArrayNewElem,
|
||||
array_type_index, active_segment]],
|
||||
array_type);
|
||||
|
||||
@ -124,7 +124,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
kExprLocalGet, 0, // offset in table
|
||||
kExprTableGet, table,
|
||||
kGCPrefix, kExprRefAsData,
|
||||
kGCPrefix, kExprRefCastStatic, array_type_index,
|
||||
kGCPrefix, kExprRefCast, array_type_index,
|
||||
kExprLocalGet, 1, // index in the array
|
||||
kGCPrefix, kExprArrayGet, array_type_index,
|
||||
kGCPrefix, kExprStructGet, struct_type_index, 0])
|
||||
@ -159,7 +159,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
assertTraps(kTrapArrayOutOfBounds, () => table_get(0, 3));
|
||||
})();
|
||||
|
||||
(function TestArrayNewElemStaticMistypedSegment() {
|
||||
(function TestArrayNewElemMistypedSegment() {
|
||||
print(arguments.callee.name);
|
||||
let builder = new WasmModuleBuilder();
|
||||
let struct_type_index = builder.addStruct([makeField(kWasmI32, false)]);
|
||||
@ -174,7 +174,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
.addBody([
|
||||
kExprI32Const, 0, // offset
|
||||
kExprLocalGet, 0, // length
|
||||
kGCPrefix, kExprArrayNewElemStatic, array_type_index,
|
||||
kGCPrefix, kExprArrayNewElem, array_type_index,
|
||||
passive_segment,
|
||||
kExprLocalGet, 1, // index in the array
|
||||
kGCPrefix, kExprArrayGet, array_type_index,
|
||||
@ -201,14 +201,14 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
builder.addGlobal(
|
||||
wasmRefNullType(array_type_index), false,
|
||||
[...wasmI32Const(0), ...wasmI32Const(1),
|
||||
kGCPrefix, kExprArrayNewElemStatic,
|
||||
kGCPrefix, kExprArrayNewElem,
|
||||
array_type_index, passive_segment]);
|
||||
|
||||
assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
|
||||
/invalid element segment index/);
|
||||
})();
|
||||
|
||||
(function TestArrayNewElemStaticConstantArrayTooLarge() {
|
||||
(function TestArrayNewElemConstantArrayTooLarge() {
|
||||
print(arguments.callee.name);
|
||||
let builder = new WasmModuleBuilder();
|
||||
let struct_type_index = builder.addStruct([makeField(kWasmI32, false)]);
|
||||
@ -233,7 +233,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
let array_segment = builder.addPassiveElementSegment(
|
||||
[[...wasmI32Const(0), ...wasmI32Const(1 << 30),
|
||||
kGCPrefix, kExprArrayNewElemStatic,
|
||||
kGCPrefix, kExprArrayNewElem,
|
||||
array_type_index, passive_segment]],
|
||||
array_type
|
||||
);
|
||||
@ -247,7 +247,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
assertTraps(kTrapArrayTooLarge, () => instance.exports.init());
|
||||
})();
|
||||
|
||||
(function TestArrayNewElemStaticConstantElementSegmentOutOfBounds() {
|
||||
(function TestArrayNewElemConstantElementSegmentOutOfBounds() {
|
||||
print(arguments.callee.name);
|
||||
let builder = new WasmModuleBuilder();
|
||||
let struct_type_index = builder.addStruct([makeField(kWasmI32, false)]);
|
||||
@ -272,7 +272,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
let array_segment = builder.addPassiveElementSegment(
|
||||
[[...wasmI32Const(0), ...wasmI32Const(10),
|
||||
kGCPrefix, kExprArrayNewElemStatic,
|
||||
kGCPrefix, kExprArrayNewElem,
|
||||
array_type_index, passive_segment]],
|
||||
array_type
|
||||
);
|
||||
@ -286,7 +286,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
assertTraps(kTrapElementSegmentOutOfBounds, () => instance.exports.init());
|
||||
})();
|
||||
|
||||
(function TestArrayNewElemStaticConstantActiveSegment() {
|
||||
(function TestArrayNewElemConstantActiveSegment() {
|
||||
print(arguments.callee.name);
|
||||
let builder = new WasmModuleBuilder();
|
||||
let struct_type_index = builder.addStruct([makeField(kWasmI32, false)]);
|
||||
@ -312,7 +312,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
let array_segment = builder.addPassiveElementSegment(
|
||||
[[...wasmI32Const(0), ...wasmI32Const(3),
|
||||
kGCPrefix, kExprArrayNewElemStatic,
|
||||
kGCPrefix, kExprArrayNewElem,
|
||||
array_type_index, active_segment]],
|
||||
array_type
|
||||
);
|
||||
|
@ -21,7 +21,7 @@ builder.addFunction('getHelloArray', makeSig([], [kWasmArrayRef]))
|
||||
builder.addFunction('getChar', makeSig([kWasmArrayRef, kWasmI32], [kWasmI32]))
|
||||
.addBody([
|
||||
kExprLocalGet, 0, kGCPrefix, kExprRefAsData, kGCPrefix,
|
||||
kExprRefCastStatic, i16Array, kExprLocalGet, 1, kGCPrefix, kExprArrayGetS,
|
||||
kExprRefCast, i16Array, kExprLocalGet, 1, kGCPrefix, kExprArrayGetS,
|
||||
i16Array
|
||||
])
|
||||
.exportFunc();
|
||||
|
@ -17,7 +17,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
kGCPrefix, kExprStructNew, struct,
|
||||
kExprLocalSet, 1,
|
||||
kExprLocalGet, 1,
|
||||
kGCPrefix, kExprRefCastNopStatic, struct,
|
||||
kGCPrefix, kExprRefCastNop, struct,
|
||||
kGCPrefix, kExprStructGet, struct, 0,
|
||||
]).exportFunc();
|
||||
|
||||
|
@ -45,7 +45,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
/subtyping depth is greater than allowed/);
|
||||
})();
|
||||
|
||||
(function TestArrayNewDataStatic() {
|
||||
(function TestArrayNewData() {
|
||||
print(arguments.callee.name);
|
||||
let builder = new WasmModuleBuilder();
|
||||
builder.setEarlyDataCountSection();
|
||||
@ -62,7 +62,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
let global = builder.addGlobal(
|
||||
wasmRefType(array_type_index), true,
|
||||
[...wasmI32Const(1), ...wasmI32Const(2),
|
||||
kGCPrefix, kExprArrayNewDataStatic, array_type_index, data_segment],
|
||||
kGCPrefix, kExprArrayNewData, array_type_index, data_segment],
|
||||
builder);
|
||||
|
||||
builder.addFunction("global_get", kSig_i_i)
|
||||
@ -76,7 +76,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
builder.addFunction("init_from_data", kSig_i_iii)
|
||||
.addBody([
|
||||
kExprLocalGet, 0, kExprLocalGet, 1,
|
||||
kGCPrefix, kExprArrayNewDataStatic,
|
||||
kGCPrefix, kExprArrayNewData,
|
||||
array_type_index, data_segment,
|
||||
kExprLocalGet, 2,
|
||||
kGCPrefix, kExprArrayGetS, array_type_index])
|
||||
|
@ -409,29 +409,29 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
.addLocals(kWasmI32, 1)
|
||||
.addBody([
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefTestStatic, sub_struct,
|
||||
kGCPrefix, kExprRefTest, sub_struct,
|
||||
|
||||
// These casts have to be preserved.
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefCastStatic, mid_struct,
|
||||
kGCPrefix, kExprRefCastStatic, sub_struct,
|
||||
kGCPrefix, kExprRefCast, mid_struct,
|
||||
kGCPrefix, kExprRefCast, sub_struct,
|
||||
kGCPrefix, kExprStructGet, sub_struct, 1,
|
||||
...addToLocal,
|
||||
|
||||
kExprIf, kWasmVoid,
|
||||
// Both these casts should be optimized away.
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefCastStatic, mid_struct,
|
||||
kGCPrefix, kExprRefCastStatic, sub_struct,
|
||||
kGCPrefix, kExprRefCast, mid_struct,
|
||||
kGCPrefix, kExprRefCast, sub_struct,
|
||||
kGCPrefix, kExprStructGet, sub_struct, 1,
|
||||
...addToLocal,
|
||||
|
||||
kExprBlock, kWasmRefNull, super_struct,
|
||||
kExprLocalGet, 0,
|
||||
// This should also get optimized away.
|
||||
kGCPrefix, kExprBrOnCastStaticFail, 0, mid_struct,
|
||||
kGCPrefix, kExprBrOnCastFail, 0, mid_struct,
|
||||
// So should this, despite being represented by a TypeGuard alias.
|
||||
kGCPrefix, kExprRefCastStatic, sub_struct,
|
||||
kGCPrefix, kExprRefCast, sub_struct,
|
||||
kGCPrefix, kExprStructGet, sub_struct, 1,
|
||||
...addToLocal,
|
||||
kExprLocalGet, 0, // Due to the branch result type.
|
||||
@ -440,13 +440,13 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
kExprElse,
|
||||
// This (always trapping) cast should be preserved.
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefCastStatic, sub_struct,
|
||||
kGCPrefix, kExprRefCast, sub_struct,
|
||||
kGCPrefix, kExprStructGet, sub_struct, 1,
|
||||
...addToLocal,
|
||||
kExprEnd,
|
||||
// This cast should be preserved.
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefCastStatic, sub_struct,
|
||||
kGCPrefix, kExprRefCast, sub_struct,
|
||||
kGCPrefix, kExprStructGet, sub_struct, 1,
|
||||
kExprLocalGet, 1, kExprI32Add
|
||||
])
|
||||
@ -468,8 +468,8 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
.addBody([
|
||||
// Cast from struct_a to struct_b via common base type struct_super.
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefCastStatic, struct_super,
|
||||
kGCPrefix, kExprRefCastStatic, struct_b, // annotated as 'ref null none'
|
||||
kGCPrefix, kExprRefCast, struct_super,
|
||||
kGCPrefix, kExprRefCast, struct_b, // annotated as 'ref null none'
|
||||
kExprRefIsNull,
|
||||
]);
|
||||
|
||||
@ -514,7 +514,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
// local.get 0 is known to be null until end of block.
|
||||
kExprLocalGet, 0,
|
||||
// This cast is a no-op and shold be optimized away.
|
||||
kGCPrefix, kExprRefCastStatic, struct_b,
|
||||
kGCPrefix, kExprRefCast, struct_b,
|
||||
kExprEnd,
|
||||
kExprRefIsNull,
|
||||
]);
|
||||
|
@ -120,14 +120,14 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
builder.addFunction("main", makeSig([wasmRefType(kWasmFuncRef)], [kWasmI32]))
|
||||
.addBody([
|
||||
// Type check the function
|
||||
kExprLocalGet, 0, kGCPrefix, kExprRefCastStatic, sig,
|
||||
kExprLocalGet, 0, kGCPrefix, kExprRefCast, sig,
|
||||
kExprDrop,
|
||||
// Introduce unknown effect
|
||||
kExprCallFunction, effect,
|
||||
// TF should be able to eliminate the second type check, and return the
|
||||
// constant 1.
|
||||
kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefTestStatic, sig])
|
||||
kGCPrefix, kExprRefTest, sig])
|
||||
.exportFunc();
|
||||
|
||||
var instance = builder.instantiate({m : { f: function () {} }});
|
||||
|
@ -75,7 +75,7 @@ for (let [typeName, type] of Object.entries(tableTypes)) {
|
||||
.addBody([
|
||||
kExprLocalGet, 0, kExprTableGet, 0,
|
||||
kGCPrefix, kExprRefAsData,
|
||||
kGCPrefix, kExprRefCastStatic, struct,
|
||||
kGCPrefix, kExprRefCast, struct,
|
||||
kGCPrefix, kExprStructGet, struct, 0,
|
||||
])
|
||||
.exportFunc();
|
||||
@ -83,7 +83,7 @@ for (let [typeName, type] of Object.entries(tableTypes)) {
|
||||
.addBody([
|
||||
kExprLocalGet, 0, kExprTableGet, 0,
|
||||
kGCPrefix, kExprRefAsData,
|
||||
kGCPrefix, kExprRefCastStatic, array,
|
||||
kGCPrefix, kExprRefCast, array,
|
||||
kExprI32Const, 0,
|
||||
kGCPrefix, kExprArrayGet, array,
|
||||
])
|
||||
|
@ -166,7 +166,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
.addBody([
|
||||
kExprI32Const, 0, kExprTableGet, 0,
|
||||
kGCPrefix, kExprRefAsArray,
|
||||
kGCPrefix, kExprRefCastStatic, array_type,
|
||||
kGCPrefix, kExprRefCast, array_type,
|
||||
kExprLocalSet, 0,
|
||||
kExprLocalGet, 0,
|
||||
...wasmI32Const(0), kGCPrefix, kExprArrayGet, array_type,
|
||||
@ -186,7 +186,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
builder.addFunction("struct_getter", kSig_i_v)
|
||||
.addBody([
|
||||
kExprI32Const, 2, kExprTableGet, 0,
|
||||
kGCPrefix, kExprRefAsData, kGCPrefix, kExprRefCastStatic, struct_type,
|
||||
kGCPrefix, kExprRefAsData, kGCPrefix, kExprRefCast, struct_type,
|
||||
kGCPrefix, kExprStructGet, struct_type, 0])
|
||||
.exportFunc();
|
||||
|
||||
@ -230,7 +230,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
.addBody([
|
||||
kExprI32Const, 0, kExprTableGet, 0,
|
||||
kGCPrefix, kExprRefAsArray,
|
||||
kGCPrefix, kExprRefCastStatic, array_type,
|
||||
kGCPrefix, kExprRefCast, array_type,
|
||||
kExprLocalSet, 0,
|
||||
kExprLocalGet, 0,
|
||||
...wasmI32Const(0), kGCPrefix, kExprArrayGet, array_type,
|
||||
@ -250,7 +250,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
builder.addFunction("struct_getter", kSig_i_i)
|
||||
.addBody([
|
||||
kExprLocalGet, 0, kExprTableGet, 0,
|
||||
kGCPrefix, kExprRefAsData, kGCPrefix, kExprRefCastStatic, struct_type,
|
||||
kGCPrefix, kExprRefAsData, kGCPrefix, kExprRefCast, struct_type,
|
||||
kGCPrefix, kExprStructGet, struct_type, 0])
|
||||
.exportFunc();
|
||||
|
||||
|
@ -20,12 +20,12 @@ let struct_init = builder.addFunction("struct_init",
|
||||
let test_pass = builder.addFunction("test_pass",
|
||||
makeSig([kWasmDataRef], [kWasmI32]))
|
||||
.addBody([kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefTestStatic, identical_struct_index])
|
||||
kGCPrefix, kExprRefTest, identical_struct_index])
|
||||
.exportFunc();
|
||||
let test_fail = builder.addFunction("test_fail",
|
||||
makeSig([kWasmDataRef], [kWasmI32]))
|
||||
.addBody([kExprLocalGet, 0,
|
||||
kGCPrefix, kExprRefTestStatic, distinct_struct_index])
|
||||
kGCPrefix, kExprRefTest, distinct_struct_index])
|
||||
.exportFunc();
|
||||
|
||||
(function TestCanonicalizationSameInstance() {
|
||||
|
@ -111,7 +111,7 @@ function makeWtf8TestDataSegment() {
|
||||
.addBody([
|
||||
...wasmI32Const(0),
|
||||
...wasmI32Const(data.data.length),
|
||||
kGCPrefix, kExprArrayNewDataStatic, i8_array, data_index
|
||||
kGCPrefix, kExprArrayNewData, i8_array, data_index
|
||||
]).index;
|
||||
|
||||
for (let [policy, name] of [[kWtf8PolicyAccept, "new_wtf8"],
|
||||
@ -131,7 +131,7 @@ function makeWtf8TestDataSegment() {
|
||||
.addBody([
|
||||
...wasmI32Const(0),
|
||||
...wasmI32Const("ascii".length),
|
||||
kGCPrefix, kExprArrayNewDataStatic, i8_array, ascii_data_index,
|
||||
kGCPrefix, kExprArrayNewData, i8_array, ascii_data_index,
|
||||
kExprLocalGet, 0, kExprLocalGet, 1,
|
||||
...GCInstr(kExprStringNewWtf8Array), kWtf8PolicyAccept
|
||||
]);
|
||||
@ -220,7 +220,7 @@ function makeWtf16TestDataSegment() {
|
||||
.addBody([
|
||||
...wasmI32Const(0),
|
||||
...wasmI32Const(data.data.length / 2),
|
||||
kGCPrefix, kExprArrayNewDataStatic, i16_array, data_index
|
||||
kGCPrefix, kExprArrayNewData, i16_array, data_index
|
||||
]).index;
|
||||
|
||||
builder.addFunction("new_wtf16", kSig_w_ii)
|
||||
@ -236,7 +236,7 @@ function makeWtf16TestDataSegment() {
|
||||
.addBody([
|
||||
...wasmI32Const(0),
|
||||
...wasmI32Const("ascii".length),
|
||||
kGCPrefix, kExprArrayNewDataStatic, i16_array, ascii_data_index,
|
||||
kGCPrefix, kExprArrayNewData, i16_array, ascii_data_index,
|
||||
kExprLocalGet, 0, kExprLocalGet, 1,
|
||||
...GCInstr(kExprStringNewWtf16Array)
|
||||
]);
|
||||
|
@ -33,12 +33,12 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
// while (true) {
|
||||
kExprLoop, kWasmVoid,
|
||||
// if (ref.test temp bottom1) {
|
||||
kExprLocalGet, 2, kGCPrefix, kExprRefTestStatic, bottom1,
|
||||
kExprLocalGet, 2, kGCPrefix, kExprRefTest, bottom1,
|
||||
kExprIf, kWasmVoid,
|
||||
// counter += ((bottom1) temp).field_2;
|
||||
// TODO(manoskouk): Implement path-based type tracking so we can
|
||||
// eliminate this check.
|
||||
kExprLocalGet, 2, kGCPrefix, kExprRefCastStatic, bottom1,
|
||||
kExprLocalGet, 2, kGCPrefix, kExprRefCast, bottom1,
|
||||
kGCPrefix, kExprStructGet, bottom1, 2,
|
||||
kExprLocalGet, 3, kExprI32Add, kExprLocalSet, 3,
|
||||
// temp = x1;
|
||||
@ -48,7 +48,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
// counter += (i32) ((middle) temp).field_1
|
||||
// Note: This cast should get optimized away, as temp only gets
|
||||
// assigned to {bottom1} and {bottom2}.
|
||||
kExprLocalGet, 2, kGCPrefix, kExprRefCastStatic, middle,
|
||||
kExprLocalGet, 2, kGCPrefix, kExprRefCast, middle,
|
||||
kGCPrefix, kExprStructGet, middle, 1, kExprI32ConvertI64,
|
||||
kExprLocalGet, 3, kExprI32Add, kExprLocalSet, 3,
|
||||
// temp = x0;
|
||||
|
@ -27,19 +27,19 @@ function createArray_i() {
|
||||
|
||||
builder.addFunction("array_get", sig_i_ai)
|
||||
.addBody([
|
||||
kExprLocalGet, 0, // --
|
||||
kGCPrefix, kExprRefCastStatic, type_index, // --
|
||||
kExprLocalGet, 1, // --
|
||||
kGCPrefix, kExprArrayGet, type_index]) // --
|
||||
kExprLocalGet, 0, // --
|
||||
kGCPrefix, kExprRefCast, type_index, // --
|
||||
kExprLocalGet, 1, // --
|
||||
kGCPrefix, kExprArrayGet, type_index]) // --
|
||||
.exportAs("array_get");
|
||||
|
||||
builder.addFunction("array_set", sig_v_aii)
|
||||
.addBody([
|
||||
kExprLocalGet, 0, // --
|
||||
kGCPrefix, kExprRefCastStatic, type_index, // --
|
||||
kExprLocalGet, 1, // --
|
||||
kExprLocalGet, 2, // --
|
||||
kGCPrefix, kExprArraySet, type_index]) // --
|
||||
kExprLocalGet, 0, // --
|
||||
kGCPrefix, kExprRefCast, type_index, // --
|
||||
kExprLocalGet, 1, // --
|
||||
kExprLocalGet, 2, // --
|
||||
kGCPrefix, kExprArraySet, type_index]) // --
|
||||
.exportAs("array_set");
|
||||
|
||||
let instance = builder.instantiate();
|
||||
|
@ -44,7 +44,7 @@ let instance = (() => {
|
||||
kExprLocalGet, 0,
|
||||
kExprBrOnNull, 0,
|
||||
kGCPrefix, kExprRefAsData,
|
||||
kGCPrefix, kExprRefCastStatic, struct,
|
||||
kGCPrefix, kExprRefCast, struct,
|
||||
kGCPrefix, kExprStructGet, struct, 0, // value
|
||||
kExprI32Const, 0, // isNull
|
||||
kExprReturn,
|
||||
@ -65,7 +65,7 @@ let instance = (() => {
|
||||
kGCPrefix, kExprExternInternalize,
|
||||
kExprBrOnNull, 0,
|
||||
kGCPrefix, kExprRefAsData,
|
||||
kGCPrefix, kExprRefCastStatic, struct,
|
||||
kGCPrefix, kExprRefCast, struct,
|
||||
kGCPrefix, kExprStructGet, struct, 0, // value
|
||||
kExprI32Const, 0, // isNull
|
||||
kExprReturn,
|
||||
@ -156,7 +156,7 @@ let instance = (() => {
|
||||
kExprLocalGet, 0,
|
||||
kExprBrOnNull, 0,
|
||||
kGCPrefix, kExprRefAsArray,
|
||||
kGCPrefix, kExprRefCastStatic, array,
|
||||
kGCPrefix, kExprRefCast, array,
|
||||
kExprI32Const, 0,
|
||||
kGCPrefix, kExprArrayGet, array, // value
|
||||
kExprI32Const, 0, // isNull
|
||||
@ -178,7 +178,7 @@ let instance = (() => {
|
||||
kGCPrefix, kExprExternInternalize,
|
||||
kExprBrOnNull, 0,
|
||||
kGCPrefix, kExprRefAsArray,
|
||||
kGCPrefix, kExprRefCastStatic, array,
|
||||
kGCPrefix, kExprRefCast, array,
|
||||
kExprI32Const, 0,
|
||||
kGCPrefix, kExprArrayGet, array, // value
|
||||
kExprI32Const, 0, // isNull
|
||||
|
@ -502,16 +502,16 @@ let kExprArrayLen = 0x19;
|
||||
let kExprArrayNewFixed = 0x1a;
|
||||
let kExprArrayNew = 0x1b;
|
||||
let kExprArrayNewDefault = 0x1c;
|
||||
let kExprArrayNewDataStatic = 0x1d;
|
||||
let kExprArrayNewElemStatic = 0x1f;
|
||||
let kExprArrayNewData = 0x1d;
|
||||
let kExprArrayNewElem = 0x1f;
|
||||
let kExprI31New = 0x20;
|
||||
let kExprI31GetS = 0x21;
|
||||
let kExprI31GetU = 0x22;
|
||||
let kExprRefTestStatic = 0x44;
|
||||
let kExprRefCastStatic = 0x45;
|
||||
let kExprBrOnCastStatic = 0x46;
|
||||
let kExprBrOnCastStaticFail = 0x47;
|
||||
let kExprRefCastNopStatic = 0x48;
|
||||
let kExprRefTest = 0x44;
|
||||
let kExprRefCast = 0x45;
|
||||
let kExprBrOnCast = 0x46;
|
||||
let kExprBrOnCastFail = 0x47;
|
||||
let kExprRefCastNop = 0x48;
|
||||
let kExprRefIsData = 0x51;
|
||||
let kExprRefIsI31 = 0x52;
|
||||
let kExprRefIsArray = 0x53;
|
||||
|
@ -1153,12 +1153,12 @@ TEST_F(FunctionBodyDecoderTest, UnreachableRefTypes) {
|
||||
{WASM_UNREACHABLE, WASM_GC_OP(kExprArrayNewDefault),
|
||||
array_index, kExprDrop});
|
||||
|
||||
ExpectValidates(sigs.i_v(), {WASM_UNREACHABLE, WASM_GC_OP(kExprRefTestStatic),
|
||||
struct_index});
|
||||
ExpectValidates(sigs.i_v(),
|
||||
{WASM_UNREACHABLE, WASM_GC_OP(kExprRefTest), struct_index});
|
||||
|
||||
ExpectValidates(sigs.v_v(), {WASM_UNREACHABLE, WASM_GC_OP(kExprRefCastStatic),
|
||||
ExpectValidates(sigs.v_v(), {WASM_UNREACHABLE, WASM_GC_OP(kExprRefCast),
|
||||
struct_index, kExprDrop});
|
||||
ExpectValidates(sigs.v_v(), {WASM_UNREACHABLE, WASM_GC_OP(kExprRefCastStatic),
|
||||
ExpectValidates(sigs.v_v(), {WASM_UNREACHABLE, WASM_GC_OP(kExprRefCast),
|
||||
struct_index, kExprDrop});
|
||||
|
||||
ExpectValidates(sigs.v_v(), {WASM_UNREACHABLE, kExprBrOnNull, 0, WASM_DROP});
|
||||
@ -1166,9 +1166,8 @@ TEST_F(FunctionBodyDecoderTest, UnreachableRefTypes) {
|
||||
ExpectValidates(&sig_v_s, {WASM_UNREACHABLE, WASM_LOCAL_GET(0), kExprBrOnNull,
|
||||
0, kExprCallFunction, struct_consumer});
|
||||
|
||||
ExpectValidates(
|
||||
FunctionSig::Build(zone(), {struct_type}, {}),
|
||||
{WASM_UNREACHABLE, WASM_GC_OP(kExprRefCastStatic), struct_index});
|
||||
ExpectValidates(FunctionSig::Build(zone(), {struct_type}, {}),
|
||||
{WASM_UNREACHABLE, WASM_GC_OP(kExprRefCast), struct_index});
|
||||
|
||||
ExpectValidates(FunctionSig::Build(zone(), {kWasmDataRef}, {}),
|
||||
{WASM_UNREACHABLE, WASM_GC_OP(kExprRefAsData)});
|
||||
@ -4333,38 +4332,34 @@ TEST_F(FunctionBodyDecoderTest, RefTestCast) {
|
||||
FunctionSig cast_sig(1, 1, cast_reps);
|
||||
|
||||
if (should_pass) {
|
||||
ExpectValidates(
|
||||
&test_sig,
|
||||
{WASM_REF_TEST_STATIC(WASM_LOCAL_GET(0), WASM_HEAP_TYPE(to_heap))});
|
||||
ExpectValidates(
|
||||
&cast_sig,
|
||||
{WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), WASM_HEAP_TYPE(to_heap))});
|
||||
ExpectValidates(&test_sig, {WASM_REF_TEST(WASM_LOCAL_GET(0),
|
||||
WASM_HEAP_TYPE(to_heap))});
|
||||
ExpectValidates(&cast_sig, {WASM_REF_CAST(WASM_LOCAL_GET(0),
|
||||
WASM_HEAP_TYPE(to_heap))});
|
||||
} else {
|
||||
std::string error_message =
|
||||
"[0] expected subtype of (ref null func) or (ref null data), found "
|
||||
"local.get of type " +
|
||||
test_reps[1].name();
|
||||
ExpectFailure(
|
||||
&test_sig,
|
||||
{WASM_REF_TEST_STATIC(WASM_LOCAL_GET(0), WASM_HEAP_TYPE(to_heap))},
|
||||
kAppendEnd, ("ref.test_static" + error_message).c_str());
|
||||
ExpectFailure(
|
||||
&cast_sig,
|
||||
{WASM_REF_CAST_STATIC(WASM_LOCAL_GET(0), WASM_HEAP_TYPE(to_heap))},
|
||||
kAppendEnd, ("ref.cast_static" + error_message).c_str());
|
||||
ExpectFailure(&test_sig,
|
||||
{WASM_REF_TEST(WASM_LOCAL_GET(0), WASM_HEAP_TYPE(to_heap))},
|
||||
kAppendEnd, ("ref.test" + error_message).c_str());
|
||||
ExpectFailure(&cast_sig,
|
||||
{WASM_REF_CAST(WASM_LOCAL_GET(0), WASM_HEAP_TYPE(to_heap))},
|
||||
kAppendEnd, ("ref.cast" + error_message).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
// Trivial type error.
|
||||
ExpectFailure(sigs.v_v(),
|
||||
{WASM_REF_TEST_STATIC(WASM_I32V(1), array_heap), kExprDrop},
|
||||
{WASM_REF_TEST(WASM_I32V(1), array_heap), kExprDrop},
|
||||
kAppendEnd,
|
||||
"ref.test_static[0] expected subtype of (ref null func) or "
|
||||
"ref.test[0] expected subtype of (ref null func) or "
|
||||
"(ref null data), found i32.const of type i32");
|
||||
ExpectFailure(sigs.v_v(),
|
||||
{WASM_REF_CAST_STATIC(WASM_I32V(1), array_heap), kExprDrop},
|
||||
{WASM_REF_CAST(WASM_I32V(1), array_heap), kExprDrop},
|
||||
kAppendEnd,
|
||||
"ref.cast_static[0] expected subtype of (ref null func) or "
|
||||
"ref.cast[0] expected subtype of (ref null func) or "
|
||||
"(ref null data), found i32.const of type i32");
|
||||
}
|
||||
|
||||
@ -4382,48 +4377,44 @@ TEST_F(FunctionBodyDecoderTest, BrOnCastOrCastFail) {
|
||||
|
||||
ExpectValidates(
|
||||
FunctionSig::Build(this->zone(), {kWasmI32, subtype}, {supertype}),
|
||||
{WASM_I32V(42), WASM_LOCAL_GET(0), WASM_BR_ON_CAST_STATIC(0, sub_struct),
|
||||
WASM_GC_OP(kExprRefCastStatic), sub_struct});
|
||||
{WASM_I32V(42), WASM_LOCAL_GET(0), WASM_BR_ON_CAST(0, sub_struct),
|
||||
WASM_GC_OP(kExprRefCast), sub_struct});
|
||||
ExpectValidates(
|
||||
FunctionSig::Build(this->zone(), {kWasmI32, supertype}, {supertype}),
|
||||
{WASM_I32V(42), WASM_LOCAL_GET(0),
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, sub_struct)});
|
||||
{WASM_I32V(42), WASM_LOCAL_GET(0), WASM_BR_ON_CAST_FAIL(0, sub_struct)});
|
||||
|
||||
// Wrong branch type.
|
||||
ExpectFailure(FunctionSig::Build(this->zone(), {}, {supertype}),
|
||||
{WASM_LOCAL_GET(0), WASM_BR_ON_CAST_STATIC(0, sub_struct),
|
||||
WASM_UNREACHABLE},
|
||||
kAppendEnd,
|
||||
"br_on_cast must target a branch of arity at least 1");
|
||||
ExpectFailure(
|
||||
FunctionSig::Build(this->zone(), {}, {supertype}),
|
||||
{WASM_LOCAL_GET(0), WASM_BR_ON_CAST(0, sub_struct), WASM_UNREACHABLE},
|
||||
kAppendEnd, "br_on_cast must target a branch of arity at least 1");
|
||||
ExpectFailure(
|
||||
FunctionSig::Build(this->zone(), {subtype}, {supertype}),
|
||||
{WASM_I32V(42), WASM_LOCAL_GET(0),
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, sub_struct)},
|
||||
{WASM_I32V(42), WASM_LOCAL_GET(0), WASM_BR_ON_CAST_FAIL(0, sub_struct)},
|
||||
kAppendEnd,
|
||||
"type error in branch[0] (expected (ref null 1), got (ref null 0))");
|
||||
|
||||
// Wrong fallthrough type.
|
||||
ExpectFailure(
|
||||
FunctionSig::Build(this->zone(), {subtype}, {supertype}),
|
||||
{WASM_LOCAL_GET(0), WASM_BR_ON_CAST_STATIC(0, sub_struct)}, kAppendEnd,
|
||||
{WASM_LOCAL_GET(0), WASM_BR_ON_CAST(0, sub_struct)}, kAppendEnd,
|
||||
"type error in fallthru[0] (expected (ref null 1), got (ref null 0))");
|
||||
ExpectFailure(FunctionSig::Build(this->zone(), {supertype}, {supertype}),
|
||||
{WASM_BLOCK_I(WASM_LOCAL_GET(0),
|
||||
WASM_BR_ON_CAST_STATIC_FAIL(0, sub_struct))},
|
||||
kAppendEnd,
|
||||
"type error in branch[0] (expected i32, got (ref null 0))");
|
||||
ExpectFailure(
|
||||
FunctionSig::Build(this->zone(), {supertype}, {supertype}),
|
||||
{WASM_BLOCK_I(WASM_LOCAL_GET(0), WASM_BR_ON_CAST_FAIL(0, sub_struct))},
|
||||
kAppendEnd, "type error in branch[0] (expected i32, got (ref null 0))");
|
||||
|
||||
// Argument type error.
|
||||
ExpectFailure(FunctionSig::Build(this->zone(), {subtype}, {kWasmExternRef}),
|
||||
{WASM_LOCAL_GET(0), WASM_BR_ON_CAST_STATIC(0, sub_struct),
|
||||
WASM_GC_OP(kExprRefCastStatic), sub_struct},
|
||||
{WASM_LOCAL_GET(0), WASM_BR_ON_CAST(0, sub_struct),
|
||||
WASM_GC_OP(kExprRefCast), sub_struct},
|
||||
kAppendEnd,
|
||||
"br_on_cast_static[0] expected subtype of (ref null func) or "
|
||||
"br_on_cast[0] expected subtype of (ref null func) or "
|
||||
"(ref null data), found local.get of type externref");
|
||||
ExpectFailure(FunctionSig::Build(this->zone(), {supertype}, {kWasmExternRef}),
|
||||
{WASM_LOCAL_GET(0), WASM_BR_ON_CAST_STATIC_FAIL(0, sub_struct)},
|
||||
{WASM_LOCAL_GET(0), WASM_BR_ON_CAST_FAIL(0, sub_struct)},
|
||||
kAppendEnd,
|
||||
"br_on_cast_static_fail[0] expected subtype of (ref null func) "
|
||||
"br_on_cast_fail[0] expected subtype of (ref null func) "
|
||||
"or (ref null data), found local.get of type externref");
|
||||
}
|
||||
|
||||
@ -4865,9 +4856,9 @@ TEST_F(WasmOpcodeLengthTest, IllegalRefIndices) {
|
||||
}
|
||||
|
||||
TEST_F(WasmOpcodeLengthTest, GCOpcodes) {
|
||||
// br_on_cast_static{,_fail}: prefix + opcode + br_depth + type_index
|
||||
ExpectLength(4, 0xfb, kExprBrOnCastStatic & 0xFF);
|
||||
ExpectLength(4, 0xfb, kExprBrOnCastStaticFail & 0xFF);
|
||||
// br_on_cast{,_fail}: prefix + opcode + br_depth + type_index
|
||||
ExpectLength(4, 0xfb, kExprBrOnCast & 0xFF);
|
||||
ExpectLength(4, 0xfb, kExprBrOnCastFail & 0xFF);
|
||||
|
||||
// struct.new, with leb immediate operand.
|
||||
ExpectLength(3, 0xfb, 0x07, 0x42);
|
||||
|
Loading…
Reference in New Issue
Block a user