From 7e8b6549a7ef3688b889c662fe17d55f724a2036 Mon Sep 17 00:00:00 2001 From: dcode Date: Mon, 13 Sep 2021 15:29:05 +0200 Subject: [PATCH 1/4] Defuse select assertion on compile error --- src/module.ts | 2 +- tests/compiler/closure.json | 2 ++ tests/compiler/closure.ts | 12 +++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/module.ts b/src/module.ts index 1ee657b283..6d8072f181 100644 --- a/src/module.ts +++ b/src/module.ts @@ -1479,7 +1479,7 @@ export class Module { ): ExpressionRef { if (type == TypeRef.Auto) { type = binaryen._BinaryenExpressionGetType(ifTrue); - assert(type == binaryen._BinaryenExpressionGetType(ifFalse)); + assert(type == binaryen._BinaryenExpressionGetType(ifFalse) || type == TypeRef.Unreachable); } return binaryen._BinaryenSelect(this.ref, condition, ifTrue, ifFalse, type); } diff --git a/tests/compiler/closure.json b/tests/compiler/closure.json index 75907cebe4..a76a90b276 100644 --- a/tests/compiler/closure.json +++ b/tests/compiler/closure.json @@ -8,6 +8,8 @@ "$local0; // closure 2", "AS100: Not implemented: Closures", "$local0; // closure 3", + "AS100: Not implemented: Closures", + "max($local0, $arg0); // closure 4", "EOF" ] } diff --git a/tests/compiler/closure.ts b/tests/compiler/closure.ts index c542f3b1a7..dd3e847b80 100644 --- a/tests/compiler/closure.ts +++ b/tests/compiler/closure.ts @@ -15,10 +15,20 @@ testVar(); function testLet(): (value: i32) => i32 { let $local0 = 0; - return function inner(value: i32) { + return function inner(value: i32): i32 { return $local0; // closure 3 }; } testLet(); +// see: https://github.com/AssemblyScript/assemblyscript/issues/2073 + +function testSelect(): (value: i32) => i32 { + let $local0 = 0; + return function inner($arg0: i32): i32 { + return max($local0, $arg0); // closure 4 + }; +} +testSelect(); + ERROR("EOF"); From c2ebb9c0de194af4b55b6a673a3b9e763a677e9a Mon Sep 17 00:00:00 2001 From: dcode Date: Mon, 13 Sep 2021 15:40:40 +0200 Subject: [PATCH 2/4] use select directly --- tests/compiler/closure.json | 2 +- tests/compiler/closure.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/compiler/closure.json b/tests/compiler/closure.json index a76a90b276..3811b97c27 100644 --- a/tests/compiler/closure.json +++ b/tests/compiler/closure.json @@ -9,7 +9,7 @@ "AS100: Not implemented: Closures", "$local0; // closure 3", "AS100: Not implemented: Closures", - "max($local0, $arg0); // closure 4", + "select($local0, $arg0, $arg1); // closure 4", "EOF" ] } diff --git a/tests/compiler/closure.ts b/tests/compiler/closure.ts index dd3e847b80..f1ea82374f 100644 --- a/tests/compiler/closure.ts +++ b/tests/compiler/closure.ts @@ -23,10 +23,10 @@ testLet(); // see: https://github.com/AssemblyScript/assemblyscript/issues/2073 -function testSelect(): (value: i32) => i32 { +function testSelect(): (value: i32, cond: bool) => i32 { let $local0 = 0; - return function inner($arg0: i32): i32 { - return max($local0, $arg0); // closure 4 + return function inner($arg0: i32, $arg1: bool): i32 { + return select($local0, $arg0, $arg1); // closure 4 }; } testSelect(); From 8e296b1e5a3901701e97fdace566df1b8ac65224 Mon Sep 17 00:00:00 2001 From: dcode Date: Mon, 13 Sep 2021 16:32:01 +0200 Subject: [PATCH 3/4] remove assert --- src/module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module.ts b/src/module.ts index 6d8072f181..49cedbc5b7 100644 --- a/src/module.ts +++ b/src/module.ts @@ -1479,7 +1479,7 @@ export class Module { ): ExpressionRef { if (type == TypeRef.Auto) { type = binaryen._BinaryenExpressionGetType(ifTrue); - assert(type == binaryen._BinaryenExpressionGetType(ifFalse) || type == TypeRef.Unreachable); + if (type == TypeRef.Unreachable) type = binaryen._BinaryenExpressionGetType(ifFalse); } return binaryen._BinaryenSelect(this.ref, condition, ifTrue, ifFalse, type); } From 7104d9daf2d4d2a48cd79877e701343230bb4bc1 Mon Sep 17 00:00:00 2001 From: dcode Date: Mon, 13 Sep 2021 16:48:31 +0200 Subject: [PATCH 4/4] remove the root cause so there's nothing to test --- src/builtins.ts | 8 +++++--- src/compiler.ts | 3 ++- src/module.ts | 6 +----- tests/compiler/closure.json | 2 -- tests/compiler/closure.ts | 10 ---------- 5 files changed, 8 insertions(+), 21 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 22228cfb22..7bc25737e0 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -1554,7 +1554,8 @@ function builtin_max(ctx: BuiltinContext): ExpressionRef { module.binary(op, module.local_get(temp1.index, typeRef), module.local_get(temp2.index, typeRef) - ) + ), + typeRef ); flow.freeTempLocal(temp2); flow.freeTempLocal(temp1); @@ -1633,7 +1634,8 @@ function builtin_min(ctx: BuiltinContext): ExpressionRef { module.binary(op, module.local_get(temp1.index, typeRef), module.local_get(temp2.index, typeRef) - ) + ), + typeRef ); flow.freeTempLocal(temp2); flow.freeTempLocal(temp1); @@ -2770,7 +2772,7 @@ function builtin_select(ctx: BuiltinContext): ExpressionRef { operands[2] ); compiler.currentType = type; - return module.select(arg0, arg1, arg2); + return module.select(arg0, arg1, arg2, type.toRef()); } builtins.set(BuiltinNames.select, builtin_select); diff --git a/src/compiler.ts b/src/compiler.ts index d8ee0cdf74..82be831671 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -5245,7 +5245,8 @@ export class Compiler extends DiagnosticEmitter { return module.select( module.i32(1), module.binary(BinaryOp.EqI32, rightExpr, module.i32(0)), - leftExpr + leftExpr, + TypeRef.I32 ); } case TypeKind.I8: diff --git a/src/module.ts b/src/module.ts index 49cedbc5b7..b3406bfe94 100644 --- a/src/module.ts +++ b/src/module.ts @@ -1475,12 +1475,8 @@ export class Module { ifTrue: ExpressionRef, ifFalse: ExpressionRef, condition: ExpressionRef, - type: TypeRef = TypeRef.Auto + type: TypeRef ): ExpressionRef { - if (type == TypeRef.Auto) { - type = binaryen._BinaryenExpressionGetType(ifTrue); - if (type == TypeRef.Unreachable) type = binaryen._BinaryenExpressionGetType(ifFalse); - } return binaryen._BinaryenSelect(this.ref, condition, ifTrue, ifFalse, type); } diff --git a/tests/compiler/closure.json b/tests/compiler/closure.json index 3811b97c27..75907cebe4 100644 --- a/tests/compiler/closure.json +++ b/tests/compiler/closure.json @@ -8,8 +8,6 @@ "$local0; // closure 2", "AS100: Not implemented: Closures", "$local0; // closure 3", - "AS100: Not implemented: Closures", - "select($local0, $arg0, $arg1); // closure 4", "EOF" ] } diff --git a/tests/compiler/closure.ts b/tests/compiler/closure.ts index f1ea82374f..fc23ecbf89 100644 --- a/tests/compiler/closure.ts +++ b/tests/compiler/closure.ts @@ -21,14 +21,4 @@ function testLet(): (value: i32) => i32 { } testLet(); -// see: https://github.com/AssemblyScript/assemblyscript/issues/2073 - -function testSelect(): (value: i32, cond: bool) => i32 { - let $local0 = 0; - return function inner($arg0: i32, $arg1: bool): i32 { - return select($local0, $arg0, $arg1); // closure 4 - }; -} -testSelect(); - ERROR("EOF");