47 lines
749 B
Go
47 lines
749 B
Go
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
|
|
}
|