Skip to content

Commit f70e4b4

Browse files
committed
extract call expression evaluation helpers
1 parent 344fbb1 commit f70e4b4

2 files changed

Lines changed: 119 additions & 118 deletions

File tree

vibes/execution_call_expr.go

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package vibes
2+
3+
func (exec *Execution) evalCallTarget(call *CallExpr, env *Env) (Value, Value, error) {
4+
if member, ok := call.Callee.(*MemberExpr); ok {
5+
receiver, err := exec.evalExpression(member.Object, env)
6+
if err != nil {
7+
return NewNil(), NewNil(), err
8+
}
9+
if err := exec.checkMemoryWith(receiver); err != nil {
10+
return NewNil(), NewNil(), err
11+
}
12+
callee, err := exec.getMember(receiver, member.Property, member.Pos())
13+
if err != nil {
14+
return NewNil(), NewNil(), err
15+
}
16+
return callee, receiver, nil
17+
}
18+
19+
callee, err := exec.evalExpressionWithAuto(call.Callee, env, false)
20+
if err != nil {
21+
return NewNil(), NewNil(), err
22+
}
23+
return callee, NewNil(), nil
24+
}
25+
26+
func (exec *Execution) evalCallArgs(call *CallExpr, env *Env) ([]Value, error) {
27+
args := make([]Value, len(call.Args))
28+
for i, arg := range call.Args {
29+
val, err := exec.evalExpressionWithAuto(arg, env, true)
30+
if err != nil {
31+
return nil, err
32+
}
33+
if err := exec.checkMemoryWith(val); err != nil {
34+
return nil, err
35+
}
36+
args[i] = val
37+
}
38+
return args, nil
39+
}
40+
41+
func (exec *Execution) evalCallKwArgs(call *CallExpr, env *Env) (map[string]Value, error) {
42+
if len(call.KwArgs) == 0 {
43+
return nil, nil
44+
}
45+
kwargs := make(map[string]Value, len(call.KwArgs))
46+
for _, kw := range call.KwArgs {
47+
val, err := exec.evalExpressionWithAuto(kw.Value, env, true)
48+
if err != nil {
49+
return nil, err
50+
}
51+
if err := exec.checkMemoryWith(val); err != nil {
52+
return nil, err
53+
}
54+
kwargs[kw.Name] = val
55+
}
56+
return kwargs, nil
57+
}
58+
59+
func (exec *Execution) evalCallBlock(call *CallExpr, env *Env) (Value, error) {
60+
if call.Block == nil {
61+
return NewNil(), nil
62+
}
63+
return exec.evalBlockLiteral(call.Block, env)
64+
}
65+
66+
func (exec *Execution) checkCallMemoryRoots(receiver Value, args []Value, kwargs map[string]Value, block Value) error {
67+
if receiver.Kind() == KindNil && len(kwargs) == 0 && block.IsNil() {
68+
if len(args) == 0 {
69+
return nil
70+
}
71+
return exec.checkMemoryWith(args...)
72+
}
73+
combined := make([]Value, 0, len(args)+len(kwargs)+2)
74+
if receiver.Kind() != KindNil {
75+
combined = append(combined, receiver)
76+
}
77+
combined = append(combined, args...)
78+
for _, kwVal := range kwargs {
79+
combined = append(combined, kwVal)
80+
}
81+
if !block.IsNil() {
82+
combined = append(combined, block)
83+
}
84+
if len(combined) == 0 {
85+
return nil
86+
}
87+
return exec.checkMemoryWith(combined...)
88+
}
89+
90+
func (exec *Execution) evalCallExpr(call *CallExpr, env *Env) (Value, error) {
91+
callee, receiver, err := exec.evalCallTarget(call, env)
92+
if err != nil {
93+
return NewNil(), err
94+
}
95+
args, err := exec.evalCallArgs(call, env)
96+
if err != nil {
97+
return NewNil(), err
98+
}
99+
kwargs, err := exec.evalCallKwArgs(call, env)
100+
if err != nil {
101+
return NewNil(), err
102+
}
103+
block, err := exec.evalCallBlock(call, env)
104+
if err != nil {
105+
return NewNil(), err
106+
}
107+
if err := exec.checkCallMemoryRoots(receiver, args, kwargs, block); err != nil {
108+
return NewNil(), err
109+
}
110+
111+
result, callErr := exec.invokeCallable(callee, receiver, args, kwargs, block, call.Pos())
112+
if callErr != nil {
113+
return NewNil(), callErr
114+
}
115+
if err := exec.checkMemoryWith(result); err != nil {
116+
return NewNil(), err
117+
}
118+
return result, nil
119+
}

vibes/execution_calls.go

