Skip to content

Commit d7651bf

Browse files
committed
enforce receiver memory checks before member lookup errors
1 parent eca7599 commit d7651bf

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

vibes/execution_call_expr.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ func (exec *Execution) evalCallTarget(call *CallExpr, env *Env) (Value, Value, e
66
if err != nil {
77
return NewNil(), NewNil(), err
88
}
9+
if err := exec.checkMemoryWith(receiver); err != nil {
10+
return NewNil(), NewNil(), err
11+
}
912
if directCallee, handled, err := exec.evalDirectMemberMethodCall(receiver, member.Property, member.Pos()); handled || err != nil {
1013
if err != nil {
1114
return NewNil(), NewNil(), err

vibes/memory_quota_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,38 @@ func TestTransientMethodCallReceiverAllocationsAreChecked(t *testing.T) {
421421
requireErrorContains(t, err, "memory quota exceeded")
422422
}
423423

424+
func TestTransientMethodCallReceiverLookupErrorsAreChecked(t *testing.T) {
425+
pos := Position{Line: 1, Column: 1}
426+
elements := make([]Expression, 1200)
427+
for i := range elements {
428+
elements[i] = &StringLiteral{Value: "abcdefghij", position: pos}
429+
}
430+
431+
stmt := &ExprStmt{
432+
Expr: &CallExpr{
433+
Callee: &MemberExpr{
434+
Object: &ArrayLiteral{Elements: elements, position: pos},
435+
Property: "missing",
436+
position: pos,
437+
},
438+
position: pos,
439+
},
440+
position: pos,
441+
}
442+
443+
exec := &Execution{
444+
quota: 10000,
445+
memoryQuota: 1,
446+
moduleLoading: make(map[string]bool),
447+
}
448+
env := newEnv(nil)
449+
_, _, err := exec.evalStatements([]Statement{stmt}, env)
450+
if err == nil {
451+
t.Fatalf("expected memory quota error for transient method-call lookup receiver")
452+
}
453+
requireErrorContains(t, err, "memory quota exceeded")
454+
}
455+
424456
func TestIfConditionTransientAllocationsAreChecked(t *testing.T) {
425457
pos := Position{Line: 1, Column: 1}
426458
elements := make([]Expression, 1200)

0 commit comments

Comments
 (0)