package vm import ( "monkey/internal/code" "monkey/internal/object" "unsafe" ) var cache = NewFrameCache(32) type Frame struct { cl *object.Closure ip int basePointer int } func NewFrame(cl *object.Closure, basePointer int) *Frame { key := uint(uintptr(unsafe.Pointer(cl))) + uint(basePointer) if frame, ok := cache.Get(key); ok { frame.Reset() return frame } frame := &Frame{ cl: cl, ip: -1, basePointer: basePointer, } cache.Put(key, frame) return frame } // NextOp ... func (f *Frame) NextOp() code.Opcode { return code.Opcode(f.Instructions()[f.ip+1]) } func (f *Frame) Reset() { f.ip = -1 } func (f *Frame) Instructions() code.Instructions { return f.cl.Fn.Instructions }