diff --git a/src/backend/binaryen/wasm_expr_gen.ts b/src/backend/binaryen/wasm_expr_gen.ts index 08834448..f209e72e 100644 --- a/src/backend/binaryen/wasm_expr_gen.ts +++ b/src/backend/binaryen/wasm_expr_gen.ts @@ -1950,12 +1950,12 @@ export class WASMExpressionGen { index--; } /** it occupies two slots */ - if (members[i].hasGetter && members[i].hasSetter) { + if (members[i].hasGetter || members[i].hasSetter) { index++; } } - if (isSetter && member.hasGetter) { + if (isSetter) { index++; } diff --git a/tests/samples/class_accessor.ts b/tests/samples/class_accessor.ts index 587d1909..c9acf37b 100644 --- a/tests/samples/class_accessor.ts +++ b/tests/samples/class_accessor.ts @@ -311,4 +311,64 @@ export function test15() { const i3: I3 = new Z(1); i3.ref = 2; console.log(i3.ref); +} + +class OnlySetter { + a = 1; + + constructor(a: number) { + this.a = a; + this.foo(); + this.bar(); + } + + foo() { + console.log('invoke foo'); + } + + set value(a: number) { + this.a = a; + } + + bar() { + console.log('invoke bar'); + } +} + +export function testOnlySetter() { + const obj = new OnlySetter(10); + console.log(obj.a); + obj.a = 100; + console.log(obj.a); +} + +class OnlyGetter { + a = 1; + + constructor(a: number) { + this.a = a; + this.foo(); + this.bar(); + } + + foo() { + console.log('invoke foo'); + } + + + get value() : number { + return this.a; + } + + + bar() { + console.log('invoke bar'); + } +} + +export function testOnlyGetter() { + const obj = new OnlyGetter(10); + console.log(obj.value); + obj.a = 100; + console.log(obj.value); } \ No newline at end of file diff --git a/tools/validate/wamr/validation.json b/tools/validate/wamr/validation.json index d6cd72eb..931eaad2 100644 --- a/tools/validate/wamr/validation.json +++ b/tools/validate/wamr/validation.json @@ -1752,6 +1752,16 @@ "name": "test15", "args": [], "result": "undefined\n2\n1\n1\n2" + }, + { + "name": "testOnlySetter", + "args": [], + "result": "invoke foo\ninvoke bar\n10\n100" + }, + { + "name": "testOnlyGetter", + "args": [], + "result": "invoke foo\ninvoke bar\n10\n100" } ] },