Implement the core of let/const statement. (#3239)
This patch implements the core part of let/const statements. Redeclarations are correctly detected and separate contexts are correctly created for these statements. Register optimizations are also emplyed whenever possible. Lots of features are still missing: - checking the var statements in eval - const are treated as lets - single statement checks are missing - export declarations are exported as vars, let/const export is not supported JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
committed by
Dániel Bátyai
parent
4b352758c1
commit
3d797b8836
@@ -192,6 +192,8 @@
|
||||
#define PARSER_FOR_OF_CONTEXT_STACK_ALLOCATION 3
|
||||
/* PARSER_FOR_IN_CONTEXT_STACK_ALLOCATION must be <= 4 */
|
||||
#define PARSER_FOR_IN_CONTEXT_STACK_ALLOCATION 4
|
||||
/* PARSER_BLOCK_CONTEXT_STACK_ALLOCATION must be <= 3 */
|
||||
#define PARSER_BLOCK_CONTEXT_STACK_ALLOCATION 1
|
||||
/* PARSER_WITH_CONTEXT_STACK_ALLOCATION must be <= 4 */
|
||||
#define PARSER_WITH_CONTEXT_STACK_ALLOCATION 1
|
||||
/* PARSER_SUPER_CLASS_CONTEXT_STACK_ALLOCATION must be <= 4 */
|
||||
@@ -244,6 +246,10 @@
|
||||
VM_OC_PUSH_ELISON | VM_OC_PUT_STACK) \
|
||||
CBC_FORWARD_BRANCH (CBC_BRANCH_IF_STRICT_EQUAL, -1, \
|
||||
VM_OC_BRANCH_IF_STRICT_EQUAL) \
|
||||
CBC_OPCODE (CBC_PUSH_NULL, CBC_NO_FLAG, 1, \
|
||||
VM_OC_PUSH_NULL | VM_OC_PUT_STACK) \
|
||||
CBC_FORWARD_BRANCH (CBC_BLOCK_CREATE_CONTEXT, \
|
||||
PARSER_BLOCK_CONTEXT_STACK_ALLOCATION, VM_OC_BLOCK_CREATE_CONTEXT) \
|
||||
\
|
||||
/* Basic opcodes. Note: These 4 opcodes must me in this order */ \
|
||||
CBC_OPCODE (CBC_PUSH_LITERAL, CBC_HAS_LITERAL_ARG, 1, \
|
||||
@@ -260,8 +266,6 @@
|
||||
VM_OC_PUSH_TRUE | VM_OC_PUT_STACK) \
|
||||
CBC_OPCODE (CBC_PUSH_FALSE, CBC_NO_FLAG, 1, \
|
||||
VM_OC_PUSH_FALSE | VM_OC_PUT_STACK) \
|
||||
CBC_OPCODE (CBC_PUSH_NULL, CBC_NO_FLAG, 1, \
|
||||
VM_OC_PUSH_NULL | VM_OC_PUT_STACK) \
|
||||
CBC_OPCODE (CBC_PUSH_THIS, CBC_NO_FLAG, 1, \
|
||||
VM_OC_PUSH_THIS | VM_OC_PUT_STACK) \
|
||||
CBC_OPCODE (CBC_PUSH_NUMBER_0, CBC_NO_FLAG, 1, \
|
||||
@@ -302,6 +306,10 @@
|
||||
VM_OC_NONE) \
|
||||
CBC_OPCODE (CBC_INIT_LOCAL, CBC_HAS_LITERAL_ARG | CBC_HAS_LITERAL_ARG2, 0, \
|
||||
VM_OC_NONE) \
|
||||
CBC_OPCODE (CBC_CREATE_VAR_FUNC, CBC_HAS_LITERAL_ARG | CBC_HAS_LITERAL_ARG2, 0, \
|
||||
VM_OC_ASSIGN | VM_OC_GET_LITERAL | VM_OC_PUT_IDENT) \
|
||||
CBC_OPCODE (CBC_SET_VAR_FUNC, CBC_HAS_LITERAL_ARG | CBC_HAS_LITERAL_ARG2, 0, \
|
||||
VM_OC_ASSIGN | VM_OC_GET_LITERAL | VM_OC_PUT_IDENT) \
|
||||
CBC_OPCODE (CBC_SET_BYTECODE_PTR, CBC_NO_FLAG, 0, \
|
||||
VM_OC_NONE) \
|
||||
CBC_OPCODE (CBC_RETURN, CBC_NO_FLAG, -1, \
|
||||
@@ -508,8 +516,8 @@
|
||||
VM_OC_SET_SETTER | VM_OC_NON_STATIC_FLAG | VM_OC_GET_LITERAL_LITERAL) \
|
||||
CBC_FORWARD_BRANCH (CBC_EXT_TRY_CREATE_CONTEXT, PARSER_TRY_CONTEXT_STACK_ALLOCATION, \
|
||||
VM_OC_TRY) \
|
||||
CBC_OPCODE (CBC_EXT_THROW_REFERENCE_ERROR, CBC_NO_FLAG, 1, \
|
||||
VM_OC_THROW_REFERENCE_ERROR) \
|
||||
CBC_OPCODE (CBC_EXT_TRY_CREATE_ENV, CBC_NO_FLAG, 0, \
|
||||
VM_OC_BLOCK_CREATE_CONTEXT) \
|
||||
CBC_FORWARD_BRANCH (CBC_EXT_CATCH, 1, \
|
||||
VM_OC_CATCH) \
|
||||
CBC_OPCODE (CBC_EXT_PUSH_UNDEFINED_BASE, CBC_NO_FLAG, 1, \
|
||||
@@ -554,6 +562,8 @@
|
||||
VM_OC_SET_SETTER | VM_OC_GET_STACK_LITERAL) \
|
||||
CBC_OPCODE (CBC_EXT_RESOLVE_BASE, CBC_NO_FLAG, 0, \
|
||||
VM_OC_RESOLVE_BASE_FOR_CALL) \
|
||||
CBC_OPCODE (CBC_EXT_THROW_REFERENCE_ERROR, CBC_NO_FLAG, 1, \
|
||||
VM_OC_THROW_REFERENCE_ERROR) \
|
||||
\
|
||||
/* Class opcodes */ \
|
||||
CBC_OPCODE (CBC_EXT_INHERIT_AND_SET_CONSTRUCTOR, CBC_NO_FLAG, 0, \
|
||||
|
||||
Reference in New Issue
Block a user