@@ -148,7 +148,9 @@ scanner_get_stream_size (scanner_info_t *info_p, /**< scanner info block */
148148#endif /* ENABLED (JERRY_ES2015_MODULE_SYSTEM) */
149149 case SCANNER_STREAM_TYPE_ARG :
150150#if ENABLED (JERRY_ES2015 )
151+ case SCANNER_STREAM_TYPE_ARG_VAR :
151152 case SCANNER_STREAM_TYPE_DESTRUCTURED_ARG :
153+ case SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_VAR :
152154#endif /* ENABLED (JERRY_ES2015_MODULE_SYSTEM) */
153155 case SCANNER_STREAM_TYPE_ARG_FUNC :
154156#if ENABLED (JERRY_ES2015 )
@@ -555,7 +557,12 @@ scanner_pop_literal_pool (parser_context_t *context_p, /**< context */
555557 continue ;
556558 }
557559
558- type = (uint8_t ) ((type & ~SCANNER_LITERAL_IS_FUNC ) | SCANNER_LITERAL_IS_VAR );
560+ if (!(type & SCANNER_LITERAL_IS_ARG ))
561+ {
562+ type |= SCANNER_LITERAL_IS_VAR ;
563+ }
564+
565+ type &= (uint8_t ) ~SCANNER_LITERAL_IS_FUNC ;
559566 literal_p -> type = type ;
560567 }
561568#endif /* ENABLED (JERRY_ES2015) */
@@ -802,6 +809,14 @@ scanner_pop_literal_pool (parser_context_t *context_p, /**< context */
802809 {
803810 type = SCANNER_STREAM_TYPE_DESTRUCTURED_ARG ;
804811 }
812+
813+ if (literal_p -> type & SCANNER_LITERAL_IS_VAR )
814+ {
815+ type = (uint8_t ) (type + 1 );
816+
817+ JERRY_ASSERT (type == SCANNER_STREAM_TYPE_ARG_VAR
818+ || type == SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_VAR );
819+ }
805820#endif /* ENABLED (JERRY_ES2015) */
806821 }
807822#if ENABLED (JERRY_ES2015 )
@@ -1731,7 +1746,9 @@ scanner_is_context_needed (parser_context_t *context_p, /**< context */
17311746 || type == SCANNER_STREAM_TYPE_CONST
17321747 || type == SCANNER_STREAM_TYPE_LOCAL
17331748 || type == SCANNER_STREAM_TYPE_ARG
1749+ || type == SCANNER_STREAM_TYPE_ARG_VAR
17341750 || type == SCANNER_STREAM_TYPE_DESTRUCTURED_ARG
1751+ || type == SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_VAR
17351752 || type == SCANNER_STREAM_TYPE_ARG_FUNC
17361753 || type == SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_FUNC
17371754 || type == SCANNER_STREAM_TYPE_FUNC );
@@ -1769,16 +1786,13 @@ scanner_is_context_needed (parser_context_t *context_p, /**< context */
17691786
17701787 if (JERRY_UNLIKELY (check_type == PARSER_CHECK_FUNCTION_CONTEXT ))
17711788 {
1772- if (SCANNER_STREAM_TYPE_IS_ARG (type ))
1773- {
1774- continue ;
1775- }
1776-
1777- if (SCANNER_STREAM_TYPE_IS_ARG_FUNC (type ))
1789+ if (SCANNER_STREAM_TYPE_IS_ARG_FUNC (type )
1790+ || type == SCANNER_STREAM_TYPE_ARG_VAR
1791+ || type == SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_VAR )
17781792 {
17791793 /* The return value is true, if the variable is stored in the lexical environment
17801794 * or all registers have already been used for function arguments. This can be
1781- * inprecise in the latter case, but that is a very rare corner case. A more
1795+ * inprecise in the latter case, but this is a very rare corner case. A more
17821796 * sophisticated check would require to decode the literal. */
17831797 if ((data & SCANNER_STREAM_NO_REG )
17841798 || scope_stack_reg_top >= PARSER_MAXIMUM_NUMBER_OF_REGISTERS )
@@ -1787,6 +1801,11 @@ scanner_is_context_needed (parser_context_t *context_p, /**< context */
17871801 }
17881802 continue ;
17891803 }
1804+
1805+ if (SCANNER_STREAM_TYPE_IS_ARG (type ))
1806+ {
1807+ continue ;
1808+ }
17901809 }
17911810#endif /* ENABLED (JERRY_ES2015) */
17921811
@@ -2072,6 +2091,24 @@ scanner_create_variables (parser_context_t *context_p, /**< context */
20722091 {
20732092 if (option_flags & SCANNER_CREATE_VARS_IS_FUNCTION_BODY )
20742093 {
2094+ #if ENABLED (JERRY_ES2015 )
2095+ if ((context_p -> status_flags & PARSER_LEXICAL_BLOCK_NEEDED )
2096+ && (type == SCANNER_STREAM_TYPE_ARG_VAR || type == SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_VAR ))
2097+ {
2098+ literal .length = data_p [1 ];
2099+ literal .type = LEXER_IDENT_LITERAL ;
2100+ literal .has_escape = (data_p [0 ] & SCANNER_STREAM_HAS_ESCAPE ) ? 1 : 0 ;
2101+
2102+ /* Literal must be exists. */
2103+ lexer_construct_literal_object (context_p , & literal , LEXER_IDENT_LITERAL );
2104+
2105+ if (context_p -> lit_object .index < PARSER_REGISTER_START )
2106+ {
2107+ parser_emit_cbc_ext_literal_from_token (context_p , CBC_EXT_COPY_FROM_ARG );
2108+ }
2109+ }
2110+ #endif /* ENABLED (JERRY_ES2015) */
2111+
20752112 literal .char_p += data_p [1 ];
20762113 continue ;
20772114 }
@@ -2174,7 +2211,9 @@ scanner_create_variables (parser_context_t *context_p, /**< context */
21742211 }
21752212 case SCANNER_STREAM_TYPE_LET :
21762213 case SCANNER_STREAM_TYPE_ARG :
2214+ case SCANNER_STREAM_TYPE_ARG_VAR :
21772215 case SCANNER_STREAM_TYPE_DESTRUCTURED_ARG :
2216+ case SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_VAR :
21782217 case SCANNER_STREAM_TYPE_ARG_FUNC :
21792218 case SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_FUNC :
21802219 {
@@ -2208,6 +2247,7 @@ scanner_create_variables (parser_context_t *context_p, /**< context */
22082247 case SCANNER_STREAM_TYPE_LET :
22092248 case SCANNER_STREAM_TYPE_CONST :
22102249 case SCANNER_STREAM_TYPE_DESTRUCTURED_ARG :
2250+ case SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_VAR :
22112251 case SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_FUNC :
22122252 {
22132253 scope_stack_map_to |= PARSER_SCOPE_STACK_NO_FUNCTION_COPY ;
@@ -2261,6 +2301,7 @@ scanner_create_variables (parser_context_t *context_p, /**< context */
22612301 {
22622302 JERRY_ASSERT (type == SCANNER_STREAM_TYPE_LOCAL
22632303 || type == SCANNER_STREAM_TYPE_DESTRUCTURED_ARG
2304+ || type == SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_VAR
22642305 || type == SCANNER_STREAM_TYPE_DESTRUCTURED_ARG_FUNC );
22652306
22662307 opcode = CBC_CREATE_LOCAL ;
@@ -2276,6 +2317,9 @@ scanner_create_variables (parser_context_t *context_p, /**< context */
22762317 break ;
22772318 }
22782319 case SCANNER_STREAM_TYPE_ARG :
2320+ #if ENABLED (JERRY_ES2015 )
2321+ case SCANNER_STREAM_TYPE_ARG_VAR :
2322+ #endif /* ENABLED (JERRY_ES2015) */
22792323 case SCANNER_STREAM_TYPE_ARG_FUNC :
22802324 {
22812325#if ENABLED (JERRY_PARSER_DUMP_BYTE_CODE )
0 commit comments