Lines changed: 0 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -151,124 +151,6 @@ func (exec *Execution) callFunction(fn *ScriptFunction, receiver Value, args []V
151151
return val, nil
152152
}
153153

154-
func (exec *Execution) evalCallTarget(call *CallExpr, env *Env) (Value, Value, error) {
155-
if member, ok := call.Callee.(*MemberExpr); ok {
156-
receiver, err := exec.evalExpression(member.Object, env)
157-
if err != nil {
158-
return NewNil(), NewNil(), err
159-
}
160-
if err := exec.checkMemoryWith(receiver); err != nil {
161-
return NewNil(), NewNil(), err
162-
}
163-
callee, err := exec.getMember(receiver, member.Property, member.Pos())
164-
if err != nil {
165-
return NewNil(), NewNil(), err
166-
}
167-
return callee, receiver, nil
168-
}
169-
170-
callee, err := exec.evalExpressionWithAuto(call.Callee, env, false)
171-
if err != nil {
172-
return NewNil(), NewNil(), err
173-
}
174-
return callee, NewNil(), nil
175-
}
176-
177-
func (exec *Execution) evalCallArgs(call *CallExpr, env *Env) ([]Value, error) {
178-
args := make([]Value, len(call.Args))
179-
for i, arg := range call.Args {
180-
val, err := exec.evalExpressionWithAuto(arg, env, true)
181-
if err != nil {
182-
return nil, err
183-
}
184-
if err := exec.checkMemoryWith(val); err != nil {
185-
return nil, err
186-
}
187-
args[i] = val
188-
}
189-
return args, nil
190-
}
191-
192-
func (exec *Execution) evalCallKwArgs(call *CallExpr, env *Env) (map[string]Value, error) {
193-
if len(call.KwArgs) == 0 {
194-
return nil, nil
195-
}
196-
kwargs := make(map[string]Value, len(call.KwArgs))
197-
for _, kw := range call.KwArgs {
198-
val, err := exec.evalExpressionWithAuto(kw.Value, env, true)
199-
if err != nil {
200-
return nil, err
201-
}
202-
if err := exec.checkMemoryWith(val); err != nil {
203-
return nil, err
204-
}
205-
kwargs[kw.Name] = val
206-
}
207-
return kwargs, nil
208-
}
209-
210-
func (exec *Execution) evalCallBlock(call *CallExpr, env *Env) (Value, error) {
211-
if call.Block == nil {
212-
return NewNil(), nil
213-
}
214-
return exec.evalBlockLiteral(call.Block, env)
215-
}
216-
217-
func (exec *Execution) checkCallMemoryRoots(receiver Value, args []Value, kwargs map[string]Value, block Value) error {
218-
if receiver.Kind() == KindNil && len(kwargs) == 0 && block.IsNil() {
219-
if len(args) == 0 {
220-
return nil
221-
}
222-
return exec.checkMemoryWith(args...)
223-
}
224-
combined := make([]Value, 0, len(args)+len(kwargs)+2)
225-
if receiver.Kind() != KindNil {
226-
combined = append(combined, receiver)
227-
}
228-
combined = append(combined, args...)
229-
for _, kwVal := range kwargs {
230-
combined = append(combined, kwVal)
231-
}
232-
if !block.IsNil() {
233-
combined = append(combined, block)
234-
}
235-
if len(combined) == 0 {
236-
return nil
237-
}
238-
return exec.checkMemoryWith(combined...)
239-
}
240-
241-
func (exec *Execution) evalCallExpr(call *CallExpr, env *Env) (Value, error) {
242-
callee, receiver, err := exec.evalCallTarget(call, env)
243-
if err != nil {
244-
return NewNil(), err
245-
}
246-
args, err := exec.evalCallArgs(call, env)
247-
if err != nil {
248-
return NewNil(), err
249-
}
250-
kwargs, err := exec.evalCallKwArgs(call, env)
251-
if err != nil {
252-
return NewNil(), err
253-
}
254-
block, err := exec.evalCallBlock(call, env)
255-
if err != nil {
256-
return NewNil(), err
257-
}
258-
if err := exec.checkCallMemoryRoots(receiver, args, kwargs, block); err != nil {
259-
return NewNil(), err
260-
}
261-
262-
result, callErr := exec.invokeCallable(callee, receiver, args, kwargs, block, call.Pos())
263-
if callErr != nil {
264-
return NewNil(), callErr
265-
}
266-
if err := exec.checkMemoryWith(result); err != nil {
267-
return NewNil(), err
268-
}
269-
return result, nil
270-
}
271-
272154
func (exec *Execution) evalBlockLiteral(block *BlockLiteral, env *Env) (Value, error) {
273155
blockValue := NewBlock(block.Params, block.Body, env)
274156
if ctx := exec.currentModuleContext(); ctx != nil {

0 commit comments

Comments
 (0)