Skip to content

Commit 41a6631

Browse files
author
Robert Fancsik
committed
JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik [email protected]
Rework VM dispatch
1 parent 79fd540 commit 41a6631

File tree

9 files changed

+1353
-1263
lines changed

9 files changed

+1353
-1263
lines changed

docs/05.PORT-API.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ typedef enum
2626
{
2727
ERR_OUT_OF_MEMORY = 10,
2828
ERR_REF_COUNT_LIMIT = 12,
29-
ERR_DISABLED_BYTE_CODE = 13,
3029
ERR_FAILED_INTERNAL_ASSERTION = 120
3130
} jerry_fatal_code_t;
3231
```

jerry-core/include/jerryscript-port.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ typedef enum
4646
{
4747
ERR_OUT_OF_MEMORY = 10,
4848
ERR_REF_COUNT_LIMIT = 12,
49-
ERR_DISABLED_BYTE_CODE = 13,
5049
ERR_UNTERMINATED_GC_LOOPS = 14,
5150
ERR_FAILED_INTERNAL_ASSERTION = 120
5251
} jerry_fatal_code_t;

jerry-core/jrt/jrt-fatals.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@ jerry_fatal (jerry_fatal_code_t code) /**< status code */
4747
JERRY_ERROR_MSG ("Error: ERR_UNTERMINATED_GC_LOOPS\n");
4848
break;
4949
}
50-
case ERR_DISABLED_BYTE_CODE:
51-
{
52-
JERRY_ERROR_MSG ("Error: ERR_DISABLED_BYTE_CODE\n");
53-
break;
54-
}
5550
case ERR_FAILED_INTERNAL_ASSERTION:
5651
{
5752
JERRY_ERROR_MSG ("Error: ERR_FAILED_INTERNAL_ASSERTION\n");

jerry-core/parser/js/byte-code.h

Lines changed: 32 additions & 26 deletions
Large diffs are not rendered by default.

jerry-core/parser/js/js-parser-expr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1420,7 +1420,7 @@ parser_parse_object_literal (parser_context_t *context_p) /**< context */
14201420
uint16_t function_literal_index = lexer_construct_function_object (context_p, status_flags);
14211421

14221422
#if JERRY_ESNEXT
1423-
if (opcode >= CBC_EXT_SET_COMPUTED_GETTER)
1423+
if (is_computed)
14241424
{
14251425
literal_index = function_literal_index;
14261426
}

jerry-core/vm/opcodes.c

Lines changed: 67 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,8 +1158,8 @@ opfunc_add_computed_field (ecma_value_t class_object, /**< class object */
11581158
* @return - new external function ecma-object
11591159
*/
11601160
ecma_value_t
1161-
opfunc_create_implicit_class_constructor (uint8_t opcode, /**< current cbc opcode */
1162-
const ecma_compiled_code_t *bytecode_p) /**< current byte code */
1161+
opfunc_create_implicit_class_constructor (const ecma_compiled_code_t *bytecode_p, /**< current byte code */
1162+
bool is_herigate) /* true -if class heritage is present */
11631163
{
11641164
/* 8. */
11651165
ecma_value_t script_value = ((cbc_uint8_arguments_t *) bytecode_p)->script_value;
@@ -1181,7 +1181,7 @@ opfunc_create_implicit_class_constructor (uint8_t opcode, /**< current cbc opcod
11811181
constructor_object_p->u.constructor_function.flags = 0;
11821182

11831183
/* 10.a.i */
1184-
if (opcode == CBC_EXT_PUSH_IMPLICIT_CONSTRUCTOR_HERITAGE)
1184+
if (is_herigate)
11851185
{
11861186
constructor_object_p->u.constructor_function.flags |= ECMA_CONSTRUCTOR_FUNCTION_HAS_HERITAGE;
11871187
}
@@ -1574,9 +1574,6 @@ opfunc_collect_private_properties (ecma_value_t constructor, ecma_value_t prop_n
15741574

15751575
if (opcode == CBC_EXT_COLLECT_PRIVATE_METHOD)
15761576
{
1577-
prop_name ^= value;
1578-
value ^= prop_name;
1579-
prop_name ^= value;
15801577
kind = ECMA_PRIVATE_METHOD;
15811578
}
15821579
else if (opcode == CBC_EXT_COLLECT_PRIVATE_GETTER)
@@ -1977,10 +1974,7 @@ opfunc_finalize_class (vm_frame_ctx_t *frame_ctx_p, /**< frame context */
19771974
* ECMA_VALUE_EMPTY - otherwise
19781975
*/
19791976
ecma_value_t
1980-
opfunc_form_super_reference (ecma_value_t **vm_stack_top_p, /**< current vm stack top */
1981-
vm_frame_ctx_t *frame_ctx_p, /**< frame context */
1982-
ecma_value_t prop_name, /**< property name to resolve */
1983-
uint8_t opcode) /**< current cbc opcode */
1977+
opfunc_resolve_super (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
19841978
{
19851979
ecma_environment_record_t *environment_record_p = ecma_op_get_environment_record (frame_ctx_p->lex_env_p);
19861980

@@ -2001,112 +1995,8 @@ opfunc_form_super_reference (ecma_value_t **vm_stack_top_p, /**< current vm stac
20011995
return ECMA_VALUE_ERROR;
20021996
}
20031997

2004-
ecma_value_t *stack_top_p = *vm_stack_top_p;
2005-
2006-
if (opcode >= CBC_EXT_SUPER_PROP_ASSIGNMENT_REFERENCE)
2007-
{
2008-
JERRY_ASSERT (opcode == CBC_EXT_SUPER_PROP_ASSIGNMENT_REFERENCE
2009-
|| opcode == CBC_EXT_SUPER_PROP_LITERAL_ASSIGNMENT_REFERENCE);
2010-
*stack_top_p++ = parent;
2011-
*stack_top_p++ = ecma_copy_value (prop_name);
2012-
*vm_stack_top_p = stack_top_p;
2013-
2014-
return ECMA_VALUE_EMPTY;
2015-
}
2016-
2017-
ecma_object_t *parent_p = ecma_get_object_from_value (parent);
2018-
ecma_string_t *prop_name_p = ecma_op_to_property_key (prop_name);
2019-
2020-
if (prop_name_p == NULL)
2021-
{
2022-
ecma_deref_object (parent_p);
2023-
return ECMA_VALUE_ERROR;
2024-
}
2025-
2026-
ecma_value_t result = ecma_op_object_get_with_receiver (parent_p, prop_name_p, frame_ctx_p->this_binding);
2027-
ecma_deref_ecma_string (prop_name_p);
2028-
ecma_deref_object (parent_p);
2029-
2030-
if (ECMA_IS_VALUE_ERROR (result))
2031-
{
2032-
return result;
2033-
}
2034-
2035-
if (opcode == CBC_EXT_SUPER_PROP_LITERAL_REFERENCE || opcode == CBC_EXT_SUPER_PROP_REFERENCE)
2036-
{
2037-
*stack_top_p++ = ecma_copy_value (frame_ctx_p->this_binding);
2038-
*stack_top_p++ = ECMA_VALUE_UNDEFINED;
2039-
}
2040-
2041-
*stack_top_p++ = result;
2042-
*vm_stack_top_p = stack_top_p;
2043-
2044-
return ECMA_VALUE_EMPTY;
2045-
} /* opfunc_form_super_reference */
2046-
2047-
/**
2048-
* Assignment operation for SuperRefence base
2049-
*
2050-
* @return ECMA_VALUE_ERROR - if the operation fails
2051-
* ECMA_VALUE_EMPTY - otherwise
2052-
*/
2053-
ecma_value_t
2054-
opfunc_assign_super_reference (ecma_value_t **vm_stack_top_p, /**< vm stack top */
2055-
vm_frame_ctx_t *frame_ctx_p, /**< frame context */
2056-
uint32_t opcode_data) /**< opcode data to store the result */
2057-
{
2058-
ecma_value_t *stack_top_p = *vm_stack_top_p;
2059-
2060-
ecma_value_t base_obj = ecma_op_to_object (stack_top_p[-3]);
2061-
2062-
if (ECMA_IS_VALUE_ERROR (base_obj))
2063-
{
2064-
return base_obj;
2065-
}
2066-
2067-
ecma_object_t *base_obj_p = ecma_get_object_from_value (base_obj);
2068-
ecma_string_t *prop_name_p = ecma_op_to_property_key (stack_top_p[-2]);
2069-
2070-
if (prop_name_p == NULL)
2071-
{
2072-
ecma_deref_object (base_obj_p);
2073-
return ECMA_VALUE_ERROR;
2074-
}
2075-
2076-
bool is_strict = (frame_ctx_p->status_flags & VM_FRAME_CTX_IS_STRICT) != 0;
2077-
2078-
ecma_value_t result =
2079-
ecma_op_object_put_with_receiver (base_obj_p, prop_name_p, stack_top_p[-1], frame_ctx_p->this_binding, is_strict);
2080-
2081-
ecma_deref_ecma_string (prop_name_p);
2082-
ecma_deref_object (base_obj_p);
2083-
2084-
if (ECMA_IS_VALUE_ERROR (result))
2085-
{
2086-
return result;
2087-
}
2088-
2089-
for (int32_t i = 1; i <= 3; i++)
2090-
{
2091-
ecma_free_value (stack_top_p[-i]);
2092-
}
2093-
2094-
stack_top_p -= 3;
2095-
2096-
if (opcode_data & VM_OC_PUT_STACK)
2097-
{
2098-
*stack_top_p++ = result;
2099-
}
2100-
else if (opcode_data & VM_OC_PUT_BLOCK)
2101-
{
2102-
ecma_fast_free_value (VM_GET_REGISTER (frame_ctx_p, 0));
2103-
VM_GET_REGISTERS (frame_ctx_p)[0] = result;
2104-
}
2105-
2106-
*vm_stack_top_p = stack_top_p;
2107-
2108-
return result;
2109-
} /* opfunc_assign_super_reference */
1998+
return parent;
1999+
} /* opfunc_resolve_super */
21102000

21112001
/**
21122002
* Copy data properties of an object
@@ -2303,8 +2193,69 @@ opfunc_lexical_scope_has_restricted_binding (vm_frame_ctx_t *frame_ctx_p, /**< f
23032193
&& !ecma_is_property_configurable (property));
23042194
} /* opfunc_lexical_scope_has_restricted_binding */
23052195

2196+
void
2197+
opfunc_set_function_name (ecma_value_t function_object,
2198+
ecma_value_t function_name,
2199+
char *prefix_p,
2200+
lit_utf8_size_t prefix_size)
2201+
{
2202+
ecma_object_t *func_obj_p = ecma_get_object_from_value (function_object);
2203+
2204+
if (ecma_find_named_property (func_obj_p, ecma_get_magic_string (LIT_MAGIC_STRING_NAME)) != NULL)
2205+
{
2206+
return;
2207+
}
2208+
2209+
ecma_property_value_t *value_p;
2210+
value_p = ecma_create_named_data_property (func_obj_p,
2211+
ecma_get_magic_string (LIT_MAGIC_STRING_NAME),
2212+
ECMA_PROPERTY_FLAG_CONFIGURABLE,
2213+
NULL);
2214+
2215+
if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION)
2216+
{
2217+
ECMA_SET_SECOND_BIT_TO_POINTER_TAG (((ecma_extended_object_t *) func_obj_p)->u.function.scope_cp);
2218+
}
2219+
2220+
value_p->value = ecma_op_function_form_name (ecma_get_prop_name_from_value (function_name), prefix_p, prefix_size);
2221+
} /* opfunc_set_function_name */
2222+
23062223
#endif /* JERRY_ESNEXT */
23072224

2225+
ecma_value_t
2226+
opfunc_set_property (ecma_value_t *stack_top_p, ecma_value_t prop_name, ecma_value_t value, bool is_static)
2227+
{
2228+
ecma_string_t *prop_name_p = ecma_op_to_property_key (prop_name);
2229+
2230+
if (JERRY_UNLIKELY (prop_name_p == NULL))
2231+
{
2232+
return ECMA_VALUE_ERROR;
2233+
}
2234+
2235+
int index = -1;
2236+
2237+
#if JERRY_ESNEXT
2238+
if (JERRY_UNLIKELY (is_static))
2239+
{
2240+
if (ecma_compare_ecma_string_to_magic_id (prop_name_p, LIT_MAGIC_STRING_PROTOTYPE))
2241+
{
2242+
return ecma_raise_type_error (ECMA_ERR_CLASS_IS_NON_CONFIGURABLE);
2243+
}
2244+
2245+
index--;
2246+
}
2247+
#else /* !JERRY_ESNEXT */
2248+
JERRY_UNUSED (is_static);
2249+
#endif /* JERRY_ESNEXT */
2250+
2251+
ecma_object_t *object_p = ecma_get_object_from_value (stack_top_p[index]);
2252+
2253+
opfunc_set_data_property (object_p, prop_name_p, value);
2254+
ecma_deref_ecma_string (prop_name_p);
2255+
2256+
return ECMA_VALUE_EMPTY;
2257+
} /* opfunc_set_property */
2258+
23082259
/**
23092260
* @}
23102261
* @}

jerry-core/vm/opcodes.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ ecma_value_t opfunc_init_static_class_fields (ecma_value_t function_object, ecma
128128

129129
ecma_value_t opfunc_add_computed_field (ecma_value_t class_object, ecma_value_t name);
130130

131-
ecma_value_t opfunc_create_implicit_class_constructor (uint8_t opcode, const ecma_compiled_code_t *bytecode_p);
131+
ecma_value_t opfunc_create_implicit_class_constructor (const ecma_compiled_code_t *bytecode_p, bool is_herigate);
132132

133133
void opfunc_set_home_object (ecma_object_t *func_p, ecma_object_t *parent_env_p);
134134

@@ -162,20 +162,22 @@ void opfunc_pop_lexical_environment (vm_frame_ctx_t *frame_ctx_p);
162162

163163
void opfunc_finalize_class (vm_frame_ctx_t *frame_ctx_p, ecma_value_t **vm_stack_top_p, ecma_value_t class_name);
164164

165-
ecma_value_t opfunc_form_super_reference (ecma_value_t **vm_stack_top_p,
166-
vm_frame_ctx_t *frame_ctx_p,
167-
ecma_value_t prop_name,
168-
uint8_t opcode);
169-
170-
ecma_value_t
171-
opfunc_assign_super_reference (ecma_value_t **vm_stack_top_p, vm_frame_ctx_t *frame_ctx_p, uint32_t opcode_data);
165+
ecma_value_t opfunc_resolve_super (vm_frame_ctx_t *frame_ctx_p);
172166

173167
ecma_value_t
174168
opfunc_copy_data_properties (ecma_value_t target_object, ecma_value_t source_object, ecma_value_t filter_array);
175169

176170
ecma_value_t opfunc_lexical_scope_has_restricted_binding (vm_frame_ctx_t *vm_frame_ctx_p, ecma_string_t *name_p);
171+
172+
void opfunc_set_function_name (ecma_value_t function_object,
173+
ecma_value_t function_name,
174+
char *prefix_p,
175+
lit_utf8_size_t prefix_size);
177176
#endif /* JERRY_ESNEXT */
178177

178+
ecma_value_t
179+
opfunc_set_property (ecma_value_t *stack_top_p, ecma_value_t prop_name, ecma_value_t value, bool is_static);
180+
179181
/**
180182
* @}
181183
* @}

0 commit comments

Comments
 (0)