| // 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/scanner" | |
| "go/token" | |
| ) | |
| // 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 { | |
| fset *token.FileSet | |
| errors scanner.ErrorHandler | |
| numErrors int | |
| silentErrors int | |
| } | |
| func (a *compiler) diagAt(pos token.Pos, format string, args ...interface{}) { | |
| a.errors.Error(a.fset.Position(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.Pos | |
| // The position where this label was first jumped to. | |
| used token.Pos | |
| } | |
| // 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 | |
| } |