@@ -42,12 +42,14 @@ public static interface MarkerAction {
42
42
protected static class ExtensionCallStackEntry {
43
43
44
44
protected final ExtensionCallStackEntry previous ;
45
+ protected ValueWrapper preservedObject ;
45
46
protected ArrayList <ValueWrapper > preservedObjects ;
46
47
protected final boolean keywordsGiven ;
47
48
protected Object specialVariables ;
48
49
protected final Object block ;
49
50
protected CapturedException capturedException ;
50
- protected ArrayList <ValueWrapper > forMarking ;
51
+ protected ValueWrapper markOnExitObject ;
52
+ protected ArrayList <ValueWrapper > markOnExitObjects ;
51
53
protected Object [] marks ;
52
54
protected int marksIndex = 0 ;
53
55
@@ -73,7 +75,24 @@ public ExtensionCallStack(Object specialVariables, Object block) {
73
75
}
74
76
75
77
public boolean hasKeptObjects () {
76
- return current .preservedObjects != null ;
78
+ return current .preservedObject != null ;
79
+ }
80
+
81
+ public void keepObject (ValueWrapper value ) {
82
+ if (current .preservedObject == null ) {
83
+ current .preservedObject = value ;
84
+ } else {
85
+ keepObjectOnList (value );
86
+ }
87
+ }
88
+
89
+ @ TruffleBoundary
90
+ private void keepObjectOnList (ValueWrapper value ) {
91
+ if (current .preservedObjects == null ) {
92
+ current .preservedObjects = new ArrayList <>();
93
+ current .preservedObjects .add (current .preservedObject );
94
+ }
95
+ current .preservedObjects .add (value );
77
96
}
78
97
79
98
public ArrayList <ValueWrapper > getKeptObjects () {
@@ -85,17 +104,42 @@ public ArrayList<ValueWrapper> getKeptObjects() {
85
104
return current .preservedObjects ;
86
105
}
87
106
107
+ public void markOnExitObject (ValueWrapper value ) {
108
+ if (current .markOnExitObject == null ) {
109
+ current .markOnExitObject = value ;
110
+ } else {
111
+ markOnExitObjectOnList (value );
112
+ }
113
+ }
114
+
115
+ @ TruffleBoundary
116
+ private void markOnExitObjectOnList (ValueWrapper value ) {
117
+ if (current .markOnExitObjects == null ) {
118
+ current .markOnExitObjects = new ArrayList <>();
119
+ current .markOnExitObjects .add (current .markOnExitObject );
120
+ }
121
+ current .markOnExitObjects .add (value );
122
+ }
123
+
88
124
public ArrayList <ValueWrapper > getMarkOnExitObjects () {
89
125
assert current .previous != null ;
90
126
91
- if (current .forMarking == null ) {
92
- current .forMarking = new ArrayList <>();
127
+ if (current .markOnExitObjects == null ) {
128
+ current .markOnExitObjects = new ArrayList <>();
93
129
}
94
- return current .forMarking ;
130
+ return current .markOnExitObjects ;
95
131
}
96
132
97
133
public boolean hasMarkObjects () {
98
- return current .forMarking != null ;
134
+ return current .markOnExitObject != null ;
135
+ }
136
+
137
+ public boolean hasSingleMarkObject () {
138
+ return current .markOnExitObject != null && current .markOnExitObjects == null ;
139
+ }
140
+
141
+ public ValueWrapper getSingleMarkObject () {
142
+ return current .markOnExitObject ;
99
143
}
100
144
101
145
public void pop () {
@@ -135,7 +179,7 @@ public void startMarking(ExtensionCallStack stack, Object[] oldMarks) {
135
179
if (oldMarks == null ) {
136
180
stack .current .marks = ArrayUtils .EMPTY_ARRAY ;
137
181
} else {
138
- stack .current .marks = new Object [ oldMarks . length ] ;
182
+ stack .current .marks = oldMarks ;
139
183
}
140
184
stack .current .marksIndex = 0 ;
141
185
}
0 commit comments