Skip to content

Commit 005ab2b

Browse files
committed
TRegex: fix possible duplicate entries in CounterTrackerList
1 parent eabaab2 commit 005ab2b

File tree

3 files changed

+15
-13
lines changed

3 files changed

+15
-13
lines changed

regex/src/com.oracle.truffle.regex.test/src/com/oracle/truffle/regex/tregex/test/OracleDBTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,6 +1615,7 @@ public void generatedTests() {
16151615
"axaxeageagageaxeaxeaxageaxagageaxeaxagageagaxaxeagaxeaxagagaxeagageaxeaxeagageaxeaxagaxaxaxageageagageagaxaxaxageaxageaxeageaxaxaxaxaxagaxagageaxeageageageaxeaxeaxageaxaxeaxeagaxagageaxeageaxeaxaxeaxageaxaxeagaxageageaz",
16161616
0, false);
16171617
test("((b\\2{1400,1400})+|)*a", "", "a", 0, true, 0, 1, 0, 0, -1, -1);
1618+
test("\\S(\\w?\\W){8,9}\\Z", "", "-a--------- ---------", 0, true, 13, 22, 21, 22);
16181619
test("(a{1100,1100})\\1", "i", "a".repeat(2400), 0, true, 0, 2200, 0, 1100);
16191620
test("[a]\\S{213,213}bcdz", "", "a".repeat(215) + ("bcxd" + "a".repeat(213)).repeat(3), 0, false);
16201621

regex/src/com.oracle.truffle.regex/src/com/oracle/truffle/regex/tregex/nodes/dfa/CounterTrackerList.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -262,14 +262,6 @@ private void swap(int from, int to, long[] fixedData) {
262262
}
263263
}
264264

265-
private void ensureCanAlloc1(int sId, long[] fixedData, int[][] intArrays) {
266-
int bufferPointer = getBufferPointer(sId, fixedData);
267-
int[] buf = intArrays[bufferPointer];
268-
if (getStart(sId, fixedData) + getSize(sId, fixedData) == buf.length) {
269-
intArrays[bufferPointer] = Arrays.copyOf(buf, buf.length << 1);
270-
}
271-
}
272-
273265
private void incAll(int sId, long[] fixedData, int[][] intArrays) {
274266
int[] buffer = getBuffer(sId, fixedData, intArrays);
275267
int offset = getOffset(sId, fixedData) + 1;
@@ -306,11 +298,20 @@ private void removeMaxValue(int sId, long[] fixedData, int[] buffer, int start,
306298
}
307299

308300
private void set1(int sId, long[] fixedData, int[][] intArrays) {
309-
ensureCanAlloc1(sId, fixedData, intArrays);
310-
int[] buf = getBuffer(sId, fixedData, intArrays);
301+
int bufferPointer = getBufferPointer(sId, fixedData);
302+
int[] buf = intArrays[bufferPointer];
303+
int start = getStart(sId, fixedData);
311304
int size = getSize(sId, fixedData);
312-
buf[getStart(sId, fixedData) + size] = getOffset(sId, fixedData) - 1;
313-
setSize(sId, fixedData, size + 1);
305+
int offset = getOffset(sId, fixedData);
306+
int insert1Value = offset - 1;
307+
if (size == 0 || buf[start + size - 1] != insert1Value) {
308+
if (start + size == buf.length) {
309+
buf = Arrays.copyOf(buf, buf.length << 1);
310+
intArrays[bufferPointer] = buf;
311+
}
312+
buf[start + size] = insert1Value;
313+
setSize(sId, fixedData, size + 1);
314+
}
314315
}
315316

316317
@TruffleBoundary

regex/src/com.oracle.truffle.regex/src/com/oracle/truffle/regex/tregex/nodes/dfa/CounterTrackerLong.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ private boolean intersect(int sId, long[] fixedData, long mask) {
158158

159159
@Override
160160
public String dumpState(int sId, long[] fixedData, int[][] intArrays) {
161-
long[] bs = {fixedData[mapId(sId)]};
161+
long[] bs = {fixedData[mapId(sId)] & BitSets.getRange(0, max - 1)};
162162
int[] values = new int[BitSets.size(bs)];
163163
PrimitiveIterator.OfInt it = BitSets.iterator(bs);
164164
for (int i = values.length - 1; i >= 0; i--) {

0 commit comments

Comments
 (0)