Skip to content

Commit 86a4e65

Browse files
committed
extract statement evaluation dispatch from execution core
1 parent 158d2b8 commit 86a4e65

2 files changed

Lines changed: 106 additions & 105 deletions

File tree

vibes/execution.go

Lines changed: 0 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -74,111 +74,6 @@ type callFrame struct {
7474
Pos Position
7575
}
7676

77-
func (exec *Execution) evalStatements(stmts []Statement, env *Env) (Value, bool, error) {
78-
exec.pushEnv(env)
79-
defer exec.popEnv()
80-
81-
result := NewNil()
82-
for _, stmt := range stmts {
83-
if err := exec.step(); err != nil {
84-
return NewNil(), false, err
85-
}
86-
val, returned, err := exec.evalStatement(stmt, env)
87-
if err != nil {
88-
return NewNil(), false, err
89-
}
90-
if _, isAssign := stmt.(*AssignStmt); isAssign {
91-
if err := exec.checkMemory(); err != nil {
92-
return NewNil(), false, err
93-
}
94-
} else {
95-
if err := exec.checkMemoryWith(val); err != nil {
96-
return NewNil(), false, err
97-
}
98-
}
99-
if returned {
100-
return val, true, nil
101-
}
102-
result = val
103-
}
104-
if err := exec.checkMemory(); err != nil {
105-
return NewNil(), false, err
106-
}
107-
return result, false, nil
108-
}
109-
110-
func (exec *Execution) evalStatement(stmt Statement, env *Env) (Value, bool, error) {
111-
switch s := stmt.(type) {
112-
case *ExprStmt:
113-
val, err := exec.evalExpression(s.Expr, env)
114-
return val, false, err
115-
case *ReturnStmt:
116-
val, err := exec.evalExpression(s.Value, env)
117-
return val, true, err
118-
case *RaiseStmt:
119-
return exec.evalRaiseStatement(s, env)
120-
case *AssignStmt:
121-
val, err := exec.evalExpression(s.Value, env)
122-
if err != nil {
123-
return NewNil(), false, err
124-
}
125-
if err := exec.checkMemoryWith(val); err != nil {
126-
return NewNil(), false, err
127-
}
128-
if err := exec.assign(s.Target, val, env); err != nil {
129-
return NewNil(), false, err
130-
}
131-
return val, false, nil
132-
case *IfStmt:
133-
val, err := exec.evalExpression(s.Condition, env)
134-
if err != nil {
135-
return NewNil(), false, err
136-
}
137-
if err := exec.checkMemoryWith(val); err != nil {
138-
return NewNil(), false, err
139-
}
140-
if val.Truthy() {
141-
return exec.evalStatements(s.Consequent, env)
142-
}
143-
for _, clause := range s.ElseIf {
144-
condVal, err := exec.evalExpression(clause.Condition, env)
145-
if err != nil {
146-
return NewNil(), false, err
147-
}
148-
if err := exec.checkMemoryWith(condVal); err != nil {
149-
return NewNil(), false, err
150-
}
151-
if condVal.Truthy() {
152-
return exec.evalStatements(clause.Consequent, env)
153-
}
154-
}
155-
if len(s.Alternate) > 0 {
156-
return exec.evalStatements(s.Alternate, env)
157-
}
158-
return NewNil(), false, nil
159-
case *ForStmt:
160-
return exec.evalForStatement(s, env)
161-
case *WhileStmt:
162-
return exec.evalWhileStatement(s, env)
163-
case *UntilStmt:
164-
return exec.evalUntilStatement(s, env)
165-
case *BreakStmt:
166-
if exec.loopDepth == 0 {
167-
return NewNil(), false, exec.errorAt(s.Pos(), "break used outside of loop")
168-
}
169-
return NewNil(), false, errLoopBreak
170-
case *NextStmt:
171-
if exec.loopDepth == 0 {
172-
return NewNil(), false, exec.errorAt(s.Pos(), "next used outside of loop")
173-
}
174-
return NewNil(), false, errLoopNext
175-
case *TryStmt:
176-
return exec.evalTryStatement(s, env)
177-
default:
178-
return NewNil(), false, exec.errorAt(stmt.Pos(), "unsupported statement")
179-
}
180-
}
181-
18277
func (exec *Execution) evalExpression(expr Expression, env *Env) (Value, error) {
18378
return exec.evalExpressionWithAuto(expr, env, true)
18479
}

