Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1786)

Unified Diff: src/regexp.js

Issue 567313003: RegExp: Add support for the ES6-proposed sticky flag (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add tests Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/regexp.js
diff --git a/src/regexp.js b/src/regexp.js
index d8e3ea49bec7e236a0d7dc1dcf4a624b460679eb..628fdd2a3de13746c4324e09de4916edf9309641 100644
--- a/src/regexp.js
+++ b/src/regexp.js
@@ -22,6 +22,8 @@ function DoConstructRegExp(object, pattern, flags) {
flags = (pattern.global ? 'g' : '')
+ (pattern.ignoreCase ? 'i' : '')
+ (pattern.multiline ? 'm' : '');
+ if (%HarmonyRegExps())
Yang 2014/09/15 09:23:16 While I'm fine with this (will be removed eventual
Erik Corry 2014/09/16 17:49:40 Done.
+ flags += (pattern.sticky ? 'y' : '');
pattern = pattern.source;
}
@@ -31,6 +33,7 @@ function DoConstructRegExp(object, pattern, flags) {
var global = false;
var ignoreCase = false;
var multiline = false;
+ var sticky = false;
for (var i = 0; i < flags.length; i++) {
var c = %_CallFunction(flags, i, StringCharAt);
switch (c) {
@@ -52,12 +55,18 @@ function DoConstructRegExp(object, pattern, flags) {
}
multiline = true;
break;
+ case 'y':
+ if (!%HarmonyRegExps() || sticky) {
+ throw MakeSyntaxError("invalid_regexp_flags", [flags]);
+ }
+ sticky = true;
+ break;
default:
throw MakeSyntaxError("invalid_regexp_flags", [flags]);
}
}
- %RegExpInitializeObject(object, pattern, global, ignoreCase, multiline);
+ %RegExpInitializeObject(object, pattern, global, ignoreCase, multiline, sticky);
// Call internal function to compile the pattern.
%RegExpCompile(object, pattern, flags);
@@ -227,7 +236,8 @@ function RegExpTest(string) {
// The expression checks whether this.source starts with '.*' and
// that the third char is not a '?'.
var regexp = this;
- if (%_StringCharCodeAt(regexp.source, 0) == 46 && // '.'
+ if (!this.sticky &&
Yang 2014/09/15 09:23:16 We also need to record .lastIndex for sticky. If I
Erik Corry 2014/09/16 17:49:40 Done, and also added string length check.
+ %_StringCharCodeAt(regexp.source, 0) == 46 && // '.'
%_StringCharCodeAt(regexp.source, 1) == 42 && // '*'
%_StringCharCodeAt(regexp.source, 2) != 63) { // '?'
regexp = TrimRegExp(regexp);
@@ -264,6 +274,7 @@ function RegExpToString() {
if (this.global) result += 'g';
if (this.ignoreCase) result += 'i';
if (this.multiline) result += 'm';
+ if (%HarmonyRegExps() && this.sticky) result += 'y';
return result;
}

Powered by Google App Engine
This is Rietveld 408576698