package vm import ( "monkey/internal/code" "monkey/internal/object" ) type Frame struct { cl *object.Closure ip int basePointer int } func NewFrame(cl *object.Closure, basePointer int) Frame { return Frame{ cl: cl, basePointer: basePointer, } } func (f *Frame) Closure() *object.Closure { return f.cl } func (f *Frame) GetFree(idx uint8) object.Object { return f.cl.Free[idx] } func (f *Frame) SetFree(idx uint8, obj object.Object) { f.cl.Free[idx] = obj } func (f *Frame) SetIP(ip int) { f.ip = ip } func (f Frame) PeekNextOp() code.Opcode { return code.Opcode(f.cl.Fn.Instructions[f.ip]) } func (f *Frame) ReadNextOp() code.Opcode { op := code.Opcode(f.cl.Fn.Instructions[f.ip]) f.ip++ return op } func (f *Frame) ReadUint8() uint8 { n := code.ReadUint8(f.cl.Fn.Instructions[f.ip:]) f.ip++ return n } func (f *Frame) ReadUint16() uint16 { n := code.ReadUint16(f.cl.Fn.Instructions[f.ip:]) f.ip += 2 return n } func (f Frame) Instructions() code.Instructions { return f.cl.Fn.Instructions }