vibes/execution_statements.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package vibes
2+
3+
func (exec *Execution) evalStatements(stmts []Statement, env *Env) (Value, bool, error) {
4+
exec.pushEnv(env)
5+
defer exec.popEnv()
6+
7+
result := NewNil()
8+
for _, stmt := range stmts {
9+
if err := exec.step(); err != nil {
10+
return NewNil(), false, err
11+
}
12+
val, returned, err := exec.evalStatement(stmt, env)
13+
if err != nil {
14+
return NewNil(), false, err
15+
}
16+
if _, isAssign := stmt.(*AssignStmt); isAssign {
17+
if err := exec.checkMemory(); err != nil {
18+
return NewNil(), false, err
19+
}
20+
} else {
21+
if err := exec.checkMemoryWith(val); err != nil {
22+
return NewNil(), false, err
23+
}
24+
}
25+
if returned {
26+
return val, true, nil
27+
}
28+
result = val
29+
}
30+
if err := exec.checkMemory(); err != nil {
31+
return NewNil(), false, err
32+
}
33+
return result, false, nil
34+
}
35+
36+
func (exec *Execution) evalStatement(stmt Statement, env *Env) (Value, bool, error) {
37+
switch s := stmt.(type) {
38+
case *ExprStmt:
39+
val, err := exec.evalExpression(s.Expr, env)
40+
return val, false, err
41+
case *ReturnStmt:
42+
val, err := exec.evalExpression(s.Value, env)
43+
return val, true, err
44+
case *RaiseStmt:
45+
return exec.evalRaiseStatement(s, env)
46+
case *AssignStmt:
47+
val, err := exec.evalExpression(s.Value, env)
48+
if err != nil {
49+
return NewNil(), false, err
50+
}
51+
if err := exec.checkMemoryWith(val); err != nil {
52+
return NewNil(), false, err
53+
}
54+
if err := exec.assign(s.Target, val, env); err != nil {
55+
return NewNil(), false, err
56+
}
57+
return val, false, nil
58+
case *IfStmt:
59+
val, err := exec.evalExpression(s.Condition, env)
60+
if err != nil {
61+
return NewNil(), false, err
62+
}
63+
if err := exec.checkMemoryWith(val); err != nil {
64+
return NewNil(), false, err
65+
}
66+
if val.Truthy() {
67+
return exec.evalStatements(s.Consequent, env)
68+
}
69+
for _, clause := range s.ElseIf {
70+
condVal, err := exec.evalExpression(clause.Condition, env)
71+
if err != nil {
72+
return NewNil(), false, err
73+
}
74+
if err := exec.checkMemoryWith(condVal); err != nil {
75+
return NewNil(), false, err
76+
}
77+
if condVal.Truthy() {
78+
return exec.evalStatements(clause.Consequent, env)
79+
}
80+
}
81+
if len(s.Alternate) > 0 {
82+
return exec.evalStatements(s.Alternate, env)
83+
}
84+
return NewNil(), false, nil
85+
case *ForStmt:
86+
return exec.evalForStatement(s, env)
87+
case *WhileStmt:
88+
return exec.evalWhileStatement(s, env)
89+
case *UntilStmt:
90+
return exec.evalUntilStatement(s, env)
91+
case *BreakStmt:
92+
if exec.loopDepth == 0 {
93+
return NewNil(), false, exec.errorAt(s.Pos(), "break used outside of loop")
94+
}
95+
return NewNil(), false, errLoopBreak
96+
case *NextStmt:
97+
if exec.loopDepth == 0 {
98+
return NewNil(), false, exec.errorAt(s.Pos(), "next used outside of loop")
99+
}
100+
return NewNil(), false, errLoopNext
101+
case *TryStmt:
102+
return exec.evalTryStatement(s, env)
103+
default:
104+
return NewNil(), false, exec.errorAt(stmt.Pos(), "unsupported statement")
105+
}
106+
}

0 commit comments

Comments
 (0)