prologic revised this gist . Go to revision
1 file changed, 43 insertions
tau.patch(file created)
@@ -0,0 +1,43 @@ | |||
1 | + | diff --git a/internal/vm/frame.go b/internal/vm/frame.go | |
2 | + | index 4d40d22..d18e159 100644 | |
3 | + | --- a/internal/vm/frame.go | |
4 | + | +++ b/internal/vm/frame.go | |
5 | + | @@ -1,10 +1,14 @@ | |
6 | + | package vm | |
7 | + | ||
8 | + | import ( | |
9 | + | + "fmt" | |
10 | + | + | |
11 | + | "github.com/NicoNex/tau/internal/code" | |
12 | + | "github.com/NicoNex/tau/internal/obj" | |
13 | + | ) | |
14 | + | ||
15 | + | +var cache = make(map[string]*Frame) | |
16 | + | + | |
17 | + | type Frame struct { | |
18 | + | cl *obj.Closure | |
19 | + | ip int | |
20 | + | @@ -12,11 +16,22 @@ type Frame struct { | |
21 | + | } | |
22 | + | ||
23 | + | func NewFrame(cl *obj.Closure, basePointer int) *Frame { | |
24 | + | - return &Frame{ | |
25 | + | + key := fmt.Sprintf("%p:%d", cl, basePointer) | |
26 | + | + if frame, ok := cache[key]; ok { | |
27 | + | + frame.Reset() | |
28 | + | + return frame | |
29 | + | + } | |
30 | + | + frame := &Frame{ | |
31 | + | cl: cl, | |
32 | + | ip: -1, | |
33 | + | basePointer: basePointer, | |
34 | + | } | |
35 | + | + cache[key] = frame | |
36 | + | + return frame | |
37 | + | +} | |
38 | + | + | |
39 | + | +func (f *Frame) Reset() { | |
40 | + | + f.ip = -1 | |
41 | + | } | |
42 | + | ||
43 | + | func (f *Frame) Instructions() code.Instructions { |
Newer
Older