diff options
-rw-r--r-- | src/wasm-builder.h | 6 | ||||
-rw-r--r-- | test/lit/ctor-eval/shared-i31.wast | 38 |
2 files changed, 42 insertions, 2 deletions
diff --git a/src/wasm-builder.h b/src/wasm-builder.h index 1e768b11c..6663417f8 100644 --- a/src/wasm-builder.h +++ b/src/wasm-builder.h @@ -1217,8 +1217,10 @@ public: if (type.isFunction()) { return makeRefFunc(value.getFunc(), type.getHeapType()); } - if (type.isRef() && type.getHeapType() == HeapType::i31) { - return makeRefI31(makeConst(value.geti31())); + if (type.isRef() && type.getHeapType().isBasic() && + type.getHeapType().getBasic(Unshared) == HeapType::i31) { + return makeRefI31(makeConst(value.geti31()), + type.getHeapType().getShared()); } if (type.isString()) { // The string is already WTF-16, but we need to convert from `Literals` to diff --git a/test/lit/ctor-eval/shared-i31.wast b/test/lit/ctor-eval/shared-i31.wast new file mode 100644 index 000000000..2c1d8da59 --- /dev/null +++ b/test/lit/ctor-eval/shared-i31.wast @@ -0,0 +1,38 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; RUN: wasm-ctor-eval %s --ctors=test --kept-exports=test,other --quiet -all -S -o - | filecheck %s + +;; We should be able to update `global` with a proper shared i31 reference. + +(module + ;; CHECK: (type $0 (func (result (ref null (shared any))))) + + ;; CHECK: (global $global (mut (ref null (shared i31))) (ref.i31_shared + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: )) + (global $global (mut (ref null (shared i31))) (ref.null (shared none))) + + (func $test (export "test") (result (ref null (shared any))) + (global.set $global + (ref.i31_shared + (i32.const 42) + ) + ) + (global.get $global) + ) + + ;; CHECK: (export "test" (func $test_2)) + + ;; CHECK: (export "other" (func $other)) + + ;; CHECK: (func $other (type $0) (result (ref null (shared any))) + ;; CHECK-NEXT: (global.get $global) + ;; CHECK-NEXT: ) + (func $other (export "other") (result (ref null (shared any))) + (global.get $global) + ) +) +;; CHECK: (func $test_2 (type $0) (result (ref null (shared any))) +;; CHECK-NEXT: (ref.i31_shared +;; CHECK-NEXT: (i32.const 42) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) |