From baaa16cee7aa78cfd8ec4167bc1c1e20f7d319bb Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Wed, 20 Nov 2013 10:56:28 +0100 Subject: [PATCH] Make sure syntax errors in regular expressions raise conforming exceptions Just letting the error from new RegExp through creates an exception missing the pos/loc/raisedAt properties. Issue #82 Issue #81 --- acorn.js | 8 +++++++- index.html | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/acorn.js b/acorn.js index e03f6f2e2e..ec3d4ed7e2 100644 --- a/acorn.js +++ b/acorn.js @@ -767,7 +767,13 @@ // here (don't ask). var mods = readWord1(); if (mods && !/^[gmsiy]*$/.test(mods)) raise(start, "Invalid regexp flag"); - return finishToken(_regexp, new RegExp(content, mods)); + try { + var value = new RegExp(content, mods); + } catch (e) { + if (e instanceof SyntaxError) raise(start, e.message); + raise(e); + } + return finishToken(_regexp, value); } // Read an integer in the given radix. Return null if zero digits diff --git a/index.html b/index.html index 8b53efce15..9c86b83d78 100644 --- a/index.html +++ b/index.html @@ -532,7 +532,13 @@ since a '/' inside a '[]' set does not end the expression.

++tokPos;

Need to use readWord1 because '\uXXXX' sequences are allowed here (don't ask).

    var mods = readWord1();
     if (mods && !/^[gmsiy]*$/.test(mods)) raise(start, "Invalid regexp flag");
-    return finishToken(_regexp, new RegExp(content, mods));
+    try {
+      var value = new RegExp(content, mods);
+    } catch (e) {
+      if (e instanceof SyntaxError) raise(start, e.message);
+      raise(e);
+    }
+    return finishToken(_regexp, value);
   }

Read an integer in the given radix. Return null if zero digits were read, the integer value otherwise. When len is given, this will return null unless the integer has exactly len digits.

  function readInt(radix, len) {