From 89d1cf92be0636a219ee6415eead387241963dcf Mon Sep 17 00:00:00 2001 From: Heejin Ahn Date: Thu, 12 Dec 2019 18:36:31 -0800 Subject: Make local.tee's type its local's type (#2511) According to the current spec, `local.tee`'s return type should be the same as its local's type. (Discussions on whether we should change this rule is going on in WebAssembly/reference-types#55, but here I will assume this spec does not change. If this changes, we should change many parts of Binaryen transformation anyway...) But currently in Binaryen `local.tee`'s type is computed from its value's type. This didn't make any difference in the MVP, but after we have subtype relationship in #2451, this can become a problem. For example: ``` (func $test (result funcref) (local $0 anyref) (local.tee $0 (ref.func $test) ) ) ``` This shouldn't validate in the spec, but this will pass Binaryen validation with the current `local.tee` implementation. This makes `local.tee`'s type computed from the local's type, and makes `LocalSet::makeTee` get a type parameter, to which we should pass the its corresponding local's type. We don't embed the local type in the class `LocalSet` because it may increase memory size. This also fixes the type of `local.get` to be the local type where `local.get` and `local.set` pair is created from `local.tee`. --- src/wasm-builder.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/wasm-builder.h') diff --git a/src/wasm-builder.h b/src/wasm-builder.h index 22fa0e642..918e6a4ab 100644 --- a/src/wasm-builder.h +++ b/src/wasm-builder.h @@ -232,14 +232,15 @@ public: auto* ret = allocator.alloc(); ret->index = index; ret->value = value; + ret->makeSet(); ret->finalize(); return ret; } - LocalSet* makeLocalTee(Index index, Expression* value) { + LocalSet* makeLocalTee(Index index, Expression* value, Type type) { auto* ret = allocator.alloc(); ret->index = index; ret->value = value; - ret->setTee(true); + ret->makeTee(type); return ret; } GlobalGet* makeGlobalGet(Name name, Type type) { -- cgit v1.2.3