add additional regex property to regex literals containing pattern and flags

This commit is contained in:
Sebastian McKenzie 2014-10-25 09:02:24 +11:00
parent 0258dafa8a
commit 397d87fd11

View File

@ -934,18 +934,36 @@
// Need to use `readWord1` because '\uXXXX' sequences are allowed
// here (don't ask).
var mods = readWord1();
var tmp = content;
if (mods) {
var validFlags = /^[gmsiy]*$/;
if (options.ecmaVersion >= 6) validFlags = /^[gmsiyu]*$/;
if (!validFlags.test(mods)) raise(start, "Invalid regular expression flag");
if (mods.indexOf('u') >= 0) {
// Replace each astral symbol and every Unicode code point
// escape sequence that represents such a symbol with a single
// ASCII symbol to avoid throwing on regular expressions that
// are only valid in combination with the `/u` flag.
tmp = tmp
.replace(/\\u\{([0-9a-fA-F]{5,6})\}/g, 'x')
.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, 'x');
}
}
// Detect invalid regular expressions.
try {
var value = new RegExp(content, mods);
new RegExp(tmp);
} catch (e) {
if (e instanceof SyntaxError) raise(start, "Error parsing regular expression: " + e.message);
raise(e);
}
return finishToken(_regexp, value);
// Get a regular expression object for this pattern-flag pair, or `null` in
// case the current environment doesn't support the flags it uses.
try {
var value = new RegExp(content, mods);
} catch (err) {
value = null;
}
return finishToken(_regexp, {pattern: content, flags: mods, value: value});
}
// Read an integer in the given radix. Return null if zero digits
@ -2010,7 +2028,15 @@
}
return id;
case _num: case _string: case _regexp:
case _regexp:
var node = startNode();
node.regex = {pattern: tokVal.pattern, flags: tokVal.flags};
node.value = tokVal.value;
node.raw = input.slice(tokStart, tokEnd);
next();
return finishNode(node, "Literal");
case _num: case _string:
var node = startNode();
node.value = tokVal;
node.raw = input.slice(tokStart, tokEnd);