Skip to content

Commit 1200be4

Browse files
committed
Non-recursive vm_loop to reduce stack usage.
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
1 parent 2c72bb1 commit 1200be4

File tree

6 files changed

+210
-165
lines changed

6 files changed

+210
-165
lines changed

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

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,9 @@
295295
CBC_OPCODE (CBC_NEW, CBC_HAS_POP_STACK_BYTE_ARG, 0, \
296296
VM_OC_NEW | VM_OC_GET_BYTE | VM_OC_PUT_STACK) \
297297
CBC_OPCODE (CBC_NEW0, CBC_NO_FLAG, 0, \
298-
VM_OC_NEW_N | VM_OC_PUT_STACK) \
298+
VM_OC_NEW | VM_OC_PUT_STACK) \
299299
CBC_OPCODE (CBC_NEW1, CBC_NO_FLAG, -1, \
300-
VM_OC_NEW_N | VM_OC_PUT_STACK) \
300+
VM_OC_NEW | VM_OC_PUT_STACK) \
301301
CBC_OPCODE (CBC_EVAL, CBC_NO_FLAG, 0, \
302302
VM_OC_EVAL) \
303303
CBC_OPCODE (CBC_DEFINE_VARS, CBC_HAS_LITERAL_ARG, 0, \
@@ -405,47 +405,47 @@
405405
CBC_OPCODE (CBC_CALL_BLOCK, CBC_HAS_POP_STACK_BYTE_ARG, -1, \
406406
VM_OC_CALL | VM_OC_GET_BYTE | VM_OC_PUT_BLOCK) \
407407
CBC_OPCODE (CBC_CALL_PROP, CBC_HAS_POP_STACK_BYTE_ARG, -3, \
408-
VM_OC_CALL_PROP | VM_OC_GET_BYTE) \
408+
VM_OC_CALL | VM_OC_GET_BYTE) \
409409
CBC_OPCODE (CBC_CALL_PROP_PUSH_RESULT, CBC_HAS_POP_STACK_BYTE_ARG, -2, \
410-
VM_OC_CALL_PROP | VM_OC_GET_BYTE | VM_OC_PUT_STACK) \
410+
VM_OC_CALL | VM_OC_GET_BYTE | VM_OC_PUT_STACK) \
411411
CBC_OPCODE (CBC_CALL_PROP_BLOCK, CBC_HAS_POP_STACK_BYTE_ARG, -3, \
412-
VM_OC_CALL_PROP | VM_OC_GET_BYTE | VM_OC_PUT_BLOCK) \
412+
VM_OC_CALL | VM_OC_GET_BYTE | VM_OC_PUT_BLOCK) \
413413
CBC_OPCODE (CBC_CALL0, CBC_NO_FLAG, -1, \
414-
VM_OC_CALL_N) \
414+
VM_OC_CALL) \
415415
CBC_OPCODE (CBC_CALL0_PUSH_RESULT, CBC_NO_FLAG, 0, \
416-
VM_OC_CALL_N | VM_OC_PUT_STACK) \
416+
VM_OC_CALL | VM_OC_PUT_STACK) \
417417
CBC_OPCODE (CBC_CALL0_BLOCK, CBC_NO_FLAG, -1, \
418-
VM_OC_CALL_N | VM_OC_PUT_BLOCK) \
418+
VM_OC_CALL | VM_OC_PUT_BLOCK) \
419419
CBC_OPCODE (CBC_CALL0_PROP, CBC_NO_FLAG, -3, \
420-
VM_OC_CALL_PROP_N) \
420+
VM_OC_CALL) \
421421
CBC_OPCODE (CBC_CALL0_PROP_PUSH_RESULT, CBC_NO_FLAG, -2, \
422-
VM_OC_CALL_PROP_N | VM_OC_PUT_STACK) \
422+
VM_OC_CALL | VM_OC_PUT_STACK) \
423423
CBC_OPCODE (CBC_CALL0_PROP_BLOCK, CBC_NO_FLAG, -3, \
424-
VM_OC_CALL_PROP_N | VM_OC_PUT_BLOCK) \
424+
VM_OC_CALL | VM_OC_PUT_BLOCK) \
425425
CBC_OPCODE (CBC_CALL1, CBC_NO_FLAG, -2, \
426-
VM_OC_CALL_N) \
426+
VM_OC_CALL) \
427427
CBC_OPCODE (CBC_CALL1_PUSH_RESULT, CBC_NO_FLAG, -1, \
428-
VM_OC_CALL_N | VM_OC_PUT_STACK) \
428+
VM_OC_CALL | VM_OC_PUT_STACK) \
429429
CBC_OPCODE (CBC_CALL1_BLOCK, CBC_NO_FLAG, -2, \
430-
VM_OC_CALL_N | VM_OC_PUT_BLOCK) \
430+
VM_OC_CALL | VM_OC_PUT_BLOCK) \
431431
CBC_OPCODE (CBC_CALL1_PROP, CBC_NO_FLAG, -4, \
432-
VM_OC_CALL_PROP_N) \
432+
VM_OC_CALL) \
433433
CBC_OPCODE (CBC_CALL1_PROP_PUSH_RESULT, CBC_NO_FLAG, -3, \
434-
VM_OC_CALL_PROP_N | VM_OC_PUT_STACK) \
434+
VM_OC_CALL | VM_OC_PUT_STACK) \
435435
CBC_OPCODE (CBC_CALL1_PROP_BLOCK, CBC_NO_FLAG, -4, \
436-
VM_OC_CALL_PROP_N | VM_OC_PUT_BLOCK) \
436+
VM_OC_CALL | VM_OC_PUT_BLOCK) \
437437
CBC_OPCODE (CBC_CALL2, CBC_NO_FLAG, -3, \
438-
VM_OC_CALL_N) \
438+
VM_OC_CALL) \
439439
CBC_OPCODE (CBC_CALL2_PUSH_RESULT, CBC_NO_FLAG, -2, \
440-
VM_OC_CALL_N | VM_OC_PUT_STACK) \
440+
VM_OC_CALL | VM_OC_PUT_STACK) \
441441
CBC_OPCODE (CBC_CALL2_BLOCK, CBC_NO_FLAG, -3, \
442-
VM_OC_CALL_N | VM_OC_PUT_BLOCK) \
442+
VM_OC_CALL | VM_OC_PUT_BLOCK) \
443443
CBC_OPCODE (CBC_CALL2_PROP, CBC_NO_FLAG, -4, \
444-
VM_OC_CALL_PROP_N) \
444+
VM_OC_CALL) \
445445
CBC_OPCODE (CBC_CALL2_PROP_PUSH_RESULT, CBC_NO_FLAG, -3, \
446-
VM_OC_CALL_PROP_N | VM_OC_PUT_STACK) \
446+
VM_OC_CALL | VM_OC_PUT_STACK) \
447447
CBC_OPCODE (CBC_CALL2_PROP_BLOCK, CBC_NO_FLAG, -4, \
448-
VM_OC_CALL_PROP_N | VM_OC_PUT_BLOCK) \
448+
VM_OC_CALL | VM_OC_PUT_BLOCK) \
449449
\
450450
/* Binary assignment opcodes. */ \
451451
CBC_OPCODE (CBC_ASSIGN, CBC_NO_FLAG, -3, \

jerry-core/vm/opcodes.c

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -35,74 +35,6 @@
3535
* @{
3636
*/
3737

38-
/**
39-
* 'Function call' opcode handler.
40-
*
41-
* See also: ECMA-262 v5, 11.2.3
42-
*
43-
* @return ecma value
44-
* Returned value must be freed with ecma_free_value.
45-
*/
46-
ecma_value_t
47-
opfunc_call_n (ecma_value_t this_value, /**< this object value */
48-
ecma_value_t func_value, /**< function object value */
49-
const ecma_value_t *arguments_list_p, /**< stack pointer */
50-
ecma_length_t arguments_list_len) /**< number of arguments */
51-
{
52-
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
53-
54-
if (!ecma_op_is_callable (func_value))
55-
{
56-
return ecma_raise_type_error ("");
57-
}
58-
59-
ecma_object_t *func_obj_p = ecma_get_object_from_value (func_value);
60-
61-
ret_value = ecma_op_function_call (func_obj_p,
62-
this_value,
63-
arguments_list_p,
64-
arguments_list_len);
65-
66-
return ret_value;
67-
} /* opfunc_call_n */
68-
69-
/**
70-
* 'Constructor call' opcode handler.
71-
*
72-
* See also: ECMA-262 v5, 11.2.2
73-
*
74-
* @return ecma value
75-
* Returned value must be freed with ecma_free_value.
76-
*/
77-
ecma_value_t
78-
opfunc_construct_n (ecma_value_t constructor_value, /**< constructor object value */
79-
const ecma_value_t *arguments_list_p, /**< stack pointer */
80-
ecma_length_t arguments_list_len) /**< number of arguments */
81-
{
82-
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
83-
84-
if (!ecma_is_constructor (constructor_value))
85-
{
86-
ret_value = ecma_raise_type_error ("");
87-
}
88-
else
89-
{
90-
ecma_object_t *constructor_obj_p = ecma_get_object_from_value (constructor_value);
91-
92-
ECMA_TRY_CATCH (construction_ret_value,
93-
ecma_op_function_construct (constructor_obj_p,
94-
arguments_list_p,
95-
arguments_list_len),
96-
ret_value);
97-
98-
ret_value = ecma_copy_value (construction_ret_value, true);
99-
100-
ECMA_FINALIZE (construction_ret_value);
101-
}
102-
103-
return ret_value;
104-
} /* opfunc_construct_n */
105-
10638
/**
10739
* 'Variable declaration' opcode handler.
10840
*

jerry-core/vm/opcodes.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,6 @@ typedef enum
5656
ecma_value_t
5757
vm_var_decl (vm_frame_ctx_t *, ecma_string_t *);
5858

59-
ecma_value_t
60-
opfunc_call_n (ecma_value_t, ecma_value_t,
61-
const ecma_value_t *, ecma_length_t);
62-
63-
ecma_value_t
64-
opfunc_construct_n (ecma_value_t,
65-
const ecma_value_t *, ecma_length_t);
66-
6759
ecma_value_t
6860
opfunc_equal_value (ecma_value_t, ecma_value_t);
6961

jerry-core/vm/vm-defines.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,14 @@ typedef struct
4646
uint8_t *byte_code_p; /**< current byte code pointer */
4747
uint8_t *byte_code_start_p; /**< byte code start pointer */
4848
ecma_value_t *registers_p; /**< register start pointer */
49+
ecma_value_t *stack_top_p; /**< stack top pointer */
4950
lit_cpointer_t *literal_start_p; /**< literal list start pointer */
5051
ecma_object_t *lex_env_p; /**< current lexical environment */
5152
ecma_value_t this_binding; /**< this binding */
53+
ecma_value_t call_block_result; /**< preserve block result during a call */
5254
uint16_t context_depth; /**< current context depth */
53-
bool is_eval_code; /**< eval mode flag */
55+
uint8_t is_eval_code; /**< eval mode flag */
56+
uint8_t call_operation; /**< perform a call or construct operation */
5457
} vm_frame_ctx_t;
5558

5659
/**

0 commit comments

Comments
 (0)