// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package eval import ( "fmt"; "go/ast"; "go/scanner"; "go/token"; ) type positioned interface { Pos() token.Position; } // A compiler captures information used throughout an entire // compilation. Currently it includes only the error handler. // // TODO(austin) This might actually represent package level, in which // case it should be package compiler. type compiler struct { errors scanner.ErrorHandler; numErrors int; silentErrors int; } func (a *compiler) diagAt(pos positioned, format string, args ...) { a.errors.Error(pos.Pos(), fmt.Sprintf(format, args)); a.numErrors++; } func (a *compiler) numError() int { return a.numErrors + a.silentErrors; } // The universal scope func newUniverse() *Scope { sc := &Scope{nil, 0}; sc.block = &block{ offset: 0, scope: sc, global: true, defs: make(map[string] Def) }; return sc; } var universe *Scope = newUniverse(); // TODO(austin) These can all go in stmt.go now type label struct { name string; desc string; // The PC goto statements should jump to, or nil if this label // cannot be goto'd (such as an anonymous for loop label). gotoPC *uint; // The PC break statements should jump to, or nil if a break // statement is invalid. breakPC *uint; // The PC continue statements should jump to, or nil if a // continue statement is invalid. continuePC *uint; // The position where this label was resolved. If it has not // been resolved yet, an invalid position. resolved token.Position; // The position where this label was first jumped to. used token.Position; } // A funcCompiler captures information used throughout the compilation // of a single function body. type funcCompiler struct { *compiler; fnType *FuncType; // Whether the out variables are named. This affects what // kinds of return statements are legal. outVarsNamed bool; *codeBuf; flow *flowBuf; labels map[string] *label; } // A blockCompiler captures information used throughout the compilation // of a single block within a function. type blockCompiler struct { *funcCompiler; block *block; // The label of this block, used for finding break and // continue labels. label *label; // The blockCompiler for the block enclosing this one, or nil // for a function-level block. parent *blockCompiler; }