Commit 920c6106 authored by Russ Cox's avatar Russ Cox

top-level func

R=austin
DELTA=21  (5 added, 10 deleted, 6 changed)
OCL=34355
CL=34355
parent 851497bc
...@@ -335,26 +335,21 @@ func (a *stmtCompiler) compileDeclStmt(s *ast.DeclStmt) { ...@@ -335,26 +335,21 @@ func (a *stmtCompiler) compileDeclStmt(s *ast.DeclStmt) {
a.silentErrors++; a.silentErrors++;
case *ast.FuncDecl: case *ast.FuncDecl:
log.Crash("FuncDecl at statement level"); if !a.block.global {
log.Crash("FuncDecl at statement level");
}
case *ast.GenDecl: case *ast.GenDecl:
switch decl.Tok { if decl.Tok == token.IMPORT && !a.block.global {
case token.IMPORT:
log.Crash("import at statement level"); log.Crash("import at statement level");
case token.CONST:
log.Crashf("%v not implemented", decl.Tok);
case token.TYPE:
a.compileTypeDecl(a.block, decl);
case token.VAR:
a.compileVarDecl(decl);
} }
default: default:
log.Crashf("Unexpected Decl type %T", s.Decl); log.Crashf("Unexpected Decl type %T", s.Decl);
} }
a.compileDecl(s.Decl);
} }
// decl might or might not be at top level;
func (a *stmtCompiler) compileVarDecl(decl *ast.GenDecl) { func (a *stmtCompiler) compileVarDecl(decl *ast.GenDecl) {
for _, spec := range decl.Specs { for _, spec := range decl.Specs {
spec := spec.(*ast.ValueSpec); spec := spec.(*ast.ValueSpec);
...@@ -380,7 +375,6 @@ func (a *stmtCompiler) compileVarDecl(decl *ast.GenDecl) { ...@@ -380,7 +375,6 @@ func (a *stmtCompiler) compileVarDecl(decl *ast.GenDecl) {
} }
} }
// decl is top level
func (a *stmtCompiler) compileDecl(decl ast.Decl) { func (a *stmtCompiler) compileDecl(decl ast.Decl) {
switch d := decl.(type) { switch d := decl.(type) {
case *ast.BadDecl: case *ast.BadDecl:
...@@ -395,8 +389,6 @@ func (a *stmtCompiler) compileDecl(decl ast.Decl) { ...@@ -395,8 +389,6 @@ func (a *stmtCompiler) compileDecl(decl ast.Decl) {
// Declare and initialize v before compiling func // Declare and initialize v before compiling func
// so that body can refer to itself. // so that body can refer to itself.
c := a.block.DefineConst(d.Name.Value, a.pos, decl.Type, decl.Type.Zero()); c := a.block.DefineConst(d.Name.Value, a.pos, decl.Type, decl.Type.Zero());
// TODO(rsc): How to mark v as constant
// so the type checker rejects assignments to it?
fn := a.compileFunc(a.block, decl, d.Body); fn := a.compileFunc(a.block, decl, d.Body);
if fn == nil { if fn == nil {
return; return;
......
...@@ -331,6 +331,9 @@ var stmtTests = []test { ...@@ -331,6 +331,9 @@ var stmtTests = []test {
CErr("x := make(map[int] int); (func(a,b int){})(x[0])", "not enough"), CErr("x := make(map[int] int); (func(a,b int){})(x[0])", "not enough"),
CErr("x := make(map[int] int); x[1] = oneTwo()", "too many"), CErr("x := make(map[int] int); x[1] = oneTwo()", "too many"),
RErr("x := make(map[int] int); i = x[1]", "key '1' not found"), RErr("x := make(map[int] int); i = x[1]", "key '1' not found"),
// Functions
Val2("func fib(n int) int { if n <= 2 { return n } return fib(n-1) + fib(n-2) }", "fib(4)", 5, "fib(10)", 89),
} }
func TestStmt(t *testing.T) { func TestStmt(t *testing.T) {
......
...@@ -73,7 +73,7 @@ func (w *World) compileStmts(stmts []ast.Stmt) (Code, os.Error) { ...@@ -73,7 +73,7 @@ func (w *World) compileStmts(stmts []ast.Stmt) (Code, os.Error) {
return &stmtCode{w, fc.get()}, nil; return &stmtCode{w, fc.get()}, nil;
} }
func (w *World) compileDecls(decls []ast.Decl) (Code, os.Error) { func (w *World) compileDecls(decls []ast.Decl) (Code, os.Error) {
stmts := make([]ast.Stmt, len(decls)); stmts := make([]ast.Stmt, len(decls));
for i, d := range decls { for i, d := range decls {
stmts[i] = &ast.DeclStmt{d}; stmts[i] = &ast.DeclStmt{d};
...@@ -144,7 +144,7 @@ func (w *World) Compile(text string) (Code, os.Error) { ...@@ -144,7 +144,7 @@ func (w *World) Compile(text string) (Code, os.Error) {
// Otherwise try as DeclList. // Otherwise try as DeclList.
decls, err1 := parser.ParseDeclList("input", text); decls, err1 := parser.ParseDeclList("input", text);
if err == nil { if err1 == nil {
return w.compileDecls(decls); return w.compileDecls(decls);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment