@@ -1322,39 +1322,41 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
13221322 {
13231323 uint32_t value_index ;
13241324 READ_LITERAL_INDEX (value_index );
1325+ JERRY_ASSERT (value_index >= const_literal_end );
13251326
13261327 lit_value = vm_construct_literal_object (frame_ctx_p ,
13271328 literal_start_p [value_index ]);
13281329 }
13291330
13301331 READ_LITERAL_INDEX (literal_index );
1332+ JERRY_ASSERT (literal_index >= register_end );
13311333
13321334 ecma_string_t * name_p = ecma_get_string_from_value (literal_start_p [literal_index ]);
13331335 ecma_object_t * lex_env_p = frame_ctx_p -> lex_env_p ;
13341336
13351337 while (lex_env_p -> type_flags_refs & ECMA_OBJECT_FLAG_BLOCK )
13361338 {
1337- #if ENABLED (JERRY_ES2015 ) && !(defined JERRY_NDEBUG )
1339+ #if ENABLED (JERRY_ES2015 ) && !(defined JERRY_NDEBUG )
13381340 if (ecma_get_lex_env_type (lex_env_p ) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE )
13391341 {
13401342 ecma_property_t * property_p = ecma_find_named_property (lex_env_p , name_p );
13411343
13421344 JERRY_ASSERT (property_p == NULL || !(* property_p & ECMA_PROPERTY_FLAG_ENUMERABLE ));
13431345 }
1344- #endif /* ENABLED (JERRY_ES2015) && !JERRY_NDEBUG */
1346+ #endif /* ENABLED (JERRY_ES2015) && !JERRY_NDEBUG */
13451347
13461348 JERRY_ASSERT (lex_env_p -> u2 .outer_reference_cp != JMEM_CP_NULL );
13471349 lex_env_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t , lex_env_p -> u2 .outer_reference_cp );
13481350 }
13491351
1350- #if ENABLED (JERRY_ES2015 ) && !(defined JERRY_NDEBUG )
1352+ #if ENABLED (JERRY_ES2015 ) && !(defined JERRY_NDEBUG )
13511353 if (ecma_get_lex_env_type (lex_env_p ) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE )
13521354 {
13531355 ecma_property_t * property_p = ecma_find_named_property (lex_env_p , name_p );
13541356
13551357 JERRY_ASSERT (property_p == NULL || !(* property_p & ECMA_PROPERTY_FLAG_ENUMERABLE ));
13561358 }
1357- #endif /* ENABLED (JERRY_ES2015) && !JERRY_NDEBUG */
1359+ #endif /* ENABLED (JERRY_ES2015) && !JERRY_NDEBUG */
13581360
13591361 result = vm_var_decl (lex_env_p , name_p , frame_ctx_p -> is_eval_code );
13601362
@@ -1375,6 +1377,68 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
13751377
13761378 continue ;
13771379 }
1380+ #if ENABLED (JERRY_ES2015 )
1381+ case VM_OC_EXT_VAR_EVAL :
1382+ {
1383+ uint32_t literal_index ;
1384+ ecma_value_t lit_value = ECMA_VALUE_UNDEFINED ;
1385+
1386+ JERRY_ASSERT (byte_code_start_p [0 ] == CBC_EXT_OPCODE );
1387+
1388+ if (opcode == CBC_EXT_CREATE_VAR_FUNC_EVAL )
1389+ {
1390+ uint32_t value_index ;
1391+ READ_LITERAL_INDEX (value_index );
1392+ JERRY_ASSERT (value_index >= const_literal_end );
1393+
1394+ lit_value = vm_construct_literal_object (frame_ctx_p ,
1395+ literal_start_p [value_index ]);
1396+ }
1397+
1398+ READ_LITERAL_INDEX (literal_index );
1399+ JERRY_ASSERT (literal_index >= register_end );
1400+
1401+ ecma_string_t * name_p = ecma_get_string_from_value (literal_start_p [literal_index ]);
1402+ ecma_object_t * lex_env_p = frame_ctx_p -> lex_env_p ;
1403+ ecma_object_t * prev_lex_env_p = NULL ;
1404+
1405+ while (lex_env_p -> type_flags_refs & ECMA_OBJECT_FLAG_BLOCK )
1406+ {
1407+ #if !(defined JERRY_NDEBUG )
1408+ if (ecma_get_lex_env_type (lex_env_p ) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE )
1409+ {
1410+ ecma_property_t * property_p = ecma_find_named_property (lex_env_p , name_p );
1411+
1412+ JERRY_ASSERT (property_p == NULL || !(* property_p & ECMA_PROPERTY_FLAG_ENUMERABLE ));
1413+ }
1414+ #endif /* !JERRY_NDEBUG */
1415+
1416+ JERRY_ASSERT (lex_env_p -> u2 .outer_reference_cp != JMEM_CP_NULL );
1417+ prev_lex_env_p = lex_env_p ;
1418+ lex_env_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t , lex_env_p -> u2 .outer_reference_cp );
1419+ }
1420+
1421+ JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p ) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE );
1422+ JERRY_ASSERT (prev_lex_env_p != NULL
1423+ && ecma_get_lex_env_type (prev_lex_env_p ) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE );
1424+ JERRY_ASSERT (ecma_find_named_property (prev_lex_env_p , name_p ) == NULL );
1425+
1426+ ecma_property_value_t * property_value_p ;
1427+ property_value_p = ecma_create_named_data_property (prev_lex_env_p ,
1428+ name_p ,
1429+ ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
1430+ NULL );
1431+
1432+ if (lit_value == ECMA_VALUE_UNDEFINED )
1433+ {
1434+ continue ;
1435+ }
1436+
1437+ property_value_p -> value = lit_value ;
1438+ ecma_deref_object (ecma_get_object_from_value (lit_value ));
1439+ continue ;
1440+ }
1441+ #endif /* ENABLED (JERRY_ES2015) */
13781442#if ENABLED (JERRY_SNAPSHOT_EXEC )
13791443 case VM_OC_SET_BYTECODE_PTR :
13801444 {
0 commit comments