diff options
Diffstat (limited to 'lib/parse.js')
-rw-r--r-- | lib/parse.js | 65 |
1 files changed, 32 insertions, 33 deletions
diff --git a/lib/parse.js b/lib/parse.js index 37f06df7..9b198ccd 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -195,12 +195,11 @@ function JS_Parse_Error(message, filename, line, col, pos) { this.line = line; this.col = col; this.pos = pos; - this.stack = new Error().stack; -}; - -JS_Parse_Error.prototype.toString = function() { - return this.message + " (line: " + this.line + ", col: " + this.col + ", pos: " + this.pos + ")" + "\n\n" + this.stack; }; +JS_Parse_Error.prototype = Object.create(Error.prototype); +JS_Parse_Error.prototype.constructor = JS_Parse_Error; +JS_Parse_Error.prototype.name = "SyntaxError"; +configure_error_stack(JS_Parse_Error); function js_error(message, filename, line, col, pos) { throw new JS_Parse_Error(message, filename, line, col, pos); @@ -350,13 +349,13 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { }); if (prefix) num = prefix + num; if (RE_OCT_NUMBER.test(num) && next_token.has_directive("use strict")) { - parse_error("SyntaxError: Legacy octal literals are not allowed in strict mode"); + parse_error("Legacy octal literals are not allowed in strict mode"); } var valid = parse_js_number(num); if (!isNaN(valid)) { return token("num", valid); } else { - parse_error("SyntaxError: Invalid syntax: " + num); + parse_error("Invalid syntax: " + num); } }; @@ -395,7 +394,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { // Parse if (ch === "0") return "\0"; if (ch.length > 0 && next_token.has_directive("use strict")) - parse_error("SyntaxError: Legacy octal escape sequences are not allowed in strict mode"); + parse_error("Legacy octal escape sequences are not allowed in strict mode"); return String.fromCharCode(parseInt(ch, 8)); } @@ -404,18 +403,18 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { for (; n > 0; --n) { var digit = parseInt(next(true), 16); if (isNaN(digit)) - parse_error("SyntaxError: Invalid hex-character pattern in string"); + parse_error("Invalid hex-character pattern in string"); num = (num << 4) | digit; } return num; }; - var read_string = with_eof_error("SyntaxError: Unterminated string constant", function(quote_char){ + var read_string = with_eof_error("Unterminated string constant", function(quote_char){ var quote = next(), ret = ""; for (;;) { var ch = next(true, true); if (ch == "\\") ch = read_escaped_char(true); - else if (NEWLINE_CHARS(ch)) parse_error("SyntaxError: Unterminated string constant"); + else if (NEWLINE_CHARS(ch)) parse_error("Unterminated string constant"); else if (ch == quote) break; ret += ch; } @@ -440,7 +439,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { return next_token; }; - var skip_multiline_comment = with_eof_error("SyntaxError: Unterminated multiline comment", function(){ + var skip_multiline_comment = with_eof_error("Unterminated multiline comment", function(){ var regex_allowed = S.regex_allowed; var i = find("*/", true); var text = S.text.substring(S.pos, i).replace(/\r\n|\r|\u2028|\u2029/g, '\n'); @@ -460,9 +459,9 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { else break; } else { - if (ch != "u") parse_error("SyntaxError: Expecting UnicodeEscapeSequence -- uXXXX"); + if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX"); ch = read_escaped_char(); - if (!is_identifier_char(ch)) parse_error("SyntaxError: Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier"); + if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier"); name += ch; backslash = false; } @@ -474,10 +473,10 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { return name; }; - var read_regexp = with_eof_error("SyntaxError: Unterminated regular expression", function(regexp){ + var read_regexp = with_eof_error("Unterminated regular expression", function(regexp){ var prev_backslash = false, ch, in_class = false; while ((ch = next(true))) if (NEWLINE_CHARS(ch)) { - parse_error("SyntaxError: Unexpected line terminator"); + parse_error("Unexpected line terminator"); } else if (prev_backslash) { regexp += "\\" + ch; prev_backslash = false; @@ -498,7 +497,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { try { return token("regexp", new RegExp(regexp, mods)); } catch(e) { - parse_error("SyntaxError: " + e.message); + parse_error(e.message); } }); @@ -599,7 +598,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { } break; } - parse_error("SyntaxError: Unexpected character '" + ch + "'"); + parse_error("Unexpected character '" + ch + "'"); }; next_token.context = function(nc) { @@ -756,14 +755,14 @@ function parse($TEXT, options) { function unexpected(token) { if (token == null) token = S.token; - token_error(token, "SyntaxError: Unexpected token: " + token.type + " (" + token.value + ")"); + token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")"); }; function expect_token(type, val) { if (is(type, val)) { return next(); } - token_error(S.token, "SyntaxError: Unexpected token " + S.token.type + " «" + S.token.value + "»" + ", expected " + type + " «" + val + "»"); + token_error(S.token, "Unexpected token " + S.token.type + " «" + S.token.value + "»" + ", expected " + type + " «" + val + "»"); }; function expect(punc) { return expect_token("punc", punc); }; @@ -892,7 +891,7 @@ function parse($TEXT, options) { case "return": if (S.in_function == 0 && !options.bare_returns) - croak("SyntaxError: 'return' outside of function"); + croak("'return' outside of function"); return new AST_Return({ value: ( is("punc", ";") ? (next(), null) @@ -909,7 +908,7 @@ function parse($TEXT, options) { case "throw": if (S.token.nlb) - croak("SyntaxError: Illegal newline after 'throw'"); + croak("Illegal newline after 'throw'"); return new AST_Throw({ value: (tmp = expression(true), semicolon(), tmp) }); @@ -925,7 +924,7 @@ function parse($TEXT, options) { case "with": if (S.input.has_directive("use strict")) { - croak("SyntaxError: Strict mode may not include a with statement"); + croak("Strict mode may not include a with statement"); } return new AST_With({ expression : parenthesised(), @@ -945,7 +944,7 @@ function parse($TEXT, options) { // syntactically incorrect if it contains a // LabelledStatement that is enclosed by a // LabelledStatement with the same Identifier as label. - croak("SyntaxError: Label " + label.name + " defined twice"); + croak("Label " + label.name + " defined twice"); } expect(":"); S.labels.push(label); @@ -958,7 +957,7 @@ function parse($TEXT, options) { label.references.forEach(function(ref){ if (ref instanceof AST_Continue) { ref = ref.label.start; - croak("SyntaxError: Continue label `" + label.name + "` refers to non-IterationStatement.", + croak("Continue label `" + label.name + "` refers to non-IterationStatement.", ref.line, ref.col, ref.pos); } }); @@ -978,11 +977,11 @@ function parse($TEXT, options) { if (label != null) { ldef = find_if(function(l){ return l.name == label.name }, S.labels); if (!ldef) - croak("SyntaxError: Undefined label " + label.name); + croak("Undefined label " + label.name); label.thedef = ldef; } else if (S.in_loop == 0) - croak("SyntaxError: " + type.TYPE + " not inside a loop or switch"); + croak(type.TYPE + " not inside a loop or switch"); semicolon(); var stat = new type({ label: label }); if (ldef) ldef.references.push(stat); @@ -998,7 +997,7 @@ function parse($TEXT, options) { : expression(true, true); if (is("operator", "in")) { if (init instanceof AST_Var && init.definitions.length > 1) - croak("SyntaxError: Only one variable declaration allowed in for..in loop"); + croak("Only one variable declaration allowed in for..in loop"); next(); return for_in(init); } @@ -1148,7 +1147,7 @@ function parse($TEXT, options) { }); } if (!bcatch && !bfinally) - croak("SyntaxError: Missing catch/finally blocks"); + croak("Missing catch/finally blocks"); return new AST_Try({ body : body, bcatch : bcatch, @@ -1242,7 +1241,7 @@ function parse($TEXT, options) { break; case "operator": if (!is_identifier_string(tok.value)) { - croak("SyntaxError: Invalid getter/setter name: " + tok.value, + croak("Invalid getter/setter name: " + tok.value, tok.line, tok.col, tok.pos); } ret = _make_symbol(AST_SymbolRef); @@ -1397,7 +1396,7 @@ function parse($TEXT, options) { function as_symbol(type, noerror) { if (!is("name")) { - if (!noerror) croak("SyntaxError: Name expected"); + if (!noerror) croak("Name expected"); return null; } var sym = _make_symbol(type); @@ -1461,7 +1460,7 @@ function parse($TEXT, options) { function make_unary(ctor, op, expr) { if ((op == "++" || op == "--") && !is_assignable(expr)) - croak("SyntaxError: Invalid use of " + op + " operator"); + croak("Invalid use of " + op + " operator"); return new ctor({ operator: op, expression: expr }); }; @@ -1525,7 +1524,7 @@ function parse($TEXT, options) { end : prev() }); } - croak("SyntaxError: Invalid assignment"); + croak("Invalid assignment"); } return left; }; |