79
lib/parse.js
79
lib/parse.js
@@ -1168,10 +1168,6 @@ function parse($TEXT, options) {
|
||||
|
||||
function labeled_statement() {
|
||||
var label = as_symbol(AST_Label);
|
||||
if (label.name === "yield" && is_in_generator()) {
|
||||
// Ecma-262, 12.1.1 Static Semantics: Early Errors
|
||||
token_error(S.prev, "Yield cannot be used as label inside generators");
|
||||
}
|
||||
if (label.name === "await" && is_in_async()) {
|
||||
token_error(S.prev, "await cannot be used as label inside async function");
|
||||
}
|
||||
@@ -1331,7 +1327,7 @@ function parse($TEXT, options) {
|
||||
if (name && ctor !== AST_Accessor && !(name instanceof AST_SymbolDeclaration))
|
||||
unexpected(prev());
|
||||
|
||||
var args = parameters();
|
||||
var args = [];
|
||||
var body = _function_body(true, is_generator || is_generator_property, is_async, name, args);
|
||||
return new ctor({
|
||||
start : args.start,
|
||||
@@ -1402,9 +1398,8 @@ function parse($TEXT, options) {
|
||||
return tracker;
|
||||
}
|
||||
|
||||
function parameters() {
|
||||
function parameters(params) {
|
||||
var start = S.token;
|
||||
var params = [];
|
||||
var used_parameters = track_used_binding_identifiers(true, S.input.has_directive("use strict"));
|
||||
|
||||
expect("(");
|
||||
@@ -1424,7 +1419,6 @@ function parse($TEXT, options) {
|
||||
}
|
||||
|
||||
next();
|
||||
return params;
|
||||
}
|
||||
|
||||
function parameter(used_parameters, symbol_type) {
|
||||
@@ -1511,12 +1505,7 @@ function parse($TEXT, options) {
|
||||
}
|
||||
} else if (is("name")) {
|
||||
used_parameters.add_parameter(S.token);
|
||||
elements.push(new symbol_type({
|
||||
start: S.token,
|
||||
name: S.token.value,
|
||||
end: S.token
|
||||
}));
|
||||
next();
|
||||
elements.push(as_symbol(symbol_type));
|
||||
} else {
|
||||
croak("Invalid function parameter");
|
||||
}
|
||||
@@ -1566,11 +1555,8 @@ function parse($TEXT, options) {
|
||||
}
|
||||
if (is("name") && (is_token(peek(), "punc") || is_token(peek(), "operator")) && [",", "}", "="].indexOf(peek().value) !== -1) {
|
||||
used_parameters.add_parameter(S.token);
|
||||
var value = new symbol_type({
|
||||
start: S.token,
|
||||
name: S.token.value,
|
||||
end: S.token,
|
||||
});
|
||||
var start = prev();
|
||||
var value = as_symbol(symbol_type);
|
||||
if (is_expand) {
|
||||
elements.push(new AST_Expansion({
|
||||
start: expand_token,
|
||||
@@ -1579,13 +1565,12 @@ function parse($TEXT, options) {
|
||||
}));
|
||||
} else {
|
||||
elements.push(new AST_ObjectKeyVal({
|
||||
start: prev(),
|
||||
key: S.token.value,
|
||||
start: start,
|
||||
key: value.name,
|
||||
value: value,
|
||||
end: value.end,
|
||||
}));
|
||||
}
|
||||
next();
|
||||
} else if (is("punc", "}")) {
|
||||
continue; // Allow trailing hole
|
||||
} else {
|
||||
@@ -1642,12 +1627,7 @@ function parse($TEXT, options) {
|
||||
});
|
||||
} else if (is("name")) {
|
||||
used_parameters.add_parameter(S.token);
|
||||
next();
|
||||
return new symbol_type({
|
||||
start: prev(),
|
||||
name: prev().value,
|
||||
end: prev()
|
||||
});
|
||||
return as_symbol(symbol_type);
|
||||
} else {
|
||||
croak("Invalid function parameter");
|
||||
}
|
||||
@@ -1701,6 +1681,7 @@ function parse($TEXT, options) {
|
||||
S.in_generator = S.in_function;
|
||||
if (is_async)
|
||||
S.in_async = S.in_function;
|
||||
if (args) parameters(args);
|
||||
if (block)
|
||||
S.in_directives = true;
|
||||
S.in_loop = 0;
|
||||
@@ -1708,10 +1689,8 @@ function parse($TEXT, options) {
|
||||
if (block) {
|
||||
S.input.push_directives_stack();
|
||||
var a = block_();
|
||||
if (S.input.has_directive("use strict")) {
|
||||
if (name) strict_verify_symbol(name);
|
||||
if (args) args.forEach(strict_verify_symbol);
|
||||
}
|
||||
if (name) _verify_symbol(name);
|
||||
if (args) args.forEach(_verify_symbol);
|
||||
S.input.pop_directives_stack();
|
||||
} else {
|
||||
var a = expression(false);
|
||||
@@ -2593,9 +2572,14 @@ function parse($TEXT, options) {
|
||||
unexpected(tmp);
|
||||
}
|
||||
case "name":
|
||||
if (tmp.value == "yield" && !is_token(peek(), "punc", ":") && !is_token(peek(), "punc", "(")
|
||||
&& S.input.has_directive("use strict") && !is_in_generator()) {
|
||||
token_error(tmp, "Unexpected yield identifier inside strict mode");
|
||||
if (tmp.value == "yield") {
|
||||
if (is_in_generator()) {
|
||||
token_error(tmp, "Yield cannot be used as identifier inside generators");
|
||||
} else if (!is_token(peek(), "punc", ":")
|
||||
&& !is_token(peek(), "punc", "(")
|
||||
&& S.input.has_directive("use strict")) {
|
||||
token_error(tmp, "Unexpected yield identifier inside strict mode");
|
||||
}
|
||||
}
|
||||
case "string":
|
||||
case "num":
|
||||
@@ -2626,9 +2610,19 @@ function parse($TEXT, options) {
|
||||
});
|
||||
};
|
||||
|
||||
function strict_verify_symbol(sym) {
|
||||
if (sym.name == "arguments" || sym.name == "eval")
|
||||
croak("Unexpected " + sym.name + " in strict mode", sym.start.line, sym.start.col, sym.start.pos);
|
||||
function _verify_symbol(sym) {
|
||||
var name = sym.name;
|
||||
if (is_in_generator() && name == "yield") {
|
||||
token_error(sym.start, "Yield cannot be used as identifier inside generators");
|
||||
}
|
||||
if (S.input.has_directive("use strict")) {
|
||||
if (name == "yield") {
|
||||
token_error(sym.start, "Unexpected yield identifier inside strict mode");
|
||||
}
|
||||
if (sym instanceof AST_SymbolDeclaration && (name == "arguments" || name == "eval")) {
|
||||
token_error(sym.start, "Unexpected " + name + " in strict mode");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function as_symbol(type, noerror) {
|
||||
@@ -2636,13 +2630,8 @@ function parse($TEXT, options) {
|
||||
if (!noerror) croak("Name expected");
|
||||
return null;
|
||||
}
|
||||
if (is("name", "yield") && S.input.has_directive("use strict")) {
|
||||
token_error(S.prev, "Unexpected yield identifier inside strict mode");
|
||||
}
|
||||
var sym = _make_symbol(type);
|
||||
if (S.input.has_directive("use strict") && sym instanceof AST_SymbolDeclaration) {
|
||||
strict_verify_symbol(sym);
|
||||
}
|
||||
_verify_symbol(sym);
|
||||
next();
|
||||
return sym;
|
||||
};
|
||||
@@ -2870,7 +2859,7 @@ function parse($TEXT, options) {
|
||||
next();
|
||||
return _yield_expression();
|
||||
} else if (S.input.has_directive("use strict")) {
|
||||
token_error(S.token, "Unexpected yield identifier inside strict mode")
|
||||
token_error(S.token, "Unexpected yield identifier inside strict mode");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user