@@ -1195,7 +1195,7 @@ func (ctx Ctx) exprAddr(e ast.Expr) glang.Expr {
1195
1195
return nil
1196
1196
}
1197
1197
1198
- func (ctx Ctx ) assignFromTo (s ast. Node , lhs ast.Expr , rhs glang.Expr , cont glang.Expr ) glang.Expr {
1198
+ func (ctx Ctx ) assignFromTo (lhs ast.Expr , rhs glang.Expr , cont glang.Expr ) glang.Expr {
1199
1199
// lhs should either be a map index expression, or is addressable
1200
1200
switch lhs := lhs .(type ) {
1201
1201
case * ast.Ident :
@@ -1227,7 +1227,7 @@ func (ctx Ctx) assignStmt(s *ast.AssignStmt, cont glang.Expr) glang.Expr {
1227
1227
intermediates := make ([]string , 0 , len (s .Lhs ))
1228
1228
for i , lhs := range s .Lhs {
1229
1229
intermediates = append (intermediates , fmt .Sprintf ("$a%d" , i ))
1230
- e = ctx .assignFromTo (s , lhs , glang .IdentExpr (intermediates [i ]), e )
1230
+ e = ctx .assignFromTo (lhs , glang .IdentExpr (intermediates [i ]), e )
1231
1231
}
1232
1232
1233
1233
// FIXME:(evaluation order)
@@ -1259,25 +1259,21 @@ func (ctx Ctx) assignOpStmt(s *ast.AssignStmt, cont glang.Expr) glang.Expr {
1259
1259
Op : op ,
1260
1260
Y : ctx .expr (s .Rhs [0 ]),
1261
1261
}
1262
- return ctx .assignFromTo (s , s .Lhs [0 ], rhs , cont )
1262
+ return ctx .assignFromTo (s .Lhs [0 ], rhs , cont )
1263
1263
}
1264
1264
1265
1265
func (ctx Ctx ) incDecStmt (stmt * ast.IncDecStmt , cont glang.Expr ) glang.Expr {
1266
1266
op := glang .OpPlus
1267
1267
if stmt .Tok == token .DEC {
1268
1268
op = glang .OpMinus
1269
1269
}
1270
- return ctx .assignFromTo (stmt , stmt .X , glang.BinaryExpr {
1270
+ return ctx .assignFromTo (stmt .X , glang.BinaryExpr {
1271
1271
X : ctx .expr (stmt .X ),
1272
1272
Op : op ,
1273
1273
Y : glang.IntLiteral {Value : 1 },
1274
1274
}, cont )
1275
1275
}
1276
1276
1277
- func (ctx Ctx ) spawnExpr (thread ast.Expr ) glang.SpawnExpr {
1278
- return glang.SpawnExpr {Body : ctx .expr (thread )}
1279
- }
1280
-
1281
1277
func (ctx Ctx ) branchStmt (s * ast.BranchStmt , cont glang.Expr ) glang.Expr {
1282
1278
if s .Tok == token .CONTINUE {
1283
1279
return glang.LetExpr {ValExpr : glang.ContinueExpr {}, Cont : cont }
@@ -1290,15 +1286,15 @@ func (ctx Ctx) branchStmt(s *ast.BranchStmt, cont glang.Expr) glang.Expr {
1290
1286
}
1291
1287
1292
1288
// getSpawn returns a non-nil spawned thread if the expression is a go call
1293
- func (ctx Ctx ) goStmt (e * ast.GoStmt ) glang.Expr {
1289
+ func (ctx Ctx ) goStmt (e * ast.GoStmt , cont glang. Expr ) glang.Expr {
1294
1290
args := make ([]glang.Expr , 0 , len (e .Call .Args ))
1295
1291
for i := range len (e .Call .Args ) {
1296
1292
args = append (args , glang .IdentExpr (fmt .Sprintf ("$arg%d" , i )))
1297
1293
}
1298
- var expr glang.Expr = glang.SpawnExpr {Body : glang .NewCallExpr (
1294
+ var expr glang.Expr = glang .NewDoSeq (glang. SpawnExpr {Body : glang .NewCallExpr (
1299
1295
glang .IdentExpr ("$go" ),
1300
1296
args ... ,
1301
- )}
1297
+ )}, cont )
1302
1298
expr = glang.LetExpr {
1303
1299
Names : []string {"$go" },
1304
1300
ValExpr : ctx .expr (e .Call .Fun ),
@@ -1339,7 +1335,7 @@ func (ctx Ctx) stmt(s ast.Stmt, cont glang.Expr) glang.Expr {
1339
1335
case * ast.IfStmt :
1340
1336
return ctx .ifStmt (s , cont )
1341
1337
case * ast.GoStmt :
1342
- return glang . NewDoSeq ( ctx .goStmt (s ) , cont )
1338
+ return ctx .goStmt (s , cont )
1343
1339
case * ast.ExprStmt :
1344
1340
return glang .NewDoSeq (ctx .expr (s .X ), cont )
1345
1341
case * ast.AssignStmt :
0 commit comments