]> Cypherpunks repositories - gostls13.git/commitdiff
Fix segfault on unnamed function arguments. Make continue
authorAustin Clements <aclements@csail.mit.edu>
Tue, 28 Jul 2009 23:38:41 +0000 (16:38 -0700)
committerAustin Clements <aclements@csail.mit.edu>
Tue, 28 Jul 2009 23:38:41 +0000 (16:38 -0700)
jump to the post statement instead of the condition check.

R=rsc
APPROVED=rsc
DELTA=10  (6 added, 1 deleted, 3 changed)
OCL=32359
CL=32379

usr/austin/eval/stmt.go

index 68b5938243ef871b0812f1130e0ad76bd139cd08..f769d29a2d8c77f79c3963c8192d68afe3991e82 100644 (file)
@@ -588,7 +588,7 @@ func (a *stmtCompiler) DoForStmt(s *ast.ForStmt) {
                bc.compileStmt(s.Init);
        }
 
-       var bodyPC, checkPC, endPC uint;
+       var bodyPC, postPC, checkPC, endPC uint;
 
        // Jump to condition check.  We generate slightly less code by
        // placing the condition check after the body.
@@ -598,11 +598,12 @@ func (a *stmtCompiler) DoForStmt(s *ast.ForStmt) {
        bodyPC = a.nextPC();
        body := bc.enterChild();
        body.breakPC = &endPC;
-       body.continuePC = &checkPC;
+       body.continuePC = &postPC;
        body.compileStmts(s.Body);
        body.exit();
 
        // Compile post, if any
+       postPC = a.nextPC();
        if s.Post != nil {
                // TODO(austin) Does the parser disallow short
                // declarations in s.Post?
@@ -711,13 +712,17 @@ func (a *compiler) compileFunc(scope *Scope, decl *FuncDecl, body *ast.BlockStmt
        // corresponding function.
        bodyScope := scope.Fork();
        for i, t := range decl.Type.In {
-               bodyScope.DefineVar(decl.InNames[i].Value, t);
+               if decl.InNames[i] != nil {
+                       bodyScope.DefineVar(decl.InNames[i].Value, t);
+               } else {
+                       // TODO(austin) Not technically a temp
+                       bodyScope.DefineTemp(t);
+               }
        }
        for i, t := range decl.Type.Out {
                if decl.OutNames[i] != nil {
                        bodyScope.DefineVar(decl.OutNames[i].Value, t);
                } else {
-                       // TODO(austin) Not technically a temp
                        bodyScope.DefineTemp(t);
                }
        }