static nxt_int_t njs_generator(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node);
+static u_char *njs_generate_reserve(njs_vm_t *vm, njs_parser_t *parser,
+ size_t size);
static nxt_int_t njs_generate_name(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node);
static nxt_int_t njs_generate_builtin_object(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_t *parser, njs_parser_node_t *node);
static nxt_int_t njs_generate_function_scope(njs_vm_t *vm,
njs_function_lambda_t *lambda, njs_parser_node_t *node);
-static void njs_generate_argument_closures(njs_parser_t *parser,
- njs_parser_node_t *node);
+static nxt_int_t njs_generate_argument_closures(njs_vm_t *vm,
+ njs_parser_t *parser, njs_parser_node_t *node);
static nxt_int_t njs_generate_return_statement(njs_vm_t *vm,
njs_parser_t *parser, njs_parser_node_t *node);
static nxt_int_t njs_generate_function_call(njs_vm_t *vm, njs_parser_t *parser,
njs_function_lambda_t *lambda, uint32_t line);
+#define njs_generate_code(parser, type, code) \
+ do { \
+ code = (type *) njs_generate_reserve(vm, parser, sizeof(type)); \
+ if (nxt_slow_path(code == NULL)) { \
+ return NXT_ERROR; \
+ } \
+ parser->code_end += sizeof(type); \
+ } while (0)
+
+
+#define njs_code_offset(parser, code) \
+ ((u_char *) code - parser->code_start)
+
+
+#define njs_code_ptr(parser, type, offset) \
+ (type *) (parser->code_start + offset)
+
+
+#define njs_code_jump_ptr(parser, offset) \
+ (njs_ret_t *) (parser->code_start + offset)
+
+
+#define njs_code_offset_diff(parser, offset) \
+ ((parser->code_end - parser->code_start) - offset)
+
+
+#define njs_code_set_offset(parser, offset, target) \
+ *(njs_code_jump_ptr(parser, offset)) = njs_code_offset_diff(parser, target)
+
+
+#define njs_code_set_jump_offset(parser, type, code_offset) \
+ *(njs_code_jump_ptr(parser, code_offset + offsetof(type, offset))) \
+ = njs_code_offset_diff(parser, code_offset)
+
+
+#define njs_code_update_offset(parser, patch) \
+ *(njs_code_jump_ptr(parser, patch->jump_offset)) += \
+ njs_code_offset_diff(parser, patch->jump_offset)
+
+
static const nxt_str_t no_label = { 0, NULL };
}
+static u_char *
+njs_generate_reserve(njs_vm_t *vm, njs_parser_t *parser, size_t size)
+{
+ u_char *p;
+
+ if (parser->code_end + size <= parser->code_start + parser->code_size) {
+ return parser->code_end;
+ }
+
+ size = nxt_max(parser->code_end - parser->code_start + size,
+ parser->code_size);
+
+ if (size < 1024) {
+ size *= 2;
+
+ } else {
+ size += size/ 2;
+ }
+
+ p = nxt_mem_cache_alloc(vm->mem_cache_pool, size);
+ if (nxt_slow_path(p == NULL)) {
+ njs_memory_error(vm);
+ return NULL;
+ }
+
+ parser->code_size = size;
+
+ size = parser->code_end - parser->code_start;
+ memcpy(p, parser->code_start, size);
+
+ parser->code_start = p;
+ parser->code_end = p + size;
+
+ return parser->code_end;
+}
+
+
static nxt_int_t
njs_generate_name(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node)
{
njs_generate_if_statement(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
- u_char *previous;
+ njs_ret_t jump_offset, label_offset;
nxt_int_t ret;
- njs_ret_t *label;
njs_vmcode_jump_t *jump;
njs_vmcode_cond_jump_t *cond_jump;
return ret;
}
- previous = (u_char *) cond_jump;
- label = &cond_jump->offset;
+ jump_offset = njs_code_offset(parser, cond_jump);
+ label_offset = jump_offset + offsetof(njs_vmcode_cond_jump_t, offset);
if (node->right != NULL && node->right->token == NJS_TOKEN_BRANCHING) {
jump->code.operands = NJS_VMCODE_NO_OPERAND;
jump->code.retval = NJS_VMCODE_NO_RETVAL;
- *label = parser->code_end - previous;
- previous = (u_char *) jump;
- label = &jump->offset;
+ njs_code_set_offset(parser, label_offset, jump_offset);
+
+ jump_offset = njs_code_offset(parser, jump);
+ label_offset = jump_offset + offsetof(njs_vmcode_jump_t, offset);
}
/*
return ret;
}
- *label = parser->code_end - previous;
+ njs_code_set_offset(parser, label_offset, jump_offset);
return NXT_OK;
}
njs_generate_cond_expression(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
+ njs_ret_t jump_offset, cond_jump_offset;
nxt_int_t ret;
njs_parser_node_t *branch;
njs_vmcode_move_t *move;
}
njs_generate_code(parser, njs_vmcode_cond_jump_t, cond_jump);
+ cond_jump_offset = njs_code_offset(parser, cond_jump);
cond_jump->code.operation = njs_vmcode_if_false_jump;
cond_jump->code.operands = NJS_VMCODE_2OPERANDS;
cond_jump->code.retval = NJS_VMCODE_NO_RETVAL;
}
njs_generate_code(parser, njs_vmcode_jump_t, jump);
+ jump_offset = njs_code_offset(parser, jump);
jump->code.operation = njs_vmcode_jump;
jump->code.operands = NJS_VMCODE_NO_OPERAND;
jump->code.retval = NJS_VMCODE_NO_RETVAL;
- cond_jump->offset = parser->code_end - (u_char *) cond_jump;
+ njs_code_set_jump_offset(parser, njs_vmcode_cond_jump_t, cond_jump_offset);
/* The "false" branch. */
move->src = branch->right->index;
}
- jump->offset = parser->code_end - (u_char *) jump;
+ njs_code_set_jump_offset(parser, njs_vmcode_cond_jump_t, jump_offset);
ret = njs_generator_node_index_release(vm, parser, branch->right);
if (nxt_slow_path(ret != NXT_OK)) {
njs_generate_switch_statement(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *swtch)
{
+ njs_ret_t jump_offset;
nxt_int_t ret;
njs_index_t index;
njs_parser_node_t *node, *expr, *branch;
return ret;
}
+ patches = NULL;
last = &patches;
for (branch = swtch->right; branch != NULL; branch = branch->left) {
return NXT_ERROR;
}
- patch->address = &equal->offset;
+ patch->jump_offset = njs_code_offset(parser, equal)
+ + offsetof(njs_vmcode_equal_jump_t, offset);
*last = patch;
last = &patch->next;
}
njs_generate_code(parser, njs_vmcode_jump_t, jump);
+ jump_offset = njs_code_offset(parser, jump);
jump->code.operation = njs_vmcode_jump;
jump->code.operands = NJS_VMCODE_1OPERAND;
jump->code.retval = NJS_VMCODE_NO_RETVAL;
for (branch = swtch->right; branch != NULL; branch = branch->left) {
if (branch->token == NJS_TOKEN_DEFAULT) {
- jump->offset = parser->code_end - (u_char *) jump;
+ njs_code_set_jump_offset(parser, njs_vmcode_jump_t, jump_offset);
jump = NULL;
node = branch;
} else {
- *patch->address += parser->code_end - (u_char *) patch->address;
+ njs_code_update_offset(parser, patch);
+
next = patch->next;
nxt_mem_cache_free(vm->mem_cache_pool, patch);
if (jump != NULL) {
/* A "switch" without default case. */
- jump->offset = parser->code_end - (u_char *) jump;
+ njs_code_set_jump_offset(parser, njs_vmcode_jump_t, jump_offset);
}
/* Patch "break" statements offsets. */
njs_generate_while_statement(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
- u_char *loop;
+ njs_ret_t jump_offset, loop_offset;
nxt_int_t ret;
njs_parser_node_t *condition;
njs_vmcode_jump_t *jump;
*/
njs_generate_code(parser, njs_vmcode_jump_t, jump);
+ jump_offset = njs_code_offset(parser, jump);
jump->code.operation = njs_vmcode_jump;
jump->code.operands = NJS_VMCODE_NO_OPERAND;
jump->code.retval = NJS_VMCODE_NO_RETVAL;
return ret;
}
- loop = parser->code_end;
+ loop_offset = njs_code_offset(parser, parser->code_end);
ret = njs_generator(vm, parser, node->left);
if (nxt_slow_path(ret != NXT_OK)) {
njs_generate_patch_loop_continuation(vm, parser);
- jump->offset = parser->code_end - (u_char *) jump;
+ njs_code_set_jump_offset(parser, njs_vmcode_jump_t, jump_offset);
condition = node->right;
cond_jump->code.operation = njs_vmcode_if_true_jump;
cond_jump->code.operands = NJS_VMCODE_2OPERANDS;
cond_jump->code.retval = NJS_VMCODE_NO_RETVAL;
- cond_jump->offset = loop - (u_char *) cond_jump;
+ cond_jump->offset = loop_offset - njs_code_offset(parser, cond_jump);
cond_jump->cond = condition->index;
njs_generate_patch_block_exit(vm, parser);
njs_generate_do_while_statement(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
- u_char *loop;
+ njs_ret_t loop_offset;
nxt_int_t ret;
njs_parser_node_t *condition;
njs_vmcode_cond_jump_t *cond_jump;
return ret;
}
- loop = parser->code_end;
+ loop_offset = njs_code_offset(parser, parser->code_end);
ret = njs_generator(vm, parser, node->left);
if (nxt_slow_path(ret != NXT_OK)) {
cond_jump->code.operation = njs_vmcode_if_true_jump;
cond_jump->code.operands = NJS_VMCODE_2OPERANDS;
cond_jump->code.retval = NJS_VMCODE_NO_RETVAL;
- cond_jump->offset = loop - (u_char *) cond_jump;
+ cond_jump->offset = loop_offset - njs_code_offset(parser, cond_jump);
cond_jump->cond = condition->index;
njs_generate_patch_block_exit(vm, parser);
njs_generate_for_statement(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
- u_char *loop;
+ njs_ret_t jump_offset, loop_offset;
nxt_int_t ret;
njs_parser_node_t *condition, *update;
njs_vmcode_jump_t *jump;
node = node->right;
condition = node->left;
+ /* GCC complains about uninitialized jump_offset. */
+ jump_offset = 0;
+
if (condition != NULL) {
/*
* The loop condition presents so set a jump to it. This jump is
* execution of one additional jump inside the loop per each iteration.
*/
njs_generate_code(parser, njs_vmcode_jump_t, jump);
+ jump_offset = njs_code_offset(parser, jump);
jump->code.operation = njs_vmcode_jump;
jump->code.operands = NJS_VMCODE_NO_OPERAND;
jump->code.retval = NJS_VMCODE_NO_RETVAL;
/* The loop body. */
- loop = parser->code_end;
+ loop_offset = njs_code_offset(parser, parser->code_end);
node = node->right;
/* The loop condition. */
if (condition != NULL) {
- jump->offset = parser->code_end - (u_char *) jump;
+ njs_code_set_jump_offset(parser, njs_vmcode_jump_t, jump_offset);
ret = njs_generator(vm, parser, condition);
if (nxt_slow_path(ret != NXT_OK)) {
cond_jump->code.operation = njs_vmcode_if_true_jump;
cond_jump->code.operands = NJS_VMCODE_2OPERANDS;
cond_jump->code.retval = NJS_VMCODE_NO_RETVAL;
- cond_jump->offset = loop - (u_char *) cond_jump;
+ cond_jump->offset = loop_offset - njs_code_offset(parser, cond_jump);
cond_jump->cond = condition->index;
njs_generate_patch_block_exit(vm, parser);
jump->code.operation = njs_vmcode_jump;
jump->code.operands = NJS_VMCODE_NO_OPERAND;
jump->code.retval = NJS_VMCODE_NO_RETVAL;
- jump->offset = loop - (u_char *) jump;
+ jump->offset = loop_offset - njs_code_offset(parser, jump);
njs_generate_patch_block_exit(vm, parser);
njs_generate_for_in_statement(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
- u_char *loop;
+ njs_ret_t loop_offset, prop_offset;
nxt_int_t ret;
njs_index_t index;
njs_parser_node_t *foreach;
}
njs_generate_code(parser, njs_vmcode_prop_foreach_t, prop_foreach);
+ prop_offset = njs_code_offset(parser, prop_foreach);
prop_foreach->code.operation = njs_vmcode_property_foreach;
prop_foreach->code.operands = NJS_VMCODE_2OPERANDS;
prop_foreach->code.retval = NJS_VMCODE_RETVAL;
/* The loop body. */
- loop = parser->code_end;
+ loop_offset = njs_code_offset(parser, parser->code_end);
ret = njs_generator(vm, parser, node->right);
if (nxt_slow_path(ret != NXT_OK)) {
njs_generate_patch_loop_continuation(vm, parser);
- prop_foreach->offset = parser->code_end - (u_char *) prop_foreach;
+ njs_code_set_jump_offset(parser, njs_vmcode_prop_foreach_t, prop_offset);
ret = njs_generator(vm, parser, node->left->left);
if (nxt_slow_path(ret != NXT_OK)) {
}
njs_generate_code(parser, njs_vmcode_prop_next_t, prop_next);
+ prop_offset = njs_code_offset(parser, prop_next);
prop_next->code.operation = njs_vmcode_property_next;
prop_next->code.operands = NJS_VMCODE_3OPERANDS;
prop_next->code.retval = NJS_VMCODE_NO_RETVAL;
prop_next->retval = foreach->left->index;
prop_next->object = foreach->right->index;
prop_next->next = index;
- prop_next->offset = loop - (u_char *) prop_next;
+ prop_next->offset = loop_offset - prop_offset;
njs_generate_patch_block_exit(vm, parser);
block = parser->block;
for (patch = block->continuation; patch != NULL; patch = next) {
- *patch->address += parser->code_end - (u_char *) patch->address;
+ njs_code_update_offset(parser, patch);
next = patch->next;
nxt_mem_cache_free(vm->mem_cache_pool, patch);
parser->block = block->next;
for (patch = block->exit; patch != NULL; patch = next) {
- *patch->address += parser->code_end - (u_char *) patch->address;
+ njs_code_update_offset(parser, patch);
next = patch->next;
nxt_mem_cache_free(vm->mem_cache_pool, patch);
jump->code.retval = NJS_VMCODE_NO_RETVAL;
jump->offset = offsetof(njs_vmcode_jump_t, offset);
- patch->address = &jump->offset;
+ patch->jump_offset = njs_code_offset(parser, jump)
+ + offsetof(njs_vmcode_jump_t, offset);
}
return NXT_OK;
jump->code.retval = NJS_VMCODE_NO_RETVAL;
jump->offset = offsetof(njs_vmcode_jump_t, offset);
- patch->address = &jump->offset;
+ patch->jump_offset = njs_code_offset(parser, jump)
+ + offsetof(njs_vmcode_jump_t, offset);
}
return NXT_OK;
njs_generate_test_jump_expression(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
+ njs_ret_t jump_offset;
nxt_int_t ret;
njs_vmcode_move_t *move;
njs_vmcode_test_jump_t *test_jump;
}
njs_generate_code(parser, njs_vmcode_test_jump_t, test_jump);
+ jump_offset = njs_code_offset(parser, test_jump);
test_jump->code.operation = node->u.operation;
test_jump->code.operands = NJS_VMCODE_2OPERANDS;
test_jump->code.retval = NJS_VMCODE_RETVAL;
move->src = node->right->index;
}
- test_jump->offset = parser->code_end - (u_char *) test_jump;
+ njs_code_set_jump_offset(parser, njs_vmcode_test_jump_t, jump_offset);
return njs_generator_children_indexes_release(vm, parser, node);
}
parser = lambda->parser;
node = node->right;
- parser->code_size += node->scope->argument_closures
- * sizeof(njs_vmcode_move_t);
-
parser->arguments_object = 0;
ret = njs_generate_scope(vm, parser, node);
njs_generate_scope(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node)
{
u_char *p;
- size_t code_size, size;
+ size_t size;
uintptr_t scope_size;
+ nxt_int_t ret;
nxt_uint_t n;
njs_value_t *value;
njs_vm_code_t *code;
scope = node->scope;
+ parser->code_size = 128;
+
p = nxt_mem_cache_alloc(vm->mem_cache_pool, parser->code_size);
if (nxt_slow_path(p == NULL)) {
return NXT_ERROR;
parser->code_start = p;
parser->code_end = p;
- njs_generate_argument_closures(parser, node);
-
- if (nxt_slow_path(njs_generator(vm, parser, node) != NXT_OK)) {
+ ret = njs_generate_argument_closures(vm, parser, node);
+ if (nxt_slow_path(ret != NXT_OK)) {
return NXT_ERROR;
}
- code_size = parser->code_end - parser->code_start;
-
- nxt_thread_log_debug("SCOPE CODE SIZE: %uz %uz",
- parser->code_size, code_size);
-
- if (nxt_slow_path(parser->code_size < code_size)) {
- njs_internal_error(vm, "code size mismatch expected %uz < actual %uz",
- parser->code_size, code_size);
+ if (nxt_slow_path(njs_generator(vm, parser, node) != NXT_OK)) {
return NXT_ERROR;
}
+ parser->code_size = parser->code_end - parser->code_start;
+
scope_size = njs_scope_offset(scope->next_index[0]);
if (scope->type == NJS_SCOPE_GLOBAL) {
}
-static void
-njs_generate_argument_closures(njs_parser_t *parser, njs_parser_node_t *node)
+static nxt_int_t
+njs_generate_argument_closures(njs_vm_t *vm, njs_parser_t *parser,
+ njs_parser_node_t *node)
{
nxt_uint_t n;
njs_index_t index;
n = node->scope->argument_closures;
if (n == 0) {
- return;
+ return NXT_OK;
}
nxt_lvlhsh_each_init(&lhe, &njs_variables_hash_proto);
}
} while(n != 0);
+
+ return NXT_OK;
}
njs_generate_function_call(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
+ njs_ret_t func_offset;
njs_ret_t ret;
njs_parser_node_t *name;
njs_vmcode_function_frame_t *func;
}
njs_generate_code(parser, njs_vmcode_function_frame_t, func);
+ func_offset = njs_code_offset(parser, func);
func->code.operation = njs_vmcode_function_frame;
func->code.operands = NJS_VMCODE_2OPERANDS;
func->code.retval = NJS_VMCODE_NO_RETVAL;
ret = njs_generate_call(vm, parser, node);
if (nxt_fast_path(ret >= 0)) {
+ func = njs_code_ptr(parser, njs_vmcode_function_frame_t, func_offset);
func->nargs = ret;
return NXT_OK;
}
njs_generate_method_call(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
+ njs_ret_t method_offset;
nxt_int_t ret;
njs_parser_node_t *prop;
njs_vmcode_method_frame_t *method;
}
njs_generate_code(parser, njs_vmcode_method_frame_t, method);
+ method_offset = njs_code_offset(parser, method);
method->code.operation = njs_vmcode_method_frame;
method->code.operands = NJS_VMCODE_3OPERANDS;
method->code.retval = NJS_VMCODE_NO_RETVAL;
ret = njs_generate_call(vm, parser, node);
if (nxt_fast_path(ret >= 0)) {
+ method = njs_code_ptr(parser, njs_vmcode_method_frame_t, method_offset);
method->nargs = ret;
return NXT_OK;
}
njs_generate_try_statement(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
+ njs_ret_t try_offset, catch_offset;
nxt_int_t ret;
njs_index_t index, catch_index;
njs_vmcode_catch_t *catch;
njs_vmcode_try_start_t *try_start;
njs_generate_code(parser, njs_vmcode_try_start_t, try_start);
+ try_offset = njs_code_offset(parser, try_start);
try_start->code.operation = njs_vmcode_try_start;
try_start->code.operands = NJS_VMCODE_2OPERANDS;
try_start->code.retval = NJS_VMCODE_NO_RETVAL;
try_end->code.operands = NJS_VMCODE_NO_OPERAND;
try_end->code.retval = NJS_VMCODE_NO_RETVAL;
- try_start->offset = parser->code_end - (u_char *) try_start;
+ njs_code_set_jump_offset(parser, njs_vmcode_try_start_t, try_offset);
+ try_offset = njs_code_offset(parser, try_end);
node = node->right;
return ret;
}
- try_end->offset = parser->code_end - (u_char *) try_end;
+ njs_code_set_jump_offset(parser, njs_vmcode_try_end_t, try_offset);
/* TODO: release exception variable index. */
}
njs_generate_code(parser, njs_vmcode_catch_t, catch);
+ catch_offset = njs_code_offset(parser, catch);
catch->code.operation = njs_vmcode_catch;
catch->code.operands = NJS_VMCODE_2OPERANDS;
catch->code.retval = NJS_VMCODE_NO_RETVAL;
catch_end->code.operands = NJS_VMCODE_NO_OPERAND;
catch_end->code.retval = NJS_VMCODE_NO_RETVAL;
- catch->offset = parser->code_end - (u_char *) catch;
+ njs_code_set_jump_offset(parser, njs_vmcode_catch_t, catch_offset);
+ catch_offset = njs_code_offset(parser, catch_end);
/* TODO: release exception variable index. */
catch->offset = sizeof(njs_vmcode_catch_t);
catch->exception = index;
- catch_end->offset = parser->code_end - (u_char *) catch_end;
+ njs_code_set_jump_offset(parser, njs_vmcode_try_end_t,
+ catch_offset);
} else {
/* A try/finally case. */
catch->exception = index;
}
- try_end->offset = parser->code_end - (u_char *) try_end;
+ njs_code_set_jump_offset(parser, njs_vmcode_try_end_t, try_offset);
ret = njs_generator(vm, parser, node->right);
if (nxt_slow_path(ret != NXT_OK)) {
node->token_line = parser->lexer->token_line;
node->scope = parser->scope;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_function_t);
parser = njs_parser_function_create(vm, parser);
if (nxt_slow_path(parser == NULL)) {
}
node->right->token = NJS_TOKEN_RETURN;
-
- parser->code_size += sizeof(njs_vmcode_return_t);
}
parser->parent->node->right = parser->node;
node->token = NJS_TOKEN_RETURN;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_return_t);
token = njs_lexer_token(parser->lexer);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
stmt->left = left;
stmt->right = assign;
parser->node = stmt;
- parser->code_size += sizeof(njs_vmcode_2addr_t);
left = stmt;
node->left = stmt;
node->right = parser->node;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_jump_t);
}
node = njs_parser_node_alloc(vm);
node->left = cond;
node->right = parser->node;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_cond_jump_t);
return token;
}
branch->right = node;
- parser->code_size += sizeof(njs_vmcode_equal_jump_t);
-
} else {
if (dflt != NULL) {
njs_parser_syntax_error(vm, parser,
}
parser->node = swtch;
- parser->code_size += sizeof(njs_vmcode_move_t) + sizeof(njs_vmcode_jump_t);
return njs_parser_token(parser);
}
node->left = parser->node;
node->right = cond;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_jump_t)
- + sizeof(njs_vmcode_cond_jump_t);
return token;
}
node->left = stmt;
node->right = parser->node;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_cond_jump_t);
return token;
}
body->right = update;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_jump_t)
- + sizeof(njs_vmcode_cond_jump_t);
+
return token;
}
stmt->left = left;
stmt->right = assign;
parser->node = stmt;
- parser->code_size += sizeof(njs_vmcode_2addr_t);
left = stmt;
foreach->right = parser->node;
parser->node = foreach;
- parser->code_size += sizeof(njs_vmcode_prop_foreach_t)
- + sizeof(njs_vmcode_prop_next_t);
+
return token;
}
node->right = parser->node;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_prop_foreach_t)
- + sizeof(njs_vmcode_prop_next_t);
+
return token;
}
node->token = NJS_TOKEN_CONTINUE;
node->token_line = parser->lexer->token_line;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_jump_t);
token = njs_lexer_token(parser->lexer);
node->token = NJS_TOKEN_BREAK;
node->token_line = parser->lexer->token_line;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_jump_t);
token = njs_lexer_token(parser->lexer);
try->token = NJS_TOKEN_TRY;
try->scope = parser->scope;
try->left = parser->node;
- parser->code_size += sizeof(njs_vmcode_try_start_t)
- + sizeof(njs_vmcode_try_end_t);
if (token == NJS_TOKEN_CATCH) {
token = njs_parser_token(parser);
catch->left = node;
- parser->code_size += sizeof(njs_vmcode_catch_t);
-
token = njs_parser_token(parser);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
if (try->right != NULL) {
node->left = try->right;
- parser->code_size += sizeof(njs_vmcode_try_end_t);
}
try->right = node;
- parser->code_size += sizeof(njs_vmcode_catch_t)
- + sizeof(njs_vmcode_finally_t);
}
if (try->right == NULL) {
return NJS_TOKEN_ERROR;
}
- parser->code_size += sizeof(njs_vmcode_object_copy_t);
break;
case NJS_TOKEN_OPEN_BRACE:
parser->node = node;
}
- parser->code_size += sizeof(njs_vmcode_1addr_t);
-
return token;
case NJS_TOKEN_OPEN_BRACKET:
parser->node = node;
}
- parser->code_size += sizeof(njs_vmcode_2addr_t);
-
return token;
case NJS_TOKEN_DIVISION:
node->token = NJS_TOKEN_REGEXP;
node->scope = parser->scope;
- parser->code_size += sizeof(njs_vmcode_regexp_t);
break;
node->token = NJS_TOKEN_ARGUMENTS;
- parser->code_size += sizeof(njs_vmcode_arguments_t);
-
break;
case NJS_TOKEN_OBJECT_CONSTRUCTOR:
node->scope = parser->scope;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_object_copy_t);
return njs_parser_token(parser);
}
node->scope = parser->scope;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_object_copy_t);
return njs_parser_token(parser);
}
propref->token = NJS_TOKEN_PROPERTY;
propref->left = object;
propref->right = parser->node;
- parser->code_size += sizeof(njs_vmcode_3addr_t);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
stmt->left = left;
stmt->right = assign;
- parser->code_size += sizeof(njs_vmcode_2addr_t);
parser->node = stmt;
left = stmt;
propref->token = NJS_TOKEN_PROPERTY;
propref->left = object;
propref->right = node;
- parser->code_size += sizeof(njs_vmcode_3addr_t);
token = njs_parser_assignment_expression(vm, parser, token);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
njs_token_t
njs_parser_var_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
{
- size_t size;
njs_parser_node_t *node;
njs_vmcode_operation_t operation;
case NJS_TOKEN_ASSIGNMENT:
nxt_thread_log_debug("JS: =");
operation = njs_vmcode_move;
- size = sizeof(njs_vmcode_move_t);
break;
default:
node->u.operation = operation;
node->scope = parser->scope;
node->left = parser->node;
- parser->code_size += size;
token = njs_parser_token(parser);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser,
njs_token_t token)
{
- size_t size;
njs_parser_node_t *node;
njs_vmcode_operation_t operation;
node->right = parser->node;
parser->node = node;
-
- if (node->left->token == NJS_TOKEN_NAME) {
-
- if (node->token == NJS_TOKEN_ASSIGNMENT) {
- size = sizeof(njs_vmcode_move_t);
-
- } else {
- if (njs_parser_has_side_effect(node->right)) {
- size = sizeof(njs_vmcode_move_t)
- + sizeof(njs_vmcode_3addr_t);
- } else {
- size = sizeof(njs_vmcode_3addr_t);
- }
- }
-
- } else {
- if (node->token == NJS_TOKEN_ASSIGNMENT) {
- size = sizeof(njs_vmcode_prop_set_t);
-
- if (njs_parser_has_side_effect(node->right)) {
- size += 2 * sizeof(njs_vmcode_move_t);
- }
-
- } else {
- size = sizeof(njs_vmcode_prop_get_t)
- + sizeof(njs_vmcode_3addr_t)
- + sizeof(njs_vmcode_prop_set_t);
- }
- }
-
- parser->code_size += size;
}
}
node->right->dest = cond;
parser->node = cond;
- parser->code_size += sizeof(njs_vmcode_cond_jump_t)
- + sizeof(njs_vmcode_move_t)
- + sizeof(njs_vmcode_jump_t)
- + sizeof(njs_vmcode_move_t);
}
}
node->left = parser->node;
node->left->dest = node;
- parser->code_size += op->size;
-
token = njs_parser_token(parser);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
node->left = parser->node;
node->left->dest = node;
- parser->code_size += sizeof(njs_vmcode_3addr_t);
-
token = njs_parser_token(parser);
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
case NJS_TOKEN_PROPERTY:
node->token = NJS_TOKEN_PROPERTY_DELETE;
node->u.operation = njs_vmcode_property_delete;
- parser->code_size += sizeof(njs_vmcode_3addr_t);
return next;
node->left = parser->node;
node->left->dest = node;
parser->node = node;
- parser->code_size += sizeof(njs_vmcode_2addr_t);
return next;
}
return NJS_TOKEN_ILLEGAL;
}
- parser->code_size += (parser->node->token == NJS_TOKEN_NAME)
- ? sizeof(njs_vmcode_3addr_t)
- : sizeof(njs_vmcode_3addr_t)
- + sizeof(njs_vmcode_prop_set_t);
-
node = njs_parser_node_alloc(vm);
if (nxt_slow_path(node == NULL)) {
return NJS_TOKEN_ERROR;
return NJS_TOKEN_ILLEGAL;
}
- parser->code_size += (parser->node->token == NJS_TOKEN_NAME)
- ? sizeof(njs_vmcode_3addr_t)
- : sizeof(njs_vmcode_3addr_t)
- + sizeof(njs_vmcode_prop_set_t);
-
node = njs_parser_node_alloc(vm);
if (nxt_slow_path(node == NULL)) {
return NJS_TOKEN_ERROR;
func = node;
func->token = NJS_TOKEN_FUNCTION_CALL;
func->scope = parser->scope;
- parser->code_size += sizeof(njs_vmcode_function_frame_t)
- + sizeof(njs_vmcode_function_call_t);
+
break;
case NJS_TOKEN_PROPERTY:
func->token = NJS_TOKEN_METHOD_CALL;
func->scope = parser->scope;
func->left = node;
- parser->code_size += sizeof(njs_vmcode_method_frame_t)
- + sizeof(njs_vmcode_function_call_t);
+
break;
default:
func->token = NJS_TOKEN_FUNCTION_CALL;
func->scope = parser->scope;
func->left = node;
- parser->code_size += sizeof(njs_vmcode_function_frame_t)
- + sizeof(njs_vmcode_function_call_t);
+
break;
}
case NJS_TOKEN_NAME:
func = node;
func->token = NJS_TOKEN_FUNCTION_CALL;
- parser->code_size += sizeof(njs_vmcode_function_frame_t)
- + sizeof(njs_vmcode_function_call_t);
+
break;
case NJS_TOKEN_PROPERTY:
func->token = NJS_TOKEN_METHOD_CALL;
func->scope = parser->scope;
func->left = node;
- parser->code_size += sizeof(njs_vmcode_method_frame_t)
- + sizeof(njs_vmcode_function_call_t);
+
break;
default:
func->token = NJS_TOKEN_FUNCTION_CALL;
func->scope = parser->scope;
func->left = node;
- parser->code_size += sizeof(njs_vmcode_function_frame_t)
- + sizeof(njs_vmcode_function_call_t);
+
break;
}
node->right = parser->node;
parser->node = node;
-
- parser->code_size += sizeof(njs_vmcode_prop_get_t);
}
}
parent->right = node;
parent = node;
- parser->code_size += sizeof(njs_vmcode_move_t);
-
} while (token == NJS_TOKEN_COMMA);
if (nxt_slow_path(token != NJS_TOKEN_CLOSE_PARENTHESIS)) {