summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2018-05-16 11:13:19 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2018-05-21 21:14:44 +0200
commit533e51678eec129ed9039d7a45dcf5829322eda9 (patch)
treeee930a4973a2dac3b9369514840c612bd39a025b
parent6420d289234db811dba22498aa8f8af5402ff6be (diff)
downloadvala-533e51678eec129ed9039d7a45dcf5829322eda9.tar.gz
scanner: Accept backreferences \1 through \99 in regex literals
https://bugzilla.gnome.org/show_bug.cgi?id=728574
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/parser/bug728574.vala3
-rw-r--r--vala/valageniescanner.vala12
-rw-r--r--vala/valascanner.vala12
4 files changed, 26 insertions, 2 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f27cd25a6..2900039e9 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -268,6 +268,7 @@ TESTS = \
gir/bug742012.test \
gir/bug788775.test \
gir/delegate-alias-without-target.test \
+ parser/bug728574.vala \
parser/bug749576.vala \
$(NULL)
diff --git a/tests/parser/bug728574.vala b/tests/parser/bug728574.vala
new file mode 100644
index 000000000..01fe54584
--- /dev/null
+++ b/tests/parser/bug728574.vala
@@ -0,0 +1,3 @@
+void main () {
+ var r = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
+}
diff --git a/vala/valageniescanner.vala b/vala/valageniescanner.vala
index f717db665..894ab387d 100644
--- a/vala/valageniescanner.vala
+++ b/vala/valageniescanner.vala
@@ -240,7 +240,17 @@ public class Vala.Genie.Scanner {
}
break;
default:
- Report.error (get_source_reference (token_length_in_chars), "invalid escape sequence");
+ // back references \1 through \99
+ if (current[0].isdigit ()) {
+ current++;
+ token_length_in_chars++;
+ if (current[0].isdigit ()) {
+ current++;
+ token_length_in_chars++;
+ }
+ } else {
+ Report.error (get_source_reference (token_length_in_chars), "invalid escape sequence");
+ }
break;
}
} else if (current[0] == '\n') {
diff --git a/vala/valascanner.vala b/vala/valascanner.vala
index 7c4c75c0c..063b261be 100644
--- a/vala/valascanner.vala
+++ b/vala/valascanner.vala
@@ -242,7 +242,17 @@ public class Vala.Scanner {
}
break;
default:
- Report.error (get_source_reference (token_length_in_chars), "invalid escape sequence");
+ // back references \1 through \99
+ if (current[0].isdigit ()) {
+ current++;
+ token_length_in_chars++;
+ if (current[0].isdigit ()) {
+ current++;
+ token_length_in_chars++;
+ }
+ } else {
+ Report.error (get_source_reference (token_length_in_chars), "invalid escape sequence");
+ }
break;
}
} else if (current[0] == '\n') {