Skip to content

Commit e5afe89

Browse files
committed
test: prove eval field super arrows stay AST-free
1 parent f5cb385 commit e5afe89

3 files changed

Lines changed: 57 additions & 34 deletions

File tree

tests/Asynkron.JsEngine.Tests/AstFreeExecutionAssertionTests.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3146,6 +3146,51 @@ class Derived extends Base {
31463146
}
31473147
}
31483148

3149+
[Fact]
3150+
public async Task AssertNoAstEvaluation_Enabled_AllowsEvalProducedInstanceFieldArrowWithSuperExecution()
3151+
{
3152+
var originalValue = EvaluationContext.AssertNoAstEvaluation;
3153+
3154+
try
3155+
{
3156+
EvaluationContext.AssertNoAstEvaluation = true;
3157+
3158+
var program = _engine.ParseProgram("""
3159+
var executed = false;
3160+
3161+
class Base {
3162+
constructor() {
3163+
this.value = 7;
3164+
}
3165+
3166+
get read() {
3167+
return this.value;
3168+
}
3169+
}
3170+
3171+
class Derived extends Base {
3172+
field = eval('executed = true; () => super.read;');
3173+
3174+
constructor() {
3175+
super();
3176+
}
3177+
}
3178+
3179+
const instance = new Derived();
3180+
const arrow = instance.field;
3181+
`${executed}:${arrow.call({ value: 99 })}`;
3182+
""");
3183+
3184+
var result = await _engine.Evaluate(program);
3185+
3186+
Assert.Equal("true:7", result);
3187+
}
3188+
finally
3189+
{
3190+
EvaluationContext.AssertNoAstEvaluation = originalValue;
3191+
}
3192+
}
3193+
31493194
[Fact]
31503195
public async Task AssertNoAstEvaluation_Enabled_AllowsClassFieldInitializerCallLikeSurfaceExecution()
31513196
{

tests/Asynkron.JsEngine.Tests/ClassElementEvalTests.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,25 +87,32 @@ class Derived extends Base {
8787
}
8888

8989
[Fact(Timeout = 2000)]
90-
public async Task EvalProducedArrowFunctionCanUseSuper()
90+
public async Task EvalProducedArrowFunctionRetainsFieldInitializerSuperBinding()
9191
{
9292
await using var engine = CreateEngine();
9393
var result = await engine.Evaluate("""
9494
9595
var executed = false;
9696
class Base {
97-
method() {
98-
return 7;
97+
constructor() {
98+
this.value = 7;
99+
}
100+
101+
get read() {
102+
return this.value;
99103
}
100104
}
101105
102106
class Derived extends Base {
103-
field = eval('executed = true; () => super.method();');
107+
field = eval('executed = true; () => super.read;');
108+
constructor() {
109+
super();
110+
}
104111
}
105112
106113
var instance = new Derived();
107114
var arrow = instance.field;
108-
executed && arrow() === 7;
115+
executed && arrow.call({ value: 99 }) === 7;
109116
110117
""");
111118

tests/Asynkron.JsEngine.Tests/JsEvaluatorTests.cs

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -331,35 +331,6 @@ public async Task IndexedMethodInvocationBindsThis()
331331
Assert.Equal(10d, result);
332332
}
333333

334-
[Fact(Skip = "Bug #363: Class field initializers with eval and super need special handling")]
335-
public async Task ClassFieldInitializerCanAccessSuper()
336-
{
337-
await using var engine = CreateEngine();
338-
var source = """
339-
var executed = false;
340-
class Base {
341-
constructor() { this.value = 1; }
342-
get read() { return this.value; }
343-
}
344-
class Derived extends Base {
345-
field = eval('executed = true; () => super.read;');
346-
constructor() {
347-
super();
348-
}
349-
}
350-
var instance = new Derived();
351-
var getter = instance.field;
352-
var result = getter.call(instance);
353-
({ executed, result });
354-
""";
355-
356-
var outcome = Assert.IsType<JsObject>(await engine.Evaluate(source));
357-
Assert.True(outcome.TryGetProperty("executed", out var executedValue));
358-
Assert.True(JsOps.ToBoolean(executedValue));
359-
Assert.True(outcome.TryGetProperty("result", out var resultValue));
360-
Assert.Equal(1d, JsOps.ToNumber(resultValue));
361-
}
362-
363334
[Fact(Timeout = 2000)]
364335
public async Task HostFunctionReceivesThisBinding()
365336
{

0 commit comments

Comments
 (0)