From 808d92fc08d44308eca05de3997de2b7359f4dab Mon Sep 17 00:00:00 2001
From: Tomas Stupka <tomas.stupka@oracle.com>
Date: Mon, 28 Aug 2017 16:23:16 +0200
Subject: [PATCH] do not check predefined classes in grep pattern if it is
 supposed to be macthed as is (fixed=TRUE)

---
 .../oracle/truffle/r/nodes/builtin/base/GrepFunctions.java | 4 ++--
 .../truffle/r/test/builtins/TestBuiltin_gregexpr.java      | 7 +++++++
 .../truffle/r/test/builtins/TestBuiltin_regexpr.java       | 6 ++++++
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java
index 177902b34d..26a20439ed 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java
@@ -793,7 +793,7 @@ public class GrepFunctions {
                     throw RInternalError.unimplemented("multi-element patterns in regexpr not implemented yet");
                 }
                 String pattern = patternArg.getDataAt(0);
-                if (!perl) {
+                if (!perl && !fixed) {
                     pattern = RegExp.checkPreDefinedClasses(pattern);
                 }
                 // TODO: useBytes normally depends on the value of the parameter and (if false) on
@@ -1090,7 +1090,7 @@ public class GrepFunctions {
                     throw RInternalError.unimplemented("multi-element patterns in gregexpr not implemented yet");
                 }
                 String pattern = patternArg.getDataAt(0);
-                if (!perl) {
+                if (!perl && !fixed) {
                     pattern = RegExp.checkPreDefinedClasses(pattern);
                 }
                 // TODO: useBytes normally depends on the value of the parameter and (if false) on
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gregexpr.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gregexpr.java
index 1d55ebbc8d..08a34adfe0 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gregexpr.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_gregexpr.java
@@ -120,5 +120,12 @@ public class TestBuiltin_gregexpr extends TestBase {
         assertEval("{ x<-c(\"Aaa bbb Aaa Bbb\", \"Aaa bbb Aaa bbb\", \"Aaa bbb Aaa Bbb\"); p<-\"(?<first>[[:upper:]][[:lower:]]+) (?<last>[[:upper:]][[:lower:]]+)\"; gregexpr(p, x, perl=TRUE) }");
         assertEval("{ x<-c(\"Aaa bbb Aaa bbb\", \"Aaa Bbb Aaa Bbb\", \"Aaa bbb Aaa bbb\"); p<-\"(?<first>[[:upper:]][[:lower:]]+) (?<last>[[:upper:]][[:lower:]]+)\"; gregexpr(p, x, perl=TRUE) }");
 
+        assertEval("gregexpr(')', 'abc()', fixed = TRUE)");
+        assertEval("gregexpr('(', 'abc()', fixed = TRUE)");
+        assertEval("gregexpr(')', 'abc()', fixed = FALSE)");
+        assertEval("gregexpr('\\\\)', 'abc()', fixed = FALSE)");
+        assertEval(Output.IgnoreErrorMessage, "gregexpr('(', 'abc()', fixed = FALSE)");
+        assertEval("gregexpr('\\\\(', 'abc()', fixed = FALSE)");
+
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_regexpr.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_regexpr.java
index a4ed9501b8..a9e76b8ee7 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_regexpr.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_regexpr.java
@@ -118,5 +118,11 @@ public class TestBuiltin_regexpr extends TestBase {
         assertEval("{ x<-c(\"Aaa bbb Aaa bbb\", \"Aaa Bbb Aaa Bbb\"); p<-\"(?<first>[[:upper:]][[:lower:]]+) (?<last>[[:upper:]][[:lower:]]+)\"; regexpr(p, x, perl=TRUE) }");
         assertEval("{ x<-c(\"Aaa bbb Aaa bbb\", \"Aaa Bbb Aaa Bbb\", \"Aaa bbb Aaa bbb\"); p<-\"(?<first>[[:upper:]][[:lower:]]+) (?<last>[[:upper:]][[:lower:]]+)\"; regexpr(p, x, perl=TRUE) }");
 
+        assertEval("regexpr(')', 'abc()', fixed = TRUE)");
+        assertEval("regexpr('(', 'abc()', fixed = TRUE)");
+        assertEval("regexpr(')', 'abc()', fixed = FALSE)");
+        assertEval("regexpr('\\\\)', 'abc()', fixed = FALSE)");
+        assertEval(Output.IgnoreErrorMessage, "regexpr('(', 'abc()', fixed = FALSE)");
+        assertEval("regexpr('\\\\(', 'abc()', fixed = FALSE)");
     }
 }
-- 
GitLab