]> git.kaiwu.me - njs.git/commitdiff
Style and small miscellaneous fixes.
authorIgor Sysoev <igor@sysoev.ru>
Wed, 25 Nov 2015 14:22:45 +0000 (17:22 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Wed, 25 Nov 2015 14:22:45 +0000 (17:22 +0300)
17 files changed:
nginx/ngx_http_js_module.c
njs/njs_array.c
njs/njs_disassembler.c
njs/njs_function.c
njs/njs_function.h
njs/njs_generator.c
njs/njs_object.c
njs/njs_parser.c
njs/njs_parser.h
njs/njs_parser_expression.c
njs/njs_string.c
njs/njs_variable.c
njs/njs_vm.h
njs/njscript.c
njs/njscript.h
njs/test/njs_unit_test.c
nxt/nxt_lvlhsh.h

index 5df2138d3756edc4aee4382ba4ef15d112256a19..a41f3e8385eef42a67b00a80c429e5d3719134dd 100644 (file)
 
 #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();
index a01f9b23dbf38d9d7df099ec967827bf01155b0d..41b453347f39e73ec936a9a79211b6044955bf27 100644 (file)
@@ -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) {
index b7d9db5a033ae95e7b5b99aaf8e5966ab1685252..8436d0f110496798ddfadb10e9fa81142c51a43b 100644 (file)
@@ -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     ") },
index c983e12f06fc9c30cb4349193b9c806173cd3d6c..5411fc4f822328bdeeedadf2922c7aab22275c46 100644 (file)
@@ -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);
 
index 1a9f607d4a14b3e8dbe816d5f11fe8dcdd67ae8e..720f467ed31dcc685aa87e3abdcfaf745cc34f79 100644 (file)
@@ -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)
 
 
index b38f8260e871f143cb1414acb554695fc687d318..6e6ac44044022ef17fa1bee1249364484fcfa399 100644 (file)
@@ -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)
 {
index ffb0946d393e56bde60c18aa92ee1d6751ca96fa..2726586705a203b3329babb8751d4fc69cda8c1e 100644 (file)
@@ -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,
index 9136e5c70e531fa108d52685ecc8212dcafa0b04..753292b10a2a91285bf6c51fbd964c99855ff926 100644 (file)
  * 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;
index 9c8e38adfc353ec02646144d43946cbbcdeb80fe..4eb8480703a332b44282613d30dad1486201c468 100644 (file)
@@ -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)
 
 
index 137ee377989cfb33f423bf657d9d39e0952101c1..2f93f3509f47a0419824d4d240483d725157e157 100644 (file)
@@ -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;
index 20fae972db3f1a0ec888df92ceed6a29adcba111..e3c28eaf13a624cda7d9ca6f83463bdb9a155b5a 100644 (file)
@@ -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)
 {
index bc984478bc80ab9762557f1519904d456c31710c..5deb7135071882723c989fc5dffa95a1a77d6445 100644 (file)
@@ -37,7 +37,6 @@ njs_variables_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
         return NXT_OK;
     }
 
-
     return NXT_DECLINED;
 }
 
index c638d33b7e07748f90e5f4f7a105731f65f8efbc..4ff1a3024a2173f8fbf58a707193add7c2004dd3 100644 (file)
@@ -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)
 
 
index 3a79e821208d229824662ea400765dbd7a35e63c..8103830635e2b5c71985301f4cafeebdb0a2ba04 100644 (file)
@@ -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)) {
index 9a27af66a5ee5687bbc09be6285cb2bb65b2d0dc..7e9de7db87228c7a7cc8edd7945b69355abbd272 100644 (file)
@@ -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)
 
 
index 2267a4435b1e7b67a5ab68ddc8947596b006efdc..ab955d4cb4feb77b0e243968182237f9c3bcf69e 100644 (file)
@@ -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") },
index 08c242941582e0c0628f610115afe03817ba003c..cc3a58a37e161c4a11e66e7bed4858ba6c755130 100644 (file)
@@ -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
 
 /*