1
1
package io .github .overrun .memstack ;
2
2
3
+ import java .lang .foreign .Arena ;
3
4
import java .lang .foreign .MemorySegment ;
4
5
import java .util .Arrays ;
5
6
12
13
public class DefaultMemoryStack implements MemoryStack {
13
14
private final MemorySegment segment ;
14
15
private long [] frames ;
16
+ private Arena [] arenas ;
15
17
private long offset = 0L ;
18
+ private Arena arena ;
16
19
private int frameIndex = 0 ;
17
20
18
21
/**
@@ -24,6 +27,7 @@ public class DefaultMemoryStack implements MemoryStack {
24
27
public DefaultMemoryStack (MemorySegment segment , int frameCount ) {
25
28
this .segment = segment ;
26
29
this .frames = new long [frameCount ];
30
+ this .arenas = new Arena [frameCount ];
27
31
}
28
32
29
33
private MemorySegment trySlice (long byteSize , long byteAlignment ) {
@@ -49,8 +53,10 @@ public MemorySegment allocate(long byteSize, long byteAlignment) {
49
53
public MemoryStack push () {
50
54
if (frameIndex >= frames .length ) {
51
55
frames = Arrays .copyOf (frames , frames .length * 3 / 2 );
56
+ arenas = Arrays .copyOf (arenas , arenas .length * 3 / 2 );
52
57
}
53
58
frames [frameIndex ] = offset ;
59
+ arenas [frameIndex ] = arena ;
54
60
frameIndex ++;
55
61
return this ;
56
62
}
@@ -62,6 +68,10 @@ public void pop() {
62
68
}
63
69
frameIndex --;
64
70
offset = frames [frameIndex ];
71
+ if (arena != null ) {
72
+ arena .close ();
73
+ }
74
+ arena = arenas [frameIndex ];
65
75
}
66
76
67
77
@ Override
@@ -88,4 +98,29 @@ public void setPointer(long pointer) {
88
98
public MemorySegment segment () {
89
99
return segment ;
90
100
}
101
+
102
+ @ Override
103
+ public Arena asArena () {
104
+ if (arena == null ) {
105
+ arena = new Arena () {
106
+ private final Arena arena = Arena .ofConfined ();
107
+
108
+ @ Override
109
+ public MemorySegment allocate (long byteSize , long byteAlignment ) {
110
+ return DefaultMemoryStack .this .allocate (byteSize , byteAlignment );
111
+ }
112
+
113
+ @ Override
114
+ public MemorySegment .Scope scope () {
115
+ return arena .scope ();
116
+ }
117
+
118
+ @ Override
119
+ public void close () {
120
+ arena .close ();
121
+ }
122
+ };
123
+ }
124
+ return arena ;
125
+ }
91
126
}
0 commit comments