From 52853efabb8acd1c9366127e451ae05a192c1a8e Mon Sep 17 00:00:00 2001 From: Zbynek Slajchrt <zbynek.slajchrt@oracle.com> Date: Mon, 2 Jul 2018 15:50:17 +0200 Subject: [PATCH] DT package enabled --- .../com/oracle/truffle/r/runtime/RegExp.java | 12 ++++- .../r/runtime/conn/FileConnections.java | 48 +++++++++++++++---- .../r/test/builtins/TestBuiltin_strsplit.java | 3 ++ .../r/test/library/base/TestConnections.java | 5 ++ 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RegExp.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RegExp.java index d9a28ada05..2c8a6e7856 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RegExp.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RegExp.java @@ -118,7 +118,17 @@ public class RegExp { } break; case ']': - withinCharClass = false; + // Detecting that the current ']' closes "empty brackets '[]' + boolean closingEmptyBrackets = (i > 0 && result.charAt(i - 1) == '[' && + (i < 2 || result.charAt(i - 2) != '\\')); + // To leave a character class open we must already be within some and the + // current ']' must be closing empty brackets. + // Examples: + // ] - there is no character class, so the current ']' has no effect + // [\[] - the ']' closes the character class + // []\[] - the 1st ']' leaves the character class open, while the 2nd one closes + // it + withinCharClass &= closingEmptyBrackets; break; } i++; diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java index 7149373f62..b1717cbd09 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java @@ -571,10 +571,9 @@ public class FileConnections { @Override protected long seekInternal(long offset, SeekMode seekMode, SeekRWMode seekRWMode) throws IOException { - long result = raf.getFilePointer(); + long result; switch (seekMode) { case ENQUIRE: - return result; case START: break; default: @@ -583,17 +582,31 @@ public class FileConnections { switch (seekRWMode) { case LAST: if (lastMode == SeekRWMode.READ) { - readOffset = offset; + result = readOffset; + if (seekMode != SeekMode.ENQUIRE) { + readOffset = offset; + } } else { - writeOffset = offset; + result = writeOffset; + if (seekMode != SeekMode.ENQUIRE) { + writeOffset = offset; + } } break; case READ: - readOffset = offset; + result = readOffset; + if (seekMode != SeekMode.ENQUIRE) { + readOffset = offset; + } break; case WRITE: - writeOffset = offset; + result = writeOffset; + if (seekMode != SeekMode.ENQUIRE) { + writeOffset = offset; + } break; + default: + throw RInternalError.shouldNotReachHere(); } return result; } @@ -601,25 +614,39 @@ public class FileConnections { @Override public String[] readLines(int n, EnumSet<ReadLineWarning> warn, boolean skipNul) throws IOException { setReadPosition(); + // the readOffset field is updated from within super.readLines via the overridden + // updateReadOffset return super.readLines(n, warn, skipNul); } @Override public int readBin(ByteBuffer buffer) throws IOException { setReadPosition(); - return super.readBin(buffer); + try { + return super.readBin(buffer); + } finally { + readOffset = raf.getFilePointer(); + } } @Override public String readChar(int nchars, boolean useBytes) throws IOException { setReadPosition(); - return super.readChar(nchars, useBytes); + try { + return super.readChar(nchars, useBytes); + } finally { + readOffset = raf.getFilePointer(); + } } @Override public byte[] readBinChars() throws IOException { setReadPosition(); - return super.readBinChars(); + try { + return super.readBinChars(); + } finally { + readOffset = raf.getFilePointer(); + } } @TruffleBoundary @@ -654,18 +681,21 @@ public class FileConnections { public void writeBin(ByteBuffer buffer) throws IOException { setWritePosition(); super.writeBin(buffer); + writeOffset = raf.getFilePointer(); } @Override public void writeChar(String s, int pad, String eos, boolean useBytes) throws IOException { setWritePosition(); super.writeChar(s, pad, eos, useBytes); + writeOffset = raf.getFilePointer(); } @Override public void writeString(String s, boolean nl) throws IOException { setWritePosition(); super.writeString(s, nl); + writeOffset = raf.getFilePointer(); } @Override diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java index 2910d4690b..1f7d45dee4 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java @@ -154,5 +154,8 @@ public class TestBuiltin_strsplit extends TestBase { assertEval("strsplit(c('a1a', 'a1b'), '1', fixed=FALSE)"); assertEval("strsplit(c('','a , b'), '[[:space:]]*,[[:space:]]*')"); + assertEval("strsplit('a[1][1]=x11&a[1][2]=x12', ']')"); + assertEval("strsplit('a[1][1]=x11&a[1][2]=x12', '[[]')"); + assertEval("strsplit('a[1][1]=x11&a[1][2]=x12', '[][]')"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestConnections.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestConnections.java index f45bf32c92..9129f3984c 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestConnections.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestConnections.java @@ -265,6 +265,11 @@ public class TestConnections extends TestRBase { assertEval("truncate(fifo('__fifo_982346798', 'r', blocking=T)); unlink('__fifo_982346798')"); } + @Test + public void testSeek() { + assertEval("f1 <- file(open='w+b', encoding='UTF-8'); writeBin(charToRaw(\"abcd\"), f1); seek(f1); seek(f1,0); seek(f1)"); + } + private static final String[] LVAL = arr("T", "F"); private static String[] arr(String... args) { -- GitLab