From f62585118cade28409bf7c217260844cc054954f Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Tue, 28 Jul 2009 16:38:41 -0700 Subject: [PATCH] Fix segfault on unnamed function arguments. Make continue 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 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/usr/austin/eval/stmt.go b/usr/austin/eval/stmt.go index 68b5938243e..f769d29a2d8 100644 --- a/usr/austin/eval/stmt.go +++ b/usr/austin/eval/stmt.go @@ -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); } }