// 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 "os"

/*
 * Virtual machine
 */

type Thread struct {
	abort	chan os.Error;
	pc	uint;
	// The execution frame of this function.  This remains the
	// same throughout a function invocation.
	f	*Frame;
}

type code []func(*Thread)

func (i code) exec(t *Thread) {
	opc := t.pc;
	t.pc = 0;
	l := uint(len(i));
	for t.pc < l {
		pc := t.pc;
		t.pc++;
		i[pc](t);
	}
	t.pc = opc;
}

/*
 * Code buffer
 */

type codeBuf struct {
	instrs code;
}

func newCodeBuf() *codeBuf	{ return &codeBuf{make(code, 0, 16)} }

func (b *codeBuf) push(instr func(*Thread)) {
	n := len(b.instrs);
	if n >= cap(b.instrs) {
		a := make(code, n, n*2);
		for i := range b.instrs {
			a[i] = b.instrs[i]
		}
		b.instrs = a;
	}
	b.instrs = b.instrs[0 : n+1];
	b.instrs[n] = instr;
}

func (b *codeBuf) nextPC() uint	{ return uint(len(b.instrs)) }

func (b *codeBuf) get() code {
	// Freeze this buffer into an array of exactly the right size
	a := make(code, len(b.instrs));
	for i := range b.instrs {
		a[i] = b.instrs[i]
	}
	return code(a);
}

/*
 * User-defined functions
 */

type evalFunc struct {
	outer		*Frame;
	frameSize	int;
	code		code;
}

func (f *evalFunc) NewFrame() *Frame	{ return f.outer.child(f.frameSize) }

func (f *evalFunc) Call(t *Thread)	{ f.code.exec(t) }
