From 08943700167b5d8e86af310903ab1351d65d7ec8 Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Wed, 27 Aug 2025 00:13:27 +0800 Subject: [PATCH 1/2] fix: avoid to visit nullptr in binaryen Module.getExpressionId will be used for nullptr ExpressionRef. It works because deref nullptr in binaryen's wasm is valid. Adding guard can enhance robustness --- src/module.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/module.ts b/src/module.ts index c6eb00b579..9a230591a6 100644 --- a/src/module.ts +++ b/src/module.ts @@ -3019,6 +3019,7 @@ export function isNullableType(type: TypeRef): bool { // expressions export function getExpressionId(expr: ExpressionRef): ExpressionId { + if (expr == 0) return ExpressionId.Invalid; return binaryen._BinaryenExpressionGetId(expr); } From fee7795d4db117df06de16a7b78a811333db8cb0 Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Wed, 27 Aug 2025 23:12:05 +0800 Subject: [PATCH 2/2] fix it in caller side --- src/compiler.ts | 4 ++-- src/module.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 6ad4719cd2..f02c0f7439 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -6764,7 +6764,7 @@ export class Compiler extends DiagnosticEmitter { if (thisType.isManaged) { let operand = operands[0]; let precomp = module.runExpression(operand, ExpressionRunnerFlags.Default); - if (!isConstZero(precomp)) { // otherwise unnecessary + if (!precomp || !isConstZero(precomp)) { // otherwise unnecessary operands[operandIndex] = module.tostack(operand); } } @@ -6778,7 +6778,7 @@ export class Compiler extends DiagnosticEmitter { if (paramType.isManaged) { let operand = operands[operandIndex]; let precomp = module.runExpression(operand, ExpressionRunnerFlags.Default); - if (!isConstZero(precomp)) { // otherwise unnecessary + if (!precomp || !isConstZero(precomp)) { // otherwise unnecessary operands[operandIndex] = module.tostack(operand); } } diff --git a/src/module.ts b/src/module.ts index 9a230591a6..c6eb00b579 100644 --- a/src/module.ts +++ b/src/module.ts @@ -3019,7 +3019,6 @@ export function isNullableType(type: TypeRef): bool { // expressions export function getExpressionId(expr: ExpressionRef): ExpressionId { - if (expr == 0) return ExpressionId.Invalid; return binaryen._BinaryenExpressionGetId(expr); }