func (f *flowBuf) putLabel(name string, b *block) {
	f.labels[name] = newFlowBlock("", b)
}
putLabel captures the block at a label.
package eval
import (
	"go/ast"
	"go/build"
        "go/importer"
	"go/parser"
	"go/token"
        "go/types"
	"log"
	"math/big"
	"path/filepath"
	"strconv"
)
const (
	returnPC = ^uint(0)
	badPC    = ^uint(1)
)
var g_importer types.Importer = importer.Default()
type stmtCompiler struct {
	*blockCompiler
	pos token.Pos
	stmtLabel *label
}
func (a *stmtCompiler) diag(format string, args ...interface{}) {
	a.diagAt(a.pos, format, args...)
}
type flowEnt struct {
	cond bool
	term bool
	jumps []*uint
	visited bool
}
type flowBlock struct {
	target string
	block *block
	numVars []int
}
type flowBuf struct {
	cb *codeBuf
	ents map[uint]*flowEnt
	gotos map[token.Pos]*flowBlock
	labels map[string]*flowBlock
}
func newFlowBuf(cb *codeBuf) *flowBuf {
	return &flowBuf{cb, make(map[uint]*flowEnt), make(map[token.Pos]*flowBlock), make(map[string]*flowBlock)}
}
func (f *flowBuf) put(cond bool, term bool, jumps []*uint) {
	pc := f.cb.nextPC()
	if ent, ok := f.ents[pc]; ok {
		log.Panicf("Flow entry already exists at PC %d: %+v", pc, ent)
	}
	f.ents[pc] = &flowEnt{cond, term, jumps, false}
}
func (f *flowBuf) putTerm() { f.put(false, true, nil) }
func (f *flowBuf) put1(cond bool, jumpPC *uint) {
	f.put(cond, false, []*uint{jumpPC})
}
func newFlowBlock(target string, b *block) *flowBlock {
	for b.numVars == 0 && b.outer != nil && b.outer.scope == b.scope {
		b = b.outer
	}
	n := 0
	for bp := b; bp.scope == b.scope; bp = bp.outer {
		n++
	}
	numVars := make([]int, n)
	i := 0
	for bp := b; i < n; bp = bp.outer {
		numVars[i] = bp.numVars
		i++
	}
	return &flowBlock{target, b, numVars}
}
func (f *flowBuf) putGoto(pos token.Pos, target string, b *block) {
	f.gotos[pos] = newFlowBlock(target, b)
}