@@ -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-
18277func (exec * Execution ) evalExpression (expr Expression , env * Env ) (Value , error ) {
18378 return exec .evalExpressionWithAuto (expr , env , true )
18479}
0 commit comments