diff --git a/internal/vm/frame.go b/internal/vm/frame.go index 4d40d22..d18e159 100644 --- a/internal/vm/frame.go +++ b/internal/vm/frame.go @@ -1,10 +1,14 @@ package vm import ( + "fmt" + "github.com/NicoNex/tau/internal/code" "github.com/NicoNex/tau/internal/obj" ) +var cache = make(map[string]*Frame) + type Frame struct { cl *obj.Closure ip int @@ -12,11 +16,22 @@ type Frame struct { } func NewFrame(cl *obj.Closure, basePointer int) *Frame { - return &Frame{ + key := fmt.Sprintf("%p:%d", cl, basePointer) + if frame, ok := cache[key]; ok { + frame.Reset() + return frame + } + frame := &Frame{ cl: cl, ip: -1, basePointer: basePointer, } + cache[key] = frame + return frame +} + +func (f *Frame) Reset() { + f.ip = -1 } func (f *Frame) Instructions() code.Instructions {