aboutsummaryrefslogtreecommitdiff
path: root/lib/parse.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/parse.js')
-rw-r--r--lib/parse.js65
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;
};