mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2026-02-07 17:36:40 +00:00
Generator declaration is not allowed in single statement position (#4815)
JerryScript-DCO-1.0-Signed-off-by: Robert Sipka robert.sipka@h-lab.eu
This commit is contained in:
parent
80777799f6
commit
4592143400
@ -600,7 +600,9 @@ parser_parse_function_statement (parser_context_t *context_p) /**< context */
|
||||
JERRY_ASSERT (context_p->token.type == LEXER_KEYW_FUNCTION);
|
||||
|
||||
#if JERRY_ESNEXT
|
||||
if (JERRY_UNLIKELY (parser_statement_flags[context_p->stack_top_uint8] & PARSER_STATM_SINGLE_STATM))
|
||||
bool is_single_statement = (parser_statement_flags[context_p->stack_top_uint8] & PARSER_STATM_SINGLE_STATM) != 0;
|
||||
|
||||
if (JERRY_UNLIKELY (is_single_statement))
|
||||
{
|
||||
if (context_p->status_flags & PARSER_IS_STRICT)
|
||||
{
|
||||
@ -667,6 +669,10 @@ parser_parse_function_statement (parser_context_t *context_p) /**< context */
|
||||
|
||||
if (lexer_consume_generator (context_p))
|
||||
{
|
||||
if (is_single_statement)
|
||||
{
|
||||
parser_raise_error (context_p, PARSER_ERR_GENERATOR_IN_SINGLE_STATEMENT_POS);
|
||||
}
|
||||
is_generator_function = true;
|
||||
}
|
||||
#endif /* JERRY_ESNEXT */
|
||||
|
||||
@ -1243,6 +1243,10 @@ parser_error_to_string (parser_error_t error) /**< error code */
|
||||
{
|
||||
return "Lexical declaration cannot appear in a single-statement context";
|
||||
}
|
||||
case PARSER_ERR_GENERATOR_IN_SINGLE_STATEMENT_POS:
|
||||
{
|
||||
return "Generator function cannot appear in a single-statement context";
|
||||
}
|
||||
case PARSER_ERR_LABELLED_FUNC_NOT_IN_BLOCK:
|
||||
{
|
||||
return "Labelled functions are only allowed inside blocks";
|
||||
|
||||
@ -141,6 +141,7 @@ typedef enum
|
||||
#if JERRY_ESNEXT
|
||||
PARSER_ERR_VARIABLE_REDECLARED, /**< a variable redeclared */
|
||||
PARSER_ERR_LEXICAL_SINGLE_STATEMENT, /**< lexical declaration in single statement context */
|
||||
PARSER_ERR_GENERATOR_IN_SINGLE_STATEMENT_POS, /**< generator func not allowed in single statement position */
|
||||
PARSER_ERR_LABELLED_FUNC_NOT_IN_BLOCK, /**< labelled functions are only allowed inside blocks */
|
||||
PARSER_ERR_LEXICAL_LET_BINDING, /**< let binding cannot be declared in let/const */
|
||||
PARSER_ERR_MISSING_ASSIGN_AFTER_CONST, /**< an assignment is required after a const declaration */
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
/* Copyright JS Foundation and other contributors, http://js.foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
function parse(txt) {
|
||||
try {
|
||||
eval(txt)
|
||||
assert(false)
|
||||
} catch (e) {
|
||||
assert(e instanceof SyntaxError)
|
||||
}
|
||||
}
|
||||
|
||||
parse("if (true) function* g() { }")
|
||||
parse("if (false) ; else function* g() { }")
|
||||
@ -365,13 +365,8 @@
|
||||
<test id="language/statements/if/cptn-no-else-false.js"><reason></reason></test>
|
||||
<test id="language/statements/if/cptn-no-else-true-abrupt-empty.js"><reason></reason></test>
|
||||
<test id="language/statements/if/cptn-no-else-true-nrml.js"><reason></reason></test>
|
||||
<test id="language/statements/if/if-gen-else-gen.js"><reason></reason></test>
|
||||
<test id="language/statements/if/if-gen-else-stmt.js"><reason></reason></test>
|
||||
<test id="language/statements/if/if-gen-no-else.js"><reason></reason></test>
|
||||
<test id="language/statements/if/if-stmt-else-gen.js"><reason></reason></test>
|
||||
<test id="language/statements/if/let-block-with-newline.js"><reason></reason></test>
|
||||
<test id="language/statements/if/let-identifier-with-newline.js"><reason></reason></test>
|
||||
<test id="language/statements/labeled/decl-gen.js"><reason></reason></test>
|
||||
<test id="language/statements/labeled/let-block-with-newline.js"><reason></reason></test>
|
||||
<test id="language/statements/labeled/let-identifier-with-newline.js"><reason></reason></test>
|
||||
<test id="language/statements/let/syntax/let-newline-yield-in-generator-function.js"><reason></reason></test>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user