From: Igor Sysoev Date: Wed, 25 Nov 2015 14:22:45 +0000 (+0300) Subject: Style and small miscellaneous fixes. X-Git-Tag: 0.1.0~108 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=617f1c6018b0c7bc45d503914e18a9582c89395a;p=njs.git Style and small miscellaneous fixes. --- diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c index 5df2138d..a41f3e83 100644 --- a/nginx/ngx_http_js_module.c +++ b/nginx/ngx_http_js_module.c @@ -25,10 +25,10 @@ #define ngx_http_js_create_mem_cache_pool() \ nxt_mem_cache_pool_create(&ngx_http_js_mem_cache_pool_proto, NULL, NULL, \ - NGX_HTTP_JS_MCP_CLUSTER_SIZE, \ - NGX_HTTP_JS_MCP_PAGE_ALIGNMENT, \ - NGX_HTTP_JS_MCP_PAGE_SIZE, \ - NGX_HTTP_JS_MCP_MIN_CHUNK_SIZE) + NGX_HTTP_JS_MCP_CLUSTER_SIZE, \ + NGX_HTTP_JS_MCP_PAGE_ALIGNMENT, \ + NGX_HTTP_JS_MCP_PAGE_SIZE, \ + NGX_HTTP_JS_MCP_MIN_CHUNK_SIZE) typedef struct { @@ -361,10 +361,10 @@ static njs_external_t ngx_http_js_externals[] = { static ngx_int_t ngx_http_js_handler(ngx_http_request_t *r) { - nxt_str_t value; + nxt_str_t value; njs_vm_t *nvm; ngx_pool_cleanup_t *cln; - nxt_mem_cache_pool_t *mcp; + nxt_mem_cache_pool_t *mcp; ngx_http_js_loc_conf_t *jlcf; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, @@ -410,8 +410,8 @@ ngx_http_js_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, njs_vm_t *vm = (njs_vm_t *) data; nxt_str_t value; - njs_vm_t *nvm; - ngx_pool_cleanup_t *cln; + njs_vm_t *nvm; + ngx_pool_cleanup_t *cln; nxt_mem_cache_pool_t *mcp; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, @@ -645,7 +645,7 @@ static njs_ret_t ngx_http_js_ext_get_header_out(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { - nxt_str_t *v; + nxt_str_t *v; ngx_table_elt_t *h; ngx_http_request_t *r; @@ -666,7 +666,7 @@ ngx_http_js_ext_set_header_out(njs_vm_t *vm, void *obj, uintptr_t data, nxt_str_t *value) { u_char *p; - nxt_str_t *v; + nxt_str_t *v; ngx_table_elt_t *h; ngx_http_request_t *r; @@ -816,8 +816,8 @@ ngx_http_js_ext_send_header(njs_vm_t *vm, njs_param_t *param) static njs_ret_t ngx_http_js_ext_send(njs_vm_t *vm, njs_param_t *param) { - nxt_int_t ret; - nxt_str_t s; + nxt_int_t ret; + nxt_str_t s; ngx_buf_t *b; uintptr_t nargs, next; ngx_uint_t n; @@ -946,7 +946,7 @@ static njs_ret_t ngx_http_js_ext_get_header_in(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { - nxt_str_t *v; + nxt_str_t *v; ngx_table_elt_t *h; ngx_http_request_t *r; @@ -973,7 +973,7 @@ static njs_ret_t ngx_http_js_ext_get_arg(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { - nxt_str_t *v; + nxt_str_t *v; ngx_str_t arg; ngx_http_request_t *r; @@ -1117,12 +1117,12 @@ ngx_http_js_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) static njs_vm_t * ngx_http_js_compile(ngx_conf_t *cf, ngx_str_t *script) { - u_char *start, *end; + u_char *start, *end; nxt_int_t rc; nxt_str_t s; - njs_vm_t *vm; + njs_vm_t *vm; nxt_lvlhsh_t externals; - njs_vm_shared_t *shared; + njs_vm_shared_t *shared; nxt_mem_cache_pool_t *mcp; mcp = ngx_http_js_create_mem_cache_pool(); diff --git a/njs/njs_array.c b/njs/njs_array.c index a01f9b23..41b45334 100644 --- a/njs/njs_array.c +++ b/njs/njs_array.c @@ -32,7 +32,7 @@ typedef struct { static nxt_noinline njs_value_t *njs_array_copy(njs_value_t *dst, njs_value_t *src); -static nxt_int_t njs_array_next(njs_value_t *value, nxt_uint_t n, +static nxt_noinline nxt_int_t njs_array_next(njs_value_t *value, nxt_uint_t n, nxt_uint_t length); @@ -876,7 +876,7 @@ njs_array_prototype_every(njs_vm_t *vm, njs_param_t *param) } -static nxt_int_t +static nxt_noinline nxt_int_t njs_array_next(njs_value_t *value, nxt_uint_t n, nxt_uint_t length) { while (n < length) { diff --git a/njs/njs_disassembler.c b/njs/njs_disassembler.c index b7d9db5a..8436d0f1 100644 --- a/njs/njs_disassembler.c +++ b/njs/njs_disassembler.c @@ -95,7 +95,7 @@ static njs_code_name_t code_names[] = { { njs_vmcode_right_shift, sizeof(njs_vmcode_3addr_t), nxt_string("RIGHT SHIFT ") }, { njs_vmcode_unsigned_right_shift, sizeof(njs_vmcode_3addr_t), - nxt_string("UNS RIGHT SHIFT ") }, + nxt_string("USGN RIGHT SHIFT") }, { njs_vmcode_logical_not, sizeof(njs_vmcode_2addr_t), nxt_string("LOGICAL NOT ") }, diff --git a/njs/njs_function.c b/njs/njs_function.c index c983e12f..5411fc4f 100644 --- a/njs/njs_function.c +++ b/njs/njs_function.c @@ -103,7 +103,7 @@ njs_vmcode_native_frame(njs_vm_t *vm, njs_value_t *method, uintptr_t nargs, njs_value_t *this; njs_native_frame_t *frame; - size= NJS_NATIVE_FRAME_SIZE + size = NJS_NATIVE_FRAME_SIZE + method->data.string_size + nargs * sizeof(njs_value_t); diff --git a/njs/njs_function.h b/njs/njs_function.h index 1a9f607d..720f467e 100644 --- a/njs/njs_function.h +++ b/njs/njs_function.h @@ -61,12 +61,10 @@ struct njs_function_s { #define NJS_FRAME_SPARE_SIZE 512 -#define \ -njs_method_data_size(size) \ +#define njs_method_data_size(size) \ nxt_align_size(size, sizeof(njs_value_t)) -#define \ -njs_native_data(frame) \ +#define njs_native_data(frame) \ (void *) ((u_char *) frame + NJS_NATIVE_FRAME_SIZE) diff --git a/njs/njs_generator.c b/njs/njs_generator.c index b38f8260..6e6ac440 100644 --- a/njs/njs_generator.c +++ b/njs/njs_generator.c @@ -71,13 +71,15 @@ static nxt_int_t njs_generate_throw_statement(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node); static njs_index_t njs_generator_dest_index(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node); -static njs_index_t njs_generator_temp_index_get(njs_parser_t *parser); -static nxt_int_t njs_generator_children_indexes_release(njs_vm_t *vm, - njs_parser_t *parser, njs_parser_node_t *node); -static nxt_int_t njs_generator_node_index_release(njs_vm_t *vm, +static nxt_noinline njs_index_t + njs_generator_temp_index_get(njs_parser_t *parser); +static nxt_noinline nxt_int_t + njs_generator_children_indexes_release(njs_vm_t *vm, njs_parser_t *parser, + njs_parser_node_t *node); +static nxt_noinline nxt_int_t njs_generator_node_index_release(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node); -static nxt_int_t njs_generator_index_release(njs_vm_t *vm, njs_parser_t *parser, - njs_index_t index); +static nxt_noinline nxt_int_t njs_generator_index_release(njs_vm_t *vm, + njs_parser_t *parser, njs_index_t index); static nxt_int_t @@ -154,10 +156,10 @@ njs_generator(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node) case NJS_TOKEN_IN: /* - * An "in" operation is parsed as standard binary expression by - * njs_parser_binary_expression(). However, its operands should - * be swapped to be uniform with other property operations (get/set - * and delete) to use the array and object property traps. + * An "in" operation is parsed as standard binary expression + * by njs_parser_binary_expression(). However, its operands + * should be swapped to be uniform with other property operations + * (get/set and delete) to use the property trap. */ left = node->left; node->left = node->right; @@ -343,7 +345,7 @@ njs_generate_if_statement(njs_vm_t *vm, njs_parser_t *parser, jump->code.operands = NJS_VMCODE_NO_OPERAND; jump->code.retval = NJS_VMCODE_NO_RETVAL; - *label = parser->code_last - start; + *label = parser->code_end - start; start = (u_char *) jump; label = &jump->offset; } @@ -353,7 +355,7 @@ njs_generate_if_statement(njs_vm_t *vm, njs_parser_t *parser, return ret; } - *label = parser->code_last - start; + *label = parser->code_end - start; return NXT_OK; } @@ -401,7 +403,7 @@ njs_generate_cond_expression(njs_vm_t *vm, njs_parser_t *parser, jump->code.operands = NJS_VMCODE_NO_OPERAND; jump->code.retval = NJS_VMCODE_NO_RETVAL; - cond_jump->offset = parser->code_last - (u_char *) cond_jump; + cond_jump->offset = parser->code_end - (u_char *) cond_jump; ret = njs_generator(vm, parser, branch->right); if (nxt_slow_path(ret != NXT_OK)) { @@ -414,7 +416,7 @@ njs_generate_cond_expression(njs_vm_t *vm, njs_parser_t *parser, move->code.retval = NJS_VMCODE_RETVAL; move->src = branch->right->index; - jump->offset = parser->code_last - (u_char *) jump; + jump->offset = parser->code_end - (u_char *) jump; index = njs_generator_dest_index(vm, parser, node); @@ -485,7 +487,7 @@ njs_generate_while_statement(njs_vm_t *vm, njs_parser_t *parser, /* The loop body. */ - loop = parser->code_last; + loop = parser->code_end; ret = njs_generator(vm, parser, node->left); if (nxt_slow_path(ret != NXT_OK)) { @@ -494,7 +496,7 @@ njs_generate_while_statement(njs_vm_t *vm, njs_parser_t *parser, /* The loop condition. */ - jump->offset = parser->code_last - (u_char *) jump; + jump->offset = parser->code_end - (u_char *) jump; ret = njs_generator(vm, parser, node->right); if (nxt_slow_path(ret != NXT_OK)) { @@ -522,7 +524,7 @@ njs_generate_do_while_statement(njs_vm_t *vm, njs_parser_t *parser, /* The loop body. */ - loop = parser->code_last; + loop = parser->code_end; ret = njs_generator(vm, parser, node->left); if (nxt_slow_path(ret != NXT_OK)) { @@ -583,7 +585,7 @@ njs_generate_for_statement(njs_vm_t *vm, njs_parser_t *parser, /* The loop body. */ - loop = parser->code_last; + loop = parser->code_end; node = node->right; @@ -602,7 +604,7 @@ njs_generate_for_statement(njs_vm_t *vm, njs_parser_t *parser, /* The loop condition. */ if (condition != NULL) { - jump->offset = parser->code_last - (u_char *) jump; + jump->offset = parser->code_end - (u_char *) jump; ret = njs_generator(vm, parser, condition); if (nxt_slow_path(ret != NXT_OK)) { @@ -653,7 +655,7 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_parser_t *parser, /* The loop body. */ - loop = parser->code_last; + loop = parser->code_end; ret = njs_generator(vm, parser, node->right); if (nxt_slow_path(ret != NXT_OK)) { @@ -662,7 +664,7 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_parser_t *parser, /* The loop iterator. */ - start->offset = parser->code_last - (u_char *) start; + start->offset = parser->code_end - (u_char *) start; ret = njs_generator(vm, parser, node->left->left); if (nxt_slow_path(ret != NXT_OK)) { @@ -1490,7 +1492,7 @@ njs_generate_scope(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node, } parser->code_start = p; - parser->code_last = p; + parser->code_end = p; if (node != NULL) { if (nxt_slow_path(njs_generator(vm, parser, node) != NXT_OK)) { @@ -1513,7 +1515,7 @@ njs_generate_scope(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node, stop->retval = index; } - code_size = parser->code_last - parser->code_start; + code_size = parser->code_end - parser->code_start; nxt_thread_log_debug("SCOPE CODE SIZE: %uz %uz", parser->code_size, code_size); @@ -1557,7 +1559,7 @@ njs_generate_scope(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node, } code->start = parser->code_start; - code->end = parser->code_last; + code->end = parser->code_end; return NXT_OK; } @@ -1589,13 +1591,13 @@ static nxt_int_t njs_generate_function_call(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node) { - uintptr_t nargs; - nxt_int_t ret; - njs_index_t retval, index, name; - njs_parser_node_t *arg; - njs_vmcode_call_t *call; - njs_vmcode_move_t *move; - njs_vmcode_function_t *func; + uintptr_t nargs; + nxt_int_t ret; + njs_index_t retval, index, name; + njs_parser_node_t *arg; + njs_vmcode_call_t *call; + njs_vmcode_move_t *move; + njs_vmcode_function_t *func; if (node->left != NULL) { /* Generate function code in function expression. */ @@ -1804,7 +1806,7 @@ njs_generate_try_statement(njs_vm_t *vm, njs_parser_t *parser, try_end->code.operands = NJS_VMCODE_NO_OPERAND; try_end->code.retval = NJS_VMCODE_NO_RETVAL; - try_start->offset = parser->code_last - (u_char *) try_start; + try_start->offset = parser->code_end - (u_char *) try_start; node = node->right; @@ -1828,7 +1830,7 @@ njs_generate_try_statement(njs_vm_t *vm, njs_parser_t *parser, return ret; } - try_end->offset = parser->code_last - (u_char *) try_end; + try_end->offset = parser->code_end - (u_char *) try_end; /* TODO: release exception variable index. */ @@ -1857,7 +1859,7 @@ njs_generate_try_statement(njs_vm_t *vm, njs_parser_t *parser, catch_end->code.operands = NJS_VMCODE_NO_OPERAND; catch_end->code.retval = NJS_VMCODE_NO_RETVAL; - catch->offset = parser->code_last - (u_char *) catch; + catch->offset = parser->code_end - (u_char *) catch; /* TODO: release exception variable index. */ @@ -1868,7 +1870,7 @@ njs_generate_try_statement(njs_vm_t *vm, njs_parser_t *parser, catch->offset = sizeof(njs_vmcode_catch_t); catch->exception = index; - catch_end->offset = parser->code_last - (u_char *) catch_end; + catch_end->offset = parser->code_end - (u_char *) catch_end; } else { /* A try/finally case. */ @@ -1881,7 +1883,7 @@ njs_generate_try_statement(njs_vm_t *vm, njs_parser_t *parser, catch->exception = index; } - try_end->offset = parser->code_last - (u_char *) try_end; + try_end->offset = parser->code_end - (u_char *) try_end; ret = njs_generator(vm, parser, node->right); if (nxt_slow_path(ret != NXT_OK)) { @@ -1961,7 +1963,7 @@ njs_generator_dest_index(njs_vm_t *vm, njs_parser_t *parser, } -static njs_index_t +static nxt_noinline njs_index_t njs_generator_temp_index_get(njs_parser_t *parser) { nxt_uint_t n; @@ -1992,22 +1994,22 @@ njs_generator_temp_index_get(njs_parser_t *parser) } -static nxt_int_t +static nxt_noinline nxt_int_t njs_generator_children_indexes_release(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node) { nxt_int_t ret; ret = njs_generator_node_index_release(vm, parser, node->left); - if (nxt_slow_path(ret != NXT_OK)) { - return ret; + if (nxt_fast_path(ret == NXT_OK)) { + return njs_generator_node_index_release(vm, parser, node->right); } - return njs_generator_node_index_release(vm, parser, node->right); + return ret; } -static nxt_int_t +static nxt_noinline nxt_int_t njs_generator_node_index_release(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node) { @@ -2019,7 +2021,7 @@ njs_generator_node_index_release(njs_vm_t *vm, njs_parser_t *parser, } -static nxt_int_t +static nxt_noinline nxt_int_t njs_generator_index_release(njs_vm_t *vm, njs_parser_t *parser, njs_index_t index) { diff --git a/njs/njs_object.c b/njs/njs_object.c index ffb0946d..27265867 100644 --- a/njs/njs_object.c +++ b/njs/njs_object.c @@ -337,7 +337,7 @@ njs_primitive_prototype_get_proto(njs_vm_t *vm, njs_value_t *value) vm->retval.type = NJS_OBJECT; vm->retval.data.truth = 1; - /* + /* * The __proto__ getters reside in object prototypes of primitive * types. "AND 0x7" maps type of value to prototype offset: * NJS_BOOLEAN > NJS_PROTOTYPE_BOOLEAN, diff --git a/njs/njs_parser.c b/njs/njs_parser.c index 9136e5c7..753292b1 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -34,36 +34,32 @@ * is treated as a single expiression. */ -static njs_token_t njs_parser_statement(njs_vm_t *vm, - njs_parser_t *parser, njs_token_t token); +static njs_token_t njs_parser_statement(njs_vm_t *vm, njs_parser_t *parser, + njs_token_t token); static njs_token_t njs_parser_block(njs_vm_t *vm, njs_parser_t *parser); static njs_token_t njs_parser_function_statement(njs_vm_t *vm, njs_parser_t *parser); static njs_token_t njs_parser_return_statement(njs_vm_t *vm, njs_parser_t *parser); -static njs_token_t njs_parser_var_statement(njs_vm_t *vm, - njs_parser_t *parser); -static njs_token_t njs_parser_if_statement(njs_vm_t *vm, - njs_parser_t *parser); +static njs_token_t njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser); +static njs_token_t njs_parser_if_statement(njs_vm_t *vm, njs_parser_t *parser); static njs_token_t njs_parser_while_statement(njs_vm_t *vm, njs_parser_t *parser); static njs_token_t njs_parser_do_while_statement(njs_vm_t *vm, njs_parser_t *parser); -static njs_token_t njs_parser_for_statement(njs_vm_t *vm, - njs_parser_t *parser); +static njs_token_t njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser); static njs_token_t njs_parser_for_in_statement(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token); -static njs_token_t njs_parser_try_statement(njs_vm_t *vm, - njs_parser_t *parser); -static njs_token_t njs_parser_block0(njs_vm_t *vm, njs_parser_t *parser); +static njs_token_t njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser); +static njs_token_t njs_parser_try_block(njs_vm_t *vm, njs_parser_t *parser); static njs_token_t njs_parser_throw_statement(njs_vm_t *vm, njs_parser_t *parser); static njs_token_t njs_parser_grouping_expression(njs_vm_t *vm, njs_parser_t *parser); -static njs_token_t njs_parser_object(njs_vm_t *vm, - njs_parser_t *parser, njs_parser_node_t *obj); -static njs_token_t njs_parser_array(njs_vm_t *vm, - njs_parser_t *parser, njs_parser_node_t *obj); +static njs_token_t njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, + njs_parser_node_t *obj); +static njs_token_t njs_parser_array(njs_vm_t *vm, njs_parser_t *parser, + njs_parser_node_t *obj); static njs_token_t njs_parser_escape_string_create(njs_vm_t *vm, njs_value_t *value); @@ -335,7 +331,7 @@ njs_parser_function_statement(njs_vm_t *vm, njs_parser_t *parser) fn_parser->lexer = parser->lexer; fn_parser->values_hash = vm->shared->values_hash; - /* njs_return() size. */ + /* njs_vmcode_return() size. */ fn_parser->code_size = sizeof(njs_vmcode_stop_t); fn_parser->arguments = nxt_array_create(4, sizeof(njs_variable_t), @@ -491,7 +487,7 @@ njs_parser_function_expression(njs_vm_t *vm, njs_parser_t *parser) fn_parser->lexer = parser->lexer; fn_parser->values_hash = vm->shared->values_hash; - /* njs_return() size. */ + /* njs_vmcode_return() size. */ fn_parser->code_size = sizeof(njs_vmcode_stop_t); fn_parser->arguments = nxt_array_create(4, sizeof(njs_variable_t), @@ -873,8 +869,7 @@ njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser) return token; } - token = njs_parser_match(parser, token, - NJS_TOKEN_OPEN_PARENTHESIS); + token = njs_parser_match(parser, token, NJS_TOKEN_OPEN_PARENTHESIS); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -923,8 +918,7 @@ njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser) update = parser->node; } - token = njs_parser_match(parser, token, - NJS_TOKEN_CLOSE_PARENTHESIS); + token = njs_parser_match(parser, token, NJS_TOKEN_CLOSE_PARENTHESIS); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -989,8 +983,7 @@ njs_parser_for_in_statement(njs_vm_t *vm, njs_parser_t *parser, node->token = NJS_TOKEN_FOR_IN; node->left = parser->node; - token = njs_parser_match(parser, token, - NJS_TOKEN_CLOSE_PARENTHESIS); + token = njs_parser_match(parser, token, NJS_TOKEN_CLOSE_PARENTHESIS); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -1018,7 +1011,7 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser) parser->branch = 1; - token = njs_parser_block0(vm, parser); + token = njs_parser_try_block(vm, parser); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -1039,8 +1032,7 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser) return token; } - token = njs_parser_match(parser, token, - NJS_TOKEN_OPEN_PARENTHESIS); + token = njs_parser_match(parser, token, NJS_TOKEN_OPEN_PARENTHESIS); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -1087,7 +1079,7 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser) return token; } - token = njs_parser_block0(vm, parser); + token = njs_parser_try_block(vm, parser); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -1099,7 +1091,7 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser) if (token == NJS_TOKEN_FINALLY) { - token = njs_parser_block0(vm, parser); + token = njs_parser_try_block(vm, parser); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -1135,7 +1127,7 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser) static njs_token_t -njs_parser_block0(njs_vm_t *vm, njs_parser_t *parser) +njs_parser_try_block(njs_vm_t *vm, njs_parser_t *parser) { njs_token_t token; @@ -1192,8 +1184,7 @@ njs_parser_grouping_expression(njs_vm_t *vm, njs_parser_t *parser) return token; } - token = njs_parser_match(parser, token, - NJS_TOKEN_OPEN_PARENTHESIS); + token = njs_parser_match(parser, token, NJS_TOKEN_OPEN_PARENTHESIS); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -1203,8 +1194,7 @@ njs_parser_grouping_expression(njs_vm_t *vm, njs_parser_t *parser) return token; } - return njs_parser_match(parser, token, - NJS_TOKEN_CLOSE_PARENTHESIS); + return njs_parser_match(parser, token, NJS_TOKEN_CLOSE_PARENTHESIS); } @@ -1227,8 +1217,7 @@ njs_parser_token(njs_parser_t *parser) njs_token_t -njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, - njs_token_t token) +njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) { double num; nxt_int_t ret; @@ -1249,8 +1238,7 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, return token; } - return njs_parser_match(parser, token, - NJS_TOKEN_CLOSE_PARENTHESIS); + return njs_parser_match(parser, token, NJS_TOKEN_CLOSE_PARENTHESIS); } if (token == NJS_TOKEN_FUNCTION) { @@ -1466,8 +1454,7 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, static njs_token_t -njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, - njs_parser_node_t *obj) +njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj) { njs_token_t token; njs_parser_node_t *stmt, *assign, *object, *propref, *left; @@ -1559,8 +1546,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, static njs_token_t -njs_parser_array(njs_vm_t *vm, njs_parser_t *parser, - njs_parser_node_t *obj) +njs_parser_array(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj) { nxt_uint_t index; njs_token_t token; diff --git a/njs/njs_parser.h b/njs/njs_parser.h index 9c8e38ad..4eb84807 100644 --- a/njs/njs_parser.h +++ b/njs/njs_parser.h @@ -229,8 +229,7 @@ struct njs_parser_node_s { }; -#define \ -njs_parser_node_alloc(vm) \ +#define njs_parser_node_alloc(vm) \ nxt_mem_cache_zalloc((vm)->mem_cache_pool, sizeof(njs_parser_node_t)) @@ -266,7 +265,7 @@ struct njs_parser_s { uint32_t method_arguments_size; u_char *code_start; - u_char *code_last; + u_char *code_end; njs_parser_t *parent; }; @@ -301,10 +300,9 @@ nxt_int_t njs_generate_scope(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node, njs_vmcode_operation_t last); -#define \ -njs_generate_code(parser, type, code) \ +#define njs_generate_code(parser, type, code) \ do { \ - code = (type *) parser->code_last; parser->code_last += sizeof(type); \ + code = (type *) parser->code_end; parser->code_end += sizeof(type); \ } while (0) diff --git a/njs/njs_parser_expression.c b/njs/njs_parser_expression.c index 137ee377..2f93f350 100644 --- a/njs/njs_parser_expression.c +++ b/njs/njs_parser_expression.c @@ -207,12 +207,10 @@ static const njs_parser_expression_t njs_token_t -njs_parser_expression(njs_vm_t *vm, njs_parser_t *parser, - njs_token_t token) +njs_parser_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) { return njs_parser_binary_expression(vm, parser, - &njs_parser_comma_expression, - token); + &njs_parser_comma_expression, token); } @@ -225,8 +223,7 @@ njs_parser_expression_operator(njs_token_t token) njs_token_t -njs_parser_var_expression(njs_vm_t *vm, njs_parser_t *parser, - njs_token_t token) +njs_parser_var_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) { size_t size; njs_parser_node_t *node, *pending; @@ -501,14 +498,14 @@ njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t -njs_parser_conditional_expression(njs_vm_t *vm, - njs_parser_t *parser, njs_token_t token) +njs_parser_conditional_expression(njs_vm_t *vm, njs_parser_t *parser, + njs_token_t token) { njs_parser_node_t *node, *cond; token = njs_parser_binary_expression(vm, parser, - &njs_parser_logical_or_expression, - token); + &njs_parser_logical_or_expression, + token); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -577,9 +574,9 @@ static njs_token_t njs_parser_binary_expression(njs_vm_t *vm, njs_parser_t *parser, const njs_parser_expression_t *expr, njs_token_t token) { - nxt_int_t n; - njs_parser_node_t *node; - njs_vmcode_operation_t operation; + nxt_int_t n; + njs_parser_node_t *node; + njs_vmcode_operation_t operation; const njs_parser_operation_t *op; token = expr->next(vm, parser, expr->expression, token); @@ -725,7 +722,7 @@ njs_parser_unary_expression(njs_vm_t *vm, njs_parser_t *parser, parser->node->state = NJS_VARIABLE_TYPEOF; } else if (token == NJS_TOKEN_DELETE - && parser->node->token == NJS_TOKEN_PROPERTY) + && parser->node->token == NJS_TOKEN_PROPERTY) { parser->node->token = NJS_TOKEN_PROPERTY_DELETE; parser->node->u.operation = njs_vmcode_property_delete; @@ -807,8 +804,8 @@ njs_parser_inc_dec_expression(njs_vm_t *vm, njs_parser_t *parser, static njs_token_t -njs_parser_post_inc_dec_expression(njs_vm_t *vm, - njs_parser_t *parser, njs_token_t token) +njs_parser_post_inc_dec_expression(njs_vm_t *vm, njs_parser_t *parser, + njs_token_t token) { njs_parser_node_t *node; njs_vmcode_operation_t operation; @@ -892,7 +889,7 @@ njs_parser_call_expression(njs_vm_t *vm, njs_parser_t *parser, node = parser->node; if (token != NJS_TOKEN_OPEN_PARENTHESIS) { - /* TODO: var o = Object; var o = new Object() */ + /* TODO: var o = new Object; */ node->ctor = ctor; return token; } @@ -1019,8 +1016,7 @@ njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t -njs_parser_property_name(njs_vm_t *vm, njs_parser_t *parser, - njs_token_t token) +njs_parser_property_name(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) { nxt_int_t ret; njs_parser_node_t *node; diff --git a/njs/njs_string.c b/njs/njs_string.c index 20fae972..e3c28eaf 100644 --- a/njs/njs_string.c +++ b/njs/njs_string.c @@ -1724,6 +1724,11 @@ static const nxt_lvlhsh_proto_t njs_values_hash_proto }; +/* + * Constant values such as njs_value_zero are copied to vm->values_hash during + * code generation when them are used as operands to guarantee aligned value. + */ + njs_index_t njs_value_index(njs_vm_t *vm, njs_parser_t *parser, const njs_value_t *src) { diff --git a/njs/njs_variable.c b/njs/njs_variable.c index bc984478..5deb7135 100644 --- a/njs/njs_variable.c +++ b/njs/njs_variable.c @@ -37,7 +37,6 @@ njs_variables_hash_test(nxt_lvlhsh_query_t *lhq, void *data) return NXT_OK; } - return NXT_DECLINED; } diff --git a/njs/njs_vm.h b/njs/njs_vm.h index c638d33b..4ff1a302 100644 --- a/njs/njs_vm.h +++ b/njs/njs_vm.h @@ -73,7 +73,7 @@ typedef enum { } njs_value_type_t; -typedef struct njs_parser_s njs_parser_t; +typedef struct njs_parser_s njs_parser_t; typedef njs_ret_t (*njs_getter_t) (njs_vm_t *vm, njs_value_t *obj); typedef njs_ret_t (*njs_native_t) (njs_vm_t *vm, njs_param_t *param); @@ -120,11 +120,8 @@ union njs_value_s { /* 0xff if u.data.string is external string. */ uint8_t external0; uint8_t _spare; - /* - * A long string size. It is better to store here a size instead of - * an UTF-8 length because the size is known at creation time but the - * length may be set later and it should be updated in one shared place. - */ + + /* A long string size. */ uint32_t string_size; union { @@ -159,8 +156,7 @@ union njs_value_s { }; -#define \ -njs_value(_type, _truth, _number) { \ +#define njs_value(_type, _truth, _number) { \ .data = { \ .type = _type, \ .truth = _truth, \ @@ -169,8 +165,7 @@ njs_value(_type, _truth, _number) { \ } -#define \ -njs_string(s) { \ +#define njs_string(s) { \ .short_string = { \ .type = NJS_STRING, \ .size = sizeof(s) - 1, \ @@ -182,8 +177,7 @@ njs_string(s) { \ /* NJS_STRING_LONG is set for both big and little endian platforms. */ -#define \ -njs_long_string(s) { \ +#define njs_long_string(s) { \ .data = { \ .type = NJS_STRING, \ .truth = (NJS_STRING_LONG << 4) | NJS_STRING_LONG, \ @@ -196,8 +190,7 @@ njs_long_string(s) { \ } -#define \ -njs_native_function(_function, _local_size) { \ +#define njs_native_function(_function, _local_size) { \ .data = { \ .type = NJS_FUNCTION, \ .truth = 1, \ @@ -211,16 +204,14 @@ njs_native_function(_function, _local_size) { \ } -#define \ -njs_getter(_getter) \ +#define njs_getter(_getter) \ { .data = { .type = NJS_NATIVE, \ .truth = 1, \ .u = { .getter = _getter } \ } } -#define \ -njs_method(_method, _size) \ +#define njs_method(_method, _size) \ { .data = { .type = NJS_NATIVE, \ .truth = 1, \ .string_size = _size, \ @@ -232,55 +223,45 @@ typedef njs_ret_t (*njs_vmcode_operation_t)(njs_vm_t *vm, njs_value_t *value1, njs_value_t *value2); -#define \ -njs_is_null(value) \ +#define njs_is_null(value) \ ((value)->type == NJS_NULL) -#define \ -njs_is_void(value) \ +#define njs_is_void(value) \ ((value)->type == NJS_VOID) -#define \ -njs_is_null_or_void(value) \ +#define njs_is_null_or_void(value) \ ((value)->type <= NJS_VOID) -#define \ -njs_is_boolean(value) \ +#define njs_is_boolean(value) \ ((value)->type == NJS_BOOLEAN) -#define \ -njs_is_null_or_void_or_boolean(value) \ +#define njs_is_null_or_void_or_boolean(value) \ ((value)->type <= NJS_BOOLEAN) -#define \ -njs_is_true(value) \ +#define njs_is_true(value) \ ((value)->data.truth != 0) -#define \ -njs_is_number(value) \ +#define njs_is_number(value) \ ((value)->type == NJS_NUMBER) /* Testing for NaN first generates a better code at least on i386/amd64. */ -#define \ -njs_is_number_true(num) \ +#define njs_is_number_true(num) \ (!njs_is_nan(num) && num != 0) -#define \ -njs_is_numeric(value) \ +#define njs_is_numeric(value) \ ((value)->type <= NJS_NUMBER) -#define \ -njs_is_string(value) \ +#define njs_is_string(value) \ ((value)->type == NJS_STRING) @@ -289,57 +270,46 @@ njs_is_string(value) \ * so when string size and length are zero the string's value is false and * otherwise is true. */ -#define \ -njs_string_truth(value, size) +#define njs_string_truth(value, size) -#define \ -njs_is_primitive(value) \ +#define njs_is_primitive(value) \ ((value)->type <= NJS_STRING) -#define \ -njs_is_object(value) \ +#define njs_is_object(value) \ (((value)->type & NJS_OBJECT) != 0) -#define \ -njs_is_array(value) \ +#define njs_is_array(value) \ ((value)->type == NJS_ARRAY) -#define \ -njs_is_function(value) \ +#define njs_is_function(value) \ ((value)->type == NJS_FUNCTION) -#define \ -njs_is_regexp(value) \ +#define njs_is_regexp(value) \ ((value)->type == NJS_REGEXP) -#define \ -njs_is_native(value) \ +#define njs_is_native(value) \ ((value)->type == NJS_NATIVE) -#define \ -njs_is_external(value) \ +#define njs_is_external(value) \ ((value)->type == NJS_EXTERNAL) -#define \ -njs_is_valid(value) \ +#define njs_is_valid(value) \ ((value)->type != NJS_INVALID) -#define \ -njs_set_invalid(value) \ +#define njs_set_invalid(value) \ (value)->type = NJS_INVALID -#define \ -njs_retain(value) \ +#define njs_retain(value) \ do { \ if ((value)->data.truth == NJS_STRING_LONG) { \ njs_value_retain(value); \ @@ -347,8 +317,7 @@ njs_retain(value) \ } while (0) -#define \ -njs_release(vm, value) \ +#define njs_release(vm, value) \ do { \ if ((value)->data.truth == NJS_STRING_LONG) { \ njs_value_release((vm), (value)); \ @@ -612,12 +581,10 @@ enum njs_functions_e { }; -#define \ -njs_scope_index(value) \ +#define njs_scope_index(value) \ ((njs_index_t) (value << NJS_SCOPE_SHIFT)) -#define \ -njs_global_scope_index(value) \ +#define njs_global_scope_index(value) \ ((njs_index_t) ((value << NJS_SCOPE_SHIFT) | NJS_SCOPE_GLOBAL)) @@ -633,20 +600,17 @@ njs_global_scope_index(value) \ #define NJS_INDEX_GLOBAL_OFFSET njs_scope_index(NJS_FUNCTION_MAX) -#define \ -njs_offset(index) \ +#define njs_offset(index) \ ((uintptr_t) (index) & ~NJS_SCOPE_MASK) -#define \ -njs_vmcode_operand(vm, index) \ +#define njs_vmcode_operand(vm, index) \ ((njs_value_t *) \ ((u_char *) vm->scopes[(uintptr_t) (index) & NJS_SCOPE_MASK] \ + njs_offset(index))) -#define \ -njs_index_size(index) \ +#define njs_index_size(index) \ njs_offset(index) diff --git a/njs/njscript.c b/njs/njscript.c index 3a79e821..81038306 100644 --- a/njs/njscript.c +++ b/njs/njscript.c @@ -320,7 +320,7 @@ njs_vm_clone(njs_vm_t *vm, nxt_mem_cache_pool_t *mcp, void **external) nvm->scopes[NJS_SCOPE_GLOBAL] = (njs_value_t *) values; memcpy(values + NJS_INDEX_GLOBAL_OFFSET, vm->global_scope, - vm->scope_size); + vm->scope_size); ret = njs_shared_objects_clone(nvm); if (nxt_slow_path(ret != NXT_OK)) { diff --git a/njs/njscript.h b/njs/njscript.h index 9a27af66..7e9de7db 100644 --- a/njs/njscript.h +++ b/njs/njscript.h @@ -23,8 +23,7 @@ typedef struct { /* sizeof(njs_value_t) is 16 bytes. */ -#define \ -njs_argument(args, n) \ +#define njs_argument(args, n) \ (njs_value_t *) ((u_char *) args + n * 16) diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 2267a443..ab955d4c 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -434,6 +434,38 @@ static njs_unit_test_t njs_test[] = /* Comparisions. */ + { nxt_string("1 < 2"), + nxt_string("true") }, + + { nxt_string("1 < 1"), + nxt_string("false") }, + + { nxt_string("1 <= 1"), + nxt_string("true") }, + + { nxt_string("1 <= 2"), + nxt_string("true") }, + + { nxt_string("2 > 1"), + nxt_string("true") }, + + { nxt_string("1 > 2"), + nxt_string("false") }, + + { nxt_string("1 > 1"), + nxt_string("false") }, + + { nxt_string("1 >= 1"), + nxt_string("true") }, + + { nxt_string("2 >= 1"), + nxt_string("true") }, + + { nxt_string("1 >= 2"), + nxt_string("false") }, + + /**/ + { nxt_string("null === null"), nxt_string("true") }, @@ -1556,6 +1588,31 @@ static njs_unit_test_t njs_test[] = /* Arrays */ + /* Empty array to primitive. */ + + { nxt_string("3 + []"), + nxt_string("3") }, + + { nxt_string("3 * []"), + nxt_string("0") }, + + /* Single element array to primitive. */ + + { nxt_string("3 + [5]"), + nxt_string("35") }, + + { nxt_string("3 * [5]"), + nxt_string("15") }, + + /* Array to primitive. */ + + { nxt_string("3 + [5,7]"), + nxt_string("35,7") }, + + { nxt_string("3 * [5,7]"), + nxt_string("NaN") }, + + { nxt_string("a = [ 1, 2, 3 ]; a[0] + a[1] + a[2]"), nxt_string("6") }, @@ -2442,12 +2499,18 @@ static njs_unit_test_t njs_test[] = { nxt_string("/абв/i.test('АБВ')"), nxt_string("true") }, - { nxt_string("/\\xC2\\xB6/.test('\\u00C2\\u00B6'.toBytes())"), + { nxt_string("/\\x80/.test('\\u0080')"), nxt_string("true") }, { nxt_string("/\\x80/.test('\\u0080'.toBytes())"), nxt_string("true") }, + { nxt_string("/α/.test('\\u03B1')"), + nxt_string("true") }, + + { nxt_string("/α/.test('\\u00CE\\u00B1'.toBytes())"), + nxt_string("true") }, + { nxt_string("var a = /^$/.exec(''); a.length +' '+ a"), nxt_string("1 ") }, @@ -2987,20 +3050,36 @@ static njs_unit_test_t njs_test[] = { nxt_string("eval()"), nxt_string("") }, - /* es5id: 8.2_A1_T1 */ - /* es5id: 8.2_A1_T2 */ + /* Trick: number to boolean. */ + + { nxt_string("var a = 0; !!a"), + nxt_string("false") }, + + { nxt_string("var a = 5; !!a"), + nxt_string("true") }, + + /* Trick: flooring. */ + + { nxt_string("var n = -10.12345; ~~n"), + nxt_string("-10") }, + + { nxt_string("var n = 10.12345; ~~n"), + nxt_string("10") }, + + /* es5id: 8.2_A1_T1 */ + /* es5id: 8.2_A1_T2 */ { nxt_string("var x = null;"), nxt_string("") }, #if 0 - /* es5id: 8.2_A2 */ + /* es5id: 8.2_A2 */ { nxt_string("var null;"), nxt_string("SyntaxError") }, #endif - /* es5id: 8.2_A3 */ + /* es5id: 8.2_A3 */ { nxt_string("typeof(null) === \"object\""), nxt_string("true") }, diff --git a/nxt/nxt_lvlhsh.h b/nxt/nxt_lvlhsh.h index 08c24294..cc3a58a3 100644 --- a/nxt/nxt_lvlhsh.h +++ b/nxt/nxt_lvlhsh.h @@ -116,13 +116,11 @@ struct nxt_lvlhsh_query_s { }; -#define \ -nxt_lvlhsh_is_empty(lh) \ +#define nxt_lvlhsh_is_empty(lh) \ ((lh)->slot == NULL) -#define \ -nxt_lvlhsh_init(lh) \ +#define nxt_lvlhsh_init(lh) \ (lh)->slot = NULL /*