]> git.kaiwu.me - njs.git/commitdiff
Refactored file hierarchy.
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 30 Jul 2019 17:11:46 +0000 (20:11 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 30 Jul 2019 17:11:46 +0000 (20:11 +0300)
1) all source files are moved to src directory.
2) nxt files are renamed with "njs" prefix.
3) some files are renamed to avoid collisions:
    nxt_array.c -> njs_arr.c
    nxt_array.h -> njs_arr.h
    nxt_string.h -> njs_str.h
    nxt_time.c -> njs_time.c
    nxt_time.h -> njs_time.h
    njs_time.c -> njs_timer.c
    njs_time.h -> njs_timer.c
    njs_core.h -> njs_main.h
4) C tests are moved to src/test dir.
5) Other tests are moved to test dir.
6) Some structs are renamed to avoid collisions:
    nxt_array_t -> njs_arr_t
    nxt_string_t -> njs_str_t

    appropriate functions and macros are also renamed.

7) all macros, functions and other identifiers with "NXT_" and "nxt_"
    prefixes are renamed to corresponding "NJS_" or "njs_" prefix.

NO functional changes.

194 files changed:
auto/clang
auto/define
auto/deps
auto/expect
auto/explicit_bzero
auto/feature
auto/getrandom
auto/make
auto/memalign
auto/os
auto/pcre
auto/readline
auto/sources
auto/time
configure
nginx/config
nginx/ngx_http_js_module.c
nginx/ngx_stream_js_module.c
njs/njs_lexer_keyword.c [deleted file]
njs/njs_object_hash.h [deleted file]
njs/test/njs_unit_test.c [deleted file]
nxt/nxt_alignment.h [deleted file]
nxt/nxt_array.h [deleted file]
nxt/nxt_clang.h [deleted file]
nxt/nxt_diyfp.c [deleted file]
nxt/nxt_diyfp.h [deleted file]
nxt/nxt_djb_hash.c [deleted file]
nxt/nxt_djb_hash.h [deleted file]
nxt/nxt_dtoa.h [deleted file]
nxt/nxt_file.h [deleted file]
nxt/nxt_lvlhsh.c [deleted file]
nxt/nxt_lvlhsh.h [deleted file]
nxt/nxt_malloc.h [deleted file]
nxt/nxt_md5.h [deleted file]
nxt/nxt_mp.h [deleted file]
nxt/nxt_murmur_hash.h [deleted file]
nxt/nxt_queue.c [deleted file]
nxt/nxt_random.h [deleted file]
nxt/nxt_rbtree.h [deleted file]
nxt/nxt_regex.h [deleted file]
nxt/nxt_sha1.h [deleted file]
nxt/nxt_sha2.h [deleted file]
nxt/nxt_sprintf.h [deleted file]
nxt/nxt_strtod.h [deleted file]
nxt/nxt_stub.h [deleted file]
nxt/nxt_time.h [deleted file]
nxt/nxt_types.h [deleted file]
nxt/test/lvlhsh_unit_test.c [deleted file]
nxt/test/random_unit_test.c [deleted file]
nxt/test/rbtree_unit_test.c [deleted file]
src/njs.h [moved from njs/njs.h with 59% similarity]
src/njs_alignment.h [new file with mode: 0644]
src/njs_arr.c [moved from nxt/nxt_array.c with 66% similarity]
src/njs_arr.h [new file with mode: 0644]
src/njs_array.c [moved from njs/njs_array.c with 85% similarity]
src/njs_array.h [moved from njs/njs_array.h with 95% similarity]
src/njs_boolean.c [moved from njs/njs_boolean.c with 86% similarity]
src/njs_boolean.h [moved from njs/njs_boolean.h with 89% similarity]
src/njs_builtin.c [moved from njs/njs_builtin.c with 77% similarity]
src/njs_builtin.h [moved from njs/njs_builtin.h with 100% similarity]
src/njs_clang.h [new file with mode: 0644]
src/njs_crypto.c [moved from njs/njs_crypto.c with 73% similarity]
src/njs_crypto.h [moved from njs/njs_crypto.h with 87% similarity]
src/njs_date.c [moved from njs/njs_date.c with 87% similarity]
src/njs_date.h [moved from njs/njs_date.h with 91% similarity]
src/njs_disassembler.c [moved from njs/njs_disassembler.c with 76% similarity]
src/njs_diyfp.c [new file with mode: 0644]
src/njs_diyfp.h [new file with mode: 0644]
src/njs_djb_hash.c [new file with mode: 0644]
src/njs_djb_hash.h [new file with mode: 0644]
src/njs_dtoa.c [moved from nxt/nxt_dtoa.c with 74% similarity]
src/njs_dtoa.h [new file with mode: 0644]
src/njs_error.c [moved from njs/njs_error.c with 85% similarity]
src/njs_error.h [moved from njs/njs_error.h with 89% similarity]
src/njs_event.c [moved from njs/njs_event.c with 60% similarity]
src/njs_event.h [moved from njs/njs_event.h with 60% similarity]
src/njs_extern.c [moved from njs/njs_extern.c with 63% similarity]
src/njs_extern.h [moved from njs/njs_extern.h with 62% similarity]
src/njs_file.c [moved from nxt/nxt_file.c with 76% similarity]
src/njs_file.h [new file with mode: 0644]
src/njs_fs.c [moved from njs/njs_fs.c with 76% similarity]
src/njs_fs.h [moved from njs/njs_fs.h with 100% similarity]
src/njs_function.c [moved from njs/njs_function.c with 83% similarity]
src/njs_function.h [moved from njs/njs_function.h with 85% similarity]
src/njs_generator.c [moved from njs/njs_generator.c with 81% similarity]
src/njs_generator.h [moved from njs/njs_generator.h with 80% similarity]
src/njs_json.c [moved from njs/njs_json.c with 83% similarity]
src/njs_json.h [moved from njs/njs_json.h with 100% similarity]
src/njs_lexer.c [moved from njs/njs_lexer.c with 91% similarity]
src/njs_lexer.h [moved from njs/njs_lexer.h with 92% similarity]
src/njs_lexer_keyword.c [new file with mode: 0644]
src/njs_lvlhsh.c [new file with mode: 0644]
src/njs_lvlhsh.h [new file with mode: 0644]
src/njs_main.h [moved from njs/njs_core.h with 55% similarity]
src/njs_malloc.c [moved from nxt/nxt_malloc.c with 62% similarity]
src/njs_malloc.h [new file with mode: 0644]
src/njs_math.c [moved from njs/njs_math.c with 85% similarity]
src/njs_math.h [moved from njs/njs_math.h with 100% similarity]
src/njs_md5.c [moved from nxt/nxt_md5.c with 91% similarity]
src/njs_md5.h [new file with mode: 0644]
src/njs_module.c [moved from njs/njs_module.c with 58% similarity]
src/njs_module.h [moved from njs/njs_module.h with 67% similarity]
src/njs_mp.c [moved from nxt/nxt_mp.c with 56% similarity]
src/njs_mp.h [new file with mode: 0644]
src/njs_murmur_hash.c [moved from nxt/nxt_murmur_hash.c with 85% similarity]
src/njs_murmur_hash.h [new file with mode: 0644]
src/njs_number.c [moved from njs/njs_number.c with 90% similarity]
src/njs_number.h [moved from njs/njs_number.h with 85% similarity]
src/njs_object.c [moved from njs/njs_object.c with 82% similarity]
src/njs_object.h [moved from njs/njs_object.h with 89% similarity]
src/njs_object_hash.h [new file with mode: 0644]
src/njs_object_property.c [moved from njs/njs_object_property.c with 81% similarity]
src/njs_parser.c [moved from njs/njs_parser.c with 81% similarity]
src/njs_parser.h [moved from njs/njs_parser.h with 82% similarity]
src/njs_parser_expression.c [moved from njs/njs_parser_expression.c with 87% similarity]
src/njs_parser_terminal.c [moved from njs/njs_parser_terminal.c with 80% similarity]
src/njs_pcre.c [moved from nxt/nxt_pcre.c with 58% similarity]
src/njs_pcre.h [moved from nxt/nxt_pcre.h with 75% similarity]
src/njs_queue.c [new file with mode: 0644]
src/njs_queue.h [moved from nxt/nxt_queue.h with 69% similarity]
src/njs_random.c [moved from nxt/nxt_random.c with 58% similarity]
src/njs_random.h [new file with mode: 0644]
src/njs_rbtree.c [moved from nxt/nxt_rbtree.c with 54% similarity]
src/njs_rbtree.h [new file with mode: 0644]
src/njs_regex.h [new file with mode: 0644]
src/njs_regexp.c [moved from njs/njs_regexp.c with 80% similarity]
src/njs_regexp.h [moved from njs/njs_regexp.h with 80% similarity]
src/njs_regexp_pattern.h [moved from njs/njs_regexp_pattern.h with 93% similarity]
src/njs_sha1.c [moved from nxt/nxt_sha1.c with 92% similarity]
src/njs_sha1.h [new file with mode: 0644]
src/njs_sha2.c [moved from nxt/nxt_sha2.c with 92% similarity]
src/njs_sha2.h [new file with mode: 0644]
src/njs_shell.c [moved from njs/njs_shell.c with 69% similarity]
src/njs_sprintf.c [moved from nxt/nxt_sprintf.c with 79% similarity]
src/njs_sprintf.h [new file with mode: 0644]
src/njs_str.h [moved from nxt/nxt_string.h with 63% similarity]
src/njs_string.c [moved from njs/njs_string.c with 86% similarity]
src/njs_string.h [moved from njs/njs_string.h with 90% similarity]
src/njs_strtod.c [moved from nxt/nxt_strtod.c with 63% similarity]
src/njs_strtod.h [new file with mode: 0644]
src/njs_stub.h [new file with mode: 0644]
src/njs_time.c [moved from nxt/nxt_time.c with 72% similarity]
src/njs_time.h [new file with mode: 0644]
src/njs_timer.c [moved from njs/njs_time.c with 67% similarity]
src/njs_timer.h [moved from njs/njs_time.h with 65% similarity]
src/njs_trace.c [moved from nxt/nxt_trace.c with 58% similarity]
src/njs_trace.h [moved from nxt/nxt_trace.h with 51% similarity]
src/njs_types.h [new file with mode: 0644]
src/njs_unicode_lower_case.h [moved from nxt/nxt_unicode_lower_case.h with 92% similarity]
src/njs_unicode_lower_case.pl [moved from nxt/nxt_unicode_lower_case.pl with 83% similarity]
src/njs_unicode_upper_case.h [moved from nxt/nxt_unicode_upper_case.h with 92% similarity]
src/njs_unicode_upper_case.pl [moved from nxt/nxt_unicode_upper_case.pl with 83% similarity]
src/njs_unix.h [moved from nxt/nxt_unix.h with 60% similarity]
src/njs_utf8.c [moved from nxt/nxt_utf8.c with 67% similarity]
src/njs_utf8.h [moved from nxt/nxt_utf8.h with 61% similarity]
src/njs_value.c [moved from njs/njs_value.c with 92% similarity]
src/njs_value.h [moved from njs/njs_value.h with 94% similarity]
src/njs_variable.c [moved from njs/njs_variable.c with 68% similarity]
src/njs_variable.h [moved from njs/njs_variable.h with 74% similarity]
src/njs_vm.c [moved from njs/njs_vm.c with 66% similarity]
src/njs_vm.h [moved from njs/njs_vm.h with 83% similarity]
src/njs_vmcode.c [moved from njs/njs_vmcode.c with 89% similarity]
src/njs_vmcode.h [moved from njs/njs_vmcode.h with 97% similarity]
src/test/lvlhsh_unit_test.c [new file with mode: 0644]
src/test/njs_benchmark.c [moved from njs/test/njs_benchmark.c with 70% similarity]
src/test/njs_interactive_test.c [moved from njs/test/njs_interactive_test.c with 52% similarity]
src/test/njs_unit_test.c [new file with mode: 0644]
src/test/random_unit_test.c [new file with mode: 0644]
src/test/rbtree_unit_test.c [new file with mode: 0644]
src/test/utf8_unit_test.c [moved from nxt/test/utf8_unit_test.c with 60% similarity]
test/fs/ascii [moved from njs/test/fs/ascii with 100% similarity]
test/fs/non_utf8 [moved from njs/test/fs/non_utf8 with 100% similarity]
test/fs/utf8 [moved from njs/test/fs/utf8 with 100% similarity]
test/inputrc [moved from njs/test/inputrc with 100% similarity]
test/module/declaration_exception.js [moved from njs/test/module/declaration_exception.js with 100% similarity]
test/module/empty.js [moved from njs/test/module/empty.js with 100% similarity]
test/module/exception.js [moved from njs/test/module/exception.js with 100% similarity]
test/module/export.js [moved from njs/test/module/export.js with 100% similarity]
test/module/export_expression.js [moved from njs/test/module/export_expression.js with 100% similarity]
test/module/export_expression2.js [moved from njs/test/module/export_expression2.js with 100% similarity]
test/module/export_name.js [moved from njs/test/module/export_name.js with 100% similarity]
test/module/export_non_default.js [moved from njs/test/module/export_non_default.js with 100% similarity]
test/module/lib1.js [moved from njs/test/module/lib1.js with 100% similarity]
test/module/lib2.js [moved from njs/test/module/lib2.js with 100% similarity]
test/module/lib3.js [moved from njs/test/module/lib3.js with 100% similarity]
test/module/libs/hash.js [moved from njs/test/module/libs/hash.js with 100% similarity]
test/module/loading_exception.js [moved from njs/test/module/loading_exception.js with 100% similarity]
test/module/normal.js [moved from njs/test/module/normal.js with 100% similarity]
test/module/recursive.js [moved from njs/test/module/recursive.js with 100% similarity]
test/module/ref_exception.js [moved from njs/test/module/ref_exception.js with 100% similarity]
test/module/return.js [moved from njs/test/module/return.js with 100% similarity]
test/module/sub/sub1.js [moved from njs/test/module/sub/sub1.js with 100% similarity]
test/module/sub/sub2.js [moved from njs/test/module/sub/sub2.js with 100% similarity]
test/njs_expect_test.exp [moved from njs/test/njs_expect_test.exp with 79% similarity]

index 619906d40c21d91b0c4d5d1a64619526c091488c..b776ef1cb9576095666fcd4d15703892878d95e7 100644 (file)
@@ -4,7 +4,7 @@
 
 
 $echo checking for C compiler: $CC
-cat << END >> $NXT_AUTOCONF_ERR
+cat << END >> $NJS_AUTOCONF_ERR
 ----------------------------------------
 checking for C compiler: $CC
 END
@@ -21,37 +21,37 @@ if [ -z `which $CC` ]; then
 fi
 
 
-if `/bin/sh -c "($CC -v)" 2>&1 | grep "gcc version" >> $NXT_AUTOCONF_ERR 2>&1`
+if `/bin/sh -c "($CC -v)" 2>&1 | grep "gcc version" >> $NJS_AUTOCONF_ERR 2>&1`
 then
-    NXT_CC_NAME=gcc
+    NJS_CC_NAME=gcc
     $echo " + using GNU C compiler"
-    NXT_CC_VERSION=`/bin/sh -c "($CC -v)" 2>&1 | grep "gcc version" 2>&1`
-    $echo " + $NXT_CC_VERSION"
+    NJS_CC_VERSION=`/bin/sh -c "($CC -v)" 2>&1 | grep "gcc version" 2>&1`
+    $echo " + $NJS_CC_VERSION"
 
 else
-if `/bin/sh -c "($CC -v)" 2>&1 | grep "clang version" >> $NXT_AUTOCONF_ERR 2>&1`
+if `/bin/sh -c "($CC -v)" 2>&1 | grep "clang version" >> $NJS_AUTOCONF_ERR 2>&1`
 then
-    NXT_CC_NAME=clang
+    NJS_CC_NAME=clang
     $echo " + using Clang C compiler"
-    NXT_CC_VERSION=`/bin/sh -c "($CC -v)" 2>&1 | grep "clang version" 2>&1`
-    $echo " + $NXT_CC_VERSION"
+    NJS_CC_VERSION=`/bin/sh -c "($CC -v)" 2>&1 | grep "clang version" 2>&1`
+    $echo " + $NJS_CC_VERSION"
 
 else
 if `/bin/sh -c "($CC -v)" 2>&1 \
-                 | grep "Apple LLVM version" >> $NXT_AUTOCONF_ERR 2>&1`
+                 | grep "Apple LLVM version" >> $NJS_AUTOCONF_ERR 2>&1`
 then
-    NXT_CC_NAME=clang
+    NJS_CC_NAME=clang
     $echo " + using Clang C compiler"
-    NXT_CC_VERSION=`/bin/sh -c "($CC -v)" 2>&1 | grep "Apple LLVM version" 2>&1`
-    $echo " + $NXT_CC_VERSION"
+    NJS_CC_VERSION=`/bin/sh -c "($CC -v)" 2>&1 | grep "Apple LLVM version" 2>&1`
+    $echo " + $NJS_CC_VERSION"
 
 else
-if `/bin/sh -c "($CC -V)" 2>&1 | grep "Sun C" >> $NXT_AUTOCONF_ERR 2>&1`
+if `/bin/sh -c "($CC -V)" 2>&1 | grep "Sun C" >> $NJS_AUTOCONF_ERR 2>&1`
 then
-    NXT_CC_NAME=SunC
+    NJS_CC_NAME=SunC
     $echo " + using Sun C compiler"
-    NXT_CC_VERSION=`/bin/sh -c "($CC -V)" 2>&1 | grep "Sun C" 2>&1`
-    $echo " + $NXT_CC_VERSION"
+    NJS_CC_VERSION=`/bin/sh -c "($CC -V)" 2>&1 | grep "Sun C" 2>&1`
+    $echo " + $NJS_CC_VERSION"
 
 fi # SunC
 fi # Apple LLVM clang
@@ -59,94 +59,94 @@ fi # clang
 fi # gcc
 
 
-case $NXT_CC_NAME in
+case $NJS_CC_NAME in
 
     gcc)
-        nxt_define=NXT_GCC . auto/define
+        njs_define=NJS_GCC . auto/define
 
-        NXT_CFLAGS="$NXT_CFLAGS -pipe"
-        NXT_CFLAGS="$NXT_CFLAGS -fPIC"
+        NJS_CFLAGS="$NJS_CFLAGS -pipe"
+        NJS_CFLAGS="$NJS_CFLAGS -fPIC"
 
-        # Do not export symbols except explicitly marked with NXT_EXPORT.
-        NXT_CFLAGS="$NXT_CFLAGS -fvisibility=hidden"
+        # Do not export symbols except explicitly marked with NJS_EXPORT.
+        NJS_CFLAGS="$NJS_CFLAGS -fvisibility=hidden"
 
         # c99/gnu99 conflict with Solaris XOPEN.
-        #NXT_CFLAGS="$NXT_CFLAGS -std=gnu99"
+        #NJS_CFLAGS="$NJS_CFLAGS -std=gnu99"
 
-        NXT_CFLAGS="$NXT_CFLAGS -O"
-        #NXT_CFLAGS="$NXT_CFLAGS -O0"
-        NXT_CFLAGS="$NXT_CFLAGS -W -Wall -Wextra"
+        NJS_CFLAGS="$NJS_CFLAGS -O"
+        #NJS_CFLAGS="$NJS_CFLAGS -O0"
+        NJS_CFLAGS="$NJS_CFLAGS -W -Wall -Wextra"
 
-        #NXT_CFLAGS="$NXT_CFLAGS -Wunused-result"
-        NXT_CFLAGS="$NXT_CFLAGS -Wno-unused-parameter"
-        #NXT_CFLAGS="$NXT_CFLAGS -Wshorten-64-to-32"
-        NXT_CFLAGS="$NXT_CFLAGS -Wwrite-strings"
+        #NJS_CFLAGS="$NJS_CFLAGS -Wunused-result"
+        NJS_CFLAGS="$NJS_CFLAGS -Wno-unused-parameter"
+        #NJS_CFLAGS="$NJS_CFLAGS -Wshorten-64-to-32"
+        NJS_CFLAGS="$NJS_CFLAGS -Wwrite-strings"
 
         # -O2 enables -fstrict-aliasing and -fstrict-overflow.
-        #NXT_CFLAGS="$NXT_CFLAGS -O2"
-        #NXT_CFLAGS="$NXT_CFLAGS -Wno-strict-aliasing"
+        #NJS_CFLAGS="$NJS_CFLAGS -O2"
+        #NJS_CFLAGS="$NJS_CFLAGS -Wno-strict-aliasing"
 
-        #NXT_CFLAGS="$NXT_CFLAGS -fomit-frame-pointer"
-        #NXT_CFLAGS="$NXT_CFLAGS -momit-leaf-frame-pointer"
+        #NJS_CFLAGS="$NJS_CFLAGS -fomit-frame-pointer"
+        #NJS_CFLAGS="$NJS_CFLAGS -momit-leaf-frame-pointer"
 
         # -Wstrict-overflow is supported by GCC 4.2+.
-        #NXT_CFLAGS="$NXT_CFLAGS -Wstrict-overflow=5"
+        #NJS_CFLAGS="$NJS_CFLAGS -Wstrict-overflow=5"
 
-        NXT_CFLAGS="$NXT_CFLAGS -Wmissing-prototypes"
+        NJS_CFLAGS="$NJS_CFLAGS -Wmissing-prototypes"
 
         # Stop on warning.
-        NXT_CFLAGS="$NXT_CFLAGS -Werror"
+        NJS_CFLAGS="$NJS_CFLAGS -Werror"
 
         # Debug.
-        NXT_CFLAGS="$NXT_CFLAGS -g"
+        NJS_CFLAGS="$NJS_CFLAGS -g"
     ;;
 
     clang)
-        nxt_define=NXT_CLANG . auto/define
+        njs_define=NJS_CLANG . auto/define
 
-        NXT_CFLAGS="$NXT_CFLAGS -pipe"
-        NXT_CFLAGS="$NXT_CFLAGS -fPIC"
+        NJS_CFLAGS="$NJS_CFLAGS -pipe"
+        NJS_CFLAGS="$NJS_CFLAGS -fPIC"
 
-        # Do not export symbols except explicitly marked with NXT_EXPORT.
-        NXT_CFLAGS="$NXT_CFLAGS -fvisibility=hidden"
+        # Do not export symbols except explicitly marked with NJS_EXPORT.
+        NJS_CFLAGS="$NJS_CFLAGS -fvisibility=hidden"
 
-        NXT_CFLAGS="$NXT_CFLAGS -O"
-        #NXT_CFLAGS="$NXT_CFLAGS -O0"
-        NXT_CFLAGS="$NXT_CFLAGS -W -Wall -Wextra"
+        NJS_CFLAGS="$NJS_CFLAGS -O"
+        #NJS_CFLAGS="$NJS_CFLAGS -O0"
+        NJS_CFLAGS="$NJS_CFLAGS -W -Wall -Wextra"
 
-        #NXT_CFLAGS="$NXT_CFLAGS -Wunused-result"
-        NXT_CFLAGS="$NXT_CFLAGS -Wno-unused-parameter"
-        #NXT_CFLAGS="$NXT_CFLAGS -Wshorten-64-to-32"
-        NXT_CFLAGS="$NXT_CFLAGS -Wwrite-strings"
-        #NXT_CFLAGS="$NXT_CFLAGS -O2"
-        #NXT_CFLAGS="$NXT_CFLAGS -fomit-frame-pointer"
-        NXT_CFLAGS="$NXT_CFLAGS -fstrict-aliasing"
-        NXT_CFLAGS="$NXT_CFLAGS -Wstrict-overflow=5"
+        #NJS_CFLAGS="$NJS_CFLAGS -Wunused-result"
+        NJS_CFLAGS="$NJS_CFLAGS -Wno-unused-parameter"
+        #NJS_CFLAGS="$NJS_CFLAGS -Wshorten-64-to-32"
+        NJS_CFLAGS="$NJS_CFLAGS -Wwrite-strings"
+        #NJS_CFLAGS="$NJS_CFLAGS -O2"
+        #NJS_CFLAGS="$NJS_CFLAGS -fomit-frame-pointer"
+        NJS_CFLAGS="$NJS_CFLAGS -fstrict-aliasing"
+        NJS_CFLAGS="$NJS_CFLAGS -Wstrict-overflow=5"
 
-        NXT_CFLAGS="$NXT_CFLAGS -Wmissing-prototypes"
+        NJS_CFLAGS="$NJS_CFLAGS -Wmissing-prototypes"
 
         # Stop on warning.
-        NXT_CFLAGS="$NXT_CFLAGS -Werror"
+        NJS_CFLAGS="$NJS_CFLAGS -Werror"
 
         # Debug.
 
-        if [ "$NXT_SYSTEM_PLATFORM" != "powerpc" ]; then
+        if [ "$NJS_SYSTEM_PLATFORM" != "powerpc" ]; then
             # "-g" flag causes the "unknown pseudo-op: `.cfi_sections'"
             # error on PowerPC Clang.
-            NXT_CFLAGS="$NXT_CFLAGS -g"
+            NJS_CFLAGS="$NJS_CFLAGS -g"
         fi
     ;;
 
     SunC)
-        nxt_define=NXT_SUNC . auto/define
+        njs_define=NJS_SUNC . auto/define
 
-        NXT_CFLAGS="$NXT_CFLAGS -fPIC"
+        NJS_CFLAGS="$NJS_CFLAGS -fPIC"
         # Optimization.
-        NXT_CFLAGS="$NXT_CFLAGS -O -fast"
+        NJS_CFLAGS="$NJS_CFLAGS -O -fast"
         # Stop on warning.
-        NXT_CFLAGS="$NXT_CFLAGS -errwarn=%all"
+        NJS_CFLAGS="$NJS_CFLAGS -errwarn=%all"
         # Debug.
-        NXT_CFLAGS="$NXT_CFLAGS -g"
+        NJS_CFLAGS="$NJS_CFLAGS -g"
     ;;
 
     *)
@@ -157,33 +157,33 @@ esac
 # Stop on error exit status again.
 set -e
 
-cat << END >> $NXT_MAKEFILE
+cat << END >> $NJS_MAKEFILE
 
-NXT_CC =       ${CC}
-NXT_CFLAGS =   ${NXT_CFLAGS} ${CFLAGS}
+NJS_CC =       ${CC}
+NJS_CFLAGS =   ${NJS_CFLAGS} ${CFLAGS}
 END
 
 
 # C language features.
 
-nxt_feature="GCC unsigned __int128"
-nxt_feature_name=NXT_HAVE_UNSIGNED_INT128
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="int main(void) {
+njs_feature="GCC unsigned __int128"
+njs_feature_name=NJS_HAVE_UNSIGNED_INT128
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="int main(void) {
                       unsigned __int128 p = 0;
                       return (int) p;
                   }"
 . auto/feature
 
 
-nxt_feature="GCC __builtin_expect()"
-nxt_feature_name=NXT_HAVE_BUILTIN_EXPECT
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="int main(int argc, char *const *argv) {
+njs_feature="GCC __builtin_expect()"
+njs_feature_name=NJS_HAVE_BUILTIN_EXPECT
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="int main(int argc, char *const *argv) {
                       if ((__typeof__(argc == 0))
                                    __builtin_expect((argc == 0), 0))
                           return 0;
@@ -192,35 +192,35 @@ nxt_feature_test="int main(int argc, char *const *argv) {
 . auto/feature
 
 
-nxt_feature="GCC __builtin_unreachable()"
-nxt_feature_name=NXT_HAVE_BUILTIN_UNREACHABLE
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="int main(void) {
+njs_feature="GCC __builtin_unreachable()"
+njs_feature_name=NJS_HAVE_BUILTIN_UNREACHABLE
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="int main(void) {
                       __builtin_unreachable();
                   }"
 . auto/feature
 
 
-nxt_feature="GCC __builtin_prefetch()"
-nxt_feature_name=NXT_HAVE_BUILTIN_PREFETCH
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="int main(void) {
+njs_feature="GCC __builtin_prefetch()"
+njs_feature_name=NJS_HAVE_BUILTIN_PREFETCH
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="int main(void) {
                       __builtin_prefetch(0);
                       return 0;
                   }"
 . auto/feature
 
 
-nxt_feature="GCC __builtin_clz()"
-nxt_feature_name=NXT_HAVE_BUILTIN_CLZ
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="int main(void) {
+njs_feature="GCC __builtin_clz()"
+njs_feature_name=NJS_HAVE_BUILTIN_CLZ
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="int main(void) {
                       if (__builtin_clz(1) != 31) {
                           return 1;
                       }
@@ -229,12 +229,12 @@ nxt_feature_test="int main(void) {
 . auto/feature
 
 
-nxt_feature="GCC __builtin_clzll()"
-nxt_feature_name=NXT_HAVE_BUILTIN_CLZLL
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="int main(void) {
+njs_feature="GCC __builtin_clzll()"
+njs_feature_name=NJS_HAVE_BUILTIN_CLZLL
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="int main(void) {
                       if (__builtin_clzll(1ULL) != 63) {
                           return 1;
                       }
@@ -243,12 +243,12 @@ nxt_feature_test="int main(void) {
 . auto/feature
 
 
-nxt_feature="GCC __attribute__ visibility"
-nxt_feature_name=NXT_HAVE_GCC_ATTRIBUTE_VISIBILITY
-nxt_feature_run=no
-nxt_feature_path=
-nxt_feature_libs=
-nxt_feature_test="int n __attribute__ ((visibility(\"default\")));
+njs_feature="GCC __attribute__ visibility"
+njs_feature_name=NJS_HAVE_GCC_ATTRIBUTE_VISIBILITY
+njs_feature_run=no
+njs_feature_path=
+njs_feature_libs=
+njs_feature_test="int n __attribute__ ((visibility(\"default\")));
 
                   int main(void) {
                       return 0;
@@ -256,12 +256,12 @@ nxt_feature_test="int n __attribute__ ((visibility(\"default\")));
 . auto/feature
 
 
-nxt_feature="GCC __attribute__ malloc"
-nxt_feature_name=NXT_HAVE_GCC_ATTRIBUTE_MALLOC
-nxt_feature_run=no
-nxt_feature_path=
-nxt_feature_libs=
-nxt_feature_test="#include <stdlib.h>
+njs_feature="GCC __attribute__ malloc"
+njs_feature_name=NJS_HAVE_GCC_ATTRIBUTE_MALLOC
+njs_feature_run=no
+njs_feature_path=
+njs_feature_libs=
+njs_feature_test="#include <stdlib.h>
 
                   void *f(void) __attribute__ ((__malloc__));
 
@@ -278,12 +278,12 @@ nxt_feature_test="#include <stdlib.h>
 . auto/feature
 
 
-nxt_feature="GCC __attribute__ aligned"
-nxt_feature_name=NXT_HAVE_GCC_ATTRIBUTE_ALIGNED
-nxt_feature_run=no
-nxt_feature_path=
-nxt_feature_libs=
-nxt_feature_test="int n __attribute__ ((aligned(64)));
+njs_feature="GCC __attribute__ aligned"
+njs_feature_name=NJS_HAVE_GCC_ATTRIBUTE_ALIGNED
+njs_feature_run=no
+njs_feature_path=
+njs_feature_libs=
+njs_feature_test="int n __attribute__ ((aligned(64)));
 
                                  int main(void) {
                                          return 0;
@@ -291,12 +291,12 @@ nxt_feature_test="int n __attribute__ ((aligned(64)));
 . auto/feature
 
 
-nxt_feature="Memory sanitizer"
-nxt_feature_name=NXT_HAVE_MEMORY_SANITIZER
-nxt_feature_run=yes
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <sanitizer/msan_interface.h>
+njs_feature="Memory sanitizer"
+njs_feature_name=NJS_HAVE_MEMORY_SANITIZER
+njs_feature_run=yes
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <sanitizer/msan_interface.h>
                   int main(int argc, char *argv[]) {
                       __msan_unpoison(argv, sizeof(char *));
                       return 0;
@@ -304,12 +304,12 @@ nxt_feature_test="#include <sanitizer/msan_interface.h>
 . auto/feature
 
 
-nxt_feature="NAN to uint conversion"
-nxt_feature_name=NXT_NAN_TO_UINT_CONVERSION
-nxt_feature_run=value
-nxt_feature_incs=
-nxt_feature_libs=-lm
-nxt_feature_test="#include <math.h>
+njs_feature="NAN to uint conversion"
+njs_feature_name=NJS_NAN_TO_UINT_CONVERSION
+njs_feature_run=value
+njs_feature_incs=
+njs_feature_libs=-lm
+njs_feature_test="#include <math.h>
                   #include <stdio.h>
                   #include <stdint.h>
 
index 7c318d6f36d1bafd590825ded27a7ce40058829b..b2cdc9944d5f673f06f6caf059718880b873a14d 100644 (file)
@@ -3,10 +3,10 @@
 # Copyright (C) NGINX, Inc.
 
 
-cat << END >> $NXT_AUTO_CONFIG_H
+cat << END >> $NJS_AUTO_CONFIG_H
 
-#ifndef $nxt_define
-#define $nxt_define  1
+#ifndef $njs_define
+#define $njs_define  1
 #endif
 
 END
index 3af6092f093534ed612939bf1d5cf3bf09d2570e..83983f5236e6c461f1d8d601500fab223ab09f97 100644 (file)
--- a/auto/deps
+++ b/auto/deps
@@ -3,26 +3,26 @@
 # Copyright (C) NGINX, Inc.
 
 
-case "$NXT_CC_NAME" in
+case "$NJS_CC_NAME" in
 
     SunC):
-        nxt_gen_dep_flags() {
-            $echo "-xMMD -xMF $NXT_BUILD_DIR/$1.tmp"
+        njs_gen_dep_flags() {
+            $echo "-xMMD -xMF $NJS_BUILD_DIR/$1.tmp"
         }
 
-        nxt_gen_dep_post() {
-            $echo -n "@sed -e 's#^.*:#$NXT_BUILD_DIR/$2:#' "
-            $echo -n "$NXT_BUILD_DIR/$1.tmp > $NXT_BUILD_DIR/$1"
-            $echo " && rm -f $NXT_BUILD_DIR/$1.tmp"
+        njs_gen_dep_post() {
+            $echo -n "@sed -e 's#^.*:#$NJS_BUILD_DIR/$2:#' "
+            $echo -n "$NJS_BUILD_DIR/$1.tmp > $NJS_BUILD_DIR/$1"
+            $echo " && rm -f $NJS_BUILD_DIR/$1.tmp"
         }
     ;;
 
     *)
-        nxt_gen_dep_flags() {
-            $echo "-MMD -MF $NXT_BUILD_DIR/$1 -MT $NXT_BUILD_DIR/$2"
+        njs_gen_dep_flags() {
+            $echo "-MMD -MF $NJS_BUILD_DIR/$1 -MT $NJS_BUILD_DIR/$2"
         }
 
-        nxt_gen_dep_post() {
+        njs_gen_dep_post() {
             $echo ""
         }
     ;;
index bbb898b18d9ac188e397eb9b65d8a68c5840c593..dfbdcd055219a4935d8dc904cb3a2d38e04c0c85 100644 (file)
@@ -2,14 +2,14 @@
 # Copyright (C) Dmitry Volyntsev
 # Copyright (C) NGINX, Inc.
 
-nxt_found=no
+njs_found=no
 $echo -n "checking for expect ..."
 
-if /bin/sh -c "(expect -v)" >> $NXT_AUTOCONF_ERR 2>&1; then
-    nxt_found=yes
+if /bin/sh -c "(expect -v)" >> $NJS_AUTOCONF_ERR 2>&1; then
+    njs_found=yes
 fi
 
-if [ $nxt_found = yes ]; then
+if [ $njs_found = yes ]; then
     $echo " found"
     $echo " + Expect version: `expect -v`"
 
@@ -17,18 +17,18 @@ else
     $echo " not found"
 fi
 
-if [ $nxt_found = yes -a $NXT_HAVE_READLINE = YES ]; then
-    cat << END >> $NXT_MAKEFILE
+if [ $njs_found = yes -a $NJS_HAVE_READLINE = YES ]; then
+    cat << END >> $NJS_MAKEFILE
 
-expect_test:   njs njs/test/njs_expect_test.exp
-       INPUTRC=njs/test/inputrc PATH=$NXT_BUILD_DIR:\$(PATH) \
-            expect -f njs/test/njs_expect_test.exp
+expect_test:   njs test/njs_expect_test.exp
+       INPUTRC=test/inputrc PATH=$NJS_BUILD_DIR:\$(PATH) \
+            expect -f test/njs_expect_test.exp
 END
 
 else
     $echo " - expect tests are disabled"
 
-    cat << END >> $NXT_MAKEFILE
+    cat << END >> $NJS_MAKEFILE
 
 expect_test:
        @echo "Skipping expect tests"
index dc940094e5dc47a8affff2d89ec45f34e5b31ef3..596da41a55b89a3c37fea61941028229b3bb1877 100644 (file)
@@ -5,12 +5,12 @@
 
 # Linux (glibc and musl from 1.1.20), OpenBSD and FreeBSD.
 
-nxt_feature="explicit_bzero()"
-nxt_feature_name=NXT_HAVE_EXPLICIT_BZERO
-nxt_feature_run=yes
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <strings.h>
+njs_feature="explicit_bzero()"
+njs_feature_name=NJS_HAVE_EXPLICIT_BZERO
+njs_feature_run=yes
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <strings.h>
                   #include <string.h>
 
                   int main(void) {
@@ -22,13 +22,13 @@ nxt_feature_test="#include <strings.h>
 . auto/feature
 
 
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
 
     # NetBSD has explicit_memset instead.
 
-    nxt_feature="explicit_memset()"
-    nxt_feature_name=NXT_HAVE_EXPLICIT_MEMSET
-    nxt_feature_test="#include <string.h>
+    njs_feature="explicit_memset()"
+    njs_feature_name=NJS_HAVE_EXPLICIT_MEMSET
+    njs_feature_test="#include <string.h>
 
                       int main(void) {
                           int r;
index fa03be02b36890673beb4501776a3c5c104f12bb..7b1f99a1dca6983f2d003fa73182664df80d17c0 100644 (file)
@@ -3,64 +3,64 @@
 # Copyright (C) NGINX, Inc.
 
 
-$echo -n "checking for $nxt_feature ..."
+$echo -n "checking for $njs_feature ..."
 
-cat << END >> $NXT_AUTOCONF_ERR
+cat << END >> $NJS_AUTOCONF_ERR
 ----------------------------------------
-checking for $nxt_feature
+checking for $njs_feature
 END
 
 
-nxt_found=no
-nxt_feature_value=
-nxt_feature_inc_path=
+njs_found=no
+njs_feature_value=
+njs_feature_inc_path=
 
-if test -n "$nxt_feature_incs"; then
-    case "$nxt_feature_incs" in
+if test -n "$njs_feature_incs"; then
+    case "$njs_feature_incs" in
         -*)
-            nxt_feature_inc_path="$nxt_feature_incs"
+            njs_feature_inc_path="$njs_feature_incs"
         ;;
 
         *)
-            for nxt_temp in $nxt_feature_incs; do
-                nxt_feature_inc_path="$nxt_feature_inc_path -I $nxt_temp"
+            for njs_temp in $njs_feature_incs; do
+                njs_feature_inc_path="$njs_feature_inc_path -I $njs_temp"
             done
         ;;
     esac
 fi
 
 
-cat << END > $NXT_AUTOTEST.c
-$nxt_feature_test
+cat << END > $NJS_AUTOTEST.c
+$njs_feature_test
 END
 
 
-nxt_test="$CC $CFLAGS $NXT_CFLAGS $NXT_CC_OPT $NXT_TEST_CFLAGS \
-          $nxt_feature_inc_path -o $NXT_AUTOTEST $NXT_AUTOTEST.c \
-          $NXT_LD_OPT $NXT_TEST_LIBS $nxt_feature_libs"
+njs_test="$CC $CFLAGS $NJS_CFLAGS $NJS_CC_OPT $NJS_TEST_CFLAGS \
+          $njs_feature_inc_path -o $NJS_AUTOTEST $NJS_AUTOTEST.c \
+          $NJS_LD_OPT $NJS_TEST_LIBS $njs_feature_libs"
 
 # /bin/sh -c "(...)" is to intercept "Killed", "Abort trap",
 # "Segmentation fault", or other shell messages.
 # "|| true" is to bypass "set -e" setting.
 
-/bin/sh -c "($nxt_test || true)" >> $NXT_AUTOCONF_ERR 2>&1
+/bin/sh -c "($njs_test || true)" >> $NJS_AUTOCONF_ERR 2>&1
 
 
-if [ -x $NXT_AUTOTEST ]; then
+if [ -x $NJS_AUTOTEST ]; then
 
-    case "$nxt_feature_run" in
+    case "$njs_feature_run" in
 
         value)
-            if /bin/sh -c "($NXT_AUTOTEST)" >> $NXT_AUTOCONF_ERR 2>&1; then
-                $echo >> $NXT_AUTOCONF_ERR
-                nxt_found=yes
-                nxt_feature_value=`$NXT_AUTOTEST`
-                $echo " $nxt_feature_value"
-                if [ -n "$nxt_feature_name" ]; then
-                    cat << END >> $NXT_AUTO_CONFIG_H
-
-#ifndef $nxt_feature_name
-#define $nxt_feature_name  $nxt_feature_value
+            if /bin/sh -c "($NJS_AUTOTEST)" >> $NJS_AUTOCONF_ERR 2>&1; then
+                $echo >> $NJS_AUTOCONF_ERR
+                njs_found=yes
+                njs_feature_value=`$NJS_AUTOTEST`
+                $echo " $njs_feature_value"
+                if [ -n "$njs_feature_name" ]; then
+                    cat << END >> $NJS_AUTO_CONFIG_H
+
+#ifndef $njs_feature_name
+#define $njs_feature_name  $njs_feature_value
 #endif
 
 END
@@ -71,13 +71,13 @@ END
         ;;
 
         yes)
-            if /bin/sh -c "($NXT_AUTOTEST)" >> $NXT_AUTOCONF_ERR 2>&1; then
+            if /bin/sh -c "($NJS_AUTOTEST)" >> $NJS_AUTOCONF_ERR 2>&1; then
                 $echo " found"
-                nxt_found=yes
-                cat << END >> $NXT_AUTO_CONFIG_H
+                njs_found=yes
+                cat << END >> $NJS_AUTO_CONFIG_H
 
-#ifndef $nxt_feature_name
-#define $nxt_feature_name  1
+#ifndef $njs_feature_name
+#define $njs_feature_name  1
 #endif
 
 END
@@ -88,11 +88,11 @@ END
 
         *)
             $echo " found"
-            nxt_found=yes
-            cat << END >> $NXT_AUTO_CONFIG_H
+            njs_found=yes
+            cat << END >> $NJS_AUTO_CONFIG_H
 
-#ifndef $nxt_feature_name
-#define $nxt_feature_name  1
+#ifndef $njs_feature_name
+#define $njs_feature_name  1
 #endif
 
 END
@@ -102,11 +102,11 @@ END
 else
     $echo " not found"
 
-    $echo "----------"    >> $NXT_AUTOCONF_ERR
-    cat $NXT_AUTOTEST.c       >> $NXT_AUTOCONF_ERR
-    $echo "----------"    >> $NXT_AUTOCONF_ERR
-    $echo $nxt_test       >> $NXT_AUTOCONF_ERR
-    $echo "----------"    >> $NXT_AUTOCONF_ERR
+    $echo "----------"    >> $NJS_AUTOCONF_ERR
+    cat $NJS_AUTOTEST.c       >> $NJS_AUTOCONF_ERR
+    $echo "----------"    >> $NJS_AUTOCONF_ERR
+    $echo $njs_test       >> $NJS_AUTOCONF_ERR
+    $echo "----------"    >> $NJS_AUTOCONF_ERR
 fi
 
-rm -rf $NXT_AUTOTEST*
+rm -rf $NJS_AUTOTEST*
index 34e61daba600032bceb81389a26b19c26a2161cc..d8b26245b601a4ef1df2893cfdb525592823bd1e 100644 (file)
@@ -5,12 +5,12 @@
 
 # Linux 3.17 with glibc 2.25, FreeBSD 12, Solaris 11.3.
 
-nxt_feature="getrandom()"
-nxt_feature_name=NXT_HAVE_GETRANDOM
-nxt_feature_run=yes
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <unistd.h>
+njs_feature="getrandom()"
+njs_feature_name=NJS_HAVE_GETRANDOM
+njs_feature_run=yes
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <unistd.h>
                   #include <sys/random.h>
 
                   int main(void) {
@@ -25,13 +25,13 @@ nxt_feature_test="#include <unistd.h>
 . auto/feature
 
 
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
 
     # Linux 3.17 SYS_getrandom.
 
-    nxt_feature="SYS_getrandom in Linux"
-    nxt_feature_name=NXT_HAVE_LINUX_SYS_GETRANDOM
-    nxt_feature_test="#include <unistd.h>
+    njs_feature="SYS_getrandom in Linux"
+    njs_feature_name=NJS_HAVE_LINUX_SYS_GETRANDOM
+    njs_feature_test="#include <unistd.h>
                       #include <sys/syscall.h>
                       #include <linux/random.h>
 
@@ -48,13 +48,13 @@ if [ $nxt_found = no ]; then
 fi
 
 
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
 
     # OpenBSD 5.6 lacks <sys/random.h>.
 
-    nxt_feature="getentropy()"
-    nxt_feature_name=NXT_HAVE_GETENTROPY
-    nxt_feature_test="#include <unistd.h>
+    njs_feature="getentropy()"
+    njs_feature_name=NJS_HAVE_GETENTROPY
+    njs_feature_test="#include <unistd.h>
 
                       int main(void) {
                           char  buf[4];
@@ -69,13 +69,13 @@ if [ $nxt_found = no ]; then
 fi
 
 
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
 
     # macOS 10.12.
 
-    nxt_feature="getentropy() in sys/random.h"
-    nxt_feature_name=NXT_HAVE_GETENTROPY_SYS_RANDOM
-    nxt_feature_test="#include <unistd.h>
+    njs_feature="getentropy() in sys/random.h"
+    njs_feature_name=NJS_HAVE_GETENTROPY_SYS_RANDOM
+    njs_feature_test="#include <unistd.h>
                       #include <sys/random.h>
 
                       int main(void) {
index b398a9ef48cd964317f6ea8203c659a5a74b5528..e43a520d42a2797408459e7e76954eed09c3a930 100644 (file)
--- a/auto/make
+++ b/auto/make
 
 . auto/deps
 
-$echo "creating $NXT_MAKEFILE"
+$echo "creating $NJS_MAKEFILE"
 
-mkdir -p $NXT_BUILD_DIR/src
-mkdir -p $NXT_BUILD_DIR/test
+mkdir -p $NJS_BUILD_DIR/src
+mkdir -p $NJS_BUILD_DIR/test
 
 
-cat << END > $NXT_MAKEFILE
+cat << END > $NJS_MAKEFILE
 
 # This file is auto-generated by configure
 
-NXT_CC = ${CC}
-NXT_AR = ${AR}
-NXT_CFLAGS = ${NXT_CFLAGS} ${CFLAGS}
+NJS_CC = ${CC}
+NJS_AR = ${AR}
+NJS_CFLAGS = ${NJS_CFLAGS} ${CFLAGS}
 
-default: $NXT_DEFAULT_TARGET
+default: $NJS_DEFAULT_TARGET
 END
 
 
-# The nxt include paths list.
+# The include paths list.
 
-$echo -n "NXT_LIB_INCS =" >> $NXT_MAKEFILE
+$echo -n "NJS_LIB_INCS =" >> $NJS_MAKEFILE
 
-for nxt_inc in nxt $NXT_BUILD_DIR
+for njs_inc in src $NJS_BUILD_DIR
 do
-       $echo -n " -I $nxt_inc" >> $NXT_MAKEFILE
+       $echo -n " -I$njs_inc" >> $NJS_MAKEFILE
 done
 
-$echo >> $NXT_MAKEFILE
-$echo >> $NXT_MAKEFILE
+$echo >> $NJS_MAKEFILE
+$echo >> $NJS_MAKEFILE
 
 
-# The nxt object files list.
-
-$echo "NXT_LIB_OBJS = \\" >> $NXT_MAKEFILE
-
-for nxt_src in $NXT_LIB_SRCS
-do
-    fname=$(basename $nxt_src)
-    nxt_obj="src/${fname%.c}.o"
-    $echo "    $NXT_BUILD_DIR/$nxt_obj \\" >> $NXT_MAKEFILE
-done
-
-$echo >> $NXT_MAKEFILE
-
-
-# The nxt static library.
-
-cat << END >> $NXT_MAKEFILE
-
-libnxt: $NXT_BUILD_DIR/libnxt.a
-
-$NXT_BUILD_DIR/libnxt.a: \\
-       $NXT_BUILD_DIR/nxt_auto_config.h \\
-       \$(NXT_LIB_OBJS)
-       \$(NXT_AR) -r -c $NXT_BUILD_DIR/libnxt.a \\
-               \$(NXT_LIB_OBJS)
-
-END
-
-
-# The nxt object files.
-
-for nxt_src in $NXT_LIB_SRCS
-do
-    fname=$(basename $nxt_src)
-    nxt_obj="src/${fname%.c}.o"
-    nxt_dep="src/${fname%.c}.dep"
-    nxt_dep_flags=`nxt_gen_dep_flags $nxt_dep $nxt_obj`
-    nxt_dep_post=`nxt_gen_dep_post $nxt_dep $nxt_obj`
-    cat << END >> $NXT_MAKEFILE
-
-$NXT_BUILD_DIR/$nxt_obj: $nxt_src
-       \$(NXT_CC) -c \$(NXT_CFLAGS) $NXT_LIB_AUX_CFLAGS \\
-               \$(NXT_LIB_INCS) -o $NXT_BUILD_DIR/$nxt_obj \\
-               $nxt_dep_flags \\
-               $nxt_src \\
-               $nxt_dep_post
-
--include $NXT_BUILD_DIR/$nxt_dep
-
-END
-
-done
-
-# nxt tests.
-
-for nxt_src in $NXT_TEST_SRCS
-do
-    fname=$(basename $nxt_src)
-    nxt_dep="test/${fname%.c}.dep"
-    nxt_bin="${fname%.c}"
-    nxt_dep_flags=`nxt_gen_dep_flags $nxt_dep $fname`
-    nxt_dep_post=`nxt_gen_dep_post $nxt_dep $fname`
-    cat << END >> $NXT_MAKEFILE
-
-$NXT_BUILD_DIR/$nxt_bin: $nxt_src \\
-       $NXT_BUILD_DIR/libnxt.a
-       \$(NXT_CC) -o $NXT_BUILD_DIR/$nxt_bin \$(NXT_CFLAGS) \\
-               \$(NXT_LIB_INCS) $nxt_dep_flags \\
-               $nxt_src $NXT_BUILD_DIR/libnxt.a \\
-               $nxt_dep_post -lm
-
--include $NXT_BUILD_DIR/$nxt_dep
-
-END
-
-done
-
 # The njs object files list.
 
-$echo "NJS_LIB_OBJS = \\" >> $NXT_MAKEFILE
+$echo "NJS_LIB_OBJS = \\" >> $NJS_MAKEFILE
 
 for njs_src in $NJS_LIB_SRCS
 do
     fname=$(basename $njs_src)
     njs_obj="src/${fname%.c}.o"
-    $echo "    $NXT_BUILD_DIR/$njs_obj \\" >> $NXT_MAKEFILE
+    $echo "    $NJS_BUILD_DIR/$njs_obj \\" >> $NJS_MAKEFILE
 done
 
-$echo >> $NXT_MAKEFILE
-
+$echo >> $NJS_MAKEFILE
 
 # The njs static library.
 
-cat << END >> $NXT_MAKEFILE
+cat << END >> $NJS_MAKEFILE
 
-libnjs: $NXT_BUILD_DIR/libnjs.a
+libnjs: $NJS_BUILD_DIR/libnjs.a
 
-$NXT_BUILD_DIR/libnjs.a:   \\
-       $NXT_BUILD_DIR/nxt_auto_config.h \\
-       \$(NXT_LIB_OBJS) \\
+$NJS_BUILD_DIR/libnjs.a:   \\
+       $NJS_BUILD_DIR/njs_auto_config.h \\
        \$(NJS_LIB_OBJS)
 
-       \$(NXT_AR) -r -c $NXT_BUILD_DIR/libnjs.a \\
-               \$(NXT_LIB_OBJS) \\
+       \$(NJS_AR) -r -c $NJS_BUILD_DIR/libnjs.a \\
                \$(NJS_LIB_OBJS)
 
 END
@@ -151,19 +71,19 @@ do
     fname=$(basename $njs_src)
     njs_obj="src/${fname%.c}.o"
     njs_dep="src/${fname%.c}.dep"
-    njs_dep_flags=`nxt_gen_dep_flags $njs_dep $njs_obj`
-    njs_dep_post=`nxt_gen_dep_post $njs_dep $njs_obj`
-    cat << END >> $NXT_MAKEFILE
-
-$NXT_BUILD_DIR/$njs_obj: $njs_src
-       \$(NXT_CC) -c \$(NXT_CFLAGS) $NXT_LIB_AUX_CFLAGS \\
-               \$(NXT_LIB_INCS) -Injs \\
-               -o $NXT_BUILD_DIR/$njs_obj \\
+    njs_dep_flags=`njs_gen_dep_flags $njs_dep $njs_obj`
+    njs_dep_post=`njs_gen_dep_post $njs_dep $njs_obj`
+    cat << END >> $NJS_MAKEFILE
+
+$NJS_BUILD_DIR/$njs_obj: $njs_src
+       \$(NJS_CC) -c \$(NJS_CFLAGS) $NJS_LIB_AUX_CFLAGS \\
+               \$(NJS_LIB_INCS) -Injs \\
+               -o $NJS_BUILD_DIR/$njs_obj \\
                $njs_dep_flags \\
                $njs_src
                $njs_dep_post
 
--include $NXT_BUILD_DIR/$njs_dep
+-include $NJS_BUILD_DIR/$njs_dep
 
 END
 
@@ -171,20 +91,45 @@ done
 
 # njs cli.
 
-cat << END >> $NXT_MAKEFILE
+cat << END >> $NJS_MAKEFILE
 
-$NXT_BUILD_DIR/njs: \\
-       $NXT_BUILD_DIR/libnxt.a \\
-       $NXT_BUILD_DIR/libnjs.a \\
-       njs/njs_shell.c
-       \$(NXT_CC) -o $NXT_BUILD_DIR/njs \$(NXT_CFLAGS) \\
-               $NXT_LIB_AUX_CFLAGS \$(NXT_LIB_INCS) -Injs \\
-               njs/njs_shell.c \\
-               $NXT_BUILD_DIR/libnjs.a \\
-               -lm $NXT_LIBS $NXT_LIB_AUX_LIBS $NXT_READLINE_LIB
+$NJS_BUILD_DIR/njs: \\
+       $NJS_BUILD_DIR/libnjs.a \\
+       src/njs_shell.c
+       \$(NJS_CC) -o $NJS_BUILD_DIR/njs \$(NJS_CFLAGS) \\
+               $NJS_LIB_AUX_CFLAGS \$(NJS_LIB_INCS) -Injs \\
+               src/njs_shell.c \\
+               $NJS_BUILD_DIR/libnjs.a \\
+               -lm $NJS_LIBS $NJS_LIB_AUX_LIBS $NJS_READLINE_LIB
 
 END
 
+
+# lib tests.
+
+for njs_src in $NJS_LIB_TEST_SRCS
+do
+    fname=$(basename $njs_src)
+    njs_dep="test/${fname%.c}.dep"
+    njs_bin="${fname%.c}"
+    njs_dep_flags=`njs_gen_dep_flags $njs_dep $fname`
+    njs_dep_post=`njs_gen_dep_post $njs_dep $fname`
+    cat << END >> $NJS_MAKEFILE
+
+$NJS_BUILD_DIR/$njs_bin: $njs_src \\
+       $NJS_BUILD_DIR/libnjs.a
+       \$(NJS_CC) -o $NJS_BUILD_DIR/$njs_bin \$(NJS_CFLAGS) \\
+               \$(NJS_LIB_INCS) $njs_dep_flags \\
+               $njs_src $NJS_BUILD_DIR/libnjs.a \\
+               $njs_dep_post -lm
+
+-include $NJS_BUILD_DIR/$njs_dep
+
+END
+
+done
+
+
 # njs tests.
 
 for njs_src in $NJS_TEST_SRCS
@@ -192,21 +137,20 @@ do
     fname=$(basename $njs_src)
     njs_dep="test/${fname%.c}.dep"
     njs_bin="${fname%.c}"
-    njs_dep_flags=`nxt_gen_dep_flags $njs_dep $fname`
-    njs_dep_post=`nxt_gen_dep_post $njs_dep $fname`
-    cat << END >> $NXT_MAKEFILE
-
-$NXT_BUILD_DIR/$njs_bin: $njs_src \\
-       $NXT_BUILD_DIR/libnxt.a \\
-       $NXT_BUILD_DIR/libnjs.a
-       \$(NXT_CC) -o $NXT_BUILD_DIR/$njs_bin \$(NXT_CFLAGS) \\
-               $NXT_LIB_AUX_CFLAGS \$(NXT_LIB_INCS) \\
+    njs_dep_flags=`njs_gen_dep_flags $njs_dep $fname`
+    njs_dep_post=`njs_gen_dep_post $njs_dep $fname`
+    cat << END >> $NJS_MAKEFILE
+
+$NJS_BUILD_DIR/$njs_bin: $njs_src \\
+       $NJS_BUILD_DIR/libnjs.a
+       \$(NJS_CC) -o $NJS_BUILD_DIR/$njs_bin \$(NJS_CFLAGS) \\
+               $NJS_LIB_AUX_CFLAGS \$(NJS_LIB_INCS) \\
                $njs_dep_flags \\
-               -Injs $njs_src $NXT_BUILD_DIR/libnjs.a \\
-               -lm $NXT_LIBS $NXT_LIB_AUX_LIBS
+               -Injs $njs_src $NJS_BUILD_DIR/libnjs.a \\
+               -lm $NJS_LIBS $NJS_LIB_AUX_LIBS
                $njs_dep_post
 
--include $NXT_BUILD_DIR/$njs_dep
+-include $NJS_BUILD_DIR/$njs_dep
 
 END
 
@@ -214,45 +158,45 @@ done
 
 # main targets.
 
-cat << END >> $NXT_MAKEFILE
+cat << END >> $NJS_MAKEFILE
 
-$NXT_BUILD_DIR/nxt_auto_config.h:
+$NJS_BUILD_DIR/njs_auto_config.h:
        @echo
        @echo " Please run ./configure before make"
        @echo
        @exit 1
 
-all: $NXT_BUILD_DIR/nxt_auto_config.h test lib_test benchmark
+all: $NJS_BUILD_DIR/njs_auto_config.h test lib_test benchmark
 
-njs: $NXT_BUILD_DIR/nxt_auto_config.h $NXT_BUILD_DIR/njs
+njs: $NJS_BUILD_DIR/njs_auto_config.h $NJS_BUILD_DIR/njs
 
-lib_test: $NXT_BUILD_DIR/nxt_auto_config.h \\
-       $NXT_BUILD_DIR/random_unit_test \\
-       $NXT_BUILD_DIR/rbtree_unit_test \\
-       $NXT_BUILD_DIR/lvlhsh_unit_test \\
-       $NXT_BUILD_DIR/utf8_unit_test
+lib_test: $NJS_BUILD_DIR/njs_auto_config.h \\
+       $NJS_BUILD_DIR/random_unit_test \\
+       $NJS_BUILD_DIR/rbtree_unit_test \\
+       $NJS_BUILD_DIR/lvlhsh_unit_test \\
+       $NJS_BUILD_DIR/utf8_unit_test
 
-       $NXT_BUILD_DIR/random_unit_test
-       $NXT_BUILD_DIR/rbtree_unit_test
-       $NXT_BUILD_DIR/lvlhsh_unit_test
-       $NXT_BUILD_DIR/utf8_unit_test
+       $NJS_BUILD_DIR/random_unit_test
+       $NJS_BUILD_DIR/rbtree_unit_test
+       $NJS_BUILD_DIR/lvlhsh_unit_test
+       $NJS_BUILD_DIR/utf8_unit_test
 
-unit_test: $NXT_BUILD_DIR/nxt_auto_config.h \\
-       $NXT_BUILD_DIR/njs_unit_test \\
-       $NXT_BUILD_DIR/njs_interactive_test
+unit_test: $NJS_BUILD_DIR/njs_auto_config.h \\
+       $NJS_BUILD_DIR/njs_unit_test \\
+       $NJS_BUILD_DIR/njs_interactive_test
 
-       $NXT_BUILD_DIR/njs_unit_test
-       $NXT_BUILD_DIR/njs_interactive_test
+       $NJS_BUILD_DIR/njs_unit_test
+       $NJS_BUILD_DIR/njs_interactive_test
 
 test: expect_test unit_test
 
-benchmark: $NXT_BUILD_DIR/nxt_auto_config.h \\
-       $NXT_BUILD_DIR/njs_benchmark
+benchmark: $NJS_BUILD_DIR/njs_auto_config.h \\
+       $NJS_BUILD_DIR/njs_benchmark
 
-       $NXT_BUILD_DIR/njs_benchmark v
+       $NJS_BUILD_DIR/njs_benchmark v
 
 dist:
-       NJS_VER=`grep NJS_VERSION njs/njs.h | sed -e 's/.*"\(.*\)".*/\1/'`; \\
+       NJS_VER=`grep NJS_VERSION src/njs.h | sed -e 's/.*"\(.*\)".*/\1/'`; \\
        rm -rf njs-\$\${NJS_VER} \\
        && hg archive njs-\$\${NJS_VER}.tar.gz \\
                -p njs-\$\${NJS_VER} \\
@@ -267,10 +211,10 @@ cat << END > Makefile
 
 # This file is auto-generated by configure
 
-include $NXT_MAKEFILE
+include $NJS_MAKEFILE
 
 .PHONY: clean
 clean:
-       rm -rf $NXT_BUILD_DIR Makefile
+       rm -rf $NJS_BUILD_DIR Makefile
 
 END
index 799fea2b4750f0ab9f0504bdfe1699b12ce498ec..968866abeb7e5656b240b955edd2e7542af3732c 100644 (file)
@@ -6,12 +6,12 @@
 # Linux glibc 2.1.91, FreeBSD 7.0, Solaris 11,
 # MacOSX 10.6 (Snow Leopard), NetBSD 5.0.
 
-nxt_feature="posix_memalign()"
-nxt_feature_name=NXT_HAVE_POSIX_MEMALIGN
-nxt_feature_run=yes
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <stdlib.h>
+njs_feature="posix_memalign()"
+njs_feature_name=NJS_HAVE_POSIX_MEMALIGN
+njs_feature_run=yes
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <stdlib.h>
 
                  int main(void) {
                      void  *p;
@@ -25,16 +25,16 @@ nxt_feature_test="#include <stdlib.h>
 . auto/feature
 
 
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
 
     # Solaris, HP-UX.
 
-    nxt_feature="memalign()"
-    nxt_feature_name=NXT_HAVE_MEMALIGN
-    nxt_feature_run=yes
-    nxt_feature_incs=
-    nxt_feature_libs=
-    nxt_feature_test="#include <stdlib.h>
+    njs_feature="memalign()"
+    njs_feature_name=NJS_HAVE_MEMALIGN
+    njs_feature_run=yes
+    njs_feature_incs=
+    njs_feature_libs=
+    njs_feature_test="#include <stdlib.h>
 
                      int main(void) {
                          void  *p;
diff --git a/auto/os b/auto/os
index 0476647e03efadc4141752c060b59f30a3444918..7f33ae2dc91342b5a734059974b57a87c2487b0d 100644 (file)
--- a/auto/os
+++ b/auto/os
@@ -3,42 +3,42 @@
 # Copyright (C) NGINX, Inc.
 
 
-NXT_SYSTEM=`uname -s 2>/dev/null`
+NJS_SYSTEM=`uname -s 2>/dev/null`
 
 
-case "$NXT_SYSTEM" in
+case "$NJS_SYSTEM" in
 
     Linux)
-        nxt_define=NXT_LINUX . auto/define
-        NXT_SYSTEM_VERSION=`uname -r 2>/dev/null`
+        njs_define=NJS_LINUX . auto/define
+        NJS_SYSTEM_VERSION=`uname -r 2>/dev/null`
         # Linux uname -p can return "unknown".
-        NXT_SYSTEM_PLATFORM=`uname -m 2>/dev/null`
+        NJS_SYSTEM_PLATFORM=`uname -m 2>/dev/null`
         echo=echo
         CC=${CC:-cc}
 
         # NAN and INFINITY require _GNU_SOURCE on old Linux.
-        NXT_CFLAGS="$NXT_CFLAGS -D_GNU_SOURCE"
+        NJS_CFLAGS="$NJS_CFLAGS -D_GNU_SOURCE"
         ;;
 
     FreeBSD | NetBSD | OpenBSD)
-        NXT_SYSTEM_VERSION=`uname -r 2>/dev/null`
-        NXT_SYSTEM_PLATFORM=`uname -m 2>/dev/null`
+        NJS_SYSTEM_VERSION=`uname -r 2>/dev/null`
+        NJS_SYSTEM_PLATFORM=`uname -m 2>/dev/null`
         echo=echo
         CC=${CC:-cc}
         ;;
 
     SunOS)
-        nxt_define=NXT_SOLARIS . auto/define
-        NXT_SYSTEM_VERSION=`uname -r 2>/dev/null`
-        NXT_SYSTEM_PLATFORM=`uname -p 2>/dev/null`
+        njs_define=NJS_SOLARIS . auto/define
+        NJS_SYSTEM_VERSION=`uname -r 2>/dev/null`
+        NJS_SYSTEM_PLATFORM=`uname -p 2>/dev/null`
         # Solaris /bin/sh and /bin/echo do not support "-n" option.
         echo=auto/echo
         CC=${CC:-gcc}
         ;;
 
     Darwin)
-        NXT_SYSTEM_VERSION=`uname -r 2>/dev/null`
-        NXT_SYSTEM_PLATFORM=`uname -m 2>/dev/null`
+        NJS_SYSTEM_VERSION=`uname -r 2>/dev/null`
+        NJS_SYSTEM_PLATFORM=`uname -m 2>/dev/null`
         # MacOSX /bin/sh is bash and its embedded "echo" command
         # does not support "-n" option.
         echo=/bin/echo
@@ -46,12 +46,12 @@ case "$NXT_SYSTEM" in
         ;;
 
     *)
-        NXT_SYSTEM_VERSION=`uname -r 2>/dev/null`
-        NXT_SYSTEM_PLATFORM=`uname -p 2>/dev/null`
+        NJS_SYSTEM_VERSION=`uname -r 2>/dev/null`
+        NJS_SYSTEM_PLATFORM=`uname -p 2>/dev/null`
         echo=echo
         CC=${CC:-gcc}
         ;;
 
 esac
 
-$echo configuring for $NXT_SYSTEM $NXT_SYSTEM_VERSION $NXT_SYSTEM_PLATFORM
+$echo configuring for $NJS_SYSTEM $NJS_SYSTEM_VERSION $NJS_SYSTEM_PLATFORM
index 38057ce745a03339c07d063b122f9b88da228d5e..36ad67f2cd761607e35464112645d4854d7d4b86 100644 (file)
--- a/auto/pcre
+++ b/auto/pcre
@@ -3,22 +3,22 @@
 # Copyright (C) NGINX, Inc.
 
 
-NXT_PCRE_CFLAGS=
-NXT_PCRE_LIB=
+NJS_PCRE_CFLAGS=
+NJS_PCRE_LIB=
 
-nxt_found=no
+njs_found=no
 
-if /bin/sh -c "(pcre-config --version)" >> $NXT_AUTOCONF_ERR 2>&1; then
+if /bin/sh -c "(pcre-config --version)" >> $NJS_AUTOCONF_ERR 2>&1; then
 
-    NXT_PCRE_CFLAGS=`pcre-config --cflags`
-    NXT_PCRE_LIB=`pcre-config --libs`
+    NJS_PCRE_CFLAGS=`pcre-config --cflags`
+    NJS_PCRE_LIB=`pcre-config --libs`
 
-    nxt_feature="PCRE library"
-    nxt_feature_name=NXT_HAVE_PCRE
-    nxt_feature_run=no
-    nxt_feature_incs=$NXT_PCRE_CFLAGS
-    nxt_feature_libs=$NXT_PCRE_LIB
-    nxt_feature_test="#include <pcre.h>
+    njs_feature="PCRE library"
+    njs_feature_name=NJS_HAVE_PCRE
+    njs_feature_run=no
+    njs_feature_incs=$NJS_PCRE_CFLAGS
+    njs_feature_libs=$NJS_PCRE_LIB
+    njs_feature_test="#include <pcre.h>
 
                      int main(void) {
                          pcre  *re;
@@ -31,7 +31,7 @@ if /bin/sh -c "(pcre-config --version)" >> $NXT_AUTOCONF_ERR 2>&1; then
     . auto/feature
 fi
 
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
     $echo
     $echo $0: error: no PCRE library found.
     $echo
index 0a2f5a187db7ed031763fdeadd5951ee1f021117..55ff2b45add842511600bed2b3d3763b96207afb 100644 (file)
@@ -2,16 +2,16 @@
 # Copyright (C) NGINX, Inc.
 
 
-NXT_READLINE_LIB=
+NJS_READLINE_LIB=
 
-nxt_found=no
+njs_found=no
 
-nxt_feature="GNU readline library"
-nxt_feature_name=NXT_HAVE_GNU_READLINE
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs="-lreadline"
-nxt_feature_test="#include <stdio.h>
+njs_feature="GNU readline library"
+njs_feature_name=NJS_HAVE_GNU_READLINE
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs="-lreadline"
+njs_feature_test="#include <stdio.h>
                   #include <readline/readline.h>
                   #include <readline/history.h>
 
@@ -21,11 +21,11 @@ nxt_feature_test="#include <stdio.h>
                   }"
 . auto/feature
 
-if [ $nxt_found = no ]; then
-    nxt_feature="editline library in editline/readline.h"
-    nxt_feature_name=NXT_HAVE_EDITLINE
-    nxt_feature_libs="-ledit"
-    nxt_feature_test="#include <stdio.h>
+if [ $njs_found = no ]; then
+    njs_feature="editline library in editline/readline.h"
+    njs_feature_name=NJS_HAVE_EDITLINE
+    njs_feature_libs="-ledit"
+    njs_feature_test="#include <stdio.h>
                       #include <editline/readline.h>
 
                       int main(void) {
@@ -35,13 +35,13 @@ if [ $nxt_found = no ]; then
     . auto/feature
 fi
 
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
 
     # FreeBSD port
 
-    nxt_feature_name=NXT_HAVE_EDIT_READLINE
-    nxt_feature="editline in edit/readline/readline.h"
-    nxt_feature_test="#include <stdio.h>
+    njs_feature_name=NJS_HAVE_EDIT_READLINE
+    njs_feature="editline in edit/readline/readline.h"
+    njs_feature_test="#include <stdio.h>
                       #include <edit/readline/readline.h>
 
                       int main(void) {
@@ -52,13 +52,13 @@ if [ $nxt_found = no ]; then
     . auto/feature
 fi
 
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
 
     # NetBSD
 
-    nxt_feature_name=NXT_HAVE_NETBSD_READLINE
-    nxt_feature="editline in readline/readline.h"
-    nxt_feature_test="#include <stdio.h>
+    njs_feature_name=NJS_HAVE_NETBSD_READLINE
+    njs_feature="editline in readline/readline.h"
+    njs_feature_test="#include <stdio.h>
                       #include <readline/readline.h>
 
                       int main(void) {
@@ -68,14 +68,14 @@ if [ $nxt_found = no ]; then
     . auto/feature
 fi
 
-NXT_DEFAULT_TARGET=libnjs
+NJS_DEFAULT_TARGET=libnjs
 
-if [ $nxt_found = yes ]; then
-    NXT_HAVE_READLINE=YES
-    NXT_READLINE_LIB=$nxt_feature_libs
-    NXT_DEFAULT_TARGET="$NXT_DEFAULT_TARGET njs"
+if [ $njs_found = yes ]; then
+    NJS_HAVE_READLINE=YES
+    NJS_READLINE_LIB=$njs_feature_libs
+    NJS_DEFAULT_TARGET="$NJS_DEFAULT_TARGET njs"
 
 else
-    NXT_HAVE_READLINE=NO
+    NJS_HAVE_READLINE=NO
     $echo " - building interactive shell is not possible"
 fi
index 20e5ac87a9179a87d623604ad859443dd9fd1bff..c07915a010dddcb963de9d7b4e7c331499274d3f 100644 (file)
@@ -1,68 +1,65 @@
-NXT_LIB_SRCS=" \
-    nxt/nxt_diyfp.c \
-    nxt/nxt_dtoa.c \
-    nxt/nxt_strtod.c \
-    nxt/nxt_murmur_hash.c \
-    nxt/nxt_djb_hash.c \
-    nxt/nxt_utf8.c \
-    nxt/nxt_array.c \
-    nxt/nxt_rbtree.c \
-    nxt/nxt_lvlhsh.c \
-    nxt/nxt_trace.c \
-    nxt/nxt_random.c \
-    nxt/nxt_md5.c \
-    nxt/nxt_sha1.c \
-    nxt/nxt_sha2.c \
-    nxt/nxt_pcre.c \
-    nxt/nxt_time.c \
-    nxt/nxt_file.c \
-    nxt/nxt_malloc.c \
-    nxt/nxt_mp.c \
-    nxt/nxt_sprintf.c \
-"
-
-NXT_TEST_SRCS=" \
-   nxt/test/lvlhsh_unit_test.c \
-   nxt/test/random_unit_test.c \
-   nxt/test/rbtree_unit_test.c \
-   nxt/test/utf8_unit_test.c \
+NJS_LIB_SRCS=" \
+   src/njs_diyfp.c \
+   src/njs_dtoa.c \
+   src/njs_strtod.c \
+   src/njs_murmur_hash.c \
+   src/njs_djb_hash.c \
+   src/njs_utf8.c \
+   src/njs_arr.c \
+   src/njs_rbtree.c \
+   src/njs_lvlhsh.c \
+   src/njs_trace.c \
+   src/njs_random.c \
+   src/njs_md5.c \
+   src/njs_sha1.c \
+   src/njs_sha2.c \
+   src/njs_pcre.c \
+   src/njs_time.c \
+   src/njs_file.c \
+   src/njs_malloc.c \
+   src/njs_mp.c \
+   src/njs_sprintf.c \
+   src/njs_value.c \
+   src/njs_vm.c \
+   src/njs_vmcode.c \
+   src/njs_boolean.c \
+   src/njs_number.c \
+   src/njs_string.c \
+   src/njs_object.c \
+   src/njs_object_property.c \
+   src/njs_array.c \
+   src/njs_json.c \
+   src/njs_function.c \
+   src/njs_regexp.c \
+   src/njs_date.c \
+   src/njs_error.c \
+   src/njs_math.c \
+   src/njs_timer.c \
+   src/njs_module.c \
+   src/njs_event.c \
+   src/njs_fs.c \
+   src/njs_crypto.c \
+   src/njs_extern.c \
+   src/njs_variable.c \
+   src/njs_builtin.c \
+   src/njs_lexer.c \
+   src/njs_lexer_keyword.c \
+   src/njs_parser.c \
+   src/njs_parser_terminal.c \
+   src/njs_parser_expression.c \
+   src/njs_generator.c \
+   src/njs_disassembler.c \
 "
 
-NJS_LIB_SRCS=" \
-   njs/njs_value.c \
-   njs/njs_vm.c \
-   njs/njs_vmcode.c \
-   njs/njs_boolean.c \
-   njs/njs_number.c \
-   njs/njs_string.c \
-   njs/njs_object.c \
-   njs/njs_object_property.c \
-   njs/njs_array.c \
-   njs/njs_json.c \
-   njs/njs_function.c \
-   njs/njs_regexp.c \
-   njs/njs_date.c \
-   njs/njs_error.c \
-   njs/njs_math.c \
-   njs/njs_time.c \
-   njs/njs_module.c \
-   njs/njs_event.c \
-   njs/njs_fs.c \
-   njs/njs_crypto.c \
-   njs/njs_extern.c \
-   njs/njs_variable.c \
-   njs/njs_builtin.c \
-   njs/njs_lexer.c \
-   njs/njs_lexer_keyword.c \
-   njs/njs_parser.c \
-   njs/njs_parser_terminal.c \
-   njs/njs_parser_expression.c \
-   njs/njs_generator.c \
-   njs/njs_disassembler.c \
+NJS_LIB_TEST_SRCS=" \
+   src/test/lvlhsh_unit_test.c \
+   src/test/random_unit_test.c \
+   src/test/rbtree_unit_test.c \
+   src/test/utf8_unit_test.c \
 "
 
 NJS_TEST_SRCS=" \
-   njs/test/njs_unit_test.c \
-   njs/test/njs_interactive_test.c \
-   njs/test/njs_benchmark.c \
+   src/test/njs_unit_test.c \
+   src/test/njs_interactive_test.c \
+   src/test/njs_benchmark.c \
 "
index 0c66c5e9020ba3d25fe5de0ba3d8d6e5561f2c43..69f9e74ae8dc057096914a7e620a39829b4a9226 100644 (file)
--- a/auto/time
+++ b/auto/time
@@ -3,12 +3,12 @@
 # Copyright (C) NGINX, Inc.
 
 
-nxt_feature="clock_gettime(CLOCK_MONOTONIC)"
-nxt_feature_name=NXT_HAVE_CLOCK_MONOTONIC
-nxt_feature_run=yes
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <time.h>
+njs_feature="clock_gettime(CLOCK_MONOTONIC)"
+njs_feature_name=NJS_HAVE_CLOCK_MONOTONIC
+njs_feature_run=yes
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <time.h>
 
                   int main() {
                       struct timespec  ts;
@@ -20,27 +20,27 @@ nxt_feature_test="#include <time.h>
 . auto/feature
 
 
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
 
     # Linux and Solaris 10 clock_gettime() are in librt.
 
-    nxt_feature="clock_gettime(CLOCK_MONOTONIC) in librt"
-    nxt_feature_libs="-lrt"
+    njs_feature="clock_gettime(CLOCK_MONOTONIC) in librt"
+    njs_feature_libs="-lrt"
     . auto/feature
 
-    if [ $nxt_found = yes ]; then
-               NXT_LIBRT="-lrt"
+    if [ $njs_found = yes ]; then
+               NJS_LIBRT="-lrt"
     fi
 fi
 
 # Linux, FreeBSD, MacOSX.
 
-nxt_feature="struct tm.tm_gmtoff"
-nxt_feature_name=NXT_HAVE_TM_GMTOFF
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <time.h>
+njs_feature="struct tm.tm_gmtoff"
+njs_feature_name=NJS_HAVE_TM_GMTOFF
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <time.h>
 
                   int main(void) {
                       time_t     t;
@@ -55,12 +55,12 @@ nxt_feature_test="#include <time.h>
 
 # Solaris
 
-nxt_feature="altzone"
-nxt_feature_name=NXT_HAVE_ALTZONE
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <time.h>
+njs_feature="altzone"
+njs_feature_name=NJS_HAVE_ALTZONE
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <time.h>
 
                   int main(void) {
                       altzone = 0;
index d564bed0e4aa494a657cc4cbc064627c7dfb0451..40e24581edc79fcba9e7906006bdc303ed12b34b 100755 (executable)
--- a/configure
+++ b/configure
@@ -16,35 +16,35 @@ set -u
 
 # Initialize variables with null values if they are not defined.
 CFLAGS=${CFLAGS=}
-NXT_TEST_CFLAGS=${NXT_TEST_CFLAGS=}
-NXT_TEST_LIBS=${NXT_TEST_LIBS=}
+NJS_TEST_CFLAGS=${NJS_TEST_CFLAGS=}
+NJS_TEST_LIBS=${NJS_TEST_LIBS=}
 
 
 # Initialize variables with default if they are not defined.
 CC=${CC:-cc}
 AR=${AR:-ar}
-NXT_CFLAGS=${NXT_CFLAGS=}
-NXT_CC_OPT=${NXT_CC_OPT:--O}
-NXT_LD_OPT=${NXT_CC_OPT:--O}
+NJS_CFLAGS=${NJS_CFLAGS=}
+NJS_CC_OPT=${NJS_CC_OPT:--O}
+NJS_LD_OPT=${NJS_CC_OPT:--O}
 
-NXT_BUILD_DIR=${NXT_BUILD_DIR:-build}
+NJS_BUILD_DIR=${NJS_BUILD_DIR:-build}
 
-NXT_AUTOTEST=$NXT_BUILD_DIR/autotest
-NXT_AUTOCONF_ERR=$NXT_BUILD_DIR/autoconf.err
-NXT_AUTO_CONFIG_H=$NXT_BUILD_DIR/nxt_auto_config.h
-NXT_MAKEFILE=$NXT_BUILD_DIR/Makefile
+NJS_AUTOTEST=$NJS_BUILD_DIR/autotest
+NJS_AUTOCONF_ERR=$NJS_BUILD_DIR/autoconf.err
+NJS_AUTO_CONFIG_H=$NJS_BUILD_DIR/njs_auto_config.h
+NJS_MAKEFILE=$NJS_BUILD_DIR/Makefile
 
-test -d $NXT_BUILD_DIR || mkdir $NXT_BUILD_DIR
+test -d $NJS_BUILD_DIR || mkdir $NJS_BUILD_DIR
 
-> $NXT_AUTOCONF_ERR
+> $NJS_AUTOCONF_ERR
 
-cat << END > $NXT_AUTO_CONFIG_H
+cat << END > $NJS_AUTO_CONFIG_H
 
 /* This file is auto-generated by configure */
 
 END
 
-NXT_LIBRT=
+NJS_LIBRT=
 
 . auto/os
 . auto/clang
@@ -56,10 +56,10 @@ NXT_LIBRT=
 . auto/readline
 . auto/sources
 
-NXT_LIB_AUX_CFLAGS="$NXT_PCRE_CFLAGS"
+NJS_LIB_AUX_CFLAGS="$NJS_PCRE_CFLAGS"
 
-NXT_LIBS="$NXT_LIBRT"
-NXT_LIB_AUX_LIBS="$NXT_PCRE_LIB"
+NJS_LIBS="$NJS_LIBRT"
+NJS_LIB_AUX_LIBS="$NJS_PCRE_LIB"
 
 . auto/make
 
index a79c0bb2d0d210c88902ebc1ff3b8dec8e004271..bfc8973ac1a189051b45fb4a06769a31d75f7f83 100644 (file)
@@ -3,7 +3,7 @@ ngx_addon_name="ngx_js_module"
 if [ $HTTP != NO ]; then
     ngx_module_type=HTTP
     ngx_module_name=ngx_http_js_module
-    ngx_module_incs="$ngx_addon_dir/../nxt $ngx_addon_dir/../njs $ngx_addon_dir/../build"
+    ngx_module_incs="$ngx_addon_dir/../src $ngx_addon_dir/../build"
     ngx_module_deps="$ngx_addon_dir/../build/libnjs.a"
     ngx_module_srcs="$ngx_addon_dir/ngx_http_js_module.c"
     ngx_module_libs="PCRE $ngx_addon_dir/../build/libnjs.a -lm"
@@ -14,7 +14,7 @@ fi
 if [ $STREAM != NO ]; then
     ngx_module_type=STREAM
     ngx_module_name=ngx_stream_js_module
-    ngx_module_incs="$ngx_addon_dir/../nxt $ngx_addon_dir/../njs $ngx_addon_dir/../build"
+    ngx_module_incs="$ngx_addon_dir/../src $ngx_addon_dir/../build"
     ngx_module_deps="$ngx_addon_dir/../build/libnjs.a"
     ngx_module_srcs="$ngx_addon_dir/ngx_stream_js_module.c"
     ngx_module_libs="PCRE $ngx_addon_dir/../build/libnjs.a -lm"
index 15493ecc1a9238882fded611ef3ecb350d422e52..4a95e214dbf83c7ab5a8b566162e49e966addcef 100644 (file)
@@ -71,34 +71,34 @@ static ngx_table_elt_t *ngx_http_js_get_header(ngx_list_part_t *part,
 static njs_ret_t ngx_http_js_ext_get_header_out(njs_vm_t *vm,
     njs_value_t *value, void *obj, uintptr_t data);
 static njs_ret_t ngx_http_js_ext_set_header_out(njs_vm_t *vm, void *obj,
-    uintptr_t data, nxt_str_t *value);
+    uintptr_t data, njs_str_t *value);
 static njs_ret_t ngx_http_js_ext_delete_header_out(njs_vm_t *vm, void *obj,
-    uintptr_t data, nxt_bool_t delete);
+    uintptr_t data, njs_bool_t delete);
 static njs_ret_t ngx_http_js_ext_foreach_header_out(njs_vm_t *vm, void *obj,
     void *next); /*FIXME*/
 static njs_ret_t ngx_http_js_ext_get_status(njs_vm_t *vm, njs_value_t *value,
     void *obj, uintptr_t data);
 static njs_ret_t ngx_http_js_ext_set_status(njs_vm_t *vm, void *obj,
-    uintptr_t data, nxt_str_t *value);
+    uintptr_t data, njs_str_t *value);
 static njs_ret_t ngx_http_js_ext_send_header(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_http_js_ext_send(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_http_js_ext_finish(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_http_js_ext_return(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_http_js_ext_internal_redirect(njs_vm_t *vm,
-    njs_value_t *args, nxt_uint_t nargs, njs_index_t unused);
+    njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
 
 static njs_ret_t ngx_http_js_ext_log(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_http_js_ext_warn(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_http_js_ext_error(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_http_js_ext_log_core(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, ngx_uint_t level);
+    njs_uint_t nargs, ngx_uint_t level);
 
 static njs_ret_t ngx_http_js_ext_get_http_version(njs_vm_t *vm,
     njs_value_t *value, void *obj, uintptr_t data);
@@ -119,11 +119,11 @@ static njs_ret_t ngx_http_js_ext_next_arg(njs_vm_t *vm, njs_value_t *value,
 static njs_ret_t ngx_http_js_ext_get_variable(njs_vm_t *vm, njs_value_t *value,
     void *obj, uintptr_t data);
 static njs_ret_t ngx_http_js_ext_set_variable(njs_vm_t *vm, void *obj,
-       uintptr_t data, nxt_str_t *value);
+       uintptr_t data, njs_str_t *value);
 static njs_ret_t ngx_http_js_ext_subrequest(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static ngx_int_t ngx_http_js_subrequest(ngx_http_request_t *r,
-    nxt_str_t *uri_arg, nxt_str_t *args_arg, njs_function_t *callback,
+    njs_str_t *uri_arg, njs_str_t *args_arg, njs_function_t *callback,
     ngx_http_request_t **sr);
 static ngx_int_t ngx_http_js_subrequest_done(ngx_http_request_t *r,
     void *data, ngx_int_t rc);
@@ -138,9 +138,9 @@ static void ngx_http_js_clear_timer(njs_external_ptr_t external,
     njs_host_event_t event);
 static void ngx_http_js_timer_handler(ngx_event_t *ev);
 static void ngx_http_js_handle_event(ngx_http_request_t *r,
-    njs_vm_event_t vm_event, njs_value_t *args, nxt_uint_t nargs);
+    njs_vm_event_t vm_event, njs_value_t *args, njs_uint_t nargs);
 static njs_ret_t ngx_http_js_string(njs_vm_t *vm, const njs_value_t *value,
-    nxt_str_t *str);
+    njs_str_t *str);
 
 static char *ngx_http_js_include(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
@@ -220,7 +220,7 @@ ngx_module_t  ngx_http_js_module = {
 
 static njs_external_t  ngx_http_js_ext_request[] = {
 
-    { nxt_string("uri"),
+    { njs_str("uri"),
       NJS_EXTERN_PROPERTY,
       NULL,
       0,
@@ -232,7 +232,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       offsetof(ngx_http_request_t, uri) },
 
-    { nxt_string("method"),
+    { njs_str("method"),
       NJS_EXTERN_PROPERTY,
       NULL,
       0,
@@ -244,7 +244,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       offsetof(ngx_http_request_t, method_name) },
 
-    { nxt_string("httpVersion"),
+    { njs_str("httpVersion"),
       NJS_EXTERN_PROPERTY,
       NULL,
       0,
@@ -256,7 +256,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       0 },
 
-    { nxt_string("remoteAddress"),
+    { njs_str("remoteAddress"),
       NJS_EXTERN_PROPERTY,
       NULL,
       0,
@@ -268,7 +268,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       0 },
 
-    { nxt_string("parent"),
+    { njs_str("parent"),
       NJS_EXTERN_PROPERTY,
       NULL,
       0,
@@ -280,7 +280,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       0 },
 
-    { nxt_string("requestBody"),
+    { njs_str("requestBody"),
       NJS_EXTERN_PROPERTY,
       NULL,
       0,
@@ -292,7 +292,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       0 },
 
-    { nxt_string("responseBody"),
+    { njs_str("responseBody"),
       NJS_EXTERN_PROPERTY,
       NULL,
       0,
@@ -304,7 +304,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       0 },
 
-    { nxt_string("headersIn"),
+    { njs_str("headersIn"),
       NJS_EXTERN_OBJECT,
       NULL,
       0,
@@ -316,7 +316,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       0 },
 
-    { nxt_string("args"),
+    { njs_str("args"),
       NJS_EXTERN_OBJECT,
       NULL,
       0,
@@ -328,7 +328,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       0 },
 
-    { nxt_string("variables"),
+    { njs_str("variables"),
       NJS_EXTERN_OBJECT,
       NULL,
       0,
@@ -340,7 +340,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       0 },
 
-    { nxt_string("status"),
+    { njs_str("status"),
       NJS_EXTERN_PROPERTY,
       NULL,
       0,
@@ -352,7 +352,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       offsetof(ngx_http_request_t, headers_out.status) },
 
-    { nxt_string("headersOut"),
+    { njs_str("headersOut"),
       NJS_EXTERN_OBJECT,
       NULL,
       0,
@@ -364,7 +364,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       NULL,
       0 },
 
-    { nxt_string("subrequest"),
+    { njs_str("subrequest"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -376,7 +376,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       ngx_http_js_ext_subrequest,
       0 },
 
-    { nxt_string("log"),
+    { njs_str("log"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -388,7 +388,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       ngx_http_js_ext_log,
       0 },
 
-    { nxt_string("warn"),
+    { njs_str("warn"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -400,7 +400,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       ngx_http_js_ext_warn,
       0 },
 
-    { nxt_string("error"),
+    { njs_str("error"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -412,7 +412,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       ngx_http_js_ext_error,
       0 },
 
-    { nxt_string("sendHeader"),
+    { njs_str("sendHeader"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -424,7 +424,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       ngx_http_js_ext_send_header,
       0 },
 
-    { nxt_string("send"),
+    { njs_str("send"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -436,7 +436,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       ngx_http_js_ext_send,
       0 },
 
-    { nxt_string("finish"),
+    { njs_str("finish"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -448,7 +448,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       ngx_http_js_ext_finish,
       0 },
 
-    { nxt_string("return"),
+    { njs_str("return"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -460,7 +460,7 @@ static njs_external_t  ngx_http_js_ext_request[] = {
       ngx_http_js_ext_return,
       0 },
 
-    { nxt_string("internalRedirect"),
+    { njs_str("internalRedirect"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -476,10 +476,10 @@ static njs_external_t  ngx_http_js_ext_request[] = {
 
 static njs_external_t  ngx_http_js_externals[] = {
 
-    { nxt_string("request"),
+    { njs_str("request"),
       NJS_EXTERN_OBJECT,
       ngx_http_js_ext_request,
-      nxt_nitems(ngx_http_js_ext_request),
+      njs_nitems(ngx_http_js_ext_request),
       NULL,
       NULL,
       NULL,
@@ -519,7 +519,7 @@ static void
 ngx_http_js_content_event_handler(ngx_http_request_t *r)
 {
     ngx_int_t                rc;
-    nxt_str_t                name, exception;
+    njs_str_t                name, exception;
     njs_function_t          *func;
     ngx_http_js_ctx_t       *ctx;
     ngx_http_js_loc_conf_t  *jlcf;
@@ -658,8 +658,8 @@ ngx_http_js_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
     ngx_str_t *fname = (ngx_str_t *) data;
 
     ngx_int_t           rc;
-    nxt_int_t           pending;
-    nxt_str_t           name, value, exception;
+    njs_int_t           pending;
+    njs_str_t           name, value, exception;
     njs_function_t     *func;
     ngx_http_js_ctx_t  *ctx;
 
@@ -725,8 +725,8 @@ ngx_http_js_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
 static ngx_int_t
 ngx_http_js_init_vm(ngx_http_request_t *r)
 {
-    nxt_int_t                 rc;
-    nxt_str_t                 exception;
+    njs_int_t                 rc;
+    njs_str_t                 exception;
     ngx_http_js_ctx_t        *ctx;
     ngx_pool_cleanup_t       *cln;
     ngx_http_js_main_conf_t  *jmcf;
@@ -777,7 +777,7 @@ ngx_http_js_init_vm(ngx_http_request_t *r)
 
     rc = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->request),
                                 jmcf->req_proto, r);
-    if (rc != NXT_OK) {
+    if (rc != NJS_OK) {
         return NGX_ERROR;
     }
 
@@ -923,16 +923,16 @@ ngx_http_js_ext_get_header_out(njs_vm_t *vm, njs_value_t *value, void *obj,
     uintptr_t data)
 {
     u_char              *p, *start;
-    nxt_str_t           *v;
+    njs_str_t           *v;
     ngx_str_t           *hdr;
     ngx_table_elt_t     *h;
     ngx_http_request_t  *r;
     u_char               content_len[NGX_OFF_T_LEN];
 
     r = (ngx_http_request_t *) obj;
-    v = (nxt_str_t *) data;
+    v = (njs_str_t *) data;
 
-    if (v->length == nxt_length("Content-Type")
+    if (v->length == njs_length("Content-Type")
         && ngx_strncasecmp(v->start, (u_char *) "Content-Type",
                            v->length) == 0)
     {
@@ -940,7 +940,7 @@ ngx_http_js_ext_get_header_out(njs_vm_t *vm, njs_value_t *value, void *obj,
         return njs_vm_value_string_set(vm, value, hdr->data, hdr->len);
     }
 
-    if (v->length == nxt_length("Content-Length")
+    if (v->length == njs_length("Content-Length")
         && ngx_strncasecmp(v->start, (u_char *) "Content-Length",
                            v->length) == 0)
     {
@@ -973,18 +973,18 @@ ngx_http_js_ext_get_header_out(njs_vm_t *vm, njs_value_t *value, void *obj,
 
 static njs_ret_t
 ngx_http_js_ext_set_header_out(njs_vm_t *vm, void *obj, uintptr_t data,
-    nxt_str_t *value)
+    njs_str_t *value)
 {
     u_char              *p;
     ngx_int_t            n;
-    nxt_str_t           *v;
+    njs_str_t           *v;
     ngx_table_elt_t     *h;
     ngx_http_request_t  *r;
 
     r = (ngx_http_request_t *) obj;
-    v = (nxt_str_t *) data;
+    v = (njs_str_t *) data;
 
-    if (v->length == nxt_length("Content-Type")
+    if (v->length == njs_length("Content-Type")
         && ngx_strncasecmp(v->start, (u_char *) "Content-Type",
                            v->length) == 0)
     {
@@ -1034,14 +1034,14 @@ ngx_http_js_ext_set_header_out(njs_vm_t *vm, void *obj, uintptr_t data,
         h->hash = 1;
     }
 
-    if (v->length == nxt_length("Content-Encoding")
+    if (v->length == njs_length("Content-Encoding")
         && ngx_strncasecmp(v->start, (u_char *) "Content-Encoding",
                            v->length) == 0)
     {
         r->headers_out.content_encoding = h;
     }
 
-    if (v->length == nxt_length("Content-Length")
+    if (v->length == njs_length("Content-Length")
         && ngx_strncasecmp(v->start, (u_char *) "Content-Length",
                            v->length) == 0)
     {
@@ -1067,11 +1067,11 @@ ngx_http_js_ext_set_header_out(njs_vm_t *vm, void *obj, uintptr_t data,
 
 static njs_ret_t
 ngx_http_js_ext_delete_header_out(njs_vm_t *vm, void *obj, uintptr_t data,
-    nxt_bool_t unused)
+    njs_bool_t unused)
 {
-    nxt_str_t  value;
+    njs_str_t  value;
 
-    value = nxt_string_value("");
+    value = njs_str_value("");
 
     return ngx_http_js_ext_set_header_out(vm, obj, data, &value);
 }
@@ -1101,7 +1101,7 @@ ngx_http_js_ext_get_status(njs_vm_t *vm, njs_value_t *value, void *obj,
 
 static njs_ret_t
 ngx_http_js_ext_set_status(njs_vm_t *vm, void *obj, uintptr_t data,
-    nxt_str_t *value)
+    njs_str_t *value)
 {
     ngx_int_t            n;
     ngx_http_request_t  *r;
@@ -1120,13 +1120,13 @@ ngx_http_js_ext_set_status(njs_vm_t *vm, void *obj, uintptr_t data,
 
 
 static njs_ret_t
-ngx_http_js_ext_send_header(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_http_js_ext_send_header(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     ngx_http_request_t  *r;
 
     r = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(r == NULL)) {
+    if (njs_slow_path(r == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1143,11 +1143,11 @@ ngx_http_js_ext_send_header(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_http_js_ext_send(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_http_js_ext_send(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_int_t            ret;
-    nxt_str_t            s;
+    njs_int_t            ret;
+    njs_str_t            s;
     ngx_buf_t           *b;
     uintptr_t            next;
     ngx_uint_t           n;
@@ -1155,7 +1155,7 @@ ngx_http_js_ext_send(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     ngx_http_request_t  *r;
 
     r = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(r == NULL)) {
+    if (njs_slow_path(r == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1217,14 +1217,14 @@ ngx_http_js_ext_send(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_http_js_ext_finish(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_http_js_ext_finish(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     ngx_http_js_ctx_t   *ctx;
     ngx_http_request_t  *r;
 
     r = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(r == NULL)) {
+    if (njs_slow_path(r == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1241,10 +1241,10 @@ ngx_http_js_ext_finish(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_http_js_ext_return(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_http_js_ext_return(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_str_t                  text;
+    njs_str_t                  text;
     ngx_int_t                  status;
     ngx_http_js_ctx_t         *ctx;
     ngx_http_request_t        *r;
@@ -1252,7 +1252,7 @@ ngx_http_js_ext_return(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     ngx_http_complex_value_t   cv;
 
     r = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(r == NULL)) {
+    if (njs_slow_path(r == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1299,14 +1299,14 @@ ngx_http_js_ext_return(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 static njs_ret_t
 ngx_http_js_ext_internal_redirect(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
-    nxt_str_t            uri;
+    njs_str_t            uri;
     ngx_http_js_ctx_t   *ctx;
     ngx_http_request_t  *r;
 
     r = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(r == NULL)) {
+    if (njs_slow_path(r == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1332,7 +1332,7 @@ ngx_http_js_ext_internal_redirect(njs_vm_t *vm, njs_value_t *args,
 
 
 static njs_ret_t
-ngx_http_js_ext_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_http_js_ext_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return ngx_http_js_ext_log_core(vm, args, nargs, NGX_LOG_INFO);
@@ -1340,7 +1340,7 @@ ngx_http_js_ext_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_http_js_ext_warn(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_http_js_ext_warn(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return ngx_http_js_ext_log_core(vm, args, nargs, NGX_LOG_WARN);
@@ -1348,7 +1348,7 @@ ngx_http_js_ext_warn(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_http_js_ext_error(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_http_js_ext_error(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return ngx_http_js_ext_log_core(vm, args, nargs, NGX_LOG_ERR);
@@ -1356,16 +1356,16 @@ ngx_http_js_ext_error(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_http_js_ext_log_core(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_http_js_ext_log_core(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     ngx_uint_t level)
 {
-    nxt_str_t            msg;
+    njs_str_t            msg;
     ngx_connection_t    *c;
     ngx_log_handler_pt   handler;
     ngx_http_request_t  *r;
 
     r = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(r == NULL)) {
+    if (njs_slow_path(r == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1500,7 +1500,7 @@ done:
 
     ret = njs_vm_value_string_set(vm, request_body, body, len);
 
-    if (ret != NXT_OK) {
+    if (ret != NJS_OK) {
         return NJS_ERROR;
     }
 
@@ -1514,12 +1514,12 @@ 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;
+    njs_str_t           *v;
     ngx_table_elt_t     *h;
     ngx_http_request_t  *r;
 
     r = (ngx_http_request_t *) obj;
-    v = (nxt_str_t *) data;
+    v = (njs_str_t *) data;
 
     h = ngx_http_js_get_header(&r->headers_in.headers.part, v->start,
                                v->length);
@@ -1543,12 +1543,12 @@ 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;
+    njs_str_t           *v;
     ngx_str_t            arg;
     ngx_http_request_t  *r;
 
     r = (ngx_http_request_t *) obj;
-    v = (nxt_str_t *) data;
+    v = (njs_str_t *) data;
 
     if (ngx_http_arg(r, v->start, v->length, &arg) == NGX_OK) {
         return njs_vm_value_string_set(vm, value, arg.data, arg.len);
@@ -1629,14 +1629,14 @@ static njs_ret_t
 ngx_http_js_ext_get_variable(njs_vm_t *vm, njs_value_t *value, void *obj,
     uintptr_t data)
 {
-    nxt_str_t                  *v;
+    njs_str_t                  *v;
     ngx_str_t                   name;
     ngx_uint_t                  key;
     ngx_http_request_t         *r;
     ngx_http_variable_value_t  *vv;
 
     r = (ngx_http_request_t *) obj;
-    v = (nxt_str_t *) data;
+    v = (njs_str_t *) data;
 
     name.data = v->start;
     name.len = v->length;
@@ -1655,9 +1655,9 @@ ngx_http_js_ext_get_variable(njs_vm_t *vm, njs_value_t *value, void *obj,
 
 static njs_ret_t
 ngx_http_js_ext_set_variable(njs_vm_t *vm, void *obj, uintptr_t data,
-    nxt_str_t *value)
+    njs_str_t *value)
 {
-    nxt_str_t                  *val;
+    njs_str_t                  *val;
     ngx_str_t                   name;
     ngx_uint_t                  key;
     ngx_http_request_t         *r;
@@ -1666,7 +1666,7 @@ ngx_http_js_ext_set_variable(njs_vm_t *vm, void *obj, uintptr_t data,
     ngx_http_core_main_conf_t  *cmcf;
 
     r = (ngx_http_request_t *) obj;
-    val = (nxt_str_t *) data;
+    val = (njs_str_t *) data;
 
     name.data = val->start;
     name.len = val->length;
@@ -1723,11 +1723,11 @@ ngx_http_js_ext_set_variable(njs_vm_t *vm, void *obj, uintptr_t data,
 
 
 static njs_ret_t
-ngx_http_js_ext_subrequest(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_http_js_ext_subrequest(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     ngx_int_t                 rc;
-    nxt_str_t                 uri_arg, args_arg, method_name, body_arg;
+    njs_str_t                 uri_arg, args_arg, method_name, body_arg;
     ngx_uint_t                method, methods_max, has_body;
     njs_value_t              *value;
     njs_function_t           *callback;
@@ -1757,12 +1757,12 @@ ngx_http_js_ext_subrequest(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         { ngx_string("TRACE"),     NGX_HTTP_TRACE },
     };
 
-    static const nxt_str_t args_key   = nxt_string("args");
-    static const nxt_str_t method_key = nxt_string("method");
-    static const nxt_str_t body_key = nxt_string("body");
+    static const njs_str_t args_key   = njs_str("args");
+    static const njs_str_t method_key = njs_str("method");
+    static const njs_str_t body_key = njs_str("body");
 
     r = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(r == NULL)) {
+    if (njs_slow_path(r == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1924,8 +1924,8 @@ memory_error:
 
 
 static ngx_int_t
-ngx_http_js_subrequest(ngx_http_request_t *r, nxt_str_t *uri_arg,
-    nxt_str_t *args_arg, njs_function_t *callback, ngx_http_request_t **sr)
+ngx_http_js_subrequest(ngx_http_request_t *r, njs_str_t *uri_arg,
+    njs_str_t *args_arg, njs_function_t *callback, ngx_http_request_t **sr)
 {
     ngx_int_t                    flags;
     ngx_str_t                    uri, args;
@@ -1986,7 +1986,7 @@ ngx_http_js_subrequest_done(ngx_http_request_t *r, void *data, ngx_int_t rc)
 {
     njs_vm_event_t  vm_event = data;
 
-    nxt_int_t                 ret;
+    njs_int_t                 ret;
     ngx_http_js_ctx_t        *ctx;
     njs_opaque_value_t        reply;
     ngx_http_js_main_conf_t  *jmcf;
@@ -2029,7 +2029,7 @@ ngx_http_js_subrequest_done(ngx_http_request_t *r, void *data, ngx_int_t rc)
 
     ret = njs_vm_external_create(ctx->vm, njs_value_arg(&reply),
                                  jmcf->req_proto, r);
-    if (ret != NXT_OK) {
+    if (ret != NJS_OK) {
         ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
                       "js subrequest reply creation failed");
 
@@ -2159,10 +2159,10 @@ ngx_http_js_timer_handler(ngx_event_t *ev)
 
 static void
 ngx_http_js_handle_event(ngx_http_request_t *r, njs_vm_event_t vm_event,
-    njs_value_t *args, nxt_uint_t nargs)
+    njs_value_t *args, njs_uint_t nargs)
 {
     njs_ret_t           rc;
-    nxt_str_t           exception;
+    njs_str_t           exception;
     ngx_http_js_ctx_t  *ctx;
 
     ctx = ngx_http_get_module_ctx(r, ngx_http_js_module);
@@ -2187,7 +2187,7 @@ ngx_http_js_handle_event(ngx_http_request_t *r, njs_vm_event_t vm_event,
 
 
 static njs_ret_t
-ngx_http_js_string(njs_vm_t *vm, const njs_value_t *value, nxt_str_t *str)
+ngx_http_js_string(njs_vm_t *vm, const njs_value_t *value, njs_str_t *str)
 {
     if (!njs_value_is_null_or_undefined(value)) {
         if (njs_vm_value_to_string(vm, str, value) == NJS_ERROR) {
@@ -2213,8 +2213,8 @@ ngx_http_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     ssize_t                n;
     ngx_fd_t               fd;
     ngx_str_t             *m, *value, file;
-    nxt_int_t              rc;
-    nxt_str_t              text, path;
+    njs_int_t              rc;
+    njs_str_t              text, path;
     ngx_uint_t             i;
     njs_vm_opt_t           options;
     ngx_file_info_t        fi;
@@ -2308,7 +2308,7 @@ ngx_http_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     path.length = ngx_cycle->prefix.len;
 
     rc = njs_vm_add_path(jmcf->vm, &path);
-    if (rc != NXT_OK) {
+    if (rc != NJS_OK) {
         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "failed to add path");
         return NGX_CONF_ERROR;
     }
@@ -2325,7 +2325,7 @@ ngx_http_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
             path.length = m[i].len;
 
             rc = njs_vm_add_path(jmcf->vm, &path);
-            if (rc != NXT_OK) {
+            if (rc != NJS_OK) {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "failed to add path");
                 return NGX_CONF_ERROR;
             }
index 01c59440797a6c57ef73fea7a4aee35a7badbbbc..8a995061c065dcd87d507aac69ffd0bfd232b69e 100644 (file)
@@ -69,39 +69,39 @@ static njs_ret_t ngx_stream_js_buffer_arg(ngx_stream_session_t *s,
 static njs_ret_t ngx_stream_js_flags_arg(ngx_stream_session_t *s,
     njs_value_t *flags);
 static njs_vm_event_t *ngx_stream_js_event(ngx_stream_session_t *s,
-    nxt_str_t *event);
+    njs_str_t *event);
 
 static njs_ret_t ngx_stream_js_ext_get_remote_address(njs_vm_t *vm,
     njs_value_t *value, void *obj, uintptr_t data);
 
 static njs_ret_t ngx_stream_js_ext_done(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused);
+     njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_stream_js_ext_deny(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused);
+     njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_stream_js_ext_decline(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused);
+     njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_stream_js_ext_set_status(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, ngx_int_t status);
+    njs_uint_t nargs, ngx_int_t status);
 
 static njs_ret_t ngx_stream_js_ext_log(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused);
+     njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_stream_js_ext_warn(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused);
+     njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_stream_js_ext_error(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused);
+     njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_stream_js_ext_log_core(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, ngx_uint_t level);
+    njs_uint_t nargs, ngx_uint_t level);
 static njs_ret_t ngx_stream_js_ext_on(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused);
+     njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_stream_js_ext_off(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused);
+     njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t ngx_stream_js_ext_send(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused);
+     njs_uint_t nargs, njs_index_t unused);
 
 static njs_ret_t ngx_stream_js_ext_get_variable(njs_vm_t *vm,
     njs_value_t *value, void *obj, uintptr_t data);
 static njs_ret_t ngx_stream_js_ext_set_variable(njs_vm_t *vm, void *obj,
-    uintptr_t data, nxt_str_t *value);
+    uintptr_t data, njs_str_t *value);
 
 static njs_host_event_t ngx_stream_js_set_timer(njs_external_ptr_t external,
     uint64_t delay, njs_vm_event_t vm_event);
@@ -109,9 +109,9 @@ static void ngx_stream_js_clear_timer(njs_external_ptr_t external,
     njs_host_event_t event);
 static void ngx_stream_js_timer_handler(ngx_event_t *ev);
 static void ngx_stream_js_handle_event(ngx_stream_session_t *s,
-    njs_vm_event_t vm_event, njs_value_t *args, nxt_uint_t nargs);
+    njs_vm_event_t vm_event, njs_value_t *args, njs_uint_t nargs);
 static njs_ret_t ngx_stream_js_string(njs_vm_t *vm, const njs_value_t *value,
-    nxt_str_t *str);
+    njs_str_t *str);
 
 static char *ngx_stream_js_include(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
@@ -202,7 +202,7 @@ ngx_module_t  ngx_stream_js_module = {
 
 static njs_external_t  ngx_stream_js_ext_session[] = {
 
-    { nxt_string("remoteAddress"),
+    { njs_str("remoteAddress"),
       NJS_EXTERN_PROPERTY,
       NULL,
       0,
@@ -214,7 +214,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       NULL,
       0 },
 
-    { nxt_string("variables"),
+    { njs_str("variables"),
       NJS_EXTERN_OBJECT,
       NULL,
       0,
@@ -226,7 +226,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       NULL,
       0 },
 
-    { nxt_string("allow"),
+    { njs_str("allow"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -238,7 +238,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       ngx_stream_js_ext_done,
       0 },
 
-    { nxt_string("deny"),
+    { njs_str("deny"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -250,7 +250,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       ngx_stream_js_ext_deny,
       0 },
 
-    { nxt_string("decline"),
+    { njs_str("decline"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -262,7 +262,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       ngx_stream_js_ext_decline,
       0 },
 
-    { nxt_string("done"),
+    { njs_str("done"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -274,7 +274,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       ngx_stream_js_ext_done,
       0 },
 
-    { nxt_string("log"),
+    { njs_str("log"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -286,7 +286,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       ngx_stream_js_ext_log,
       0 },
 
-    { nxt_string("warn"),
+    { njs_str("warn"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -298,7 +298,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       ngx_stream_js_ext_warn,
       0 },
 
-    { nxt_string("error"),
+    { njs_str("error"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -310,7 +310,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       ngx_stream_js_ext_error,
       0 },
 
-    { nxt_string("on"),
+    { njs_str("on"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -322,7 +322,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       ngx_stream_js_ext_on,
       0 },
 
-    { nxt_string("off"),
+    { njs_str("off"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -334,7 +334,7 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
       ngx_stream_js_ext_off,
       0 },
 
-    { nxt_string("send"),
+    { njs_str("send"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -351,10 +351,10 @@ static njs_external_t  ngx_stream_js_ext_session[] = {
 
 static njs_external_t  ngx_stream_js_externals[] = {
 
-    { nxt_string("stream"),
+    { njs_str("stream"),
       NJS_EXTERN_OBJECT,
       ngx_stream_js_ext_session,
-      nxt_nitems(ngx_stream_js_ext_session),
+      njs_nitems(ngx_stream_js_ext_session),
       NULL,
       NULL,
       NULL,
@@ -405,7 +405,7 @@ ngx_stream_js_preread_handler(ngx_stream_session_t *s)
 static ngx_int_t
 ngx_stream_js_phase_handler(ngx_stream_session_t *s, ngx_str_t *name)
 {
-    nxt_str_t             fname, exception;
+    njs_str_t             fname, exception;
     njs_ret_t             ret;
     ngx_int_t             rc;
     njs_function_t       *func;
@@ -506,7 +506,7 @@ static ngx_int_t
 ngx_stream_js_body_filter(ngx_stream_session_t *s, ngx_chain_t *in,
     ngx_uint_t from_upstream)
 {
-    nxt_str_t                  name, exception;
+    njs_str_t                  name, exception;
     njs_ret_t                  ret;
     ngx_int_t                  rc;
     ngx_chain_t               *out, *cl;
@@ -631,8 +631,8 @@ ngx_stream_js_variable(ngx_stream_session_t *s, ngx_stream_variable_value_t *v,
     ngx_str_t *fname = (ngx_str_t *) data;
 
     ngx_int_t             rc;
-    nxt_int_t             pending;
-    nxt_str_t             name, value, exception;
+    njs_int_t             pending;
+    njs_str_t             name, value, exception;
     njs_function_t       *func;
     ngx_stream_js_ctx_t  *ctx;
 
@@ -698,8 +698,8 @@ ngx_stream_js_variable(ngx_stream_session_t *s, ngx_stream_variable_value_t *v,
 static ngx_int_t
 ngx_stream_js_init_vm(ngx_stream_session_t *s)
 {
-    nxt_int_t                   rc;
-    nxt_str_t                   exception;
+    njs_int_t                   rc;
+    njs_str_t                   exception;
     ngx_pool_cleanup_t         *cln;
     ngx_stream_js_ctx_t        *ctx;
     ngx_stream_js_main_conf_t  *jmcf;
@@ -750,7 +750,7 @@ ngx_stream_js_init_vm(ngx_stream_session_t *s)
 
     rc = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->args[0]),
                                 jmcf->proto, s);
-    if (rc != NXT_OK) {
+    if (rc != NJS_OK) {
         return NGX_ERROR;
     }
 
@@ -829,7 +829,7 @@ ngx_stream_js_flags_arg(ngx_stream_session_t *s, njs_value_t *flags)
     njs_opaque_value_t    values[1];
     ngx_stream_js_ctx_t  *ctx;
 
-    static const nxt_str_t last_str = nxt_string("last");
+    static const njs_str_t last_str = njs_str("last");
 
     ctx = ngx_stream_get_module_ctx(s, ngx_stream_js_module);
 
@@ -848,14 +848,14 @@ ngx_stream_js_flags_arg(ngx_stream_session_t *s, njs_value_t *flags)
 
 
 static njs_vm_event_t *
-ngx_stream_js_event(ngx_stream_session_t *s, nxt_str_t *event)
+ngx_stream_js_event(ngx_stream_session_t *s, njs_str_t *event)
 {
     ngx_uint_t             i, n;
     ngx_stream_js_ctx_t  *ctx;
 
-    static const nxt_str_t events[] = {
-        nxt_string("upload"),
-        nxt_string("download")
+    static const njs_str_t events[] = {
+        njs_str("upload"),
+        njs_str("download")
     };
 
     ctx = ngx_stream_get_module_ctx(s, ngx_stream_js_module);
@@ -903,7 +903,7 @@ ngx_stream_js_ext_get_remote_address(njs_vm_t *vm, njs_value_t *value,
 
 static njs_ret_t
 ngx_stream_js_ext_done(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused)
+     njs_uint_t nargs, njs_index_t unused)
 {
     return ngx_stream_js_ext_set_status(vm, args, nargs, NGX_OK);
 }
@@ -911,24 +911,24 @@ ngx_stream_js_ext_done(njs_vm_t *vm, njs_value_t *args,
 
 static njs_ret_t
 ngx_stream_js_ext_deny(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused)
+     njs_uint_t nargs, njs_index_t unused)
 {
-    return ngx_stream_js_ext_set_status(vm, args, nxt_min(nargs, 1),
+    return ngx_stream_js_ext_set_status(vm, args, njs_min(nargs, 1),
                                         NGX_STREAM_FORBIDDEN);
 }
 
 
 static njs_ret_t
 ngx_stream_js_ext_decline(njs_vm_t *vm, njs_value_t *args,
-     nxt_uint_t nargs, njs_index_t unused)
+     njs_uint_t nargs, njs_index_t unused)
 {
-    return ngx_stream_js_ext_set_status(vm, args, nxt_min(nargs, 1),
+    return ngx_stream_js_ext_set_status(vm, args, njs_min(nargs, 1),
                                         NGX_DECLINED);
 }
 
 
 static njs_ret_t
-ngx_stream_js_ext_set_status(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_stream_js_ext_set_status(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     ngx_int_t status)
 {
     const njs_value_t     *code;
@@ -936,7 +936,7 @@ ngx_stream_js_ext_set_status(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     ngx_stream_session_t  *s;
 
     s = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(s == NULL)) {
+    if (njs_slow_path(s == NULL)) {
         return NJS_ERROR;
     }
 
@@ -977,7 +977,7 @@ ngx_stream_js_ext_set_status(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_stream_js_ext_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_stream_js_ext_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return ngx_stream_js_ext_log_core(vm, args, nargs, NGX_LOG_INFO);
@@ -985,7 +985,7 @@ ngx_stream_js_ext_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_stream_js_ext_warn(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_stream_js_ext_warn(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return ngx_stream_js_ext_log_core(vm, args, nargs, NGX_LOG_WARN);
@@ -993,7 +993,7 @@ ngx_stream_js_ext_warn(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_stream_js_ext_error(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_stream_js_ext_error(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return ngx_stream_js_ext_log_core(vm, args, nargs, NGX_LOG_ERR);
@@ -1001,16 +1001,16 @@ ngx_stream_js_ext_error(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_stream_js_ext_log_core(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_stream_js_ext_log_core(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     ngx_uint_t level)
 {
-    nxt_str_t              msg;
+    njs_str_t              msg;
     ngx_connection_t      *c;
     ngx_log_handler_pt     handler;
     ngx_stream_session_t  *s;
 
     s = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(s == NULL)) {
+    if (njs_slow_path(s == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1034,16 +1034,16 @@ ngx_stream_js_ext_log_core(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_stream_js_ext_on(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_stream_js_ext_on(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_str_t              name;
+    njs_str_t              name;
     njs_vm_event_t        *event;
     const njs_value_t     *callback;
     ngx_stream_session_t  *s;
 
     s = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(s == NULL)) {
+    if (njs_slow_path(s == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1081,15 +1081,15 @@ ngx_stream_js_ext_on(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_stream_js_ext_off(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_stream_js_ext_off(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_str_t              name;
+    njs_str_t              name;
     njs_vm_event_t        *event;
     ngx_stream_session_t  *s;
 
     s = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(s == NULL)) {
+    if (njs_slow_path(s == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1114,11 +1114,11 @@ ngx_stream_js_ext_off(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-ngx_stream_js_ext_send(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ngx_stream_js_ext_send(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     unsigned               last_buf, flush;
-    nxt_str_t              buffer;
+    njs_str_t              buffer;
     ngx_buf_t             *b;
     ngx_chain_t           *cl;
     ngx_connection_t      *c;
@@ -1126,11 +1126,11 @@ ngx_stream_js_ext_send(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     ngx_stream_js_ctx_t   *ctx;
     ngx_stream_session_t  *s;
 
-    static const nxt_str_t last_key = nxt_string("last");
-    static const nxt_str_t flush_key = nxt_string("flush");
+    static const njs_str_t last_key = njs_str("last");
+    static const njs_str_t flush_key = njs_str("flush");
 
     s = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(s == NULL)) {
+    if (njs_slow_path(s == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1196,14 +1196,14 @@ static njs_ret_t
 ngx_stream_js_ext_get_variable(njs_vm_t *vm, njs_value_t *value, void *obj,
     uintptr_t data)
 {
-    nxt_str_t                    *v;
+    njs_str_t                    *v;
     ngx_str_t                     name;
     ngx_uint_t                    key;
     ngx_stream_session_t         *s;
     ngx_stream_variable_value_t  *vv;
 
     s = (ngx_stream_session_t *) obj;
-    v = (nxt_str_t *) data;
+    v = (njs_str_t *) data;
 
     name.data = v->start;
     name.len = v->length;
@@ -1222,9 +1222,9 @@ ngx_stream_js_ext_get_variable(njs_vm_t *vm, njs_value_t *value, void *obj,
 
 static njs_ret_t
 ngx_stream_js_ext_set_variable(njs_vm_t *vm, void *obj, uintptr_t data,
-    nxt_str_t *value)
+    njs_str_t *value)
 {
-    nxt_str_t                    *val;
+    njs_str_t                    *val;
     ngx_str_t                     name;
     ngx_uint_t                    key;
     ngx_stream_variable_t        *v;
@@ -1233,7 +1233,7 @@ ngx_stream_js_ext_set_variable(njs_vm_t *vm, void *obj, uintptr_t data,
     ngx_stream_variable_value_t  *vv;
 
     s = (ngx_stream_session_t *) obj;
-    val = (nxt_str_t *) data;
+    val = (njs_str_t *) data;
 
     name.data = val->start;
     name.len = val->length;
@@ -1349,10 +1349,10 @@ ngx_stream_js_timer_handler(ngx_event_t *ev)
 
 static void
 ngx_stream_js_handle_event(ngx_stream_session_t *s, njs_vm_event_t vm_event,
-    njs_value_t *args, nxt_uint_t nargs)
+    njs_value_t *args, njs_uint_t nargs)
 {
     njs_ret_t            rc;
-    nxt_str_t            exception;
+    njs_str_t            exception;
     ngx_stream_js_ctx_t  *ctx;
 
     ctx = ngx_stream_get_module_ctx(s, ngx_stream_js_module);
@@ -1377,7 +1377,7 @@ ngx_stream_js_handle_event(ngx_stream_session_t *s, njs_vm_event_t vm_event,
 
 
 static njs_ret_t
-ngx_stream_js_string(njs_vm_t *vm, const njs_value_t *value, nxt_str_t *str)
+ngx_stream_js_string(njs_vm_t *vm, const njs_value_t *value, njs_str_t *str)
 {
     if (!njs_value_is_null_or_undefined(value)) {
         if (njs_vm_value_to_string(vm, str, value) == NJS_ERROR) {
@@ -1403,8 +1403,8 @@ ngx_stream_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     ssize_t                n;
     ngx_fd_t               fd;
     ngx_str_t             *m, *value, file;
-    nxt_int_t              rc;
-    nxt_str_t              text, path;
+    njs_int_t              rc;
+    njs_str_t              text, path;
     ngx_uint_t             i;
     njs_vm_opt_t           options;
     ngx_file_info_t        fi;
@@ -1498,7 +1498,7 @@ ngx_stream_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     path.length = ngx_cycle->prefix.len;
 
     rc = njs_vm_add_path(jmcf->vm, &path);
-    if (rc != NXT_OK) {
+    if (rc != NJS_OK) {
         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "failed to add path");
         return NGX_CONF_ERROR;
     }
@@ -1515,7 +1515,7 @@ ngx_stream_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
             path.length = m[i].len;
 
             rc = njs_vm_add_path(jmcf->vm, &path);
-            if (rc != NXT_OK) {
+            if (rc != NJS_OK) {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "failed to add path");
                 return NGX_CONF_ERROR;
             }
diff --git a/njs/njs_lexer_keyword.c b/njs/njs_lexer_keyword.c
deleted file mode 100644 (file)
index 5aa856b..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <njs_core.h>
-#include <string.h>
-
-
-static const njs_keyword_t  njs_keywords[] = {
-
-    /* Values. */
-
-    { nxt_string("undefined"),     NJS_TOKEN_UNDEFINED, 0 },
-    { nxt_string("null"),          NJS_TOKEN_NULL, 0 },
-    { nxt_string("false"),         NJS_TOKEN_BOOLEAN, 0 },
-    { nxt_string("true"),          NJS_TOKEN_BOOLEAN, 1 },
-    { nxt_string("NaN"),           NJS_TOKEN_NUMBER, NAN },
-    { nxt_string("Infinity"),      NJS_TOKEN_NUMBER, INFINITY },
-
-    /* Operators. */
-
-    { nxt_string("in"),            NJS_TOKEN_IN, 0 },
-    { nxt_string("typeof"),        NJS_TOKEN_TYPEOF, 0 },
-    { nxt_string("instanceof"),    NJS_TOKEN_INSTANCEOF, 0 },
-    { nxt_string("void"),          NJS_TOKEN_VOID, 0 },
-    { nxt_string("new"),           NJS_TOKEN_NEW, 0 },
-    { nxt_string("delete"),        NJS_TOKEN_DELETE, 0 },
-    { nxt_string("yield"),         NJS_TOKEN_YIELD, 0 },
-
-    /* Statements. */
-
-    { nxt_string("var"),           NJS_TOKEN_VAR, 0 },
-    { nxt_string("if"),            NJS_TOKEN_IF, 0 },
-    { nxt_string("else"),          NJS_TOKEN_ELSE, 0 },
-    { nxt_string("while"),         NJS_TOKEN_WHILE, 0 },
-    { nxt_string("do"),            NJS_TOKEN_DO, 0 },
-    { nxt_string("for"),           NJS_TOKEN_FOR, 0 },
-    { nxt_string("break"),         NJS_TOKEN_BREAK, 0 },
-    { nxt_string("continue"),      NJS_TOKEN_CONTINUE, 0 },
-    { nxt_string("switch"),        NJS_TOKEN_SWITCH, 0 },
-    { nxt_string("case"),          NJS_TOKEN_CASE, 0 },
-    { nxt_string("default"),       NJS_TOKEN_DEFAULT, 0 },
-    { nxt_string("function"),      NJS_TOKEN_FUNCTION, 0 },
-    { nxt_string("return"),        NJS_TOKEN_RETURN, 0 },
-    { nxt_string("with"),          NJS_TOKEN_WITH, 0 },
-    { nxt_string("try"),           NJS_TOKEN_TRY, 0 },
-    { nxt_string("catch"),         NJS_TOKEN_CATCH, 0 },
-    { nxt_string("finally"),       NJS_TOKEN_FINALLY, 0 },
-    { nxt_string("throw"),         NJS_TOKEN_THROW, 0 },
-
-    /* Builtin objects. */
-
-    { nxt_string("this"),          NJS_TOKEN_THIS, 0 },
-    { nxt_string("arguments"),     NJS_TOKEN_ARGUMENTS, 0 },
-    { nxt_string("njs"),           NJS_TOKEN_NJS, 0 },
-    { nxt_string("process"),       NJS_TOKEN_PROCESS, 0 },
-    { nxt_string("Math"),          NJS_TOKEN_MATH, 0 },
-    { nxt_string("JSON"),          NJS_TOKEN_JSON, 0 },
-
-    /* Builtin functions. */
-
-    { nxt_string("Object"),        NJS_TOKEN_OBJECT_CONSTRUCTOR, 0 },
-    { nxt_string("Array"),         NJS_TOKEN_ARRAY_CONSTRUCTOR, 0 },
-    { nxt_string("Boolean"),       NJS_TOKEN_BOOLEAN_CONSTRUCTOR, 0 },
-    { nxt_string("Number"),        NJS_TOKEN_NUMBER_CONSTRUCTOR, 0 },
-    { nxt_string("String"),        NJS_TOKEN_STRING_CONSTRUCTOR, 0 },
-    { nxt_string("Function"),      NJS_TOKEN_FUNCTION_CONSTRUCTOR, 0 },
-    { nxt_string("RegExp"),        NJS_TOKEN_REGEXP_CONSTRUCTOR, 0 },
-    { nxt_string("Date"),          NJS_TOKEN_DATE_CONSTRUCTOR, 0 },
-    { nxt_string("Error"),         NJS_TOKEN_ERROR_CONSTRUCTOR, 0 },
-    { nxt_string("EvalError"),     NJS_TOKEN_EVAL_ERROR_CONSTRUCTOR, 0 },
-    { nxt_string("InternalError"), NJS_TOKEN_INTERNAL_ERROR_CONSTRUCTOR, 0 },
-    { nxt_string("RangeError"),    NJS_TOKEN_RANGE_ERROR_CONSTRUCTOR, 0 },
-    { nxt_string("ReferenceError"), NJS_TOKEN_REF_ERROR_CONSTRUCTOR, 0 },
-    { nxt_string("SyntaxError"),   NJS_TOKEN_SYNTAX_ERROR_CONSTRUCTOR, 0 },
-    { nxt_string("TypeError"),     NJS_TOKEN_TYPE_ERROR_CONSTRUCTOR, 0 },
-    { nxt_string("URIError"),      NJS_TOKEN_URI_ERROR_CONSTRUCTOR, 0 },
-    { nxt_string("MemoryError"),   NJS_TOKEN_MEMORY_ERROR_CONSTRUCTOR, 0 },
-
-    { nxt_string("eval"),          NJS_TOKEN_EVAL, 0 },
-    { nxt_string("toString"),      NJS_TOKEN_TO_STRING, 0 },
-    { nxt_string("isNaN"),         NJS_TOKEN_IS_NAN, 0 },
-    { nxt_string("isFinite"),      NJS_TOKEN_IS_FINITE, 0 },
-    { nxt_string("parseInt"),      NJS_TOKEN_PARSE_INT, 0 },
-    { nxt_string("parseFloat"),    NJS_TOKEN_PARSE_FLOAT, 0 },
-    { nxt_string("encodeURI"),     NJS_TOKEN_ENCODE_URI, 0 },
-    { nxt_string("encodeURIComponent"),  NJS_TOKEN_ENCODE_URI_COMPONENT, 0 },
-    { nxt_string("decodeURI"),     NJS_TOKEN_DECODE_URI, 0 },
-    { nxt_string("decodeURIComponent"),  NJS_TOKEN_DECODE_URI_COMPONENT, 0 },
-    { nxt_string("require"),       NJS_TOKEN_REQUIRE, 0 },
-    { nxt_string("setTimeout"),    NJS_TOKEN_SET_TIMEOUT, 0 },
-    { nxt_string("setImmediate"),  NJS_TOKEN_SET_IMMEDIATE, 0 },
-    { nxt_string("clearTimeout"),  NJS_TOKEN_CLEAR_TIMEOUT, 0 },
-
-    /* Module. */
-    { nxt_string("import"),        NJS_TOKEN_IMPORT, 0 },
-    { nxt_string("from"),          NJS_TOKEN_FROM, 0 },
-    { nxt_string("export"),        NJS_TOKEN_EXPORT, 0 },
-
-    /* Reserved words. */
-
-    { nxt_string("await"),         NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("class"),         NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("const"),         NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("debugger"),      NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("enum"),          NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("extends"),       NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("implements"),    NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("interface"),     NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("let"),           NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("package"),       NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("private"),       NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("protected"),     NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("public"),        NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("static"),        NJS_TOKEN_RESERVED, 0 },
-    { nxt_string("super"),         NJS_TOKEN_RESERVED, 0 },
-};
-
-
-static nxt_int_t
-njs_keyword_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
-{
-    njs_keyword_t  *keyword;
-
-    keyword = data;
-
-    if (nxt_strstr_eq(&lhq->key, &keyword->name)) {
-        return NXT_OK;
-    }
-
-    return NXT_DECLINED;
-}
-
-
-const nxt_lvlhsh_proto_t  njs_keyword_hash_proto
-    nxt_aligned(64) =
-{
-    NXT_LVLHSH_DEFAULT,
-    njs_keyword_hash_test,
-    njs_lvlhsh_alloc,
-    njs_lvlhsh_free,
-};
-
-
-nxt_int_t
-njs_lexer_keywords_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash)
-{
-    nxt_uint_t           n;
-    nxt_lvlhsh_query_t   lhq;
-    const njs_keyword_t  *keyword;
-
-    keyword = njs_keywords;
-    n = nxt_nitems(njs_keywords);
-
-    lhq.replace = 0;
-    lhq.proto = &njs_keyword_hash_proto;
-    lhq.pool = mp;
-
-    do {
-        lhq.key_hash = nxt_djb_hash(keyword->name.start, keyword->name.length);
-        lhq.key = keyword->name;
-        lhq.value = (void *) keyword;
-
-        if (nxt_slow_path(nxt_lvlhsh_insert(hash, &lhq) != NXT_OK)) {
-            return NXT_ERROR;
-        }
-
-        keyword++;
-        n--;
-
-    } while (n != 0);
-
-    return NXT_OK;
-}
-
-
-void
-njs_lexer_keyword(njs_lexer_t *lexer, njs_lexer_token_t *lt)
-{
-    njs_keyword_t       *keyword;
-    nxt_lvlhsh_query_t  lhq;
-
-    lhq.key_hash = lt->key_hash;
-    lhq.key = lt->text;
-    lhq.proto = &njs_keyword_hash_proto;
-
-    if (nxt_lvlhsh_find(&lexer->keywords_hash, &lhq) == NXT_OK) {
-        keyword = lhq.value;
-        lt->token = keyword->token;
-        lt->number = keyword->number;
-        lexer->keyword = 1;
-    }
-}
diff --git a/njs/njs_object_hash.h b/njs/njs_object_hash.h
deleted file mode 100644 (file)
index 87abb7c..0000000
+++ /dev/null
@@ -1,288 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NJS_OBJECT_HASH_H_INCLUDED_
-#define _NJS_OBJECT_HASH_H_INCLUDED_
-
-
-#define NJS_ARGV_HASH                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'a'), 'r'), 'g'), 'v')
-
-
-#define NJS_CONFIGURABLE_HASH                                                 \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'c'), 'o'), 'n'), 'f'), 'i'), 'g'), 'u'), 'r'), 'a'), 'b'), 'l'), 'e')
-
-
-#define NJS_CONSTRUCTOR_HASH                                                  \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'c'), 'o'), 'n'), 's'), 't'), 'r'), 'u'), 'c'), 't'), 'o'), 'r')
-
-
-#define NJS_ENUMERABLE_HASH                                                   \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'e'), 'n'), 'u'), 'm'), 'e'), 'r'), 'a'), 'b'), 'l'), 'e')
-
-
-#define NJS_ERRNO_HASH                                                        \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'e'), 'r'), 'r'), 'n'), 'o')
-
-
-#define NJS_ENCODING_HASH                                                     \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'e'), 'n'), 'c'), 'o'), 'd'), 'i'), 'n'), 'g')
-
-
-#define NJS_ENV_HASH                                                          \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'e'), 'n'), 'v')
-
-
-#define NJS_FLAG_HASH                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'f'), 'l'), 'a'), 'g')
-
-
-#define NJS_INDEX_HASH                                                        \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'i'), 'n'), 'd'), 'e'), 'x')
-
-
-#define NJS_INPUT_HASH                                                        \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'i'), 'n'), 'p'), 'u'), 't')
-
-
-#define NJS_GROUPS_HASH                                                       \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'g'), 'r'), 'o'), 'u'), 'p'), 's')
-
-
-#define NJS_JOIN_HASH                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'j'), 'o'), 'i'), 'n')
-
-
-#define NJS_LENGTH_HASH                                                       \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'l'), 'e'), 'n'), 'g'), 't'), 'h')
-
-
-#define NJS_NAME_HASH                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'n'), 'a'), 'm'), 'e')
-
-
-#define NJS_MESSAGE_HASH                                                      \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'm'), 'e'), 's'), 's'), 'a'), 'g'), 'e')
-
-
-#define NJS_MODE_HASH                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'm'), 'o'), 'd'), 'e')
-
-
-#define NJS_SYSCALL_HASH                                                      \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        's'), 'y'), 's'), 'c'), 'a'), 'l'), 'l')
-
-
-#define NJS_PATH_HASH                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'p'), 'a'), 't'), 'h')
-
-
-#define NJS_PROTOTYPE_HASH                                                    \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'p'), 'r'), 'o'), 't'), 'o'), 't'), 'y'), 'p'), 'e')
-
-
-#define NJS_TO_JSON_HASH                                                      \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        't'), 'o'), 'J'), 'S'), 'O'), 'N')
-
-
-#define NJS_TO_STRING_HASH                                                    \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        't'), 'o'), 'S'), 't'), 'r'), 'i'), 'n'), 'g')
-
-
-#define NJS_VALUE_HASH                                                        \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'v'), 'a'), 'l'), 'u'), 'e')
-
-
-#define NJS_VALUE_OF_HASH                                                     \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'v'), 'a'), 'l'), 'u'), 'e'), 'O'), 'f')
-
-
-#define NJS_TO_ISO_STRING_HASH                                                \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        't'), 'o'), 'I'), 'S'), 'O'), 'S'), 't'), 'r'), 'i'), 'n'), 'g')
-
-
-#define NJS_WRITABABLE_HASH                                                   \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'w'), 'r'), 'i'), 't'), 'a'), 'b'), 'l'), 'e')
-
-
-#define NJS_GET_HASH                                                          \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        'g'), 'e'), 't')
-
-
-#define NJS_SET_HASH                                                          \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(                                                         \
-    nxt_djb_hash_add(NXT_DJB_HASH_INIT,                                       \
-        's'), 'e'), 't')
-
-
-#endif /* _NJS_OBJECT_HASH_H_INCLUDED_ */
diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c
deleted file mode 100644 (file)
index cb3cc18..0000000
+++ /dev/null
@@ -1,14690 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-
-#include <njs_core.h>
-#include <nxt_lvlhsh.h>
-#include <nxt_djb_hash.h>
-#include <nxt_pcre.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/resource.h>
-#include <time.h>
-
-
-typedef struct {
-    nxt_str_t  script;
-    nxt_str_t  ret;
-} njs_unit_test_t;
-
-
-static njs_unit_test_t  njs_test[] =
-{
-    { nxt_string("@"),
-      nxt_string("SyntaxError: Unexpected token \"@\" in 1") },
-
-    { nxt_string("}"),
-      nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
-    { nxt_string("1}"),
-      nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
-    { nxt_string("/***/1/*\n**/"),
-      nxt_string("1") },
-
-    /* Variable declarations. */
-
-    { nxt_string("var x"),
-      nxt_string("undefined") },
-
-    { nxt_string("var x;"),
-      nxt_string("undefined") },
-
-    { nxt_string("var x;;"),
-      nxt_string("undefined") },
-
-    { nxt_string("var x = 0"),
-      nxt_string("undefined") },
-
-    { nxt_string("var x = 0;"),
-      nxt_string("undefined") },
-
-    { nxt_string("var x = 0;;"),
-      nxt_string("undefined") },
-
-    { nxt_string("var; a"),
-      nxt_string("SyntaxError: Unexpected token \";\" in 1") },
-
-    { nxt_string("var + a"),
-      nxt_string("SyntaxError: Unexpected token \"+\" in 1") },
-
-    { nxt_string("//\r\n; var + a"),
-      nxt_string("SyntaxError: Unexpected token \"+\" in 2") },
-
-    { nxt_string("/*\n*/; var + a"),
-      nxt_string("SyntaxError: Unexpected token \"+\" in 2") },
-
-    { nxt_string("var \n a \n = 1; a"),
-      nxt_string("1") },
-
-    { nxt_string("var \n a, \n b; b"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = 1; var b; a"),
-      nxt_string("1") },
-
-    { nxt_string("a = 1;for(;a;a--)var a; a"),
-      nxt_string("0") },
-
-    { nxt_string("if(1)if(0){0?0:0}else\nvar a\nelse\nvar b"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = 1; var a; a"),
-      nxt_string("1") },
-
-    { nxt_string("(function (x) {if (x) { var a = 3; return a} else { var a = 4; return a}})(1)"),
-      nxt_string("3") },
-
-    { nxt_string("(function (x) {if (x) { var a = 3; return a} else { var a = 4; return a}})(0)"),
-      nxt_string("4") },
-
-    { nxt_string("function f(){return 2}; var f; f()"),
-      nxt_string("2") },
-
-    { nxt_string("function f(){return 2}; var f = 1; f()"),
-      nxt_string("TypeError: number is not a function") },
-
-    { nxt_string("function f(){return 1}; function f(){return 2}; f()"),
-      nxt_string("2") },
-
-    { nxt_string("var f = 1; function f() {}; f"),
-      nxt_string("1") },
-
-#if 0 /* TODO */
-    { nxt_string("var a; Object.getOwnPropertyDescriptor(this, 'a').value"),
-      nxt_string("undefined") },
-
-    { nxt_string("this.a = 1; a"),
-      nxt_string("1") },
-#endif
-
-    { nxt_string("f() = 1"),
-      nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
-
-    { nxt_string("f.a() = 1"),
-      nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
-
-    { nxt_string("++f()"),
-      nxt_string("ReferenceError: Invalid left-hand side in prefix operation in 1") },
-
-    { nxt_string("f()++"),
-      nxt_string("ReferenceError: Invalid left-hand side in postfix operation in 1") },
-
-    /* Numbers. */
-
-    { nxt_string("0"),
-      nxt_string("0") },
-
-    { nxt_string("-0"),
-      nxt_string("-0") },
-
-    { nxt_string(".0"),
-      nxt_string("0") },
-
-    { nxt_string("0.1"),
-      nxt_string("0.1") },
-
-    { nxt_string(".9"),
-      nxt_string("0.9") },
-
-    { nxt_string("-.01"),
-      nxt_string("-0.01") },
-
-    { nxt_string("0.000001"),
-      nxt_string("0.000001") },
-
-    { nxt_string("0.00000123456"),
-      nxt_string("0.00000123456") },
-
-    { nxt_string("0.0000001"),
-      nxt_string("1e-7") },
-
-    { nxt_string("1.1000000"),
-      nxt_string("1.1") },
-
-    { nxt_string("99999999999999999999"),
-      nxt_string("100000000000000000000") },
-
-    { nxt_string("99999999999999999999.111"),
-      nxt_string("100000000000000000000") },
-
-    { nxt_string("999999999999999999999"),
-      nxt_string("1e+21") },
-
-    { nxt_string("9223372036854775808"),
-      nxt_string("9223372036854776000") },
-
-    { nxt_string("18446744073709551616"),
-      nxt_string("18446744073709552000") },
-
-    { nxt_string("1.7976931348623157E+308"),
-      nxt_string("1.7976931348623157e+308") },
-
-    { nxt_string("+1"),
-      nxt_string("1") },
-
-    { nxt_string("+1\n"),
-      nxt_string("1") },
-
-    { nxt_string("."),
-      nxt_string("SyntaxError: Unexpected token \".\" in 1") },
-
-    /* Octal Numbers. */
-
-    { nxt_string("0o0"),
-      nxt_string("0") },
-
-    { nxt_string("0O10"),
-      nxt_string("8") },
-
-    { nxt_string("0o011"),
-      nxt_string("9") },
-
-    { nxt_string("-0O777"),
-      nxt_string("-511") },
-
-    { nxt_string("0o"),
-      nxt_string("SyntaxError: Unexpected token \"0o\" in 1") },
-
-    { nxt_string("0O778"),
-      nxt_string("SyntaxError: Unexpected token \"0O778\" in 1") },
-
-    /* Legacy Octal Numbers are deprecated. */
-
-    { nxt_string("00"),
-      nxt_string("SyntaxError: Unexpected token \"00\" in 1") },
-
-    { nxt_string("08"),
-      nxt_string("SyntaxError: Unexpected token \"08\" in 1") },
-
-    { nxt_string("09"),
-      nxt_string("SyntaxError: Unexpected token \"09\" in 1") },
-
-    { nxt_string("0011"),
-      nxt_string("SyntaxError: Unexpected token \"00\" in 1") },
-
-    /* Binary Numbers. */
-
-    { nxt_string("0b0"),
-      nxt_string("0") },
-
-    { nxt_string("0B10"),
-      nxt_string("2") },
-
-    { nxt_string("0b0101"),
-      nxt_string("5") },
-
-    { nxt_string("-0B11111111"),
-      nxt_string("-255") },
-
-    { nxt_string("0b"),
-      nxt_string("SyntaxError: Unexpected token \"0b\" in 1") },
-
-    { nxt_string("0B12"),
-      nxt_string("SyntaxError: Unexpected token \"0B12\" in 1") },
-
-    /* Hex Numbers. */
-
-    { nxt_string("0x0"),
-      nxt_string("0") },
-
-    { nxt_string("-0x1"),
-      nxt_string("-1") },
-
-    { nxt_string("0xffFF"),
-      nxt_string("65535") },
-
-    { nxt_string("0X0000BEEF"),
-      nxt_string("48879") },
-
-    { nxt_string("0x"),
-      nxt_string("SyntaxError: Unexpected token \"0x\" in 1") },
-
-    { nxt_string("0xffff."),
-      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
-
-    { nxt_string("0x12g"),
-      nxt_string("SyntaxError: Unexpected token \"g\" in 1") },
-
-    { nxt_string(""),
-      nxt_string("undefined") },
-
-    { nxt_string("\n"),
-      nxt_string("undefined") },
-
-    { nxt_string(";"),
-      nxt_string("undefined") },
-
-    { nxt_string("\n +1"),
-      nxt_string("1") },
-
-    /* Scientific notation. */
-
-    { nxt_string("0e0"),
-      nxt_string("0") },
-
-    { nxt_string("0.0e0"),
-      nxt_string("0") },
-
-    { nxt_string("1e0"),
-      nxt_string("1") },
-
-    { nxt_string("1e1"),
-      nxt_string("10") },
-
-    { nxt_string("1.e01"),
-      nxt_string("10") },
-
-    { nxt_string("5.7e1"),
-      nxt_string("57") },
-
-    { nxt_string("5.7e-1"),
-      nxt_string("0.57") },
-
-    { nxt_string("-5.7e-1"),
-      nxt_string("-0.57") },
-
-    { nxt_string("1.1e-01"),
-      nxt_string("0.11") },
-
-    { nxt_string("5.7e-2"),
-      nxt_string("0.057") },
-
-    { nxt_string("1.1e+01"),
-      nxt_string("11") },
-
-    { nxt_string("-.01e-01"),
-      nxt_string("-0.001") },
-
-    { nxt_string("1e9"),
-      nxt_string("1000000000") },
-
-    { nxt_string("1.0e308"),
-      nxt_string("1e+308") },
-
-    { nxt_string("0e309"),
-      nxt_string("0") },
-
-    { nxt_string("0e-309"),
-      nxt_string("0") },
-
-    { nxt_string("1e309"),
-      nxt_string("Infinity") },
-
-    { nxt_string("-1e309"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("1e"),
-      nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
-
-    { nxt_string("1.e"),
-      nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
-
-    { nxt_string("1e+"),
-      nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
-
-    { nxt_string("1.e-"),
-      nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
-
-    { nxt_string("1eZ"),
-      nxt_string("SyntaxError: Unexpected token \"eZ\" in 1") },
-
-    { nxt_string(".e1"),
-      nxt_string("SyntaxError: Unexpected token \".\" in 1") },
-
-    { nxt_string("Number.prototype.X = function(){return 123;};"
-                 "(1).X()"),
-      nxt_string("123") },
-
-    /* Indexes. */
-
-    { nxt_string("var a = []; a[-1] = 2; a[-1] == a['-1']"),
-      nxt_string("true") },
-
-    { nxt_string("var a = []; a[Infinity] = 2; a[Infinity] == a['Infinity']"),
-      nxt_string("true") },
-
-    { nxt_string("var a = []; a[NaN] = 2; a[NaN] == a['NaN']"),
-      nxt_string("true") },
-
-    /* Number.toString(radix) method. */
-
-    { nxt_string("0..toString(2)"),
-      nxt_string("0") },
-
-    { nxt_string("240..toString(2)"),
-      nxt_string("11110000") },
-
-    { nxt_string("Math.pow(-2, 1023).toString(2).length"),
-      nxt_string("1025") },
-
-    { nxt_string("8.0625.toString(2)"),
-      nxt_string("1000.0001") },
-
-    { nxt_string("(1/3).toString(2)"),
-      nxt_string("0.010101010101010101010101010101010101010101010101010101") },
-
-    { nxt_string("9999..toString(3)"),
-      nxt_string("111201100") },
-
-    { nxt_string("-9999..toString(3)"),
-      nxt_string("-111201100") },
-
-    { nxt_string("81985529216486895..toString(16)"),
-      nxt_string("123456789abcdf0") },
-
-    { nxt_string("0xffff.toString(16)"),
-      nxt_string("ffff") },
-
-    { nxt_string("30520..toString(36)"),
-      nxt_string("njs") },
-
-    { nxt_string("Infinity.toString()"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Infinity.toString(2)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Infinity.toString(10)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Infinity.toString(NaN)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("Infinity.toString({})"),
-      nxt_string("RangeError") },
-
-    { nxt_string("Infinity.toString(Infinity)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("NaN.toString()"),
-      nxt_string("NaN") },
-
-    { nxt_string("NaN.toString(2)"),
-      nxt_string("NaN") },
-
-    { nxt_string("NaN.toString(10)"),
-      nxt_string("NaN") },
-
-    { nxt_string("NaN.toString(Infinity)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("NaN.toString({})"),
-      nxt_string("RangeError") },
-
-    { nxt_string("NaN.toString(NaN)"),
-      nxt_string("RangeError") },
-
-    /* An object "valueOf/toString" methods. */
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };    +a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } };  +a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: 2,"
-                 "          toString: function() { return '1' } }; +a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } }; ''+a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return [] },"
-                 "          toString: function() { return '1' } }; +a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { toString: function() { return 'a' } };"
-                 "var b = { toString: function() { return a+'b' } }; '0'+b"),
-      nxt_string("0ab") },
-
-    { nxt_string("({valueOf:()=>'4'}) / ({valueOf:()=>2})"),
-      nxt_string("2") },
-
-    { nxt_string("({valueOf:()=>{throw 'x'}}) / ({valueOf:()=>{throw 'y'}});"
-                 "var e; try { x/y } catch(ex) {e = ex}; ex"),
-      nxt_string("x") },
-
-    { nxt_string("({valueOf:()=>{ try {throw 'x'} catch (ex) {return 6} } }) / 2"),
-      nxt_string("3") },
-
-    { nxt_string("({valueOf:()=>2}) / ({valueOf:()=>{throw 'y'}});"
-                 "var e; try { x/y } catch(ex) {e = ex}; ex"),
-      nxt_string("y") },
-
-    { nxt_string("({valueOf:()=>'4'}) % ({valueOf:()=>3})"),
-      nxt_string("1") },
-
-    { nxt_string("({valueOf:()=>9}) >>> ({valueOf:()=>2})"),
-      nxt_string("2") },
-
-    { nxt_string("({valueOf:()=>0x1f}) & ({valueOf:()=>0xf})"),
-      nxt_string("15") },
-
-    { nxt_string("({valueOf:()=>0x1f}) ^ ({valueOf:()=>0xf})"),
-      nxt_string("16") },
-
-    { nxt_string("({valueOf:()=>0xf}) == ({valueOf:()=>0xf})"),
-      nxt_string("false") },
-
-    { nxt_string("var e; try {({valueOf: String.prototype.valueOf}) == 1} "
-                 "catch (ex) { e = ex}; e"),
-      nxt_string("TypeError: unexpected value type:object") },
-
-    { nxt_string("({valueOf:()=>0xf}) == 0xf"),
-      nxt_string("true") },
-
-    { nxt_string("0xf == ({valueOf:()=>0xf})"),
-      nxt_string("true") },
-
-    { nxt_string("({valueOf:()=>'0xf'}) == 0xf"),
-      nxt_string("true") },
-
-    { nxt_string("0xf == ({valueOf:()=>'0xf'})"),
-      nxt_string("true") },
-
-    { nxt_string("({valueOf:()=>0xf}) == '0xf'"),
-      nxt_string("true") },
-
-    { nxt_string("'0xf' == ({valueOf:()=>0xf})"),
-      nxt_string("true") },
-    /**/
-
-    { nxt_string("1 + undefined"),
-      nxt_string("NaN") },
-
-    { nxt_string("1 + ''"),
-      nxt_string("1") },
-
-    { nxt_string("0xA + ''"),
-      nxt_string("10") },
-
-    { nxt_string("undefined + undefined"),
-      nxt_string("NaN") },
-
-    { nxt_string("1.2 + 5.7"),
-      nxt_string("6.9") },
-
-    { nxt_string("0xf + 1"),
-      nxt_string("16") },
-
-    { nxt_string("1 + 1 + '2' + 1 + 1"),
-      nxt_string("2211") },
-
-    { nxt_string("'gg' + -0"),
-      nxt_string("gg0") },
-
-    { nxt_string("1.2 - '5.7'"),
-      nxt_string("-4.5") },
-
-    { nxt_string("1.2 + -'5.7'"),
-      nxt_string("-4.5") },
-
-    { nxt_string("1.2 - '-5.7'"),
-      nxt_string("6.9") },
-
-    { nxt_string("5 - ' \t 12  \t'"),
-      nxt_string("-7") },
-
-    { nxt_string("5 - '12zz'"),
-      nxt_string("NaN") },
-
-    { nxt_string("5 - '0x2'"),
-      nxt_string("3") },
-
-    { nxt_string("5 - '-0x2'"),
-      nxt_string("7") },
-
-    { nxt_string("5 - '\t 0x2 \t'"),
-      nxt_string("3") },
-
-    { nxt_string("5 - '0x2 z'"),
-      nxt_string("NaN") },
-
-    { nxt_string("12 - '5.7e1'"),
-      nxt_string("-45") },
-
-    { nxt_string("12 - '5.e1'"),
-      nxt_string("-38") },
-
-    { nxt_string("12 - '5.7e+01'"),
-      nxt_string("-45") },
-
-    { nxt_string("12 - '5.7e-01'"),
-      nxt_string("11.43") },
-
-    { nxt_string("12 - ' 5.7e1 '"),
-      nxt_string("-45") },
-
-    { nxt_string("12 - '5.7e'"),
-      nxt_string("NaN") },
-
-    { nxt_string("12 - '5.7e+'"),
-      nxt_string("NaN") },
-
-    { nxt_string("12 - '5.7e-'"),
-      nxt_string("NaN") },
-
-    { nxt_string("12 - ' 5.7e1 z'"),
-      nxt_string("NaN") },
-
-    { nxt_string("5 - '0x'"),
-      nxt_string("NaN") },
-
-    { nxt_string("1 + +'3'"),
-      nxt_string("4") },
-
-    { nxt_string("1 - undefined"),
-      nxt_string("NaN") },
-
-    { nxt_string("1 - ''"),
-      nxt_string("1") },
-
-    { nxt_string("undefined - undefined"),
-      nxt_string("NaN") },
-
-    /* String.toString() method. */
-
-    { nxt_string("'A'.toString()"),
-      nxt_string("A") },
-
-    { nxt_string("'A'.toString('hex')"),
-      nxt_string("TypeError: argument must be a byte string") },
-
-    { nxt_string("'A'.toBytes().toString('latin1')"),
-      nxt_string("TypeError: Unknown encoding: \"latin1\"") },
-
-    { nxt_string("'ABCD'.toBytes().toString('hex')"),
-      nxt_string("41424344") },
-
-    { nxt_string("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('hex')"),
-      nxt_string("00aabbff") },
-
-    { nxt_string("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('base64')"),
-      nxt_string("AKq7/w==") },
-
-    { nxt_string("'ABCD'.toBytes().toString('base64')"),
-      nxt_string("QUJDRA==") },
-
-    { nxt_string("'ABC'.toBytes().toString('base64')"),
-      nxt_string("QUJD") },
-
-    { nxt_string("'AB'.toBytes().toString('base64')"),
-      nxt_string("QUI=") },
-
-    { nxt_string("'A'.toBytes().toString('base64')"),
-      nxt_string("QQ==") },
-
-    { nxt_string("''.toBytes().toString('base64')"),
-      nxt_string("") },
-
-    { nxt_string("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('base64url')"),
-      nxt_string("AKq7_w") },
-
-    { nxt_string("'ABCD'.toBytes().toString('base64url')"),
-      nxt_string("QUJDRA") },
-
-    { nxt_string("'ABC'.toBytes().toString('base64url')"),
-      nxt_string("QUJD") },
-
-    { nxt_string("'AB'.toBytes().toString('base64url')"),
-      nxt_string("QUI") },
-
-    { nxt_string("'A'.toBytes().toString('base64url')"),
-      nxt_string("QQ") },
-
-    { nxt_string("''.toBytes().toString('base64url')"),
-      nxt_string("") },
-
-    /* Assignment. */
-
-    { nxt_string("var a, b = (a = [2]) * (3 * 4); a +' '+ b"),
-      nxt_string("2 24") },
-
-    { nxt_string("var a = 1; var b = a += 1; b"),
-      nxt_string("2") },
-
-    { nxt_string("var a = 1; var b = a -= 1; b"),
-      nxt_string("0") },
-
-    { nxt_string("var a = 1; var b = a <<= 1; b"),
-      nxt_string("2") },
-
-    /* 3 address operation and side effect. */
-
-    { nxt_string("var a = 1; function f(x) { a = x; return 2 }; a+f(5)+' '+a"),
-      nxt_string("3 5") },
-
-    { nxt_string("var a = 1; function f(x) { a = x; return 2 }; a += f(5)"),
-      nxt_string("3") },
-
-    { nxt_string("var x; x in (x = 1, [1, 2, 3])"),
-      nxt_string("false") },
-
-    /* Exponentiation. */
-
-    { nxt_string("2 ** 3 ** 2"),
-      nxt_string("512") },
-
-    { nxt_string("2 ** (3 ** 2)"),
-      nxt_string("512") },
-
-    { nxt_string("(2 ** 3) ** 2"),
-      nxt_string("64") },
-
-    { nxt_string("3 ** 2 - 9"),
-      nxt_string("0") },
-
-    { nxt_string("-9 + 3 ** 2"),
-      nxt_string("0") },
-
-    { nxt_string("-3 ** 2"),
-      nxt_string("SyntaxError: Either left-hand side or entire exponentiation "
-                 "must be parenthesized in 1") },
-
-    { nxt_string("-(3) ** 2"),
-      nxt_string("SyntaxError: Either left-hand side or entire exponentiation "
-                 "must be parenthesized in 1") },
-
-    { nxt_string("-(3 ** 2)"),
-      nxt_string("-9") },
-
-    { nxt_string("(-3) ** 2"),
-      nxt_string("9") },
-
-    { nxt_string("1 ** NaN"),
-      nxt_string("NaN") },
-
-    { nxt_string("'a' ** -0"),
-      nxt_string("1") },
-
-    { nxt_string("1.1 ** Infinity"),
-      nxt_string("Infinity") },
-
-    { nxt_string("(-1.1) ** -Infinity"),
-      nxt_string("0") },
-
-    { nxt_string("(-1) ** Infinity"),
-      nxt_string("NaN") },
-
-    { nxt_string("1 ** -Infinity"),
-      nxt_string("NaN") },
-
-    { nxt_string("(-0.9) ** Infinity"),
-      nxt_string("0") },
-
-    { nxt_string("0.9 ** -Infinity"),
-      nxt_string("Infinity") },
-
-    { nxt_string("'Infinity' ** 0.1"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Infinity ** '-0.1'"),
-      nxt_string("0") },
-
-    { nxt_string("(-Infinity) ** 3"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("'-Infinity' ** '3.1'"),
-      nxt_string("Infinity") },
-
-    { nxt_string("(-Infinity) ** '-3'"),
-      nxt_string("-0") },
-
-    { nxt_string("'-Infinity' ** -2"),
-      nxt_string("0") },
-
-    { nxt_string("'0' ** 0.1"),
-      nxt_string("0") },
-
-#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
-    { nxt_string("0 ** '-0.1'"),
-      nxt_string("Infinity") },
-#endif
-
-    { nxt_string("(-0) ** 3"),
-      nxt_string("-0") },
-
-    { nxt_string("'-0' ** '3.1'"),
-      nxt_string("0") },
-
-    { nxt_string("(-0) ** '-3'"),
-      nxt_string("-Infinity") },
-
-#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
-    { nxt_string("'-0' ** -2"),
-      nxt_string("Infinity") },
-#endif
-
-    { nxt_string("(-3) ** 0.1"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = 0.1; a **= -2"),
-      nxt_string("99.99999999999999") },
-
-    { nxt_string("var a = 1; a **= NaN"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = 'a'; a **= -0"),
-      nxt_string("1") },
-
-    { nxt_string("var a = 1.1; a **= Infinity"),
-      nxt_string("Infinity") },
-
-    { nxt_string("var a = -1.1; a **= -Infinity"),
-      nxt_string("0") },
-
-    { nxt_string("var a = -1; a **= Infinity"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = 1; a **= -Infinity"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = -0.9; a **= Infinity"),
-      nxt_string("0") },
-
-    { nxt_string("var a = 0.9; a **= -Infinity"),
-      nxt_string("Infinity") },
-
-    { nxt_string("var a = 'Infinity'; a **= 0.1"),
-      nxt_string("Infinity") },
-
-    { nxt_string("var a = Infinity; a **= '-0.1'"),
-      nxt_string("0") },
-
-    { nxt_string("var a = -Infinity; a **= 3"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("var a = '-Infinity'; a **= '3.1'"),
-      nxt_string("Infinity") },
-
-    { nxt_string("var a = -Infinity; a **= '-3'"),
-      nxt_string("-0") },
-
-    { nxt_string("var a = '-Infinity'; a **= -2"),
-      nxt_string("0") },
-
-    { nxt_string("var a = '0'; a **= 0.1"),
-      nxt_string("0") },
-
-#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
-    { nxt_string("var a = 0; a **= '-0.1'"),
-      nxt_string("Infinity") },
-#endif
-
-    { nxt_string("var a = -0; a **= 3"),
-      nxt_string("-0") },
-
-    { nxt_string("var a = '-0'; a **= '3.1'"),
-      nxt_string("0") },
-
-    { nxt_string("var a = -0; a **= '-3'"),
-      nxt_string("-Infinity") },
-
-#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
-    { nxt_string("var a = '-0'; a **= -2"),
-      nxt_string("Infinity") },
-#endif
-
-    { nxt_string("var a = -3; a **= 0.1"),
-      nxt_string("NaN") },
-
-    /**/
-
-    { nxt_string("12 | 6"),
-      nxt_string("14") },
-
-    { nxt_string("12 | 'abc'"),
-      nxt_string("12") },
-
-    { nxt_string("-1 | 0"),
-      nxt_string("-1") },
-
-    { nxt_string("-2147483648 | 0"),
-      nxt_string("-2147483648") },
-
-    { nxt_string("1024.9 | 0"),
-      nxt_string("1024") },
-
-    { nxt_string("-1024.9 | 0"),
-      nxt_string("-1024") },
-
-    { nxt_string("9007199254740991 | 0"),
-      nxt_string("-1") },
-
-    { nxt_string("9007199254740992 | 0"),
-      nxt_string("0") },
-
-    { nxt_string("9007199254740993 | 0"),
-      nxt_string("0") },
-
-#if 0
-    { nxt_string("9223372036854775808 | 0"),
-      nxt_string("0") },
-#endif
-
-    { nxt_string("9223372036854777856 | 0"),
-      nxt_string("2048") },
-
-    { nxt_string("-9223372036854777856 | 0"),
-      nxt_string("-2048") },
-
-    { nxt_string("NaN | 0"),
-      nxt_string("0") },
-
-    { nxt_string("-NaN | 0"),
-      nxt_string("0") },
-
-    { nxt_string("Infinity | 0"),
-      nxt_string("0") },
-
-    { nxt_string("-Infinity | 0"),
-      nxt_string("0") },
-
-    { nxt_string("+0 | 0"),
-      nxt_string("0") },
-
-    { nxt_string("-0 | 0"),
-      nxt_string("0") },
-
-    { nxt_string("32.5 << 2.4"),
-      nxt_string("128") },
-
-    { nxt_string("32.5 << 'abc'"),
-      nxt_string("32") },
-
-    { nxt_string("'abc' << 2"),
-      nxt_string("0") },
-
-    { nxt_string("-1 << 0"),
-      nxt_string("-1") },
-
-    { nxt_string("-1 << -1"),
-      nxt_string("-2147483648") },
-
-    { nxt_string("-2147483648 << 0"),
-      nxt_string("-2147483648") },
-
-#if 0
-    { nxt_string("9223372036854775808 << 0"),
-      nxt_string("0") },
-#endif
-
-    { nxt_string("9223372036854777856 << 0"),
-      nxt_string("2048") },
-
-    { nxt_string("-9223372036854777856 << 0"),
-      nxt_string("-2048") },
-
-    { nxt_string("NaN << 0"),
-      nxt_string("0") },
-
-    { nxt_string("32.5 >> 2.4"),
-      nxt_string("8") },
-
-    { nxt_string("-1 >> 30"),
-      nxt_string("-1") },
-
-    { nxt_string("'abc' >> 2"),
-      nxt_string("0") },
-
-    { nxt_string("-1 >> 0"),
-      nxt_string("-1") },
-
-    { nxt_string("-1 >> -1"),
-      nxt_string("-1") },
-
-    { nxt_string("-2147483648 >> 0"),
-      nxt_string("-2147483648") },
-
-    { nxt_string("-2147483648 >> -1"),
-      nxt_string("-1") },
-
-#if 0
-    { nxt_string("9223372036854775808 >> 0"),
-      nxt_string("0") },
-#endif
-
-    { nxt_string("9223372036854777856 >> 0"),
-      nxt_string("2048") },
-
-    { nxt_string("-9223372036854777856 >> 0"),
-      nxt_string("-2048") },
-
-    { nxt_string("NaN >> 0"),
-      nxt_string("0") },
-
-    { nxt_string("-1 >>> 30"),
-      nxt_string("3") },
-
-    { nxt_string("NaN >>> 1"),
-      nxt_string("0") },
-
-#if 0
-    { nxt_string("9223372036854775808 >>> 1"),
-      nxt_string("0") },
-#endif
-
-    { nxt_string("-1 >>> 0"),
-      nxt_string("4294967295") },
-
-    { nxt_string("-1 >>> -1"),
-      nxt_string("1") },
-
-    { nxt_string("-2147483648 >>> 0"),
-      nxt_string("2147483648") },
-
-    { nxt_string("-2147483648 >>> -1"),
-      nxt_string("1") },
-
-#if 0
-    { nxt_string("9223372036854775808 >>> 0"),
-      nxt_string("0") },
-#endif
-
-    { nxt_string("9223372036854777856 >>> 0"),
-      nxt_string("2048") },
-
-    { nxt_string("-9223372036854777856 >>> 0"),
-      nxt_string("4294965248") },
-
-    { nxt_string("NaN >>> 0"),
-      nxt_string("0") },
-
-    { nxt_string("!2"),
-      nxt_string("false") },
-
-    /**/
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };   ~a"),
-      nxt_string("-2") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } }; ~a"),
-      nxt_string("-2") },
-
-    /**/
-
-    { nxt_string("1 || 2"),
-      nxt_string("1") },
-
-    { nxt_string("var a = 1; 1 || (a = 2); a"),
-      nxt_string("1") },
-
-    { nxt_string("var x; x = 0 || x; x"),
-      nxt_string("undefined") },
-
-    { nxt_string("var x; x = 1 && x; x"),
-      nxt_string("undefined") },
-
-    { nxt_string("1 || 2 || 3"),
-      nxt_string("1") },
-
-    { nxt_string("1 || (2 + 2) || 3"),
-      nxt_string("1") },
-
-    { nxt_string("1 && 2"),
-      nxt_string("2") },
-
-    { nxt_string("1 && 2 && 3"),
-      nxt_string("3") },
-
-    { nxt_string("var a = 1; 0 && (a = 2); a"),
-      nxt_string("1") },
-
-    { nxt_string("false && true || true"),
-      nxt_string("true") },
-
-    { nxt_string("false && (true || true)"),
-      nxt_string("false") },
-
-    { nxt_string("var a = true; a = -~!a"),
-      nxt_string("1") },
-
-    { nxt_string("12 & 6"),
-      nxt_string("4") },
-
-    { nxt_string("-1 & 65536"),
-      nxt_string("65536") },
-
-    { nxt_string("-2147483648 & 65536"),
-      nxt_string("0") },
-
-#if 0
-    { nxt_string("9223372036854775808 & 65536"),
-      nxt_string("0") },
-#endif
-
-    { nxt_string("NaN & 65536"),
-      nxt_string("0") },
-
-    { nxt_string("12 ^ 6"),
-      nxt_string("10") },
-
-    { nxt_string("-1 ^ 65536"),
-      nxt_string("-65537") },
-
-    { nxt_string("-2147483648 ^ 65536"),
-      nxt_string("-2147418112") },
-
-#if 0
-    { nxt_string("9223372036854775808 ^ 65536"),
-      nxt_string("65536") },
-#endif
-
-    { nxt_string("NaN ^ 65536"),
-      nxt_string("65536") },
-
-    { nxt_string("var x = '1'; +x + 2"),
-      nxt_string("3") },
-
-    /* Weird things. */
-
-    { nxt_string("'3' -+-+-+ '1' + '1' / '3' * '6' + '2'"),
-      nxt_string("42") },
-
-    { nxt_string("((+!![])+(+!![])+(+!![])+(+!![])+[])+((+!![])+(+!![])+[])"),
-      nxt_string("42") },
-
-    { nxt_string("1+[[]+[]]-[]+[[]-[]]-1"),
-      nxt_string("9") },
-
-    { nxt_string("[[]+[]]-[]+[[]-[]]"),
-      nxt_string("00") },
-
-    { nxt_string("!--[][1]"),
-      nxt_string("true") },
-
-    { nxt_string("[].concat[1,2,3]"),
-      nxt_string("undefined") },
-
-    /**/
-
-    { nxt_string("'true' == true"),
-      nxt_string("false") },
-
-    { nxt_string("null == false"),
-      nxt_string("false") },
-
-    { nxt_string("0 == null"),
-      nxt_string("false") },
-
-    { nxt_string("!null"),
-      nxt_string("true") },
-
-    { nxt_string("0 === -0"),
-      nxt_string("true") },
-
-    { nxt_string("1/-0"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("1/0 === 1/-0"),
-      nxt_string("false") },
-
-    { nxt_string("1 == true"),
-      nxt_string("true") },
-
-    { nxt_string("NaN === NaN"),
-      nxt_string("false") },
-
-    { nxt_string("NaN !== NaN"),
-      nxt_string("true") },
-
-    { nxt_string("NaN == NaN"),
-      nxt_string("false") },
-
-    { nxt_string("NaN != NaN"),
-      nxt_string("true") },
-
-    { nxt_string("NaN == false"),
-      nxt_string("false") },
-
-    { nxt_string("Infinity == Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("-Infinity == -Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("-Infinity < Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("Infinity - Infinity"),
-      nxt_string("NaN") },
-
-    { nxt_string("Infinity - -Infinity"),
-      nxt_string("Infinity") },
-
-    { nxt_string("undefined == 0"),
-      nxt_string("false") },
-
-    { nxt_string("undefined == null"),
-      nxt_string("true") },
-
-    { nxt_string("'1' == 1"),
-      nxt_string("true") },
-
-    { nxt_string("'1a' == '1'"),
-      nxt_string("false") },
-
-    { nxt_string("'abc' == 'abc'"),
-      nxt_string("true") },
-
-    { nxt_string("'abc' < 'abcde'"),
-      nxt_string("true") },
-
-    { nxt_string("0 == ''"),
-      nxt_string("true") },
-
-    { nxt_string("0 == ' '"),
-      nxt_string("true") },
-
-    { nxt_string("0 == '  '"),
-      nxt_string("true") },
-
-    { nxt_string("0 == '0'"),
-      nxt_string("true") },
-
-    { nxt_string("0 == ' 0 '"),
-      nxt_string("true") },
-
-    { nxt_string("0 == '000'"),
-      nxt_string("true") },
-
-    { nxt_string("'0' == ''"),
-      nxt_string("false") },
-
-    { nxt_string("1 < 2"),
-      nxt_string("true") },
-
-    { nxt_string("NaN < NaN"),
-      nxt_string("false") },
-
-    { nxt_string("NaN > NaN"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < 1"),
-      nxt_string("false") },
-
-    { nxt_string("[] == false"),
-      nxt_string("true") },
-
-    { nxt_string("[0] == false"),
-      nxt_string("true") },
-
-    { nxt_string("[0,0] == false"),
-      nxt_string("false") },
-
-    { nxt_string("({}) == false"),
-      nxt_string("false") },
-
-    { nxt_string("new Number(1) == new String('1')"),
-      nxt_string("false") },
-
-    { nxt_string("var a = Object; a == Object"),
-      nxt_string("true") },
-
-    { nxt_string("'1' == new Number(1)"),
-      nxt_string("true") },
-
-    { nxt_string("new String('abc') == 'abc'"),
-      nxt_string("true") },
-
-    { nxt_string("false == new String('0')"),
-      nxt_string("true") },
-
-    { nxt_string("var a = { valueOf: function() { return 5 } };   a == 5"),
-      nxt_string("true") },
-
-    { nxt_string("var a = { valueOf: function() { return '5' } }; a == 5"),
-      nxt_string("true") },
-
-    { nxt_string("var a = { valueOf: function() { return '5' } }; a == '5'"),
-      nxt_string("true") },
-
-    { nxt_string("var a = { valueOf: function() { return 5 } }; a == '5'"),
-      nxt_string("true") },
-
-    { nxt_string("var a = { toString: function() { return true } }; '1' == a"),
-      nxt_string("true") },
-
-    { nxt_string("var a = { valueOf: function() { return 'b' },"
-                 "          toString: function() { return 'a' } }; a == 'a'"),
-      nxt_string("false") },
-
-    /* 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") },
-
-    { nxt_string("null !== null"),
-      nxt_string("false") },
-
-    { nxt_string("null == null"),
-      nxt_string("true") },
-
-    { nxt_string("null != null"),
-      nxt_string("false") },
-
-    { nxt_string("null < null"),
-      nxt_string("false") },
-
-    { nxt_string("null > null"),
-      nxt_string("false") },
-
-    { nxt_string("null <= null"),
-      nxt_string("true") },
-
-    { nxt_string("null >= null"),
-      nxt_string("true") },
-
-    /**/
-
-    { nxt_string("null === undefined"),
-      nxt_string("false") },
-
-    { nxt_string("null !== undefined"),
-      nxt_string("true") },
-
-    { nxt_string("null == undefined"),
-      nxt_string("true") },
-
-    { nxt_string("null != undefined"),
-      nxt_string("false") },
-
-    { nxt_string("null < undefined"),
-      nxt_string("false") },
-
-    { nxt_string("null > undefined"),
-      nxt_string("false") },
-
-    { nxt_string("null <= undefined"),
-      nxt_string("false") },
-
-    { nxt_string("null >= undefined"),
-      nxt_string("false") },
-
-    /**/
-
-    { nxt_string("null === false"),
-      nxt_string("false") },
-
-    { nxt_string("null !== false"),
-      nxt_string("true") },
-
-    { nxt_string("null == false"),
-      nxt_string("false") },
-
-    { nxt_string("null != false"),
-      nxt_string("true") },
-
-    { nxt_string("null < false"),
-      nxt_string("false") },
-
-    { nxt_string("null > false"),
-      nxt_string("false") },
-
-    { nxt_string("null <= false"),
-      nxt_string("true") },
-
-    { nxt_string("null >= false"),
-      nxt_string("true") },
-
-    /**/
-
-    { nxt_string("null === true"),
-      nxt_string("false") },
-
-    { nxt_string("null !== true"),
-      nxt_string("true") },
-
-    { nxt_string("null == true"),
-      nxt_string("false") },
-
-    { nxt_string("null != true"),
-      nxt_string("true") },
-
-    { nxt_string("null < true"),
-      nxt_string("true") },
-
-    { nxt_string("null > true"),
-      nxt_string("false") },
-
-    { nxt_string("null <= true"),
-      nxt_string("true") },
-
-    { nxt_string("null >= true"),
-      nxt_string("false") },
-
-    /**/
-
-    { nxt_string("Infinity === Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("Infinity !== Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("Infinity == Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("Infinity != Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("Infinity < Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("Infinity > Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("Infinity <= Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("Infinity >= Infinity"),
-      nxt_string("true") },
-
-    /**/
-
-    { nxt_string("-Infinity === Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("-Infinity !== Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("-Infinity == Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("-Infinity != Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("-Infinity < Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("-Infinity > Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("-Infinity <= Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("-Infinity >= Infinity"),
-      nxt_string("false") },
-
-    /**/
-
-    { nxt_string("NaN === NaN"),
-      nxt_string("false") },
-
-    { nxt_string("NaN !== NaN"),
-      nxt_string("true") },
-
-    { nxt_string("NaN == NaN"),
-      nxt_string("false") },
-
-    { nxt_string("NaN != NaN"),
-      nxt_string("true") },
-
-    { nxt_string("NaN < NaN"),
-      nxt_string("false") },
-
-    { nxt_string("NaN > NaN"),
-      nxt_string("false") },
-
-    { nxt_string("NaN >= NaN"),
-      nxt_string("false") },
-
-    { nxt_string("NaN <= NaN"),
-      nxt_string("false") },
-
-    /**/
-
-    { nxt_string("null < 0"),
-      nxt_string("false") },
-
-    { nxt_string("null < 1"),
-      nxt_string("true") },
-
-    { nxt_string("null < NaN"),
-      nxt_string("false") },
-
-    { nxt_string("null < -Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("null < Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("null < 'null'"),
-      nxt_string("false") },
-
-    { nxt_string("null < '1'"),
-      nxt_string("true") },
-
-    { nxt_string("null < [1]"),
-      nxt_string("true") },
-
-    { nxt_string("null < ({})"),
-      nxt_string("false") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };     null < a"),
-      nxt_string("true") },
-
-    { nxt_string("var a = { valueOf: function() { return 'null' } };null < a"),
-      nxt_string("false") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } };   null < a"),
-      nxt_string("true") },
-
-    { nxt_string("1 < {valueOf: ()=>{throw 'x'}}"),
-      nxt_string("x") },
-
-    { nxt_string("({valueOf: ()=>{throw 'x'}}) <= ({valueOf:()=>{throw 'y'}})"),
-      nxt_string("x") },
-
-    { nxt_string("({valueOf:()=>{throw 'x'}}) > ({valueOf:()=>{throw 'y'}})"),
-      nxt_string("x") },
-
-    /**/
-
-    { nxt_string("undefined == undefined"),
-      nxt_string("true") },
-
-    { nxt_string("undefined != undefined"),
-      nxt_string("false") },
-
-    { nxt_string("undefined === undefined"),
-      nxt_string("true") },
-
-    { nxt_string("undefined !== undefined"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < undefined"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < null"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < false"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < true"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < 0"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < 1"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < NaN"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < -Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < 'undefined'"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < '1'"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < [1]"),
-      nxt_string("false") },
-
-    { nxt_string("undefined < ({})"),
-      nxt_string("false") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } }; undefined < a"),
-      nxt_string("false") },
-
-    { nxt_string("var a = { valueOf: function() { return 'undefined' } };"
-                 "undefined < a"),
-      nxt_string("false") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } };"
-                 "undefined < a"),
-      nxt_string("false") },
-
-    /**/
-
-    { nxt_string("false < 1"),
-      nxt_string("true") },
-
-    { nxt_string("true < 1"),
-      nxt_string("false") },
-
-    { nxt_string("-1 < 1"),
-      nxt_string("true") },
-
-    { nxt_string("-1 < '1'"),
-      nxt_string("true") },
-
-    { nxt_string("NaN < NaN"),
-      nxt_string("false") },
-
-    { nxt_string("-Infinity < Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("Infinity < -Infinity"),
-      nxt_string("false") },
-
-    { nxt_string("1 < 'abc'"),
-      nxt_string("false") },
-
-    /**/
-
-    { nxt_string("[] === []"),
-      nxt_string("false") },
-
-    { nxt_string("[] !== []"),
-      nxt_string("true") },
-
-    { nxt_string("[] == []"),
-      nxt_string("false") },
-
-    { nxt_string("[] != []"),
-      nxt_string("true") },
-
-    { nxt_string("[] < []"),
-      nxt_string("false") },
-
-    { nxt_string("[] > []"),
-      nxt_string("false") },
-
-    { nxt_string("[] >= []"),
-      nxt_string("true") },
-
-    { nxt_string("[] <= []"),
-      nxt_string("true") },
-
-    /**/
-
-    { nxt_string("({}) === ({})"),
-      nxt_string("false") },
-
-    { nxt_string("({}) !== ({})"),
-      nxt_string("true") },
-
-    { nxt_string("({}) == ({})"),
-      nxt_string("false") },
-
-    { nxt_string("({}) != ({})"),
-      nxt_string("true") },
-
-    { nxt_string("({}) > ({})"),
-      nxt_string("false") },
-
-    { nxt_string("({}) <= ({})"),
-      nxt_string("true") },
-
-    { nxt_string("({}) >= ({})"),
-      nxt_string("true") },
-
-    /**/
-
-    { nxt_string("[0] == ({})"),
-      nxt_string("false") },
-
-    { nxt_string("[0] != ({})"),
-      nxt_string("true") },
-
-    { nxt_string("[0] <= ({})"),
-      nxt_string("true") },
-
-    { nxt_string("[0] >= ({})"),
-      nxt_string("false") },
-
-    /**/
-    { nxt_string("new String('1') > new Number(1)"),
-      nxt_string("false") },
-
-    { nxt_string("new Boolean(true) > '1'"),
-      nxt_string("false") },
-
-    { nxt_string("'0' >= new Number(1)"),
-      nxt_string("false") },
-
-    { nxt_string("'1' >= new Number(1)"),
-      nxt_string("true") },
-
-    { nxt_string("new String('1') < new Number(1)"),
-      nxt_string("false") },
-
-    { nxt_string("new Boolean(true) < '1'"),
-      nxt_string("false") },
-
-    { nxt_string("new String('1') <= new Number(1)"),
-      nxt_string("true") },
-
-    { nxt_string("new Boolean(true) <= '1'"),
-      nxt_string("true") },
-
-    { nxt_string("'-1' < {valueOf: function() {return -2}}"),
-      nxt_string("false") },
-
-    { nxt_string("new 0[isNaN]"),
-      nxt_string("TypeError: (intermediate value)[\"[object Function]\"] is not a function") },
-
-    { nxt_string("new 0[undefined]"),
-      nxt_string("TypeError: (intermediate value)[\"undefined\"] is not a function") },
-
-    /**/
-
-    { nxt_string("var a; a = 1 ? 2 : 3"),
-      nxt_string("2") },
-
-    { nxt_string("var a; a = 1 ? 2 : 3 ? 4 : 5"),
-      nxt_string("2") },
-
-    { nxt_string("var a; a = 0 ? 2 : 3 ? 4 : 5"),
-      nxt_string("4") },
-
-    { nxt_string("0 ? 2 ? 3 : 4 : 5"),
-      nxt_string("5") },
-
-    { nxt_string("1 ? 2 ? 3 : 4 : 5"),
-      nxt_string("3") },
-
-    { nxt_string("1 ? 0 ? 3 : 4 : 5"),
-      nxt_string("4") },
-
-    { nxt_string("(1 ? 0 : 3) ? 4 : 5"),
-      nxt_string("5") },
-
-    { nxt_string("var a; a = (1 + 2) ? 2 ? 3 + 4 : 5 : 6"),
-      nxt_string("7") },
-
-    { nxt_string("var a; a = (1 ? 2 : 3) + 4"),
-      nxt_string("6") },
-
-    { nxt_string("var a, b; a = 1 ? b = 2 + 4 : b = 3"),
-      nxt_string("6") },
-
-    { nxt_string("var a; a = 1 ? [1,2] : []"),
-      nxt_string("1,2") },
-
-    /**/
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };   +a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } }; +a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };   -a"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } }; -a"),
-      nxt_string("-1") },
-
-    /* Increment. */
-
-    { nxt_string("var a = 1;   ++a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = '1'; ++a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = [1]; ++a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = {};  ++a"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = [1,2,3]; var b = 1; b = ++a[b]; b + ' '+ a"),
-      nxt_string("3 1,3,3") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };"
-                 "++a +' '+ a +' '+ typeof a"),
-      nxt_string("2 2 number") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } };"
-                 "++a +' '+ a +' '+ typeof a"),
-      nxt_string("2 2 number") },
-
-    { nxt_string("var a = { valueOf: function() { return [1] } };"
-                 "++a +' '+ a +' '+ typeof a"),
-      nxt_string("NaN NaN number") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } };"
-                 "++a +' '+ a +' '+ typeof a"),
-      nxt_string("NaN NaN number") },
-
-    /**/
-
-    { nxt_string("var a = 1;   a = ++a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = '1'; a = ++a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = [1]; a = ++a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = {};  a = ++a"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };   a = ++a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } }; a = ++a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = { valueOf: function() { return [1] } }; a = ++a"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } };  a = ++a"),
-      nxt_string("NaN") },
-
-    /**/
-
-    { nxt_string("var a = 1;   var b = ++a; a +' '+ b"),
-      nxt_string("2 2") },
-
-    { nxt_string("var a = '1'; var b = ++a; a +' '+ b"),
-      nxt_string("2 2") },
-
-    { nxt_string("var a = [1]; var b = ++a; a +' '+ b"),
-      nxt_string("2 2") },
-
-    { nxt_string("var a = {};  var b = ++a; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };"
-                 "var b = ++a; a +' '+ b"),
-      nxt_string("2 2") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } };"
-                 "var b = ++a; a +' '+ b"),
-      nxt_string("2 2") },
-
-    { nxt_string("var a = { valueOf: function() { return [1] } };"
-                 "var b = ++a; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } };"
-                 "var b = ++a; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    /* Post increment. */
-
-    { nxt_string("var a = 1;   a++"),
-      nxt_string("1") },
-
-    { nxt_string("var a = '1'; a++"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1]; a++"),
-      nxt_string("1") },
-
-    { nxt_string("var a = {};  a++"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };   a++"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } }; a++"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return [1] } }; a++"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } };  a++"),
-      nxt_string("NaN") },
-
-    /**/
-
-    { nxt_string("var a = 1;   a = a++"),
-      nxt_string("1") },
-
-    { nxt_string("var a = '1'; a = a++"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1]; a = a++"),
-      nxt_string("1") },
-
-    { nxt_string("var a = {};  a = a++"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };   a = a++"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } }; a = a++"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return [1] } }; a = a++"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } };  a = a++"),
-      nxt_string("NaN") },
-
-    /**/
-
-    { nxt_string("var a = 1;   var b = a++; a +' '+ b"),
-      nxt_string("2 1") },
-
-    { nxt_string("var a = '1'; var b = a++; a +' '+ b"),
-      nxt_string("2 1") },
-
-    { nxt_string("var a = [1]; var b = a++; a +' '+ b"),
-      nxt_string("2 1") },
-
-    { nxt_string("var a = {};  var b = a++; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };"
-                 "var b = a++; a +' '+ b"),
-      nxt_string("2 1") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } };"
-                 "var b = a++; a +' '+ b"),
-      nxt_string("2 1") },
-
-    { nxt_string("var a = { valueOf: function() { return [1] } };"
-                 "var b = a++; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } };"
-                 "var b = a++; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    /* Decrement. */
-
-    { nxt_string("var a = 1;   --a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = '1'; --a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = [1]; --a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = {};  --a"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1} };   --a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = { valueOf: function() { return '1'} }; --a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = { valueOf: function() { return [1]} }; --a"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } }; --a"),
-      nxt_string("NaN") },
-
-    /**/
-
-    { nxt_string("var a = 1;   a = --a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = '1'; a = --a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = [1]; a = --a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = {};  a = --a"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1} };   a = --a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = { valueOf: function() { return '1'} }; a = --a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = { valueOf: function() { return [1]} }; a = --a"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } }; a = --a"),
-      nxt_string("NaN") },
-
-    /**/
-
-    { nxt_string("var a = 1;   var b = --a; a +' '+ b"),
-      nxt_string("0 0") },
-
-    { nxt_string("var a = '1'; var b = --a; a +' '+ b"),
-      nxt_string("0 0") },
-
-    { nxt_string("var a = [1]; var b = --a; a +' '+ b"),
-      nxt_string("0 0") },
-
-    { nxt_string("var a = {};  var b = --a; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };"
-                 "var b = --a; a +' '+ b"),
-      nxt_string("0 0") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } };"
-                 "var b = --a; a +' '+ b"),
-      nxt_string("0 0") },
-
-    { nxt_string("var a = { valueOf: function() { return [1] } };"
-                 "var b = --a; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } };"
-                 "var b = --a; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    /* Post decrement. */
-
-    { nxt_string("var a = 1;   a--"),
-      nxt_string("1") },
-
-    { nxt_string("var a = '1'; a--"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1]; a--"),
-      nxt_string("1") },
-
-    { nxt_string("var a = {};  a--"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };   a--"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } }; a--"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return [1] } }; a--"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } };  a--"),
-      nxt_string("NaN") },
-
-    /**/
-
-    { nxt_string("var a = 1;   a = a--"),
-      nxt_string("1") },
-
-    { nxt_string("var a = '1'; a = a--"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1]; a = a--"),
-      nxt_string("1") },
-
-    { nxt_string("var a = {};  a = a--"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };   a = a--"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } }; a = a--"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return [1] } }; a = a--"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } };  a = a--"),
-      nxt_string("NaN") },
-
-    /**/
-
-    { nxt_string("var a = 1;   var b = a--; a +' '+ b"),
-      nxt_string("0 1") },
-
-    { nxt_string("var a = '1'; var b = a--; a +' '+ b"),
-      nxt_string("0 1") },
-
-    { nxt_string("var a = [1]; var b = a--; a +' '+ b"),
-      nxt_string("0 1") },
-
-    { nxt_string("var a = {};  var b = a--; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };"
-                 "var b = a--; a +' '+ b"),
-      nxt_string("0 1") },
-
-    { nxt_string("var a = { valueOf: function() { return '1' } };"
-                 "var b = a--; a +' '+ b"),
-      nxt_string("0 1") },
-
-    { nxt_string("var a = { valueOf: function() { return [1] } };"
-                 "var b = a--; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    { nxt_string("var a = { valueOf: function() { return {} } };"
-                 "var b = a--; a +' '+ b"),
-      nxt_string("NaN NaN") },
-
-    /**/
-
-    { nxt_string("var a, b; a = 2; b = ++a + ++a; a + ' ' + b"),
-      nxt_string("4 7") },
-
-    { nxt_string("var a, b; a = 2; b = a++ + a++; a + ' ' + b"),
-      nxt_string("4 5") },
-
-    { nxt_string("var a, b; a = b = 7; a +' '+ b"),
-      nxt_string("7 7") },
-
-    { nxt_string("var a, b, c; a = b = c = 5; a +' '+ b +' '+ c"),
-      nxt_string("5 5 5") },
-
-    { nxt_string("var a, b, c; a = b = (c = 5) + 2; a +' '+ b +' '+ c"),
-      nxt_string("7 7 5") },
-
-    { nxt_string("1, 2 + 5, 3"),
-      nxt_string("3") },
-
-    { nxt_string("var a, b; a = 1 /* YES */\n b = a + 2 \n \n + 1 \n + 3"),
-      nxt_string("7") },
-
-    { nxt_string("var a, b; a = 1 // YES \n b = a + 2 \n \n + 1 \n + 3"),
-      nxt_string("7") },
-
-    { nxt_string("var a; a = 0; ++ \n a"),
-      nxt_string("1") },
-
-    { nxt_string("var a; a = 0\n ++a"),
-      nxt_string("1") },
-
-    { nxt_string("a = 0; a \n ++"),
-      nxt_string("SyntaxError: Unexpected end of input in 2") },
-
-    { nxt_string("a = 0; a \n --"),
-      nxt_string("SyntaxError: Unexpected end of input in 2") },
-
-    { nxt_string("var a = 0; a \n + 1"),
-      nxt_string("1") },
-
-    { nxt_string("var a = 0; a \n +\n 1"),
-      nxt_string("1") },
-
-    { nxt_string("var a; a = 1 ? 2 \n : 3"),
-      nxt_string("2") },
-
-    { nxt_string("var a, b, c;"
-                 "a = 0 / 0; b = 1 / 0; c = -1 / 0; a +' '+ b +' '+ c"),
-      nxt_string("NaN Infinity -Infinity") },
-
-    { nxt_string("var a, b; a = (b = 7) + 5; var c; a +' '+ b +' '+ c"),
-      nxt_string("12 7 undefined") },
-
-    { nxt_string("var a, b = 1, c; a +' '+ b +' '+ c"),
-      nxt_string("undefined 1 undefined") },
-
-    { nxt_string("var a = 1, b = a + 1; a +' '+ b"),
-      nxt_string("1 2") },
-
-    { nxt_string("var a; a = a = 1"),
-      nxt_string("1") },
-
-    { nxt_string("var a = 1, \n b; a +' '+ b"),
-      nxt_string("1 undefined") },
-
-    { nxt_string("var a; a = b + 1; var b; a +' '+ b"),
-      nxt_string("NaN undefined") },
-
-    { nxt_string("var a += 1"),
-      nxt_string("SyntaxError: Unexpected token \"+=\" in 1") },
-
-    { nxt_string("var a = a + 1"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a; a = b + 1; var b = 1; a +' '+ b"),
-      nxt_string("NaN 1") },
-
-    { nxt_string("var a; (a) = 1"),
-      nxt_string("1") },
-
-    { nxt_string("a"),
-      nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
-    { nxt_string("\na"),
-      nxt_string("ReferenceError: \"a\" is not defined in 2") },
-
-    { nxt_string("\n\na"),
-      nxt_string("ReferenceError: \"a\" is not defined in 3") },
-
-    { nxt_string("a + a"),
-      nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
-    { nxt_string("a = b + 1"),
-      nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
-    { nxt_string("a = a + 1"),
-      nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
-    { nxt_string("a += 1"),
-      nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
-    { nxt_string("a += 1; var a = 2"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = 1"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = 1; a = (a = 2) + a"),
-      nxt_string("4") },
-
-    { nxt_string("var a = 1; a = a + (a = 2)"),
-      nxt_string("3") },
-
-    { nxt_string("var a = 1; a += (a = 2)"),
-      nxt_string("3") },
-
-    { nxt_string("var a = b = 1; var b; a +' '+ b"),
-      nxt_string("1 1") },
-
-    { nxt_string("var a \n if (!a) a = 3; a"),
-      nxt_string("3") },
-
-    /* automatic semicolon insertion. */
-
-    { nxt_string("(a\n--"),
-      nxt_string("SyntaxError: Unexpected token \"--\" in 2") },
-
-    { nxt_string("(a\n++"),
-      nxt_string("SyntaxError: Unexpected token \"++\" in 2") },
-
-    { nxt_string("var x = 0, y = 2; x\n--\ny; [x,y]"),
-      nxt_string("0,1") },
-
-    /* if. */
-
-    { nxt_string("if (0);"),
-      nxt_string("undefined") },
-
-    { nxt_string("if (0) {}"),
-      nxt_string("undefined") },
-
-    { nxt_string("if (0);else;"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = 1; if (true); else a = 2; a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = 1; if (false); else a = 2; a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = 1; if (true) a = 2; else a = 3; a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = 3; if (true) if (false); else a = 2; a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = 3; if (true) if (false); else; a = 2; a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = [3], b; if (1==1||2==2) { b = '1'+'2'+a[0] }; b"),
-      nxt_string("123") },
-
-    { nxt_string("(function(){ if(true) return 1 else return 0; })()"),
-      nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
-
-    { nxt_string("(function(){ if(true) return 1; else return 0; })()"),
-      nxt_string("1") },
-
-    { nxt_string("(function(){ if(true) return 1;; else return 0; })()"),
-      nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
-
-    { nxt_string("(function(){ if(true) return 1\n else return 0; })()"),
-      nxt_string("1") },
-
-    { nxt_string("(function(){ if(true) return 1\n;\n else return 0; })()"),
-      nxt_string("1") },
-
-    { nxt_string("function f(n) {if (n) throw 'foo' else return 1}; f(0)"),
-      nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
-
-    { nxt_string("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(0)"),
-      nxt_string("1") },
-
-    { nxt_string("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(1)"),
-      nxt_string("foo") },
-
-    { nxt_string("function f(n) {if (n == 1) throw 'foo'\nelse if (n == 2) return 1}; f(2)"),
-      nxt_string("1") },
-
-    { nxt_string("(function(){ for (var p in [1] ){ if (1) break else return 0; }})()"),
-      nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
-
-    { nxt_string("(function(){ for (var p in [1] ){ if (1) break\n else return 0; }})()"),
-      nxt_string("undefined") },
-
-    { nxt_string("(function(){ for (var p in [1] ){ if (1) break; else return 0; }})()"),
-      nxt_string("undefined") },
-
-    { nxt_string("(function(){ for (var p in [1] ){ if (1) continue else return 0; }})()"),
-      nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
-
-    { nxt_string("(function(){ for (var p in [1] ){ if (1) continue\n else return 0; }})()"),
-      nxt_string("undefined") },
-
-    { nxt_string("(function(){ for (var p in [1] ){ if (1) continue; else return 0; }})()"),
-      nxt_string("undefined") },
-
-    { nxt_string("(function(x){ if\n(x) return -1; else return 0; })(0)"),
-      nxt_string("0") },
-
-    { nxt_string("(function(x){ if\n(\nx) return -1; else return 0; })(0)"),
-      nxt_string("0") },
-
-    { nxt_string("(function(x){ if\n(\nx)\nreturn -1; else return 0; })(0)"),
-      nxt_string("0") },
-
-    { nxt_string("(function(x){ if\n(\nx)\nreturn -1\n else return 0; })(0)"),
-      nxt_string("0") },
-
-    { nxt_string("(function(x){ if\n(\nx)\nreturn -1\n else\nreturn 0; })(0)"),
-      nxt_string("0") },
-
-    /* do while. */
-
-    { nxt_string("do { break } if (false)"),
-      nxt_string("SyntaxError: Unexpected token \"if\" in 1") },
-
-    /* for in. */
-
-    { nxt_string("for (null in undefined);"),
-      nxt_string("ReferenceError: Invalid left-hand side \"null\" in for-in statement in 1") },
-
-    { nxt_string("for (var a, b in []);"),
-      nxt_string("SyntaxError: Unexpected token \"in\" in 1") },
-
-    { nxt_string("var s = ''; for (var p in [1,2]) {s += p}; s"),
-      nxt_string("01") },
-
-    { nxt_string("var s; for (var p in [1]) {s = typeof(p)}; s"),
-      nxt_string("string") },
-
-    { nxt_string("var s = ''; for (var p in {a:1, b:2}) {s += p}; s"),
-      nxt_string("ab") },
-
-    { nxt_string("var s = '';"
-                 "var o = Object.defineProperty({}, 'x', {value:1});"
-                 "Object.defineProperty(o, 'y', {value:2, enumerable:true});"
-                 "for (var p in o) {s += p}; s"),
-      nxt_string("y") },
-
-    { nxt_string("var o = {a:1, b:2}; var arr = []; "
-                 "for (var a in o) {arr.push(a)}; arr"),
-      nxt_string("a,b") },
-
-    { nxt_string("var o = {a:1, b:2}; var arr = []; delete o.a; "
-                 "for (var a in o) {arr.push(a)}; arr"),
-      nxt_string("b") },
-
-    /* switch. */
-
-    { nxt_string("switch"),
-      nxt_string("SyntaxError: Unexpected end of input in 1") },
-
-    { nxt_string("switch (1);"),
-      nxt_string("SyntaxError: Unexpected token \";\" in 1") },
-
-    { nxt_string("switch (1) { do { } while (1) }"),
-      nxt_string("SyntaxError: Unexpected token \"do\" in 1") },
-
-    { nxt_string("switch (1) {}"),
-      nxt_string("undefined") },
-
-    { nxt_string("switch (1) {default:}"),
-      nxt_string("undefined") },
-
-    { nxt_string("switch (1) {case 0:}"),
-      nxt_string("undefined") },
-
-    { nxt_string("switch (1) {default:;}"),
-      nxt_string("undefined") },
-
-    { nxt_string("switch (1) {default:; default:}"),
-      nxt_string("SyntaxError: More than one default clause in switch statement in 1") },
-
-    { nxt_string("switch (1) {case 0:;}"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = 'A'; switch (a) {"
-                 "case 0: a += '0';"
-                 "case 1: a += '1';"
-                 "}; a"),
-      nxt_string("A") },
-
-    { nxt_string("var a = 'A'; switch (0) {"
-                 "case 0: a += '0';"
-                 "case 1: a += '1';"
-                 "}; a"),
-      nxt_string("A01") },
-
-    { nxt_string("var a = 'A'; switch (0) {"
-                 "case 0: a += '0'; break;"
-                 "case 1: a += '1';"
-                 "}; a"),
-      nxt_string("A0") },
-
-    { nxt_string("var a = 'A'; switch (1) {"
-                 "case 0: a += '0';"
-                 "case 1: a += '1';"
-                 "}; a"),
-      nxt_string("A1") },
-
-    { nxt_string("var a = 'A'; switch (2) {"
-                 "case 0: a += '0';"
-                 "case 1: a += '1';"
-                 "default: a += 'D';"
-                 "}; a"),
-      nxt_string("AD") },
-
-    { nxt_string("var a = 'A'; switch (2) {"
-                 "case 0: a += '0';"
-                 "default: a += 'D';"
-                 "case 1: a += '1';"
-                 "}; a"),
-      nxt_string("AD1") },
-
-    { nxt_string("var a = 'A'; function f(x) { a += x; return 0 }"
-                 "switch (a) {"
-                 "case f(1):"
-                 "default:"
-                 "case f(2): a += 'D';"
-                 "case f(3): a += 'T';"
-                 "} a"),
-      nxt_string("A123DT") },
-
-    { nxt_string("var t; "
-                 "switch ($r3.uri) {"
-                 "case 'abc': "
-                 "  t='A'; "
-                 "  break; "
-                 "default: "
-                 "  t='F'; "
-                 "}; t"),
-      nxt_string("A") },
-
-    /* continue. */
-
-    { nxt_string("continue"),
-      nxt_string("SyntaxError: Illegal continue statement in 1") },
-
-    { nxt_string("\n{\ncontinue;\n}"),
-      nxt_string("SyntaxError: Illegal continue statement in 3") },
-
-    { nxt_string("do continue while (false)"),
-      nxt_string("SyntaxError: Unexpected token \"while\" in 1") },
-
-    { nxt_string("do continue; while (false)"),
-      nxt_string("undefined") },
-
-    { nxt_string("do { continue } while (false)"),
-      nxt_string("undefined") },
-
-    { nxt_string("var i = 0; do if (i++ > 9) continue; while (i < 100); i"),
-      nxt_string("100") },
-
-    { nxt_string("while (false) continue"),
-      nxt_string("undefined") },
-
-    { nxt_string("while (false) continue;"),
-      nxt_string("undefined") },
-
-    { nxt_string("while (false) { continue }"),
-      nxt_string("undefined") },
-
-    { nxt_string("var i = 0; while (i < 100) if (i++ > 9) continue; i"),
-      nxt_string("100") },
-
-    { nxt_string("for ( ;null; ) continue"),
-      nxt_string("undefined") },
-
-    { nxt_string("for ( ;null; ) continue;"),
-      nxt_string("undefined") },
-
-    { nxt_string("for ( ;null; ) { continue }"),
-      nxt_string("undefined") },
-
-    { nxt_string("var i; for (i = 0; i < 100; i++) if (i > 9) continue; i"),
-      nxt_string("100") },
-
-    { nxt_string("var a = [], i; for (i in a) continue"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [], i; for (i in a) continue;"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [], i; for (i in a) { continue }"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
-                 "for (i in a) { if (a[i] > 4) continue; else s += a[i] } s"),
-      nxt_string("10") },
-
-    { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
-                 "for (i in a) { if (a[i] > 4) continue; s += a[i] } s"),
-      nxt_string("10") },
-
-    { nxt_string("var a; for (a = 1; a; a--) switch (a) { case 0: continue }"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [1,2,3], i; for (i in a) {Object.seal({})}"),
-      nxt_string("undefined") },
-
-    { nxt_string("var i; for (i in [1,2,3]) {Object.seal({});}"),
-      nxt_string("undefined") },
-
-    /* break. */
-
-    { nxt_string("break"),
-      nxt_string("SyntaxError: Illegal break statement in 1") },
-
-    { nxt_string("{break}"),
-      nxt_string("SyntaxError: Illegal break statement in 1") },
-
-    { nxt_string("\nbreak"),
-      nxt_string("SyntaxError: Illegal break statement in 2") },
-
-    { nxt_string("do break while (true)"),
-      nxt_string("SyntaxError: Unexpected token \"while\" in 1") },
-
-    { nxt_string("do break; while (true)"),
-      nxt_string("undefined") },
-
-    { nxt_string("do { break } while (true)"),
-      nxt_string("undefined") },
-
-    { nxt_string("var i = 0; do if (i++ > 9) break; while (i < 100); i"),
-      nxt_string("11") },
-
-    { nxt_string("while (true) break"),
-      nxt_string("undefined") },
-
-    { nxt_string("while (true) break;"),
-      nxt_string("undefined") },
-
-    { nxt_string("while (true) { break }"),
-      nxt_string("undefined") },
-
-    { nxt_string("var i = 0; while (i < 100) if (i++ > 9) break; i"),
-      nxt_string("11") },
-
-    { nxt_string("for ( ;; ) break"),
-      nxt_string("undefined") },
-
-    { nxt_string("for ( ;; ) break;"),
-      nxt_string("undefined") },
-
-    { nxt_string("for ( ;; ) { break }"),
-      nxt_string("undefined") },
-
-    { nxt_string("var i; for (i = 0; i < 100; i++) if (i > 9) break; i"),
-      nxt_string("10") },
-
-    { nxt_string("var a = [], i; for (i in a) break"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [], i; for (i in a) break;"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [], i; for (i in a) { break }"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
-                 "for (i in a) { if (a[i] > 4) break; else s += a[i] } s"),
-      nxt_string("10") },
-
-    { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
-                 "for (i in a) { if (a[i] > 4) break; s += a[i] } s"),
-      nxt_string("10") },
-
-    { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
-                 "for (i in a) if (a[i] > 4) break; s += a[i]; s"),
-      nxt_string("5") },
-
-    /* Labels. */
-
-    { nxt_string("var n = 0; a:{n++}; a:{n++}; n"),
-      nxt_string("2") },
-
-    { nxt_string("a: throw 'a'"),
-      nxt_string("a") },
-
-    { nxt_string("a\n:\n1"),
-      nxt_string("1") },
-
-    { nxt_string("a\n\n:1"),
-      nxt_string("1") },
-
-    { nxt_string("a:\n\n1"),
-      nxt_string("1") },
-
-    { nxt_string("a:\n\n"),
-      nxt_string("SyntaxError: Unexpected end of input in 3") },
-
-    { nxt_string("a : var n = 0; b :++n"),
-      nxt_string("1") },
-
-    { nxt_string("a:{a:1}"),
-      nxt_string("SyntaxError: Label \"a\" has already been declared in 1") },
-
-    { nxt_string("for (var i in [1]) {break b}"),
-      nxt_string("SyntaxError: Undefined label \"b\" in 1") },
-
-    { nxt_string("for (var i in [1]) {continue b}"),
-      nxt_string("SyntaxError: Undefined label \"b\" in 1") },
-
-    { nxt_string("a:{break b}"),
-      nxt_string("SyntaxError: Undefined label \"b\" in 1") },
-
-    { nxt_string("a:{continue b}"),
-      nxt_string("SyntaxError: Undefined label \"b\" in 1") },
-
-#if 0 /* TODO */
-    { nxt_string("a:{1; break a}"),
-      nxt_string("1") },
-#endif
-
-    { nxt_string("var a = 0; a:{a++}; a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = 0; a:{break a; a++}; a"),
-      nxt_string("0") },
-
-    { nxt_string("var r = 0; "
-                 "out: for (var i in [1,2,3]) { if (i == 2) {break out;}; r++}; r"),
-      nxt_string("2") },
-
-    { nxt_string("var r = 0; "
-                 "out: for (var i = 0; i < 5; i++) { if (i == 2) {break out;}; r++}; r"),
-      nxt_string("2") },
-
-    { nxt_string("var l1 = 0, l2 = 0; "
-                 "out: "
-                 "for (var i in [1,2,3]) { "
-                 "  for (var j in [1,2,3]) { "
-                 "    if (i == 1 && j == 1) {break;}"
-                 "    l2++;"
-                 "  }"
-                 "  l1++;"
-                 "}; [l1, l2]"),
-      nxt_string("3,7") },
-
-    { nxt_string("var l1 = 0, l2 = 0; "
-                 "out: "
-                 "for (var i in [1,2,3]) { "
-                 "  for (var j in [1,2,3]) { "
-                 "    if (i == 1 && j == 1) {break out;}"
-                 "    l2++;"
-                 "  }"
-                 "  l1++;"
-                 "}; [l1, l2]"),
-      nxt_string("1,4") },
-
-    { nxt_string("var l1 = 0, l2 = 0; "
-                 "out: "
-                 "for (var i in [1,2,3]) { "
-                 "  for (var j in [1,2,3]) { "
-                 "    if (i == 1 && j == 1) {continue out;}"
-                 "    l2++;"
-                 "  }"
-                 "  l1++;"
-                 "}; [l1, l2]"),
-      nxt_string("2,7") },
-
-    { nxt_string("var l1 = 0, l2 = 0; "
-                 "out: "
-                 "for (var i in [1,2,3]) { "
-                 "  l1++;"
-                 "  switch (i) { "
-                 "    case '1':"
-                 "      break out;"
-                 "    default:"
-                 "  }"
-                 "  l2++;"
-                 "}; [l1, l2]"),
-      nxt_string("2,1") },
-
-    { nxt_string("var l1 = 0, l2 = 0; "
-                 "out: "
-                 "for (var i in [1,2,3]) { "
-                 "  l1++;"
-                 "  switch (i) { "
-                 "    case '1':"
-                 "      continue out;"
-                 "    default:"
-                 "  }"
-                 "  l2++;"
-                 "}; [l1, l2]"),
-      nxt_string("3,2") },
-
-    { nxt_string("var l1 = 0, l2 = 0, i = 0, j; "
-                 "out: "
-                 "while (i < 3) { "
-                 "  j = 0;"
-                 "  while (j < 3) { "
-                 "    if (i == 1 && j == 1) {break out;}"
-                 "    l2++;"
-                 "    j++;"
-                 "  }"
-                 "  l1++;"
-                 "  i++;"
-                 "}; [l1, l2]"),
-      nxt_string("1,4") },
-
-    { nxt_string("var l1 = 0, l2 = 0, i = 0, j; "
-                 "out: "
-                 "while (i < 3) { "
-                 "  j = 0;"
-                 "  while (j < 3) { "
-                 "    if (i == 1 && j == 1) {i++; continue out;}"
-                 "    l2++;"
-                 "    j++;"
-                 "  }"
-                 "  l1++;"
-                 "  i++;"
-                 "}; [l1, l2]"),
-      nxt_string("2,7") },
-
-    { nxt_string("var l1 = 0, l2 = 0, i = 0, j; "
-                 "out: "
-                 "do { "
-                 "  j = 0;"
-                 "  do { "
-                 "    if (i == 1 && j == 1) {break out;}"
-                 "    l2++;"
-                 "    j++;"
-                 "  } while (j < 3)"
-                 "  l1++;"
-                 "  i++;"
-                 "} while (i < 3); [l1, l2]"),
-      nxt_string("1,4") },
-
-    { nxt_string("var l1 = 0, l2 = 0, i = 0, j; "
-                 "out: "
-                 "do { "
-                 "  j = 0;"
-                 "  do { "
-                 "    if (i == 1 && j == 1) {i++; continue out;}"
-                 "    l2++;"
-                 "    j++;"
-                 "  } while (j < 3)"
-                 "  l1++;"
-                 "  i++;"
-                 "} while (i < 3); [l1, l2]"),
-      nxt_string("2,7") },
-
-    { nxt_string("out1: while (1) { out2: while (1) { "
-                 "  try { break out1; break out2; } catch (e) {}"
-                 "}}"),
-      nxt_string("InternalError: break/return instructions with different labels "
-                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
-    { nxt_string("out1: while (1) { out2: while (1) { "
-                 "  try { } catch (e) {break out1; break out2;} finally {}"
-                 "}}"),
-      nxt_string("InternalError: break/return instructions with different labels "
-                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
-    { nxt_string("out1: while (1) { out2: while (1) { "
-                 "  try { break out1; } catch (e) {break out2;} finally {}"
-                 "}}"),
-      nxt_string("InternalError: try break/return instructions with different labels "
-                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
-    { nxt_string("out1: while (1) { out2: while (1) { "
-                 "  try { break out1; break out2; } finally {}"
-                 "}}"),
-      nxt_string("InternalError: break/return instructions with different labels "
-                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
-    { nxt_string("out1: while (1) { out2: while (1) { "
-                 "  try { continue out1; continue out2; } catch (e) {}"
-                 "}}"),
-      nxt_string("InternalError: continue instructions with different labels "
-                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
-    { nxt_string("out1: while (1) { out2: while (1) { "
-                 "  try { continue out1; } catch (e) {continue out2;} finally {}"
-                 "}}"),
-      nxt_string("InternalError: try continue instructions with different labels "
-                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
-    { nxt_string("function f() {"
-                 "  a:{ try { try { return 'a'; } catch (e) {break a;} finally {} } "
-                 "      catch (e) {} finally {}; }"
-                 "}"),
-      nxt_string("InternalError: try break/return instructions with different labels "
-                 "(\"@return\" vs \"a\") from try-catch block are not supported") },
-
-    { nxt_string("a:{ try { try { continue a; } catch (e) {} finally {} } "
-                 "    catch (e) {} finally {}; "
-                 "}"),
-      nxt_string("SyntaxError: Illegal continue statement in 1") },
-
-    { nxt_string("var i = 0, j = 0, r = 0;"
-                 "out1: while (i < 3) "
-                 "{ "
-                 "  i++;"
-                 "  out2: while (j < 3) { "
-                 "      j++; try { break out1; } catch (e) {} finally {r++}"
-                 "  }"
-                 "}; [i, j, r]"),
-      nxt_string("1,1,1") },
-
-    { nxt_string("var i = 0, j = 0, r = 0;"
-                 "out1: while (i < 3) "
-                 "{ "
-                 "  i++;"
-                 "  out2: while (j < 3) { "
-                 "      j++; try { continue out1; } catch (e) {} finally {r++}"
-                 "  }"
-                 "}; [i, j, r]"),
-      nxt_string("3,3,3") },
-
-    { nxt_string("var c=0,fin=0;"
-                 "try {"
-                 " while (c < 2) {"
-                 "    try { c += 1; throw 'e';}"
-                 "    finally { fin = 1; break;}"
-                 "    fin = -1;"
-                 "    c += 2;"
-                 " }"
-                 "} catch(e) {c = 10;}; [c, fin]"),
-      nxt_string("1,1") },
-
-    /* jumping out of a nested try-catch block. */
-
-    { nxt_string("var r = 0; "
-                 "function f () { try { try {return 'a';} finally { r++; }} "
-                 "                finally { r++; } }; "
-                 "[f(), r]"),
-      nxt_string("a,2") },
-
-    { nxt_string("function f(n) { "
-                 "  var r1 = 0, r2 = 0, r3 = 0;"
-                 "  a:{ try { try { "
-                 "              if (n == 0) { break a; } "
-                 "              if (n == 1) { throw 'a'; } "
-                 "            } "
-                 "            catch (e) { break a; } finally { r1++; } } "
-                 "      catch (e) {} "
-                 "      finally { r2++; } "
-                 "      r3++;  "
-                 "  }; "
-                 "return [r1, r2, r3]"
-                 "}; njs.dump([f(0), f(1), f(3)])"),
-      nxt_string("[[1,1,0],[1,1,0],[1,1,1]]") },
-
-    /**/
-
-    { nxt_string("var i; for (i = 0; i < 10; i++) { i += 1 } i"),
-      nxt_string("10") },
-
-    /* Factorial. */
-
-    { nxt_string("var n = 5, f = 1; while (n--) f *= n + 1; f"),
-      nxt_string("120") },
-
-    { nxt_string("var n = 5, f = 1; while (n) { f *= n; n-- } f"),
-      nxt_string("120") },
-
-    /* Fibonacci. */
-
-    { nxt_string("var n = 50, x, i, j, k;"
-                 "for(i=0,j=1,k=0; k<n; i=j,j=x,k++ ){ x=i+j } x"),
-      nxt_string("20365011074") },
-
-    { nxt_string("3 + 'abc' + 'def' + null + true + false + undefined"),
-      nxt_string("3abcdefnulltruefalseundefined") },
-
-    { nxt_string("var a = 0; do a++; while (a < 5) if (a == 5) a = 7.33 \n"
-                 "else a = 8; while (a < 10) a++; a"),
-      nxt_string("10.33") },
-
-    /* typeof. */
-
-    { nxt_string("typeof null"),
-      nxt_string("object") },
-
-    { nxt_string("typeof undefined"),
-      nxt_string("undefined") },
-
-    { nxt_string("typeof false"),
-      nxt_string("boolean") },
-
-    { nxt_string("typeof true"),
-      nxt_string("boolean") },
-
-    { nxt_string("typeof 0"),
-      nxt_string("number") },
-
-    { nxt_string("typeof -1"),
-      nxt_string("number") },
-
-    { nxt_string("typeof Infinity"),
-      nxt_string("number") },
-
-    { nxt_string("typeof NaN"),
-      nxt_string("number") },
-
-    { nxt_string("typeof 'a'"),
-      nxt_string("string") },
-
-    { nxt_string("typeof {}"),
-      nxt_string("object") },
-
-    { nxt_string("typeof Object()"),
-      nxt_string("object") },
-
-    { nxt_string("typeof []"),
-      nxt_string("object") },
-
-    { nxt_string("typeof function(){}"),
-      nxt_string("function") },
-
-    { nxt_string("typeof Object"),
-      nxt_string("function") },
-
-    { nxt_string("typeof /./i"),
-      nxt_string("object") },
-
-    { nxt_string("typeof Date.prototype"),
-      nxt_string("object") },
-
-    { nxt_string("typeof a"),
-      nxt_string("undefined") },
-
-    { nxt_string("typeof a; var a"),
-      nxt_string("undefined") },
-
-    { nxt_string("typeof a; var a; a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = 5; typeof a"),
-      nxt_string("number") },
-
-    { nxt_string("function f() { return typeof a } ; f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("typeof a; a"),
-      nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
-    { nxt_string("typeof a; a = 1"),
-      nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
-    /**/
-
-    { nxt_string("void 0"),
-      nxt_string("undefined") },
-
-    { nxt_string("null = 1"),
-      nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
-
-    { nxt_string("undefined = 1"),
-      nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
-
-    { nxt_string("null++"),
-      nxt_string("ReferenceError: Invalid left-hand side in postfix operation in 1") },
-
-    { nxt_string("++null"),
-      nxt_string("ReferenceError: Invalid left-hand side in prefix operation in 1") },
-
-    { nxt_string("var a, b; b = a; a = 1; a +' '+ b"),
-      nxt_string("1 undefined") },
-
-    { nxt_string("a = 1"),
-      nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
-    { nxt_string("var a; a = 1; a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = {}; typeof a +' '+ a"),
-      nxt_string("object [object Object]") },
-
-    { nxt_string("var a = {}; a.b"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = {}; a.b = 1 + 2; a.b"),
-      nxt_string("3") },
-
-    { nxt_string("var a = {}; a['b']"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = {}; a.b.c"),
-      nxt_string("TypeError: cannot get property \"c\" of undefined") },
-
-    { nxt_string("'a'[0]"),
-      nxt_string("a") },
-
-    { nxt_string("'a'[undefined]"),
-      nxt_string("undefined") },
-
-    { nxt_string("'a'[null]"),
-      nxt_string("undefined") },
-
-    { nxt_string("'a'[false]"),
-      nxt_string("undefined") },
-
-    { nxt_string("'a'.b = 1"),
-      nxt_string("TypeError: property set on primitive string type") },
-
-    { nxt_string("'a'[2] = 1"),
-      nxt_string("TypeError: property set on primitive string type") },
-
-    { nxt_string("var a = {}; a.b = 1; a.b"),
-      nxt_string("1") },
-
-    { nxt_string("var a = {}; a.b = 1; a.b += 2"),
-      nxt_string("3") },
-
-    { nxt_string("var a = {}; a.b = 1; a.b += a.b"),
-      nxt_string("2") },
-
-    { nxt_string("var a = {}; a.b = 1; var x = {}; x.b = 3; a.b += (x.b = 2)"),
-      nxt_string("3") },
-
-    { nxt_string("var a = {}; a.b = 1; a.b += (a.b = 2)"),
-      nxt_string("3") },
-
-    { nxt_string("var a = {}; a.b += 1"),
-      nxt_string("NaN") },
-
-    { nxt_string("var a = 1; var b = 2; a = b += 1"),
-      nxt_string("3") },
-
-    { nxt_string("var a = 1; var b = { x:2 }; a = b.x += 1"),
-      nxt_string("3") },
-
-    { nxt_string("var a = 1; var b = { x:2 }; a = b.x += (a = 1)"),
-      nxt_string("3") },
-
-    { nxt_string("var a = undefined; a.b++; a.b"),
-      nxt_string("TypeError: cannot get property \"b\" of undefined") },
-
-    { nxt_string("var a = null; a.b++; a.b"),
-      nxt_string("TypeError: cannot get property \"b\" of undefined") },
-
-    { nxt_string("var a = true; a.b++; a.b"),
-      nxt_string("TypeError: property set on primitive boolean type") },
-
-    { nxt_string("var a = 1; a.b++; a.b"),
-      nxt_string("TypeError: property set on primitive number type") },
-
-    { nxt_string("var n = 1, o = { p: n += 1 }; o.p"),
-      nxt_string("2") },
-
-    { nxt_string("var a = {}; a.b = {}; a.b.c = 1; a.b['c']"),
-      nxt_string("1") },
-
-    { nxt_string("var a = {}; a.b = {}; a.b.c = 1; a['b']['c']"),
-      nxt_string("1") },
-
-    { nxt_string("var a = {}; a.b = {}; var c = 'd'; a.b.d = 1; a['b'][c]"),
-      nxt_string("1") },
-
-    { nxt_string("var a = {}; a.b = 1; var c = a.b++; a.b +' '+ c"),
-      nxt_string("2 1") },
-
-    { nxt_string("var a = 2; a.b = 1; var c = a.b++; a +' '+ a.b +' '+ c"),
-      nxt_string("TypeError: property set on primitive number type") },
-
-    { nxt_string("var x = { a: 1 }; x.a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { x:1 }; var b = { y:2 }; a.x = b.y; a.x"),
-      nxt_string("2") },
-
-    { nxt_string("var a = { x:1 }; var b = { y:2 }; var c; c = a.x = b.y"),
-      nxt_string("2") },
-
-    { nxt_string("var a = { x:1 }; var b = { y:2 }; var c = a.x = b.y; c"),
-      nxt_string("2") },
-
-    { nxt_string("var a = { x:1 }; var b = { y:2 }; a.x = b.y"),
-      nxt_string("2") },
-
-    { nxt_string("var a = { x:1 }; var b = a.x = 1 + 2; a.x +' '+ b"),
-      nxt_string("3 3") },
-
-    { nxt_string("var a = { x:1 }; var b = { y:2 }; var c = {};"
-                 "c.x = a.x = b.y; c.x"),
-      nxt_string("2") },
-
-    { nxt_string("var y = 2, x = { a:1, b: y + 5, c:3 };"
-                 "x.a +' '+ x.b +' '+ x.c"),
-      nxt_string("1 7 3") },
-
-    { nxt_string("var x = { a: 1, b: { a:2, c:5 } };"
-                 "x.a +' '+ x.b.a +' '+ x.b.c"),
-      nxt_string("1 2 5") },
-
-    { nxt_string("var y = 5, x = { a:y }; x.a"),
-      nxt_string("5") },
-
-    { nxt_string("var x = { a: 1; b: 2 }"),
-      nxt_string("SyntaxError: Unexpected token \";\" in 1") },
-
-    { nxt_string("var x = { a: 1, b: x.a }"),
-      nxt_string("TypeError: cannot get property \"a\" of undefined") },
-
-    { nxt_string("var a = { b: 2 }; a.b += 1"),
-      nxt_string("3") },
-
-    { nxt_string("var o = {a:1}, c = o; o.a = o = {b:5};"
-                 "o.a +' '+ o.b +' '+ c.a.b"),
-      nxt_string("undefined 5 5") },
-
-    { nxt_string("var y = { a: 2 }, x = { a: 1, b: y.a }; x.a +' '+ x.b"),
-      nxt_string("1 2") },
-
-    { nxt_string("var y = { a: 1 }, x = { a: y.a++, b: y.a++ }\n"
-                 "x.a +' '+ x.b +' '+ y.a"),
-      nxt_string("1 2 3") },
-
-    { nxt_string("var a='', o = {a:1, b:2}, p;"
-                 "for (p in o) { a += p +':'+ o[p] +',' } a"),
-      nxt_string("a:1,b:2,") },
-
-    { nxt_string("var x = { a: 1 }, b = delete x.a; x.a +' '+ b"),
-      nxt_string("undefined true") },
-
-    /* Object shorthand property. */
-
-    { nxt_string("var a = 1; njs.dump({a})"),
-      nxt_string("{a:1}") },
-
-    { nxt_string("var a = 1, b; njs.dump({a,b})"),
-      nxt_string("{a:1,b:undefined}") },
-
-    { nxt_string("var a = 1, b = 2; ({a,b,c})"),
-      nxt_string("ReferenceError: \"c\" is not defined in 1") },
-
-    { nxt_string("var a = 1, b = 2; njs.dump({a,b,c:3})"),
-      nxt_string("{a:1,b:2,c:3}") },
-
-    { nxt_string("var b = 2, c = 3; njs.dump({a:1,b,c})"),
-      nxt_string("{a:1,b:2,c:3}") },
-
-    { nxt_string("({1})"),
-      nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
-    { nxt_string("({default})"),
-      nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
-    { nxt_string("({var})"),
-      nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
-    { nxt_string("({this})"),
-        nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
-    { nxt_string("typeof ({Number}).Number"),
-      nxt_string("function") },
-
-    { nxt_string("typeof ({eval}).eval"),
-      nxt_string("function") },
-
-    { nxt_string("typeof ({Math}).Math.sin"),
-      nxt_string("function") },
-
-    { nxt_string("delete null"),
-      nxt_string("true") },
-
-    { nxt_string("var a; delete a"),
-      nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
-
-    { nxt_string("delete undefined"),
-      nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
-
-    /* Object shorthand methods. */
-
-    { nxt_string("var o = {m(){}}; new o.m();"),
-      nxt_string("TypeError: function is not a constructor") },
-
-    { nxt_string("var o = {sum(a, b){return a + b;}}; o.sum(1, 2)"),
-      nxt_string("3") },
-
-    /* Object computed property. */
-
-    { nxt_string("var o = { [0]: 1, [-0]: 2 }; o[0];"),
-      nxt_string("2") },
-
-    { nxt_string("var k = 'abc'.split('');var o = {[k[0]]: 'baz'}; o.a"),
-      nxt_string("baz") },
-
-    { nxt_string("var k = {}; var o = {[k]() {return 'baz'}}; o[k]()"),
-      nxt_string("baz") },
-
-    { nxt_string("njs.dump({[{toString(){return 'xx'}}]:1})"),
-      nxt_string("{xx:1}") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'toString', {value:()=>'xx'});"
-                 "njs.dump({[o]:1})"),
-      nxt_string("{xx:1}") },
-
-    { nxt_string("({[{toString(){return {}}}]:1})"),
-      nxt_string("TypeError: Cannot convert object to primitive value") },
-
-    { nxt_string("var o = { [new Number(12345)]: 1000 }; o[12345]"),
-      nxt_string("1000") },
-
-    /* ES5FIX: "SyntaxError". */
-
-    { nxt_string("delete NaN"),
-      nxt_string("true") },
-
-    /* ES5FIX: "SyntaxError". */
-
-    { nxt_string("delete Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("delete -Infinity"),
-      nxt_string("true") },
-
-    { nxt_string("delete (1/0)"),
-      nxt_string("true") },
-
-    { nxt_string("delete 1"),
-      nxt_string("true") },
-
-    { nxt_string("var a = []; delete a[1]"),
-      nxt_string("true") },
-
-    { nxt_string("var o = {}; [delete o.m, delete o.m]"),
-      nxt_string("true,true") },
-
-    { nxt_string("[delete Array.nonexistent, delete Array.Array]"),
-      nxt_string("true,true") },
-
-    { nxt_string("var a; delete (a = 1); a"),
-      nxt_string("1") },
-
-    { nxt_string("delete a"),
-      nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
-
-    { nxt_string("var a = 1; delete a"),
-      nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
-
-    { nxt_string("function f(){} delete f"),
-      nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
-
-    { nxt_string("var a = { x:1 }; ('x' in a) +' '+ (1 in a)"),
-      nxt_string("true false") },
-
-    { nxt_string("delete --[][1]"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [1,2]; delete a.length"),
-      nxt_string("TypeError: Cannot delete property \"length\" of array") },
-
-    { nxt_string("var a = [1,2,3]; a.x = 10;  delete a[1]"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.create({a:1}); o.a = 2; delete o.a; o.a"),
-      nxt_string("1") },
-
-    { nxt_string("delete Array.name"),
-      nxt_string("true") },
-
-    { nxt_string("delete Math.max"),
-      nxt_string("true") },
-
-    { nxt_string("delete Math.max.length"),
-      nxt_string("true") },
-
-    { nxt_string("function f(a,b) {} "
-                 "[f.length, delete f.length, f.length, delete f.length]"),
-      nxt_string("2,true,0,true") },
-
-    { nxt_string("njs.dump({break:1,3:2,'a':4,\"b\":2,true:1,null:0})"),
-      nxt_string("{break:1,3:2,a:4,b:2,true:1,null:0}") },
-
-    { nxt_string("var o1 = {a:1,b:2}, o2 = {c:3}; o1.a + o2.c"),
-      nxt_string("4") },
-
-    { nxt_string("({[]:1})"),
-      nxt_string("SyntaxError: Unexpected token \"]\" in 1") },
-
-    { nxt_string("({'AB\\ncd':1})['AB\\ncd']"),
-      nxt_string("1") },
-
-    /* Inheritance. */
-
-    { nxt_string("function Foo() {this.bar = 10;}; Foo.prototype.bar = 42; "
-                 "var v = new Foo(); delete v.bar; v.bar"),
-      nxt_string("42") },
-
-    { nxt_string("function Cl(x,y) {this.x = x; this.y = y}; "
-                 "var c = new Cl('a', 'b'); Cl.prototype.z = 1; c.z"),
-      nxt_string("1") },
-
-    /**/
-
-    { nxt_string("delete Math.E"),
-      nxt_string("TypeError: Cannot delete property \"E\" of object") },
-
-    { nxt_string("Math.E = 1"),
-      nxt_string("TypeError: Cannot assign to read-only property \"E\" of object") },
-
-    { nxt_string("var o = { 'a': 1, 'b': 2 }; var i; "
-                 "for (i in o) { delete o.a; delete o.b; }; njs.dump(o)"),
-      nxt_string("{}") },
-
-    { nxt_string("var o  = {}; Object.defineProperty(o, 'a', {value:1, configurable:1}); "
-                 "delete o.a; o.a=2; o.a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = {}; 1 in a"),
-      nxt_string("false") },
-
-    { nxt_string("'a' in {a:1}"),
-      nxt_string("true") },
-
-    { nxt_string("'a' in Object.create({a:1})"),
-      nxt_string("true") },
-
-    { nxt_string("var a = 1; 1 in a"),
-      nxt_string("TypeError: property in on a primitive value") },
-
-    { nxt_string("var a = true; 1 in a"),
-      nxt_string("TypeError: property in on a primitive value") },
-
-    { nxt_string("var n = { toString: function() { return 'a' } };"
-                 "var o = { a: 5 }; o[n]"),
-      nxt_string("5") },
-
-    { nxt_string("var n = { valueOf: function() { return 'a' } };"
-                 "var o = { a: 5, '[object Object]': 7 }; o[n]"),
-      nxt_string("7") },
-
-    { nxt_string("var o = {}; o.new = 'OK'; o.new"),
-      nxt_string("OK") },
-
-    { nxt_string("var o = { new: 'OK'}; o.new"),
-      nxt_string("OK") },
-
-    /* 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("var a = [ 1, 2, 3 ]; a[0] + a[1] + a[2]"),
-      nxt_string("6") },
-
-    { nxt_string("var a = [ 1, 2, 3 ]; a[-1] = 4; a + a[-1]"),
-      nxt_string("1,2,34") },
-
-    { nxt_string("var a = [ 1, 2, 3 ]; a[4294967295] = 4; a + a[4294967295]"),
-      nxt_string("1,2,34") },
-
-    { nxt_string("var a = [ 1, 2, 3 ]; a[4294967296] = 4; a + a[4294967296]"),
-      nxt_string("1,2,34") },
-
-    { nxt_string("delete[]['4e9']"),
-      nxt_string("true") },
-
-    { nxt_string("var n = 1, a = [ n += 1 ]; a"),
-      nxt_string("2") },
-
-    { nxt_string("var a = [ 1, 2; 3 ]; a[0] + a[1] + a[2]"),
-      nxt_string("SyntaxError: Unexpected token \";\" in 1") },
-
-    { nxt_string("var a = [ 1, 2, 3 ]; a[0] +' '+ a[1] +' '+ a[2] +' '+ a[3]"),
-      nxt_string("1 2 3 undefined") },
-
-    { nxt_string("var a = [ 5, 6, 7 ]; a['1']"),
-      nxt_string("6") },
-
-    { nxt_string("var a = [ 5, 6, 7 ]; a['01']"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [ 5, 6, 7 ]; a[0x1]"),
-      nxt_string("6") },
-
-    { nxt_string("var a = [ 5, 6, 7 ]; a['0x1']"),
-      nxt_string("undefined") },
-
-    { nxt_string("[] - 2"),
-      nxt_string("-2") },
-
-    { nxt_string("[1] - 2"),
-      nxt_string("-1") },
-
-    { nxt_string("[[1]] - 2"),
-      nxt_string("-1") },
-
-    { nxt_string("[[[1]]] - 2"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = []; a - 2"),
-      nxt_string("-2") },
-
-    { nxt_string("var a = [1]; a - 2"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = []; a[0] = 1; a - 2"),
-      nxt_string("-1") },
-
-    { nxt_string("[] + 2 + 3"),
-      nxt_string("23") },
-
-    { nxt_string("[1] + 2 + 3"),
-      nxt_string("123") },
-
-    { nxt_string("var a = []; a + 2 + 3"),
-      nxt_string("23") },
-
-    { nxt_string("var a = [1]; a + 2 + 3"),
-      nxt_string("123") },
-
-    { nxt_string("var a = [1,2], i = 0; a[i++] += a[0] = 5 + i;"
-                 "a[0] +' '+ a[1]"),
-      nxt_string("7 2") },
-
-    { nxt_string("var a = []; a[0] = 1; a + 2 + 3"),
-      nxt_string("123") },
-
-    { nxt_string("var a = []; a['0'] = 1; a + 2 + 3"),
-      nxt_string("123") },
-
-    { nxt_string("var a = []; a[2] = 1; a[2]"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1, 2]; 1 in a"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [1, 2]; 2 in a"),
-      nxt_string("false") },
-
-    { nxt_string("var a = [1, 2]; delete a[0]; 0 in a"),
-      nxt_string("false") },
-
-    { nxt_string("var a = [ function(a) {return a + 1} ]; a[0](5)"),
-      nxt_string("6") },
-
-    { nxt_string("var s = '', a = [5,1,2], i;"
-                 "a[null] = null;"
-                 "a[undefined] = 'defined';"
-                 "a[false] = false;"
-                 "a[true] = true;"
-                 "a[-0] = 0;"
-                 "a[Infinity] = Infinity;"
-                 "a[-Infinity] = -Infinity;"
-                 "a[NaN] = NaN;"
-                 "a[-NaN] = -NaN;"
-                 "for (i in a) { s += i +':'+ a[i] +',' } s"),
-      nxt_string("0:0,1:1,2:2,null:null,undefined:defined,false:false,"
-                 "true:true,Infinity:Infinity,-Infinity:-Infinity,NaN:NaN,") },
-
-    { nxt_string("--[][3e9]"),
-      nxt_string("MemoryError") },
-
-    { nxt_string("[].length"),
-      nxt_string("0") },
-
-    { nxt_string("[1,2].length"),
-      nxt_string("2") },
-
-    { nxt_string("var a = [1,2]; a.length"),
-      nxt_string("2") },
-
-    { nxt_string("[\n1]"),
-      nxt_string("1") },
-
-    { nxt_string("\n[\n1\n]"),
-      nxt_string("1") },
-
-    { nxt_string("\n[\n1\n,\n2]\n[\n0]"),
-      nxt_string("1") },
-
-    { nxt_string("Object.create([1,2]).length"),
-      nxt_string("2") },
-
-    { nxt_string("Object.create(['α','β'])[1]"),
-      nxt_string("β") },
-
-    { nxt_string("Object.create(['α','β'])[false]"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = ['abc']; var o = Object.create(a); o[0] = 32;"
-                 "[a,o[0]]"),
-      nxt_string("abc,32") },
-
-    /* Array.length setter */
-
-    { nxt_string("[].length = {}"),
-      nxt_string("RangeError: Invalid array length") },
-
-    { nxt_string("[].length = 2**32 - 1"),
-      nxt_string("MemoryError") },
-
-    { nxt_string("[].length = 3e9"),
-      nxt_string("MemoryError") },
-
-    { nxt_string("Object.defineProperty([], 'length',{value: 2**32 - 1})"),
-      nxt_string("MemoryError") },
-
-    { nxt_string("[].length = 2**32"),
-      nxt_string("RangeError: Invalid array length") },
-
-    { nxt_string("[].length = 2**32 + 1"),
-      nxt_string("RangeError: Invalid array length") },
-
-    { nxt_string("[].length = -1"),
-      nxt_string("RangeError: Invalid array length") },
-
-    { nxt_string("var a = [1];"
-                 "typeof (a.length = '') == 'string' && a.length == 0"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [1]; "
-                 "typeof (a.length = Object(2)) == 'object' && a.length == 2"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [1]; "
-                 "typeof (a.length = Object('2')) == 'object'"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [1]; "
-                 "a.length = { valueOf: () => 2 }; a.length == 2"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [1]; "
-                 "a.length = { toString: () => '2' }; a.length == 2"),
-      nxt_string("true") },
-
-    { nxt_string("var a = []; a.length = 0; JSON.stringify(a)"),
-      nxt_string("[]") },
-
-    { nxt_string("var a = []; a.length = 1; JSON.stringify(a)"),
-      nxt_string("[null]") },
-
-    { nxt_string("var a = [1]; a.length = 1; JSON.stringify(a)"),
-      nxt_string("[1]") },
-
-    { nxt_string("var a = [1]; a.length = 2; JSON.stringify(a)"),
-      nxt_string("[1,null]") },
-
-    { nxt_string("var a = [1]; a.length = 4; a.length = 0; JSON.stringify(a)"),
-      nxt_string("[]") },
-
-    { nxt_string("var a = [1,2,3]; a.length = 2; JSON.stringify(a)"),
-      nxt_string("[1,2]") },
-
-    { nxt_string("var a = [1,2,3]; a.length = 3; a"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("var a = [1,2,3]; a.length = 16; a"),
-      nxt_string("1,2,3,,,,,,,,,,,,,") },
-
-    { nxt_string("var a = [1,2,3]; a.join()"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("var a = [1,2,3]; a.join(':')"),
-      nxt_string("1:2:3") },
-
-    { nxt_string("var a = []; a[5] = 5; a.join()"),
-      nxt_string(",,,,,5") },
-
-    { nxt_string("var a = [,null,undefined,false,true,0,1]; a.join()"),
-      nxt_string(",,,false,true,0,1") },
-
-    { nxt_string("var o = { toString: function() { return null } };"
-                 "[o].join()"),
-      nxt_string("null") },
-
-    { nxt_string("var o = { toString: function() { return undefined } };"
-                 "[o].join()"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = []; a[5] = 5; a"),
-      nxt_string(",,,,,5") },
-
-    { nxt_string("var a = []; a.concat([])"),
-      nxt_string("") },
-
-    { nxt_string("var s = { toString: function() { return 'S' } };"
-                 "var v = { toString: 8, valueOf: function() { return 'V' } };"
-                 "var o = [9]; o.join = function() { return 'O' };"
-                 "var a = [1,2,3,[4,5,6],s,v,o]; a.join('')"),
-      nxt_string("1234,5,6SVO") },
-
-    { nxt_string("var s = { toString: function() { return 'S' } };"
-                 "var v = { toString: 8, valueOf: function() { return 'V' } };"
-                 "var o = [9]; o.join = function() { return 'O' };"
-                 "var a = [1,2,3,[4,5,6],s,v,o]; a"),
-      nxt_string("1,2,3,4,5,6,S,V,O") },
-
-    /* Array.toString(). */
-
-    { nxt_string("var a = [1,2,3]; a.join = 'NO';"
-                 "Object.prototype.toString = function () { return 'A' }; a"),
-      nxt_string("[object Array]") },
-
-    { nxt_string("Array.prototype.toString.call(1)"),
-      nxt_string("[object Number]") },
-
-    { nxt_string("Array.prototype.toString.call('abc')"),
-      nxt_string("[object String]") },
-
-    /* Empty array elements. */
-
-    { nxt_string("[,,]"),
-      nxt_string(",") },
-
-    { nxt_string("[,,,]"),
-      nxt_string(",,") },
-
-    { nxt_string("[1,2,]"),
-      nxt_string("1,2") },
-
-    { nxt_string("[1,2,,3]"),
-      nxt_string("1,2,,3") },
-
-    { nxt_string("[,,].length"),
-      nxt_string("2") },
-
-    { nxt_string("[,,,].length"),
-      nxt_string("3") },
-
-    { nxt_string("[1,2,,3].length"),
-      nxt_string("4") },
-
-    /**/
-
-    { nxt_string("var n = { toString: function() { return 1 } };   [1,2][n]"),
-      nxt_string("2") },
-
-    { nxt_string("var n = { toString: function() { return '1' } }; [1,2][n]"),
-      nxt_string("2") },
-
-    { nxt_string("var n = { toString: function() { return 1 },"
-                          " valueOf:  function() { return 0 } };   [1,2][n]"),
-      nxt_string("2") },
-
-    { nxt_string("var n = { toString: function() { return 1.5 } };"
-                 "var a = [1,2]; a[1.5] = 5; a[n]"),
-      nxt_string("5") },
-
-    { nxt_string("var n = { toString: function() { return 1.5 } };"
-                 "var a = [1,2]; a[n] = 5; a[1.5]"),
-      nxt_string("5") },
-
-    { nxt_string("var n = { toString: function() { return '1.5' } };"
-                 "var a = [1,2]; a[1.5] = 5; a[n]"),
-      nxt_string("5") },
-
-    { nxt_string("var n = { toString: function() { return '1.5' } };"
-                 "var a = [1,2]; a[n] = 5; a[1.5]"),
-      nxt_string("5") },
-
-    { nxt_string("var n = { toString: function() { return 1.5 } };"
-                 "var a = [1,2]; a[1.5] = 5; n in a"),
-      nxt_string("true") },
-
-    { nxt_string("var n = { toString: function() { return '1.5' } };"
-                 "var a = [1,2]; a[1.5] = 5; '' + (n in a) + (delete a[n])"),
-      nxt_string("truetrue") },
-
-    /**/
-
-    { nxt_string("Array.isArray()"),
-      nxt_string("false") },
-
-    { nxt_string("Array.isArray(1)"),
-      nxt_string("false") },
-
-    { nxt_string("Array.isArray(1) ? 'true' : 'false'"),
-      nxt_string("false") },
-
-    { nxt_string("Array.isArray([])"),
-      nxt_string("true") },
-
-    { nxt_string("Array.isArray([]) ? 'true' : 'false'"),
-      nxt_string("true") },
-
-    { nxt_string("Array.of()"),
-      nxt_string("") },
-
-    { nxt_string("Array.of(1,2,3)"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("Array.of(undefined,1)"),
-      nxt_string(",1") },
-
-    { nxt_string("Array.of(NaN,-1,{})"),
-      nxt_string("NaN,-1,[object Object]") },
-
-    { nxt_string("var a = [1,2,3]; a.concat(4, [5, 6, 7], 8)"),
-      nxt_string("1,2,3,4,5,6,7,8") },
-
-    { nxt_string("var a = []; a[100] = a.length; a[100] +' '+ a.length"),
-      nxt_string("0 101") },
-
-    { nxt_string("var a = [1,2]; a[100] = 100; a[100] +' '+ a.length"),
-      nxt_string("100 101") },
-
-    { nxt_string("Array.prototype.slice(1)"),
-      nxt_string("") },
-
-    { nxt_string("Array.prototype.slice(1,2)"),
-      nxt_string("") },
-
-    { nxt_string("Array.prototype.slice.call(undefined)"),
-      nxt_string("TypeError: cannot convert undefined to object") },
-
-    { nxt_string("Array.prototype.slice.call(1)"),
-      nxt_string("") },
-
-    { nxt_string("Array.prototype.slice.call(false)"),
-      nxt_string("") },
-
-    { nxt_string("Array.prototype.slice.call({'0':'a', '1':'b', length:1})"),
-      nxt_string("a") },
-
-    { nxt_string("Array.prototype.slice.call({'0':'a', '1':'b', length:2})"),
-      nxt_string("a,b") },
-
-    { nxt_string("Array.prototype.slice.call({'0':'a', '1':'b', length:4})"),
-      nxt_string("a,b,,") },
-
-    { nxt_string("Array.prototype.slice.call({'0':'a', '1':'b', length:2}, 1)"),
-      nxt_string("b") },
-
-    { nxt_string("Array.prototype.slice.call({'0':'a', '1':'b', length:2}, 1, 2)"),
-      nxt_string("b") },
-
-    { nxt_string("Array.prototype.slice.call({length:'2'})"),
-      nxt_string(",") },
-
-    { nxt_string("njs.dump(Array.prototype.slice.call({length: 3, 1: undefined }))"),
-      nxt_string("[<empty>,undefined,<empty>]") },
-
-    { nxt_string("Array.prototype.slice.call({length:new Number(3)})"),
-      nxt_string(",,") },
-
-    { nxt_string("Array.prototype.slice.call({length: { valueOf: function() { return 2; } }})"),
-      nxt_string(",") },
-
-    { nxt_string("Array.prototype.slice.call({ length: Object.create(null) })"),
-      nxt_string("TypeError: Cannot convert object to primitive value") },
-
-    { nxt_string("Array.prototype.slice.call({length:-1})"),
-      nxt_string("") },
-
-    { nxt_string("Array.prototype.slice.call('αβZγ')"),
-      nxt_string("α,β,Z,γ") },
-
-    { nxt_string("Array.prototype.slice.call(String.bytesFrom(Array(16).fill(0x9d)))[0].charCodeAt(0)"),
-      nxt_string("157") },
-
-    { nxt_string("Array.prototype.slice.call('αβZγ', 1)"),
-      nxt_string("β,Z,γ") },
-
-    { nxt_string("Array.prototype.slice.call('αβZγ', 2)"),
-      nxt_string("Z,γ") },
-
-    { nxt_string("Array.prototype.slice.call('αβZγ', 3)"),
-      nxt_string("γ") },
-
-    { nxt_string("Array.prototype.slice.call('αβZγ', 4)"),
-      nxt_string("") },
-
-    { nxt_string("Array.prototype.slice.call('αβZγ', 0, 1)"),
-      nxt_string("α") },
-
-    { nxt_string("Array.prototype.slice.call('αβZγ', 1, 2)"),
-      nxt_string("β") },
-
-    { nxt_string("Array.prototype.slice.call('αβZγ').length"),
-      nxt_string("4") },
-
-    { nxt_string("Array.prototype.slice.call('αβZγ')[1].length"),
-      nxt_string("1") },
-
-    { nxt_string("Array.prototype.slice.call(new String('αβZγ'))"),
-      nxt_string("α,β,Z,γ") },
-
-    { nxt_string("1..__proto__.length = '2';"
-                 "Array.prototype.slice.call(1, 0, 2)"),
-      nxt_string(",") },
-
-    { nxt_string("Array.prototype.pop()"),
-      nxt_string("undefined") },
-
-    { nxt_string("Array.prototype.shift()"),
-      nxt_string("undefined") },
-
-    { nxt_string("[0,1].slice()"),
-      nxt_string("0,1") },
-
-    { nxt_string("[0,1].slice(undefined)"),
-      nxt_string("0,1") },
-
-    { nxt_string("[0,1].slice(undefined, undefined)"),
-      nxt_string("0,1") },
-
-    { nxt_string("[0,1,2,3,4].slice(1,4)"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("[0,1,2,3,4].slice(6,7)"),
-      nxt_string("") },
-
-    { nxt_string("var a = [1,2,3,4,5], b = a.slice(3);"
-                 "b[0] +' '+ b[1] +' '+ b[2]"),
-      nxt_string("4 5 undefined") },
-
-    { nxt_string("var a = [1,2]; a.pop() +' '+ a.length +' '+ a"),
-      nxt_string("2 1 1") },
-
-    { nxt_string("var a = [1,2], len = a.push(3); len +' '+ a.pop() +' '+ a"),
-      nxt_string("3 3 1,2") },
-
-    { nxt_string("var a = [1,2], len = a.push(3,4,5);"
-                 "len +' '+ a.pop() +' '+ a"),
-      nxt_string("5 5 1,2,3,4") },
-
-    { nxt_string("var a = [1,2,3]; a.shift() +' '+ a[0] +' '+ a.length"),
-      nxt_string("1 2 2") },
-
-    { nxt_string("var a = [1,2], len = a.unshift(3);"
-                 "len +' '+ a +' '+ a.shift()"),
-      nxt_string("3 3,1,2 3") },
-
-    { nxt_string("var a = [1,2], len = a.unshift(3,4,5);"
-                 "len +' '+ a +' '+ a.shift()"),
-      nxt_string("5 3,4,5,1,2 3") },
-
-    { nxt_string("var a=[0], n = 64; while(--n) {a.push(n); a.shift()}; a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = []; a.splice()"),
-      nxt_string("") },
-
-    { nxt_string("[].splice(0,5,0)"),
-      nxt_string("") },
-
-    { nxt_string("[1,2,3,4,5].splice(-2,3,0)"),
-      nxt_string("4,5") },
-
-    { nxt_string("[].__proto__.splice(0,1,0)"),
-      nxt_string("") },
-
-    { nxt_string("var a = [];"
-                 "a.splice(9,0,1,2).join(':') + '|' + a"),
-      nxt_string("|1,2") },
-
-    { nxt_string("var a = [0,1,2,3,4,5,6,7];"
-                 "a.splice(3).join(':') + '|' + a"),
-      nxt_string("3:4:5:6:7|0,1,2") },
-
-    { nxt_string("var a = [0,1,2,3,4,5,6,7];"
-                 "a.splice(3, 2).join(':') + '|' + a"),
-      nxt_string("3:4|0,1,2,5,6,7") },
-
-    { nxt_string("var a = [0,1,2,3,4,5,6,7];"
-                 "a.splice(3, 2, 8, 9, 10, 11 ).join(':') + '|' + a"),
-      nxt_string("3:4|0,1,2,8,9,10,11,5,6,7") },
-
-    { nxt_string("var a = []; a.reverse()"),
-      nxt_string("") },
-
-    { nxt_string("var a = [1]; a.reverse()"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1,2]; a.reverse()"),
-      nxt_string("2,1") },
-
-    { nxt_string("var a = [1,2,3]; a.reverse()"),
-      nxt_string("3,2,1") },
-
-    { nxt_string("var a = [1,2,3,4]; a.reverse()"),
-      nxt_string("4,3,2,1") },
-
-    { nxt_string("var a = [1,2,3,4]; a.indexOf()"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = [1,2,3,4]; a.indexOf(5)"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = [1,2,3,4]; a.indexOf(4, 3)"),
-      nxt_string("3") },
-
-    { nxt_string("var a = [1,2,3,4]; a.indexOf(4, 4)"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = [1,2,3,4,3,4]; a.indexOf(3, '2')"),
-      nxt_string("2") },
-
-    { nxt_string("var a = [1,2,3,4,3,4]; a.indexOf(4, -1)"),
-      nxt_string("5") },
-
-    { nxt_string("var a = [1,2,3,4,3,4]; a.indexOf(3, -10)"),
-      nxt_string("2") },
-
-    { nxt_string("[].indexOf.bind(0)(0, 0)"),
-      nxt_string("-1") },
-
-    { nxt_string("[].lastIndexOf(1, -1)"),
-      nxt_string("-1") },
-
-    { nxt_string("[undefined].lastIndexOf()"),
-      nxt_string("0") },
-
-    { nxt_string("[undefined].lastIndexOf(undefined)"),
-      nxt_string("0") },
-
-    { nxt_string("var a = [1,2,3,4]; a.lastIndexOf()"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = [1,2,3,4]; a.lastIndexOf(5)"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(1, 0)"),
-      nxt_string("0") },
-
-    { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, '2')"),
-      nxt_string("2") },
-
-    { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(1, 6)"),
-      nxt_string("0") },
-
-    { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(2, 6)"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(4, -1)"),
-      nxt_string("5") },
-
-    { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(4, -6)"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, -10)"),
-      nxt_string("-1") },
-
-    { nxt_string("[1,2,1].lastIndexOf(2,undefined)"),
-      nxt_string("-1") },
-
-    { nxt_string("[1,2,1].lastIndexOf(1,undefined)"),
-      nxt_string("0") },
-
-    { nxt_string("[1,2,1].lastIndexOf(1)"),
-      nxt_string("2") },
-
-    { nxt_string("[1,2,3,4].includes()"),
-      nxt_string("false") },
-
-    { nxt_string("[1,2,3,4].includes(5)"),
-      nxt_string("false") },
-
-    { nxt_string("[1,2,3,4].includes(4, 3)"),
-      nxt_string("true") },
-
-    { nxt_string("[1,2,3,4].includes(4, 4)"),
-      nxt_string("false") },
-
-    { nxt_string("[1,2,3,4,3,4].includes(3, '2')"),
-      nxt_string("true") },
-
-    { nxt_string("[1,2,3,4,3,4].includes(4, -1)"),
-      nxt_string("true") },
-
-    { nxt_string("[1,2,3,4,3,4].includes(3, -10)"),
-      nxt_string("true") },
-
-    { nxt_string("[1,2,3,NaN,3,4].includes(NaN)"),
-      nxt_string("true") },
-
-    { nxt_string("[1,2,3,4,5].includes(NaN)"),
-      nxt_string("false") },
-
-    { nxt_string("[].includes.bind(0)(0, 0)"),
-      nxt_string("false") },
-
-    { nxt_string("var a = []; var s = { sum: 0 };"
-                 "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
-      nxt_string("0") },
-
-    { nxt_string("var a = new Array(3); var s = { sum: 0 };"
-                 "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
-      nxt_string("0") },
-
-    { nxt_string("var a = [,,,]; var s = { sum: 0 };"
-                 "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
-      nxt_string("0") },
-
-    { nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
-                 "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
-      nxt_string("6") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.forEach(function(v, i, a) { a[i+3] = a.length }); a"),
-      nxt_string("1,2,3,3,4,5") },
-
-    { nxt_string("function f() { var c; [1].forEach(function(v) { c })}; f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
-                 "[].forEach.call(a, function(v, i, a) { this.sum += v }, s);"
-                 "s.sum"),
-      nxt_string("6") },
-
-    { nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
-                 "[].forEach.apply(a,"
-                                  "[ function(v, i, a) { this.sum += v }, s ]);"
-                 "s.sum"),
-      nxt_string("6") },
-
-    { nxt_string("var a = []; var c = 0;"
-                 "a.forEach(function(v, i, a) { c++ }); c"),
-      nxt_string("0") },
-
-    { nxt_string("var a = [,,,,]; var c = 0;"
-                 "a.forEach(function(v, i, a) { c++ }); c"),
-      nxt_string("0") },
-
-    { nxt_string("var a = [];"
-                 "a.some(function(v, i, a) { return v > 1 })"),
-      nxt_string("false") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.some(function(v, i, a) { return v > 1 })"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.some(function(v, i, a) { return v > 2 })"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.some(function(v, i, a) { return v > 3 })"),
-      nxt_string("false") },
-
-    { nxt_string("var a = [];"
-                 "a.every(function(v, i, a) { return v > 1 })"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [3,2,1];"
-                 "a.every(function(v, i, a) { return v > 3 })"),
-      nxt_string("false") },
-
-    { nxt_string("var a = [3,2,1];"
-                 "a.every(function(v, i, a) { return v > 2 })"),
-      nxt_string("false") },
-
-    { nxt_string("var a = [3,2,1];"
-                 "a.every(function(v, i, a) { return v > 0 })"),
-      nxt_string("true") },
-
-    { nxt_string("[].fill(1);"),
-      nxt_string("") },
-
-    { nxt_string("[1,2,3].fill(5);"),
-      nxt_string("5,5,5") },
-
-    { nxt_string("[1,2,3].fill(5, 0);"),
-      nxt_string("5,5,5") },
-
-    { nxt_string("[1,2,3].fill(5, 1);"),
-      nxt_string("1,5,5") },
-
-    { nxt_string("[1,2,3].fill(5, 4);"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("[1,2,3].fill(5, -2);"),
-      nxt_string("1,5,5") },
-
-    { nxt_string("[1,2,3].fill(5, -3);"),
-      nxt_string("5,5,5") },
-
-    { nxt_string("[1,2,3].fill(5, -4);"),
-      nxt_string("5,5,5") },
-
-    { nxt_string("[1,2,3].fill(5, 1, 0);"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("[1,2,3].fill(5, 1, 1);"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("[1,2,3].fill(5, 1, 2);"),
-      nxt_string("1,5,3") },
-
-    { nxt_string("[1,2,3].fill(5, 1, 3);"),
-      nxt_string("1,5,5") },
-
-    { nxt_string("[1,2,3].fill(5, 1, 4);"),
-      nxt_string("1,5,5") },
-
-    { nxt_string("[1,2,3].fill(5, 1, -1);"),
-      nxt_string("1,5,3") },
-
-    { nxt_string("[1,2,3].fill(5, 1, -3);"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("[1,2,3].fill(5, 1, -4);"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("[1,2,3].fill(\"a\", 1, 2);"),
-      nxt_string("1,a,3") },
-
-    { nxt_string("[1,2,3].fill({a:\"b\"}, 1, 2);"),
-      nxt_string("1,[object Object],3") },
-
-    { nxt_string("Array(3).fill().reduce(function(a, x)"
-                                 "{ return a + (x === undefined); }, 0)"),
-      nxt_string("3") },
-
-    { nxt_string("var a = Array.prototype.fill.apply("
-                 "Object({length: 40}), [\"a\", 1, 20]); Object.values(a)"),
-      nxt_string("a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,40,a,a,a,a") },
-
-    { nxt_string("var a = Array.prototype.fill.apply({length: "
-                 "{ valueOf: function() { return 40 }}}, [\"a\", 1, 20]);"
-                 "Object.values(a)"),
-      nxt_string("a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,[object Object],a,a,a,a") },
-
-    { nxt_string("[NaN, false, ''].map("
-                 "(x) => Array.prototype.fill.call(x)"
-                 ").every((x) => typeof x == 'object')"),
-      nxt_string("true") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'length', {get:()=>2}); "
-                 "Array.prototype.slice.call(Array.prototype.fill.call(o, 1))"),
-      nxt_string("1,1") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'length', {get:()=> {throw TypeError('Boom')}}); "
-                 "Array.prototype.fill.call(o, 1)"),
-      nxt_string("TypeError: Boom") },
-
-    { nxt_string("var o = Object({length: 3});"
-                 "Object.defineProperty(o, '0', {set: ()=>{throw TypeError('Boom')}});"
-                 "Array.prototype.fill.call(o, 1)"),
-      nxt_string("TypeError: Boom") },
-
-    { nxt_string("var o = Object({length: 3});"
-                 "Object.defineProperty(o, '0', {set: function(v){this.a = 2 * v}});"
-                 "Array.prototype.fill.call(o, 2).a"),
-      nxt_string("4") },
-
-    { nxt_string("var o = Object({length: 3});"
-                 "Object.defineProperty(o, '0', {set: function(v){this[0] = 2 * v}});"
-                 "Array.prototype.fill.call(o, 2)"),
-      nxt_string("RangeError: Maximum call stack size exceeded") },
-
-    { nxt_string("var a = [];"
-                 "a.filter(function(v, i, a) { return v > 1 })"),
-      nxt_string("") },
-
-    { nxt_string("var a = [1,2,3,-1,5];"
-                 "a.filter(function(v, i, a) { return v > 1 })"),
-      nxt_string("2,3,5") },
-
-    { nxt_string("var a = [1,2,3,4,5,6,7,8];"
-                 "a.filter(function(v, i, a) { a.pop(); return v > 1 })"),
-      nxt_string("2,3,4") },
-
-    { nxt_string("var a = [1,2,3,4,5,6,7,8];"
-                 "a.filter(function(v, i, a) { a.shift(); return v > 1 })"),
-      nxt_string("3,5,7") },
-
-    { nxt_string("var a = [1,2,3,4,5,6,7];"
-                 "a.filter(function(v, i, a) { a.pop(); return v > 1 })"),
-      nxt_string("2,3,4") },
-
-    { nxt_string("var a = [1,2,3,4,5,6,7];"
-                 "a.filter(function(v, i, a) { a.shift(); return v > 1 })"),
-      nxt_string("3,5,7") },
-
-    { nxt_string("var a = [1,2,3,4,5,6,7];"
-                 "a.filter(function(v, i, a) { a[i] = v + 1; return true })"),
-      nxt_string("1,2,3,4,5,6,7") },
-
-    { nxt_string("var a = [1,2,3,4,5,6,7];"
-                 "a.filter(function(v, i, a) { a[i+1] = v+10; return true })"),
-      nxt_string("1,11,21,31,41,51,61") },
-
-    { nxt_string("var a = [];"
-                 "a.find(function(v, i, a) { return v > 1 })"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [,NaN,0,-1];"
-                 "a.find(function(v, i, a) { return v > 1 })"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [,NaN,0,-1,2];"
-                 "a.find(function(v, i, a) { return v > 1 })"),
-      nxt_string("2") },
-
-    { nxt_string("var a = [1,2,3,-1,5];"
-                 "a.find(function(v, i, a) { return v > 1 })"),
-      nxt_string("2") },
-
-    { nxt_string("var a = [,1,,-1,5];"
-                 "a.find(function(v, i, a) { return v > 1 })"),
-      nxt_string("5") },
-
-    { nxt_string("var a = [,1,,-1,5,6];"
-                 "a.find(function(v, i, a) { return v > 1 })"),
-      nxt_string("5") },
-
-    { nxt_string("[].find(function(v) { return (v === undefined) })"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [,3];"
-                 "a.find(function(v) { return (v === 3 || v === undefined) })"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [1,,3];"
-                 "a.find(function(v) { return (v === 3 || v === undefined) })"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [1,2,3,4,5,6];"
-                 "a.find(function(v, i, a) { a.shift(); return v == 3 })"),
-      nxt_string("3") },
-
-    { nxt_string("var a = [1,2,3,4,5,6];"
-                 "a.find(function(v, i, a) { a.shift(); return v == 4 })"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = [];"
-                 "a.findIndex(function(v, i, a) { return v > 1 })"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = [,NaN,0,-1];"
-                 "a.findIndex(function(v, i, a) { return v > 1 })"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = [,NaN,0,-1,2];"
-                 "a.findIndex(function(v, i, a) { return v > 1 })"),
-     nxt_string("4") },
-
-    { nxt_string("var a = [1,2,3,-1,5];"
-                 "a.findIndex(function(v, i, a) { return v > 1 })"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [,1,,-1,5];"
-                 "a.findIndex(function(v, i, a) { return v > 1 })"),
-      nxt_string("4") },
-
-    { nxt_string("var a = [,1,,-1,5,6];"
-                 "a.findIndex(function(v, i, a) { return v > 1 })"),
-      nxt_string("4") },
-
-    { nxt_string("[].findIndex(function(v) { return (v === undefined) })"),
-      nxt_string("-1") },
-
-    { nxt_string("[,].findIndex(function(v) { return (v === undefined) })"),
-      nxt_string("0") },
-
-    { nxt_string("[1,2,,3].findIndex(function(el){return el === undefined})"),
-      nxt_string("2") },
-
-    { nxt_string("[,2,,3].findIndex(function(el){return el === undefined})"),
-      nxt_string("0") },
-
-    { nxt_string("var a = [1,2,3,4,5,6];"
-                 "a.findIndex(function(v, i, a) { a.shift(); return v == 3 })"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1,2,3,4,5,6];"
-                 "a.findIndex(function(v, i, a) { a.shift(); return v == 4 })"),
-      nxt_string("-1") },
-
-    { nxt_string("var a = [];"
-                 "a.map(function(v, i, a) { return v + 1 })"),
-      nxt_string("") },
-
-    { nxt_string("var a = [,,,];"
-                 "a.map(function(v, i, a) { return v + 1 })"),
-      nxt_string(",,") },
-
-    { nxt_string("var a = [,,,1];"
-                 "a.map(function(v, i, a) { return v + 1 })"),
-      nxt_string(",,,2") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.map(function(v, i, a) { return v + 1 })"),
-      nxt_string("2,3,4") },
-
-    { nxt_string("var a = [1,2,3,4,5,6];"
-                 "a.map(function(v, i, a) { a.pop(); return v + 1 })"),
-      nxt_string("2,3,4,,,") },
-
-    { nxt_string("var a = [1,2,3,4,5,6];"
-                 "a.map(function(v, i, a) { a.shift(); return v + 1 })"),
-      nxt_string("2,4,6,,,") },
-
-    { nxt_string("var a = [];"
-                 "a.reduce(function(p, v, i, a) { return p + v })"),
-      nxt_string("TypeError: invalid index") },
-
-    { nxt_string("var a = [];"
-                 "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
-      nxt_string("10") },
-
-    { nxt_string("var a = [,,];"
-                 "a.reduce(function(p, v, i, a) { return p + v })"),
-      nxt_string("TypeError: invalid index") },
-
-    { nxt_string("var a = [,,];"
-                 "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
-      nxt_string("10") },
-
-    { nxt_string("var a = [1];"
-                 "a.reduce(function(p, v, i, a) { return p + v })"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1];"
-                 "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
-      nxt_string("11") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.reduce(function(p, v, i, a) { return p + v })"),
-      nxt_string("6") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
-      nxt_string("16") },
-
-    { nxt_string("[[0, 1], [2, 3], [4, 5]].reduce(function(a, b)"
-                 "                         { return a.concat(b) }, [])"),
-      nxt_string("0,1,2,3,4,5") },
-
-    { nxt_string("var a = [];"
-                 "a.reduceRight(function(p, v, i, a) { return p + v })"),
-      nxt_string("TypeError: invalid index") },
-
-    { nxt_string("var a = [];"
-                 "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
-      nxt_string("10") },
-
-    { nxt_string("var a = [,,];"
-                 "a.reduceRight(function(p, v, i, a) { return p + v })"),
-      nxt_string("TypeError: invalid index") },
-
-    { nxt_string("var a = [,,];"
-                 "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
-      nxt_string("10") },
-
-    { nxt_string("var a = [1];"
-                 "a.reduceRight(function(p, v, i, a) { return p + v })"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1];"
-                 "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
-      nxt_string("11") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.reduceRight(function(p, v, i, a) { return p + v })"),
-      nxt_string("6") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
-      nxt_string("16") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.reduceRight(function(p, v, i, a)"
-                 "              { a.shift(); return p + v })"),
-      nxt_string("7") },
-
-    { nxt_string("var a = [1,2,3];"
-                 "a.reduceRight(function(p, v, i, a)"
-                 "              { a.shift(); return p + v }, 10)"),
-      nxt_string("19") },
-
-    { nxt_string("var a = ['1','2','3','4','5','6']; a.sort()"),
-      nxt_string("1,2,3,4,5,6") },
-
-    { nxt_string("var o = { toString: function() { return 5 } };"
-                 "var a = [6,o,4,3,2,1]; a.sort()"),
-      nxt_string("1,2,3,4,5,6") },
-
-    { nxt_string("var a = [1,2,3,4,5,6];"
-                 "a.sort(function(x, y) { return x - y })"),
-      nxt_string("1,2,3,4,5,6") },
-
-    { nxt_string("var a = [6,5,4,3,2,1];"
-                 "a.sort(function(x, y) { return x - y })"),
-      nxt_string("1,2,3,4,5,6") },
-
-    { nxt_string("var a = [2,2,2,1,1,1];"
-                 "a.sort(function(x, y) { return x - y })"),
-      nxt_string("1,1,1,2,2,2") },
-
-    { nxt_string("var a = [,,,2,2,2,1,1,1];"
-                 "a.sort(function(x, y) { return x - y })"),
-      nxt_string("1,1,1,2,2,2,,,") },
-
-    { nxt_string("var a = [,,,,];"
-                 "a.sort(function(x, y) { return x - y })"),
-      nxt_string(",,,") },
-
-    { nxt_string("var a = [1,,];"
-                 "a.sort(function(x, y) { return x - y })"),
-      nxt_string("1,") },
-
-    /* Template literal. */
-
-    { nxt_string("`"),
-      nxt_string("SyntaxError: Unterminated template literal in 1") },
-
-    { nxt_string("`$"),
-      nxt_string("SyntaxError: Unterminated template literal in 1") },
-
-    { nxt_string("`${"),
-      nxt_string("SyntaxError: Unexpected end of input in 1") },
-
-    { nxt_string("`${a"),
-      nxt_string("SyntaxError: Missing \"}\" in template expression in 1") },
-
-    { nxt_string("`${}"),
-      nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
-    { nxt_string("`${a}"),
-      nxt_string("SyntaxError: Unterminated template literal in 1") },
-
-    { nxt_string("`${a}bc"),
-      nxt_string("SyntaxError: Unterminated template literal in 1") },
-
-    { nxt_string("`\\"),
-      nxt_string("SyntaxError: Unterminated template literal in 1") },
-
-    { nxt_string("`\\${a}bc"),
-      nxt_string("SyntaxError: Unterminated template literal in 1") },
-
-    { nxt_string("`text1\ntext2`;"),
-      nxt_string("text1\ntext2") },
-
-    { nxt_string("var o = 1; `o = \\`${o}\\``"),
-      nxt_string("o = `1`") },
-
-    { nxt_string("`\\unicode`"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\unicode\" in 1") },
-
-    { nxt_string("var a = 5; var b = 10;"
-                 "`Fifteen is ${a + b} and \nnot ${2 * a + b}.`;"),
-      nxt_string("Fifteen is 15 and \nnot 20.") },
-
-    { nxt_string("var s = `1undefined`; s;"),
-      nxt_string("1undefined") },
-
-    { nxt_string("var s = '0'; s = `x${s += '1'}`;"),
-      nxt_string("x01") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
-                 "var something = 'test'; var one = 1; var two = 2;"
-                 "`[${d.toISOString()}] the message contents ${something} ${one + two}`"),
-      nxt_string("[2011-06-24T18:45:12.625Z] the message contents test 3") },
-
-    { nxt_string("function isLargeScreen() { return false; }"
-                 "var item = { isCollapsed: true };"
-                 "`header ${ isLargeScreen() ? '' : `icon-${item.isCollapsed ? 'expander' : 'collapser'}` }`;"),
-      nxt_string("header icon-expander") },
-
-    { nxt_string("function foo(strings, person, age) { return `${strings[0]}${strings[1]}${person}${age}` };"
-                 "var person = 'Mike'; var age = 21;"
-                 "foo`That ${person} is a ${age}`;"),
-      nxt_string("That  is a Mike21") },
-
-    /* Strings. */
-
-    { nxt_string("var a = '0123456789' + '012345';"
-                 "var b = 'abcdefghij' + 'klmnop';"
-                 "    a = b"),
-      nxt_string("abcdefghijklmnop") },
-
-    { nxt_string("String.prototype.my = function f() {return 7}; 'a'.my()"),
-      nxt_string("7") },
-
-    { nxt_string("'a'.my"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = '123'\n[2].toString();a"),
-      nxt_string("3") },
-
-    { nxt_string("'\xE5\x96\x9C\xE3\x81\xB6'"),
-      nxt_string("喜ぶ") },
-
-    /* Broken UTF-8 literals.*/
-
-    { nxt_string("'\x96\xE5\x9C\xE3\x81\xB6'"),
-      nxt_string("��ぶ") },
-
-    { nxt_string("'\x96\xE5\x9C'"),
-      nxt_string("��") },
-
-    { nxt_string("'\x96\xE5'"),
-      nxt_string("��") },
-
-    { nxt_string("'\x96'"),
-      nxt_string("�") },
-
-    { nxt_string("'\xF3'"),
-      nxt_string("�") },
-
-    { nxt_string("'\xF3\xFF'"),
-      nxt_string("��") },
-
-    { nxt_string("'\x96\x96\xE5\x9C\xE3\x81\xB6'"),
-      nxt_string("���ぶ") },
-
-    { nxt_string("'\x9C\x96\xE5\xE3\x81\xB6'"),
-      nxt_string("���ぶ") },
-
-    { nxt_string("'\xE5\x9C\xE3\x81\xB6'"),
-      nxt_string("�ぶ") },
-
-    { nxt_string("'\xEF\xBF\xBD\xE3\x81\xB6'"),
-      nxt_string("�ぶ") },
-
-    { nxt_string("'\xE5\xF6\x9C\xE3\x81\xB6'"),
-      nxt_string("���ぶ") },
-
-    { nxt_string("var a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xF3'; "
-                 "[a.length, a[33], a[34]]"),
-      nxt_string("35,a,�") },
-
-    /* Escape strings. */
-
-    { nxt_string("'\\a \\' \\\" \\\\ \\0 \\b \\f \\n \\r \\t \\v'"),
-      nxt_string("a ' \" \\ \0 \b \f \n \r \t \v") },
-
-    { nxt_string("'\\\n'"),
-      nxt_string("") },
-
-    { nxt_string("'\\\r'"),
-      nxt_string("") },
-
-    { nxt_string("'\\\r\n'"),
-      nxt_string("") },
-
-    { nxt_string("'a\\\nb'"),
-      nxt_string("ab") },
-
-    { nxt_string("'a\\\rb'"),
-      nxt_string("ab") },
-
-    { nxt_string("'a\\\r\nb'"),
-      nxt_string("ab") },
-
-    { nxt_string("'a\\\n\rb'"),
-      nxt_string("SyntaxError: Unterminated string \"'a\\\n\r\" in 1") },
-
-    { nxt_string("'a\\\nb\nc'"),
-      nxt_string("SyntaxError: Unterminated string \"'a\\\nb\n\" in 1") },
-
-    { nxt_string("'abcde"),
-      nxt_string("SyntaxError: Unterminated string \"'abcde\" in 1") },
-
-    { nxt_string("'\\"),
-      nxt_string("SyntaxError: Unterminated string \"'\\\" in 1") },
-
-    { nxt_string("'\\\r\n"),
-      nxt_string("SyntaxError: Unterminated string \"'\\\r\n\" in 1") },
-
-    { nxt_string("'\\'"),
-      nxt_string("SyntaxError: Unterminated string \"'\\'\" in 1") },
-
-    { nxt_string("'a\n"),
-      nxt_string("SyntaxError: Unterminated string \"'a\n\" in 1") },
-
-    { nxt_string("'a\r"),
-      nxt_string("SyntaxError: Unterminated string \"'a\r\" in 1") },
-
-    { nxt_string("\"a\n"),
-      nxt_string("SyntaxError: Unterminated string \"\"a\n\" in 1") },
-
-    { nxt_string("'\\u03B1'"),
-      nxt_string("α") },
-
-    { nxt_string("'\\u'"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
-
-    { nxt_string("'\\uzzzz'"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\uzzzz\" in 1") },
-
-    { nxt_string("'\\u03B'"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\u03B\" in 1") },
-
-    { nxt_string("'\\u03BG'"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\u03BG\" in 1") },
-
-    { nxt_string("'\\u03B '"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\u03B \" in 1") },
-
-    { nxt_string("'\\u{61}\\u{3B1}\\u{20AC}'"),
-      nxt_string("aα€") },
-
-    { nxt_string("'\\u'"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
-
-    { nxt_string("'\\u{'"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\u{\" in 1") },
-
-    { nxt_string("'\\u{}'"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\u{}\" in 1") },
-
-    { nxt_string("'\\u{1234567}'"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\u{1234567}\" in 1") },
-
-    { nxt_string("'\\u{a00000}'"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\u{a00000}\" in 1") },
-
-    { nxt_string("'\\x61'"),
-      nxt_string("a") },
-
-    { nxt_string("''.length"),
-      nxt_string("0") },
-
-    { nxt_string("'abc'.length"),
-      nxt_string("3") },
-
-    { nxt_string("'привет\\n'.length"),
-      nxt_string("7") },
-
-    { nxt_string("'привет\\n\\u{61}\\u{3B1}\\u{20AC}'.length"),
-      nxt_string("10") },
-
-    { nxt_string("'\\ud83d\\udc4d'"),
-      nxt_string("\xf0\x9f\x91\x8d") },
-
-    { nxt_string("'\\ud83d\\udc4d'.length"),
-      nxt_string("1") },
-
-    { nxt_string("'\\ud83d abc \\udc4d'"),
-      nxt_string("� abc �") },
-
-    { nxt_string("'\\ud83d'"),
-      nxt_string("�") },
-
-    { nxt_string("'\\ud83d\\uabcd'"),
-      nxt_string("�ꯍ") },
-
-    { nxt_string("'\\u{d800}\\u{dB00}'"),
-      nxt_string("��") },
-
-    { nxt_string("'\\u{d800}\\u{d7ff}'"),
-      nxt_string("�퟿") },
-
-    { nxt_string("'\\u{d800}['"),
-      nxt_string("�[") },
-
-    { nxt_string("'\\u{D800}\\u{'"),
-      nxt_string("SyntaxError: Invalid Unicode code point \"\\u{D800}\\u{\" in 1") },
-
-    { nxt_string("'α' !== '\\α'"),
-      nxt_string("false") },
-
-    { nxt_string("'r' !== '\\r'"),
-      nxt_string("true") },
-
-    /* Broken UTF-8 literals.*/
-
-    { nxt_string("'\\a\x96\xE5\x9C\xE3\x81\xB6'"),
-      nxt_string("a��ぶ") },
-
-    { nxt_string("'\x96\\a\xE5\x9C'"),
-      nxt_string("�a�") },
-
-    { nxt_string("'\x96\xE5\\a'"),
-      nxt_string("��a") },
-
-    { nxt_string("'\\a\x96\\a'"),
-      nxt_string("a�a") },
-
-    { nxt_string("'\xF3\\a'"),
-      nxt_string("�a") },
-
-    { nxt_string("'\xF3\\a\xFF'"),
-      nxt_string("�a�") },
-
-    { nxt_string("'\\a\x96\x96\xE5\x9C\xE3\x81\xB6'"),
-      nxt_string("a���ぶ") },
-
-    { nxt_string("'\\a\x9C\x96\xE5\xE3\x81\xB6'"),
-      nxt_string("a���ぶ") },
-
-    { nxt_string("'\\a\xE5\x9C\xE3\x81\xB6'"),
-      nxt_string("a�ぶ") },
-
-    { nxt_string("'\\a\xEF\xBF\xBD\xE3\x81\xB6'"),
-      nxt_string("a�ぶ") },
-
-    { nxt_string("'\\a\xE5\xF6\x9C\xE3\x81\xB6'"),
-      nxt_string("a���ぶ") },
-
-    { nxt_string("var a = '\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xF3'; "
-                 "[a.length, a[34], a[35]]"),
-      nxt_string("36,a,�") },
-
-    { nxt_string("''.hasOwnProperty('length')"),
-      nxt_string("true") },
-
-    { nxt_string("'abc'.hasOwnProperty('length')"),
-      nxt_string("true") },
-
-    { nxt_string("(new String('abc')).hasOwnProperty('length')"),
-      nxt_string("true") },
-
-    { nxt_string("'abc'.toUTF8().length"),
-      nxt_string("3") },
-
-    { nxt_string("'абв'.length"),
-      nxt_string("3") },
-
-    { nxt_string("'абв'.toUTF8().length"),
-      nxt_string("6") },
-
-    { nxt_string("'αβγ'.length"),
-      nxt_string("3") },
-
-    { nxt_string("'αβγ'.toUTF8().length"),
-      nxt_string("6") },
-
-    { nxt_string("'絵文字'.length"),
-      nxt_string("3") },
-
-    { nxt_string("'絵文字'.toUTF8().length"),
-      nxt_string("9") },
-
-    { nxt_string("'えもじ'.length"),
-      nxt_string("3") },
-
-    { nxt_string("'えもじ'.toUTF8().length"),
-      nxt_string("9") },
-
-    { nxt_string("'囲碁織'.length"),
-      nxt_string("3") },
-
-    { nxt_string("'囲碁織'.toUTF8().length"),
-      nxt_string("9") },
-
-    { nxt_string("var a = 'abc'; a.length"),
-      nxt_string("3") },
-
-    { nxt_string("var a = 'abc'; a['length']"),
-      nxt_string("3") },
-
-    { nxt_string("var a = 'абв'; a.length"),
-      nxt_string("3") },
-
-    { nxt_string("var a = 'abc' + 'абв'; a.length"),
-      nxt_string("6") },
-
-    { nxt_string("var a = 'abc' + 1 + 'абв'; a +' '+ a.length"),
-      nxt_string("abc1абв 7") },
-
-    { nxt_string("var a = 1; a.length"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = 'abc'; a.concat('абв', 123)"),
-      nxt_string("abcабв123") },
-
-    { nxt_string("''.concat.call(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)"),
-      nxt_string("0123456789") },
-
-    { nxt_string("''.concat.apply(0, [1, 2, 3, 4, 5, 6, 7, 8, 9])"),
-      nxt_string("0123456789") },
-
-    { nxt_string("var f = ''.concat.bind(0, 1, 2, 3, 4); f(5, 6, 7, 8, 9)"),
-      nxt_string("0123456789") },
-
-    { nxt_string("var f = ''.concat.bind(0, 1, 2, 3, 4); f(Math.sqrt(25))"),
-      nxt_string("012345") },
-
-    { nxt_string("var f = String.prototype.concat.bind(0, 1); f(2)"),
-      nxt_string("012") },
-
-    { nxt_string("var f = Function.prototype.call.bind"
-                 "                            (String.prototype.concat, 0, 1);"
-                 "f(2)"),
-      nxt_string("012") },
-
-    { nxt_string("var f = String.prototype.concat.bind(0, 1);"
-                 "var o = { toString: f }; o"),
-      nxt_string("01") },
-
-    { nxt_string("''.concat.bind(0, 1, 2, 3, 4).call(5, 6, 7, 8, 9)"),
-      nxt_string("012346789") },
-
-    { nxt_string("''.concat.bind(0, 1, 2, 3, 4).apply(5,[6, 7, 8, 9])"),
-      nxt_string("012346789") },
-
-    { nxt_string("var f = Array.prototype.join.bind([0, 1, 2]); f()"),
-      nxt_string("0,1,2") },
-
-    { nxt_string("var f = Array.prototype.join.bind([0, 1, 2]);"
-                 "var o = { toString: f }; o"),
-      nxt_string("0,1,2") },
-
-    { nxt_string("var f = Array.prototype.join.bind([0, 1, 2]); f('.')"),
-      nxt_string("0.1.2") },
-
-    { nxt_string("var f = Array.prototype.join.bind([0, 1, 2], '.');"
-                 "var o = { toString: f }; o"),
-      nxt_string("0.1.2") },
-
-    { nxt_string("var f = Array.prototype.toString.bind([0, 1, 2]); f()"),
-      nxt_string("0,1,2") },
-
-    { nxt_string("var f = Array.prototype.toString.bind([0, 1, 2]);"
-                 "var o = { toString: f }; o"),
-      nxt_string("0,1,2") },
-
-    { nxt_string("var s = { toString: function() { return '123' } };"
-                 "var a = 'abc'; a.concat('абв', s)"),
-      nxt_string("abcабв123") },
-
-    { nxt_string("'\\u00CE\\u00B1'.toBytes() == 'α'"),
-      nxt_string("true") },
-
-    { nxt_string("'\\u00CE\\u00B1'.toBytes() === 'α'"),
-      nxt_string("true") },
-
-    { nxt_string("var b = '\\u00C2\\u00B6'.toBytes(), u = b.fromUTF8();"
-                 "b.length +' '+ b +' '+ u.length +' '+ u"),
-      nxt_string("2 ¶ 1 ¶") },
-
-    { nxt_string("'α'.toBytes()"),
-      nxt_string("null") },
-
-    { nxt_string("'α'.toUTF8()[0]"),
-      nxt_string("\xCE") },
-
-    { nxt_string("var r = /^\\x80$/; r.source + r.source.length"),
-      nxt_string("^\\x80$6") },
-
-    { nxt_string("var r = /^\\\\x80$/; r.source + r.source.length"),
-      nxt_string("^\\\\x80$7") },
-
-    { nxt_string("/^\\x80$/.test('\\x80'.toBytes())"),
-      nxt_string("true") },
-
-    { nxt_string("/^\\xC2\\x80$/.test('\\x80'.toUTF8())"),
-      nxt_string("true") },
-
-    { nxt_string("'α'.toUTF8().toBytes()"),
-      nxt_string("α") },
-
-    { nxt_string("var a = 'a'.toBytes() + 'α'; a + a.length"),
-      nxt_string("aα3") },
-
-    { nxt_string("var a = 'µ§±®'.toBytes(); a"),
-      nxt_string("\xB5\xA7\xB1\xAE") },
-
-    { nxt_string("var a = 'µ§±®'.toBytes(2); a"),
-      nxt_string("\xB1\xAE") },
-
-    { nxt_string("var a = 'µ§±®'.toBytes(1,3); a"),
-      nxt_string("\xA7\xB1") },
-
-    { nxt_string("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes()"),
-      nxt_string("µ§±®") },
-
-    { nxt_string("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(2)"),
-      nxt_string("±®") },
-
-    { nxt_string("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(1, 3)"),
-      nxt_string("§±") },
-
-    { nxt_string("'A'.repeat(8).toBytes() === 'A'.repeat(8)"),
-      nxt_string("true") },
-
-    { nxt_string("'A'.repeat(16).toBytes() === 'A'.repeat(16)"),
-      nxt_string("true") },
-
-    { nxt_string("'A'.repeat(38).toBytes(-5) === 'AAAAA'"),
-      nxt_string("true") },
-
-    { nxt_string("('α' + 'A'.repeat(32)).toBytes()"),
-      nxt_string("null") },
-
-    { nxt_string("('α' + 'A'.repeat(32)).toBytes(1) === 'A'.repeat(32)"),
-      nxt_string("true") },
-
-    { nxt_string("('α' + 'A'.repeat(40)).toBytes(-3,-1)"),
-      nxt_string("AA") },
-
-    { nxt_string("var s = 'x'.repeat(2**10).repeat(2**14);"
-                 "var a = Array(200).fill(s);"
-                 "String.prototype.concat.apply(s, a.slice(1))"),
-      nxt_string("RangeError: invalid string length") },
-
-    { nxt_string("var a = 'abcdefgh'; a.substr(3, 15)"),
-      nxt_string("defgh") },
-
-    { nxt_string("'abcdefgh'.substr(3, 15)"),
-      nxt_string("defgh") },
-
-    { nxt_string("'abcdefghijklmno'.substr(3, 4)"),
-      nxt_string("defg") },
-
-    { nxt_string("'abcdefghijklmno'.substr(-3, 2)"),
-      nxt_string("mn") },
-
-    { nxt_string("'abcdefgh'.substr(100, 120)"),
-      nxt_string("") },
-
-    { nxt_string("('abc' + 'defgh').substr(1, 4)"),
-      nxt_string("bcde") },
-
-    { nxt_string("'abcdefghijklmno'.substring(3, 5)"),
-      nxt_string("de") },
-
-    { nxt_string("'abcdefgh'.substring(3)"),
-      nxt_string("defgh") },
-
-    { nxt_string("'abcdefgh'.substring(5, 3)"),
-      nxt_string("de") },
-
-    { nxt_string("'abcdefgh'.substring(100, 120)"),
-      nxt_string("") },
-
-    { nxt_string("'α'.repeat(32).substring(32)"),
-      nxt_string("") },
-
-    { nxt_string("'α'.repeat(32).substring(32,32)"),
-      nxt_string("") },
-
-    { nxt_string("'abcdefghijklmno'.slice(NaN, 5)"),
-      nxt_string("abcde") },
-
-    { nxt_string("'abcdefghijklmno'.slice(NaN, Infinity)"),
-      nxt_string("abcdefghijklmno") },
-
-    { nxt_string("'abcdefghijklmno'.slice(-Infinity, Infinity)"),
-      nxt_string("abcdefghijklmno") },
-
-    { nxt_string("'abcdefghijklmno'.slice('0', '5')"),
-      nxt_string("abcde") },
-
-    { nxt_string("'abcdefghijklmno'.slice(3, 5)"),
-      nxt_string("de") },
-
-    { nxt_string("'abcdefgh'.slice(3)"),
-      nxt_string("defgh") },
-
-    { nxt_string("'abcdefgh'.slice(undefined, undefined)"),
-      nxt_string("abcdefgh") },
-
-    { nxt_string("'abcdefgh'.slice(undefined)"),
-      nxt_string("abcdefgh") },
-
-    { nxt_string("'abcdefgh'.slice(undefined, 1)"),
-      nxt_string("a") },
-
-    { nxt_string("'abcdefgh'.slice(3, undefined)"),
-      nxt_string("defgh") },
-
-    { nxt_string("'abcde'.slice(50)"),
-      nxt_string("") },
-
-    { nxt_string("'abcde'.slice(1, 50)"),
-      nxt_string("bcde") },
-
-    { nxt_string("'abcdefgh'.slice(3, -2)"),
-      nxt_string("def") },
-
-    { nxt_string("'abcdefgh'.slice(5, 3)"),
-      nxt_string("") },
-
-    { nxt_string("'abcdefgh'.slice(100, 120)"),
-      nxt_string("") },
-
-    { nxt_string("String.prototype.substring(1, 5)"),
-      nxt_string("") },
-
-    { nxt_string("String.prototype.substr.call({toString:()=>{throw new Error('Oops')}})"),
-      nxt_string("Error: Oops") },
-
-    { nxt_string("String.prototype.slice(1, 5)"),
-      nxt_string("") },
-
-    { nxt_string("String.prototype.toBytes(1, 5)"),
-      nxt_string("") },
-
-    { nxt_string("'abc'.charAt(1 + 1)"),
-      nxt_string("c") },
-
-    { nxt_string("'abc'.charAt(3)"),
-      nxt_string("") },
-
-    { nxt_string("'abc'.charAt(undefined)"),
-      nxt_string("a") },
-
-    { nxt_string("'abc'.charAt(null)"),
-      nxt_string("a") },
-
-    { nxt_string("'abc'.charAt(false)"),
-      nxt_string("a") },
-
-    { nxt_string("'abc'.charAt(true)"),
-      nxt_string("b") },
-
-    { nxt_string("'abc'.charAt(NaN)"),
-      nxt_string("a") },
-
-    { nxt_string("'abc'.charAt(Infinity)"),
-      nxt_string("") },
-
-    { nxt_string("'abc'.charAt(-Infinity)"),
-      nxt_string("") },
-
-    { nxt_string("var o = { valueOf: function() {return 2} };"
-                 "'abc'.charAt(o)"),
-      nxt_string("c") },
-
-    { nxt_string("var o = { toString: function() {return '2'} };"
-                 "'abc'.charAt(o)"),
-      nxt_string("c") },
-
-    { nxt_string("'abc'.charCodeAt(1 + 1)"),
-      nxt_string("99") },
-
-    { nxt_string("'abc'.charCodeAt(3)"),
-      nxt_string("NaN") },
-
-    { nxt_string("'abc'.charCodeAt(undefined)"),
-      nxt_string("97") },
-
-    { nxt_string("var a = 'abcdef'; a.3"),
-      nxt_string("SyntaxError: Unexpected token \".3\" in 1") },
-
-    { nxt_string("'abcdef'[3]"),
-      nxt_string("d") },
-
-    { nxt_string("'abcdef'[0]"),
-      nxt_string("a") },
-
-    { nxt_string("'abcdef'[-1]"),
-      nxt_string("undefined") },
-
-    { nxt_string("'abcdef'[NaN]"),
-      nxt_string("undefined") },
-
-    { nxt_string("'abcdef'[3.5]"),
-      nxt_string("undefined") },
-
-    { nxt_string("'abcdef'[8]"),
-      nxt_string("undefined") },
-
-    { nxt_string("'abcdef'['1']"),
-      nxt_string("b") },
-
-    { nxt_string("'abcdef'[' 1']"),
-      nxt_string("undefined") },
-
-    { nxt_string("'abcdef'['1 ']"),
-      nxt_string("undefined") },
-
-    { nxt_string("'abcdef'['']"),
-      nxt_string("undefined") },
-
-    { nxt_string("'abcdef'['-']"),
-      nxt_string("undefined") },
-
-    { nxt_string("'abcdef'['-1']"),
-      nxt_string("undefined") },
-
-    { nxt_string("'abcdef'['01']"),
-      nxt_string("undefined") },
-
-    { nxt_string("'abcdef'['0x01']"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = 'abcdef', b = 1 + 2; a[b]"),
-      nxt_string("d") },
-
-    /**/
-
-    { nxt_string("'abc'.toString()"),
-      nxt_string("abc") },
-
-    { nxt_string("''.toString.call('abc')"),
-      nxt_string("abc") },
-
-    { nxt_string("String.prototype.toString.call('abc')"),
-      nxt_string("abc") },
-
-    { nxt_string("String.prototype.toString.call(new String('abc'))"),
-      nxt_string("abc") },
-
-    { nxt_string("String.prototype.toString.call(1)"),
-      nxt_string("TypeError: unexpected value type:number") },
-
-    { nxt_string("'abc'.valueOf()"),
-      nxt_string("abc") },
-
-    /**/
-
-    { nxt_string("var n = { toString: function() { return 1 } };   '12'[n]"),
-      nxt_string("2") },
-
-    { nxt_string("var n = { toString: function() { return '1' } }; '12'[n]"),
-      nxt_string("2") },
-
-    { nxt_string("var n = { toString: function() { return 1 },"
-                          " valueOf:  function() { return 0 } };   '12'[n]"),
-      nxt_string("2") },
-
-    /* Externals. */
-
-    { nxt_string("typeof $r"),
-      nxt_string("external") },
-
-    { nxt_string("var a = $r.uri, s = a.fromUTF8(); s.length +' '+ s"),
-      nxt_string("3 АБВ") },
-
-    { nxt_string("var a = $r.uri, b = $r2.uri, c = $r3.uri; a+b+c"),
-      nxt_string("АБВαβγabc") },
-
-    { nxt_string("var a = $r.uri; $r.uri = $r2.uri; $r2.uri = a; $r2.uri+$r.uri"),
-      nxt_string("АБВαβγ") },
-
-    { nxt_string("var a = $r.uri, s = a.fromUTF8(2); s.length +' '+ s"),
-      nxt_string("2 БВ") },
-
-    { nxt_string("var a = $r.uri, s = a.fromUTF8(2, 4); s.length +' '+ s"),
-      nxt_string("1 Б") },
-
-    { nxt_string("var a = $r.uri; a +' '+ a.length +' '+ a"),
-      nxt_string("АБВ 6 АБВ") },
-
-    { nxt_string("$r.uri = 'αβγ'; var a = $r.uri; a.length +' '+ a"),
-      nxt_string("6 αβγ") },
-
-    { nxt_string("$r.uri.length +' '+ $r.uri"),
-      nxt_string("6 АБВ") },
-
-    { nxt_string("$r.uri = $r.uri.substr(2); $r.uri.length +' '+ $r.uri"),
-      nxt_string("4 БВ") },
-
-    { nxt_string("'' + $r.props.a + $r2.props.a + $r.props.a"),
-      nxt_string("121") },
-
-    { nxt_string("var p1 = $r.props, p2 = $r2.props; '' + p2.a + p1.a"),
-      nxt_string("21") },
-
-    { nxt_string("var p1 = $r.props, p2 = $r2.props; '' + p1.a + p2.a"),
-      nxt_string("12") },
-
-    { nxt_string("var p = $r3.props; p.a = 1"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of external") },
-    { nxt_string("var p = $r3.props; delete p.a"),
-      nxt_string("TypeError: Cannot delete property \"a\" of external") },
-
-    { nxt_string("$r.vars.p + $r2.vars.q + $r3.vars.k"),
-      nxt_string("pvalqvalkval") },
-
-    { nxt_string("$r.vars.unset"),
-      nxt_string("undefined") },
-
-    { nxt_string("var v = $r3.vars; v.k"),
-      nxt_string("kval") },
-
-    { nxt_string("var v = $r3.vars; v.unset = 1; v.unset"),
-      nxt_string("1") },
-
-    { nxt_string("$r.vars.unset = 'a'; $r2.vars.unset = 'b';"
-                 "$r.vars.unset + $r2.vars.unset"),
-      nxt_string("ab") },
-
-    { nxt_string("$r.vars.unset = 1; $r2.vars.unset = 2;"
-                 "$r.vars.unset + $r2.vars.unset"),
-      nxt_string("12") },
-
-    { nxt_string("$r3.vars.p = 'a'; $r3.vars.p2 = 'b';"
-                 "$r3.vars.p + $r3.vars.p2"),
-      nxt_string("ab") },
-
-    { nxt_string("$r3.vars.p = 'a'; delete $r3.vars.p; $r3.vars.p"),
-      nxt_string("undefined") },
-
-    { nxt_string("$r3.vars.p = 'a'; delete $r3.vars.p; $r3.vars.p = 'b'; $r3.vars.p"),
-      nxt_string("b") },
-
-    { nxt_string("$r3.vars.error = 1"),
-      nxt_string("Error: cannot set \"error\" prop") },
-
-    { nxt_string("delete $r3.vars.error"),
-      nxt_string("Error: cannot delete \"error\" prop") },
-
-    { nxt_string("delete $r3.vars.e"),
-      nxt_string("true") },
-
-    { nxt_string("$r3.consts.k"),
-      nxt_string("kval") },
-
-    { nxt_string("$r3.consts.k = 1"),
-      nxt_string("TypeError: Cannot assign to read-only property \"k\" of external") },
-
-    { nxt_string("delete $r3.consts.k"),
-      nxt_string("TypeError: Cannot delete property \"k\" of external") },
-
-    { nxt_string("delete $r3.vars.p; $r3.vars.p"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = $r.host; a +' '+ a.length +' '+ a"),
-      nxt_string("АБВГДЕЁЖЗИЙ 22 АБВГДЕЁЖЗИЙ") },
-
-    { nxt_string("var a = $r.host; a.substr(2, 2)"),
-      nxt_string("Б") },
-
-    { nxt_string("var a = $r.header['User-Agent']; a +' '+ a.length +' '+ a"),
-      nxt_string("User-Agent|АБВ 17 User-Agent|АБВ") },
-
-    { nxt_string("var a='', p;"
-                 "for (p in $r.header) { a += p +':'+ $r.header[p] +',' }"
-                 "a"),
-      nxt_string("01:01|АБВ,02:02|АБВ,03:03|АБВ,") },
-
-    { nxt_string("$r.some_method('YES')"),
-      nxt_string("АБВ") },
-
-    { nxt_string("$r.create('XXX').uri"),
-      nxt_string("XXX") },
-
-    { nxt_string("var sr = $r.create('XXX'); sr.uri = 'YYY'; sr.uri"),
-      nxt_string("YYY") },
-
-    { nxt_string("var sr = $r.create('XXX'), sr2 = $r.create('YYY');"
-                 "sr.uri = 'ZZZ'; "
-                 "sr.uri + sr2.uri"),
-      nxt_string("ZZZYYY") },
-
-    { nxt_string("var sr = $r.create('XXX'); sr.vars.p = 'a'; sr.vars.p"),
-      nxt_string("a") },
-
-    { nxt_string("var p; for (p in $r.some_method);"),
-      nxt_string("undefined") },
-
-    { nxt_string("'uri' in $r"),
-      nxt_string("true") },
-
-    { nxt_string("'one' in $r"),
-      nxt_string("false") },
-
-    { nxt_string("'a' in $r.props"),
-      nxt_string("true") },
-
-    { nxt_string("delete $r.uri"),
-      nxt_string("TypeError: Cannot delete property \"uri\" of external") },
-
-    { nxt_string("delete $r.one"),
-      nxt_string("TypeError: Cannot delete property \"one\" of external") },
-
-    { nxt_string("$r.some_method.call($r, 'YES')"),
-      nxt_string("АБВ") },
-
-    { nxt_string("var f = $r.some_method.bind($r); f('YES')"),
-      nxt_string("АБВ") },
-
-    { nxt_string("function f(fn, arg) {return fn(arg);}; f($r.some_method.bind($r), 'YES')"),
-      nxt_string("АБВ") },
-
-    { nxt_string("$r.some_method.apply($r, ['YES'])"),
-      nxt_string("АБВ") },
-
-    { nxt_string("$r.some_method.call([], 'YES')"),
-      nxt_string("TypeError: external value is expected") },
-
-    { nxt_string("$r.nonexistent"),
-      nxt_string("undefined") },
-
-    { nxt_string("$r.error = 'OK'"),
-      nxt_string("TypeError: Cannot assign to read-only property \"error\" of external") },
-
-    { nxt_string("var a = { toString: function() { return 1 } }; a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { valueOf: function() { return 1 } };  a"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("var a = { toString: 2,"
-                 "          valueOf: function() { return 1 } };  a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { toString: function() { return [] },"
-                 "          valueOf: function() { return 1 } };  a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = { toString: function() { return [] },"
-                 "          valueOf: function() { return 1 } };"
-                 "var o = {}; o[a] = 'test'"),
-      nxt_string("test") },
-
-    { nxt_string("({})[{}] = 'test'"),
-      nxt_string("test") },
-
-    { nxt_string("var o = {b:$r.props.b}; o.b"),
-      nxt_string("42") },
-
-    { nxt_string("$r2.uri == 'αβγ' && $r2.uri === 'αβγ'"),
-      nxt_string("true") },
-
-    /**/
-
-    { nxt_string("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(5)"),
-      nxt_string("1077") },
-
-    { nxt_string("'12345абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(35)"),
-      nxt_string("1101") },
-
-    { nxt_string("'12345абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.substring(35)"),
-      nxt_string("эюя") },
-
-    { nxt_string("'abcdef'.substr(-5, 4).substring(3, 1).charAt(1)"),
-      nxt_string("d") },
-
-    { nxt_string("'abcdef'.substr(2, 4).charAt(2)"),
-      nxt_string("e") },
-
-    { nxt_string("var a = 'abcdef'.substr(2, 4).charAt(2).length; a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = 'abcdef'.substr(2, 4).charAt(2) + '1234'; a"),
-      nxt_string("e1234") },
-
-    { nxt_string("var a = ('abcdef'.substr(2, 5 * 2 - 6).charAt(2) + '1234')"
-                 "         .length; a"),
-      nxt_string("5") },
-
-    { nxt_string("String.fromCharCode('_').charCodeAt(0)"),
-      nxt_string("0") },
-
-    { nxt_string("String.fromCodePoint('_')"),
-      nxt_string("RangeError") },
-
-    { nxt_string("String.fromCharCode(65.14)"),
-      nxt_string("A") },
-
-    { nxt_string("String.fromCodePoint(3.14)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("String.fromCharCode(65.14 + 65536)"),
-      nxt_string("A") },
-
-    { nxt_string("String.fromCodePoint(65 + 65536)"),
-      nxt_string("𐁁") },
-
-    { nxt_string("String.fromCharCode(2**53 + 10)"),
-      nxt_string("\n") },
-
-    { nxt_string("String.fromCodePoint(1114111 + 1)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("String.fromCharCode(65, 90) + String.fromCodePoint(65, 90)"),
-      nxt_string("AZAZ") },
-
-    { nxt_string("String.fromCharCode(945, 946, 947) + String.fromCodePoint(945, 946, 947)"),
-      nxt_string("αβγαβγ") },
-
-    { nxt_string("(function() {"
-                 "    var n;"
-                 "    for (n = 0; n <= 65536; n++) {"
-                 "        if (String.fromCharCode(n).charCodeAt(0) !== n)"
-                 "            return n;"
-                 "    }"
-                 "    return -1"
-                 "})()"),
-      nxt_string("65536") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* very long test under MSAN */
-    { nxt_string("(function() {"
-                 "    var n;"
-                 "    for (n = 0; n <= 1114111; n++) {"
-                 "        if (String.fromCodePoint(n).codePointAt(0) !== n)"
-                 "            return n;"
-                 "    }"
-                 "    return -1"
-                 "})()"),
-      nxt_string("-1") },
-#endif
-
-    { nxt_string("var a = 'abcdef'; function f(a) {"
-                 "return a.slice(a.indexOf('cd')) } f(a)"),
-      nxt_string("cdef") },
-
-    { nxt_string("var a = 'abcdef'; a.slice(a.indexOf('cd'))"),
-      nxt_string("cdef") },
-
-    { nxt_string("'abcdef'.indexOf('de', 2)"),
-      nxt_string("3") },
-
-    { nxt_string("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.indexOf('лмно', 10)"),
-      nxt_string("12") },
-
-    { nxt_string("'abcdef'.indexOf('a', 10)"),
-      nxt_string("-1") },
-
-    { nxt_string("'abcdef'.indexOf('q', 0)"),
-      nxt_string("-1") },
-
-    { nxt_string("'abcdef'.indexOf('', 10)"),
-      nxt_string("6") },
-
-    { nxt_string("'abcdef'.indexOf('', 3)"),
-      nxt_string("3") },
-
-    { nxt_string("'12345'.indexOf()"),
-      nxt_string("-1") },
-
-    { nxt_string("''.indexOf('')"),
-      nxt_string("0") },
-
-    { nxt_string("'12345'.indexOf(45, '0')"),
-      nxt_string("3") },
-
-    { nxt_string("'12'.indexOf('12345')"),
-      nxt_string("-1") },
-
-    { nxt_string("''.indexOf.call(12345, 45, '0')"),
-      nxt_string("3") },
-
-    { nxt_string("'abc'.lastIndexOf('abcdef')"),
-      nxt_string("-1") },
-
-    { nxt_string("'abc abc abc abc'.lastIndexOf('abc')"),
-      nxt_string("12") },
-
-    { nxt_string("'abc abc abc abc'.lastIndexOf('abc', 11)"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc abc abc'.lastIndexOf('abc', 0)"),
-      nxt_string("0") },
-
-    { nxt_string("'abc abc abc abc'.lastIndexOf('', 0)"),
-      nxt_string("0") },
-
-    { nxt_string("'abc abc abc abc'.lastIndexOf('', 5)"),
-      nxt_string("5") },
-
-    { nxt_string("'abc abc абвгд abc'.lastIndexOf('абвгд')"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc абвгд abc'.lastIndexOf('абвгд', undefined)"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc абвгд abc'.lastIndexOf('абвгд', NaN)"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc абвгд abc'.lastIndexOf('абвгд', {})"),
-      nxt_string("8") },
-
-    { nxt_string("String.prototype.lastIndexOf.call({toString:()=>'abc abc абвгд abc'}, 'абвгд')"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд')"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд', 11)"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд', 12)"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд', 13)"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд', 14)"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд', 15)"),
-      nxt_string("8") },
-
-    { nxt_string("'abc abc абвгдежз'.lastIndexOf('')"),
-      nxt_string("16") },
-
-    { nxt_string("'abc abc абвгдежз'.lastIndexOf('', 12)"),
-      nxt_string("12") },
-
-    { nxt_string("''.lastIndexOf('')"),
-      nxt_string("0") },
-
-    { nxt_string("''.lastIndexOf()"),
-      nxt_string("-1") },
-
-    { nxt_string("''.lastIndexOf(undefined)"),
-      nxt_string("-1") },
-
-    { nxt_string("'β'.repeat(32).lastIndexOf('β')"),
-      nxt_string("31") },
-
-    { nxt_string("'β'.repeat(32).lastIndexOf``"),
-      nxt_string("32") },
-
-    { nxt_string("JSON.stringify(Array(24).fill(true).map((v,i) => 'abc abc ab abc абвгдежзab'.lastIndexOf('abc', i)))"
-                 "== JSON.stringify([].concat(Array(4).fill(0), Array(7).fill(4), Array(13).fill(11)))"),
-      nxt_string("true") },
-
-    { nxt_string("''.includes('')"),
-      nxt_string("true") },
-
-    { nxt_string("'12345'.includes()"),
-      nxt_string("false") },
-
-    { nxt_string("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.includes('лмно', 10)"),
-      nxt_string("true") },
-
-    { nxt_string("'абв абв абвгдежз'.includes('абвгд', 7)"),
-      nxt_string("true") },
-
-    { nxt_string("'абв абв абвгдежз'.includes('абвгд', 8)"),
-      nxt_string("true") },
-
-    { nxt_string("'абв абв абвгдежз'.includes('абвгд', 9)"),
-      nxt_string("false") },
-
-    { nxt_string("''.startsWith('')"),
-      nxt_string("true") },
-
-    { nxt_string("'12345'.startsWith()"),
-      nxt_string("false") },
-
-    { nxt_string("'abc'.startsWith('abc')"),
-      nxt_string("true") },
-
-    { nxt_string("'abc'.startsWith('abc', 1)"),
-      nxt_string("false") },
-
-    { nxt_string("'abc'.startsWith('abc', -1)"),
-      nxt_string("true") },
-
-    { nxt_string("'абв абв абвгдежз'.startsWith('абвгд', 8)"),
-      nxt_string("true") },
-
-    { nxt_string("'абв абв абвгдежз'.startsWith('абвгд', 9)"),
-      nxt_string("false") },
-
-    { nxt_string("''.endsWith('')"),
-      nxt_string("true") },
-
-    { nxt_string("'12345'.endsWith()"),
-      nxt_string("false") },
-
-    { nxt_string("'abc'.endsWith('abc')"),
-      nxt_string("true") },
-
-    { nxt_string("'abc'.endsWith('abc', 4)"),
-      nxt_string("true") },
-
-    { nxt_string("'abc'.endsWith('abc', 1)"),
-      nxt_string("false") },
-
-    { nxt_string("'abc'.endsWith('abc', -1)"),
-      nxt_string("true") },
-
-    { nxt_string("'абв абв абвгдежз'.endsWith('абвгд', 13)"),
-      nxt_string("true") },
-
-    { nxt_string("'абв абв абвгдежз'.endsWith('абвгд', 14)"),
-      nxt_string("false") },
-
-    { nxt_string("'\x00АБВГДЕЁЖЗ'.toLowerCase().length"),
-      nxt_string("10") },
-
-    { nxt_string("'ΑΒΓ'.toLowerCase()"),
-      nxt_string("αβγ") },
-
-    { nxt_string("'АБВ'.toLowerCase()"),
-      nxt_string("абв") },
-
-    { nxt_string("'Ȿ'.repeat(256).toLowerCase() === 'ȿ'.repeat(256)"),
-      nxt_string("true") },
-
-    { nxt_string("'abc'.toUpperCase()"),
-      nxt_string("ABC") },
-
-    { nxt_string("'αβγ'.toUpperCase()"),
-      nxt_string("ΑΒΓ") },
-
-    { nxt_string("'ȿ'.repeat(256).toUpperCase() === 'Ȿ'.repeat(256)"),
-      nxt_string("true") },
-
-    { nxt_string("'\x00абвгдеёжз'.toUpperCase().length"),
-      nxt_string("10") },
-
-    { nxt_string("['ȿ', 'Ȿ', 'ȿ'.toUpperCase(), 'Ȿ'.toLowerCase()].map((v)=>v.toUTF8().length)"),
-      nxt_string("2,3,3,2") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* very long tests under MSAN */
-    { nxt_string("var a = [], code;"
-                 "for (code = 0; code <= 1114111; code++) {"
-                 "    var s = String.fromCodePoint(code);"
-                 "    var n = s.toUpperCase();"
-                 "    if (s != n && s != n.toLowerCase())"
-                 "        a.push(code);"
-                 "} a"),
-      nxt_string("181,305,383,453,456,459,498,837,962,976,977,981,982,1008,1009,1013,7296,7297,7298,7299,7300,7301,7302,7303,7304,7835,8126") },
-
-    { nxt_string("var a = [], code;"
-                 "for (code = 0; code <= 1114111; code++) {"
-                 "    var s = String.fromCodePoint(code);"
-                 "    var n = s.toLowerCase();"
-                 "    if (s != n && s != n.toUpperCase())"
-                 "        a.push(code);"
-                 "} a"),
-      nxt_string("304,453,456,459,498,1012,7838,8486,8490,8491") },
-#endif
-
-    { nxt_string("'abc'.trimStart().trim().trimEnd()"),
-      nxt_string("abc") },
-
-    { nxt_string("''.trim()"),
-      nxt_string("") },
-
-    { nxt_string("'    '.trim()"),
-      nxt_string("") },
-
-    { nxt_string("'abc  '.trimEnd()"),
-      nxt_string("abc") },
-
-    { nxt_string("'   abc'.trimStart()"),
-      nxt_string("abc") },
-
-    { nxt_string("'   abc  '.trim()"),
-      nxt_string("abc") },
-
-    { nxt_string("'абв  '.trimEnd()"),
-      nxt_string("абв") },
-
-    { nxt_string("'   абв'.trimStart()"),
-      nxt_string("абв") },
-
-    { nxt_string("'   абв  '.trimStart().trimEnd()"),
-      nxt_string("абв") },
-
-    { nxt_string("'\\u2029abc\\uFEFF\\u2028'.trim()"),
-      nxt_string("abc") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* very long test under MSAN */
-    { nxt_string("var a = [], code;"
-                 "for (code = 0; code <= 1114111; code++) {"
-                 "    var ws = String.fromCodePoint(code);"
-                 "    if ((ws + '-' + ws).trim() === '-')"
-                 "        a.push(code);"
-                 "} a"),
-      nxt_string("9,10,11,12,13,32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288,65279") },
-#endif
-
-    { nxt_string("'abcdefgh'.search()"),
-      nxt_string("0") },
-
-    { nxt_string("'abcdefgh'.search('')"),
-      nxt_string("0") },
-
-    { nxt_string("'abcdefgh'.search(undefined)"),
-      nxt_string("0") },
-
-    { nxt_string("'abcdefgh'.search(/def/)"),
-      nxt_string("3") },
-
-    { nxt_string("'abcdefgh'.search('def')"),
-      nxt_string("3") },
-
-    { nxt_string("'123456'.search('45')"),
-      nxt_string("3") },
-
-    { nxt_string("'123456'.search(45)"),
-      nxt_string("3") },
-
-    { nxt_string("'123456'.search(String(45))"),
-      nxt_string("3") },
-
-    { nxt_string("'123456'.search(Number('45'))"),
-      nxt_string("3") },
-
-    { nxt_string("var r = { toString: function() { return '45' } };"
-                 "'123456'.search(r)"),
-      nxt_string("3") },
-
-    { nxt_string("var r = { toString: function() { return 45 } };"
-                 "'123456'.search(r)"),
-      nxt_string("3") },
-
-    { nxt_string("var r = { toString: function() { return /45/ } };"
-                 "'123456'.search(r)"),
-      nxt_string("TypeError: Cannot convert object to primitive value") },
-
-    { nxt_string("var r = { toString: function() { return /34/ },"
-                 "          valueOf:  function() { return 45 } };"
-                 "'123456'.search(r)"),
-      nxt_string("3") },
-
-    { nxt_string("'abcdefgh'.replace()"),
-      nxt_string("abcdefgh") },
-
-    { nxt_string("'abcdefgh'.replace('d')"),
-      nxt_string("abcundefinedefgh") },
-
-    { nxt_string("'abcdefgh'.replace('d', undefined)"),
-      nxt_string("abcundefinedefgh") },
-
-    { nxt_string("'a'.repeat(16).replace('a'.repeat(17)) === 'a'.repeat(16)"),
-      nxt_string("true") },
-
-    { nxt_string("'abcdefgh'.replace('d', null)"),
-      nxt_string("abcnullefgh") },
-
-    { nxt_string("'abcdefgh'.replace('d', 1)"),
-      nxt_string("abc1efgh") },
-
-    { nxt_string("'abcdefghdijklm'.replace('d', 'X')"),
-      nxt_string("abcXefghdijklm") },
-
-    { nxt_string("'абвгдежгийклм'.replace('г', 'Г')"),
-      nxt_string("абвГдежгийклм") },
-
-    { nxt_string("'abcdefghdijklm'.replace('d',"
-                 "   function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
-      nxt_string("abc|abcdefghdijklm|3|d|efghdijklm") },
-
-    { nxt_string("'abcdefgh'.replace('', 'X')"),
-      nxt_string("Xabcdefgh") },
-
-    { nxt_string("'abcdefghdijklm'.replace(/d/, 'X')"),
-      nxt_string("abcXefghdijklm") },
-
-    { nxt_string("'abcdefghdijklm'.replace(/d/,"
-                 "   function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
-      nxt_string("abc|abcdefghdijklm|3|d|efghdijklm") },
-
-    { nxt_string("'abcdefghdijklm'.replace(/(d)/,"
-                 "   function(m, p, o, s)"
-                       "{ return '|'+s+'|'+o+'|'+m+'|'+p+'|' })"),
-      nxt_string("abc|abcdefghdijklm|3|d|d|efghdijklm") },
-
-    { nxt_string("'abcdefghdijklm'.replace(/x/, 'X')"),
-      nxt_string("abcdefghdijklm") },
-
-    { nxt_string("'abcdefghdijklm'.replace(/x/,"
-                 "   function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
-      nxt_string("abcdefghdijklm") },
-
-    { nxt_string("'абвгдежгийклм'.replace(/г/, 'Г')"),
-      nxt_string("абвГдежгийклм") },
-
-    { nxt_string("'abcdefghdijklm'.replace(/d/g, 'X')"),
-      nxt_string("abcXefghXijklm") },
-
-    { nxt_string("'абвгдежгийклм'.replace(/г/g, 'Г')"),
-      nxt_string("абвГдежГийклм") },
-
-    { nxt_string("'abc12345#$*%'.replace(/([^\\d]*)(\\d*)([^\\w]*)/,"
-                 "   function(match, p1, p2, p3) {"
-                 "     return [p1, p2, p3].join('-')})"),
-      nxt_string("abc-12345-#$*%") },
-
-    { nxt_string("'ABCDEFGHDIJKLM'.replace(/[A-Z]/g,"
-                 "   function(match) { return '-' + match.toLowerCase() })"),
-      nxt_string("-a-b-c-d-e-f-g-h-d-i-j-k-l-m") },
-
-    { nxt_string("'abcdbe'.replace(/(b)/g, '$')"),
-      nxt_string("a$cd$e") },
-
-    { nxt_string("'abcdbe'.replace(/(b)/g, '$2$23')"),
-      nxt_string("a$2$23cd$2$23e") },
-
-    { nxt_string("'abcdbe'.replace(/(b)/g, '$2$23X$$Y')"),
-      nxt_string("a$2$23X$Ycd$2$23X$Ye") },
-
-    { nxt_string("'abcdbe'.replace('b', '|$`X$\\'|')"),
-      nxt_string("a|aXcdbe|cdbe") },
-
-    { nxt_string("'abcdbe'.replace(/b/, '|$`X$\\'|')"),
-      nxt_string("a|aXcdbe|cdbe") },
-
-    { nxt_string("'abcdbefbgh'.replace(/b/g, '|$`X$\\'|')"),
-      nxt_string("a|aXcdbefbgh|cd|abcdXefbgh|ef|abcdbefXgh|gh") },
-
-    { nxt_string("'abc12345#$*%'.replace(/([^\\d]*)(\\d*)([^\\w]*)/,"
-                 "                       '$1-$2-$3')"),
-      nxt_string("abc-12345-#$*%") },
-
-    { nxt_string("'$1,$2'.replace(/(\\$(\\d))/g, '$$1-$1$2')"),
-      nxt_string("$1-$11,$1-$22") },
-
-    { nxt_string("('β' + 'α'.repeat(33)+'β').replace(/(α+)(β+)/, function(m, p1) { return p1[32]; })"),
-      nxt_string("βα") },
-
-    { nxt_string("'abc'.replace(/(h*)(z*)(g*)/g, '$1nn$2zz$3')"),
-      nxt_string("nnzzannzzbnnzzcnnzz") },
-
-    { nxt_string("'abc'.replace(/(h*)(z*)/g, '$1nn$2zz$3yy')"),
-      nxt_string("nnzz$3yyannzz$3yybnnzz$3yycnnzz$3yy") },
-
-    { nxt_string("'ъ'.replace(/(h*)/g, '$1ЮЙ')"),
-      nxt_string("ЮЙъЮЙ") },
-
-    { nxt_string("'ъg'.replace(/(h*)/g, '$1ЮЙ')"),
-      nxt_string("ЮЙъЮЙgЮЙ") },
-
-    { nxt_string("'ъg'.replace(/(ъ*)/g, '$1ЮЙ')"),
-      nxt_string("ъЮЙЮЙgЮЙ") },
-
-    { nxt_string("'ъg'.replace(/(h*)/g, 'fg$1ЮЙ')"),
-      nxt_string("fgЮЙъfgЮЙgfgЮЙ") },
-
-    { nxt_string("'юgёfя'.replace(/(gё)/g, 'n$1i')"),
-      nxt_string("юngёifя") },
-
-    { nxt_string("'aabbccaa'.replace(/a*/g, '')"),
-      nxt_string("bbcc") },
-
-    { nxt_string("'aabbccaab'.replace(/z*/g, '')"),
-      nxt_string("aabbccaab") },
-
-    { nxt_string("'αβγ'.replace(/z*/g, '|')"),
-      nxt_string("|α|β|γ|") },
-
-    { nxt_string("''.replace(/a*/g, '')"),
-      nxt_string("") },
-
-    { nxt_string("'12345'.replace(3, () => 0)"),
-      nxt_string("12045") },
-
-    { nxt_string("'123'.replace(3, function() { return {toString: ()=>({})}; })"),
-      nxt_string("TypeError: Cannot convert object to primitive value") },
-
-    { nxt_string("'12345'.replace(3, () => ({toString: () => 'aaaa'}))"),
-      nxt_string("12aaaa45") },
-
-    { nxt_string("'abc'.replace(/(z*)/g, function v0() {return '124'})"),
-      nxt_string("124a124b124c124") },
-
-    { nxt_string("'abc'.replace(/(a*)/g, function v0() {return '124'})"),
-      nxt_string("124124b124c124") },
-
-    { nxt_string("'abc'.replace(/b/g, '$0')"),
-      nxt_string("a$0c") },
-
-    { nxt_string("typeof String.bytesFrom(Array(15).fill(0xE3)).replace(/^/g, 1)"),
-      nxt_string("string") },
-
-#if 0 /* FIXME: PCRE limitation */
-    { nxt_string("'abc'.replace(/^/g, '|$&|')"),
-      nxt_string("||abc") },
-#endif
-
-    { nxt_string("'abc'.replace(/b/g, '|$&|')"),
-      nxt_string("a|b|c") },
-
-    { nxt_string("'ABC'.replace(/((A)B)/g, '($1|$&|$2)')"),
-      nxt_string("(AB|AB|A)C") },
-
-    { nxt_string("/]/"),
-      nxt_string("/\\]/") },
-
-    { nxt_string("RegExp(']')"),
-      nxt_string("/\\]/") },
-
-    { nxt_string("RegExp('[\\\\\\\\]]')"),
-      nxt_string("/[\\\\]\\]/") },
-
-    { nxt_string("/[\\\\]]/"),
-      nxt_string("/[\\\\]\\]/") },
-
-    { nxt_string("/\\]/"),
-      nxt_string("/\\]/") },
-
-    { nxt_string("RegExp('\\]')"),
-      nxt_string("/\\]/") },
-
-    { nxt_string("/ab]cd/"),
-      nxt_string("/ab\\]cd/") },
-
-    { nxt_string("/ab]/"),
-      nxt_string("/ab\\]/") },
-
-    { nxt_string("/]cd/"),
-      nxt_string("/\\]cd/") },
-
-    { nxt_string("RegExp('\\\\0').source[1]"),
-      nxt_string("0") },
-
-    { nxt_string("']'.match(/]/)"),
-      nxt_string("]") },
-
-    { nxt_string("'ab]cd'.match(/]/)"),
-      nxt_string("]") },
-
-    { nxt_string("'ab]'.match(/]/)"),
-      nxt_string("]") },
-
-    { nxt_string("']cd'.match(/]/)"),
-      nxt_string("]") },
-
-    { nxt_string("'ab]cd'.match(/\\]/)"),
-      nxt_string("]") },
-
-    { nxt_string("'abc'.match(/a*/g)"),
-      nxt_string("a,,,") },
-
-    { nxt_string("'abc'.match(/z*/g)"),
-      nxt_string(",,,") },
-
-    { nxt_string("'abc'.match(/.?/g)"),
-      nxt_string("a,b,c,") },
-
-    { nxt_string("''.match(/a*/g)"),
-      nxt_string("") },
-
-    { nxt_string("''.match(/.?/g)"),
-      nxt_string("") },
-
-    { nxt_string("'абв'.match(/я?/g)"),
-      nxt_string(",,,") },
-
-    { nxt_string("'αβγ'.match(/z*/g)"),
-      nxt_string(",,,") },
-
-    { nxt_string("'囲碁織'.match(/z*/g)"),
-      nxt_string(",,,") },
-
-    { nxt_string("'𝟘𝟙𝟚𝟛'.match(/z*/g)"),
-      nxt_string(",,,,") },
-
-    { nxt_string("'abcdefgh'.match()"),
-      nxt_string("") },
-
-    { nxt_string("'abcdefgh'.match('')"),
-      nxt_string("") },
-
-    { nxt_string("'abcdefgh'.match(undefined)"),
-      nxt_string("") },
-
-    { nxt_string("'abcdefgh'.match(/def/)"),
-      nxt_string("def") },
-
-    { nxt_string("'abcdefgh'.match('def')"),
-      nxt_string("def") },
-
-    { nxt_string("'123456'.match('45')"),
-      nxt_string("45") },
-
-    { nxt_string("'123456'.match(45)"),
-      nxt_string("45") },
-
-    { nxt_string("'123456'.match(String(45))"),
-      nxt_string("45") },
-
-    { nxt_string("'123456'.match(Number('45'))"),
-      nxt_string("45") },
-
-    { nxt_string("var r = { toString: function() { return '45' } };"
-                 "'123456'.match(r)"),
-      nxt_string("45") },
-
-    { nxt_string("var r = { toString: function() { return 45 } };"
-                 "'123456'.match(r)"),
-      nxt_string("45") },
-
-    { nxt_string("var r = { toString: function() { return /45/ } };"
-                 "'123456'.match(r)"),
-      nxt_string("TypeError: Cannot convert object to primitive value") },
-
-    { nxt_string("var r = { toString: function() { return /34/ },"
-                 "          valueOf:  function() { return 45 } };"
-                 "'123456'.match(r)"),
-      nxt_string("45") },
-
-    { nxt_string("''.match(/^$/)"),
-      nxt_string("") },
-
-    { nxt_string("''.match(/^$/g)"),
-      nxt_string("") },
-
-    { nxt_string("'abcdefgh'.match(/def/)"),
-      nxt_string("def") },
-
-    { nxt_string("'abc abc abc'.match('abc')"),
-      nxt_string("abc") },
-
-    { nxt_string("'abc abc abc'.match(/abc/)"),
-      nxt_string("abc") },
-
-    { nxt_string("'abc abc abc'.match(/abc/g)"),
-      nxt_string("abc,abc,abc") },
-
-    { nxt_string("'abc ABC aBc'.match(/abc/ig)"),
-      nxt_string("abc,ABC,aBc") },
-
-    { nxt_string("var a = 'α'.match(/α/g)[0] + 'α';"
-                 "a +' '+ a.length"),
-      nxt_string("αα 2") },
-
-    { nxt_string("('β' + 'α'.repeat(33) +'β').match(/α+/g)[0][32]"),
-      nxt_string("α") },
-
-    { nxt_string("var a = '\\u00CE\\u00B1'.toBytes().match(/α/g)[0] + 'α';"
-                 "a +' '+ a.length"),
-      nxt_string("αα 4") },
-
-    { nxt_string("typeof String.bytesFrom(Array(15).fill(0xE3)).match(/^/g)"),
-      nxt_string("object") },
-
-    { nxt_string("'abc'.split()"),
-      nxt_string("abc") },
-
-    { nxt_string("'abc'.split(undefined)"),
-      nxt_string("abc") },
-
-    { nxt_string("''.split('').length"),
-      nxt_string("1") },
-
-    { nxt_string("'abc'.split('')"),
-      nxt_string("a,b,c") },
-
-    { nxt_string("'αβγ'.split('')"),
-      nxt_string("α,β,γ") },
-
-    { nxt_string("'囲碁織'.split('')"),
-      nxt_string("囲,碁,織") },
-
-    { nxt_string("'𝟘𝟙𝟚𝟛'.split('')"),
-      nxt_string("𝟘,𝟙,𝟚,𝟛") },
-
-    { nxt_string("'囲α碁α織'.split('α')"),
-      nxt_string("囲,碁,織") },
-
-    { nxt_string("'a'.repeat(16).split('a'.repeat(15))"),
-      nxt_string(",a") },
-
-    { nxt_string("('α'+'β'.repeat(33)).repeat(2).split('α')[1][32]"),
-      nxt_string("β") },
-
-    { nxt_string("'abc'.split('abc')"),
-      nxt_string(",") },
-
-    { nxt_string("'a bc def'.split(' ')"),
-      nxt_string("a,bc,def") },
-
-    { nxt_string("'a bc  def'.split(' ')"),
-      nxt_string("a,bc,,def") },
-
-    { nxt_string("'a bc  def'.split(' ', 3)"),
-      nxt_string("a,bc,") },
-
-    { nxt_string("'abc'.split('abc')"),
-      nxt_string(",") },
-
-    { nxt_string("'ab'.split('123')"),
-      nxt_string("ab") },
-
-    { nxt_string("''.split(/0/).length"),
-      nxt_string("1") },
-
-    { nxt_string("'abc'.split(/(?:)/)"),
-      nxt_string("a,b,c") },
-
-    { nxt_string("'a bc def'.split(/ /)"),
-      nxt_string("a,bc,def") },
-
-    { nxt_string("'a bc  def'.split(/ /)"),
-      nxt_string("a,bc,,def") },
-
-    { nxt_string("'abc'.split(/abc/)"),
-      nxt_string(",") },
-
-    { nxt_string("'0123456789'.split('').reverse().join('')"),
-      nxt_string("9876543210") },
-
-    { nxt_string("'abc'.repeat(3)"),
-      nxt_string("abcabcabc") },
-
-    { nxt_string("'абв'.repeat(3)"),
-      nxt_string("абвабвабв") },
-
-    { nxt_string("''.repeat(3)"),
-      nxt_string("") },
-
-    { nxt_string("'abc'.repeat(0)"),
-      nxt_string("") },
-
-    { nxt_string("'abc'.repeat(NaN)"),
-      nxt_string("") },
-
-    { nxt_string("'abc'.repeat(Infinity)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("'abc'.repeat(-1)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("''.repeat(-1)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("'a'.repeat(2147483647)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("'a'.repeat(2147483648)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("'a'.repeat(Infinity)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("'a'.repeat(NaN)"),
-      nxt_string("") },
-
-    { nxt_string("''.repeat(2147483646)"),
-      nxt_string("") },
-
-    /* ES6: "". */
-    { nxt_string("''.repeat(2147483647)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("''.repeat(2147483648)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("''.repeat(Infinity)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("''.repeat(NaN)"),
-      nxt_string("") },
-
-    { nxt_string("'abc'.padStart(7)"),
-      nxt_string("    abc") },
-
-    { nxt_string("'абв'.padStart(7)"),
-      nxt_string("    абв") },
-
-    { nxt_string("'abc'.padStart(3)"),
-      nxt_string("abc") },
-
-    { nxt_string("'абв'.padStart(0)"),
-      nxt_string("абв") },
-
-    { nxt_string("'abc'.padStart(NaN)"),
-      nxt_string("abc") },
-
-    { nxt_string("'abc'.padStart(2147483647)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("'abc'.padStart(2147483646, '')"),
-      nxt_string("abc") },
-
-    { nxt_string("''.padStart(0, '')"),
-      nxt_string("") },
-
-    { nxt_string("'1'.padStart(5, 0)"),
-      nxt_string("00001") },
-
-    { nxt_string("''.padStart(1, 'я')"),
-      nxt_string("я") },
-
-    { nxt_string("'abc'.padStart(6, NaN)"),
-      nxt_string("NaNabc") },
-
-    { nxt_string("'abc'.padStart(11, 123)"),
-      nxt_string("12312312abc") },
-
-    { nxt_string("'abc'.padStart(6, 12345)"),
-      nxt_string("123abc") },
-
-    { nxt_string("'абв'.padStart(6, 'эюя')"),
-      nxt_string("эюяабв") },
-
-    { nxt_string("'абв'.padStart(4, 'эюя')"),
-      nxt_string("эабв") },
-
-    { nxt_string("'абв'.padStart(7, 'эюя')"),
-      nxt_string("эюяэабв") },
-
-    { nxt_string("'абв'.padStart(10, 'эю')"),
-      nxt_string("эюэюэюэабв") },
-
-    { nxt_string("'1234'.padEnd(4)"),
-      nxt_string("1234") },
-
-    { nxt_string("'1234'.padEnd(-1)"),
-      nxt_string("1234") },
-
-    { nxt_string("'я'.padEnd(1)"),
-      nxt_string("я") },
-
-    { nxt_string("'1234'.padEnd(5)"),
-      nxt_string("1234 ") },
-
-    { nxt_string("'я'.padEnd(6)"),
-      nxt_string("я     ") },
-
-    { nxt_string("'я'.padEnd(2147483647)"),
-      nxt_string("RangeError") },
-
-    { nxt_string("'я'.padEnd(2147483646, '')"),
-      nxt_string("я") },
-
-    { nxt_string("''.padEnd(0, '')"),
-      nxt_string("") },
-
-    { nxt_string("'эю'.padEnd(3, 'я')"),
-      nxt_string("эюя") },
-
-    { nxt_string("''.padEnd(1, 0)"),
-      nxt_string("0") },
-
-    { nxt_string("'1234'.padEnd(8, 'abcd')"),
-      nxt_string("1234abcd") },
-
-    { nxt_string("'1234'.padEnd(10, 'abcd')"),
-      nxt_string("1234abcdab") },
-
-    { nxt_string("'1234'.padEnd(7, 'abcd')"),
-      nxt_string("1234abc") },
-
-    { nxt_string("'абв'.padEnd(5, 'ГД')"),
-      nxt_string("абвГД") },
-
-    { nxt_string("'абв'.padEnd(4, 'ГДУ')"),
-      nxt_string("абвГ") },
-
-    { nxt_string("'абвг'.padEnd(10, 'ДЕЖЗ')"),
-      nxt_string("абвгДЕЖЗДЕ") },
-
-    { nxt_string("String.bytesFrom({})"),
-      nxt_string("TypeError: value must be a string or array") },
-
-    { nxt_string("String.bytesFrom([1, 2, 0.23, '5', 'A']).toString('hex')"),
-      nxt_string("0102000500") },
-
-    { nxt_string("String.bytesFrom([NaN, Infinity]).toString('hex')"),
-      nxt_string("0000") },
-
-    { nxt_string("String.bytesFrom('', 'hex')"),
-      nxt_string("") },
-
-    { nxt_string("String.bytesFrom('00aabbcc', 'hex').toString('hex')"),
-      nxt_string("00aabbcc") },
-
-    { nxt_string("String.bytesFrom('deadBEEF##', 'hex').toString('hex')"),
-      nxt_string("deadbeef") },
-
-    { nxt_string("String.bytesFrom('aa0', 'hex').toString('hex')"),
-      nxt_string("aa") },
-
-    { nxt_string("String.bytesFrom('', 'base64')"),
-      nxt_string("") },
-
-    { nxt_string("String.bytesFrom('#', 'base64')"),
-      nxt_string("") },
-
-    { nxt_string("String.bytesFrom('QQ==', 'base64')"),
-      nxt_string("A") },
-
-    { nxt_string("String.bytesFrom('QQ', 'base64')"),
-      nxt_string("A") },
-
-    { nxt_string("String.bytesFrom('QUI=', 'base64')"),
-      nxt_string("AB") },
-
-    { nxt_string("String.bytesFrom('QUI', 'base64')"),
-      nxt_string("AB") },
-
-    { nxt_string("String.bytesFrom('QUJD', 'base64')"),
-      nxt_string("ABC") },
-
-    { nxt_string("String.bytesFrom('QUJDRA==', 'base64')"),
-      nxt_string("ABCD") },
-
-    { nxt_string("String.bytesFrom('', 'base64url')"),
-      nxt_string("") },
-
-    { nxt_string("String.bytesFrom('QQ', 'base64url')"),
-      nxt_string("A") },
-
-    { nxt_string("String.bytesFrom('QUI', 'base64url')"),
-      nxt_string("AB") },
-
-    { nxt_string("String.bytesFrom('QUJD', 'base64url')"),
-      nxt_string("ABC") },
-
-    { nxt_string("String.bytesFrom('QUJDRA', 'base64url')"),
-      nxt_string("ABCD") },
-
-    { nxt_string("String.bytesFrom('QUJDRA#', 'base64url')"),
-      nxt_string("ABCD") },
-
-    { nxt_string("encodeURI.name"),
-      nxt_string("encodeURI")},
-
-    { nxt_string("encodeURI.length"),
-      nxt_string("1")},
-
-    { nxt_string("encodeURI()"),
-      nxt_string("undefined")},
-
-    { nxt_string("encodeURI('012абв')"),
-      nxt_string("012%D0%B0%D0%B1%D0%B2")},
-
-    { nxt_string("encodeURI('~}|{`_^]\\\\[@?>=<;:/.-,+*)(\\\'&%$#\"! ')"),
-      nxt_string("~%7D%7C%7B%60_%5E%5D%5C%5B@?%3E=%3C;:/.-,+*)('&%25$#%22!%20")},
-
-    { nxt_string("encodeURIComponent.name"),
-      nxt_string("encodeURIComponent")},
-
-    { nxt_string("encodeURIComponent.length"),
-      nxt_string("1")},
-
-    { nxt_string("encodeURIComponent('~}|{`_^]\\\\[@?>=<;:/.-,+*)(\\\'&%$#\"! ')"),
-      nxt_string("~%7D%7C%7B%60_%5E%5D%5C%5B%40%3F%3E%3D%3C%3B%3A%2F.-%2C%2B*)('%26%25%24%23%22!%20")},
-
-    { nxt_string("decodeURI.name"),
-      nxt_string("decodeURI")},
-
-    { nxt_string("decodeURI.length"),
-      nxt_string("1")},
-
-    { nxt_string("decodeURI()"),
-      nxt_string("undefined")},
-
-    { nxt_string("decodeURI('%QQ')"),
-      nxt_string("URIError")},
-
-    { nxt_string("decodeURI('%')"),
-      nxt_string("URIError")},
-
-    { nxt_string("decodeURI('%0')"),
-      nxt_string("URIError")},
-
-    { nxt_string("decodeURI('%00')"),
-      nxt_string("\0")},
-
-    { nxt_string("decodeURI('%3012%D0%B0%D0%B1%D0%B2')"),
-      nxt_string("012абв")},
-
-    { nxt_string("decodeURI('%7e%7d%7c%7b%60%5f%5e%5d%5c%5b%40%3f%3e%3d%3c%3b%3a%2f%2e%2c%2b%2a%29%28%27%26%25%24%23%22%21%20')"),
-      nxt_string("~}|{`_^]\\[%40%3f>%3d<%3b%3a%2f.%2c%2b*)('%26%%24%23\"! ")},
-
-    { nxt_string("decodeURIComponent.name"),
-      nxt_string("decodeURIComponent")},
-
-    { nxt_string("decodeURIComponent.length"),
-      nxt_string("1")},
-
-    { nxt_string("decodeURIComponent('%7e%7d%7c%7b%60%5f%5e%5d%5c%5b%40%3f%3e%3d%3c%3b%3a%2f%2e%2c%2b%2a%29%28%27%26%25%24%23%22%21%20')"),
-      nxt_string("~}|{`_^]\\[@?>=<;:/.,+*)('&%$#\"! ")},
-
-    { nxt_string("decodeURI('%41%42%43').length"),
-      nxt_string("3")},
-
-    { nxt_string("decodeURI('%D0%B0%D0%B1%D0%B2').length"),
-      nxt_string("3")},
-
-    { nxt_string("decodeURI('%80%81%82').length"),
-      nxt_string("3")},
-
-    /* Functions. */
-
-    { nxt_string("return"),
-      nxt_string("SyntaxError: Illegal return statement in 1") },
-
-    { nxt_string("{return}"),
-      nxt_string("SyntaxError: Illegal return statement in 1") },
-
-    { nxt_string("\n{\nreturn;\n}"),
-      nxt_string("SyntaxError: Illegal return statement in 3") },
-
-    { nxt_string("if (1) function f(){}"),
-      nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
-
-    { nxt_string("if (1) { function f(){}}"),
-      nxt_string("undefined") },
-
-    { nxt_string("while (1) function f() { }"),
-      nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
-
-    { nxt_string("while (1) { break; function f(){}}"),
-      nxt_string("undefined") },
-
-    { nxt_string("for (;;) function f() { }"),
-      nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
-
-    { nxt_string("for (;;) { break; function f(){}}"),
-      nxt_string("undefined") },
-
-    { nxt_string("do function f() { } while (0)"),
-      nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
-
-    { nxt_string("function f() { return 1; } { function f() { return 2; } } f()"),
-      nxt_string("1") },
-
-    { nxt_string("function f() { return 1; } { function f() { return 2; } { function f() { return 3; } }} f()"),
-      nxt_string("1") },
-
-    { nxt_string("{function f() {} {} f() }"),
-      nxt_string("undefined") },
-
-    { nxt_string("{ var f; function f() {} }"),
-      nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
-    { nxt_string("{ function f() {} var f; }"),
-      nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
-    { nxt_string("{ function f() {} { var f }}"),
-      nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
-    { nxt_string("function f() { return f() } f()"),
-      nxt_string("RangeError: Maximum call stack size exceeded") },
-
-    { nxt_string("function () { } f()"),
-      nxt_string("SyntaxError: Unexpected token \"(\" in 1") },
-
-    { nxt_string("function f() { }"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() { }; f.length"),
-      nxt_string("0") },
-
-    { nxt_string("function f() { }; f.length = 1"),
-      nxt_string("TypeError: Cannot assign to read-only property \"length\" of function") },
-
-    { nxt_string("function f(...rest) { }; f.length"),
-      nxt_string("0") },
-
-    { nxt_string("function f(...rest) { }; var binded = f.bind(this, [1,2]);"
-                 "binded.length"),
-      nxt_string("0") },
-
-    { nxt_string("function f(a,a) { };"),
-      nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
-    { nxt_string("function f(a,b,a) { };"),
-      nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
-    { nxt_string("function f(a, ...a) { };"),
-      nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
-    { nxt_string("(function(a,a) { })"),
-      nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
-    { nxt_string("(function(a,...a) { })"),
-      nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
-    { nxt_string("(function f(a,a) { })"),
-      nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
-    { nxt_string("(function f(a,...a) { })"),
-      nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
-    { nxt_string("function f(a,b) { }; f.length"),
-      nxt_string("2") },
-
-    { nxt_string("function f(a,...rest) { }; f.length"),
-      nxt_string("1") },
-
-    { nxt_string("function f(a,b) { }; var ff = f.bind(f, 1); ff.length"),
-      nxt_string("1") },
-
-    { nxt_string("Object((new Date(0)).toJSON())+0"),
-      nxt_string("1970-01-01T00:00:00.000Z0") },
-
-    { nxt_string("Object((new Array(0)).toString())+0"),
-      nxt_string("0") },
-
-    { nxt_string("JSON.parse.length"),
-      nxt_string("2") },
-
-    { nxt_string("JSON.parse.bind(JSON, '[]').length"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {}; o.hasOwnProperty.length"),
-      nxt_string("1") },
-
-    { nxt_string("var x; function f() { }"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() { } f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() { ; } f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() { ;; } f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() { return } f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() { return; } f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() { return;; } f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() { return 1 } f()"),
-      nxt_string("1") },
-
-    { nxt_string("function f() { return 1; } f()"),
-      nxt_string("1") },
-
-    { nxt_string("function f() { return 1;; } f()"),
-      nxt_string("1") },
-
-    { nxt_string("function f() { return 1\n 2 } f()"),
-      nxt_string("1") },
-
-    { nxt_string("function f() { return 1\n 2 } f()"),
-      nxt_string("1") },
-
-    { nxt_string("(function f() { return 2.toString(); })()"),
-      nxt_string("SyntaxError: Unexpected token \"toString\" in 1") },
-
-    { nxt_string("(function f() { return 2..toString(); })()"),
-      nxt_string("2") },
-
-    { nxt_string("function f(a) { if (a) return 'OK' } f(1)+f(0)"),
-      nxt_string("OKundefined") },
-
-    { nxt_string("function f(a) { if (a) return 'OK'; } f(1)+f(0)"),
-      nxt_string("OKundefined") },
-
-    { nxt_string("function f(a) { if (a) return 'OK';; } f(1)+f(0)"),
-      nxt_string("OKundefined") },
-
-    { nxt_string("var a = 1; a()"),
-      nxt_string("TypeError: number is not a function") },
-
-    { nxt_string("var o = {a:1}; o.a()"),
-      nxt_string("TypeError: (intermediate value)[\"a\"] is not a function") },
-
-    { nxt_string("(function(){})()"),
-      nxt_string("undefined") },
-
-    { nxt_string("var q = 1; function x(a, b, c) { q = a } x(5); q"),
-      nxt_string("5") },
-
-    { nxt_string("function x(a) { while (a < 2) a++; return a + 1 } x(1) "),
-      nxt_string("3") },
-
-    { nxt_string("(function(){(function(){(function(){(function(){"
-                    "(function(){(function(){(function(){})})})})})})})"),
-      nxt_string("SyntaxError: The maximum function nesting level is \"5\" in 1") },
-
-    { nxt_string("Function.prototype.toString = function () {return 'X'};"
-                 "eval"),
-      nxt_string("X") },
-
-    { nxt_string("var o = {f:function(x){ return x**2}}; o.f\n(2)"),
-      nxt_string("4") },
-
-    { nxt_string("var o = {f:function(x){ return x**2}}; o\n.f\n(2)"),
-      nxt_string("4") },
-
-    { nxt_string("var o = {f:function(x){ return x**2}}; o\n.\nf\n(2)"),
-      nxt_string("4") },
-
-    { nxt_string("function f(x){ return x**2}; [f(2)\n, f\n(2),\nf\n(\n2),\nf\n(\n2\n)]"),
-      nxt_string("4,4,4,4") },
-
-    { nxt_string("function f (x){ return x**2}; f\n(2)"),
-      nxt_string("4") },
-
-    { nxt_string("function f (x){ return x**2}; f\n(\n2)"),
-      nxt_string("4") },
-
-    { nxt_string("function f (x){ return x**2}; f\n(\n2\n)"),
-      nxt_string("4") },
-
-    { nxt_string("function f (x){ return x**2}; f\n(2\n)"),
-      nxt_string("4") },
-
-    { nxt_string("function f (x){ return x**2}; f(2\n)"),
-      nxt_string("4") },
-
-    { nxt_string("var fn = Function.prototype.call; fn.call(() => 1)"),
-      nxt_string("1") },
-
-    { nxt_string("var fn = Function.prototype.call; fn.call(fn, () => 1)"),
-      nxt_string("1") },
-
-    { nxt_string("var fn = Function.prototype.call; fn.call(fn, fn, () => 1)"),
-      nxt_string("1") },
-
-    { nxt_string("eval.call.call(Number)"),
-      nxt_string("0") },
-
-    { nxt_string("URIError.apply.apply(RegExp)"),
-      nxt_string("/(?:)/") },
-
-    { nxt_string("[0].some(function(){return Array.call.bind(isNaN)}())"),
-      nxt_string("false") },
-
-    /* Recursive factorial. */
-
-    { nxt_string("function f(a) {"
-                 "    if (a > 1)"
-                 "        return a * f(a - 1)\n"
-                 "    return 1"
-                 "}"
-                 "f(10)"),
-      nxt_string("3628800") },
-
-    /* Recursive factorial. */
-
-    { nxt_string("function f(a) { return (a > 1) ? a * f(a - 1) : 1 } f(10)"),
-      nxt_string("3628800") },
-
-    { nxt_string("var g = function f(a) { return (a > 1) ? a * f(a - 1) : 1 };"
-                 "g(10)"),
-      nxt_string("3628800") },
-
-    { nxt_string("(function f(a) { return (a > 1) ? a * f(a - 1) : 1 })(10)"),
-      nxt_string("3628800") },
-
-    /* Nested functions and closures. */
-
-    { nxt_string("function f() { var x = 4; "
-                 "function g() { return x }; return g(); } f()"),
-      nxt_string("4") },
-
-    { nxt_string("function f(a) { function g(b) { return a + b } return g }"
-                 "var k = f('a'); k('b')"),
-      nxt_string("ab") },
-
-    { nxt_string("function f(a) { return function(b) { return a + b } }"
-                 "var k = f('a'); k('b')"),
-      nxt_string("ab") },
-
-    { nxt_string("function f(a) { return function(b) { return a + b } }"
-                 "var k = f('a'), m = f('b'); k('c') + m('d')"),
-      nxt_string("acbd") },
-
-    { nxt_string("function f(a) { return "
-                 "function(b) { return function(c) { return a + b + c } } }"
-                 "var g = f('a'), k = g('b'), m = g('c'); k('d') + m('e')"),
-      nxt_string("abdace") },
-
-    { nxt_string("function f(a) {"
-                 "function g() { return a }; return g; }"
-                 "var y = f(4); y()"),
-      nxt_string("4") },
-
-    { nxt_string("function f() { var x = 4; "
-                 "return function() { return x } }"
-                 "var y = f(); y()"),
-      nxt_string("4") },
-
-    { nxt_string("function f() { var x = 4;"
-                 "function g() { if (1) { return 2 + x; } }; return g }"
-                 "var y = f(); y()"),
-      nxt_string("6") },
-
-    { nxt_string("var x; var y = 4;"
-                 "function f() { function h() { x = 3; return y; } }"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() {"
-                 "    var a = 'a';"
-                 "    if (0) { a = 'b' };"
-                 "    function f2() { return a };"
-                 "    return f2"
-                 "};"
-                 "f()()"),
-      nxt_string("a") },
-
-    { nxt_string("function f() {"
-                 "    var a = 'a'; "
-                 "    if (0) { if (0) {a = 'b'} };"
-                 "    function f2() { return a };"
-                 "    return f2"
-                 "};"
-                 "f()()"),
-      nxt_string("a") },
-
-    { nxt_string("function f() { var a = f2(); }"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() { var a = f2(); } f();"),
-      nxt_string("ReferenceError: \"f2\" is not defined in 1") },
-
-    { nxt_string("typeof Buffer !== 'undefined' ? Buffer : function Buffer(){}"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("1 == 2 ? func() : '123'"),
-      nxt_string("123") },
-
-    { nxt_string("1 == 1 ? func() : '123'"),
-      nxt_string("ReferenceError: \"func\" is not defined in 1") },
-
-    { nxt_string("function f(){ if (1 == 1) { 1 == 2 ? some_var : '123' } }; f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f(){ if (1 == 1) { 1 == 1 ? some_var : '123' } }; f()"),
-      nxt_string("ReferenceError: \"some_var\" is not defined in 1") },
-
-    { nxt_string("function f(){ if (1 == 1) { 1 == 2 ? some_func() : '123' } }; f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f(){ if (1 == 1) { 1 == 1 ? some_func() : '123' } }; f()"),
-      nxt_string("ReferenceError: \"some_func\" is not defined in 1") },
-
-    { nxt_string("(function(){ function f() {return f}; return f()})()"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("function  f() {}; f.toString = ()=> 'F'; ({'F':1})[f]"),
-      nxt_string("1") },
-
-    { nxt_string("var a = ''; "
-                 "function f(list) {"
-                 "    function add(v) {a+=v};"
-                 "    list.forEach(function(v) {add(v)});"
-                 "};"
-                 "f(['a', 'b', 'c']); a"),
-      nxt_string("abc") },
-
-    { nxt_string("var l = [];"
-                 "var f = function() { "
-                 "    function f2() { l.push(f); l.push(f2); }; "
-                 "    l.push(f); l.push(f2); "
-                 "    f2(); "
-                 "}; "
-                 "f(); "
-                 "l.every(function(v) {return typeof v == 'function'})"),
-      nxt_string("true") },
-
-    { nxt_string("var l = [];"
-                 "function baz() {"
-                 "  function foo(v) {"
-                 "     function bar() { foo(0); }"
-                 "     l.push(v);"
-                 "     if (v === 1) { bar(); }"
-                 "  }"
-                 "  foo(1);"
-                 "}; baz(); l"),
-      nxt_string("1,0") },
-
-    { nxt_string("var gen = (function(){  "
-                 "           var s = 0; "
-                 "           return { inc: function() {s++}, "
-                 "                    s: function() {return s} };});"
-                 "var o1 = gen(); var o2 = gen();"
-                 "[o1.s(),o2.s(),o1.inc(),o1.s(),o2.s(),o2.inc(),o1.s(),o2.s()]"),
-      nxt_string("0,0,,1,0,,1,1") },
-
-    /* Recursive fibonacci. */
-
-    { nxt_string("function fibo(n) {"
-                 "    if (n > 1)"
-                 "        return fibo(n-1) + fibo(n-2)\n"
-                 "     return 1"
-                 "}"
-                 "fibo(10)"),
-      nxt_string("89") },
-
-    { nxt_string("function fibo(n) {"
-                 "    if (n > 1)"
-                 "        return fibo(n-1) + fibo(n-2)\n"
-                 "     return '.'"
-                 "}"
-                 "fibo(10).length"),
-      nxt_string("89") },
-
-    { nxt_string("function fibo(n) {"
-                 "    if (n > 1)"
-                 "        return fibo(n-1) + fibo(n-2)\n"
-                 "     return 1"
-                 "}"
-                 "fibo('10')"),
-      nxt_string("89") },
-
-    { nxt_string("function add(a, b) { return a + b }"
-                 "function mul(a, b) { return a * b }"
-                 "function f(a, b) {"
-                 "    return a + mul(add(1, 2), add(2, 3)) + b"
-                 "}"
-                 "f(30, 70)"),
-      nxt_string("115") },
-
-    { nxt_string("function a(x, y) { return x + y }"
-                 "function b(x, y) { return x * y }"
-                 "a(3, b(4, 5))"),
-      nxt_string("23") },
-
-    { nxt_string("function x(n) { return n }; x('12'.substr(1))"),
-      nxt_string("2") },
-
-    { nxt_string("function f(a) { a *= 2 } f(10)"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() { return 5 } f()"),
-      nxt_string("5") },
-
-    { nxt_string("function g(x) { return x + 1 }"
-                 "function f(x) { return x } f(g)(2)"),
-      nxt_string("3") },
-
-    { nxt_string("function f() { return 5 } f(1)"),
-      nxt_string("5") },
-
-    { nxt_string("function f() {} f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f() {;} f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f(){return} f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f(){return;} f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f(){return\n1} f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f(a) { return a + 1 } var b = f(2); b"),
-      nxt_string("3") },
-
-    { nxt_string("var f = function(a) { a *= 2; return a }; f(10)"),
-      nxt_string("20") },
-
-    { nxt_string("var f = function b(a) { a *= 2; return a }; f(10)"),
-      nxt_string("20") },
-
-    { nxt_string("var f = function b(a) { a *= 2; return a }; b(10)"),
-      nxt_string("ReferenceError: \"b\" is not defined in 1") },
-
-    { nxt_string("var f; f = function(a) { a *= 2; return a }; f(10)"),
-      nxt_string("20") },
-
-    { nxt_string("var f; f = function b(a) { a *= 2; return a }; f(10)"),
-      nxt_string("20") },
-
-    { nxt_string("var a, f = a = function(a) { a *= 2; return a }; f(10)"),
-      nxt_string("20") },
-
-    { nxt_string("var a, f = a = function(a) { a *= 2; return a }; a(10)"),
-      nxt_string("20") },
-
-    { nxt_string("var f = function b(a) { a *= 2; return a } = 5"),
-      nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
-
-    { nxt_string("function a() { return { x:2} }; var b = a(); b.x"),
-      nxt_string("2") },
-
-    { nxt_string("var a = {}; function f(a) { return a + 1 } a.b = f(2); a.b"),
-      nxt_string("3") },
-
-    { nxt_string("(function(x) { return x + 1 })(2)"),
-      nxt_string("3") },
-
-    { nxt_string("(function(x) { return x + 1 }(2))"),
-      nxt_string("3") },
-
-    { nxt_string("var a = function() { return 1 }(); a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = (function() { return 1 })(); a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = (function(a) { return a + 1 })(2); a"),
-      nxt_string("3") },
-
-    { nxt_string("var a = (function(a) { return a + 1 }(2)); a"),
-      nxt_string("3") },
-
-    { nxt_string("var a = +function(a) { return a + 1 }(2); a"),
-      nxt_string("3") },
-
-    { nxt_string("var a = -function(a) { return a + 1 }(2); a"),
-      nxt_string("-3") },
-
-    { nxt_string("var a = !function(a) { return a + 1 }(2); a"),
-      nxt_string("false") },
-
-    { nxt_string("var a = ~function(a) { return a + 1 }(2); a"),
-      nxt_string("-4") },
-
-    { nxt_string("var a = void function(a) { return a + 1 }(2); a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = true && function(a) { return a + 1 }(2); a"),
-      nxt_string("3") },
-
-    { nxt_string("var a; a = 0, function(a) { return a + 1 }(2); a"),
-      nxt_string("0") },
-
-    { nxt_string("var a = (0, function(a) { return a + 1 }(2)); a"),
-      nxt_string("3") },
-
-    { nxt_string("var a = 0, function(a) { return a + 1 }(2); a"),
-      nxt_string("SyntaxError: Unexpected token \"function\" in 1") },
-
-    { nxt_string("var a = (0, function(a) { return a + 1 }(2)); a"),
-      nxt_string("3") },
-
-    { nxt_string("var a = +function f(a) { return a + 1 }(2);"
-                 "var b = f(5); a"),
-      nxt_string("ReferenceError: \"f\" is not defined in 1") },
-
-    { nxt_string("var o = { f: function(a) { return a * 2 } }; o.f(5)"),
-      nxt_string("10") },
-
-    { nxt_string("var o = {}; o.f = function(a) { return a * 2 }; o.f(5)"),
-      nxt_string("10") },
-
-    { nxt_string("var o = { x: 1, f: function() { return this.x } }; o.f()"),
-      nxt_string("1") },
-
-    { nxt_string("var o = { x: 1, f: function(a) { return this.x += a } };"
-                 "o.f(5) +' '+ o.x"),
-      nxt_string("6 6") },
-
-    { nxt_string("var f = function(a) { return 3 }; f.call()"),
-      nxt_string("3") },
-
-    { nxt_string("var f = function(a) { return this }; f.call(5)"),
-      nxt_string("5") },
-
-    { nxt_string("var f = function(a, b) { return this + a }; f.call(5, 1)"),
-      nxt_string("6") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "f.call(5, 1, 2)"),
-      nxt_string("8") },
-
-    { nxt_string("var f = function(a) { return 3 }; f.apply()"),
-      nxt_string("3") },
-
-    { nxt_string("var f = function(a) { return this }; f.apply(5)"),
-      nxt_string("5") },
-
-    { nxt_string("var f = function(a) { return this + a }; f.apply(5, 1)"),
-      nxt_string("TypeError: second argument is not an array-like object") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "f.apply(5, [1, 2])"),
-      nxt_string("8") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "f.apply(5, [1, 2], 3)"),
-      nxt_string("8") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "f.apply(5, {'length':2, '0':1, '1':2})"),
-      nxt_string("8") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "f.apply(5, {'length':2, '0':1, '1':2, '2':3})"),
-      nxt_string("8") },
-
-    { nxt_string("var f = function(a, b, c) { return this + a + b + c};"
-                 "f.apply(\"a\", {'length':2, '0':1, '1':2, '2':3})"),
-      nxt_string("a12undefined") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "f.apply(5, {'length':3, '0':1, '1':2, '2':3})"),
-      nxt_string("8") },
-
-    { nxt_string("var f = function(a) { return this + a };"
-                 "f.apply(5, {'nolength':3, '0':1, '1':2})"),
-      nxt_string("NaN") },
-
-    { nxt_string("var f = function(a) { return this };"
-                 "f.apply(5, {'nolength':3, '0':1, '1':2})"),
-      nxt_string("5") },
-
-    { nxt_string("var f = function(a, b, c) { return this + a + b + c };"
-                 "f.apply(\"a\", {'length':3, '0':1, '1':2})"),
-      nxt_string("a12undefined") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "f.apply(\"a\", {'length':2, '0':undefined, '1':null})"),
-      nxt_string("aundefinednull") },
-
-    { nxt_string("var f = function() { return this };"
-                 "f.apply(123, {})"),
-      nxt_string("123") },
-
-    { nxt_string("String.prototype.concat.apply('a', "
-                 "{length:2, 0:{toString:function() {return 'b'}}, 1:'c'})"),
-      nxt_string("abc") },
-
-#if 0
-    /* TODO: non-primitive length values are not supported yet. */
-    { nxt_string("String.prototype.concat.apply('a',"
-                 "{length:{valueOf:function() {return 2}},  0:'b', 1:'c'})"),
-      nxt_string("abc") },
-#else
-    { nxt_string("String.prototype.concat.apply('a',"
-                 "{length:{valueOf:function() {return 2}},  0:'b', 1:'c'})"),
-      nxt_string("TypeError: non-primitive length values are not supported") },
-#endif
-
-    { nxt_string("var a = function() { return 1 } + ''; a"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("''.concat.call()"),
-      nxt_string("TypeError: \"this\" argument is null or undefined") },
-
-    { nxt_string("''.concat.call('a', 'b', 'c')"),
-      nxt_string("abc") },
-
-    { nxt_string("''.concat.call('a')"),
-      nxt_string("a") },
-
-    { nxt_string("''.concat.call('a', [ 'b', 'c' ])"),
-      nxt_string("ab,c") },
-
-    { nxt_string("''.concat.call('a', [ 'b', 'c' ], 'd')"),
-      nxt_string("ab,cd") },
-
-    { nxt_string("''.concat.apply()"),
-      nxt_string("TypeError: \"this\" argument is null or undefined") },
-
-    { nxt_string("''.concat.apply('a')"),
-      nxt_string("a") },
-
-    { nxt_string("''.concat.apply('a', 'b')"),
-      nxt_string("TypeError: second argument is not an array-like object") },
-
-    { nxt_string("''.concat.apply('a', [ 'b', 'c' ])"),
-      nxt_string("abc") },
-
-    { nxt_string("''.concat.apply('a', [ 'b', 'c' ], 'd')"),
-      nxt_string("abc") },
-
-    { nxt_string("[].join.call([1,2,3])"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("[].join.call([1,2,3], ':')"),
-      nxt_string("1:2:3") },
-
-    { nxt_string("[].join.call([1,2,3], 55)"),
-      nxt_string("1552553") },
-
-    { nxt_string("[].join.call()"),
-      nxt_string("TypeError: cannot convert undefined to object") },
-
-    { nxt_string("[].slice.call()"),
-      nxt_string("TypeError: cannot convert undefined to object") },
-
-    { nxt_string("function f(a) {} ; var a = f; var b = f; a === b"),
-      nxt_string("true") },
-
-    { nxt_string("function f() {} ; f.toString()"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("function f() {}; f"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("function f() {}; f = f + 1; f"),
-      nxt_string("[object Function]1") },
-
-    { nxt_string("function a() { return 1 }"
-                 "function b() { return a }"
-                 "function c() { return b }"
-                 "c()()()"),
-      nxt_string("1") },
-
-#if 0
-    { nxt_string("function f() {}; f += 1; f"),
-      nxt_string("[object Function]1") },
-#endif
-
-    { nxt_string("function f() {}; function g() { return f }; g()"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("function f(a) { return this+a }; var a = f; a.call('0', 1)"),
-      nxt_string("01") },
-
-    { nxt_string("function f(a) { return this+a }; f.call('0', 1)"),
-      nxt_string("01") },
-
-    { nxt_string("function f(a) { return this+a };"
-                 "function g(f, a, b) { return f.call(a, b) }; g(f, '0', 1)"),
-      nxt_string("01") },
-
-    { nxt_string("function f(a) { return this+a };"
-                 "var o = { g: function (f, a, b) { return f.call(a, b) } };"
-                 "o.g(f, '0', 1)"),
-      nxt_string("01") },
-
-    { nxt_string("var concat = ''.concat; concat(1,2,3)"),
-      nxt_string("TypeError: \"this\" argument is null or undefined") },
-
-    { nxt_string("var concat = ''.concat; concat.call(1,2,3)"),
-      nxt_string("123") },
-
-    { nxt_string("var concat = ''.concat; concat.yes = 'OK';"
-                 "concat.call(1,2,3, concat.yes)"),
-      nxt_string("123OK") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1'); b('2', '3')"),
-      nxt_string("123") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1', '2'); b('3')"),
-      nxt_string("123") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1', 2, '3'); b()"),
-      nxt_string("123") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1'); b.call('0', '2', '3')"),
-      nxt_string("123") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1', '2'); b.call('0', '3')"),
-      nxt_string("123") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1', '2', '3'); b.call('0')"),
-      nxt_string("123") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1', '2', '3'); b.call()"),
-      nxt_string("123") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1'); b.apply('0', ['2', '3'])"),
-      nxt_string("123") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1', '2'); b.apply('0', ['3'])"),
-      nxt_string("123") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1', '2', '3'); b.apply('0')"),
-      nxt_string("123") },
-
-    { nxt_string("var f = function(a, b) { return this + a + b };"
-                 "var b = f.bind('1', '2', '3'); b.apply()"),
-      nxt_string("123") },
-
-    { nxt_string("function f(a, b) { return this + a + b }"
-                 "var b = f.bind('1', '2', '3'); b.apply()"),
-      nxt_string("123") },
-
-    { nxt_string("function f() { var a; return (function() { a = 1; return a; }).bind()() } f()"),
-      nxt_string("1") },
-
-    { nxt_string("function f() { var a; function baz() { a = 1; return a; } return baz.bind()(); } f()"),
-      nxt_string("1") },
-
-    { nxt_string("(function(){ var a = 1; return (function() { return a; })})().bind()()"),
-      nxt_string("1") },
-
-    { nxt_string("function f() { var a = 1; function baz() { return a; } return baz; } f().bind()()"),
-      nxt_string("1") },
-
-    { nxt_string("function f() { var t = 1; function baz() { return t; } return baz; }"
-                 "f().bind()();"),
-      nxt_string("1") },
-
-    { nxt_string("(function(a) { var s = typeof g, q = g; var g = 1; s += typeof g; function g(b) { return a + b }; return q; })(1)(2)"),
-      nxt_string("3")},
-
-    { nxt_string("(function(a) { var g = f; var f = 1; function f() { return a; } return g; })(42)()"),
-      nxt_string("42") },
-
-    { nxt_string("function f(a, b) { return a + b }"
-                 "f(3,4) === f.bind()(3,4)"),
-      nxt_string("true") },
-
-    { nxt_string("var obj = {prop:'abc'}; "
-                 "var func = function(x) { "
-                 "    return this === obj && x === 1 && arguments[0] === 1 "
-                 "           && arguments.length === 1 && this.prop === 'abc';"
-                 "};"
-                 "Function.prototype.bind.call(func, obj, 1)()"),
-      nxt_string("true") },
-
-    { nxt_string("function F(a, b) { this.a = a + b }"
-                 "var o = new F(1, 2);"
-                 "o.a"),
-      nxt_string("3") },
-
-    { nxt_string("function F(a, b) { this.a = a + b; return { a: 7 } }"
-                 "var o = new F(1, 2);"
-                 "o.a"),
-      nxt_string("7") },
-
-    { nxt_string("function F(a, b) { return }"
-                 "F.prototype.constructor === F"),
-      nxt_string("true") },
-
-    { nxt_string("function F() { return }"
-                 "F.prototype.ok = 'OK';"
-                 "var o = new F(); o.ok"),
-      nxt_string("OK") },
-
-    { nxt_string("function F() { return }"
-                 "var o = new F();"
-                 "o.constructor === F"),
-      nxt_string("true") },
-
-    { nxt_string("function F() { return }"
-                 "var o = new F();"
-                 "o.__proto__ === F.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("var f = { F: function(){} }; var o = new f.F();"
-                 "o.__proto__ === f.F.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("function F(){}; typeof F.prototype"),
-      nxt_string("object") },
-
-    { nxt_string("var F = function (){}; typeof F.prototype"),
-      nxt_string("object") },
-
-    { nxt_string("new decodeURI('%00')"),
-      nxt_string("TypeError: function is not a constructor")},
-
-    { nxt_string("new ''.toString"),
-      nxt_string("TypeError: function is not a constructor")},
-
-    { nxt_string("function F() { return Number }"
-                 "var o = new (F())(5);"
-                 "typeof o +' '+ o"),
-      nxt_string("object 5") },
-
-    { nxt_string("function F() { return Number }"
-                 "var o = new (F());"
-                 "typeof o +' '+ o"),
-      nxt_string("object 0") },
-
-    { nxt_string("var o = new function F() { return Number }()(5);"
-                 "typeof o +' '+ o"),
-      nxt_string("number 5") },
-
-    { nxt_string("var o = new (function F() { return Number }())(5);"
-                 "typeof o +' '+ o"),
-      nxt_string("object 5") },
-
-    { nxt_string("var o = new (new function F() { return Number }())(5);"
-                 "typeof o +' '+ o"),
-      nxt_string("object 5") },
-
-    { nxt_string("var o = new new function F() { return Number }()(5);"
-                 "typeof o +' '+ o"),
-      nxt_string("object 5") },
-
-    { nxt_string("var b; function F(x) { return {a:x} }"
-                 "function G(y) { b = y; return F }"
-                 "var o = new G(3)(5);"
-                 "b + ' ' + o.a"),
-      nxt_string("3 5") },
-
-    { nxt_string("var b; function F(x) { return {a:x} }"
-                 "function G(y) { b = y; return F }"
-                 "var o = new (new G(3))(5);"
-                 "b + ' ' + o.a"),
-      nxt_string("3 5") },
-
-    { nxt_string("var b; function F(x) { return {a:x} }"
-                 "function G(y) { b = y; return F }"
-                 "var o = new new G(3)(5);"
-                 "b + ' ' + o.a"),
-      nxt_string("3 5") },
-
-    { nxt_string("var b; function F(x) { return {a:x} }"
-                 "var g = { G: function (y) { b = y; return F } };"
-                 "var o = new new g.G(3)(5);"
-                 "b + ' ' + o.a"),
-      nxt_string("3 5") },
-
-    { nxt_string("function a() { return function(x) { return x + 1 } }"
-                 "var b = a(); b(2)"),
-      nxt_string("3") },
-
-    /* arguments object. */
-
-    { nxt_string("arguments"),
-      nxt_string("SyntaxError: \"arguments\" object in global scope in 1") },
-
-    { nxt_string("{arguments}"),
-      nxt_string("SyntaxError: \"arguments\" object in global scope in 1") },
-
-    { nxt_string("var arguments"),
-      nxt_string("SyntaxError: Identifier \"arguments\" is forbidden in var declaration in 1") },
-
-    { nxt_string("for (var arguments in []) {}"),
-      nxt_string("SyntaxError: Identifier \"arguments\" is forbidden in var declaration in 1") },
-
-    { nxt_string("function arguments(){}"),
-      nxt_string("SyntaxError: Identifier \"arguments\" is forbidden in function declaration in 1") },
-
-    { nxt_string("(function () {arguments = [];})"),
-      nxt_string("SyntaxError: Identifier \"arguments\" is forbidden as left-hand in assignment in 1") },
-
-    { nxt_string("(function(){return arguments[0];})(1,2,3)"),
-      nxt_string("1") },
-
-    { nxt_string("(function(){return arguments[2];})(1,2,3)"),
-      nxt_string("3") },
-
-    { nxt_string("(function(){return arguments[3];})(1,2,3)"),
-      nxt_string("undefined") },
-
-    { nxt_string("(function(a,b,c){return a;})(1,2,3)"),
-      nxt_string("1") },
-
-    { nxt_string("(function(a,b,c){arguments[0] = 4; return a;})(1,2,3)"),
-      nxt_string("1") },
-
-    { nxt_string("(function(a,b,c){a = 4; return arguments[0];})(1,2,3)"),
-      nxt_string("1") },
-
-    { nxt_string("function check(v) {if (v == false) {throw TypeError('Too few arguments')}}; "
-                 "function f() {check(arguments.length > 1); return 1}; f()"),
-      nxt_string("TypeError: Too few arguments") },
-
-    { nxt_string("function check(v) {if (v == false) {throw TypeError('Too few arguments')}}; "
-                 "function f() {check(arguments.length > 1); return 1}; f(1,2)"),
-      nxt_string("1") },
-
-    { nxt_string("(function(a,b){delete arguments[0]; return arguments[0]})(1,1)"),
-      nxt_string("undefined") },
-
-    { nxt_string("(function(){return arguments.length;})()"),
-      nxt_string("0") },
-
-    { nxt_string("(function(){return arguments.length;})(1,2,3)"),
-      nxt_string("3") },
-
-    { nxt_string("(function(){arguments.length = 1; return arguments.length;})(1,2,3)"),
-      nxt_string("1") },
-
-     { nxt_string("(function(){return arguments[3];}).bind(null, 0)('a','b','c')"),
-       nxt_string("c") },
-
-    { nxt_string("(function(){return arguments.callee;})()"),
-      nxt_string("TypeError: \"caller\", \"callee\" properties may not be accessed") },
-
-    { nxt_string("(function(){return arguments.caller;})()"),
-      nxt_string("TypeError: \"caller\", \"callee\" properties may not be accessed") },
-
-    { nxt_string("function sum() { var args = Array.prototype.slice.call(arguments); "
-                 "return args.reduce(function(prev, curr) {return prev + curr})};"
-                 "[sum(1), sum(1,2), sum(1,2,3), sum(1,2,3,4)]"),
-      nxt_string("1,3,6,10") },
-
-    { nxt_string("function concat(sep) { var args = Array.prototype.slice.call(arguments, 1); "
-                 "return args.join(sep)};"
-                 "[concat('.',1,2,3), concat('+',1,2,3,4)]"),
-      nxt_string("1.2.3,1+2+3+4") },
-
-    /* rest parameters. */
-
-    { nxt_string("function myFoo(a,b,...other) { return other };"
-                 "myFoo(1,2,3,4,5);" ),
-      nxt_string("3,4,5") },
-
-    { nxt_string("function myFoo(a,b,...other, c) { return other };"),
-      nxt_string("SyntaxError: Unexpected token \"c\" in 1") },
-
-    { nxt_string("function sum(a, b, c, ...other) { return a+b+c+other[2] };"
-                 "sum(\"one \",2,\" three \",\"four \",\"five \",\"the long enough sixth argument \");"),
-      nxt_string("one 2 three the long enough sixth argument ") },
-
-    { nxt_string("function myFoo1(a,...other) { return other };"
-                 "function myFoo2(a,b,...other) { return other };"
-                 "myFoo1(1,2,3,4,5,myFoo2(1,2,3,4));"),
-      nxt_string("2,3,4,5,3,4") },
-
-    { nxt_string("function myFoo(...other) { return (other instanceof Array) };"
-                 "myFoo(1);" ),
-      nxt_string("true") },
-
-    { nxt_string("function myFoo(a,...other) { return other.length };"
-                 "myFoo(1,2,3,4,5);" ),
-      nxt_string("4") },
-
-    { nxt_string("function myFoo(a,b,...other) { return other };"
-                 "myFoo(1,2);" ),
-      nxt_string("") },
-
-    /* arrow functions. */
-
-    { nxt_string("()"),
-      nxt_string("SyntaxError: Unexpected token \")\" in 1") },
-
-    { nxt_string("() => "),
-      nxt_string("SyntaxError: Unexpected end of input in 1") },
-
-    { nxt_string("() => {"),
-      nxt_string("SyntaxError: Unexpected end of input in 1") },
-
-    { nxt_string("a\n => 1"),
-      nxt_string("SyntaxError: Unexpected token \"=>\" in 2") },
-
-    { nxt_string("new (()=>1)"),
-      nxt_string("TypeError: function is not a constructor")},
-
-    { nxt_string("(\n) => {}"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("a => 1"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("({f:()=>1, g:()=>2}).f()"),
-      nxt_string("1") },
-
-    { nxt_string("var f = f => {return 1;}; f()"),
-      nxt_string("1") },
-
-    { nxt_string("var f = (f) => {return 1;}; f()"),
-      nxt_string("1") },
-
-    { nxt_string("var f = (f, a, b) => {return 1;}; f()"),
-      nxt_string("1") },
-
-    { nxt_string("var f = () => {return 1;}; f()"),
-      nxt_string("1") },
-
-    { nxt_string("(f => {return 1;})()"),
-      nxt_string("1") },
-
-    { nxt_string("((f) => {return 1;})()"),
-      nxt_string("1") },
-
-    { nxt_string("(((f) => {return 1;}))()"),
-      nxt_string("1") },
-
-    { nxt_string("var f = f => 1; f()"),
-      nxt_string("1") },
-
-    { nxt_string("() => 1"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("var f = ()=>{}; f()"),
-      nxt_string("undefined") },
-
-    { nxt_string("var f = ()=>({}); f()"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
-                 "materials.map(material => { return material.length; });"),
-      nxt_string("8,6,7,9") },
-
-    { nxt_string("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
-                 "materials.map(material => material.length);"),
-      nxt_string("8,6,7,9") },
-
-    { nxt_string("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
-                 "materials.map(material => { material.length });"),
-      nxt_string(",,,") },
-
-    { nxt_string("function f(a, b, c) {a = 1; return () => { return arguments[1]; };};"
-                 "f(1, 2, 3)('a', 'b');"),
-      nxt_string("2") },
-
-    { nxt_string("var f = (...c) => { return (function() { return arguments.length; }).bind(null, c); };"
-                 "var x = f(1,'a',false, {}); x()"),
-      nxt_string("1") },
-
-    { nxt_string("var f = (...c) => { return (function() { return arguments.length; }).bind(null, c); };"
-                 "var x = f(1,'a',false, {}); x(1,2,3)"),
-      nxt_string("4") },
-
-    { nxt_string("function Car(){ this.age = 0; (() => { this.age++;})();}"
-                 "(new Car()).age"),
-      nxt_string("1") },
-
-    { nxt_string("function Car(){ this.age = 0; (function(){ this.age++;})();}"
-                 "(new Car()).age"),
-      nxt_string("TypeError: cannot get property \"age\" of undefined") },
-
-    /* arrow functions + global this. */
-
-    { nxt_string("(() => this)()"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("(() => this).call('abc')"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("(() => this).apply('abc')"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("(() => this).bind('abc')()"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("(function() { return (() => this); })()()"),
-      nxt_string("undefined") },
-
-    { nxt_string("(function() { return (() => this); }).call('abc')()"),
-      nxt_string("abc") },
-
-    { nxt_string("(function() { return (() => this); }).bind('abc')()()"),
-      nxt_string("abc") },
-
-    { nxt_string("(function() { return (() => this); })"
-                 ".call('abc').call('bca')"),
-      nxt_string("abc") },
-
-    { nxt_string("(function() { return (() => this); })"
-                 ".call('abc').bind('bca')()"),
-      nxt_string("abc") },
-
-    { nxt_string("(function() { return function() { return () => this; }; })"
-                 ".call('bca').call('abc')()"),
-      nxt_string("abc") },
-
-     { nxt_string("var f = () => 1; f.prototype"),
-       nxt_string("undefined") },
-
-     { nxt_string("var f = (a,b) => 0; f.length"),
-       nxt_string("2") },
-
-    { nxt_string("var o = Object.create(f => 1); o.length = 3"),
-      nxt_string("TypeError: Cannot assign to read-only property \"length\" of object") },
-
-    /* Scopes. */
-
-    { nxt_string("function f(x) { a = x } var a; f(5); a"),
-      nxt_string("5") },
-
-    { nxt_string("function f(x) { var a = x } var a = 2; f(5); a"),
-      nxt_string("2") },
-
-    { nxt_string("function f(a) { return a } var a = '2'; a + f(5)"),
-      nxt_string("25") },
-
-    { nxt_string("for (var i = 0; i < 5; i++); i"),
-      nxt_string("5") },
-
-    { nxt_string("for (var i = 0, j; i < 5; i++); j"),
-      nxt_string("undefined") },
-
-    { nxt_string("for (var i = 0, j, k = 3; i < 5; i++); k"),
-      nxt_string("3") },
-
-    { nxt_string("var o = { a: 1, b: 2, c: 3 }, s = ''; "
-                 "for (var i in o) { s += i }; s"),
-      nxt_string("abc") },
-
-    { nxt_string("var o = { a: 1, b: 2, c: 3 }; for (var i in o); i"),
-      nxt_string("c") },
-
-    { nxt_string("var o = {}; i = 7; for (var i in o); i"),
-      nxt_string("7") },
-
-    { nxt_string("var a = [1,2,3]; for (var i in a); i"),
-      nxt_string("2") },
-
-    /* RegExp. */
-
-    { nxt_string("/./x"),
-      nxt_string("SyntaxError: Invalid RegExp flags \"x\" in 1") },
-
-    { nxt_string("/"),
-      nxt_string("SyntaxError: Unterminated RegExp \"/\" in 1") },
-
-    { nxt_string("/a\n/"),
-      nxt_string("SyntaxError: Unterminated RegExp \"/a\" in 1") },
-
-    { nxt_string("/a\r/"),
-      nxt_string("SyntaxError: Unterminated RegExp \"/a\" in 1") },
-
-    { nxt_string("/a\\q/"),
-      nxt_string("/a\\q/") },
-
-    { nxt_string("/\\\\/"),
-      nxt_string("/\\\\/") },
-
-    { nxt_string("/\\\\\\/"),
-      nxt_string("SyntaxError: Unterminated RegExp \"/\\\\\\/\" in 1") },
-
-    { nxt_string("/\\\\\\\\/"),
-      nxt_string("/\\\\\\\\/") },
-
-    { nxt_string("/\\\\\\//"),
-      nxt_string("/\\\\\\//") },
-
-    { nxt_string("/[A-Z/]/"),
-      nxt_string("/[A-Z/]/") },
-
-    { nxt_string("/[A-Z\n]/"),
-      nxt_string("SyntaxError: Unterminated RegExp \"/[A-Z\" in 1") },
-
-    { nxt_string("/[A-Z\\\n]/"),
-      nxt_string("SyntaxError: Unterminated RegExp \"/[A-Z\\\" in 1") },
-
-    { nxt_string("/\\\n/"),
-      nxt_string("SyntaxError: Unterminated RegExp \"/\\\" in 1") },
-
-    { nxt_string("/^[A-Za-z0-9+/]{4}$/.test('////')"),
-      nxt_string("true") },
-
-    { nxt_string("'[]!\"#$%&\\'()*+,.\\/:;<=>?@\\^_`{|}-'.split('')"
-                 ".every(ch=>/[\\]\\[!\"#$%&'()*+,.\\/:;<=>?@\\^_`{|}-]/.test(ch))"),
-      nxt_string("true") },
-
-    { nxt_string("/a\\q/.test('a\\q')"),
-      nxt_string("true") },
-
-    { nxt_string("/(\\.(?!com|org)|\\/)/.test('ah.info')"),
-      nxt_string("true") },
-
-    { nxt_string("/(/.test('')"),
-      nxt_string("SyntaxError: pcre_compile(\"(\") failed: missing ) in 1") },
-
-    { nxt_string("/+/.test('')"),
-      nxt_string("SyntaxError: pcre_compile(\"+\") failed: nothing to repeat at \"+\" in 1") },
-
-    { nxt_string("/^$/.test('')"),
-      nxt_string("true") },
-
-    { nxt_string("var a = /\\d/; a.test('123')"),
-      nxt_string("true") },
-
-    { nxt_string("var a = /\\d/; a.test('abc')"),
-      nxt_string("false") },
-
-    { nxt_string("/\\d/.test('123')"),
-      nxt_string("true") },
-
-    { nxt_string("/\\d/.test(123)"),
-      nxt_string("true") },
-
-    { nxt_string("/undef/.test()"),
-      nxt_string("true") },
-
-    { nxt_string("var s = { toString: function() { return 123 } };"
-                 "/\\d/.test(s)"),
-      nxt_string("true") },
-
-    { nxt_string("/\\d/.test('abc')"),
-      nxt_string("false") },
-
-    { nxt_string("/abc/i.test('ABC')"),
-      nxt_string("true") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* FIXME */
-    { nxt_string("/абв/i.test('АБВ')"),
-      nxt_string("true") },
-#endif
-
-    { 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("/\\d/.exec('123')"),
-      nxt_string("1") },
-
-    { nxt_string("/\\d/.exec(123)"),
-      nxt_string("1") },
-
-    { nxt_string("/undef/.exec()"),
-      nxt_string("undef") },
-
-    { nxt_string("var s = { toString: function() { return 123 } };"
-                 "/\\d/.exec(s)"),
-      nxt_string("1") },
-
-    { nxt_string("var a = /^$/.exec(''); a.length +' '+ a"),
-      nxt_string("1 ") },
-
-    { nxt_string("var r = /3/g; r.exec('123') +' '+ r.exec('3')"),
-      nxt_string("3 null") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* FIXME */
-    { nxt_string("var r = /бв/ig;"
-                 "var a = r.exec('АБВ');"
-                 "r.lastIndex +' '+ a +' '+ "
-                 "r.source +' '+ r.source.length +' '+ r"),
-      nxt_string("3 БВ бв 2 /бв/gi") },
-#endif
-
-    { nxt_string("var r = /\\x80/g; r.exec('\\u0081\\u0080'.toBytes());"
-                 "r.lastIndex +' '+ r.source +' '+ r.source.length +' '+ r"),
-      nxt_string("1 \\x80 4 /\\x80/g") },
-
-    /*
-     * It seems that "/стоп/ig" fails on early PCRE versions.
-     * It fails at least in 8.1 and works at least in 8.31.
-     */
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* FIXME */
-    { nxt_string("var r = /Стоп/ig;"
-                 "var a = r.exec('АБВДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯСТОП');"
-                 "r.lastIndex +' '+ a +' '+ r.source +' '+ r"),
-      nxt_string("35 СТОП Стоп /Стоп/gi") },
-#endif
-
-    { nxt_string("var r = /quick\\s(brown).+?(jumps)/ig;"
-                "var a = r.exec('The Quick Brown Fox Jumps Over The Lazy Dog');"
-                "a[0] +' '+ a[1] +' '+ a[2] +' '+ a[3] +' '+ "
-                "a.index +' '+ r.lastIndex +' '+ a.input"),
-      nxt_string("Quick Brown Fox Jumps Brown Jumps undefined "
-                 "4 25 The Quick Brown Fox Jumps Over The Lazy Dog") },
-
-    { nxt_string("var r = /a/.exec('a'); ['groups' in r, typeof r.groups]"),
-      nxt_string("true,undefined") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* PCRE bug in groups code */
-    { nxt_string("var r = /(?<m>[0-9]{2})\\/(?<d>[0-9]{2})\\/(?<y>[0-9]{4})/;"
-                 "var g = r.exec('12/31/1986').groups;"
-                 "g.d + '.' + g.m + '.' + g.y"),
-      nxt_string("31.12.1986") },
-
-    { nxt_string("var g = /(?<r>(?<no>no)?(?<yes>yes)?)/.exec('yes').groups;"
-                 "[Object.keys(g).length,'no' in g, typeof g.no, g.yes, g.r]"),
-      nxt_string("3,true,undefined,yes,yes") },
-#endif
-
-    { nxt_string("var s; var r = /./g; while (s = r.exec('abc')); s"),
-      nxt_string("null") },
-
-    { nxt_string("var r = /LS/i.exec(false); r[0]"),
-      nxt_string("ls") },
-
-    { nxt_string("var r = (/^.+$/mg), s = 'ab\\nc'; [r.exec(s), r.exec(s)]"),
-      nxt_string("ab,c") },
-
-    { nxt_string("var r = (/^.+$/mg); [r.global, r.multiline, r.ignoreCase]"),
-      nxt_string("true,true,false") },
-
-    { nxt_string("var r = /./; r"),
-      nxt_string("/./") },
-
-    { nxt_string("var r = new RegExp(); r"),
-      nxt_string("/(?:)/") },
-
-    { nxt_string("var r = new RegExp('.'); r"),
-      nxt_string("/./") },
-
-    { nxt_string("var r = new RegExp('.', 'ig'); r"),
-      nxt_string("/./gi") },
-
-    { nxt_string("var r = new RegExp('abc'); r.test('00abc11')"),
-      nxt_string("true") },
-
-    { nxt_string("var r = new RegExp('abc', 'i'); r.test('00ABC11')"),
-      nxt_string("true") },
-
-    { nxt_string("RegExp('α'.repeat(33)).toString()[32]"),
-      nxt_string("α") },
-
-    { nxt_string("new RegExp('', 'x')"),
-      nxt_string("SyntaxError: Invalid RegExp flags \"x\"") },
-
-    { nxt_string("RegExp({})"),
-      nxt_string("/[object Object]/") },
-
-    { nxt_string("RegExp(true)"),
-      nxt_string("/true/") },
-
-    { nxt_string("RegExp(undefined)"),
-      nxt_string("/(?:)/") },
-
-    { nxt_string("RegExp('abc', undefined)"),
-      nxt_string("/abc/") },
-
-    { nxt_string("RegExp('abc', {})"),
-      nxt_string("SyntaxError: Invalid RegExp flags \"[object Object]\"") },
-
-    { nxt_string("RegExp(/expr/)"),
-      nxt_string("/expr/") },
-
-    { nxt_string("RegExp(/expr/i).ignoreCase"),
-      nxt_string("true") },
-
-    { nxt_string("RegExp(/expr/, 'x')"),
-      nxt_string("SyntaxError: Invalid RegExp flags \"x\"") },
-
-    { nxt_string("RegExp(new RegExp('expr'))"),
-      nxt_string("/expr/") },
-
-    { nxt_string("RegExp(new RegExp('expr')).multiline"),
-      nxt_string("false") },
-
-    { nxt_string("RegExp(new RegExp('expr'), 'm').multiline"),
-      nxt_string("true") },
-
-    { nxt_string("new RegExp('[')"),
-      nxt_string("SyntaxError: pcre_compile(\"[\") failed: missing terminating ] for character class") },
-
-    { nxt_string("new RegExp('\\\\')"),
-      nxt_string("SyntaxError: pcre_compile(\"\\\") failed: \\ at end of pattern") },
-
-    { nxt_string("[0].map(RegExp().toString)"),
-      nxt_string("TypeError: \"this\" argument is not a regexp") },
-
-    /* Non-standard ECMA-262 features. */
-
-    /* 0x10400 is not a surrogate pair of 0xD801 and 0xDC00. */
-
-    { nxt_string("var chars = '𐐀'; chars.length +' '+ chars.charCodeAt(0)"),
-      nxt_string("1 66560") },
-
-    /* es5id: 6.1, 0x104A0 is not a surrogate pair of 0xD801 and 0xDCA0. */
-
-    { nxt_string("var chars = '𐒠'; chars.length +' '+ chars.charCodeAt(0)"),
-      nxt_string("1 66720") },
-
-    /* Error object. */
-
-    { nxt_string("Error()"),
-      nxt_string("Error") },
-
-    { nxt_string("new Error()"),
-      nxt_string("Error") },
-
-    { nxt_string("Error('e')"),
-      nxt_string("Error: e") },
-
-    { nxt_string("var e = Error('e'); e.name = 'E'; e"),
-      nxt_string("E: e") },
-
-    { nxt_string("var e = Error('e'); e.name = ''; e"),
-      nxt_string("e") },
-
-    { nxt_string("var e = Error(); e.name = ''; e"),
-      nxt_string("") },
-
-    { nxt_string("var e = Error(); e.name = ''; e.message = 'e'; e"),
-      nxt_string("e") },
-
-    { nxt_string("Error('e').name + ': ' + Error('e').message"),
-      nxt_string("Error: e") },
-
-    { nxt_string("Error(1)"),
-      nxt_string("Error: 1") },
-
-    { nxt_string("Error.__proto__ == Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Error.prototype.name"),
-      nxt_string("Error") },
-
-    { nxt_string("Error.prototype.message"),
-      nxt_string("") },
-
-    { nxt_string("Error.prototype.constructor == Error"),
-      nxt_string("true") },
-
-    { nxt_string("Error.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("Error().__proto__ == Error.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Error().__proto__.__proto__ == Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("EvalError('e')"),
-      nxt_string("EvalError: e") },
-
-    { nxt_string("InternalError('e')"),
-      nxt_string("InternalError: e") },
-
-    { nxt_string("RangeError('e')"),
-      nxt_string("RangeError: e") },
-
-    { nxt_string("ReferenceError('e')"),
-      nxt_string("ReferenceError: e") },
-
-    { nxt_string("SyntaxError('e')"),
-      nxt_string("SyntaxError: e") },
-
-    { nxt_string("TypeError('e')"),
-      nxt_string("TypeError: e") },
-
-    { nxt_string("URIError('e')"),
-      nxt_string("URIError: e") },
-
-    { nxt_string("MemoryError('e')"),
-      nxt_string("MemoryError") },
-
-    { nxt_string("EvalError('e').name + ': ' + EvalError('e').message"),
-      nxt_string("EvalError: e") },
-
-    { nxt_string("InternalError('e').name + ': ' + InternalError('e').message"),
-      nxt_string("InternalError: e") },
-
-    { nxt_string("RangeError('e').name + ': ' + RangeError('e').message"),
-      nxt_string("RangeError: e") },
-
-    { nxt_string("ReferenceError('e').name + ': ' + ReferenceError('e').message"),
-      nxt_string("ReferenceError: e") },
-
-    { nxt_string("SyntaxError('e').name + ': ' + SyntaxError('e').message"),
-      nxt_string("SyntaxError: e") },
-
-    { nxt_string("TypeError('e').name + ': ' + TypeError('e').message"),
-      nxt_string("TypeError: e") },
-
-    { nxt_string("URIError('e').name + ': ' + URIError('e').message"),
-      nxt_string("URIError: e") },
-
-    { nxt_string("var e = EvalError('e'); e.name = 'E'; e"),
-      nxt_string("E: e") },
-
-    { nxt_string("var e = InternalError('e'); e.name = 'E'; e"),
-      nxt_string("E: e") },
-
-    { nxt_string("var e = RangeError('e'); e.name = 'E'; e"),
-      nxt_string("E: e") },
-
-    { nxt_string("var e = ReferenceError('e'); e.name = 'E'; e"),
-      nxt_string("E: e") },
-
-    { nxt_string("var e = SyntaxError('e'); e.name = 'E'; e"),
-      nxt_string("E: e") },
-
-    { nxt_string("var e = TypeError('e'); e.name = 'E'; e"),
-      nxt_string("E: e") },
-
-    { nxt_string("var e = URIError('e'); e.name = 'E'; e"),
-      nxt_string("E: e") },
-
-    /* Memory object is immutable. */
-
-    { nxt_string("var e = MemoryError('e'); e.name = 'E'"),
-      nxt_string("TypeError: Cannot add property \"name\", object is not extensible") },
-
-    { nxt_string("EvalError.prototype.name"),
-      nxt_string("EvalError") },
-
-    { nxt_string("InternalError.prototype.name"),
-      nxt_string("InternalError") },
-
-    { nxt_string("RangeError.prototype.name"),
-      nxt_string("RangeError") },
-
-    { nxt_string("ReferenceError.prototype.name"),
-      nxt_string("ReferenceError") },
-
-    { nxt_string("SyntaxError.prototype.name"),
-      nxt_string("SyntaxError") },
-
-    { nxt_string("TypeError.prototype.name"),
-      nxt_string("TypeError") },
-
-    { nxt_string("URIError.prototype.name"),
-      nxt_string("URIError") },
-
-    { nxt_string("MemoryError.prototype.name"),
-      nxt_string("InternalError") },
-
-    { nxt_string("EvalError.prototype.message"),
-      nxt_string("") },
-
-    { nxt_string("InternalError.prototype.message"),
-      nxt_string("") },
-
-    { nxt_string("RangeError.prototype.message"),
-      nxt_string("") },
-
-    { nxt_string("ReferenceError.prototype.message"),
-      nxt_string("") },
-
-    { nxt_string("SyntaxError.prototype.message"),
-      nxt_string("") },
-
-    { nxt_string("TypeError.prototype.message"),
-      nxt_string("") },
-
-    { nxt_string("URIError.prototype.message"),
-      nxt_string("") },
-
-    { nxt_string("MemoryError.prototype.message"),
-      nxt_string("") },
-
-    { nxt_string("EvalError.prototype.constructor == EvalError"),
-      nxt_string("true") },
-
-    { nxt_string("RangeError.prototype.constructor == RangeError"),
-      nxt_string("true") },
-
-    { nxt_string("ReferenceError.prototype.constructor == ReferenceError"),
-      nxt_string("true") },
-
-    { nxt_string("SyntaxError.prototype.constructor == SyntaxError"),
-      nxt_string("true") },
-
-    { nxt_string("TypeError.prototype.constructor == TypeError"),
-      nxt_string("true") },
-
-    { nxt_string("URIError.prototype.constructor == URIError"),
-      nxt_string("true") },
-
-    { nxt_string("EvalError.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("RangeError.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("ReferenceError.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("SyntaxError.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("TypeError.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("URIError.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("EvalError().__proto__ == EvalError.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("RangeError().__proto__ == RangeError.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("ReferenceError().__proto__ == ReferenceError.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("SyntaxError().__proto__ == SyntaxError.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("TypeError().__proto__ == TypeError.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("URIError().__proto__ == URIError.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("EvalError().__proto__.__proto__ == Error.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("RangeError().__proto__.__proto__ == Error.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("ReferenceError().__proto__.__proto__ == Error.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("SyntaxError().__proto__.__proto__ == Error.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("TypeError().__proto__.__proto__ == Error.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("URIError().__proto__.__proto__ == Error.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("MemoryError().__proto__ == MemoryError.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("MemoryError().__proto__.__proto__ == Error.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("typeof Error()"),
-      nxt_string("object") },
-
-    { nxt_string("typeof EvalError()"),
-      nxt_string("object") },
-
-    { nxt_string("typeof InternalError()"),
-      nxt_string("object") },
-
-    { nxt_string("typeof RangeError()"),
-      nxt_string("object") },
-
-    { nxt_string("typeof ReferenceError()"),
-      nxt_string("object") },
-
-    { nxt_string("typeof SyntaxError()"),
-      nxt_string("object") },
-
-    { nxt_string("typeof TypeError()"),
-      nxt_string("object") },
-
-    { nxt_string("typeof URIError()"),
-      nxt_string("object") },
-
-    { nxt_string("typeof MemoryError()"),
-      nxt_string("object") },
-
-    /* Exceptions. */
-
-    { nxt_string("throw null"),
-      nxt_string("null") },
-
-    { nxt_string("var a; try { throw null } catch (e) { a = e } a"),
-      nxt_string("null") },
-
-    { nxt_string("var a; try { throw Error('e') } catch (e) { a = e.message } a"),
-      nxt_string("e") },
-
-    { nxt_string("var a; try { NaN.toString(NaN) } catch (e) { a = e.name } a"),
-      nxt_string("RangeError") },
-
-    { nxt_string("try { throw null } catch (e) { throw e }"),
-      nxt_string("null") },
-
-    { nxt_string("try { throw Error('e') } catch (e) { throw Error(e.message + '2') }"),
-      nxt_string("Error: e2") },
-
-    { nxt_string("try { throw null } catch (null) { throw e }"),
-      nxt_string("SyntaxError: Unexpected token \"null\" in 1") },
-
-    { nxt_string("'a'.f()"),
-      nxt_string("TypeError: (intermediate value)[\"f\"] is not a function") },
-
-    { nxt_string("1..f()"),
-      nxt_string("TypeError: (intermediate value)[\"f\"] is not a function") },
-
-    { nxt_string("try {}"),
-      nxt_string("SyntaxError: Missing catch or finally after try in 1") },
-
-    { nxt_string("try{}catch(a[]"),
-      nxt_string("SyntaxError: Unexpected token \"[\" in 1") },
-
-    { nxt_string("function f(a) {return a;}; "
-                 "function thrower() {throw TypeError('Oops')}; "
-                 "f(thrower())"),
-      nxt_string("TypeError: Oops") },
-
-    { nxt_string("var a = 0; try { a = 5 }"
-                 "catch (e) { a = 9 } finally { a++ } a"),
-      nxt_string("6") },
-
-    { nxt_string("var a = 0; try { throw 3 }"
-                 "catch (e) { a = e } finally { a++ } a"),
-      nxt_string("4") },
-
-    { nxt_string("var a = 0; try { throw 3 }"
-                 "catch (e) { throw e + 1 } finally { a++ }"),
-      nxt_string("4") },
-
-    { nxt_string("var a = 0; try { throw 3 }"
-                 "catch (e) { a = e } finally { throw a }"),
-      nxt_string("3") },
-
-    { nxt_string("try { throw null } catch (e) { } finally { }"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = 0; try { throw 3 }"
-                 "catch (e) { throw 4 } finally { throw a }"),
-      nxt_string("0") },
-
-    { nxt_string("var a = 0; try { a = 5 } finally { a++ } a"),
-      nxt_string("6") },
-
-    { nxt_string("var a = 0; try { throw 5 } finally { a++ }"),
-      nxt_string("5") },
-
-    { nxt_string("var a = 0; try { a = 5 } finally { throw 7 }"),
-      nxt_string("7") },
-
-    { nxt_string("function f(a) {"
-                 "   if (a > 1) return f(a - 1);"
-                 "   throw 9; return a }"
-                 "var a = 0; try { a = f(5); a++ } catch(e) { a = e } a"),
-      nxt_string("9") },
-
-    { nxt_string("var a; try { try { throw 5 } catch (e) { a = e } throw 3 }"
-                 "       catch(x) { a += x } a"),
-      nxt_string("8") },
-
-    { nxt_string("throw\nnull"),
-      nxt_string("SyntaxError: Illegal newline after throw in 2") },
-
-    { nxt_string("for (var x in [1,2]) { try{ continue; } catch(e) {} } throw 1"),
-      nxt_string("1") },
-
-    { nxt_string("for (var x in [1,2]) { try{ break; } catch(e) {} } throw 1"),
-      nxt_string("1") },
-
-    { nxt_string("try\n {\n continue; } catch(e) {}"),
-      nxt_string("SyntaxError: Illegal continue statement in 3") },
-
-    { nxt_string("var a = 1; "
-                 "switch (a) {"
-                 "default:"
-                 "  try\n {\n continue; } "
-                 "  catch(e) {}"
-                 "}"),
-      nxt_string("SyntaxError: Illegal continue statement in 3") },
-
-    { nxt_string("try\n {\n break; } catch(e) {}"),
-      nxt_string("SyntaxError: Illegal break statement in 3") },
-
-    { nxt_string("try\n { }\n catch(e) {continue;}"),
-      nxt_string("SyntaxError: Illegal continue statement in 3") },
-
-    { nxt_string("try { } catch(e) {break;}"),
-      nxt_string("SyntaxError: Illegal break statement in 1") },
-
-    { nxt_string("try { continue; } finally {}"),
-      nxt_string("SyntaxError: Illegal continue statement in 1") },
-
-    { nxt_string("try { break; } finally {}"),
-      nxt_string("SyntaxError: Illegal break statement in 1") },
-
-    { nxt_string("try\n {\n try\n {\n continue; } finally {} } finally {}"),
-      nxt_string("SyntaxError: Illegal continue statement in 5") },
-
-    /* break from try in try/catch. */
-
-    { nxt_string("function f(n) {"
-                 "    var pre = 0; var post = 0;"
-                 "    for (var x in [1, 2, 3]) {"
-                 "        pre++;"
-                 "        try { "
-                 "            if (n == 'b') {break;}"
-                 "        }"
-                 "        catch (e) {};"
-                 "        post++"
-                 "    }"
-                 "    return [pre, post];"
-                 "}; njs.dump([f(),f('b')])"),
-      nxt_string("[[3,3],"
-                  "[1,0]]") },
-
-    { nxt_string("function f(v, n) {"
-                 "    var pre = 0; var post = 0; var case2 = 0;"
-                 "    switch (v) {"
-                 "    case 1: "
-                 "        pre++;"
-                 "        try { "
-                 "            if (n == 'b') {break;}"
-                 "        }"
-                 "        catch (e) {};"
-                 "        post++;"
-                 "        break;"
-                 "    default:"
-                 "        case2++;"
-                 "    }"
-                 "    return [pre, post, case2];"
-                 "}; njs.dump([f(),f(1)])"),
-      nxt_string("[[0,0,1],"
-                  "[1,1,0]]") },
-
-    /* continue from try in try/catch. */
-
-    { nxt_string("function f(n) {"
-                 "    var pre = 0; var post = 0;"
-                 "    for (var x in [1, 2, 3]) {"
-                 "        pre++;"
-                 "        try { "
-                 "            if (n == 'c') {continue;}"
-                 "        }"
-                 "        catch (e) {};"
-                 "        post++"
-                 "    }"
-                 "    return [pre, post];"
-                 "}; njs.dump([f(),f('c')])"),
-      nxt_string("[[3,3],"
-                  "[3,0]]") },
-
-    /* Multiple break/continue from try in try/catch. */
-
-    { nxt_string("function f(n) {"
-                 "    var pre = 0; var mid = 0; var post = 0;"
-                 "    for (var x in [1, 2, 3]) {"
-                 "        pre++;"
-                 "        try { "
-                 "            if (n == 'c') {continue;}"
-                 "            if (n == 'b') {break;}"
-                 "            mid++;"
-                 "            if (n == 'c2') {continue;}"
-                 "            if (n == 'b2') {break;}"
-                 "        }"
-                 "        catch (e) {};"
-                 "        post++"
-                 "    }"
-                 "    return [pre, mid, post];"
-                 "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
-      nxt_string("[[3,3,3],"
-                  "[3,0,0],"
-                  "[1,0,0],"
-                  "[3,3,0],"
-                  "[1,1,0]]") },
-
-    /* Multiple break/continue from catch in try/catch. */
-
-    { nxt_string("function f(t, n) {"
-                 "    var pre = 0; var mid = 0; var post = 0;"
-                 "    for (var x in [1, 2, 3]) {"
-                 "        pre++;"
-                 "        try { "
-                 "            if (t) {throw 'a'}"
-                 "        }"
-                 "        catch (e) {"
-                 "            if (n == 'c') {continue;}"
-                 "            if (n == 'b') {break;}"
-                 "            mid++;"
-                 "            if (n == 'c2') {continue;}"
-                 "            if (n == 'b2') {break;}"
-                 "        };"
-                 "        post++"
-                 "    }"
-                 "    return [pre, mid, post];"
-                 "}; njs.dump([f(), f(1), f(1, 'c'), f(1, 'b'), f(1, 'c2'), f(1, 'b2')])"),
-      nxt_string("[[3,0,3],"
-                  "[3,3,3],"
-                  "[3,0,0],"
-                  "[1,0,0],"
-                  "[3,3,0],"
-                  "[1,1,0]]") },
-
-    /* break from try in try/finally. */
-
-    { nxt_string("function f(n) {"
-                 "    var pre = 0; var mid = 0; var fin = 0; var post = 0;"
-                 "    for (var x in [1, 2, 3]) {"
-                 "        pre++;"
-                 "        try { "
-                 "            if (n == 'c') {continue;}"
-                 "            if (n == 'b') {break;}"
-                 "            mid++;"
-                 "            if (n == 'c2') {continue;}"
-                 "            if (n == 'b2') {break;}"
-                 "        }"
-                 "        finally {fin++};"
-                 "        post++"
-                 "    }"
-                 "    return [pre, mid, fin, post];"
-                 "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
-      nxt_string("[[3,3,3,3],"
-                  "[3,0,3,0],"
-                  "[1,0,1,0],"
-                  "[3,3,3,0],"
-                  "[1,1,1,0]]") },
-
-    /* Multiple break/continue from try in try/catch/finally. */
-
-    { nxt_string("function f(n) {"
-                 "    var pre = 0; var mid = 0; var fin = 0; var post = 0;"
-                 "    for (var x in [1, 2, 3]) {"
-                 "        pre++;"
-                 "        try { "
-                 "            if (n == 'c') {continue;}"
-                 "            if (n == 'b') {break;}"
-                 "            mid++;"
-                 "            if (n == 'c2') {continue;}"
-                 "            if (n == 'b2') {break;}"
-                 "        }"
-                 "        catch (e) {}"
-                 "        finally {fin++};"
-                 "        post++"
-                 "    }"
-                 "    return [pre, mid, fin, post];"
-                 "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
-      nxt_string("[[3,3,3,3],"
-                  "[3,0,3,0],"
-                  "[1,0,1,0],"
-                  "[3,3,3,0],"
-                  "[1,1,1,0]]") },
-
-    /* Multiple break/continue from catch in try/catch/finally. */
-
-    { nxt_string("function f(t, n) {"
-                 "    var pre = 0; var mid = 0; var fin = 0; var post = 0;"
-                 "    for (var x in [1, 2, 3]) {"
-                 "        pre++;"
-                 "        try {if (t) {throw 'a'}}"
-                 "        catch (e) { "
-                 "            if (n == 'c') {continue;}"
-                 "            if (n == 'b') {break;}"
-                 "            mid++;"
-                 "            if (n == 'c2') {continue;}"
-                 "            if (n == 'b2') {break;}"
-                 "        }"
-                 "        finally {fin++};"
-                 "        post++"
-                 "    }"
-                 "    return [pre, mid, fin, post];"
-                 "}; njs.dump([f(), f(1), f(1, 'c'), f(1, 'b'), f(1, 'c2'), f(1, 'b2')])"),
-      nxt_string("[[3,0,3,3],"
-                  "[3,3,3,3],"
-                  "[3,0,3,0],"
-                  "[1,0,1,0],"
-                  "[3,3,3,0],"
-                  "[1,1,1,0]]") },
-
-    /* Multiple return from try. */
-
-    { nxt_string("var r = 0; "
-                 "function f(i, n) {"
-                 "   try { "
-                 "      var a = 'x'; "
-                 "      if (i != 0) {"
-                 "         return a.repeat(n);"
-                 "      } else {"
-                 "         return;"
-                 "      }"
-                 "   }"
-                 "   catch (e) {  } "
-                 "   finally { r++; }};"
-                 "[f(1,1), f(1,2), f(0), r]"),
-      nxt_string("x,xx,,3") },
-
-    { nxt_string("var r = 0; "
-                 "function f(i) {"
-                 "   try { "
-                 "      return i;"
-                 "   }"
-                 "   catch (e) {  } "
-                 "   finally { r++; }};"
-                 "[f(true), f(false), r]"),
-      nxt_string("true,false,2") },
-
-    /* Multiple return from catch. */
-
-    { nxt_string("var r = 0; "
-                 "function f(i, n) {"
-                 "   try { "
-                 "      throw 1;"
-                 "   }"
-                 "   catch (e) {  "
-                 "      var a = 'x'; "
-                 "      if (i != 0) {"
-                 "         return a.repeat(n);"
-                 "      } else {"
-                 "         return;"
-                 "      }"
-                 "   } "
-                 "   finally { r++; }};"
-                 "[f(1,1), f(1,2), f(0), r]"),
-      nxt_string("x,xx,,3") },
-
-    /* return overrun by finally. */
-
-    { nxt_string("function f() {"
-                 "   try { "
-                 "      return 'a';"
-                 "   }"
-                 "   catch (e) {  "
-                 "   } "
-                 "   finally { "
-                 "      return 'b'; "
-                 "   }}; "
-                 "f()"),
-      nxt_string("b") },
-
-    { nxt_string("(function (f, val) { "
-                 "  try { return f(val); } "
-                 "  finally { return val; }"
-                 "})(function () {throw 'a'}, 'v')"),
-      nxt_string("v") },
-
-    { nxt_string("(function() { try { return ['a'];} finally {} } )()"),
-      nxt_string("a") },
-
-    { nxt_string("function f(){}; try {f((new RegExp('a**')))} catch (e) { }"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f(){}; try {f(f((new RegExp('a**'))))} catch (e) { }"),
-      nxt_string("undefined") },
-
-    { nxt_string("function f(){}; (function(){try {f(f((new RegExp('a**'))))} catch (e) { return 1}})()"),
-      nxt_string("1") },
-
-    { nxt_string("var o = { valueOf: function() { return '3' } }; --o"),
-      nxt_string("2") },
-
-    { nxt_string("var o = { valueOf: function() { return [3] } }; --o"),
-      nxt_string("NaN") },
-
-    { nxt_string("var o = { valueOf: function() { return '3' } }; 10 - o"),
-      nxt_string("7") },
-
-    { nxt_string("var o = { valueOf: function() { return [3] } }; 10 - o"),
-      nxt_string("NaN") },
-
-    { nxt_string("var o = { toString: function() { return 'OK' } }; 'o:' + o"),
-      nxt_string("o:OK") },
-
-    { nxt_string("var o = { toString: function() { return [1] } }; o"),
-      nxt_string("TypeError: Cannot convert object to primitive value") },
-
-    { nxt_string("var o = { toString: function() { return [1] } }; 'o:' + o"),
-      nxt_string("TypeError: Cannot convert object to primitive value") },
-
-    { nxt_string("var a = { valueOf: function() { return '3' } };"
-                 "var b = { toString: function() { return 10 - a + 'OK' } };"
-                 "var c = { toString: function() { return b + 'YES' } };"
-                 "'c:' + c"),
-      nxt_string("c:7OKYES") },
-
-    { nxt_string("[1,2,3].valueOf()"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("var o = { valueOf: function() { return 'OK' } };"
-                 "o.valueOf()"),
-      nxt_string("OK") },
-
-    { nxt_string("false.__proto__ === true.__proto__"),
-      nxt_string("true") },
-
-    { nxt_string("0..__proto__ === 1..__proto__"),
-      nxt_string("true") },
-
-    { nxt_string("[].__proto__ === [1,2].__proto__"),
-      nxt_string("true") },
-
-    { nxt_string("/./.__proto__ === /a/.__proto__"),
-      nxt_string("true") },
-
-    { nxt_string("''.__proto__ === 'abc'.__proto__"),
-      nxt_string("true") },
-
-    { nxt_string("[].__proto__.join.call([1,2,3], ':')"),
-      nxt_string("1:2:3") },
-
-    { nxt_string("''.__proto__.concat.call('a', 'b', 'c')"),
-      nxt_string("abc") },
-
-    { nxt_string("/./.__proto__.test.call(/a{2}/, 'aaa')"),
-      nxt_string("true") },
-
-    { nxt_string("true instanceof Boolean"),
-      nxt_string("false") },
-
-    { nxt_string("1 instanceof Number"),
-      nxt_string("false") },
-
-    { nxt_string("'' instanceof String"),
-      nxt_string("false") },
-
-    { nxt_string("({}) instanceof Object"),
-      nxt_string("true") },
-
-    { nxt_string("[] instanceof []"),
-      nxt_string("TypeError: right argument is not a function") },
-
-    { nxt_string("[] instanceof Array"),
-      nxt_string("true") },
-
-    { nxt_string("[] instanceof Object"),
-      nxt_string("true") },
-
-    { nxt_string("/./ instanceof RegExp"),
-      nxt_string("true") },
-
-    { nxt_string("/./ instanceof Object"),
-      nxt_string("true") },
-
-    { nxt_string("Object.defineProperty(Function.prototype, \"prototype\", {get: ()=>Array.prototype});"
-                 "[] instanceof Function.prototype"),
-      nxt_string("true") },
-
-     { nxt_string("Object.defineProperty(Function.prototype, \"prototype\", {get: ()=>{throw Error('Oops')}});"
-                 "[] instanceof Function.prototype"),
-      nxt_string("Error: Oops") },
-
-    /* global this. */
-
-    { nxt_string("this"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("this.a = 1; this.a"),
-      nxt_string("1") },
-
-    { nxt_string("this.undefined = 42"),
-      nxt_string("TypeError: Cannot assign to read-only property \"undefined\" of object") },
-
-    { nxt_string("this.Infinity = 42"),
-      nxt_string("TypeError: Cannot assign to read-only property \"Infinity\" of object") },
-
-    { nxt_string("this.NaN = 42"),
-      nxt_string("TypeError: Cannot assign to read-only property \"NaN\" of object") },
-
-    { nxt_string("typeof this.undefined"),
-      nxt_string("undefined") },
-
-    { nxt_string("typeof this.Infinity"),
-      nxt_string("number") },
-
-    { nxt_string("this.Infinity + 1"),
-      nxt_string("Infinity") },
-
-    { nxt_string("typeof this.NaN"),
-      nxt_string("number") },
-
-    { nxt_string("this.NaN + 1"),
-      nxt_string("NaN") },
-
-    { nxt_string("{this}"),
-      nxt_string("undefined") },
-
-    { nxt_string("if (1) {new this}"),
-      nxt_string("TypeError: object is not a function") },
-
-    { nxt_string("if (1) {this()}"),
-      nxt_string("TypeError: object is not a function") },
-
-    { nxt_string("var ex; try {new this} catch (e) {ex = e}; ex"),
-      nxt_string("TypeError: object is not a function") },
-
-    { nxt_string("var ex; try {({}) instanceof this} catch (e) {ex = e}; ex"),
-      nxt_string("TypeError: right argument is not a function") },
-
-    { nxt_string("Function.call(this, 'var x / = 1;')"),
-      nxt_string("InternalError: Not implemented") },
-
-    { nxt_string("njs"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("var o = Object(); o"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("var o = new Object(); o"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("var o = new Object(1); o"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {}; o === Object(o)"),
-      nxt_string("true") },
-
-    { nxt_string("var o = {}; o === new Object(o)"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object([]); Object.prototype.toString.call(o)"),
-      nxt_string("[object Array]") },
-
-    { nxt_string("Object.name"),
-      nxt_string("Object") },
-
-    { nxt_string("Object.length"),
-      nxt_string("1") },
-
-    { nxt_string("Object.__proto__ === Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.constructor === Object"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.__proto__ === null"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.__proto__ = {}"),
-      nxt_string("TypeError: Cyclic __proto__ value") },
-
-    { nxt_string("var o = {}; var o2 = Object.create(o); o.__proto__ = o2"),
-      nxt_string("TypeError: Cyclic __proto__ value") },
-
-    { nxt_string("Object.prototype.__proto__.f()"),
-      nxt_string("TypeError: cannot get property \"f\" of undefined") },
-
-    { nxt_string("var obj = Object.create(null); obj.one = 1;"
-                 "var res = [];"
-                 "for (var val in obj) res.push(val); res"),
-      nxt_string("one") },
-
-    { nxt_string("var o1 = Object.create(null); o1.one = 1;"
-                 "var o2 = Object.create(o1); o2.two = 2;"
-                 "var o3 = Object.create(o2); o3.three = 3;"
-                 "var res = [];"
-                 "for (var val in o3) res.push(val); res"),
-      nxt_string("three,two,one") },
-
-    { nxt_string("var o1 = Object.create(null); o1.one = 1;"
-                 "var o2 = Object.create(o1);"
-                 "var o3 = Object.create(o2); o3.three = 3;"
-                 "var res = [];"
-                 "for (var val in o3) res.push(val); res"),
-      nxt_string("three,one") },
-
-    { nxt_string("var o1 = Object.create(null); o1.one = 1;"
-                 "var o2 = Object.create(o1);"
-                 "var o3 = Object.create(o2);"
-                 "var res = [];"
-                 "for (var val in o3) res.push(val); res"),
-      nxt_string("one") },
-
-    { nxt_string("var o1 = Object.create(null); o1.one = 1;"
-                 "var o2 = Object.create(o1); o2.two = 2;"
-                 "var o3 = Object.create(o2); o3.three = 3;"
-                 "o3.two = -2; o3.one = -1;"
-                 "var res = [];"
-                 "for (var val in o3) res.push(val); res"),
-      nxt_string("three,two,one") },
-
-    { nxt_string("var a = []; for(var p in 'abc') a.push(p); a"),
-      nxt_string("0,1,2") },
-
-    { nxt_string("var a = []; for(var p in Object('abc')) a.push(p); a"),
-      nxt_string("0,1,2") },
-
-    { nxt_string("var o = Object('abc'); var x = Object.create(o);"
-                 "x.a = 1; x.b = 2;"
-                 "var a = []; for(var p in x) a.push(p); a"),
-      nxt_string("a,b,0,1,2") },
-
-    { nxt_string("var o = Object.create(Math); o.abs = -5; Math.abs(o.abs)"),
-      nxt_string("5") },
-
-    { nxt_string("Object.prototype.toString.call(Object.prototype)"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("Object.prototype.toString.call(new Array)"),
-      nxt_string("[object Array]") },
-
-    { nxt_string("Object.prototype.toString.call(new URIError)"),
-      nxt_string("[object Error]") },
-
-    { nxt_string("Object.prototype"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("Object.prototype.valueOf.prototype"),
-      nxt_string("undefined") },
-
-    { nxt_string("Object.constructor === Function"),
-      nxt_string("true") },
-
-    { nxt_string("({}).__proto__ === Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("({}).__proto__ = 1"),
-      nxt_string("1") },
-
-    { nxt_string("({}).__proto__ = null"),
-      nxt_string("null") },
-
-    { nxt_string("({__proto__: []}) instanceof Array"),
-      nxt_string("true") },
-
-    { nxt_string("({}).__proto__.constructor === Object"),
-      nxt_string("true") },
-
-    { nxt_string("({}).constructor === Object"),
-      nxt_string("true") },
-
-    { nxt_string("({}).constructor()"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("var a = Object.__proto__; a()"),
-      nxt_string("undefined") },
-
-    { nxt_string("Object.__proto__()"),
-      nxt_string("undefined") },
-
-    { nxt_string("var a = Array(3); a"),
-      nxt_string(",,") },
-
-    { nxt_string("var a = Array(); a.length"),
-      nxt_string("0") },
-
-    { nxt_string("var a = Array(0); a.length"),
-      nxt_string("0") },
-
-    { nxt_string("var a = Array(true); a"),
-      nxt_string("true") },
-
-    { nxt_string("var a = Array(1,'two',3); a"),
-      nxt_string("1,two,3") },
-
-    { nxt_string("var a = Array(-1)"),
-      nxt_string("RangeError: Invalid array length") },
-
-    { nxt_string("var a = Array(2.5)"),
-      nxt_string("RangeError: Invalid array length") },
-
-    { nxt_string("var a = Array(NaN)"),
-      nxt_string("RangeError: Invalid array length") },
-
-    { nxt_string("var a = Array(Infinity)"),
-      nxt_string("RangeError: Invalid array length") },
-
-    { nxt_string("var a = Array(1111111111)"),
-      nxt_string("MemoryError") },
-
-    { nxt_string("var x = Array(2**32)"),
-      nxt_string("RangeError: Invalid array length") },
-
-    { nxt_string("var x = Array(2**28)"),
-      nxt_string("MemoryError") },
-
-    { nxt_string("var x = Array(2**20), y = Array(2**12).fill(x);"
-                 "Array.prototype.concat.apply(y[0], y.slice(1))"),
-      nxt_string("RangeError: Invalid array length") },
-
-    { nxt_string("var a = new Array(3); a"),
-      nxt_string(",,") },
-
-    { nxt_string("Array.name"),
-      nxt_string("Array") },
-
-    { nxt_string("Array.length"),
-      nxt_string("1") },
-
-    { nxt_string("Array.__proto__ === Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Array.prototype.constructor === Array"),
-      nxt_string("true") },
-
-    { nxt_string("Array.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("Array.prototype.__proto__ === Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.toString.call(Array.prototype)"),
-      nxt_string("[object Array]") },
-
-    { nxt_string("Array.prototype"),
-      nxt_string("") },
-
-    { nxt_string("Array.prototype.length"),
-      nxt_string("0") },
-
-    { nxt_string("Array.prototype.length = 3, Array.prototype"),
-      nxt_string(",,") },
-
-    { nxt_string("var o = Object.create(Array.prototype); o.length = 3;"
-                 "[Array.prototype, Array.prototype.length, o.length]"),
-      nxt_string(",0,3") },
-
-    { nxt_string("var o = Object.create(Array.prototype);"
-                 "Object.defineProperty(o, 'length', {value: 3});"
-                 "[Array.prototype, Array.prototype.length, o.length]"),
-      nxt_string(",0,3") },
-
-    { nxt_string("Array.constructor === Function"),
-      nxt_string("true") },
-
-    { nxt_string("var a = []; a.join = 'OK'; a"),
-      nxt_string("[object Array]") },
-
-    { nxt_string("[].__proto__ === Array.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("[].__proto__.constructor === Array"),
-      nxt_string("true") },
-
-    { nxt_string("[].constructor === Array"),
-      nxt_string("true") },
-
-    { nxt_string("([]).constructor()"),
-      nxt_string("") },
-
-    { nxt_string("Boolean()"),
-      nxt_string("false") },
-
-    { nxt_string("new Boolean()"),
-      nxt_string("false") },
-
-    { nxt_string("new Boolean"),
-      nxt_string("false") },
-
-    { nxt_string("Boolean(0)"),
-      nxt_string("false") },
-
-    { nxt_string("Boolean('')"),
-      nxt_string("false") },
-
-    { nxt_string("Boolean(1)"),
-      nxt_string("true") },
-
-    { nxt_string("Boolean('a')"),
-      nxt_string("true") },
-
-    { nxt_string("Boolean({})"),
-      nxt_string("true") },
-
-    { nxt_string("Boolean([])"),
-      nxt_string("true") },
-
-    { nxt_string("typeof Boolean(1)"),
-      nxt_string("boolean") },
-
-    { nxt_string("typeof new Boolean(1)"),
-      nxt_string("object") },
-
-    { nxt_string("typeof new Boolean"),
-      nxt_string("object") },
-
-    { nxt_string("Boolean.name"),
-      nxt_string("Boolean") },
-
-    { nxt_string("Boolean.length"),
-      nxt_string("1") },
-
-    { nxt_string("Boolean.__proto__ === Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Boolean.prototype.constructor === Boolean"),
-      nxt_string("true") },
-
-    { nxt_string("Boolean.prototype.constructor = 1;"
-                 "Boolean.prototype.constructor"),
-      nxt_string("1") },
-
-    { nxt_string("var c = Boolean.prototype.constructor;"
-                 "Boolean.prototype.constructor = 1;"
-                 "[c(0), Boolean.prototype.constructor]"),
-      nxt_string("false,1") },
-
-    { nxt_string("Boolean.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("Boolean.prototype.__proto__ === Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.toString.call(Boolean.prototype)"),
-      nxt_string("[object Boolean]") },
-
-    { nxt_string("Boolean.prototype"),
-      nxt_string("false") },
-
-    { nxt_string("Boolean.constructor === Function"),
-      nxt_string("true") },
-
-    { nxt_string("true.__proto__ === Boolean.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("false.__proto__ === Boolean.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("var b = Boolean(1); b.__proto__ === Boolean.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("var b = new Boolean(1); b.__proto__ === Boolean.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Number()"),
-      nxt_string("0") },
-
-    { nxt_string("new Number()"),
-      nxt_string("0") },
-
-    { nxt_string("new Number"),
-      nxt_string("0") },
-
-    { nxt_string("new Number(undefined)"),
-      nxt_string("NaN") },
-
-    { nxt_string("new Number(null)"),
-      nxt_string("0") },
-
-    { nxt_string("new Number(true)"),
-      nxt_string("1") },
-
-    { nxt_string("new Number(false)"),
-      nxt_string("0") },
-
-    { nxt_string("Number(undefined)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Number(null)"),
-      nxt_string("0") },
-
-    { nxt_string("Number(true)"),
-      nxt_string("1") },
-
-    { nxt_string("Number(false)"),
-      nxt_string("0") },
-
-    { nxt_string("Number(123)"),
-      nxt_string("123") },
-
-    { nxt_string("Number('123')"),
-      nxt_string("123") },
-
-    { nxt_string("Number('0.'+'1'.repeat(128))"),
-      nxt_string("0.1111111111111111") },
-
-    { nxt_string("Number('1'.repeat(128))"),
-      nxt_string("1.1111111111111113e+127") },
-
-    { nxt_string("Number('1'.repeat(129))"),
-      nxt_string("1.1111111111111112e+128") },
-
-    { nxt_string("Number('1'.repeat(129))"),
-      nxt_string("1.1111111111111112e+128") },
-
-    { nxt_string("Number('1'.repeat(129)+'e-100')"),
-      nxt_string("1.1111111111111112e+28") },
-
-    { nxt_string("Number('1'.repeat(310))"),
-      nxt_string("Infinity") },
-
-    { nxt_string("var o = { valueOf: function() { return 123 } };"
-                 "Number(o)"),
-      nxt_string("123") },
-
-    { nxt_string("var o = { valueOf: function() { return 123 } };"
-                 "new Number(o)"),
-      nxt_string("123") },
-
-    { nxt_string("typeof Number(1)"),
-      nxt_string("number") },
-
-    { nxt_string("typeof new Number(1)"),
-      nxt_string("object") },
-
-    { nxt_string("typeof new Number"),
-      nxt_string("object") },
-
-    { nxt_string("Number.name"),
-      nxt_string("Number") },
-
-    { nxt_string("Number.length"),
-      nxt_string("1") },
-
-    { nxt_string("Number.__proto__ === Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Number.prototype.constructor === Number"),
-      nxt_string("true") },
-
-    { nxt_string("Number.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("Number.prototype.__proto__ === Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.toString.call(Number.prototype)"),
-      nxt_string("[object Number]") },
-
-    { nxt_string("Number.prototype"),
-      nxt_string("0") },
-
-    { nxt_string("Number.constructor === Function"),
-      nxt_string("true") },
-
-    { nxt_string("0..__proto__ === Number.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("var n = Number(1); n.__proto__ === Number.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("var n = new Number(1); n.__proto__ === Number.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Number.isFinite()"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isFinite(123)"),
-      nxt_string("true") },
-
-    { nxt_string("Number.isFinite('123')"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isFinite(Infinity)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isFinite(NaN)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isInteger()"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isInteger('123')"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isInteger(123)"),
-      nxt_string("true") },
-
-    { nxt_string("Number.isInteger(-123.0)"),
-      nxt_string("true") },
-
-    { nxt_string("Number.isInteger(123.4)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isInteger(Infinity)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isInteger(NaN)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isSafeInteger()"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isSafeInteger('123')"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isSafeInteger(9007199254740991)"),
-      nxt_string("true") },
-
-    { nxt_string("Number.isSafeInteger(-9007199254740991.0)"),
-      nxt_string("true") },
-
-    { nxt_string("Number.isSafeInteger(9007199254740992)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isSafeInteger(-9007199254740992.0)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isSafeInteger(123.4)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isSafeInteger(Infinity)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isSafeInteger(-Infinity)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isSafeInteger(NaN)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isNaN()"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isNaN('NaN')"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isNaN(NaN)"),
-      nxt_string("true") },
-
-    { nxt_string("Number.isNaN(123)"),
-      nxt_string("false") },
-
-    { nxt_string("Number.isNaN(Infinity)"),
-      nxt_string("false") },
-
-#if 0
-    { nxt_string("parseFloat === Number.parseFloat"),
-      nxt_string("true") },
-
-    { nxt_string("parseInt === Number.parseInt"),
-      nxt_string("true") },
-#endif
-
-    { nxt_string("String()"),
-      nxt_string("") },
-
-    { nxt_string("new String()"),
-      nxt_string("") },
-
-    { nxt_string("new String"),
-      nxt_string("") },
-
-    { nxt_string("String(123)"),
-      nxt_string("123") },
-
-    { nxt_string("new String(123)"),
-      nxt_string("123") },
-
-    { nxt_string("Object('123').length"),
-      nxt_string("3") },
-
-    { nxt_string("new String(123).length"),
-      nxt_string("3") },
-
-    { nxt_string("new String(123).toString()"),
-      nxt_string("123") },
-
-    { nxt_string("String([1,2,3])"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("new String([1,2,3])"),
-      nxt_string("1,2,3") },
-
-    { nxt_string("var s = new String('αβ'); s.one = 1; 'one' in s"),
-      nxt_string("true") },
-
-    { nxt_string("var s = new String('αβ'); 'one' in s"),
-      nxt_string("false") },
-
-    { nxt_string("var s = new String('αβ'); s.one = 1; '1' in s"),
-      nxt_string("true") },
-
-    { nxt_string("var s = new String('αβ'); s.one = 1; 1 in s"),
-      nxt_string("true") },
-
-    { nxt_string("var s = new String('αβ'); s.one = 1; 2 in s"),
-      nxt_string("false") },
-
-    { nxt_string("var s = new String('αβ'); s[1]"),
-      nxt_string("β") },
-
-    { nxt_string("Object.create(new String('αβ'))[1]"),
-      nxt_string("β") },
-
-    { nxt_string("var s = new String('αβ'); s[1] = 'b'"),
-      nxt_string("TypeError: Cannot assign to read-only property \"1\" of object string") },
-
-    { nxt_string("var o = Object.create(new String('αβ')); o[1] = 'a'"),
-      nxt_string("TypeError: Cannot assign to read-only property \"1\" of object") },
-
-    { nxt_string("var s = new String('αβ'); s[4] = 'ab'; s[4]"),
-      nxt_string("ab") },
-
-    { nxt_string("Object.create(new String('αβ')).length"),
-      nxt_string("2") },
-
-    { nxt_string("var s = new String('αβ'); s.valueOf()[1]"),
-      nxt_string("β") },
-
-    { nxt_string("var o = { toString: function() { return 'OK' } };"
-                 "String(o)"),
-      nxt_string("OK") },
-
-    { nxt_string("var o = { toString: function() { return 'OK' } };"
-                 "new String(o)"),
-      nxt_string("OK") },
-
-    { nxt_string("typeof String('abc')"),
-      nxt_string("string") },
-
-    { nxt_string("typeof new String('abc')"),
-      nxt_string("object") },
-
-    { nxt_string("typeof new String"),
-      nxt_string("object") },
-
-    { nxt_string("String.name"),
-      nxt_string("String") },
-
-    { nxt_string("String.length"),
-      nxt_string("1") },
-
-    { nxt_string("String.__proto__ === Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.toString.call(String.prototype)"),
-      nxt_string("[object String]") },
-
-    { nxt_string("String.prototype"),
-      nxt_string("") },
-
-    { nxt_string("String.prototype.length"),
-      nxt_string("0") },
-
-    { nxt_string("String.prototype.constructor === String"),
-      nxt_string("true") },
-
-    { nxt_string("String.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("String.prototype.__proto__ === Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("''.__proto__ === String.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("String.constructor === Function"),
-      nxt_string("true") },
-
-    { nxt_string("'test'.__proto__ === String.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("var s = String('abc'); s.__proto__ === String.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("var s = new String('abc'); s.__proto__ === String.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("'test'.constructor === String"),
-      nxt_string("true") },
-
-    { nxt_string("'test'.constructor.prototype === String.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.create(String.prototype); o.length = 1"),
-      nxt_string("TypeError: Cannot assign to read-only property \"length\" of object") },
-
-    { nxt_string("Function.name"),
-      nxt_string("Function") },
-
-    { nxt_string("Function.length"),
-      nxt_string("1") },
-
-    { nxt_string("Function.__proto__ === Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Function.prototype.constructor === Function"),
-      nxt_string("true") },
-
-    { nxt_string("Function.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("Function.prototype.__proto__ === Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.toString.call(Function.prototype)"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("Function.prototype"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("Function.prototype.length"),
-      nxt_string("0") },
-
-    { nxt_string("Function.constructor === Function"),
-      nxt_string("true") },
-
-    { nxt_string("function f() {} f.__proto__ === Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Function()"),
-      nxt_string("InternalError: Not implemented") },
-
-    { nxt_string("RegExp()"),
-      nxt_string("/(?:)/") },
-
-    { nxt_string("RegExp('')"),
-      nxt_string("/(?:)/") },
-
-    { nxt_string("RegExp(123)"),
-      nxt_string("/123/") },
-
-    { nxt_string("RegExp.name"),
-      nxt_string("RegExp") },
-
-    { nxt_string("RegExp.length"),
-      nxt_string("2") },
-
-    { nxt_string("RegExp.__proto__ === Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("RegExp.prototype.constructor === RegExp"),
-      nxt_string("true") },
-
-    { nxt_string("RegExp.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("RegExp.prototype.__proto__ === Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.toString.call(RegExp.prototype)"),
-      nxt_string("[object RegExp]") },
-
-    { nxt_string("RegExp.prototype"),
-      nxt_string("/(?:)/") },
-
-    { nxt_string("RegExp.constructor === Function"),
-      nxt_string("true") },
-
-    { nxt_string("/./.__proto__ === RegExp.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("toString()"),
-      nxt_string("[object Undefined]") },
-
-    { nxt_string("toString() + Object.prototype.toString"),
-      nxt_string("[object Undefined][object Function]") },
-
-#if 0
-    { nxt_string("toString === Object.prototype.toString"),
-      nxt_string("true") },
-
-    { nxt_string("Object.prototype.toString.yes = 'OK'; toString.yes"),
-      nxt_string("OK") },
-#endif
-
-    { nxt_string("Object.prototype.toString.call()"),
-      nxt_string("[object Undefined]") },
-
-    { nxt_string("Object.prototype.toString.call(undefined)"),
-      nxt_string("[object Undefined]") },
-
-    { nxt_string("Object.prototype.toString.call(null)"),
-      nxt_string("[object Null]") },
-
-    { nxt_string("Object.prototype.toString.call(true)"),
-      nxt_string("[object Boolean]") },
-
-    { nxt_string("Object.prototype.toString.call(1)"),
-      nxt_string("[object Number]") },
-
-    { nxt_string("Object.prototype.toString.call('')"),
-      nxt_string("[object String]") },
-
-    { nxt_string("Object.prototype.toString.call({})"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("Object.prototype.toString.call([])"),
-      nxt_string("[object Array]") },
-
-    { nxt_string("Object.prototype.toString.call(new Object(true))"),
-      nxt_string("[object Boolean]") },
-
-    { nxt_string("Object.prototype.toString.call(new Number(1))"),
-      nxt_string("[object Number]") },
-
-    { nxt_string("Object.prototype.toString.call(new Object(1))"),
-      nxt_string("[object Number]") },
-
-    { nxt_string("Object.prototype.toString.call(new Object(''))"),
-      nxt_string("[object String]") },
-
-    { nxt_string("Object.prototype.toString.call(function(){})"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("Object.prototype.toString.call(/./)"),
-      nxt_string("[object RegExp]") },
-
-    { nxt_string("var p = { a:5 }; var o = Object.create(p); o.a"),
-      nxt_string("5") },
-
-    { nxt_string("var p = { a:5 }; var o = Object.create(p);"
-                 "o.__proto__ === p"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.create(Object.prototype);"
-                 "o.__proto__ === Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.create(null); '__proto__' in o"),
-      nxt_string("false") },
-
-    { nxt_string("Object.create()"),
-      nxt_string("TypeError: prototype may only be an object or null: undefined") },
-
-    { nxt_string("Object.create(1)"),
-      nxt_string("TypeError: prototype may only be an object or null: number") },
-
-    { nxt_string("var o = {a:1, b:2, c:3};"
-                 "Object.keys(o)"),
-      nxt_string("a,b,c") },
-
-    { nxt_string("var a = []; a.one = 7; Object.keys(a)"),
-      nxt_string("one") },
-
-    { nxt_string("var a = [,,]; a.one = 7; Object.keys(a)"),
-      nxt_string("one") },
-
-    { nxt_string("var a = [,6,,3]; a.one = 7; Object.keys(a)"),
-      nxt_string("1,3,one") },
-
-    { nxt_string("var o = {a:1,b:2}; delete o.a; Object.keys(o)"),
-      nxt_string("b") },
-
-    { nxt_string("Object.keys()"),
-      nxt_string("TypeError: cannot convert undefined argument to object") },
-
-    { nxt_string("Object.keys('αβZ')"),
-      nxt_string("0,1,2") },
-
-    { nxt_string("Object.keys(new String('αβZ'))"),
-      nxt_string("0,1,2") },
-
-    { nxt_string("var s = new String('αβZ'); s.a = 1; Object.keys(s)"),
-      nxt_string("0,1,2,a") },
-
-    { nxt_string("var r = new RegExp('αbc'); r.a = 1; Object.keys(r)"),
-      nxt_string("a") },
-
-    { nxt_string("Object.keys(Object.create(new String('abc')))"),
-      nxt_string("") },
-
-    { nxt_string("Object.keys(1)"),
-      nxt_string("") },
-
-    { nxt_string("Object.keys(true)"),
-      nxt_string("") },
-
-    { nxt_string("var o = {a:3, b:2, c:1}; Object.values(o)"),
-      nxt_string("3,2,1") },
-
-    { nxt_string("Object.values('s')"),
-      nxt_string("s") },
-
-    { nxt_string("Object.values('абв abc')"),
-      nxt_string("а,б,в, ,a,b,c") },
-
-    { nxt_string("var s = new String('abc'); s.three = 3; Object.values(s)"),
-      nxt_string("a,b,c,3") },
-
-    { nxt_string("var a = [,,5,,4,,,3,2]; a.one = 1; Object.values(a)"),
-      nxt_string("5,4,3,2,1") },
-
-    { nxt_string("Object.values([{}, null, false, NaN, function() {}])"),
-      nxt_string("[object Object],,false,NaN,[object Function]") },
-
-    { nxt_string("Object.values(1)"),
-      nxt_string("") },
-
-    { nxt_string("Object.values(njs)[0] === njs.version"),
-      nxt_string("true") },
-
-    { nxt_string("Object.values(process)"),
-      nxt_string("") },
-
-    { nxt_string("Object.values()"),
-      nxt_string("TypeError: cannot convert undefined argument to object") },
-
-    { nxt_string("Object.entries('abc')"),
-      nxt_string("0,a,1,b,2,c") },
-
-    { nxt_string("JSON.stringify(Object.entries('эюя'))"),
-      nxt_string("[[\"0\",\"э\"],[\"1\",\"ю\"],[\"2\",\"я\"]]") },
-
-    { nxt_string("var o = {a:\"а\", b:\"б\", c:\"ц\"};"
-                 "JSON.stringify(Object.entries(o))"),
-      nxt_string("[[\"a\",\"а\"],[\"b\",\"б\"],[\"c\",\"ц\"]]") },
-
-    { nxt_string("JSON.stringify(Object.entries([0]))"),
-      nxt_string("[[\"0\",0]]") },
-
-    { nxt_string("var s = new String('αβ'); s.two = null; s[3] = true;"
-                 "Object.entries(s)"),
-      nxt_string("0,α,1,β,two,,3,true") },
-
-    { nxt_string("Object.entries(true)"),
-      nxt_string("") },
-
-    { nxt_string("Object.entries(njs)[0][1] === njs.version"),
-      nxt_string("true") },
-
-    { nxt_string("Object.entries()"),
-      nxt_string("TypeError: cannot convert undefined argument to object") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'a', {}); o.a"),
-      nxt_string("undefined") },
-
-    { nxt_string("Object.defineProperty({}, 'a', {value:1})"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'a', {value:1}); o.a"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'a', Object.create({value:1})); o.a"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
-                 "Object.keys(o)"),
-      nxt_string("a,c") },
-
-    { nxt_string("var o = {a:1, c:2};"
-                 "Object.defineProperty(o, 'b', {enumerable:false});"
-                 "Object.keys(o)"),
-      nxt_string("a,c") },
-
-    { nxt_string("var o = {a:1, c:3};"
-                 "Object.defineProperty(o, 'b', {enumerable:true});"
-                 "Object.keys(o)"),
-      nxt_string("a,c,b") },
-
-    { nxt_string("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
-                 "Object.values(o)"),
-      nxt_string("1,2") },
-
-    { nxt_string("var o = {a:1, c:2};"
-                 "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
-                 "Object.values(o)"),
-      nxt_string("1,2") },
-
-    { nxt_string("var o = {a:1, c:3};"
-                 "Object.defineProperty(o, 'b', {enumerable:true, value:2});"
-                 "Object.values(o)"),
-      nxt_string("1,3,2") },
-
-    { nxt_string("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
-                 "Object.entries(o)"),
-      nxt_string("a,1,c,2") },
-
-    { nxt_string("var o = {a:1, c:2};"
-                 "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
-                 "Object.entries(o)"),
-      nxt_string("a,1,c,2") },
-
-    { nxt_string("var o = {a:1, c:3};"
-                 "Object.defineProperty(o, 'b', {enumerable:true, value:2});"
-                 "Object.entries(o)"),
-      nxt_string("a,1,c,3,b,2") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'a', {}); o.a = 1"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'a', {writable:false}); o.a = 1"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'a', {writable:true});"
-                 "o.a = 1; o.a"),
-      nxt_string("1") },
-
-    { nxt_string("Object.defineProperty(Object.prototype, 'a', {writable:false});"
-                 "var o = {a: 1}; [o.a++, o.a]"),
-      nxt_string("1,2") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(Object.prototype, 'a', {writable:false});"
-                 "o.a = 1"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(Object.prototype, 'a', {writable:true});"
-                 "o.a = 1; o.a"),
-      nxt_string("1") },
-
-    { nxt_string("var p = Object.create(Function);"
-                 "Object.defineProperty(p, 'length', {writable: true});"
-                 "p.length = 32; p.length"),
-      nxt_string("32") },
-
-    { nxt_string("var p = Object.create(Math.abs);"
-                 "Object.defineProperty(p, 'length', {writable: true});"
-                 "p.length = 23; p.length"),
-      nxt_string("23") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {value:1}); delete o.a"),
-      nxt_string("TypeError: Cannot delete property \"a\" of object") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {value:1, configurable:true});"
-                 "delete o.a; o.a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {value:1, configurable:false});"
-                 "delete o.a"),
-      nxt_string("TypeError: Cannot delete property \"a\" of object") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', Object.create({value:2})); o.a"),
-      nxt_string("2") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {configurable:false});"
-                 "Object.defineProperty(o, 'a', {configurable:true})"),
-      nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {configurable:false});"
-                 "Object.defineProperty(o, 'a', {enumerable:true})"),
-      nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {configurable:false});"
-                 "Object.defineProperty(o, 'a', {writable:true})"),
-      nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {configurable:false});"
-                 "Object.defineProperty(o, 'a', {enumerable:false}).a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {configurable:false});"
-                 "Object.defineProperty(o, 'a', {}).a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {configurable:false, writable:true});"
-                 "Object.defineProperty(o, 'a', {writable:false}).a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {configurable:true, writable:false});"
-                 "Object.defineProperty(o, 'a', {writable:true}).a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {});"
-                 "Object.defineProperty(o, 'a', {}).a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {value:1});"
-                 "Object.defineProperty(o, 'a', {value:1}).a"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {value:1});"
-                 "Object.defineProperty(o, 'a', {value:2}).a"),
-      nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {configurable:true});"
-                 "Object.defineProperty(o, 'a', {value:1}).a"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {configurable:true, get:()=>1});"
-                 "Object.defineProperty(o, 'a', {value:1});"
-                 "var d = Object.getOwnPropertyDescriptor(o, 'a'); "
-                 "[d.value, d.writable, d.enumerable, d.configurable, d.get, d.set]"),
-      nxt_string("1,false,false,true,,") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {configurable:true, value:1});"
-                 "Object.defineProperty(o, 'a', {set:()=>1});"
-                 "var d = Object.getOwnPropertyDescriptor(o, 'a'); "
-                 "[d.value, d.writable, d.enumerable, d.configurable, d.get, d.set]"),
-      nxt_string(",,false,true,,[object Function]") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'a', {get: ()=>1, configurable:true}); "
-                 "Object.defineProperty(o, 'a', {value:123}); o.a =2"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'a', {get: ()=>1, configurable:true}); "
-                 "Object.defineProperty(o, 'a', {writable:false}); o.a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'a', {value: 1, configurable:true}); "
-                 "Object.defineProperty(o, 'a', {get:()=>1}); o.a = 2"),
-      nxt_string("TypeError: Cannot set property \"a\" of object which has only a getter") },
-
-    { nxt_string("var o = Object.create(Object.defineProperty({}, 'x', { set: function(v) { this.y = v; }})); "
-                 "o.x = 123; Object.getOwnPropertyDescriptor(o, 'y').value"),
-      nxt_string("123") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', { configurable: true, value: 0 });"
-                 "Object.defineProperty(o, 'a', { value: 1 });"
-                 "Object.defineProperty(o, 'a', { configurable: false, value: 2 }).a"),
-      nxt_string("2") },
-
-    { nxt_string("var o = {}; Object.defineProperty()"),
-      nxt_string("TypeError: cannot convert undefined argument to object") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o)"),
-      nxt_string("TypeError: descriptor is not an object") },
-
-    { nxt_string("Object.defineProperty(Function.prototype, 'name', {value:'x'}).name"),
-      nxt_string("x") },
-
-    { nxt_string("Object.defineProperty(Function.prototype, 'xxx', {value:'x'}).xxx"),
-      nxt_string("x") },
-
-    { nxt_string("Object.defineProperty(Object, 'name', {value:'x'}).name"),
-      nxt_string("x") },
-
-    { nxt_string("Object.defineProperty(Object.prototype, 'toString', {value:1}).toString"),
-      nxt_string("1") },
-
-    { nxt_string("var o = Object.defineProperties({}, {a:{value:1}}); o.a"),
-      nxt_string("1") },
-
-    { nxt_string("var o = Object.defineProperties({}, {a:{enumerable:true}, b:{enumerable:true}});"
-                 "Object.keys(o)"),
-      nxt_string("a,b") },
-
-    { nxt_string("var desc = Object.defineProperty({b:{value:1, enumerable:true}}, 'a', {});"
-                 "var o = Object.defineProperties({}, desc);"
-                 "Object.keys(o)"),
-      nxt_string("b") },
-
-    { nxt_string("var o = {a:1}; delete o.a;"
-                 "Object.defineProperty(o, 'a', { value: 1 }); o.a"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {a:1}; delete o.a;"
-                 "Object.defineProperty(o, 'a', { value: 1 }); o.a = 2; o.a"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
-    { nxt_string("var o = {a:1}; delete o.a;"
-                 "Object.defineProperty(o, 'a', { value: 1, writable:1 }); o.a = 2; o.a"),
-      nxt_string("2") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, new String('a'), { value: 1}); o.a"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, {toString:function(){return 'a'}}, { value: 1}); o.a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1, 2];"
-                 "Object.defineProperty(a, '1', {value: 5}); a[1]"),
-      nxt_string("5") },
-
-    { nxt_string("var a = [1, 2];"
-                 "Object.defineProperty(a, '3', {}); njs.dump(a)"),
-      nxt_string("[1,2,<empty>,undefined]") },
-
-    { nxt_string("var a = [1, 2];"
-                 "Object.defineProperty(a, 'length', {}); a"),
-      nxt_string("1,2") },
-
-    { nxt_string("var a = [1, 2];"
-                 "Object.defineProperty(a, 'length', {value: 1}); a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = [1, 2];"
-                 "Object.defineProperty(a, 'length', {value: 5}); a"),
-      nxt_string("1,2,,,") },
-
-    { nxt_string("var o = Object.defineProperties({a:1}, {}); o.a"),
-      nxt_string("1") },
-
-    { nxt_string("var arr = [0, 1]; Object.defineProperty(arr, 'length', {value:3}); arr.length"),
-      nxt_string("3") },
-
-    { nxt_string("Object.defineProperties()"),
-      nxt_string("TypeError: cannot convert undefined argument to object") },
-
-    { nxt_string("Object.defineProperties(1, {})"),
-      nxt_string("TypeError: cannot convert number argument to object") },
-
-    { nxt_string("Object.defineProperties({}, 1)"),
-      nxt_string("TypeError: descriptor is not an object") },
-
-    { nxt_string("var o = {a:1}; o.hasOwnProperty('a')"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.create({a:2}); o.hasOwnProperty('a')"),
-      nxt_string("false") },
-
-    { nxt_string("var o = {a:1}; o.hasOwnProperty('b')"),
-      nxt_string("false") },
-
-    { nxt_string("var a = []; a.hasOwnProperty('0')"),
-      nxt_string("false") },
-
-    { nxt_string("var a = [,,]; a.hasOwnProperty('0')"),
-      nxt_string("false") },
-
-    { nxt_string("var a = [3,,]; a.hasOwnProperty('0')"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [,4]; a.hasOwnProperty('1')"),
-      nxt_string("true") },
-
-    { nxt_string("var a = [3,4]; a.hasOwnProperty('2')"),
-      nxt_string("false") },
-
-    { nxt_string("var a = [3,4]; a.one = 1; a.hasOwnProperty('one')"),
-      nxt_string("true") },
-
-    { nxt_string("var o = {a:1}; o.hasOwnProperty(o)"),
-      nxt_string("false") },
-
-    { nxt_string("var o = {a:1}; o.hasOwnProperty(1)"),
-      nxt_string("false") },
-
-    { nxt_string("var o = {a:1}; o.hasOwnProperty()"),
-      nxt_string("false") },
-
-    { nxt_string("[,].hasOwnProperty()"),
-      nxt_string("false") },
-
-    { nxt_string("[1,2].hasOwnProperty('len')"),
-      nxt_string("false") },
-
-    { nxt_string("[1,2].hasOwnProperty('0')"),
-      nxt_string("true") },
-
-    { nxt_string("[1,2].hasOwnProperty('2')"),
-      nxt_string("false") },
-
-    { nxt_string("[].hasOwnProperty('length')"),
-      nxt_string("true") },
-
-    { nxt_string("[1,2].hasOwnProperty('length')"),
-      nxt_string("true") },
-
-    { nxt_string("(new Array()).hasOwnProperty('length')"),
-      nxt_string("true") },
-
-    { nxt_string("(new Array(10)).hasOwnProperty('length')"),
-      nxt_string("true") },
-
-    { nxt_string("Object.valueOf.hasOwnProperty()"),
-      nxt_string("false") },
-
-    { nxt_string("1..hasOwnProperty('b')"),
-      nxt_string("false") },
-
-    { nxt_string("'s'.hasOwnProperty('b')"),
-      nxt_string("false") },
-
-    { nxt_string("'s'.hasOwnProperty('0')"),
-      nxt_string("true") },
-
-    { nxt_string("'s'.hasOwnProperty('1')"),
-      nxt_string("false") },
-
-    { nxt_string("Object.hasOwnProperty('hasOwnProperty')"),
-      nxt_string("false") },
-
-    { nxt_string("Object.prototype.hasOwnProperty('hasOwnProperty')"),
-      nxt_string("true") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:undefined, set:undefined}).a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:1})"),
-      nxt_string("TypeError: Getter must be a function") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:undefined}).a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:function(){return 1}}).a"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {set:1})"),
-      nxt_string("TypeError: Setter must be a function") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {set:undefined}); o.a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {set:undefined}); o.a = 4;"),
-      nxt_string("TypeError: Cannot set property \"a\" of object which has only a getter") },
-
-    { nxt_string("var o = {a: 0};"
-                 "Object.defineProperty(o, 'b', {set:function(x){this.a = x / 2;}}); o.b = 4; o.a;"),
-      nxt_string("2") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {value:undefined});"
-                 "Object.defineProperty(o, 'a', {get:undefined})"),
-      nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {});"
-                 "Object.defineProperty(o, 'a', {get:undefined})"),
-      nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:undefined});"
-                 "Object.defineProperty(o, 'a', {get:undefined}).a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:undefined});"
-                 "Object.defineProperty(o, 'a', {set:undefined}).a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:undefined});"
-                 "Object.defineProperty(o, 'a', {}); o.a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:undefined});"
-                 "Object.defineProperty(o, 'a', {set:function(){}})"),
-      nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:undefined});"
-                 "Object.defineProperty(o, 'a', {get:function(){}})"),
-      nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
-                 "Object.defineProperty(o, 'a', {get:()=>2}); o.a"),
-      nxt_string("2") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {set:function(v){this.aa=v;}, configurable:true});"
-                 "Object.defineProperty(o, 'a', {get:function(){return this.aa}}); o.a = 1; o.a"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
-                 "Object.defineProperty(o, 'a', {value:2}).a"),
-      nxt_string("2") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
-                 "Object.defineProperty(o, 'a', {value:2});"
-                 "var d = Object.getOwnPropertyDescriptor(o, 'a');"
-                 "d.get === undefined && d.set === undefined"),
-      nxt_string("true") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'a', {value:1, configurable:true});"
-                 "Object.defineProperty(o, 'a', {get:()=>2});"
-                 "var d = Object.getOwnPropertyDescriptor(o, 'a');"
-                 "d.writable === undefined && d.value === undefined"),
-      nxt_string("true") },
-
-    { nxt_string("Object.defineProperty(Date.prototype, 'year', {get: function() { return this.getFullYear();}});"
-                 "var d = new Date(0); d.year"),
-      nxt_string("1970") },
-
-    { nxt_string("var o = [];"
-                 "Object.defineProperty(o, 'fill', {get:undefined}).fill"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = [];"
-                 "Object.defineProperty(o, 'length', {get:undefined})"),
-      nxt_string("TypeError: Cannot redefine property: \"length\"") },
-
-    { nxt_string("var o = {};"
-                 "Object.defineProperty(o, 'foo', {get:()=>10});"
-                 "Object.preventExtensions(o);Object.isFrozen(o)"),
-      nxt_string("true"), },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'r', { get: function() { return this.r_value; } }); o.r_value = 1; o.r;"),
-      nxt_string("1") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'rw', { get: function() { return this.rw_value; }, set: function(x) { this.rw_value = x / 2; } }); o.rw = 10; o.rw"),
-      nxt_string("5") },
-
-    { nxt_string("var o = {}; function foo() {}; Object.defineProperty(o, 'a', {get: foo});"
-                 "Object.getOwnPropertyDescriptor(o, 'a').get === foo"),
-      nxt_string("true") },
-
-    { nxt_string("var o = {}; Object.defineProperty(o, 'a', {get: undefined});"
-                "JSON.stringify(Object.getOwnPropertyDescriptor(o, 'a')).set"),
-      nxt_string("undefined") },
-
-    { nxt_string("var p = { a:5 }; var o = Object.create(p);"
-                 "Object.getPrototypeOf(o) === p"),
-      nxt_string("true") },
-
-    { nxt_string("var p = { a:5 }; var o = Object.create(p);"
-                 "Object.getPrototypeOf(o) === o.__proto__"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.create(Object.prototype);"
-                 "Object.getPrototypeOf(o) === Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Object.getPrototypeOf(1)"),
-      nxt_string("TypeError: cannot convert number argument to object") },
-
-    { nxt_string("Object.getPrototypeOf('a')"),
-      nxt_string("TypeError: cannot convert string argument to object") },
-
-    { nxt_string("var p = {}; var o = Object.create(p);"
-                 "p.isPrototypeOf(o)"),
-      nxt_string("true") },
-
-    { nxt_string("var pp = {}; var p = Object.create(pp);"
-                 "var o = Object.create(p);"
-                 "pp.isPrototypeOf(o)"),
-      nxt_string("true") },
-
-    { nxt_string("var p = {}; var o = Object.create(p);"
-                 "o.isPrototypeOf(p)"),
-      nxt_string("false") },
-
-    { nxt_string("var p = {}; var o = Object.create(p);"
-                 "o.isPrototypeOf()"),
-      nxt_string("false") },
-
-    { nxt_string("Object.valueOf.isPrototypeOf()"),
-      nxt_string("false") },
-
-    { nxt_string("var p = {}; var o = Object.create(p);"
-                 "o.isPrototypeOf(1)"),
-      nxt_string("false") },
-
-    { nxt_string("var p = {}; var o = Object.create(p);"
-                 "1..isPrototypeOf(p)"),
-      nxt_string("false") },
-
-    { nxt_string("Object.create(new String('asdf')).length"),
-      nxt_string("4") },
-
-    { nxt_string("Object.create(Object('123')).length"),
-      nxt_string("3") },
-
-    { nxt_string("Object.create([1,2]).length"),
-      nxt_string("2") },
-
-    { nxt_string("Object.create(function(a,b,c){}).length"),
-      nxt_string("3") },
-
-    { nxt_string("Object.create(Math).hasOwnProperty('abs')"),
-      nxt_string("false") },
-
-    { nxt_string("var m = Object.create(Math); m.abs = 3;"
-                 "[m.hasOwnProperty('abs'), m.abs]"),
-      nxt_string("true,3") },
-
-    { nxt_string("var m = Object.create(Math); m.abs = Math.floor;"
-                 "[m.hasOwnProperty('abs'), delete m.abs, m.abs(-1)]"),
-      nxt_string("true,true,1") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'a').value"),
-      nxt_string("1") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'a').configurable"),
-      nxt_string("true") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'a').enumerable"),
-      nxt_string("true") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'a').writable"),
-      nxt_string("true") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'b')"),
-      nxt_string("undefined") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor({}, 'a')"),
-      nxt_string("undefined") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor(Object.create({a:1}), 'a')"),
-      nxt_string("undefined") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor([3,4], '1').value"),
-      nxt_string("4") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor([3,4], 1).value"),
-      nxt_string("4") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor([], 'length').value"),
-      nxt_string("0") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor([], '0')"),
-      nxt_string("undefined") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor([1,2], '1').value"),
-      nxt_string("2") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor([1,2], new String('1')).value"),
-      nxt_string("2") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor({undefined:1}, void 0).value"),
-      nxt_string("1") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor([1,2], 1).value"),
-      nxt_string("2") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor([1,,,3], '1')"),
-      nxt_string("undefined") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor([1,2], '3')"),
-      nxt_string("undefined") },
-
-    { nxt_string("JSON.stringify(Object.getOwnPropertyDescriptor([3,4], 'length'))"),
-      nxt_string("{\"value\":2,\"writable\":true,\"enumerable\":false,\"configurable\":false}") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor(Array.of, 'length').value"),
-      nxt_string("0") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor('αβγδ', '1').value"),
-      nxt_string("β") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor(new String('αβγδ'), '1').value"),
-      nxt_string("β") },
-
-    { nxt_string("var s = new String('αβγδ'); s.a = 1;"
-                 "Object.getOwnPropertyDescriptor(s, 'a').value"),
-      nxt_string("1") },
-
-    { nxt_string("JSON.stringify(Object.getOwnPropertyDescriptor('αβγδ', '2'))"),
-      nxt_string("{\"value\":\"γ\",\"writable\":false,\"enumerable\":true,\"configurable\":false}") },
-
-    { nxt_string("JSON.stringify(Object.getOwnPropertyDescriptor(new String('abc'), 'length'))"),
-      nxt_string("{\"value\":3,\"writable\":false,\"enumerable\":false,\"configurable\":false}") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor(1, '0')"),
-      nxt_string("undefined") },
-
-    { nxt_string("'αβγδ'.propertyIsEnumerable('0')"),
-      nxt_string("true") },
-
-    { nxt_string("({a:1}).propertyIsEnumerable({toString:function () {return 'a';}})"),
-      nxt_string("true") },
-
-    { nxt_string("'αβγδ'.propertyIsEnumerable('a')"),
-      nxt_string("false") },
-
-    { nxt_string("'αβγδ'.propertyIsEnumerable('length')"),
-      nxt_string("false") },
-
-    { nxt_string("var min = Object.getOwnPropertyDescriptor(Math, 'min').value;"
-                 "[min(1,2), min(2,1), min(-1,1)]"),
-      nxt_string("1,1,-1") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor()"),
-      nxt_string("TypeError: cannot convert undefined argument to object") },
-
-    { nxt_string("Object.getOwnPropertyDescriptor(undefined)"),
-      nxt_string("TypeError: cannot convert undefined argument to object") },
-
-    { nxt_string("var o = {}; o[void 0] = 'a'; Object.getOwnPropertyDescriptor(o).value"),
-      nxt_string("a") },
-
-    { nxt_string("var o = {}; o[void 0] = 'a'; Object.getOwnPropertyDescriptor(o, undefined).value"),
-      nxt_string("a") },
-
-    { nxt_string("Object.getOwnPropertyDescriptors()"),
-      nxt_string("TypeError: cannot convert undefined argument to object") },
-
-    { nxt_string("typeof Object.getOwnPropertyDescriptors(1)"),
-      nxt_string("object") },
-
-    { nxt_string("Object.keys(Object.getOwnPropertyDescriptors([]))"),
-      nxt_string("length") },
-
-    { nxt_string("Object.getOwnPropertyDescriptors(function(a,b,c) {}).length.value"),
-      nxt_string("3") },
-
-    { nxt_string("Object.values(Object.getOwnPropertyDescriptors('abc'))"
-                 ".reduce(function(a, x) { return a += x.value; }, '')"),
-      nxt_string("abc3") },
-
-    { nxt_string("Object.getOwnPropertyNames()"),
-      nxt_string("TypeError: cannot convert undefined argument to object") },
-
-    { nxt_string("Array.isArray(Object.getOwnPropertyNames({}))"),
-      nxt_string("true") },
-
-    { nxt_string("Object.getOwnPropertyNames({a:1, b:1, c:1})"),
-      nxt_string("a,b,c") },
-
-    { nxt_string("Object.getOwnPropertyNames(Object.defineProperty({a:1}, 'b', {}))"),
-      nxt_string("a,b") },
-
-    { nxt_string("Object.getOwnPropertyNames(Object.defineProperty([], 'b', {}))"),
-      nxt_string("b,length") },
-
-    { nxt_string("Object.getOwnPropertyNames(Object.defineProperty(new String(), 'b', {}))"),
-      nxt_string("b,length") },
-
-    { nxt_string("Object.getOwnPropertyNames([1,2,3])"),
-      nxt_string("0,1,2,length") },
-
-    { nxt_string("Object.getOwnPropertyNames('abc')"),
-      nxt_string("0,1,2,length") },
-
-    { nxt_string("Object.getOwnPropertyNames(function() {})"),
-      nxt_string("length,prototype") },
-
-    { nxt_string("Object.getOwnPropertyNames(Array)"),
-      nxt_string("name,length,prototype,isArray,of") },
-
-    { nxt_string("Object.getOwnPropertyNames(Array.isArray)"),
-      nxt_string("name,length") },
-
-    { nxt_string("Object.defineProperty(Object.freeze({}), 'b', {})"),
-      nxt_string("TypeError: object is not extensible") },
-
-    { nxt_string("Object.defineProperties(Object.freeze({}), {b:{}})"),
-      nxt_string("TypeError: object is not extensible") },
-
-    { nxt_string("Object.freeze()"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = Object.freeze({a:1}); o.a = 2"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
-    { nxt_string("var o = Object.freeze({a:1}); delete o.a"),
-      nxt_string("TypeError: Cannot delete property \"a\" of object") },
-
-    { nxt_string("var o = Object.freeze({a:1}); o.b = 1; o.b"),
-      nxt_string("TypeError: Cannot add property \"b\", object is not extensible") },
-
-    { nxt_string("var o = Object.freeze(Object.create({a:1})); o.a = 2; o.a"),
-      nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
-    { nxt_string("var o = Object.freeze({a:{b:1}}); o.a.b = 2; o.a.b"),
-      nxt_string("2") },
-
-    { nxt_string("Object.defineProperty([1,2], 'a', {value:1}).a"),
-      nxt_string("1") },
-
-    { nxt_string("var a = Object.freeze([1,2]);"
-                 "Object.defineProperty(a, 'a', {value:1}).a"),
-      nxt_string("TypeError: object is not extensible") },
-
-    { nxt_string("var a = [1,2]; a.a = 1; Object.freeze(a); delete a.a"),
-      nxt_string("TypeError: Cannot delete property \"a\" of array") },
-
-    { nxt_string("var a = [1,2]; a.a = 1; Object.freeze(a); a.a = 2"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of array") },
-
-    { nxt_string("var a = Object.freeze([1,2]); a.a = 1"),
-      nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
-    { nxt_string("Object.defineProperty(function() {}, 'a', {value:1}).a"),
-      nxt_string("1") },
-
-    { nxt_string("var f = Object.freeze(function() {});"
-                 "Object.defineProperty(f, 'a', {value:1}).a"),
-      nxt_string("TypeError: object is not extensible") },
-
-    { nxt_string("var f = function() {}; f.a = 1; Object.freeze(f); delete f.a"),
-      nxt_string("TypeError: Cannot delete property \"a\" of function") },
-
-    { nxt_string("var f = function() {}; f.a = 1; Object.freeze(f); f.a = 2"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of function") },
-
-    { nxt_string("var f = Object.freeze(function() {}); f.a = 1"),
-      nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
-    { nxt_string("Object.defineProperty(new Date(''), 'a', {value:1}).a"),
-      nxt_string("1") },
-
-    { nxt_string("var d = Object.freeze(new Date(''));"
-                 "Object.defineProperty(d, 'a', {value:1}).a"),
-      nxt_string("TypeError: object is not extensible") },
-
-    { nxt_string("var d = new Date(''); d.a = 1; Object.freeze(d);"
-                 "delete d.a"),
-      nxt_string("TypeError: Cannot delete property \"a\" of date") },
-
-    { nxt_string("var d = new Date(''); d.a = 1; Object.freeze(d); d.a = 2"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of date") },
-
-    { nxt_string("var d = Object.freeze(new Date('')); d.a = 1"),
-      nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
-    { nxt_string("Object.defineProperty(new RegExp(''), 'a', {value:1}).a"),
-      nxt_string("1") },
-
-    { nxt_string("var r = Object.freeze(new RegExp(''));"
-                 "Object.defineProperty(r, 'a', {value:1}).a"),
-      nxt_string("TypeError: object is not extensible") },
-
-    { nxt_string("var r = new RegExp(''); r.a = 1; Object.freeze(r); delete r.a"),
-      nxt_string("TypeError: Cannot delete property \"a\" of regexp") },
-
-    { nxt_string("var r = new RegExp(''); r.a = 1; Object.freeze(r); r.a = 2"),
-      nxt_string("TypeError: Cannot assign to read-only property \"a\" of regexp") },
-
-    { nxt_string("var r = Object.freeze(new RegExp('')); r.a = 1"),
-      nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
-    { nxt_string("Object.isFrozen({a:1})"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isFrozen([1,2])"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isFrozen(function() {})"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isFrozen(new Date(''))"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isFrozen(new RegExp(''))"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isFrozen()"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isFrozen(1)"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isFrozen('')"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isFrozen(Object.defineProperties({}, {a:{value:1}}))"),
-      nxt_string("false") },
-
-    { nxt_string("var o = Object.defineProperties({}, {a:{}, b:{}});"
-                 "o = Object.preventExtensions(o);"
-                 "Object.isFrozen(o)"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.defineProperties({}, {a:{}, b:{writable:1}});"
-                 "o = Object.preventExtensions(o);"
-                 "Object.isFrozen(o)"),
-      nxt_string("false") },
-
-    { nxt_string("var o = Object.defineProperties({}, {a:{writable:1}});"
-                 "o = Object.preventExtensions(o);"
-                 "Object.isFrozen(o)"),
-      nxt_string("false") },
-
-    { nxt_string("var o = Object.defineProperties({}, {a:{configurable:1}});"
-                 "o = Object.preventExtensions(o);"
-                 "Object.isFrozen(o)"),
-      nxt_string("false") },
-
-    { nxt_string("var o = Object.preventExtensions({a:1});"
-                 "Object.isFrozen(o)"),
-      nxt_string("false") },
-
-    { nxt_string("var o = Object.freeze({a:1}); Object.isFrozen(o)"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.seal({a:1}); o.a = 2; o.a"),
-      nxt_string("2") },
-
-    { nxt_string("var o = Object.seal({a:1}); delete o.a"),
-      nxt_string("TypeError: Cannot delete property \"a\" of object") },
-
-    { nxt_string("var o = Object.seal({a:1}); o.b = 1; o.b"),
-      nxt_string("TypeError: Cannot add property \"b\", object is not extensible") },
-
-    { nxt_string("var o = Object.seal(Object.create({a:1})); o.a = 2; o.a"),
-      nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
-    { nxt_string("var o = Object.seal({a:{b:1}}); o.a.b = 2; o.a.b"),
-      nxt_string("2") },
-
-    { nxt_string("Object.seal()"),
-      nxt_string("undefined") },
-
-    { nxt_string("Object.seal(1)"),
-      nxt_string("1") },
-
-    { nxt_string("Object.seal('')"),
-      nxt_string("") },
-
-    { nxt_string("Object.isSealed({a:1})"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isSealed([1,2])"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isSealed(function() {})"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isSealed(new Date(''))"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isSealed(new RegExp(''))"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isSealed()"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isSealed(1)"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isSealed('')"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isSealed(Object.defineProperties({}, {a:{value:1}}))"),
-      nxt_string("false") },
-
-    { nxt_string("var o = Object.defineProperties({}, {a:{}, b:{}});"
-                 "o = Object.preventExtensions(o);"
-                 "Object.isSealed(o)"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.defineProperties({}, {a:{}, b:{writable:1}});"
-                 "o = Object.preventExtensions(o);"
-                 "Object.isSealed(o)"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.defineProperties({}, {a:{writable:1}});"
-                 "o = Object.preventExtensions(o);"
-                 "Object.isSealed(o)"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.defineProperties({}, {a:{configurable:1}});"
-                 "o = Object.preventExtensions(o);"
-                 "Object.isSealed(o)"),
-      nxt_string("false") },
-
-    { nxt_string("var o = Object.preventExtensions({a:1});"
-                 "Object.isFrozen(o)"),
-      nxt_string("false") },
-
-    { nxt_string("var o = Object.freeze({a:1}); Object.isFrozen(o)"),
-      nxt_string("true") },
-
-    { nxt_string("var o = Object.preventExtensions({a:1});"
-                 "Object.defineProperty(o, 'b', {value:1})"),
-      nxt_string("TypeError: object is not extensible") },
-
-    { nxt_string("var o = Object.preventExtensions({a:1});"
-                 "Object.defineProperties(o, {b:{value:1}})"),
-      nxt_string("TypeError: object is not extensible") },
-
-    { nxt_string("var o = Object.preventExtensions({a:1}); o.a = 2; o.a"),
-      nxt_string("2") },
-
-    { nxt_string("var o = Object.preventExtensions({a:1}); delete o.a; o.a"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = Object.preventExtensions({a:1}); o.b = 1; o.b"),
-      nxt_string("TypeError: Cannot add property \"b\", object is not extensible") },
-
-    { nxt_string("Object.preventExtensions()"),
-      nxt_string("undefined") },
-
-    { nxt_string("Object.preventExtensions(1)"),
-      nxt_string("1") },
-
-    { nxt_string("Object.preventExtensions('')"),
-      nxt_string("") },
-
-    { nxt_string("Object.isExtensible({})"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isExtensible([])"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isExtensible(function() {})"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isExtensible(new Date(''))"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isExtensible(new RegExp(''))"),
-      nxt_string("true") },
-
-    { nxt_string("Object.isExtensible()"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isExtensible(1)"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isExtensible('')"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isExtensible(Object.preventExtensions({}))"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isExtensible(Object.preventExtensions([]))"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isExtensible(Object.freeze({}))"),
-      nxt_string("false") },
-
-    { nxt_string("Object.isExtensible(Object.freeze([]))"),
-      nxt_string("false") },
-
-    { nxt_string(
-        "var fail;"
-        "function isConfigurableMethods(o) {"
-        "    var except = ["
-        "        'prototype',"
-        "    ];"
-        "    return Object.getOwnPropertyNames(o)"
-        "                 .filter(v => !except.includes(v)"
-        "                              && typeof o[v] == 'function')"
-        "                 .every(v => Object.getOwnPropertyDescriptor(o, v)"
-        "                                   .configurable"
-        "                             || !(fail = `${o.name}.${v}`));"
-        "}"
-        "["
-        "    Boolean, Boolean.prototype,"
-        "    Number, Number.prototype,"
-        "    String, String.prototype,"
-        "    Object, Object.prototype,"
-        "    Array, Array.prototype,"
-        "    Function, Function.prototype,"
-        "    RegExp, RegExp.prototype,"
-        "    Date, Date.prototype,"
-        "    Error, Error.prototype,"
-        "    Math,"
-        "    JSON,"
-        "].every(obj => isConfigurableMethods(obj)) || fail"),
-
-      nxt_string("true") },
-
-    { nxt_string(
-        "var fail;"
-        "function isWritableMethods(o) {"
-        "    var except = ["
-        "        'prototype',"
-        "    ];"
-        "    return Object.getOwnPropertyNames(o)"
-        "                 .filter(v => !except.includes(v)"
-        "                              && typeof o[v] == 'function')"
-        "                 .every(v => Object.getOwnPropertyDescriptor(o, v)"
-        "                                   .writable"
-        "                             || !(fail = `${o.name}.${v}`));"
-        "}"
-        "["
-        "    Boolean, Boolean.prototype,"
-        "    Number, Number.prototype,"
-        "    String, String.prototype,"
-        "    Object, Object.prototype,"
-        "    Array, Array.prototype,"
-        "    Function, Function.prototype,"
-        "    RegExp, RegExp.prototype,"
-        "    Date, Date.prototype,"
-        "    Error, Error.prototype,"
-        "    Math,"
-        "    JSON,"
-        "].every(obj => isWritableMethods(obj)) || fail"),
-
-      nxt_string("true") },
-
-    { nxt_string("new Date(undefined)"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("new Date(Infinity)"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("new Date(NaN)"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("new Date(8.65e15)"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("new Date(0e0.o0)"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("(new Date(8.639e15)).getTime()"),
-      nxt_string("8639000000000000") },
-
-    { nxt_string("new Date(8.641e15)"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("(new Date(null)).getTime()"),
-      nxt_string("0") },
-
-    { nxt_string("(new Date(86400)).getTime()"),
-      nxt_string("86400") },
-
-    { nxt_string("var d = new Date(''); d +' '+ d.getTime()"),
-      nxt_string("Invalid Date NaN") },
-
-    { nxt_string("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
-      nxt_string("Thu Jan 01 1970 00:00:00 GMT+0000") },
-
-    { nxt_string("var d = new Date({valueOf:()=>86400000}); d = d + ''; d.slice(0, 33)"),
-      nxt_string("Fri Jan 02 1970 00:00:00 GMT+0000") },
-
-    { nxt_string("(new Date({toString:()=>'2011'})).getTime()"),
-      nxt_string("1293840000000") },
-
-    { nxt_string("(new Date({valueOf: ()=>86400, toString:()=>'2011'})).getTime()"),
-      nxt_string("86400") },
-
-    { nxt_string("var d = new Date(1308895200000); d.getTime()"),
-      nxt_string("1308895200000") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getTime()"),
-      nxt_string("1308941100000") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.valueOf()"),
-      nxt_string("1308941100000") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45);"
-                 "d.toString().slice(0, 33)"),
-      nxt_string("Fri Jun 24 2011 18:45:00 GMT+0000") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.toDateString()"),
-      nxt_string("Fri Jun 24 2011") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45);"
-                 "d.toTimeString().slice(0, 17)"),
-      nxt_string("18:45:00 GMT+0000") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.toUTCString()"),
-      nxt_string("Fri Jun 24 2011 18:45:00 GMT") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
-                 "d.toISOString()"),
-      nxt_string("2011-06-24T18:45:12.625Z") },
-
-#if 0
-    /* These tests fail on Solaris: gmtime_r() returns off by one day. */
-
-    { nxt_string("var d = new Date(-62167219200000); d.toISOString()"),
-      nxt_string("0000-01-01T00:00:00.000Z") },
-
-    { nxt_string("var d = new Date(-62135596800000); d.toISOString()"),
-      nxt_string("0001-01-01T00:00:00.000Z") },
-
-    { nxt_string("var d = new Date(-62198755200000); d.toISOString()"),
-      nxt_string("-000001-01-01T00:00:00.000Z") },
-#endif
-
-    { nxt_string("Date.UTC(2011, 5, 24, 6, 0)"),
-      nxt_string("1308895200000") },
-
-    { nxt_string("Date.UTC({valueOf:()=>2011}, 5, 24, 6, 0)"),
-      nxt_string("1308895200000") },
-
-    { nxt_string("Date.parse()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Date.parse('2011')"),
-      nxt_string("1293840000000") },
-
-    { nxt_string("Date.parse('+002011')"),
-      nxt_string("1293840000000") },
-
-    { nxt_string("Date.parse('2011-06')"),
-      nxt_string("1306886400000") },
-
-    { nxt_string("Date.parse('2011-06-24')"),
-      nxt_string("1308873600000") },
-
-    { nxt_string("Date.parse('2011-06-24T06')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Date.parse('2011-06-24T06:')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01:')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01Z')"),
-      nxt_string("1308895260000") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01:02:')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01:02Z')"),
-      nxt_string("1308895262000") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01:02.Z')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01:02.6Z')"),
-      nxt_string("1308895262600") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01:02.62Z')"),
-      nxt_string("1308895262620") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01:02:625Z')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01:02.625Z')"),
-      nxt_string("1308895262625") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01:02.6255555Z')"),
-      nxt_string("1308895262625") },
-
-    { nxt_string("Date.parse('2011-06-24T06:01:02.625555Z5')"),
-      nxt_string("NaN") },
-
-    { nxt_string("var d = new Date(); var str = d.toISOString();"
-                 "var diff = Date.parse(str) - Date.parse(str.substring(0, str.length - 1));"
-                 "d.getTimezoneOffset() == -diff/1000/60"),
-      nxt_string("true") },
-
-    { nxt_string("Date.parse('24 Jun 2011')"),
-      nxt_string("1308873600000") },
-
-    { nxt_string("Date.parse('Fri, 24 Jun 2011 18:48')"),
-      nxt_string("1308941280000") },
-
-    { nxt_string("Date.parse('Fri, 24 Jun 2011 18:48:02')"),
-      nxt_string("1308941282000") },
-
-    { nxt_string("Date.parse('Fri, 24 Jun 2011 18:48:02 GMT')"),
-      nxt_string("1308941282000") },
-
-    { nxt_string("Date.parse('Fri, 24 Jun 2011 18:48:02 +1245')"),
-      nxt_string("1308895382000") },
-
-    { nxt_string("Date.parse('Jun 24 2011')"),
-      nxt_string("1308873600000") },
-
-    { nxt_string("Date.parse('Fri Jun 24 2011 18:48')"),
-      nxt_string("1308941280000") },
-
-    { nxt_string("Date.parse('Fri Jun 24 2011 18:48:02')"),
-      nxt_string("1308941282000") },
-
-    { nxt_string("Date.parse('Fri Jun 24 2011 18:48:02 GMT+1245')"),
-      nxt_string("1308895382000") },
-
-    /* Jan 1, 1. */
-    { nxt_string("Date.parse('+000001-01-01T00:00:00.000Z')"),
-      nxt_string("-62135596800000") },
-
-    /* Mar 2, 1 BCE. */
-    { nxt_string("Date.parse('+000000-03-02T00:00:00.000Z')"),
-      nxt_string("-62161948800000") },
-
-    /* Mar 1, 1 BCE. */
-    { nxt_string("Date.parse('+000000-03-01T00:00:00.000Z')"),
-      nxt_string("-62162035200000") },
-
-    /* Feb 29, 1 BCE. */
-    { nxt_string("Date.parse('+000000-02-29T00:00:00.000Z')"),
-      nxt_string("-62162121600000") },
-
-    /* Feb 28, 1 BCE. */
-    { nxt_string("Date.parse('+000000-02-28T00:00:00.000Z')"),
-      nxt_string("-62162208000000") },
-
-    /* Jan 1, 1 BCE. */
-    { nxt_string("Date.parse('+000000-01-01T00:00:00.000Z')"),
-      nxt_string("-62167219200000") },
-
-    /* Jan 1, 2 BCE. */
-    { nxt_string("Date.parse('-000001-01-01T00:00:00.000Z')"),
-      nxt_string("-62198755200000") },
-
-    { nxt_string("var d = new Date(); d == Date.parse(d.toISOString())"),
-      nxt_string("true") },
-
-    { nxt_string("var s = Date(); s === Date(Date.parse(s))"),
-      nxt_string("true") },
-
-    { nxt_string("var n = Date.now(); n == new Date(n)"),
-      nxt_string("true") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getFullYear()"),
-      nxt_string("2011") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCFullYear()"),
-      nxt_string("2011") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getMonth()"),
-      nxt_string("5") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMonth()"),
-      nxt_string("5") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getDate()"),
-      nxt_string("24") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCDate()"),
-      nxt_string("24") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getDay()"),
-      nxt_string("5") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCDay()"),
-      nxt_string("5") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getHours()"),
-      nxt_string("18") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCHours()"),
-      nxt_string("18") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getMinutes()"),
-      nxt_string("45") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMinutes()"),
-      nxt_string("45") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12);"
-                 "d.getSeconds()"),
-      nxt_string("12") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12);"
-                 "d.getUTCSeconds()"),
-      nxt_string("12") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
-                 "d.getMilliseconds()"),
-      nxt_string("625") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
-                 "d.getUTCMilliseconds()"),
-      nxt_string("625") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
-                 "d.getTimezoneOffset()"),
-      nxt_string("0") },
-
-    { nxt_string("var d = new Date(); d.setTime(1308895200000); d.getTime()"),
-      nxt_string("1308895200000") },
-
-    { nxt_string("var d = new Date(1308895201625); d.setMilliseconds(5003);"
-                 "d.getTime()"),
-      nxt_string("1308895206003") },
-
-    { nxt_string("var d = new Date(1308895201625); d.setSeconds(2, 5003);"
-                 "d.getTime()"),
-      nxt_string("1308895207003") },
-
-    { nxt_string("var d = new Date(1308895201625); d.setSeconds(2);"
-                 "d.getTime()"),
-      nxt_string("1308895202625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setMinutes(3, 2, 5003);"
-                 "d.getTime()"),
-      nxt_string("1308895387003") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setMinutes(3, 2);"
-                 "d.getTime()"),
-      nxt_string("1308895382625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setMinutes(3);"
-                 "d.getTime()"),
-      nxt_string("1308895383625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCMinutes(3, 2, 5003);"
-                 "d.getTime()"),
-      nxt_string("1308895387003") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCMinutes(3, 2);"
-                 "d.getTime()"),
-      nxt_string("1308895382625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCMinutes(3);"
-                 "d.getTime()"),
-      nxt_string("1308895383625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3, 2, 5003);"
-                 "d.getTime()"),
-      nxt_string("1308945787003") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3, 2);"
-                 "d.getTime()"),
-      nxt_string("1308945782625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3);"
-                 "d.getTime()"),
-      nxt_string("1308945783625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setHours(20);"
-                 "d.getTime()"),
-      nxt_string("1308945723625") },
-
-    { nxt_string("var d = new Date(1308895323625);"
-                 "d.setUTCHours(20, 3, 2, 5003); d.getTime()"),
-      nxt_string("1308945787003") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCHours(20, 3, 2);"
-                 "d.getTime()"),
-      nxt_string("1308945782625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCHours(20, 3);"
-                 "d.getTime()"),
-      nxt_string("1308945783625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCHours(20);"
-                 "d.getTime()"),
-      nxt_string("1308945723625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setDate(10);"
-                 "d.getTime()"),
-      nxt_string("1307685723625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCDate(10);"
-                 "d.getTime()"),
-      nxt_string("1307685723625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setMonth(2, 10);"
-                 "d.getTime()"),
-      nxt_string("1299736923625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCMonth(2, 10);"
-                 "d.getTime()"),
-      nxt_string("1299736923625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setMonth(2);"
-                 "d.getTime()"),
-      nxt_string("1300946523625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCMonth(2);"
-                 "d.getTime()"),
-      nxt_string("1300946523625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setFullYear(2010, 2, 10);"
-                 "d.getTime()"),
-      nxt_string("1268200923625") },
-
-    { nxt_string("var d = new Date(1308895323625);"
-                 "d.setUTCFullYear(2010, 2, 10); d.getTime()"),
-      nxt_string("1268200923625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setFullYear(2010, 2);"
-                 "d.getTime()"),
-      nxt_string("1269410523625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCFullYear(2010, 2);"
-                 "d.getTime()"),
-      nxt_string("1269410523625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setFullYear(2010);"
-                 "d.getTime()"),
-      nxt_string("1277359323625") },
-
-    { nxt_string("var d = new Date(1308895323625); d.setUTCFullYear(2010);"
-                 "d.getTime()"),
-      nxt_string("1277359323625") },
-
-    { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
-                 "d.toJSON(1)"),
-      nxt_string("2011-06-24T18:45:12.625Z") },
-
-    { nxt_string("var o = { toISOString: function() { return 'OK' } };"
-                 "Date.prototype.toJSON.call(o, 1)"),
-      nxt_string("OK") },
-
-    { nxt_string("var d = new Date; d.__proto__"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("var d = new Date(); d.__proto__"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("var d = new Date(); d.__proto__ === Date.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("new Date(NaN)"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("[0].map(new Date().getDate)"),
-      nxt_string("TypeError: cannot convert undefined to date") },
-
-    { nxt_string("new Date(eval)"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("Date.UTC(eval)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Date.name"),
-      nxt_string("Date") },
-
-    { nxt_string("Date.length"),
-      nxt_string("7") },
-
-    { nxt_string("Date.__proto__ === Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Date.prototype.constructor === Date"),
-      nxt_string("true") },
-
-    { nxt_string("Date.prototype.hasOwnProperty('constructor')"),
-      nxt_string("true") },
-
-    { nxt_string("Date.prototype.__proto__ === Object.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("Date.prototype"),
-      nxt_string("Invalid Date") },
-
-    { nxt_string("Date.prototype.valueOf()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Date.constructor === Function"),
-      nxt_string("true") },
-
-    /* eval(). */
-
-    { nxt_string("eval.name"),
-      nxt_string("eval") },
-
-    { nxt_string("eval.length"),
-      nxt_string("1") },
-
-    { nxt_string("eval.prototype"),
-      nxt_string("undefined") },
-
-    { nxt_string("eval.__proto__ === Function.prototype"),
-      nxt_string("true") },
-
-    { nxt_string("eval.constructor === Function"),
-      nxt_string("true") },
-
-    { nxt_string("eval()"),
-      nxt_string("InternalError: Not implemented") },
-
-    /* Math. */
-
-    { nxt_string("Math.PI"),
-      nxt_string("3.141592653589793") },
-
-    { nxt_string("Math.abs()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.abs(5)"),
-      nxt_string("5") },
-
-    { nxt_string("Math.abs(-5)"),
-      nxt_string("5") },
-
-    { nxt_string("Math.abs('5.0')"),
-      nxt_string("5") },
-
-    { nxt_string("Math.abs('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.acos()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.acos(NaN)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.acos('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.acos(1.1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.acos(-1.1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.acos('1')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.acos(0) - Math.PI/2"),
-      nxt_string("0") },
-
-    { nxt_string("Math.acosh()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.acosh('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.acosh(0.9)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.acosh(1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.acosh('Infinity')"),
-      nxt_string("Infinity") },
-
-    /*
-     * The difference is Number.EPSILON on Linux/i686
-     * and zero on other platforms.
-     */
-    { nxt_string("Math.abs(Math.acosh((1/Math.E + Math.E)/2) - 1)"
-                 " <= Number.EPSILON"),
-      nxt_string("true") },
-
-    { nxt_string("Math.asin()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.asin(NaN)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.asin('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.asin(1.1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.asin(-1.1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.asin(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.asin('-0')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.asin(1) - Math.PI/2"),
-      nxt_string("0") },
-
-    { nxt_string("Math.asinh()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.asinh('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.asinh(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.asinh('-0')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.asinh(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.asinh(-Infinity)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.asinh((Math.E - 1/Math.E)/2)"),
-      nxt_string("1") },
-
-    { nxt_string("Math.atan()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.atan(NaN)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.atan('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.atan('Infinity') - Math.PI/2"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan(-Infinity) + Math.PI/2"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan('-0')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.atan(1) - Math.PI/4"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.atan2(1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.atan2('abc', 1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.atan2(1, 0) - Math.PI/2"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2('1', -0) - Math.PI/2"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(0, '1')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(0, 0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(0, -0) - Math.PI"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2('0', -1) - Math.PI"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(-0, '0.1')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.atan2(-0, 0)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.atan2(-0, -0) + Math.PI"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2('-0', '-1') + Math.PI"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(-0.1, 0) + Math.PI/2"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(-1, -0) + Math.PI/2"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(1, 'Infinity')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(0.1, -Infinity) - Math.PI"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(-1, Infinity)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.atan2('-0.1', -Infinity) + Math.PI"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(Infinity, -5) - Math.PI/2"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(-Infinity, 5) + Math.PI/2"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2('Infinity', 'Infinity') - Math.PI/4"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(Infinity, -Infinity) - 3*Math.PI/4"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(-Infinity, 'Infinity') + Math.PI/4"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2('-Infinity', -Infinity) + 3*Math.PI/4"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atan2(1, 1) - Math.atan2(-5, -5) - Math.PI"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atanh()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.atanh('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.atanh(-1.1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.atanh(1.1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.atanh(1)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.atanh('-1')"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.atanh(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.atanh(-0)"),
-      nxt_string("-0") },
-
-    /*
-     * The difference is Number.EPSILON on Linux/i686
-     * and zero on other platforms.
-     */
-    { nxt_string("Math.abs(1 - Math.atanh((Math.E - 1)/(Math.E + 1)) * 2)"
-                 " <= Number.EPSILON"),
-      nxt_string("true") },
-
-    { nxt_string("Math.cbrt()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.cbrt('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.cbrt(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.cbrt('-0')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.cbrt(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.cbrt(-Infinity)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("(Math.cbrt('27') - 3) < 1e-15"),
-      nxt_string("true") },
-
-    { nxt_string("Math.cbrt(-1)"),
-      nxt_string("-1") },
-
-    { nxt_string("Math.ceil()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.ceil('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.ceil(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.ceil('-0')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.ceil('Infinity')"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.ceil(-Infinity)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.ceil(-0.9)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.ceil(3.1)"),
-      nxt_string("4") },
-
-    { nxt_string("Math.clz32()"),
-      nxt_string("32") },
-
-    { nxt_string("Math.clz32('abc')"),
-      nxt_string("32") },
-
-    { nxt_string("Math.clz32(NaN)"),
-      nxt_string("32") },
-
-    { nxt_string("Math.clz32(Infinity)"),
-      nxt_string("32") },
-
-    { nxt_string("Math.clz32('1')"),
-      nxt_string("31") },
-
-    { nxt_string("Math.clz32(0)"),
-      nxt_string("32") },
-
-    { nxt_string("Math.clz32('65535')"),
-      nxt_string("16") },
-
-    { nxt_string("Math.clz32(-1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.clz32(4294967298)"),
-      nxt_string("30") },
-
-    { nxt_string("Math.cos()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.cos('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.cos('0')"),
-      nxt_string("1") },
-
-    { nxt_string("Math.cos(-0)"),
-      nxt_string("1") },
-
-    { nxt_string("Math.cos(Infinity)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.cos(-Infinity)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.cos(Math.PI*2)"),
-      nxt_string("1") },
-
-    { nxt_string("Math.cosh()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.cosh('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.cosh('0')"),
-      nxt_string("1") },
-
-    { nxt_string("Math.cosh(-0)"),
-      nxt_string("1") },
-
-    { nxt_string("Math.cosh(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.cosh(-Infinity)"),
-      nxt_string("Infinity") },
-
-    /*
-     * The difference is Number.EPSILON on FreeBSD
-     * and zero on other platforms.
-     */
-    { nxt_string("Math.abs(Math.cosh(1) - (1/Math.E + Math.E)/2)"
-                 " <= Number.EPSILON"),
-      nxt_string("true") },
-
-    { nxt_string("Math.exp()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.exp('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.exp('0')"),
-      nxt_string("1") },
-
-    { nxt_string("Math.exp(-0)"),
-      nxt_string("1") },
-
-    { nxt_string("Math.exp(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.exp(-Infinity)"),
-      nxt_string("0") },
-
-    /*
-     * The difference is 2 * Number.EPSILON on FreeBSD
-     * and zero on other platforms.
-     */
-    { nxt_string("Math.abs(Math.exp(1) - Math.E) <= 2 * Number.EPSILON"),
-      nxt_string("true") },
-
-    { nxt_string("Math.expm1()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.expm1('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.expm1('0')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.expm1(-0)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.expm1(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.expm1(-Infinity)"),
-      nxt_string("-1") },
-
-    /*
-     * The difference is 2 * Number.EPSILON on FreeBSD, Solaris,
-     * and MacOSX and zero on other platforms.
-     */
-    { nxt_string("Math.abs(1 + Math.expm1(1) - Math.E) <= 2 * Number.EPSILON"),
-      nxt_string("true") },
-
-    { nxt_string("Math.floor()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.floor('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.floor(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.floor('-0')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.floor('Infinity')"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.floor(-Infinity)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.floor(0.9)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.floor(-3.1)"),
-      nxt_string("-4") },
-
-    { nxt_string("Math.fround()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.fround('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.fround(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.fround('-0')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.fround('Infinity')"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.fround(-Infinity)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.fround('-1.5')"),
-      nxt_string("-1.5") },
-
-    { nxt_string("Math.fround(16777216)"),
-      nxt_string("16777216") },
-
-    { nxt_string("Math.fround(-16777217)"),
-      nxt_string("-16777216") },
-
-    { nxt_string("Math.hypot()"),
-      nxt_string("0") },
-
-    { nxt_string("Math.hypot(1, 2, 'abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.hypot(1, NaN, 3)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.hypot(1, NaN, -Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.hypot(-42)"),
-      nxt_string("42") },
-
-    { nxt_string("Math.hypot(8, -15)"),
-      nxt_string("17") },
-
-    { nxt_string("Math.hypot(3, -4, 12.0, '84', 132)"),
-      nxt_string("157") },
-
-    { nxt_string("Math.imul()"),
-      nxt_string("0") },
-
-    { nxt_string("Math.imul(1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.imul('a', 1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.imul(1, NaN)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.imul(2, '3')"),
-      nxt_string("6") },
-
-    { nxt_string("Math.imul('3.9', -2.1)"),
-      nxt_string("-6") },
-
-    { nxt_string("Math.imul(2, 2147483647)"),
-      nxt_string("-2") },
-
-    { nxt_string("Math.imul(Number.MAX_SAFE_INTEGER, 2)"),
-      nxt_string("-2") },
-
-    { nxt_string("Math.imul(1, Number.MAX_SAFE_INTEGER + 1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.imul(2, Number.MIN_SAFE_INTEGER)"),
-      nxt_string("2") },
-
-    { nxt_string("Math.imul(Number.MIN_SAFE_INTEGER - 1, 1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.imul(2, 4294967297)"),
-      nxt_string("2") },
-
-    { nxt_string("Math.imul(-4294967297, 4294967297)"),
-      nxt_string("-1") },
-
-    { nxt_string("Math.imul(4294967297, -4294967298)"),
-      nxt_string("-2") },
-
-    { nxt_string("Math.imul(-4294967290, 4294967290)"),
-      nxt_string("-36") },
-
-    { nxt_string("Math.imul(-Infinity, 1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.imul(1, Infinity)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.imul(Number.MAX_VALUE, 1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.imul(1, -Number.MAX_VALUE)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.log()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log(-1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log(0)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.log('-0')"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.log(1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.log(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.log(Math.E)"),
-      nxt_string("1") },
-
-    { nxt_string("Math.log10()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log10('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log10(-1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log10(0)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.log10('-0')"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.log10(1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.log10(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.log10(1000)"),
-      nxt_string("3") },
-
-    { nxt_string("Math.log1p()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log1p('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log1p(-2)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log1p('-1')"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.log1p(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.log1p(-0)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.log1p(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.log1p(Math.E - 1)"),
-      nxt_string("1") },
-
-    { nxt_string("Math.log2()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log2('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log2(-1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.log2(0)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.log2('-0')"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.log2(1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.log2(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.log2(128)"),
-      nxt_string("7") },
-
-    { nxt_string("Math.max()"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.max(null)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.max(undefined)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.max('1', '2', '5')"),
-      nxt_string("5") },
-
-    { nxt_string("Math.max(5, {valueOf: function () {return 10}}, 6)"),
-      nxt_string("10") },
-
-    { nxt_string("Math.max(5, {valueOf: function () {return 10}}, 20)"),
-      nxt_string("20") },
-
-    { nxt_string("Math.max(5, undefined, 20)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.max(-10, null, -30)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.min()"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.min(null)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.min(undefined)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.min('1', '2', '5')"),
-      nxt_string("1") },
-
-    { nxt_string("Math.pow(2, 5)"),
-      nxt_string("32") },
-
-    { nxt_string("Math.pow(2)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.pow()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.pow(1, NaN)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.pow(3, NaN)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.pow('a', -0)"),
-      nxt_string("1") },
-
-    { nxt_string("Math.pow(1.1, Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.pow(-1.1, -Infinity)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.pow(-1, Infinity)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.pow(1, -Infinity)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.pow(-0.9, Infinity)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.pow(0.9, -Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.pow('Infinity', 0.1)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.pow(Infinity, '-0.1')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.pow(-Infinity, 3)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.pow('-Infinity', '3.1')"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.pow(-Infinity, '-3')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.pow('-Infinity', -2)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.pow('0', 0.1)"),
-      nxt_string("0") },
-
-#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
-    { nxt_string("Math.pow(0, '-0.1')"),
-      nxt_string("Infinity") },
-#endif
-
-    { nxt_string("Math.pow(-0, 3)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.pow('-0', '3.1')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.pow(-0, '-3')"),
-      nxt_string("-Infinity") },
-
-#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
-    { nxt_string("Math.pow('-0', -2)"),
-      nxt_string("Infinity") },
-#endif
-
-    { nxt_string("Math.pow(-3, 0.1)"),
-      nxt_string("NaN") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* intentional use of uninitialized stack */
-    { nxt_string("var a = Math.random(); a >= 0 && a < 1"),
-      nxt_string("true") },
-#endif
-
-    { nxt_string("Math.round()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.round('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.round(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.round('-0')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.round('Infinity')"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.round(-Infinity)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.round(0.4)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.round('0.5')"),
-      nxt_string("1") },
-
-    { nxt_string("Math.round('-0.4')"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.round(-0.5)"),
-      nxt_string("-1") },
-
-    { nxt_string("Math.sign(5)"),
-      nxt_string("1") },
-
-    { nxt_string("Math.sign(-5)"),
-      nxt_string("-1") },
-
-    { nxt_string("Math.sign(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.sign(-0.0)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.sign(NaN)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sign()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sin()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sin('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sin('0')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.sin(-0)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.sin(Infinity)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sin(-Infinity)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sin(-Math.PI/2)"),
-      nxt_string("-1") },
-
-    { nxt_string("Math.sinh()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sinh('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sinh('0')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.sinh(-0)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.sinh(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.sinh(-Infinity)"),
-      nxt_string("-Infinity") },
-
-    /*
-     * The difference is Number.EPSILON on Solaris
-     * and zero on other platforms.
-     */
-    { nxt_string("Math.abs(Math.sinh(1) - (Math.E - 1/Math.E)/2)"
-                 " <= Number.EPSILON"),
-      nxt_string("true") },
-
-    { nxt_string("Math.sqrt()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sqrt('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sqrt('0')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.sqrt(-0)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.sqrt(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.sqrt(-0.1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.sqrt('9.0')"),
-      nxt_string("3") },
-
-    { nxt_string("Math.tan()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.tan('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.tan('0')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.tan(-0)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.tan(Infinity)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.tan(-Infinity)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.tan(Math.PI/3) + Math.tan(-Math.PI/3)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.tanh()"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.tanh('abc')"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.tanh('0')"),
-      nxt_string("0") },
-
-    { nxt_string("Math.tanh(-0)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.tanh(Infinity)"),
-      nxt_string("1") },
-
-    { nxt_string("Math.tanh(-Infinity)"),
-      nxt_string("-1") },
-
-    { nxt_string("Math.tanh(0.5) - (Math.E - 1)/(Math.E + 1)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.trunc(3.9)"),
-      nxt_string("3") },
-
-    { nxt_string("Math.trunc(-3.9)"),
-      nxt_string("-3") },
-
-    { nxt_string("Math.trunc(0)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.trunc(-0)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.trunc(0.9)"),
-      nxt_string("0") },
-
-    { nxt_string("Math.trunc(-0.9)"),
-      nxt_string("-0") },
-
-    { nxt_string("Math.trunc(Infinity)"),
-      nxt_string("Infinity") },
-
-    { nxt_string("Math.trunc(-Infinity)"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("Math.trunc(NaN)"),
-      nxt_string("NaN") },
-
-    { nxt_string("Math.trunc()"),
-      nxt_string("NaN") },
-
-    /* ES5FIX: "[object Math]". */
-
-    { nxt_string("Math"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("Math.x = function (x) {return 2*x;}; Math.x(3)"),
-      nxt_string("6") },
-
-    { nxt_string("isNaN"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("isNaN.name"),
-      nxt_string("isNaN") },
-
-    { nxt_string("isNaN.length"),
-      nxt_string("1") },
-
-    { nxt_string("isNaN()"),
-      nxt_string("true") },
-
-    { nxt_string("isNaN(123)"),
-      nxt_string("false") },
-
-    { nxt_string("isNaN('123')"),
-      nxt_string("false") },
-
-    { nxt_string("isNaN('Infinity')"),
-      nxt_string("false") },
-
-    { nxt_string("isNaN('abc')"),
-      nxt_string("true") },
-
-    { nxt_string("isFinite"),
-      nxt_string("[object Function]") },
-
-    { nxt_string("isFinite.name"),
-      nxt_string("isFinite") },
-
-    { nxt_string("isFinite.length"),
-      nxt_string("1") },
-
-    { nxt_string("isFinite()"),
-      nxt_string("false") },
-
-    { nxt_string("isFinite(123)"),
-      nxt_string("true") },
-
-    { nxt_string("isFinite('123')"),
-      nxt_string("true") },
-
-    { nxt_string("isFinite('Infinity')"),
-      nxt_string("false") },
-
-    { nxt_string("isFinite('abc')"),
-      nxt_string("false") },
-
-    { nxt_string("parseInt.name"),
-      nxt_string("parseInt") },
-
-    { nxt_string("parseInt.length"),
-      nxt_string("2") },
-
-    { nxt_string("parseInt('12345abc')"),
-      nxt_string("12345") },
-
-    { nxt_string("parseInt('123', 0)"),
-      nxt_string("123") },
-
-    { nxt_string("parseInt('0XaBc', 0)"),
-      nxt_string("2748") },
-
-    { nxt_string("parseInt(' 123')"),
-      nxt_string("123") },
-
-    { nxt_string("parseInt('1010', 2)"),
-      nxt_string("10") },
-
-    { nxt_string("parseInt('aBc', 16)"),
-      nxt_string("2748") },
-
-    { nxt_string("parseInt('0XaBc')"),
-      nxt_string("2748") },
-
-    { nxt_string("parseInt('-0xabc')"),
-      nxt_string("-2748") },
-
-    { nxt_string("parseInt('njscript', 36)"),
-      nxt_string("1845449130881") },
-
-    { nxt_string("parseInt('0x')"),
-      nxt_string("NaN") },
-
-    { nxt_string("parseInt('z')"),
-      nxt_string("NaN") },
-
-    { nxt_string("parseInt('0xz')"),
-      nxt_string("NaN") },
-
-    { nxt_string("parseInt('0x', 16)"),
-      nxt_string("NaN") },
-
-    { nxt_string("parseInt('0x', 33)"),
-      nxt_string("0") },
-
-    { nxt_string("parseInt('0x', 34)"),
-      nxt_string("33") },
-
-    { nxt_string("parseInt('0', 1)"),
-      nxt_string("NaN") },
-
-    { nxt_string("parseInt('0', 37)"),
-      nxt_string("NaN") },
-
-    { nxt_string("1/parseInt('-0')"),
-      nxt_string("-Infinity") },
-
-    { nxt_string("parseFloat.name"),
-      nxt_string("parseFloat") },
-
-    { nxt_string("parseFloat.length"),
-      nxt_string("1") },
-
-    { nxt_string("parseFloat('12345abc')"),
-      nxt_string("12345") },
-
-    { nxt_string("parseFloat('0x')"),
-      nxt_string("0") },
-
-    { nxt_string("parseFloat('0xff')"),
-      nxt_string("0") },
-
-    { nxt_string("parseFloat('Infinity')"),
-      nxt_string("Infinity") },
-
-    { nxt_string("parseFloat(' Infinityzz')"),
-      nxt_string("Infinity") },
-
-    { nxt_string("parseFloat('Infinit')"),
-      nxt_string("NaN") },
-
-    { nxt_string("parseFloat('5.7e1')"),
-      nxt_string("57") },
-
-    { nxt_string("parseFloat('-5.7e-1')"),
-      nxt_string("-0.57") },
-
-    { nxt_string("parseFloat('-5.e-1')"),
-      nxt_string("-0.5") },
-
-    { nxt_string("parseFloat('5.7e+01')"),
-      nxt_string("57") },
-
-    { nxt_string("parseFloat(' 5.7e+01abc')"),
-      nxt_string("57") },
-
-    { nxt_string("parseFloat('-5.7e-1abc')"),
-      nxt_string("-0.57") },
-
-    { nxt_string("parseFloat('-5.7e')"),
-      nxt_string("-5.7") },
-
-    { nxt_string("parseFloat('-5.7e+')"),
-      nxt_string("-5.7") },
-
-    { nxt_string("parseFloat('-5.7e+abc')"),
-      nxt_string("-5.7") },
-
-    /* JSON.parse() */
-
-    { nxt_string("JSON.parse('null')"),
-      nxt_string("null") },
-
-    { nxt_string("JSON.parse('true')"),
-      nxt_string("true") },
-
-    { nxt_string("JSON.parse('false')"),
-      nxt_string("false") },
-
-    { nxt_string("JSON.parse('0')"),
-      nxt_string("0") },
-
-    { nxt_string("JSON.parse('-1234.56e2')"),
-      nxt_string("-123456") },
-
-    { nxt_string("typeof(JSON.parse('true'))"),
-      nxt_string("boolean") },
-
-    { nxt_string("typeof(JSON.parse('false'))"),
-      nxt_string("boolean") },
-
-    { nxt_string("typeof(JSON.parse('1'))"),
-      nxt_string("number") },
-
-    { nxt_string("typeof(JSON.parse('\"\"'))"),
-      nxt_string("string") },
-
-    { nxt_string("typeof(JSON.parse('{}'))"),
-      nxt_string("object") },
-
-    { nxt_string("typeof(JSON.parse('[]'))"),
-      nxt_string("object") },
-
-    { nxt_string("JSON.parse('\"abc\"')"),
-      nxt_string("abc") },
-
-    { nxt_string("JSON.parse('\"\\\\\"\"')"),
-      nxt_string("\"") },
-
-    { nxt_string("JSON.parse('\"\\\\n\"')"),
-      nxt_string("\n") },
-
-    { nxt_string("JSON.parse('\"\\\\t\"')"),
-      nxt_string("\t") },
-
-    { nxt_string("JSON.parse('\"ab\\\\\"c\"')"),
-      nxt_string("ab\"c") },
-
-    { nxt_string("JSON.parse('\"abcdefghijklmopqr\\\\\"s\"')"),
-      nxt_string("abcdefghijklmopqr\"s") },
-
-    { nxt_string("JSON.parse('\"ab\\\\\"c\"').length"),
-      nxt_string("4") },
-
-    { nxt_string("JSON.parse('\"аб\\\\\"в\"')"),
-      nxt_string("аб\"в") },
-
-    { nxt_string("JSON.parse('\"аб\\\\\"в\"').length"),
-      nxt_string("4") },
-
-    { nxt_string("JSON.parse('\"абвгдеёжзийкл\"').length"),
-      nxt_string("13") },
-
-    { nxt_string("JSON.parse('[\"' + 'α'.repeat(33) + '\"]')[0][32]"),
-      nxt_string("α") },
-
-    { nxt_string("JSON.parse('\"\\\\u03B1\"')"),
-      nxt_string("α") },
-
-    { nxt_string("JSON.parse('\"\\\\uD801\\\\uDC00\"')"),
-      nxt_string("𐐀") },
-
-    { nxt_string("JSON.parse('\"\\\\u03B1\"') == JSON.parse('\"\\\\u03b1\"')"),
-      nxt_string("true") },
-
-    { nxt_string("JSON.parse('\"\\\\u03B1\"').length"),
-      nxt_string("1") },
-
-    { nxt_string("JSON.parse('{\"a\":1}').a"),
-      nxt_string("1") },
-
-    { nxt_string("JSON.parse('{\"a\":1,\"a\":2}').a"),
-      nxt_string("2") },
-
-    { nxt_string("JSON.parse('{   \"a\" :  \"b\"   }').a"),
-      nxt_string("b") },
-
-    { nxt_string("JSON.parse('{\"a\":{\"b\":1}}').a.b"),
-      nxt_string("1") },
-
-    { nxt_string("JSON.parse('[{}, true ,1.1e2, {\"a\":[3,\"b\"]}]')[3].a[1]"),
-      nxt_string("b") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":2}');"
-                 "Object.getOwnPropertyDescriptor(o, 'a').configurable"),
-      nxt_string("true") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":2}');"
-                 "Object.getOwnPropertyDescriptor(o, 'a').writable"),
-      nxt_string("true") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":2}');"
-                 "Object.getOwnPropertyDescriptor(o, 'a').enumerable"),
-      nxt_string("true") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":2}');"
-                 "o.a = 3; o.a"),
-      nxt_string("3") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":2}');"
-                 "o.b = 3; o.b"),
-      nxt_string("3") },
-
-    { nxt_string("JSON.parse('2') || 10"),
-      nxt_string("2") },
-
-    { nxt_string("JSON.parse('0') || 10"),
-      nxt_string("10") },
-
-    { nxt_string("JSON.parse('-0') || 10"),
-      nxt_string("10") },
-
-    { nxt_string("JSON.parse('\"a\"') || 10"),
-      nxt_string("a") },
-
-    { nxt_string("JSON.parse('\"\"') || 10"),
-      nxt_string("10") },
-
-    { nxt_string("JSON.parse('true') || 10"),
-      nxt_string("true") },
-
-    { nxt_string("JSON.parse('false') || 10"),
-      nxt_string("10") },
-
-    { nxt_string("JSON.parse('null') || 10"),
-      nxt_string("10") },
-
-    { nxt_string("var o = JSON.parse('{}', function(k, v) {return v;}); o"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":2, \"b\":4, \"a\":{}}',"
-                 "                    function(k, v) {return undefined;});"
-                 "o"),
-      nxt_string("undefined") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":2, \"c\":4, \"b\":\"x\"}',"
-                 "  function(k, v) {if (k === '' || typeof v === 'number') return v });"
-                 "Object.keys(o)"),
-      nxt_string("a,c") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":2, \"b\":{}}',"
-                 "                    function(k, v) {return k;});"
-                 "o+typeof(o)"),
-      nxt_string("string") },
-
-    { nxt_string("var o = JSON.parse('[\"a\", \"b\"]',"
-                 "                    function(k, v) {return v;});"
-                 "o"),
-      nxt_string("a,b") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":[1,{\"b\":1},3]}',"
-                 "                    function(k, v) {return v;});"
-                 "o.a[1].b"),
-      nxt_string("1") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":[1,2]}',"
-                 "  function(k, v) {if (k === '' || k === 'a') {return v;}});"
-                 "o.a"),
-      nxt_string(",") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":[1,2]}',"
-                 "  function(k, v) {return (k === '' || k === 'a') ? v : v*2});"
-                 "o.a"),
-      nxt_string("2,4") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":2, \"b\":{\"c\":[\"xx\"]}}',"
-                 "   function(k, v) {return typeof v === 'number' ? v * 2 : v;});"
-                 "o.a+o.b.c[0]"),
-      nxt_string("4xx") },
-
-    { nxt_string("var o = JSON.parse('{\"aa\":{\"b\":1}, \"abb\":1, \"c\":1}',"
-                 "   function(k, v) {return (k === '' || /^a/.test(k)) ? v : undefined;});"
-                 "Object.keys(o)"),
-      nxt_string("aa,abb") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":\"x\"}',"
-                 "   function(k, v) {if (k === 'a') {this.b='y';} return v});"
-                 "o.a+o.b"),
-      nxt_string("xy") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":\"x\"}',"
-                 "   function(k, v) {return (k === 'a' ? {x:1} : v)});"
-                 "o.a.x"),
-      nxt_string("1") },
-
-    { nxt_string("var keys = []; var o = JSON.parse('{\"a\":2, \"b\":{\"c\":\"xx\"}}',"
-                 "   function(k, v) {keys.push(k); return v;});"
-                 "keys"),
-      nxt_string("a,c,b,") },
-
-    { nxt_string("var args = []; var o = JSON.parse('[2,{\"a\":3}]',"
-                 "   function(k, v) {args.push(k+\":\"+v); return v;});"
-                 "args.join('|')"),
-      nxt_string("0:2|a:3|1:[object Object]|:2,[object Object]") },
-
-    { nxt_string("JSON.parse()"),
-      nxt_string("SyntaxError: Unexpected token at position 0") },
-
-    { nxt_string("JSON.parse([])"),
-      nxt_string("SyntaxError: Unexpected end of input at position 0") },
-
-    { nxt_string("JSON.parse('')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 0") },
-
-    { nxt_string("JSON.parse('fals')"),
-      nxt_string("SyntaxError: Unexpected token at position 0") },
-
-    { nxt_string("JSON.parse(' t')"),
-      nxt_string("SyntaxError: Unexpected token at position 1") },
-
-    { nxt_string("JSON.parse('nu')"),
-      nxt_string("SyntaxError: Unexpected token at position 0") },
-
-    { nxt_string("JSON.parse('-')"),
-      nxt_string("SyntaxError: Unexpected number at position 0") },
-
-    { nxt_string("JSON.parse('--')"),
-      nxt_string("SyntaxError: Unexpected number at position 1") },
-
-    { nxt_string("JSON.parse('1-')"),
-      nxt_string("SyntaxError: Unexpected token at position 1") },
-
-    { nxt_string("JSON.parse('1ee1')"),
-      nxt_string("SyntaxError: Unexpected token at position 1") },
-
-    { nxt_string("JSON.parse('1eg')"),
-      nxt_string("SyntaxError: Unexpected token at position 1") },
-
-    { nxt_string("JSON.parse('0x01')"),
-      nxt_string("SyntaxError: Unexpected token at position 1") },
-
-    { nxt_string("JSON.parse('\"абв')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 4") },
-
-    { nxt_string("JSON.parse('\"\b')"),
-      nxt_string("SyntaxError: Forbidden source char at position 1") },
-
-    { nxt_string("JSON.parse('\"\\\\u')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 3") },
-
-    { nxt_string("JSON.parse('\"\\\\q\"')"),
-      nxt_string("SyntaxError: Unknown escape char at position 2") },
-
-    { nxt_string("JSON.parse('\"\\\\uDC01\"')"),
-      nxt_string("�") },
-
-    { nxt_string("JSON.parse('\"\\\\uD801\\\\uE000\"')"),
-      nxt_string("�") },
-
-    { nxt_string("JSON.parse('\"\\\\uD83D\"')"),
-      nxt_string("�") },
-
-    { nxt_string("JSON.parse('\"\\\\uD800\\\\uDB00\"')"),
-      nxt_string("��") },
-
-    { nxt_string("JSON.parse('\"\\\\ud800[\"')"),
-      nxt_string("�[") },
-
-    { nxt_string("JSON.parse('{')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 1") },
-
-    { nxt_string("JSON.parse('{{')"),
-      nxt_string("SyntaxError: Unexpected token at position 1") },
-
-    { nxt_string("JSON.parse('{[')"),
-      nxt_string("SyntaxError: Unexpected token at position 1") },
-
-    { nxt_string("JSON.parse('{\"a\"')"),
-      nxt_string("SyntaxError: Unexpected token at position 4") },
-
-    { nxt_string("JSON.parse('{\"a\":')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 5") },
-
-    { nxt_string("JSON.parse('{\"a\":{')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 6") },
-
-    { nxt_string("JSON.parse('{\"a\":{}')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 7") },
-
-    { nxt_string("JSON.parse('{\"a\":{}g')"),
-      nxt_string("SyntaxError: Unexpected token at position 7") },
-
-    { nxt_string("JSON.parse('{\"a\":{},')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 8") },
-
-    { nxt_string("JSON.parse('{\"a\":{},}')"),
-      nxt_string("SyntaxError: Trailing comma at position 7") },
-
-    { nxt_string("JSON.parse('{\"a\":{},,')"),
-      nxt_string("SyntaxError: Unexpected token at position 8") },
-
-    { nxt_string("JSON.parse('{\"a\":{},,}')"),
-      nxt_string("SyntaxError: Unexpected token at position 8") },
-
-    { nxt_string("JSON.parse('[')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 1") },
-
-    { nxt_string("JSON.parse('[q')"),
-      nxt_string("SyntaxError: Unexpected token at position 1") },
-
-    { nxt_string("JSON.parse('[\"a')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 3") },
-
-    { nxt_string("JSON.parse('[1 ')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 3") },
-
-    { nxt_string("JSON.parse('[1,]')"),
-      nxt_string("SyntaxError: Trailing comma at position 2") },
-
-    { nxt_string("JSON.parse('[1 , 5 ')"),
-      nxt_string("SyntaxError: Unexpected end of input at position 7") },
-
-    { nxt_string("JSON.parse('{\"a\":'.repeat(32))"),
-      nxt_string("SyntaxError: Nested too deep at position 155") },
-
-    { nxt_string("JSON.parse('['.repeat(32))"),
-      nxt_string("SyntaxError: Nested too deep at position 31") },
-
-    { nxt_string("var o = JSON.parse('{', function(k, v) {return v;});o"),
-      nxt_string("SyntaxError: Unexpected end of input at position 1") },
-
-    { nxt_string("var o = JSON.parse('{\"a\":1}', "
-                 "                   function(k, v) {return v.a.a;}); o"),
-      nxt_string("TypeError: cannot get property \"a\" of undefined") },
-
-    /* JSON.stringify() */
-
-    { nxt_string("JSON.stringify()"),
-      nxt_string("undefined") },
-
-    { nxt_string("JSON.stringify('')"),
-      nxt_string("\"\"") },
-
-    { nxt_string("JSON.stringify('abc')"),
-      nxt_string("\"abc\"") },
-
-    { nxt_string("JSON.stringify(new String('abc'))"),
-      nxt_string("\"abc\"") },
-
-    { nxt_string("JSON.stringify(123)"),
-      nxt_string("123") },
-
-    { nxt_string("JSON.stringify(-0)"),
-      nxt_string("0") },
-
-    { nxt_string("JSON.stringify(0.00000123)"),
-      nxt_string("0.00000123") },
-
-    { nxt_string("JSON.stringify(new Number(123))"),
-      nxt_string("123") },
-
-    { nxt_string("JSON.stringify(true)"),
-      nxt_string("true") },
-
-    { nxt_string("JSON.stringify(false)"),
-      nxt_string("false") },
-
-    { nxt_string("JSON.stringify(new Boolean(1))"),
-      nxt_string("true") },
-
-    { nxt_string("JSON.stringify(new Boolean(0))"),
-      nxt_string("false") },
-
-    { nxt_string("JSON.stringify(null)"),
-      nxt_string("null") },
-
-    { nxt_string("JSON.stringify(undefined)"),
-      nxt_string("undefined") },
-
-    { nxt_string("JSON.stringify({})"),
-      nxt_string("{}") },
-
-    { nxt_string("JSON.stringify([])"),
-      nxt_string("[]") },
-
-    { nxt_string("var a = [1]; a[2] = 'x'; JSON.stringify(a)"),
-      nxt_string("[1,null,\"x\"]") },
-
-    { nxt_string("JSON.stringify({a:\"b\",c:19,e:null,t:true,f:false})"),
-      nxt_string("{\"a\":\"b\",\"c\":19,\"e\":null,\"t\":true,\"f\":false}") },
-
-    { nxt_string("JSON.stringify({a:1, b:undefined})"),
-      nxt_string("{\"a\":1}") },
-
-    { nxt_string("var o = {a:1, c:2};"
-                 "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
-                 "JSON.stringify(o)"),
-      nxt_string("{\"a\":1,\"c\":2}") },
-
-    { nxt_string("JSON.stringify({a:{}, b:[function(v){}]})"),
-      nxt_string("{\"a\":{},\"b\":[null]}") },
-
-    { nxt_string("JSON.stringify(RegExp())"),
-      nxt_string("{}") },
-
-    { nxt_string("JSON.stringify(SyntaxError('e'))"),
-      nxt_string("{}") },
-
-    { nxt_string("JSON.stringify(URIError('e'))"),
-      nxt_string("{}") },
-
-    { nxt_string("var e = URIError('e'); e.name = 'E'; JSON.stringify(e)"),
-      nxt_string("{\"name\":\"E\"}") },
-
-    { nxt_string("var e = URIError('e'); e.message = 'E'; JSON.stringify(e)"),
-      nxt_string("{}") },
-
-    { nxt_string("var e = URIError('e'); e.foo = 'E'; JSON.stringify(e)"),
-      nxt_string("{\"foo\":\"E\"}") },
-
-    { nxt_string("JSON.stringify([$r])"),
-      nxt_string("[null]") },
-
-    /* Ignoring named properties of an array. */
-
-    { nxt_string("var a = [1,2]; a.a = 1;"
-                 "JSON.stringify(a)"),
-      nxt_string("[1,2]") },
-
-    { nxt_string("JSON.stringify({a:{b:{c:{d:1}, e:function(v){}}}})"),
-      nxt_string("{\"a\":{\"b\":{\"c\":{\"d\":1}}}}") },
-
-    { nxt_string("JSON.stringify([[\"b\",undefined],1,[5],{a:1}])"),
-      nxt_string("[[\"b\",null],1,[5],{\"a\":1}]") },
-
-    { nxt_string("var json = '{\"a\":{\"b\":{\"c\":{\"d\":1},\"e\":[true]}}}';"
-                 "json == JSON.stringify(JSON.parse(json))"),
-      nxt_string("true") },
-
-    { nxt_string("var json = '{\"a\":\"абв\",\"b\":\"α\"}';"
-                 "json == JSON.stringify(JSON.parse(json))"),
-      nxt_string("true") },
-
-    /* Multibyte characters: z - 1 byte, α - 2 bytes, 𐐀 - 4 bytes */
-
-    { nxt_string("JSON.stringify('α𐐀z'.repeat(10))"),
-      nxt_string("\"α𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀z\"") },
-
-    { nxt_string("JSON.stringify('α𐐀z'.repeat(10)).length"),
-      nxt_string("32") },
-
-    { nxt_string("JSON.stringify('α'.repeat(33))[32]"),
-      nxt_string("α") },
-
-    { nxt_string("JSON.stringify('a\\nbc')"),
-      nxt_string("\"a\\nbc\"") },
-
-    { nxt_string("JSON.stringify('а\tбв')"),
-      nxt_string("\"а\\tбв\"") },
-
-    { nxt_string("JSON.stringify('\\n\\t\\r\\\"\\f\\b')"),
-      nxt_string("\"\\n\\t\\r\\\"\\f\\b\"") },
-
-    { nxt_string("JSON.stringify('\x00\x01\x02\x1f')"),
-      nxt_string("\"\\u0000\\u0001\\u0002\\u001F\"") },
-
-    { nxt_string("JSON.stringify('abc\x00')"),
-      nxt_string("\"abc\\u0000\"") },
-
-    { nxt_string("JSON.stringify('\x00zz')"),
-      nxt_string("\"\\u0000zz\"") },
-
-    { nxt_string("JSON.stringify('\x00')"),
-      nxt_string("\"\\u0000\"") },
-
-    { nxt_string("JSON.stringify('a\x00z')"),
-      nxt_string("\"a\\u0000z\"") },
-
-    { nxt_string("JSON.stringify('\x00z\x00')"),
-      nxt_string("\"\\u0000z\\u0000\"") },
-
-    { nxt_string("var i, s, r = true;"
-                 " for (i = 0; i < 128; i++) {"
-                 "  s = 'α𐐀z'.repeat(i);"
-                 "  r &= (JSON.stringify(s) == ('\"' + s + '\"'));"
-                 "}; r"),
-      nxt_string("1") },
-
-    { nxt_string("JSON.stringify('\\u0000'.repeat(10)) == ('\"' + '\\\\u0000'.repeat(10) + '\"')"),
-      nxt_string("true") },
-
-    { nxt_string("JSON.stringify('abc'.repeat(100)).length"),
-      nxt_string("302") },
-
-    { nxt_string("JSON.stringify('абв'.repeat(100)).length"),
-      nxt_string("302") },
-
-    /* Byte strings. */
-
-    { nxt_string("JSON.stringify('\\u00CE\\u00B1\\u00C2\\u00B6'.toBytes())"),
-      nxt_string("\"α¶\"") },
-
-    { nxt_string("JSON.stringify('µ§±®'.toBytes())"),
-      nxt_string("\"\xB5\xA7\xB1\xAE\"") },
-
-    /* Optional arguments. */
-
-    { nxt_string("JSON.stringify(undefined, undefined, 1)"),
-      nxt_string("undefined") },
-
-    { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, 0)"),
-      nxt_string("[{\"a\":1,\"b\":{\"c\":2}},1]") },
-
-    { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, 1)"),
-      nxt_string("[\n {\n  \"a\": 1,\n  \"b\": {\n   \"c\": 2\n  }\n },\n 1\n]") },
-
-    { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, ' ')"),
-      nxt_string("[\n {\n  \"a\": 1,\n  \"b\": {\n   \"c\": 2\n  }\n },\n 1\n]") },
-
-    { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, '#')"),
-      nxt_string("[\n#{\n##\"a\": 1,\n##\"b\": {\n###\"c\": 2\n##}\n#},\n#1\n]") },
-
-    { nxt_string("JSON.stringify([1], undefined, 'AAAAABBBBBC')"),
-      nxt_string("[\nAAAAABBBBB1\n]") },
-
-    { nxt_string("JSON.stringify([1], undefined, 11)"),
-      nxt_string("[\n          1\n]") },
-
-    { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, -1)"),
-      nxt_string("[{\"a\":1,\"b\":{\"c\":2}},1]") },
-
-    { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, new Date())"),
-      nxt_string("[{\"a\":1,\"b\":{\"c\":2}},1]") },
-
-    { nxt_string("JSON.stringify({toJSON:function(k){}})"),
-      nxt_string("undefined") },
-
-    { nxt_string("JSON.stringify({toJSON:function(k){return k}})"),
-      nxt_string("\"\"") },
-
-    { nxt_string("JSON.stringify(new Date(1308895323625))"),
-      nxt_string("\"2011-06-24T06:02:03.625Z\"") },
-
-    { nxt_string("JSON.stringify({a:new Date(1308895323625)})"),
-      nxt_string("{\"a\":\"2011-06-24T06:02:03.625Z\"}") },
-
-    { nxt_string("JSON.stringify({b:{toJSON:function(k){return undefined}}})"),
-      nxt_string("{}") },
-
-    { nxt_string("JSON.stringify({b:{toJSON:function(k){}},c:1})"),
-      nxt_string("{\"c\":1}") },
-
-    { nxt_string("JSON.stringify({b:{toJSON:function(k){return k}}})"),
-      nxt_string("{\"b\":\"b\"}") },
-
-    { nxt_string("JSON.stringify({a:1,b:new Date(1308895323625),c:2})"),
-      nxt_string("{\"a\":1,\"b\":\"2011-06-24T06:02:03.625Z\",\"c\":2}") },
-
-    { nxt_string("JSON.stringify({a:{b:new Date(1308895323625)}})"),
-      nxt_string("{\"a\":{\"b\":\"2011-06-24T06:02:03.625Z\"}}") },
-
-    { nxt_string("function key(k){return k}; function und(k){}"
-                 "JSON.stringify([{toJSON:key},{toJSON:und},{toJSON:key}])"),
-      nxt_string("[\"0\",null,\"2\"]") },
-
-    { nxt_string("JSON.stringify({b:{a:1,c:[2]}}, function(k,v){return v})"),
-      nxt_string("{\"b\":{\"a\":1,\"c\":[2]}}") },
-
-    { nxt_string("JSON.stringify([{a:1}, 2], function(k,v){return v})"),
-      nxt_string("[{\"a\":1},2]") },
-
-    { nxt_string("JSON.stringify({a:{toJSON:function(k){}}}, function(k,v){return v})"),
-      nxt_string("{}") },
-
-    { nxt_string("JSON.stringify({a:{toJSON:function(k){return 1}}}, function(k,v){return v})"),
-      nxt_string("{\"a\":1}") },
-
-    { nxt_string("JSON.stringify([{toJSON:function(k){}}], function(k,v){return v})"),
-      nxt_string("[null]") },
-
-    { nxt_string("JSON.stringify([{toJSON:function(k){return 1}}], function(k,v){return v})"),
-      nxt_string("[1]") },
-
-    { nxt_string("JSON.stringify({a:new Date(1308895323625)}, function(k,v){return v})"),
-      nxt_string("{\"a\":\"2011-06-24T06:02:03.625Z\"}") },
-
-    { nxt_string("JSON.stringify([new Date(1308895323625)], function(k,v){return v})"),
-      nxt_string("[\"2011-06-24T06:02:03.625Z\"]") },
-
-    { nxt_string("JSON.stringify([new Date(1308895323625)], "
-                 "  function(k,v){return (typeof v === 'string') ? v.toLowerCase() : v})"),
-      nxt_string("[\"2011-06-24t06:02:03.625z\"]") },
-
-    { nxt_string("JSON.stringify([new Date(1308895323625)], "
-                 "  function(k,v){return (typeof v === 'string') ? v.toLowerCase() : v}, '#')"),
-      nxt_string("[\n#\"2011-06-24t06:02:03.625z\"\n]") },
-
-    { nxt_string("JSON.stringify({a:new Date(1308895323625),b:1,c:'a'}, "
-                 "  function(k,v){return (typeof v === 'string') ? undefined : v})"),
-      nxt_string("{\"b\":1}") },
-
-    { nxt_string("JSON.stringify({a:new Date(1308895323625),b:1,c:'a'}, "
-                 "  function(k,v){return (typeof v === 'string') ? undefined : v}, '#')"),
-      nxt_string("{\n#\"b\": 1\n}") },
-
-    { nxt_string("JSON.stringify([new Date(1308895323625),1,'a'], "
-                 "  function(k,v){return (typeof v === 'string') ? undefined : v})"),
-      nxt_string("[null,1,null]") },
-
-    { nxt_string("var keys = []; var o = JSON.stringify({a:2, b:{c:1}},"
-                 "   function(k, v) {keys.push(k); return v;});"
-                 "keys"),
-      nxt_string(",a,b,c") },
-
-    { nxt_string("JSON.stringify(['a', 'b', 'c'], "
-                 "    function(i, v) { if (i === '0') {return undefined} "
-                 "                     else if (i == 1) {return 2} "
-                 "                     else {return v}})"),
-      nxt_string("[null,2,\"c\"]") },
-
-    { nxt_string("JSON.stringify({a:2, b:{c:1}},"
-                 "               function(k, v) {delete this['b']; return v;})"),
-      nxt_string("{\"a\":2}") },
-
-    { nxt_string("JSON.stringify(JSON.parse('{\"a\":1,\"b\":2}', "
-                 "          function(k, v) {delete this['b']; return v;}))"),
-      nxt_string("{\"a\":1}") },
-
-    { nxt_string("var keys = []; var o = JSON.stringify([[1,2],{a:3}, 4],"
-                 "   function(k, v) {keys.push(k); return v;});"
-                 "keys"),
-      nxt_string(",0,0,1,1,a,2") },
-
-    { nxt_string("JSON.stringify({b:{a:1,c:[2]}}, ['a', undefined, 'b', {}, 'a'])"),
-      nxt_string("{\"b\":{\"a\":1}}") },
-
-    { nxt_string("JSON.stringify({b:{a:1,c:[2]}}, [new String('a'), new String('b')])"),
-      nxt_string("{\"b\":{\"a\":1}}") },
-
-    { nxt_string("JSON.stringify({'1':1,'2':2,'3':3}, [1, new Number(2)])"),
-      nxt_string("{\"1\":1,\"2\":2}") },
-
-    { nxt_string("var objs = []; var o = JSON.stringify({a:1},"
-                 "   function(k, v) {objs.push(this); return v});"
-                 "JSON.stringify(objs)"),
-      nxt_string("[{\"\":{\"a\":1}},{\"a\":1}]") },
-
-    { nxt_string("var a = []; a[0] = a; JSON.stringify(a)"),
-      nxt_string("TypeError: Nested too deep or a cyclic structure") },
-
-    { nxt_string("var a = {}; a.a = a; JSON.stringify(a)"),
-      nxt_string("TypeError: Nested too deep or a cyclic structure") },
-
-    /* njs.dump(). */
-
-    { nxt_string("njs.dump({a:1, b:[1,,2,{c:new Boolean(1)}]})"),
-      nxt_string("{a:1,b:[1,<empty>,2,{c:[Boolean: true]}]}") },
-
-    { nxt_string("njs.dump(Array.prototype.slice.call({'1':'b', length:2}))"),
-      nxt_string("[<empty>,'b']") },
-
-    { nxt_string("njs.dump($r.props)"),
-      nxt_string("{a:{type:\"property\",props:[\"getter\"]},b:{type:\"property\",props:[\"getter\"]}}") },
-
-    { nxt_string("njs.dump($r.header)"),
-      nxt_string("{type:\"object\",props:[\"getter\",\"foreach\",\"next\"]}") },
-
-    { nxt_string("njs.dump(njs) == `{version:'${njs.version}'}`"),
-      nxt_string("true") },
-
-    { nxt_string("njs.dump(-0)"),
-      nxt_string("-0") },
-
-    { nxt_string("njs.dump(Object(-0))"),
-      nxt_string("[Number: -0]") },
-
-    { nxt_string("njs.dump([0, -0])"),
-      nxt_string("[0,-0]") },
-
-    /* Built-in methods name. */
-
-    { nxt_string(
-        "var fail;"
-        "function isMethodsHaveName(o) {"
-        "    var except = ["
-        "        'prototype',"
-        "        'constructor',"
-        "    ];"
-        "    return Object.getOwnPropertyNames(o)"
-        "                 .filter(v => !except.includes(v)"
-        "                              && typeof o[v] == 'function')"
-        "                 .every(v => o[v].name == v"
-        "                             || !(fail = `${o.name}.${v}: ${o[v].name}`));"
-        "}"
-        "["
-        "    Boolean, Boolean.prototype,"
-        "    Number, Number.prototype,"
-        "    String, String.prototype,"
-        "    Object, Object.prototype,"
-        "    Array, Array.prototype,"
-        "    Function, Function.prototype,"
-        "    RegExp, RegExp.prototype,"
-        "    Date, Date.prototype,"
-        "    Error, Error.prototype,"
-        "    Math,"
-        "    JSON,"
-        "].every(obj => isMethodsHaveName(obj)) || fail"),
-
-      nxt_string("true") },
-
-    /* require(). */
-
-    { nxt_string("require('unknown_module')"),
-      nxt_string("Error: Cannot find module \"unknown_module\"") },
-
-    { nxt_string("require()"),
-      nxt_string("TypeError: missing path") },
-
-    { nxt_string("var fs = require('fs'); typeof fs"),
-      nxt_string("object") },
-
-    /* require('fs').readFile() */
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFile()"),
-      nxt_string("TypeError: too few arguments") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFile('/njs_unknown_path')"),
-      nxt_string("TypeError: too few arguments") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFile('/njs_unknown_path', {flag:'xx'})"),
-      nxt_string("TypeError: callback must be a function") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFile('/njs_unknown_path', {flag:'xx'}, 1)"),
-      nxt_string("TypeError: callback must be a function") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFile('/njs_unknown_path', {flag:'xx'}, function () {})"),
-      nxt_string("TypeError: Unknown file open flags: \"xx\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFile('/njs_unknown_path', {encoding:'ascii'}, function () {})"),
-      nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFile('/njs_unknown_path', 'ascii', function () {})"),
-      nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
-    /* require('fs').readFileSync() */
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFileSync()"),
-      nxt_string("TypeError: too few arguments") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFileSync({})"),
-      nxt_string("TypeError: path must be a string") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFileSync('/njs_unknown_path', {flag:'xx'})"),
-      nxt_string("TypeError: Unknown file open flags: \"xx\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFileSync('/njs_unknown_path', {encoding:'ascii'})"),
-      nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFileSync('/njs_unknown_path', 'ascii')"),
-      nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.readFileSync('/njs_unknown_path', true)"),
-      nxt_string("TypeError: Unknown options type (a string or object required)") },
-
-
-    /* require('fs').writeFile() */
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFile()"),
-      nxt_string("TypeError: too few arguments") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFile('/njs_unknown_path')"),
-      nxt_string("TypeError: too few arguments") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFile('/njs_unknown_path', '')"),
-      nxt_string("TypeError: too few arguments") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFile({}, '', function () {})"),
-      nxt_string("TypeError: path must be a string") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFile('/njs_unknown_path', '', 'utf8')"),
-      nxt_string("TypeError: callback must be a function") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFile('/njs_unknown_path', '', {flag:'xx'}, function () {})"),
-      nxt_string("TypeError: Unknown file open flags: \"xx\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFile('/njs_unknown_path', '', {encoding:'ascii'}, function () {})"),
-      nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFile('/njs_unknown_path', '', 'ascii', function () {})"),
-      nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFile('/njs_unknown_path', '', true, function () {})"),
-      nxt_string("TypeError: Unknown options type (a string or object required)") },
-
-    /* require('fs').writeFileSync() */
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFileSync()"),
-      nxt_string("TypeError: too few arguments") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFileSync('/njs_unknown_path')"),
-      nxt_string("TypeError: too few arguments") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFileSync({}, '')"),
-      nxt_string("TypeError: path must be a string") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFileSync('/njs_unknown_path', '', {flag:'xx'})"),
-      nxt_string("TypeError: Unknown file open flags: \"xx\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFileSync('/njs_unknown_path', '', {encoding:'ascii'})"),
-      nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFileSync('/njs_unknown_path', '', 'ascii')"),
-      nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
-    { nxt_string("var fs = require('fs');"
-                 "fs.writeFileSync('/njs_unknown_path', '', true)"),
-      nxt_string("TypeError: Unknown options type (a string or object required)") },
-
-    /* require('crypto').createHash() */
-
-    { nxt_string("require('crypto').createHash('sha1')"),
-      nxt_string("[object Hash]") },
-
-    { nxt_string("Object.prototype.toString.call(require('crypto').createHash('sha1'))"),
-      nxt_string("[object Object]") },
-
-    { nxt_string("var h = require('crypto').createHash('md5');"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("b86fc6b051f63d73de262d4c34e3a0a9") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update('A').update('B').digest('hex')"),
-      nxt_string("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update('AB').digest().toString('hex')"),
-      nxt_string("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update('AB').digest('base64')"),
-      nxt_string("BtlFlCqiamG+GMPiK/GbvKjdK10=") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update('AB').digest('base64url')"),
-      nxt_string("BtlFlCqiamG-GMPiK_GbvKjdK10") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update('AB').digest().toString('base64')"),
-      nxt_string("BtlFlCqiamG+GMPiK/GbvKjdK10=") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update('abc'.repeat(100)).digest('hex')"),
-      nxt_string("c95466320eaae6d19ee314ae4f135b12d45ced9a") },
-
-    { nxt_string("var h = require('crypto').createHash('sha256');"
-                 "h.update('A').update('B').digest('hex')"),
-      nxt_string("38164fbd17603d73f696b8b4d72664d735bb6a7c88577687fd2ae33fd6964153") },
-
-    { nxt_string("var h = require('crypto').createHash('sha256');"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("38164fbd17603d73f696b8b4d72664d735bb6a7c88577687fd2ae33fd6964153") },
-
-    { nxt_string("var h = require('crypto').createHash('sha256');"
-                 "h.update('abc'.repeat(100)).digest('hex')"),
-      nxt_string("d9f5aeb06abebb3be3f38adec9a2e3b94228d52193be923eb4e24c9b56ee0930") },
-
-    { nxt_string("var h = require('crypto').createHash()"),
-      nxt_string("TypeError: algorithm must be a string") },
-
-    { nxt_string("var h = require('crypto').createHash([])"),
-      nxt_string("TypeError: algorithm must be a string") },
-
-    { nxt_string("var h = require('crypto').createHash('sha512')"),
-      nxt_string("TypeError: not supported algorithm: \"sha512\"") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update()"),
-      nxt_string("TypeError: data must be a string") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update({})"),
-      nxt_string("TypeError: data must be a string") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update('A').digest('latin1')"),
-      nxt_string("TypeError: Unknown digest encoding: \"latin1\"") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update('A').digest('hex'); h.digest('hex')"),
-      nxt_string("Error: Digest already called") },
-
-    { nxt_string("var h = require('crypto').createHash('sha1');"
-                 "h.update('A').digest('hex'); h.update('B')"),
-      nxt_string("Error: Digest already called") },
-
-    { nxt_string("typeof require('crypto').createHash('md5')"),
-      nxt_string("object") },
-
-    /* require('crypto').createHmac() */
-
-    { nxt_string("require('crypto').createHmac('sha1', '')"),
-      nxt_string("[object Hmac]") },
-
-    { nxt_string("var h = require('crypto').createHmac('md5', '');"
-                 "h.digest('hex')"),
-      nxt_string("74e6f7298a9c2d168935f58c001bad88") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', '');"
-                 "h.digest('hex')"),
-      nxt_string("fbdb1d1b18aa6c08324b7d64b71fb76370690e1d") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', '');"
-                 "h.digest().toString('hex')"),
-      nxt_string("fbdb1d1b18aa6c08324b7d64b71fb76370690e1d") },
-
-    { nxt_string("var h = require('crypto').createHmac('md5', 'secret key');"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("9c72728915eb26620a5caeafd0063b29") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
-                 "h.update('A').update('B').digest('hex')"),
-      nxt_string("adc60e03459c4bae7cf4eb6d9730003e9490b22f") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("adc60e03459c4bae7cf4eb6d9730003e9490b22f") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
-                 "h.update('AB').digest('base64')"),
-      nxt_string("rcYOA0WcS6589OttlzAAPpSQsi8=") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
-                 "h.update('AB').digest('base64url')"),
-      nxt_string("rcYOA0WcS6589OttlzAAPpSQsi8") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
-                 "h.update('AB').digest().toString('base64')"),
-      nxt_string("rcYOA0WcS6589OttlzAAPpSQsi8=") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
-                 "h.update('abc'.repeat(100)).digest('hex')"),
-      nxt_string("b105ad6921e4c54d3fa0a9ec3f7f0ee9bd2c659d") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'A'.repeat(40));"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("0b84f78ca5275d76d4b7dafb5845ee2b6a79c4c2") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'A'.repeat(64));"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("400ce530816c6b3247e2959f3982a12aaf58c0c9") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'A'.repeat(100));"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("670e7cdebae6392797e000e79e51d3b6589d8fad") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha256', '');"
-                 "h.digest('hex')"),
-      nxt_string("b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha256', 'secret key');"
-                 "h.update('A').update('B').digest('hex')"),
-      nxt_string("46085184b3b45a13d838bf71a0ce03675dab30931e0f1f68fa636ea65fdb286d") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha256', 'secret key');"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("46085184b3b45a13d838bf71a0ce03675dab30931e0f1f68fa636ea65fdb286d") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha256', 'A'.repeat(64));"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("ee9dce43b12eb3e865614ad9c1a8d4fad4b6eac2b64647bd24cd192888d3f367") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha256', 'A'.repeat(100));"
-                 "h.update('AB').digest('hex')"),
-      nxt_string("5647b6c429701ff512f0f18232b4507065d2376ca8899a816a0a6e721bf8ddcc") },
-
-    { nxt_string("var h = require('crypto').createHmac('md5', 'secret key');"
-                 "h.update('abc'.repeat(100)).digest('hex')"),
-      nxt_string("5dd706af43536f8c9c83e7ea55b1a5a2") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
-                 "h.update('abc'.repeat(100)).digest('hex')"),
-      nxt_string("b105ad6921e4c54d3fa0a9ec3f7f0ee9bd2c659d") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha256', 'secret key');"
-                 "h.update('abc'.repeat(100)).digest('hex')"),
-      nxt_string("f6550d398ce350ee8d94a0f44f2cf6b9bc8d316ae4625fb4434f22980a276bac") },
-
-    { nxt_string("var h = require('crypto').createHmac()"),
-      nxt_string("TypeError: algorithm must be a string") },
-
-    { nxt_string("var h = require('crypto').createHmac([])"),
-      nxt_string("TypeError: algorithm must be a string") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha512', '')"),
-      nxt_string("TypeError: not supported algorithm: \"sha512\"") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', [])"),
-      nxt_string("TypeError: key must be a string") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
-                 "h.update('A').digest('hex'); h.digest('hex')"),
-      nxt_string("Error: Digest already called") },
-
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
-                 "h.update('A').digest('hex'); h.update('B')"),
-      nxt_string("Error: Digest already called") },
-
-    { nxt_string("typeof require('crypto').createHmac('md5', 'a')"),
-      nxt_string("object") },
-
-    /* setTimeout(). */
-
-    { nxt_string("setTimeout()"),
-      nxt_string("TypeError: too few arguments") },
-
-    { nxt_string("setTimeout(function(){})"),
-      nxt_string("InternalError: not supported by host environment") },
-
-    { nxt_string("setTimeout(function(){}, 12)"),
-      nxt_string("InternalError: not supported by host environment") },
-
-    /* clearTimeout(). */
-
-    { nxt_string("clearTimeout()"),
-      nxt_string("undefined") },
-
-    { nxt_string("clearTimeout(123)"),
-      nxt_string("undefined") },
-
-    /* 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("undefined") },
-
-    /* es5id: 8.2_A2 */
-
-    { nxt_string("var null;"),
-      nxt_string("SyntaxError: Unexpected token \"null\" in 1") },
-
-    /* es5id: 8.2_A3 */
-
-    { nxt_string("typeof(null) === \"object\""),
-      nxt_string("true") },
-
-    /* Module. */
-
-    { nxt_string("import;"),
-      nxt_string("SyntaxError: Non-default import is not supported in 1") },
-
-    { nxt_string("import {x} from y"),
-      nxt_string("SyntaxError: Non-default import is not supported in 1") },
-
-    { nxt_string("import x from y"),
-      nxt_string("SyntaxError: Unexpected token \"y\" in 1") },
-
-    { nxt_string("import x from {"),
-      nxt_string("SyntaxError: Unexpected token \"{\" in 1") },
-
-    { nxt_string("import x from ''"),
-      nxt_string("SyntaxError: Cannot find module \"\" in 1") },
-
-    { nxt_string("import x from 'crypto'"),
-      nxt_string("undefined") },
-
-    { nxt_string("import x from 'crypto' 1"),
-      nxt_string("SyntaxError: Unexpected token \"1\" in 1") },
-
-    { nxt_string("if (1) {import x from 'crypto'}"),
-      nxt_string("SyntaxError: Illegal import statement in 1") },
-
-    { nxt_string("export"),
-      nxt_string("SyntaxError: Illegal export statement in 1") },
-
-};
-
-
-static njs_unit_test_t  njs_module_test[] =
-{
-    { nxt_string("function f(){return 2}; var f; f()"),
-      nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
-    { nxt_string("function f(){return 2}; var f = 1; f()"),
-      nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
-    { nxt_string("function f(){return 1}; function f(){return 2}; f()"),
-      nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
-    { nxt_string("var f = 1; function f() {};"),
-      nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
-    { nxt_string("{ var f = 1; } function f() {};"),
-      nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-};
-
-
-static njs_unit_test_t  njs_tz_test[] =
-{
-     { nxt_string("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
-       nxt_string("Thu Jan 01 1970 12:45:00 GMT+1245") },
-
-     { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getTime()"),
-       nxt_string("1308895200000") },
-
-     { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.valueOf()"),
-       nxt_string("1308895200000") },
-
-     { nxt_string("var d = new Date(2011, 5, 24, 18, 45);"
-                  "d.toString().slice(0, 33)"),
-       nxt_string("Fri Jun 24 2011 18:45:00 GMT+1245") },
-
-     { nxt_string("var d = new Date(2011, 5, 24, 18, 45);"
-                  "d.toTimeString().slice(0, 17)"),
-       nxt_string("18:45:00 GMT+1245") },
-
-     { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.toUTCString()"),
-       nxt_string("Fri Jun 24 2011 06:00:00 GMT") },
-
-     { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
-                  "d.toISOString()"),
-       nxt_string("2011-06-24T06:00:12.625Z") },
-
-     { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCHours()"),
-       nxt_string("6") },
-
-     { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMinutes()"),
-       nxt_string("0") },
-
-     { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
-                  "d.getTimezoneOffset()"),
-       nxt_string("-765") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setMinutes(3, 2, 5003);"
-                  "d.getTime()"),
-       nxt_string("1308892687003") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setMinutes(3, 2);"
-                  "d.getTime()"),
-       nxt_string("1308892682625") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setMinutes(3);"
-                  "d.getTime()"),
-       nxt_string("1308892683625") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3, 2, 5003);"
-                  "d.getTime()"),
-       nxt_string("1308899887003") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3, 2);"
-                  "d.getTime()"),
-       nxt_string("1308899882625") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3);"
-                  "d.getTime()"),
-       nxt_string("1308899883625") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setHours(20);"
-                  "d.getTime()"),
-       nxt_string("1308902523625") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setMonth(2, 10);"
-                  "d.getTime()"),
-       nxt_string("1299733323625") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setMonth(2);"
-                  "d.getTime()"),
-       nxt_string("1300942923625") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setFullYear(2010, 2, 10);"
-                  "d.getTime()"),
-       nxt_string("1268197323625") },
-
-     { nxt_string("var d = new Date(1308895323625); d.setFullYear(2010, 2);"
-                  "d.getTime()"),
-       nxt_string("1269406923625") },
-
-     { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
-                  "d.toJSON(1)"),
-       nxt_string("2011-06-24T06:00:12.625Z") },
-};
-
-
-static njs_unit_test_t  njs_regexp_test[] =
-{
-    { nxt_string("/[\\\\u02E0-\\\\u02E4]/"),
-      nxt_string("/[\\\\u02E0-\\\\u02E4]/") },
-
-    { nxt_string("/[\\u02E0-\\u02E4]/"),
-      nxt_string("/[\\u02E0-\\u02E4]/") },
-
-    { nxt_string("RegExp('[\\\\u02E0-\\\\u02E4]')"),
-      nxt_string("/[\\u02E0-\\u02E4]/") },
-
-    { nxt_string("/[\\u0430-\\u044f]+/.test('тест')"),
-      nxt_string("true") },
-
-    { nxt_string("RegExp('[\\\\u0430-\\\\u044f]+').test('тест')"),
-      nxt_string("true") },
-
-    { nxt_string("RegExp('[\\\\u0430-\\\\u044f]+').exec('тест')[0]"),
-      nxt_string("тест") },
-
-    { nxt_string("/[\\uFDE0-\\uFFFD]/g; export default 1"),
-      nxt_string("SyntaxError: Illegal export statement in 1") },
-
-    { nxt_string("RegExp(RegExp('\x00]]')).test('\x00]]')"),
-      nxt_string("true") },
-
-    { nxt_string("RegExp('\0').test('\0')"),
-      nxt_string("true") },
-
-    { nxt_string("RegExp('\x00').test('\0')"),
-      nxt_string("true") },
-
-    { nxt_string("RegExp('\x00\\\\x00').source"),
-      nxt_string("\\u0000\\x00") },
-
-    { nxt_string("/\\\0/"),
-      nxt_string("/\\\\u0000/") },
-
-    { nxt_string("RegExp('\\\\\\0').source"),
-      nxt_string("\\\\u0000") },
-
-    { nxt_string("RegExp('[\0]').test('\0')"),
-      nxt_string("true") },
-};
-
-
-typedef struct {
-    nxt_lvlhsh_t          hash;
-    const njs_extern_t    *proto;
-    nxt_mp_t              *pool;
-
-    uint32_t              a;
-    nxt_str_t             uri;
-
-    njs_opaque_value_t    value;
-} njs_unit_test_req_t;
-
-
-typedef struct {
-    njs_value_t           name;
-    njs_value_t           value;
-} njs_unit_test_prop_t;
-
-
-static nxt_int_t
-lvlhsh_unit_test_key_test(nxt_lvlhsh_query_t *lhq, void *data)
-{
-    nxt_str_t             name;
-    njs_unit_test_prop_t  *prop;
-
-    prop = data;
-    njs_string_get(&prop->name, &name);
-
-    if (name.length != lhq->key.length) {
-        return NXT_DECLINED;
-    }
-
-    if (memcmp(name.start, lhq->key.start, lhq->key.length) == 0) {
-        return NXT_OK;
-    }
-
-    return NXT_DECLINED;
-}
-
-
-static void *
-lvlhsh_unit_test_pool_alloc(void *pool, size_t size)
-{
-    return nxt_mp_align(pool, size, size);
-}
-
-
-static void
-lvlhsh_unit_test_pool_free(void *pool, void *p, size_t size)
-{
-    nxt_mp_free(pool, p);
-}
-
-
-static const nxt_lvlhsh_proto_t  lvlhsh_proto  nxt_aligned(64) = {
-    NXT_LVLHSH_LARGE_SLAB,
-    lvlhsh_unit_test_key_test,
-    lvlhsh_unit_test_pool_alloc,
-    lvlhsh_unit_test_pool_free,
-};
-
-
-static njs_unit_test_prop_t *
-lvlhsh_unit_test_alloc(nxt_mp_t *pool, const njs_value_t *name,
-    const njs_value_t *value)
-{
-    njs_unit_test_prop_t *prop;
-
-    prop = nxt_mp_alloc(pool, sizeof(njs_unit_test_prop_t));
-    if (prop == NULL) {
-        return NULL;
-    }
-
-    prop->name = *name;
-    prop->value = *value;
-
-    return prop;
-}
-
-
-static nxt_int_t
-lvlhsh_unit_test_add(njs_unit_test_req_t *r, njs_unit_test_prop_t *prop)
-{
-    nxt_lvlhsh_query_t  lhq;
-
-    njs_string_get(&prop->name, &lhq.key);
-    lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
-
-    lhq.replace = 1;
-    lhq.value = (void *) prop;
-    lhq.proto = &lvlhsh_proto;
-    lhq.pool = r->pool;
-
-    switch (nxt_lvlhsh_insert(&r->hash, &lhq)) {
-
-    case NXT_OK:
-        return NXT_OK;
-
-    case NXT_DECLINED:
-    default:
-        return NXT_ERROR;
-    }
-}
-
-
-static njs_ret_t
-njs_unit_test_r_get_uri_external(njs_vm_t *vm, njs_value_t *value, void *obj,
-    uintptr_t data)
-{
-    char *p = obj;
-
-    nxt_str_t  *field;
-
-    field = (nxt_str_t *) (p + data);
-
-    return njs_vm_value_string_set(vm, value, field->start, field->length);
-}
-
-
-static njs_ret_t
-njs_unit_test_r_set_uri_external(njs_vm_t *vm, void *obj, uintptr_t data,
-    nxt_str_t *value)
-{
-    char *p = obj;
-
-    nxt_str_t  *field;
-
-    field = (nxt_str_t *) (p + data);
-
-    *field = *value;
-
-    return NXT_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_r_get_a_external(njs_vm_t *vm, njs_value_t *value, void *obj,
-    uintptr_t data)
-{
-    u_char               buf[16], *p;
-    njs_unit_test_req_t  *r;
-
-    r = (njs_unit_test_req_t *) obj;
-
-    p = nxt_sprintf(buf, buf + nxt_length(buf), "%uD", r->a);
-
-    return njs_vm_value_string_set(vm, value, buf, p - buf);
-}
-
-
-static njs_ret_t
-njs_unit_test_r_get_b_external(njs_vm_t *vm, njs_value_t *value, void *obj,
-    uintptr_t data)
-{
-    njs_value_number_set(value, data);
-
-    return NJS_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_host_external(njs_vm_t *vm, njs_value_t *value, void *obj,
-    uintptr_t data)
-{
-    return njs_vm_value_string_set(vm, value, (u_char *) "АБВГДЕЁЖЗИЙ", 22);
-}
-
-
-static njs_ret_t
-njs_unit_test_r_get_vars(njs_vm_t *vm, njs_value_t *value, void *obj,
-    uintptr_t data)
-{
-    nxt_int_t             ret;
-    nxt_str_t             *key;
-    nxt_lvlhsh_query_t    lhq;
-    njs_unit_test_req_t   *r;
-    njs_unit_test_prop_t  *prop;
-
-    r = (njs_unit_test_req_t *) obj;
-    key = (nxt_str_t *) data;
-
-    lhq.key = *key;
-    lhq.key_hash = nxt_djb_hash(key->start, key->length);
-    lhq.proto = &lvlhsh_proto;
-
-    ret = nxt_lvlhsh_find(&r->hash, &lhq);
-
-    prop = lhq.value;
-
-    if (ret == NXT_OK && njs_is_valid(&prop->value)) {
-        *value = prop->value;
-        return NXT_OK;
-    }
-
-    njs_value_undefined_set(value);
-
-    return NXT_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_r_set_vars(njs_vm_t *vm, void *obj, uintptr_t data,
-    nxt_str_t *value)
-{
-    nxt_int_t             ret;
-    nxt_str_t             *key;
-    njs_value_t           name, val;
-    njs_unit_test_req_t   *r;
-    njs_unit_test_prop_t  *prop;
-
-    r = (njs_unit_test_req_t *) obj;
-    key = (nxt_str_t *) data;
-
-    if (key->length == 5 && memcmp(key->start, "error", 5) == 0) {
-        njs_vm_error(vm, "cannot set \"error\" prop");
-        return NXT_ERROR;
-    }
-
-    njs_vm_value_string_set(vm, &name, key->start, key->length);
-    njs_vm_value_string_set(vm, &val, value->start, value->length);
-
-    prop = lvlhsh_unit_test_alloc(vm->mem_pool, &name, &val);
-    if (prop == NULL) {
-        njs_memory_error(vm);
-        return NXT_ERROR;
-    }
-
-    ret = lvlhsh_unit_test_add(r, prop);
-    if (ret != NXT_OK) {
-        njs_vm_error(vm, "lvlhsh_unit_test_add() failed");
-        return NXT_ERROR;
-    }
-
-    return NXT_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_r_del_vars(njs_vm_t *vm, void *obj, uintptr_t data,
-    nxt_bool_t delete)
-{
-    nxt_int_t             ret;
-    nxt_str_t             *key;
-    nxt_lvlhsh_query_t    lhq;
-    njs_unit_test_req_t   *r;
-    njs_unit_test_prop_t  *prop;
-
-    r = (njs_unit_test_req_t *) obj;
-    key = (nxt_str_t *) data;
-
-    if (key->length == 5 && memcmp(key->start, "error", 5) == 0) {
-        njs_vm_error(vm, "cannot delete \"error\" prop");
-        return NXT_ERROR;
-    }
-
-    lhq.key = *key;
-    lhq.key_hash = nxt_djb_hash(key->start, key->length);
-    lhq.proto = &lvlhsh_proto;
-
-    ret = nxt_lvlhsh_find(&r->hash, &lhq);
-
-    prop = lhq.value;
-
-    if (ret == NXT_OK) {
-        njs_set_invalid(&prop->value);
-    }
-
-    return NXT_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_header_external(njs_vm_t *vm, njs_value_t *value, void *obj,
-    uintptr_t data)
-{
-    u_char     *p;
-    uint32_t   size;
-    nxt_str_t  *h;
-
-    h = (nxt_str_t *) data;
-
-    size = 7 + h->length;
-
-    p = njs_vm_value_string_alloc(vm, value, size);
-    if (p == NULL) {
-        return NJS_ERROR;
-    }
-
-    p = nxt_cpymem(p, h->start, h->length);
-    *p++ = '|';
-    memcpy(p, "АБВ", 6);
-
-    return NJS_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_header_foreach_external(njs_vm_t *vm, void *obj, void *next)
-{
-    u_char  *s;
-
-    s = next;
-    s[0] = '0';
-    s[1] = '0';
-
-    return NXT_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_header_next_external(njs_vm_t *vm, njs_value_t *value, void *obj,
-    void *next)
-{
-    u_char  *s;
-
-    s = next;
-    s[1]++;
-
-    if (s[1] == '4') {
-        return NXT_DONE;
-    }
-
-    return njs_vm_value_string_set(vm, value, s, 2);
-}
-
-
-static njs_ret_t
-njs_unit_test_method_external(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
-    njs_index_t unused)
-{
-    nxt_int_t            ret;
-    nxt_str_t            s;
-    njs_unit_test_req_t  *r;
-
-    r = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(r == NULL)) {
-        return NJS_ERROR;
-    }
-
-    ret = njs_vm_value_to_string(vm, &s, njs_arg(args, nargs, 1));
-    if (ret == NXT_OK && s.length == 3 && memcmp(s.start, "YES", 3) == 0) {
-        return njs_vm_value_string_set(vm, njs_vm_retval(vm), r->uri.start,
-                                       r->uri.length);
-    }
-
-    vm->retval = njs_value_undefined;
-
-    return NJS_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_create_external(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
-    njs_index_t unused)
-{
-    nxt_int_t            ret;
-    nxt_str_t            uri;
-    njs_value_t          *value;
-    njs_unit_test_req_t  *r, *sr;
-
-    r = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(r == NULL)) {
-        return NJS_ERROR;
-    }
-
-    if (njs_vm_value_to_string(vm, &uri, njs_arg(args, nargs, 1)) != NJS_OK) {
-        return NJS_ERROR;
-    }
-
-    value = nxt_mp_zalloc(r->pool, sizeof(njs_opaque_value_t));
-    if (value == NULL) {
-        goto memory_error;
-    }
-
-    sr = nxt_mp_zalloc(r->pool, sizeof(njs_unit_test_req_t));
-    if (sr == NULL) {
-        goto memory_error;
-    }
-
-    sr->uri = uri;
-    sr->pool = r->pool;
-    sr->proto = r->proto;
-
-    ret = njs_vm_external_create(vm, value, sr->proto, sr);
-    if (ret != NXT_OK) {
-        return NJS_ERROR;
-    }
-
-    njs_vm_retval_set(vm, value);
-
-    return NJS_OK;
-
-memory_error:
-
-    njs_memory_error(vm);
-
-    return NXT_ERROR;
-}
-
-
-static njs_external_t  njs_unit_test_r_props[] = {
-
-    { nxt_string("a"),
-      NJS_EXTERN_PROPERTY,
-      NULL,
-      0,
-      njs_unit_test_r_get_a_external,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      0 },
-
-    { nxt_string("b"),
-      NJS_EXTERN_PROPERTY,
-      NULL,
-      0,
-      njs_unit_test_r_get_b_external,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      42 },
-};
-
-
-static njs_external_t  njs_unit_test_r_external[] = {
-
-    { nxt_string("uri"),
-      NJS_EXTERN_PROPERTY,
-      NULL,
-      0,
-      njs_unit_test_r_get_uri_external,
-      njs_unit_test_r_set_uri_external,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      offsetof(njs_unit_test_req_t, uri) },
-
-    { nxt_string("host"),
-      NJS_EXTERN_PROPERTY,
-      NULL,
-      0,
-      njs_unit_test_host_external,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      0 },
-
-    { nxt_string("props"),
-      NJS_EXTERN_OBJECT,
-      njs_unit_test_r_props,
-      nxt_nitems(njs_unit_test_r_props),
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      0 },
-
-    { nxt_string("vars"),
-      NJS_EXTERN_OBJECT,
-      NULL,
-      0,
-      njs_unit_test_r_get_vars,
-      njs_unit_test_r_set_vars,
-      njs_unit_test_r_del_vars,
-      NULL,
-      NULL,
-      NULL,
-      0 },
-
-    { nxt_string("consts"),
-      NJS_EXTERN_OBJECT,
-      NULL,
-      0,
-      njs_unit_test_r_get_vars,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      0 },
-
-    { nxt_string("header"),
-      NJS_EXTERN_OBJECT,
-      NULL,
-      0,
-      njs_unit_test_header_external,
-      NULL,
-      NULL,
-      njs_unit_test_header_foreach_external,
-      njs_unit_test_header_next_external,
-      NULL,
-      0 },
-
-    { nxt_string("some_method"),
-      NJS_EXTERN_METHOD,
-      NULL,
-      0,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      njs_unit_test_method_external,
-      0 },
-
-    { nxt_string("create"),
-      NJS_EXTERN_METHOD,
-      NULL,
-      0,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      njs_unit_test_create_external,
-      0 },
-
-};
-
-
-static njs_external_t  nxt_test_external[] = {
-
-    { nxt_string("request.proto"),
-      NJS_EXTERN_OBJECT,
-      njs_unit_test_r_external,
-      nxt_nitems(njs_unit_test_r_external),
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      0 },
-
-};
-
-
-typedef struct {
-    nxt_str_t            name;
-    njs_unit_test_req_t  request;
-    njs_unit_test_prop_t props[2];
-} njs_unit_test_req_t_init_t;
-
-
-static const njs_unit_test_req_t_init_t nxt_test_requests[] = {
-
-    { nxt_string("$r"),
-     {
-         .uri = nxt_string("АБВ"),
-         .a = 1
-     },
-     {
-         { njs_string("p"), njs_string("pval") },
-         { njs_string("p2"), njs_string("p2val") },
-     }
-    },
-
-    { nxt_string("$r2"),
-     {
-         .uri = nxt_string("αβγ"),
-         .a = 2
-     },
-     {
-         { njs_string("q"), njs_string("qval") },
-         { njs_string("q2"), njs_string("q2val") },
-     }
-    },
-
-    { nxt_string("$r3"),
-     {
-         .uri = nxt_string("abc"),
-         .a = 3
-     },
-     {
-         { njs_string("k"), njs_string("kval") },
-         { njs_string("k2"), njs_string("k2val") },
-     }
-    },
-};
-
-
-static nxt_int_t
-njs_externals_init(njs_vm_t *vm)
-{
-    nxt_int_t             ret;
-    nxt_uint_t            i, j;
-    const njs_extern_t    *proto;
-    njs_unit_test_req_t   *requests;
-    njs_unit_test_prop_t  *prop;
-
-    proto = njs_vm_external_prototype(vm, &nxt_test_external[0]);
-    if (proto == NULL) {
-        nxt_printf("njs_vm_external_prototype() failed\n");
-        return NXT_ERROR;
-    }
-
-    requests = nxt_mp_zalloc(vm->mem_pool,
-                             nxt_nitems(nxt_test_requests)
-                             * sizeof(njs_unit_test_req_t));
-    if (requests == NULL) {
-        return NXT_ERROR;
-    }
-
-    for (i = 0; i < nxt_nitems(nxt_test_requests); i++) {
-
-        requests[i] = nxt_test_requests[i].request;
-        requests[i].pool = vm->mem_pool;
-        requests[i].proto = proto;
-
-        ret = njs_vm_external_create(vm, njs_value_arg(&requests[i].value),
-                                     proto, &requests[i]);
-        if (ret != NXT_OK) {
-            nxt_printf("njs_vm_external_create() failed\n");
-            return NXT_ERROR;
-        }
-
-        ret = njs_vm_external_bind(vm, &nxt_test_requests[i].name,
-                                   njs_value_arg(&requests[i].value));
-        if (ret != NXT_OK) {
-            nxt_printf("njs_vm_external_bind() failed\n");
-            return NXT_ERROR;
-        }
-
-        for (j = 0; j < nxt_nitems(nxt_test_requests[i].props); j++) {
-            prop = lvlhsh_unit_test_alloc(vm->mem_pool,
-                                          &nxt_test_requests[i].props[j].name,
-                                          &nxt_test_requests[i].props[j].value);
-
-            if (prop == NULL) {
-                nxt_printf("lvlhsh_unit_test_alloc() failed\n");
-                return NXT_ERROR;
-            }
-
-            ret = lvlhsh_unit_test_add(&requests[i], prop);
-            if (ret != NXT_OK) {
-                nxt_printf("lvlhsh_unit_test_add() failed\n");
-                return NXT_ERROR;
-            }
-        }
-    }
-
-    return NXT_OK;
-}
-
-
-typedef struct {
-    nxt_bool_t  disassemble;
-    nxt_bool_t  verbose;
-    nxt_bool_t  module;
-} njs_opts_t;
-
-
-typedef struct {
-    nxt_uint_t  passed;
-    nxt_uint_t  failed;
-} njs_stat_t;
-
-
-static void
-njs_unit_test_report(const char *msg, njs_stat_t *prev, njs_stat_t *current)
-{
-    njs_stat_t  stat;
-
-    stat.failed = current->failed - prev->failed;
-    stat.passed = current->passed - prev->passed;
-
-    nxt_printf("%s: %s [%d/%d]\n", msg, stat.failed ? "FAILED" : "PASSED",
-               stat.passed, stat.passed + stat.failed);
-}
-
-
-static nxt_int_t
-njs_unit_test(njs_unit_test_t tests[], size_t num, const char *name,
-    njs_opts_t *opts, njs_stat_t *stat)
-{
-    u_char        *start;
-    njs_vm_t      *vm, *nvm;
-    nxt_int_t     ret, rc;
-    nxt_str_t     s;
-    nxt_uint_t    i;
-    njs_stat_t    prev;
-    nxt_bool_t    success;
-    njs_vm_opt_t  options;
-
-    vm = NULL;
-    nvm = NULL;
-
-    prev = *stat;
-
-    rc = NXT_ERROR;
-
-    for (i = 0; i < num; i++) {
-
-        if (opts->verbose) {
-            nxt_printf("\"%V\"\n", &tests[i].script);
-        }
-
-        nxt_memzero(&options, sizeof(njs_vm_opt_t));
-
-        options.module = opts->module;
-
-        vm = njs_vm_create(&options);
-        if (vm == NULL) {
-            nxt_printf("njs_vm_create() failed\n");
-            goto done;
-        }
-
-        ret = njs_externals_init(vm);
-        if (ret != NXT_OK) {
-            goto done;
-        }
-
-        start = tests[i].script.start;
-
-        ret = njs_vm_compile(vm, &start, start + tests[i].script.length);
-
-        if (ret == NXT_OK) {
-            if (opts->disassemble) {
-                njs_disassembler(vm);
-            }
-
-            nvm = njs_vm_clone(vm, NULL);
-            if (nvm == NULL) {
-                nxt_printf("njs_vm_clone() failed\n");
-                goto done;
-            }
-
-            ret = njs_vm_start(nvm);
-
-            if (njs_vm_retval_string(nvm, &s) != NXT_OK) {
-                nxt_printf("njs_vm_retval_string() failed\n");
-                goto done;
-            }
-
-        } else {
-            if (njs_vm_retval_string(vm, &s) != NXT_OK) {
-                nxt_printf("njs_vm_retval_string() failed\n");
-                goto done;
-            }
-        }
-
-        success = nxt_strstr_eq(&tests[i].ret, &s);
-
-        if (!success) {
-            nxt_printf("njs(\"%V\")\nexpected: \"%V\"\n     got: \"%V\"\n",
-                       &tests[i].script, &tests[i].ret, &s);
-
-            stat->failed++;
-
-        } else {
-            stat->passed++;
-        }
-
-        if (nvm != NULL) {
-            njs_vm_destroy(nvm);
-            nvm = NULL;
-        }
-
-        njs_vm_destroy(vm);
-        vm = NULL;
-    }
-
-    rc = NXT_OK;
-
-done:
-
-    if (nvm != NULL) {
-        njs_vm_destroy(nvm);
-    }
-
-    if (vm != NULL) {
-        njs_vm_destroy(vm);
-    }
-
-    njs_unit_test_report(name, &prev, stat);
-
-    return rc;
-}
-
-
-static nxt_int_t
-njs_timezone_optional_test(njs_opts_t *opts, njs_stat_t *stat)
-{
-    size_t     size;
-    u_char     buf[16];
-    time_t     clock;
-    struct tm  tm;
-    nxt_int_t  ret;
-
-    /*
-     * Chatham Islands NZ-CHAT time zone.
-     * Standard time: UTC+12:45, Daylight Saving time: UTC+13:45.
-     */
-    (void) putenv((char *) "TZ=Pacific/Chatham");
-    tzset();
-
-    clock = 0;
-    localtime_r(&clock, &tm);
-
-    size = strftime((char *) buf, sizeof(buf), "%z", &tm);
-
-    if (memcmp(buf, "+1245", size) == 0) {
-        ret = njs_unit_test(njs_tz_test, nxt_nitems(njs_tz_test),
-                            "timezone tests", opts, stat);
-        if (ret != NXT_OK) {
-            return ret;
-        }
-
-    } else {
-        nxt_printf("njs timezone tests skipped, timezone is unavailable\n");
-    }
-
-    return NXT_OK;
-}
-
-
-static nxt_int_t
-njs_regexp_optional_test(njs_opts_t *opts, njs_stat_t *stat)
-{
-    int         erroff;
-    pcre        *re1, *re2;
-    njs_ret_t   ret;
-    const char  *errstr;
-
-    /*
-     * pcre-8.21 crashes when it compiles unicode escape codes inside
-     * square brackets when PCRE_UTF8 option is provided.
-     * Catching it in runtime by compiling it without PCRE_UTF8. Normally it
-     * should return NULL and "character value in \u.... sequence is too large"
-     * error string.
-     */
-    re1 = pcre_compile("/[\\u0410]/", PCRE_JAVASCRIPT_COMPAT, &errstr, &erroff,
-                      NULL);
-
-    /*
-     * pcre-7.8 fails to compile unicode escape codes inside square brackets
-     * even when PCRE_UTF8 option is provided.
-     */
-    re2 = pcre_compile("/[\\u0410]/", PCRE_JAVASCRIPT_COMPAT | PCRE_UTF8,
-                       &errstr, &erroff, NULL);
-
-    if (re1 == NULL && re2 != NULL) {
-        ret = njs_unit_test(njs_regexp_test, nxt_nitems(njs_regexp_test),
-                            "unicode regexp tests", opts, stat);
-        if (ret != NXT_OK) {
-            return ret;
-        }
-
-    } else {
-        nxt_printf("njs unicode regexp tests skipped, libpcre fails\n");
-    }
-
-    if (re1 != NULL) {
-        pcre_free(re1);
-    }
-
-    if (re2 != NULL) {
-        pcre_free(re2);
-    }
-
-    return NXT_OK;
-}
-
-
-static nxt_int_t
-njs_vm_json_test(njs_opts_t *opts, njs_stat_t *stat)
-{
-    njs_vm_t      *vm;
-    nxt_int_t     ret, rc;
-    nxt_str_t     s, *script;
-    nxt_uint_t    i;
-    nxt_bool_t    success;
-    njs_stat_t    prev;
-    njs_value_t   args[3];
-    njs_vm_opt_t  options;
-
-    static const nxt_str_t fname = nxt_string("replacer");
-    static const nxt_str_t iname = nxt_string("indent");
-
-    static njs_unit_test_t tests[] = {
-        { nxt_string("'[1, true, \"x\", {\"a\": {}}]'"),
-          nxt_string("[1,true,\"x\",{\"a\":{}}]") },
-        { nxt_string("'{\"a\":{\"b\":1}}'"),
-          nxt_string("{\"a\":{\"b\":1}}") },
-        { nxt_string("'[[[],{}]]'"),
-          nxt_string("[[[],{}]]") },
-        { nxt_string("var indent = 1; '[]'"),
-          nxt_string("[\n \n]") },
-        { nxt_string("function replacer(k, v) {return v}; '{\"a\":{\"b\":1}}'"),
-          nxt_string("{\"a\":{\"b\":1}}") },
-        { nxt_string("function replacer(k, v) {"
-                     "   return (typeof v === 'string') ? undefined : v};"
-                     "'{\"a\":1, \"b\":\"x\"}'"),
-          nxt_string("{\"a\":1}") },
-    };
-
-    vm = NULL;
-
-    prev = *stat;
-
-    rc = NXT_ERROR;
-
-    for (i = 0; i < nxt_nitems(tests); i++) {
-
-        memset(&options, 0, sizeof(njs_vm_opt_t));
-        options.init = 1;
-
-        vm = njs_vm_create(&options);
-        if (vm == NULL) {
-            nxt_printf("njs_vm_create() failed\n");
-            goto done;
-        }
-
-        script = &tests[i].script;
-
-        ret = njs_vm_compile(vm, &script->start,
-                             script->start + script->length);
-
-        if (ret != NXT_OK) {
-            nxt_printf("njs_vm_compile() failed\n");
-            goto done;
-        }
-
-        ret = njs_vm_start(vm);
-        if (ret != NXT_OK) {
-            nxt_printf("njs_vm_run() failed\n");
-            goto done;
-        }
-
-        args[0] = *njs_vm_retval(vm);
-
-        ret = njs_vm_json_parse(vm, args, 1);
-        if (ret != NXT_OK) {
-            nxt_printf("njs_vm_json_parse() failed\n");
-            goto done;
-        }
-
-        args[0] = vm->retval;
-        args[1] = *njs_vm_value(vm, &fname);
-        args[2] = *njs_vm_value(vm, &iname);
-
-        ret = njs_vm_json_stringify(vm, args, 3);
-        if (ret != NXT_OK) {
-            nxt_printf("njs_vm_json_stringify() failed\n");
-            goto done;
-        }
-
-        if (njs_vm_retval_string(vm, &s) != NXT_OK) {
-            nxt_printf("njs_vm_retval_string() failed\n");
-            goto done;
-        }
-
-        success = nxt_strstr_eq(&tests[i].ret, &s);
-
-        if (!success) {
-            nxt_printf("njs_vm_json_test(\"%V\")\n"
-                       "expected: \"%V\"\n     got: \"%V\"\n", script,
-                       &tests[i].ret, &s);
-
-            stat->failed++;
-
-        } else {
-            stat->passed++;
-        }
-
-        njs_vm_destroy(vm);
-        vm = NULL;
-
-    }
-
-    rc = NXT_OK;
-
-done:
-
-    if (rc != NXT_OK) {
-        if (njs_vm_retval_string(vm, &s) != NXT_OK) {
-            nxt_printf("njs_vm_retval_string() failed\n");
-
-        } else {
-            nxt_printf("%V\n", &s);
-        }
-    }
-
-    njs_unit_test_report("VM json API tests", &prev, stat);
-
-    if (vm != NULL) {
-        njs_vm_destroy(vm);
-    }
-
-    return rc;
-}
-
-
-static nxt_int_t
-njs_vm_object_alloc_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
-{
-    njs_ret_t    ret;
-    njs_value_t  args[2], obj;
-
-    static const njs_value_t num_key = njs_string("num");
-    static const njs_value_t bool_key = njs_string("bool");
-
-    njs_value_number_set(njs_argument(&args, 0), 1);
-    njs_value_boolean_set(njs_argument(&args, 1), 0);
-
-    ret = njs_vm_object_alloc(vm, &obj, NULL);
-    if (ret != NJS_OK) {
-        return NXT_ERROR;
-    }
-
-    ret = njs_vm_object_alloc(vm, &obj, &num_key, NULL);
-    if (ret == NJS_OK) {
-        return NXT_ERROR;
-    }
-
-    ret = njs_vm_object_alloc(vm, &obj, &num_key, &args[0], NULL);
-    if (ret != NJS_OK) {
-        return NXT_ERROR;
-    }
-
-    ret = njs_vm_object_alloc(vm, &obj, &num_key, &args[0], &bool_key,
-                              &args[1], NULL);
-    if (ret != NJS_OK) {
-        stat->failed++;
-        return NXT_OK;
-    }
-
-    stat->passed++;
-
-    return NXT_OK;
-}
-
-
-static nxt_int_t
-nxt_file_basename_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
-{
-    nxt_str_t   name;
-    nxt_bool_t  success;
-    nxt_uint_t  i;
-
-    static const struct {
-        nxt_str_t   path;
-        nxt_str_t   expected;
-    } tests[] = {
-        { nxt_string(""),            nxt_string("") },
-        { nxt_string("/"),           nxt_string("") },
-        { nxt_string("/a"),          nxt_string("a") },
-        { nxt_string("///"),         nxt_string("") },
-        { nxt_string("///a"),        nxt_string("a") },
-        { nxt_string("///a/"),       nxt_string("") },
-        { nxt_string("a"),           nxt_string("a") },
-        { nxt_string("a/"),          nxt_string("") },
-        { nxt_string("a//"),         nxt_string("") },
-        { nxt_string("path/name"),   nxt_string("name") },
-        { nxt_string("/path/name"),  nxt_string("name") },
-        { nxt_string("/path/name/"), nxt_string("") },
-    };
-
-    for (i = 0; i < nxt_nitems(tests); i++) {
-        nxt_file_basename(&tests[i].path, &name);
-
-        success = nxt_strstr_eq(&tests[i].expected, &name);
-
-        if (!success) {
-            nxt_printf("nxt_file_basename_test(\"%V\"):\n"
-                       "expected: \"%V\"\n     got: \"%V\"\n",
-                       &tests[i].path, &tests[i].expected, &name);
-
-            stat->failed++;
-
-        } else {
-            stat->passed++;
-        }
-    }
-
-    return NXT_OK;
-}
-
-
-static nxt_int_t
-nxt_file_dirname_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
-{
-    nxt_str_t   name;
-    nxt_bool_t  success;
-    nxt_uint_t  i;
-
-    static const struct {
-        nxt_str_t   path;
-        nxt_str_t   expected;
-    } tests[] = {
-        { nxt_string(""),               nxt_string(".") },
-        { nxt_string("/"),              nxt_string("/") },
-        { nxt_string("/a"),             nxt_string("/") },
-        { nxt_string("///"),            nxt_string("///") },
-        { nxt_string("///a"),           nxt_string("///") },
-        { nxt_string("///a/"),          nxt_string("///a") },
-        { nxt_string("a"),              nxt_string(".") },
-        { nxt_string("a/"),             nxt_string("a") },
-        { nxt_string("a//"),            nxt_string("a") },
-        { nxt_string("p1/p2/name"),     nxt_string("p1/p2") },
-        { nxt_string("/p1/p2/name"),    nxt_string("/p1/p2") },
-        { nxt_string("/p1/p2///name"),  nxt_string("/p1/p2") },
-        { nxt_string("/p1/p2/name/"),   nxt_string("/p1/p2/name") },
-    };
-
-    for (i = 0; i < nxt_nitems(tests); i++) {
-        nxt_file_dirname(&tests[i].path, &name);
-
-        success = nxt_strstr_eq(&tests[i].expected, &name);
-
-        if (!success) {
-            nxt_printf("nxt_file_dirname_test(\"%V\"):\n"
-                       "expected: \"%V\"\n     got: \"%V\"\n",
-                       &tests[i].path, &tests[i].expected, &name);
-
-            stat->failed++;
-        } else {
-            stat->passed++;
-        }
-
-    }
-
-    return NXT_OK;
-}
-
-
-static nxt_int_t
-njs_api_test(njs_opts_t *opts, njs_stat_t *stat)
-{
-    njs_vm_t      *vm;
-    nxt_int_t     ret, rc;
-    nxt_uint_t    i;
-    njs_stat_t    prev;
-    njs_vm_opt_t  options;
-
-    static const struct {
-        nxt_int_t  (*test)(njs_vm_t *, njs_opts_t *, njs_stat_t *stat);
-        nxt_str_t  name;
-    } tests[] = {
-        { njs_vm_object_alloc_test,
-          nxt_string("njs_vm_object_alloc_test") },
-        { nxt_file_basename_test,
-          nxt_string("nxt_file_basename_test") },
-        { nxt_file_dirname_test,
-          nxt_string("nxt_file_dirname_test") },
-    };
-
-    vm = NULL;
-    nxt_memzero(&options, sizeof(njs_vm_opt_t));
-
-    prev = *stat;
-
-    rc = NXT_ERROR;
-
-    for (i = 0; i < nxt_nitems(tests); i++) {
-        vm = njs_vm_create(&options);
-        if (vm == NULL) {
-            nxt_printf("njs_vm_create() failed\n");
-            goto done;
-        }
-
-        ret = tests[i].test(vm, opts, stat);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            nxt_printf("njs_api_test: \"%V\" test failed\n", &tests[i].name);
-            goto done;
-        }
-
-        njs_vm_destroy(vm);
-        vm = NULL;
-    }
-
-    rc = NXT_OK;
-
-done:
-
-    njs_unit_test_report("API tests", &prev, stat);
-
-    if (vm != NULL) {
-        njs_vm_destroy(vm);
-    }
-
-    return rc;
-}
-
-
-int nxt_cdecl
-main(int argc, char **argv)
-{
-    nxt_int_t   ret;
-    njs_opts_t  opts;
-    njs_stat_t  stat;
-
-    nxt_memzero(&opts, sizeof(njs_opts_t));
-
-    if (argc > 1) {
-        switch (argv[1][0]) {
-
-        case 'd':
-            opts.disassemble = 1;
-            break;
-
-        case 'v':
-            opts.verbose = 1;
-            break;
-
-        default:
-            break;
-        }
-    }
-
-    (void) putenv((char *) "TZ=UTC");
-    tzset();
-
-    nxt_memzero(&stat, sizeof(njs_stat_t));
-
-    ret = njs_unit_test(njs_test, nxt_nitems(njs_test), "script tests",
-                        &opts, &stat);
-    if (ret != NXT_OK) {
-        return ret;
-    }
-
-    ret = njs_timezone_optional_test(&opts, &stat);
-    if (ret != NXT_OK) {
-        return ret;
-    }
-
-    ret = njs_regexp_optional_test(&opts, &stat);
-    if (ret != NXT_OK) {
-        return ret;
-    }
-
-    ret = njs_vm_json_test(&opts, &stat);
-    if (ret != NXT_OK) {
-        return ret;
-    }
-
-    ret = njs_api_test(&opts, &stat);
-    if (ret != NXT_OK) {
-        return ret;
-    }
-
-    opts.module = 1;
-
-    ret = njs_unit_test(njs_module_test, nxt_nitems(njs_module_test),
-                        "module tests", &opts, &stat);
-    if (ret != NXT_OK) {
-        return ret;
-    }
-
-    nxt_printf("TOTAL: %s [%ui/%ui]\n", stat.failed ? "FAILED" : "PASSED",
-               stat.passed, stat.passed + stat.failed);
-
-    return stat.failed ? EXIT_FAILURE : EXIT_SUCCESS;
-}
diff --git a/nxt/nxt_alignment.h b/nxt/nxt_alignment.h
deleted file mode 100644 (file)
index 547c430..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_ALIGNMENT_H_INCLUDED_
-#define _NXT_ALIGNMENT_H_INCLUDED_
-
-
-#ifndef NXT_MAX_ALIGNMENT
-
-#if (NXT_SOLARIS)
-/* x86_64: 16, i386: 4, sparcv9: 16, sparcv8: 8. */
-#define NXT_MAX_ALIGNMENT  _MAX_ALIGNMENT
-
-#elif (NXT_WINDOWS)
-/* Win64: 16, Win32: 8. */
-#define NXT_MAX_ALIGNMENT  MEMORY_ALLOCATION_ALIGNMENT
-
-#elif (__amd64__)
-#define NXT_MAX_ALIGNMENT  16
-
-#elif (__i386__ || __i386)
-#define NXT_MAX_ALIGNMENT  4
-
-#elif (__arm__)
-#define NXT_MAX_ALIGNMENT  16
-
-#else
-#define NXT_MAX_ALIGNMENT  16
-#endif
-
-#endif
-
-
-#define nxt_align_size(size, a)                                               \
-    (((size) + ((size_t) (a) - 1)) & ~((size_t) (a) - 1))
-
-
-#define nxt_align_ptr(p, a)                                                   \
-    (u_char *) (((uintptr_t) (p) + ((uintptr_t) (a) - 1))                     \
-                 & ~((uintptr_t) (a) - 1))
-
-#define nxt_trunc_ptr(p, a)                                                   \
-    (u_char *) ((uintptr_t) (p) & ~((uintptr_t) (a) - 1))
-
-
-#endif /* _NXT_ALIGNMENT_H_INCLUDED_ */
diff --git a/nxt/nxt_array.h b/nxt/nxt_array.h
deleted file mode 100644 (file)
index df64fa9..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_ARRAY_H_INCLUDED_
-#define _NXT_ARRAY_H_INCLUDED_
-
-
-typedef struct {
-    void              *start;
-    /*
-     * A array can hold no more than 65536 items.
-     * The item size is no more than 64K.
-     */
-    uint16_t          items;
-    uint16_t          avalaible;
-    uint16_t          item_size;
-
-    uint8_t           pointer;
-    uint8_t           separate;
-} nxt_array_t;
-
-
-NXT_EXPORT nxt_array_t *nxt_array_create(uint32_t items, uint32_t item_size,
-    const nxt_mem_proto_t *proto, void *pool);
-NXT_EXPORT void *nxt_array_init(nxt_array_t *array, void *start,
-    uint32_t items, uint32_t item_size, const nxt_mem_proto_t *proto,
-    void *pool);
-NXT_EXPORT void nxt_array_destroy(nxt_array_t *array,
-    const nxt_mem_proto_t *proto, void *pool);
-NXT_EXPORT void *nxt_array_add(nxt_array_t *array, const nxt_mem_proto_t *proto,
-    void *pool);
-NXT_EXPORT void *nxt_array_add_multiple(nxt_array_t *array,
-    const nxt_mem_proto_t *proto, void *pool, uint32_t items);
-NXT_EXPORT void *nxt_array_zero_add(nxt_array_t *array,
-    const nxt_mem_proto_t *proto, void *pool);
-NXT_EXPORT void nxt_array_remove(nxt_array_t *array, void *item);
-
-
-#define nxt_array_item(array, i)                                              \
-    ((void *) ((char *) (array)->start + (array)->item_size * (i)))
-
-
-#define nxt_array_last(array)                                                 \
-    ((void *)                                                                 \
-        ((char *) (array)->start                                              \
-                      + (array)->item_size * ((array)->items - 1)))
-
-
-#define nxt_array_reset(array)                                                \
-    (array)->items = 0;
-
-
-#define nxt_array_is_empty(array)                                             \
-    ((array)->items == 0)
-
-
-nxt_inline void *
-nxt_array_remove_last(nxt_array_t *array)
-{
-    array->items--;
-    return (char *) array->start + array->item_size * array->items;
-}
-
-
-#endif /* _NXT_ARRAY_H_INCLUDED_ */
diff --git a/nxt/nxt_clang.h b/nxt/nxt_clang.h
deleted file mode 100644 (file)
index 3e4b5f3..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_CLANG_H_INCLUDED_
-#define _NXT_CLANG_H_INCLUDED_
-
-
-#include <stdarg.h>
-#include <stddef.h>       /* offsetof(). */
-#include <unistd.h>       /* NULL. */
-
-
-#define nxt_inline         static inline __attribute__((always_inline))
-#define nxt_noinline       __attribute__((noinline))
-#define nxt_cdecl
-
-
-#define nxt_container_of(p, type, field)                                      \
-    (type *) ((u_char *) (p) - offsetof(type, field))
-
-#define nxt_nitems(x)                                                         \
-    (sizeof(x) / sizeof((x)[0]))
-
-
-#if (NXT_HAVE_BUILTIN_EXPECT)
-#define nxt_expect(c, x)   __builtin_expect((long) (x), (c))
-#define nxt_fast_path(x)   nxt_expect(1, x)
-#define nxt_slow_path(x)   nxt_expect(0, x)
-
-#else
-#define nxt_expect(c, x)   (x)
-#define nxt_fast_path(x)   (x)
-#define nxt_slow_path(x)   (x)
-#endif
-
-
-#if (NXT_HAVE_BUILTIN_UNREACHABLE)
-#define nxt_unreachable()  __builtin_unreachable()
-
-#else
-#define nxt_unreachable()
-#endif
-
-
-#if (NXT_HAVE_BUILTIN_PREFETCH)
-#define nxt_prefetch(a)    __builtin_prefetch(a)
-
-#else
-#define nxt_prefetch(a)
-#endif
-
-
-#if (NXT_HAVE_BUILTIN_CLZ)
-#define nxt_leading_zeros(x)  (((x) == 0) ? 32 : __builtin_clz(x))
-
-#else
-
-nxt_inline uint32_t
-nxt_leading_zeros(uint32_t x)
-{
-    uint32_t  n;
-
-    /*
-     * There is no sense to optimize this function, since almost
-     * all platforms nowadays support the built-in instruction.
-     */
-
-    if (x == 0) {
-        return 32;
-    }
-
-    n = 0;
-
-    while ((x & 0x80000000) == 0) {
-        n++;
-        x <<= 1;
-    }
-
-    return n;
-}
-
-#endif
-
-
-#if (NXT_HAVE_BUILTIN_CLZLL)
-#define nxt_leading_zeros64(x)  (((x) == 0) ? 64 : __builtin_clzll(x))
-
-#else
-
-nxt_inline uint64_t
-nxt_leading_zeros64(uint64_t x)
-{
-    uint64_t  n;
-
-    /*
-     * There is no sense to optimize this function, since almost
-     * all platforms nowadays support the built-in instruction.
-     */
-
-    if (x == 0) {
-        return 64;
-    }
-
-    n = 0;
-
-    while ((x & 0x8000000000000000) == 0) {
-        n++;
-        x <<= 1;
-    }
-
-    return n;
-}
-
-#endif
-
-
-#if (NXT_HAVE_GCC_ATTRIBUTE_VISIBILITY)
-#define NXT_EXPORT         __attribute__((visibility("default")))
-
-#else
-#define NXT_EXPORT
-#endif
-
-
-#if (NXT_HAVE_GCC_ATTRIBUTE_ALIGNED)
-#define nxt_aligned(x)     __attribute__((aligned(x)))
-
-#else
-#define nxt_aligned(x)
-#endif
-
-
-#if (NXT_HAVE_GCC_ATTRIBUTE_MALLOC)
-#define NXT_MALLOC_LIKE    __attribute__((__malloc__))
-
-#else
-#define NXT_MALLOC_LIKE
-#endif
-
-
-#if (NXT_CLANG)
-/* Any __asm__ directive disables loop vectorization in GCC and Clang. */
-#define nxt_pragma_loop_disable_vectorization  __asm__("")
-
-#else
-#define nxt_pragma_loop_disable_vectorization
-#endif
-
-
-#if (NXT_HAVE_MEMORY_SANITIZER)
-#include <sanitizer/msan_interface.h>
-
-#define nxt_msan_unpoison(ptr, size)  __msan_unpoison(ptr, size)
-#endif
-
-
-#endif /* _NXT_CLANG_H_INCLUDED_ */
diff --git a/nxt/nxt_diyfp.c b/nxt/nxt_diyfp.c
deleted file mode 100644 (file)
index a6e4f1b..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-
-/*
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) NGINX, Inc.
- *
- * An internal diy_fp implementation.
- * For details, see Loitsch, Florian. "Printing floating-point numbers quickly
- * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_diyfp.h>
-
-
-typedef struct nxt_cpe_s {
-  uint64_t  significand;
-  int16_t   bin_exp;
-  int16_t   dec_exp;
-} nxt_cpe_t;
-
-
-static const nxt_cpe_t nxt_cached_powers[] = {
-  { nxt_uint64(0xfa8fd5a0, 0x081c0288), -1220, -348 },
-  { nxt_uint64(0xbaaee17f, 0xa23ebf76), -1193, -340 },
-  { nxt_uint64(0x8b16fb20, 0x3055ac76), -1166, -332 },
-  { nxt_uint64(0xcf42894a, 0x5dce35ea), -1140, -324 },
-  { nxt_uint64(0x9a6bb0aa, 0x55653b2d), -1113, -316 },
-  { nxt_uint64(0xe61acf03, 0x3d1a45df), -1087, -308 },
-  { nxt_uint64(0xab70fe17, 0xc79ac6ca), -1060, -300 },
-  { nxt_uint64(0xff77b1fc, 0xbebcdc4f), -1034, -292 },
-  { nxt_uint64(0xbe5691ef, 0x416bd60c), -1007, -284 },
-  { nxt_uint64(0x8dd01fad, 0x907ffc3c),  -980, -276 },
-  { nxt_uint64(0xd3515c28, 0x31559a83),  -954, -268 },
-  { nxt_uint64(0x9d71ac8f, 0xada6c9b5),  -927, -260 },
-  { nxt_uint64(0xea9c2277, 0x23ee8bcb),  -901, -252 },
-  { nxt_uint64(0xaecc4991, 0x4078536d),  -874, -244 },
-  { nxt_uint64(0x823c1279, 0x5db6ce57),  -847, -236 },
-  { nxt_uint64(0xc2109436, 0x4dfb5637),  -821, -228 },
-  { nxt_uint64(0x9096ea6f, 0x3848984f),  -794, -220 },
-  { nxt_uint64(0xd77485cb, 0x25823ac7),  -768, -212 },
-  { nxt_uint64(0xa086cfcd, 0x97bf97f4),  -741, -204 },
-  { nxt_uint64(0xef340a98, 0x172aace5),  -715, -196 },
-  { nxt_uint64(0xb23867fb, 0x2a35b28e),  -688, -188 },
-  { nxt_uint64(0x84c8d4df, 0xd2c63f3b),  -661, -180 },
-  { nxt_uint64(0xc5dd4427, 0x1ad3cdba),  -635, -172 },
-  { nxt_uint64(0x936b9fce, 0xbb25c996),  -608, -164 },
-  { nxt_uint64(0xdbac6c24, 0x7d62a584),  -582, -156 },
-  { nxt_uint64(0xa3ab6658, 0x0d5fdaf6),  -555, -148 },
-  { nxt_uint64(0xf3e2f893, 0xdec3f126),  -529, -140 },
-  { nxt_uint64(0xb5b5ada8, 0xaaff80b8),  -502, -132 },
-  { nxt_uint64(0x87625f05, 0x6c7c4a8b),  -475, -124 },
-  { nxt_uint64(0xc9bcff60, 0x34c13053),  -449, -116 },
-  { nxt_uint64(0x964e858c, 0x91ba2655),  -422, -108 },
-  { nxt_uint64(0xdff97724, 0x70297ebd),  -396, -100 },
-  { nxt_uint64(0xa6dfbd9f, 0xb8e5b88f),  -369,  -92 },
-  { nxt_uint64(0xf8a95fcf, 0x88747d94),  -343,  -84 },
-  { nxt_uint64(0xb9447093, 0x8fa89bcf),  -316,  -76 },
-  { nxt_uint64(0x8a08f0f8, 0xbf0f156b),  -289,  -68 },
-  { nxt_uint64(0xcdb02555, 0x653131b6),  -263,  -60 },
-  { nxt_uint64(0x993fe2c6, 0xd07b7fac),  -236,  -52 },
-  { nxt_uint64(0xe45c10c4, 0x2a2b3b06),  -210,  -44 },
-  { nxt_uint64(0xaa242499, 0x697392d3),  -183,  -36 },
-  { nxt_uint64(0xfd87b5f2, 0x8300ca0e),  -157,  -28 },
-  { nxt_uint64(0xbce50864, 0x92111aeb),  -130,  -20 },
-  { nxt_uint64(0x8cbccc09, 0x6f5088cc),  -103,  -12 },
-  { nxt_uint64(0xd1b71758, 0xe219652c),   -77,   -4 },
-  { nxt_uint64(0x9c400000, 0x00000000),   -50,    4 },
-  { nxt_uint64(0xe8d4a510, 0x00000000),   -24,   12 },
-  { nxt_uint64(0xad78ebc5, 0xac620000),     3,   20 },
-  { nxt_uint64(0x813f3978, 0xf8940984),    30,   28 },
-  { nxt_uint64(0xc097ce7b, 0xc90715b3),    56,   36 },
-  { nxt_uint64(0x8f7e32ce, 0x7bea5c70),    83,   44 },
-  { nxt_uint64(0xd5d238a4, 0xabe98068),   109,   52 },
-  { nxt_uint64(0x9f4f2726, 0x179a2245),   136,   60 },
-  { nxt_uint64(0xed63a231, 0xd4c4fb27),   162,   68 },
-  { nxt_uint64(0xb0de6538, 0x8cc8ada8),   189,   76 },
-  { nxt_uint64(0x83c7088e, 0x1aab65db),   216,   84 },
-  { nxt_uint64(0xc45d1df9, 0x42711d9a),   242,   92 },
-  { nxt_uint64(0x924d692c, 0xa61be758),   269,  100 },
-  { nxt_uint64(0xda01ee64, 0x1a708dea),   295,  108 },
-  { nxt_uint64(0xa26da399, 0x9aef774a),   322,  116 },
-  { nxt_uint64(0xf209787b, 0xb47d6b85),   348,  124 },
-  { nxt_uint64(0xb454e4a1, 0x79dd1877),   375,  132 },
-  { nxt_uint64(0x865b8692, 0x5b9bc5c2),   402,  140 },
-  { nxt_uint64(0xc83553c5, 0xc8965d3d),   428,  148 },
-  { nxt_uint64(0x952ab45c, 0xfa97a0b3),   455,  156 },
-  { nxt_uint64(0xde469fbd, 0x99a05fe3),   481,  164 },
-  { nxt_uint64(0xa59bc234, 0xdb398c25),   508,  172 },
-  { nxt_uint64(0xf6c69a72, 0xa3989f5c),   534,  180 },
-  { nxt_uint64(0xb7dcbf53, 0x54e9bece),   561,  188 },
-  { nxt_uint64(0x88fcf317, 0xf22241e2),   588,  196 },
-  { nxt_uint64(0xcc20ce9b, 0xd35c78a5),   614,  204 },
-  { nxt_uint64(0x98165af3, 0x7b2153df),   641,  212 },
-  { nxt_uint64(0xe2a0b5dc, 0x971f303a),   667,  220 },
-  { nxt_uint64(0xa8d9d153, 0x5ce3b396),   694,  228 },
-  { nxt_uint64(0xfb9b7cd9, 0xa4a7443c),   720,  236 },
-  { nxt_uint64(0xbb764c4c, 0xa7a44410),   747,  244 },
-  { nxt_uint64(0x8bab8eef, 0xb6409c1a),   774,  252 },
-  { nxt_uint64(0xd01fef10, 0xa657842c),   800,  260 },
-  { nxt_uint64(0x9b10a4e5, 0xe9913129),   827,  268 },
-  { nxt_uint64(0xe7109bfb, 0xa19c0c9d),   853,  276 },
-  { nxt_uint64(0xac2820d9, 0x623bf429),   880,  284 },
-  { nxt_uint64(0x80444b5e, 0x7aa7cf85),   907,  292 },
-  { nxt_uint64(0xbf21e440, 0x03acdd2d),   933,  300 },
-  { nxt_uint64(0x8e679c2f, 0x5e44ff8f),   960,  308 },
-  { nxt_uint64(0xd433179d, 0x9c8cb841),   986,  316 },
-  { nxt_uint64(0x9e19db92, 0xb4e31ba9),  1013,  324 },
-  { nxt_uint64(0xeb96bf6e, 0xbadf77d9),  1039,  332 },
-  { nxt_uint64(0xaf87023b, 0x9bf0ee6b),  1066,  340 },
-};
-
-
-#define NXT_D_1_LOG2_10     0.30102999566398114 /* 1 / log2(10). */
-
-
-nxt_diyfp_t
-nxt_cached_power_dec(int exp, int *dec_exp)
-{
-    u_int            index;
-    const nxt_cpe_t  *cp;
-
-    index = (exp + NXT_DECIMAL_EXPONENT_OFF) / NXT_DECIMAL_EXPONENT_DIST;
-    cp = &nxt_cached_powers[index];
-
-    *dec_exp = cp->dec_exp;
-
-    return nxt_diyfp(cp->significand, cp->bin_exp);
-}
-
-
-nxt_diyfp_t
-nxt_cached_power_bin(int exp, int *dec_exp)
-{
-    int              k;
-    u_int            index;
-    const nxt_cpe_t  *cp;
-
-    k = (int) ceil((-61 - exp) * NXT_D_1_LOG2_10)
-        + NXT_DECIMAL_EXPONENT_OFF - 1;
-
-    index = (unsigned) (k >> 3) + 1;
-
-    cp = &nxt_cached_powers[index];
-
-    *dec_exp = -(NXT_DECIMAL_EXPONENT_MIN + (int) (index << 3));
-
-    return nxt_diyfp(cp->significand, cp->bin_exp);
-}
diff --git a/nxt/nxt_diyfp.h b/nxt/nxt_diyfp.h
deleted file mode 100644 (file)
index ec36d2a..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-
-/*
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) NGINX, Inc.
- *
- * An internal diy_fp implementation.
- * For details, see Loitsch, Florian. "Printing floating-point numbers quickly
- * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
- */
-
-#ifndef _NXT_DIYFP_H_INCLUDED_
-#define _NXT_DIYFP_H_INCLUDED_
-
-#include <nxt_types.h>
-#include <math.h>
-
-
-typedef struct {
-    uint64_t    significand;
-    int         exp;
-} nxt_diyfp_t;
-
-
-#define nxt_diyfp(_s, _e)           (nxt_diyfp_t) \
-                                    { .significand = (_s), .exp = (_e) }
-#define nxt_uint64(h, l)            (((uint64_t) (h) << 32) + (l))
-
-
-#define NXT_DBL_SIGNIFICAND_SIZE    52
-#define NXT_DBL_EXPONENT_BIAS       (0x3FF + NXT_DBL_SIGNIFICAND_SIZE)
-#define NXT_DBL_EXPONENT_MIN        (-NXT_DBL_EXPONENT_BIAS)
-#define NXT_DBL_EXPONENT_MAX        (0x7FF - NXT_DBL_EXPONENT_BIAS)
-#define NXT_DBL_EXPONENT_DENORMAL   (-NXT_DBL_EXPONENT_BIAS + 1)
-
-#define NXT_DBL_SIGNIFICAND_MASK    nxt_uint64(0x000FFFFF, 0xFFFFFFFF)
-#define NXT_DBL_HIDDEN_BIT          nxt_uint64(0x00100000, 0x00000000)
-#define NXT_DBL_EXPONENT_MASK       nxt_uint64(0x7FF00000, 0x00000000)
-
-#define NXT_DIYFP_SIGNIFICAND_SIZE  64
-
-#define NXT_SIGNIFICAND_SIZE        53
-#define NXT_SIGNIFICAND_SHIFT       (NXT_DIYFP_SIGNIFICAND_SIZE     \
-                                     - NXT_DBL_SIGNIFICAND_SIZE)
-
-#define NXT_DECIMAL_EXPONENT_OFF    348
-#define NXT_DECIMAL_EXPONENT_MIN    (-348)
-#define NXT_DECIMAL_EXPONENT_MAX    340
-#define NXT_DECIMAL_EXPONENT_DIST   8
-
-
-nxt_inline nxt_diyfp_t
-nxt_d2diyfp(double d)
-{
-    int           biased_exp;
-    uint64_t      significand;
-    nxt_diyfp_t   r;
-
-    union {
-        double    d;
-        uint64_t  u64;
-    } u;
-
-    u.d = d;
-
-    biased_exp = (u.u64 & NXT_DBL_EXPONENT_MASK) >> NXT_DBL_SIGNIFICAND_SIZE;
-    significand = u.u64 & NXT_DBL_SIGNIFICAND_MASK;
-
-    if (biased_exp != 0) {
-        r.significand = significand + NXT_DBL_HIDDEN_BIT;
-        r.exp = biased_exp - NXT_DBL_EXPONENT_BIAS;
-
-    } else {
-        r.significand = significand;
-        r.exp = NXT_DBL_EXPONENT_MIN + 1;
-    }
-
-    return r;
-}
-
-
-nxt_inline double
-nxt_diyfp2d(nxt_diyfp_t v)
-{
-    int           exp;
-    uint64_t      significand, biased_exp;
-
-    union {
-        double    d;
-        uint64_t  u64;
-    } u;
-
-    exp = v.exp;
-    significand = v.significand;
-
-    while (significand > NXT_DBL_HIDDEN_BIT + NXT_DBL_SIGNIFICAND_MASK) {
-        significand >>= 1;
-        exp++;
-    }
-
-    if (exp >= NXT_DBL_EXPONENT_MAX) {
-        return INFINITY;
-    }
-
-    if (exp < NXT_DBL_EXPONENT_DENORMAL) {
-        return 0.0;
-    }
-
-    while (exp > NXT_DBL_EXPONENT_DENORMAL
-           && (significand & NXT_DBL_HIDDEN_BIT) == 0)
-    {
-        significand <<= 1;
-        exp--;
-    }
-
-    if (exp == NXT_DBL_EXPONENT_DENORMAL
-        && (significand & NXT_DBL_HIDDEN_BIT) == 0)
-    {
-        biased_exp = 0;
-
-    } else {
-        biased_exp = (uint64_t) (exp + NXT_DBL_EXPONENT_BIAS);
-    }
-
-    u.u64 = (significand & NXT_DBL_SIGNIFICAND_MASK)
-            | (biased_exp << NXT_DBL_SIGNIFICAND_SIZE);
-
-    return u.d;
-}
-
-
-nxt_inline nxt_diyfp_t
-nxt_diyfp_shift_left(nxt_diyfp_t v, unsigned shift)
-{
-    return nxt_diyfp(v.significand << shift, v.exp - shift);
-}
-
-
-nxt_inline nxt_diyfp_t
-nxt_diyfp_shift_right(nxt_diyfp_t v, unsigned shift)
-{
-    return nxt_diyfp(v.significand >> shift, v.exp + shift);
-}
-
-
-nxt_inline nxt_diyfp_t
-nxt_diyfp_sub(nxt_diyfp_t lhs, nxt_diyfp_t rhs)
-{
-    return nxt_diyfp(lhs.significand - rhs.significand, lhs.exp);
-}
-
-
-nxt_inline nxt_diyfp_t
-nxt_diyfp_mul(nxt_diyfp_t lhs, nxt_diyfp_t rhs)
-{
-#if (NXT_HAVE_UNSIGNED_INT128)
-
-    uint64_t       l, h;
-    nxt_uint128_t  u128;
-
-    u128 = (nxt_uint128_t) (lhs.significand)
-           * (nxt_uint128_t) (rhs.significand);
-
-    h = u128 >> 64;
-    l = (uint64_t) u128;
-
-    /* rounding. */
-
-    if (l & ((uint64_t) 1 << 63)) {
-        h++;
-    }
-
-    return nxt_diyfp(h, lhs.exp + rhs.exp + 64);
-
-#else
-
-    uint64_t  a, b, c, d, ac, bc, ad, bd, tmp;
-
-    a = lhs.significand >> 32;
-    b = lhs.significand & 0xffffffff;
-    c = rhs.significand >> 32;
-    d = rhs.significand & 0xffffffff;
-
-    ac = a * c;
-    bc = b * c;
-    ad = a * d;
-    bd = b * d;
-
-    tmp = (bd >> 32) + (ad & 0xffffffff) + (bc & 0xffffffff);
-
-    /* mult_round. */
-
-    tmp += 1U << 31;
-
-    return nxt_diyfp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32),
-                     lhs.exp + rhs.exp + 64);
-
-#endif
-}
-
-
-nxt_inline nxt_diyfp_t
-nxt_diyfp_normalize(nxt_diyfp_t v)
-{
-    return nxt_diyfp_shift_left(v, nxt_leading_zeros64(v.significand));
-}
-
-
-nxt_diyfp_t nxt_cached_power_dec(int exp, int *dec_exp);
-nxt_diyfp_t nxt_cached_power_bin(int exp, int *dec_exp);
-
-
-#endif /* _NXT_DIYFP_H_INCLUDED_ */
diff --git a/nxt/nxt_djb_hash.c b/nxt/nxt_djb_hash.c
deleted file mode 100644 (file)
index 05f1b80..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_djb_hash.h>
-
-
-uint32_t
-nxt_djb_hash(const void *data, size_t len)
-{
-    uint32_t      hash;
-    const u_char  *p;
-
-    p = data;
-    hash = NXT_DJB_HASH_INIT;
-
-    while (len != 0) {
-        hash = nxt_djb_hash_add(hash, *p++);
-        len--;
-    }
-
-    return hash;
-}
-
-
-uint32_t
-nxt_djb_hash_lowcase(const void *data, size_t len)
-{
-    uint32_t      hash;
-    const u_char  *p;
-
-    p = data;
-    hash = NXT_DJB_HASH_INIT;
-
-    while (len != 0) {
-        hash = nxt_djb_hash_add(hash, nxt_lower_case(*p++));
-        len--;
-    }
-
-    return hash;
-}
diff --git a/nxt/nxt_djb_hash.h b/nxt/nxt_djb_hash.h
deleted file mode 100644 (file)
index 43395e6..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_DJB_HASH_H_INCLUDED_
-#define _NXT_DJB_HASH_H_INCLUDED_
-
-
-/* A fast and simple hash function by Daniel J. Bernstein. */
-
-
-NXT_EXPORT uint32_t nxt_djb_hash(const void *data, size_t len);
-NXT_EXPORT uint32_t nxt_djb_hash_lowcase(const void *data, size_t len);
-
-
-#define NXT_DJB_HASH_INIT  5381
-
-
-#define nxt_djb_hash_add(hash, val)                                           \
-    ((uint32_t) ((((hash) << 5) + (hash)) ^ (uint32_t) (val)))
-
-
-#endif /* _NXT_DJB_HASH_H_INCLUDED_ */
diff --git a/nxt/nxt_dtoa.h b/nxt/nxt_dtoa.h
deleted file mode 100644 (file)
index 9f6c1e2..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-
-/*
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) Nginx, Inc.
- */
-
-#ifndef _NXT_DTOA_H_INCLUDED_
-#define _NXT_DTOA_H_INCLUDED_
-
-NXT_EXPORT size_t nxt_dtoa(double value, char* buffer);
-
-#endif /* _NXT_DTOA_H_INCLUDED_ */
diff --git a/nxt/nxt_file.h b/nxt/nxt_file.h
deleted file mode 100644 (file)
index 3c603cc..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_FILE_H_INCLUDED_
-#define _NXT_FILE_H_INCLUDED_
-
-
-void nxt_file_basename(const nxt_str_t *path, nxt_str_t *name);
-void nxt_file_dirname(const nxt_str_t *path, nxt_str_t *name);
-
-
-#endif /* _NXT_FILE_H_INCLUDED_ */
diff --git a/nxt/nxt_lvlhsh.c b/nxt/nxt_lvlhsh.c
deleted file mode 100644 (file)
index 916a512..0000000
+++ /dev/null
@@ -1,859 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_lvlhsh.h>
-#include <string.h>
-
-
-/*
- * The level hash consists of hierarchical levels of arrays of pointers.
- * The pointers may point to another level, a bucket, or NULL.
- * The levels and buckets must be allocated in manner alike posix_memalign()
- * to bookkeep additional information in pointer low bits.
- *
- * A level is an array of pointers.  Its size is a power of 2.  Levels
- * may be different sizes, but on the same level the sizes are the same.
- * Level sizes are specified by number of bits per level in lvlhsh->shift
- * array.  A hash may have up to 7 levels.  There are two predefined
- * shift arrays given by the first two shift array values:
- *
- * 1) [0, 0]:  [4, 4, 4, 4, 4, 4, 4] on a 64-bit platform or
- *             [5, 5, 5, 5, 5, 5, 0] on a 32-bit platform,
- *    so default size of levels is 128 bytes.
- *
- * 2) [0, 10]: [10, 4, 4, 4, 4, 4, 0] on a 64-bit platform or
- *             [10, 5, 5, 5, 5, 0, 0] on a 32-bit platform,
- *    so default size of levels is 128 bytes on all levels except
- *    the first level.  The first level is 8K or 4K on 64-bit or 32-bit
- *    platforms respectively.
- *
- * All buckets in a hash are the same size which is a power of 2.
- * A bucket contains several entries stored and tested sequentially.
- * The bucket size should be one or two CPU cache line size, a minimum
- * allowed size is 32 bytes.  A default 128-byte bucket contains 10 64-bit
- * entries or 15 32-bit entries.  Each entry consists of pointer to value
- * data and 32-bit key.  If an entry value pointer is NULL, the entry is free.
- * On a 64-bit platform entry value pointers are no aligned, therefore they
- * are accessed as two 32-bit integers.  The rest trailing space in a bucket
- * is used as pointer to next bucket and this pointer is always aligned.
- * Although the level hash allows to store a lot of values in a bucket chain,
- * this is non optimal way.  The large data set should be stored using
- * several levels.
- */
-
-#define nxt_lvlhsh_is_bucket(p)                                               \
-    ((uintptr_t) (p) & 1)
-
-
-#define nxt_lvlhsh_count_inc(n)                                               \
-    n = (void *) ((uintptr_t) (n) + 2)
-
-
-#define nxt_lvlhsh_count_dec(n)                                               \
-    n = (void *) ((uintptr_t) (n) - 2)
-
-
-#define nxt_lvlhsh_level_size(proto, nlvl)                                    \
-    ((uintptr_t) 1 << proto->shift[nlvl])
-
-
-#define nxt_lvlhsh_level(lvl, mask)                                           \
-    (void **) ((uintptr_t) lvl & (~mask << 2))
-
-
-#define nxt_lvlhsh_level_entries(lvl, mask)                                   \
-    ((uintptr_t) lvl & (mask << 1))
-
-
-#define nxt_lvlhsh_store_bucket(slot, bkt)                                    \
-    slot = (void **) ((uintptr_t) bkt | 2 | 1)
-
-
-#define nxt_lvlhsh_bucket_size(proto)                                         \
-    proto->bucket_size
-
-
-#define nxt_lvlhsh_bucket(proto, bkt)                                         \
-    (uint32_t *) ((uintptr_t) bkt & ~(uintptr_t) proto->bucket_mask)
-
-
-#define nxt_lvlhsh_bucket_entries(proto, bkt)                                 \
-    (((uintptr_t) bkt & (uintptr_t) proto->bucket_mask) >> 1)
-
-
-#define nxt_lvlhsh_bucket_end(proto, bkt)                                     \
-    &bkt[proto->bucket_end]
-
-
-#define nxt_lvlhsh_free_entry(e)                                              \
-    (!(nxt_lvlhsh_valid_entry(e)))
-
-
-#define nxt_lvlhsh_next_bucket(proto, bkt)                                    \
-    ((void **) &bkt[proto->bucket_end])
-
-#if (NXT_64BIT)
-
-#define nxt_lvlhsh_valid_entry(e)                                             \
-    (((e)[0] | (e)[1]) != 0)
-
-
-#define nxt_lvlhsh_entry_value(e)                                             \
-    (void *) (((uintptr_t) (e)[1] << 32) + (e)[0])
-
-
-#define nxt_lvlhsh_set_entry_value(e, n)                                      \
-    (e)[0] = (uint32_t)  (uintptr_t) n;                                       \
-    (e)[1] = (uint32_t) ((uintptr_t) n >> 32)
-
-
-#define nxt_lvlhsh_entry_key(e)                                               \
-    (e)[2]
-
-
-#define nxt_lvlhsh_set_entry_key(e, n)                                        \
-    (e)[2] = n
-
-#else
-
-#define nxt_lvlhsh_valid_entry(e)                                             \
-    ((e)[0] != 0)
-
-
-#define nxt_lvlhsh_entry_value(e)                                             \
-    (void *) (e)[0]
-
-
-#define nxt_lvlhsh_set_entry_value(e, n)                                      \
-    (e)[0] = (uint32_t) n
-
-
-#define nxt_lvlhsh_entry_key(e)                                               \
-    (e)[1]
-
-
-#define nxt_lvlhsh_set_entry_key(e, n)                                        \
-    (e)[1] = n
-
-#endif
-
-
-#define NXT_LVLHSH_BUCKET_DONE  ((void *) -1)
-
-
-static nxt_int_t nxt_lvlhsh_level_find(nxt_lvlhsh_query_t *lhq, void **lvl,
-    uint32_t key, nxt_uint_t nlvl);
-static nxt_int_t nxt_lvlhsh_bucket_find(nxt_lvlhsh_query_t *lhq, void **bkt);
-static nxt_int_t nxt_lvlhsh_new_bucket(nxt_lvlhsh_query_t *lhq, void **slot);
-static nxt_int_t nxt_lvlhsh_level_insert(nxt_lvlhsh_query_t *lhq,
-    void **slot, uint32_t key, nxt_uint_t nlvl);
-static nxt_int_t nxt_lvlhsh_bucket_insert(nxt_lvlhsh_query_t *lhq,
-    void **slot, uint32_t key, nxt_int_t nlvl);
-static nxt_int_t nxt_lvlhsh_convert_bucket_to_level(nxt_lvlhsh_query_t *lhq,
-    void **slot, nxt_uint_t nlvl, uint32_t *bucket);
-static nxt_int_t nxt_lvlhsh_level_convertion_insert(nxt_lvlhsh_query_t *lhq,
-    void **parent, uint32_t key, nxt_uint_t nlvl);
-static nxt_int_t nxt_lvlhsh_bucket_convertion_insert(nxt_lvlhsh_query_t *lhq,
-    void **slot, uint32_t key, nxt_int_t nlvl);
-static nxt_int_t nxt_lvlhsh_free_level(nxt_lvlhsh_query_t *lhq, void **level,
-    nxt_uint_t size);
-static nxt_int_t nxt_lvlhsh_level_delete(nxt_lvlhsh_query_t *lhq, void **slot,
-    uint32_t key, nxt_uint_t nlvl);
-static nxt_int_t nxt_lvlhsh_bucket_delete(nxt_lvlhsh_query_t *lhq, void **bkt);
-static void *nxt_lvlhsh_level_each(nxt_lvlhsh_each_t *lhe, void **level,
-    nxt_uint_t nlvl, nxt_uint_t shift);
-static void *nxt_lvlhsh_bucket_each(nxt_lvlhsh_each_t *lhe);
-
-
-nxt_int_t
-nxt_lvlhsh_find(const nxt_lvlhsh_t *lh, nxt_lvlhsh_query_t *lhq)
-{
-    void  *slot;
-
-    slot = lh->slot;
-
-    if (nxt_fast_path(slot != NULL)) {
-
-        if (nxt_lvlhsh_is_bucket(slot)) {
-            return nxt_lvlhsh_bucket_find(lhq, slot);
-        }
-
-        return nxt_lvlhsh_level_find(lhq, slot, lhq->key_hash, 0);
-    }
-
-    return NXT_DECLINED;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_level_find(nxt_lvlhsh_query_t *lhq, void **lvl, uint32_t key,
-    nxt_uint_t nlvl)
-{
-    void        **slot;
-    uintptr_t   mask;
-    nxt_uint_t  shift;
-
-    shift = lhq->proto->shift[nlvl];
-    mask = ((uintptr_t) 1 << shift) - 1;
-
-    lvl = nxt_lvlhsh_level(lvl, mask);
-    slot = lvl[key & mask];
-
-    if (slot != NULL) {
-
-        if (nxt_lvlhsh_is_bucket(slot)) {
-            return nxt_lvlhsh_bucket_find(lhq, slot);
-        }
-
-        return nxt_lvlhsh_level_find(lhq, slot, key >> shift, nlvl + 1);
-    }
-
-    return NXT_DECLINED;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_bucket_find(nxt_lvlhsh_query_t *lhq, void **bkt)
-{
-    void        *value;
-    uint32_t    *bucket, *e;
-    nxt_uint_t  n;
-
-    do {
-        bucket = nxt_lvlhsh_bucket(lhq->proto, bkt);
-        n = nxt_lvlhsh_bucket_entries(lhq->proto, bkt);
-        e = bucket;
-
-        do {
-            if (nxt_lvlhsh_valid_entry(e)) {
-                n--;
-
-                if (nxt_lvlhsh_entry_key(e) == lhq->key_hash) {
-
-                    value = nxt_lvlhsh_entry_value(e);
-
-                    if (lhq->proto->test(lhq, value) == NXT_OK) {
-                        lhq->value = value;
-
-                        return NXT_OK;
-                    }
-                }
-            }
-
-            e += NXT_LVLHSH_ENTRY_SIZE;
-
-        } while (n != 0);
-
-        bkt = *nxt_lvlhsh_next_bucket(lhq->proto, bucket);
-
-    } while (bkt != NULL);
-
-    return NXT_DECLINED;
-}
-
-
-nxt_int_t
-nxt_lvlhsh_insert(nxt_lvlhsh_t *lh, nxt_lvlhsh_query_t *lhq)
-{
-    uint32_t  key;
-
-    if (nxt_fast_path(lh->slot != NULL)) {
-
-        key = lhq->key_hash;
-
-        if (nxt_lvlhsh_is_bucket(lh->slot)) {
-            return nxt_lvlhsh_bucket_insert(lhq, &lh->slot, key, -1);
-        }
-
-        return nxt_lvlhsh_level_insert(lhq, &lh->slot, key, 0);
-    }
-
-    return nxt_lvlhsh_new_bucket(lhq, &lh->slot);
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_new_bucket(nxt_lvlhsh_query_t *lhq, void **slot)
-{
-    uint32_t  *bucket;
-
-    bucket = lhq->proto->alloc(lhq->pool, nxt_lvlhsh_bucket_size(lhq->proto));
-
-    if (nxt_fast_path(bucket != NULL)) {
-
-        nxt_lvlhsh_set_entry_value(bucket, lhq->value);
-        nxt_lvlhsh_set_entry_key(bucket, lhq->key_hash);
-
-        *nxt_lvlhsh_next_bucket(lhq->proto, bucket) = NULL;
-
-        nxt_lvlhsh_store_bucket(*slot, bucket);
-
-        return NXT_OK;
-    }
-
-    return NXT_ERROR;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_level_insert(nxt_lvlhsh_query_t *lhq, void **parent, uint32_t key,
-    nxt_uint_t nlvl)
-{
-    void        **slot, **lvl;
-    nxt_int_t   ret;
-    uintptr_t   mask;
-    nxt_uint_t  shift;
-
-    shift = lhq->proto->shift[nlvl];
-    mask = ((uintptr_t) 1 << shift) - 1;
-
-    lvl = nxt_lvlhsh_level(*parent, mask);
-    slot = &lvl[key & mask];
-
-    if (*slot != NULL) {
-        key >>= shift;
-
-        if (nxt_lvlhsh_is_bucket(*slot)) {
-            return nxt_lvlhsh_bucket_insert(lhq, slot, key, nlvl);
-        }
-
-        return nxt_lvlhsh_level_insert(lhq, slot, key, nlvl + 1);
-    }
-
-    ret = nxt_lvlhsh_new_bucket(lhq, slot);
-
-    if (nxt_fast_path(ret == NXT_OK)) {
-        nxt_lvlhsh_count_inc(*parent);
-    }
-
-    return ret;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_bucket_insert(nxt_lvlhsh_query_t *lhq, void **slot, uint32_t key,
-    nxt_int_t nlvl)
-{
-    void                      **bkt, **vacant_bucket, *value;
-    uint32_t                  *bucket, *e, *vacant_entry;
-    nxt_int_t                 ret;
-    uintptr_t                 n;
-    const void                *new_value;
-    const nxt_lvlhsh_proto_t  *proto;
-
-    bkt = slot;
-    vacant_entry = NULL;
-    vacant_bucket = NULL;
-    proto = lhq->proto;
-
-    /* Search for duplicate entry in bucket chain. */
-
-    do {
-        bucket = nxt_lvlhsh_bucket(proto, *bkt);
-        n = nxt_lvlhsh_bucket_entries(proto, *bkt);
-        e = bucket;
-
-        do {
-            if (nxt_lvlhsh_valid_entry(e)) {
-
-                if (nxt_lvlhsh_entry_key(e) == lhq->key_hash) {
-
-                    value = nxt_lvlhsh_entry_value(e);
-
-                    if (proto->test(lhq, value) == NXT_OK) {
-
-                        new_value = lhq->value;
-                        lhq->value = value;
-
-                        if (lhq->replace) {
-                            nxt_lvlhsh_set_entry_value(e, new_value);
-
-                            return NXT_OK;
-                        }
-
-                        return NXT_DECLINED;
-                    }
-                }
-
-                n--;
-
-            } else {
-                /*
-                 * Save a hole vacant position in bucket
-                 * and continue to search for duplicate entry.
-                 */
-                if (vacant_entry == NULL) {
-                    vacant_entry = e;
-                    vacant_bucket = bkt;
-                }
-            }
-
-            e += NXT_LVLHSH_ENTRY_SIZE;
-
-        } while (n != 0);
-
-        if (e < nxt_lvlhsh_bucket_end(proto, bucket)) {
-            /*
-             * Save a vacant position on incomplete bucket's end
-             * and continue to search for duplicate entry.
-             */
-            if (vacant_entry == NULL) {
-                vacant_entry = e;
-                vacant_bucket = bkt;
-            }
-        }
-
-        bkt = nxt_lvlhsh_next_bucket(proto, bucket);
-
-    } while (*bkt != NULL);
-
-    if (vacant_entry != NULL) {
-        nxt_lvlhsh_set_entry_value(vacant_entry, lhq->value);
-        nxt_lvlhsh_set_entry_key(vacant_entry, lhq->key_hash);
-        nxt_lvlhsh_count_inc(*vacant_bucket);
-
-        return NXT_OK;
-    }
-
-    /* All buckets are full. */
-
-    nlvl++;
-
-    if (nxt_fast_path(proto->shift[nlvl] != 0)) {
-
-        ret = nxt_lvlhsh_convert_bucket_to_level(lhq, slot, nlvl, bucket);
-
-        if (nxt_fast_path(ret == NXT_OK)) {
-            return nxt_lvlhsh_level_insert(lhq, slot, key, nlvl);
-        }
-
-        return ret;
-    }
-
-    /* The last allowed level, only buckets may be allocated here. */
-
-    return nxt_lvlhsh_new_bucket(lhq, bkt);
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_convert_bucket_to_level(nxt_lvlhsh_query_t *lhq, void **slot,
-    nxt_uint_t nlvl, uint32_t *bucket)
-{
-    void                      *lvl, **level;
-    uint32_t                  *e, *end, key;
-    nxt_int_t                 ret;
-    nxt_uint_t                i, shift, size;
-    nxt_lvlhsh_query_t        q;
-    const nxt_lvlhsh_proto_t  *proto;
-
-    proto = lhq->proto;
-    size = nxt_lvlhsh_level_size(proto, nlvl);
-
-    lvl = proto->alloc(lhq->pool, size * (sizeof(void *)));
-
-    if (nxt_slow_path(lvl == NULL)) {
-        return NXT_ERROR;
-    }
-
-    nxt_memzero(lvl, size * (sizeof(void *)));
-
-    level = lvl;
-    shift = 0;
-
-    for (i = 0; i < nlvl; i++) {
-        /*
-         * Using SIMD operations in this trivial loop with maximum
-         * 8 iterations may increase code size by 170 bytes.
-         */
-        nxt_pragma_loop_disable_vectorization;
-
-        shift += proto->shift[i];
-    }
-
-    end = nxt_lvlhsh_bucket_end(proto, bucket);
-
-    for (e = bucket; e < end; e += NXT_LVLHSH_ENTRY_SIZE) {
-
-        q.proto = proto;
-        q.pool = lhq->pool;
-        q.value = nxt_lvlhsh_entry_value(e);
-        key = nxt_lvlhsh_entry_key(e);
-        q.key_hash = key;
-
-        ret = nxt_lvlhsh_level_convertion_insert(&q, &lvl, key >> shift, nlvl);
-
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return nxt_lvlhsh_free_level(lhq, level, size);
-        }
-    }
-
-    *slot = lvl;
-
-    proto->free(lhq->pool, bucket, nxt_lvlhsh_bucket_size(proto));
-
-    return NXT_OK;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_level_convertion_insert(nxt_lvlhsh_query_t *lhq, void **parent,
-    uint32_t key, nxt_uint_t nlvl)
-{
-    void        **slot, **lvl;
-    nxt_int_t   ret;
-    uintptr_t   mask;
-    nxt_uint_t  shift;
-
-    shift = lhq->proto->shift[nlvl];
-    mask = ((uintptr_t) 1 << shift) - 1;
-
-    lvl = nxt_lvlhsh_level(*parent, mask);
-    slot = &lvl[key & mask];
-
-    if (*slot == NULL) {
-        ret = nxt_lvlhsh_new_bucket(lhq, slot);
-
-        if (nxt_fast_path(ret == NXT_OK)) {
-            nxt_lvlhsh_count_inc(*parent);
-        }
-
-        return ret;
-    }
-
-    /* Only backets can be here. */
-
-    return nxt_lvlhsh_bucket_convertion_insert(lhq, slot, key >> shift, nlvl);
-}
-
-
-/*
- * The special bucket insertion procedure is required because during
- * convertion lhq->key contains garbage values and the test function
- * cannot be called.  Besides, the procedure can be simpler because
- * a new entry is inserted just after occupied entries.
- */
-
-static nxt_int_t
-nxt_lvlhsh_bucket_convertion_insert(nxt_lvlhsh_query_t *lhq, void **slot,
-    uint32_t key, nxt_int_t nlvl)
-{
-    void                      **bkt;
-    uint32_t                  *bucket, *e;
-    nxt_int_t                 ret;
-    uintptr_t                 n;
-    const nxt_lvlhsh_proto_t  *proto;
-
-    bkt = slot;
-    proto = lhq->proto;
-
-    do {
-        bucket = nxt_lvlhsh_bucket(proto, *bkt);
-        n = nxt_lvlhsh_bucket_entries(proto, *bkt);
-        e = bucket + n * NXT_LVLHSH_ENTRY_SIZE;
-
-        if (nxt_fast_path(e < nxt_lvlhsh_bucket_end(proto, bucket))) {
-
-            nxt_lvlhsh_set_entry_value(e, lhq->value);
-            nxt_lvlhsh_set_entry_key(e, lhq->key_hash);
-            nxt_lvlhsh_count_inc(*bkt);
-
-            return NXT_OK;
-        }
-
-        bkt = nxt_lvlhsh_next_bucket(proto, bucket);
-
-    } while (*bkt != NULL);
-
-    /* All buckets are full. */
-
-    nlvl++;
-
-    if (nxt_fast_path(proto->shift[nlvl] != 0)) {
-
-        ret = nxt_lvlhsh_convert_bucket_to_level(lhq, slot, nlvl, bucket);
-
-        if (nxt_fast_path(ret == NXT_OK)) {
-            return nxt_lvlhsh_level_insert(lhq, slot, key, nlvl);
-        }
-
-        return ret;
-    }
-
-    /* The last allowed level, only buckets may be allocated here. */
-
-    return nxt_lvlhsh_new_bucket(lhq, bkt);
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_free_level(nxt_lvlhsh_query_t *lhq, void **level, nxt_uint_t size)
-{
-    size_t                    bsize;
-    nxt_uint_t                i;
-    const nxt_lvlhsh_proto_t  *proto;
-
-    proto = lhq->proto;
-    bsize = nxt_lvlhsh_bucket_size(proto);
-
-    for (i = 0; i < size; i++) {
-
-        if (level[i] != NULL) {
-            /*
-             * Chained buckets are not possible here, since even
-             * in the worst case one bucket cannot be converted
-             * in two chained buckets but remains the same bucket.
-             */
-            proto->free(lhq->pool, nxt_lvlhsh_bucket(proto, level[i]), bsize);
-        }
-    }
-
-    proto->free(lhq->pool, level, size * (sizeof(void *)));
-
-    return NXT_ERROR;
-}
-
-
-nxt_int_t
-nxt_lvlhsh_delete(nxt_lvlhsh_t *lh, nxt_lvlhsh_query_t *lhq)
-{
-    if (nxt_fast_path(lh->slot != NULL)) {
-
-        if (nxt_lvlhsh_is_bucket(lh->slot)) {
-            return nxt_lvlhsh_bucket_delete(lhq, &lh->slot);
-        }
-
-        return nxt_lvlhsh_level_delete(lhq, &lh->slot, lhq->key_hash, 0);
-    }
-
-    return NXT_DECLINED;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_level_delete(nxt_lvlhsh_query_t *lhq, void **parent, uint32_t key,
-    nxt_uint_t nlvl)
-{
-    size_t      size;
-    void        **slot, **lvl;
-    uintptr_t   mask;
-    nxt_int_t   ret;
-    nxt_uint_t  shift;
-
-    shift = lhq->proto->shift[nlvl];
-    mask = ((uintptr_t) 1 << shift) - 1;
-
-    lvl = nxt_lvlhsh_level(*parent, mask);
-    slot = &lvl[key & mask];
-
-    if (*slot != NULL) {
-
-        if (nxt_lvlhsh_is_bucket(*slot)) {
-            ret = nxt_lvlhsh_bucket_delete(lhq, slot);
-
-        } else {
-            key >>= shift;
-            ret = nxt_lvlhsh_level_delete(lhq, slot, key, nlvl + 1);
-        }
-
-        if (*slot == NULL) {
-            nxt_lvlhsh_count_dec(*parent);
-
-            if (nxt_lvlhsh_level_entries(*parent, mask) == 0) {
-                *parent = NULL;
-                size = nxt_lvlhsh_level_size(lhq->proto, nlvl);
-                lhq->proto->free(lhq->pool, lvl, size * sizeof(void *));
-            }
-        }
-
-        return ret;
-    }
-
-    return NXT_DECLINED;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_bucket_delete(nxt_lvlhsh_query_t *lhq, void **bkt)
-{
-    void                      *value;
-    size_t                    size;
-    uint32_t                  *bucket, *e;
-    uintptr_t                 n;
-    const nxt_lvlhsh_proto_t  *proto;
-
-    proto = lhq->proto;
-
-    do {
-        bucket = nxt_lvlhsh_bucket(proto, *bkt);
-        n = nxt_lvlhsh_bucket_entries(proto, *bkt);
-        e = bucket;
-
-        do {
-            if (nxt_lvlhsh_valid_entry(e)) {
-
-                if (nxt_lvlhsh_entry_key(e) == lhq->key_hash) {
-
-                    value = nxt_lvlhsh_entry_value(e);
-
-                    if (proto->test(lhq, value) == NXT_OK) {
-
-                        if (nxt_lvlhsh_bucket_entries(proto, *bkt) == 1) {
-                            *bkt = *nxt_lvlhsh_next_bucket(proto, bucket);
-                            size = nxt_lvlhsh_bucket_size(proto);
-                            proto->free(lhq->pool, bucket, size);
-
-                        } else {
-                            nxt_lvlhsh_count_dec(*bkt);
-                            nxt_lvlhsh_set_entry_value(e, NULL);
-                        }
-
-                        lhq->value = value;
-
-                        return NXT_OK;
-                    }
-                }
-
-                n--;
-            }
-
-            e += NXT_LVLHSH_ENTRY_SIZE;
-
-        } while (n != 0);
-
-        bkt = nxt_lvlhsh_next_bucket(proto, bucket);
-
-    } while (*bkt != NULL);
-
-    return NXT_DECLINED;
-}
-
-
-void *
-nxt_lvlhsh_each(const nxt_lvlhsh_t *lh, nxt_lvlhsh_each_t *lhe)
-{
-    void  **slot;
-
-    if (lhe->bucket == NXT_LVLHSH_BUCKET_DONE) {
-        slot = lh->slot;
-
-        if (nxt_lvlhsh_is_bucket(slot)) {
-            return NULL;
-        }
-
-    } else {
-        if (nxt_slow_path(lhe->bucket == NULL)) {
-
-            /* The first iteration only. */
-
-            slot = lh->slot;
-
-            if (slot == NULL) {
-                return NULL;
-            }
-
-            if (!nxt_lvlhsh_is_bucket(slot)) {
-                goto level;
-            }
-
-            lhe->bucket = nxt_lvlhsh_bucket(lhe->proto, slot);
-            lhe->entries = nxt_lvlhsh_bucket_entries(lhe->proto, slot);
-        }
-
-        return nxt_lvlhsh_bucket_each(lhe);
-    }
-
-level:
-
-    return nxt_lvlhsh_level_each(lhe, slot, 0, 0);
-}
-
-
-static void *
-nxt_lvlhsh_level_each(nxt_lvlhsh_each_t *lhe, void **level, nxt_uint_t nlvl,
-    nxt_uint_t shift)
-{
-    void        **slot, *value;
-    uintptr_t   mask;
-    nxt_uint_t  n, level_shift;
-
-    level_shift = lhe->proto->shift[nlvl];
-    mask = ((uintptr_t) 1 << level_shift) - 1;
-
-    level = nxt_lvlhsh_level(level, mask);
-
-    do {
-        n = (lhe->current >> shift) & mask;
-        slot = level[n];
-
-        if (slot != NULL) {
-            if (nxt_lvlhsh_is_bucket(slot)) {
-
-                if (lhe->bucket != NXT_LVLHSH_BUCKET_DONE) {
-
-                    lhe->bucket = nxt_lvlhsh_bucket(lhe->proto, slot);
-                    lhe->entries = nxt_lvlhsh_bucket_entries(lhe->proto, slot);
-                    lhe->entry = 0;
-
-                    return nxt_lvlhsh_bucket_each(lhe);
-                }
-
-                lhe->bucket = NULL;
-
-            } else {
-                value = nxt_lvlhsh_level_each(lhe, slot, nlvl + 1,
-                                              shift + level_shift);
-                if (value != NULL) {
-                    return value;
-                }
-            }
-        }
-
-        lhe->current &= ~(mask << shift);
-        n = ((n + 1) & mask) << shift;
-        lhe->current |= n;
-
-    } while (n != 0);
-
-    return NULL;
-}
-
-
-static void *
-nxt_lvlhsh_bucket_each(nxt_lvlhsh_each_t *lhe)
-{
-    void      *value, **next;
-    uint32_t  *bucket;
-
-    /* At least one valid entry must present here. */
-    do {
-        bucket = &lhe->bucket[lhe->entry];
-        lhe->entry += NXT_LVLHSH_ENTRY_SIZE;
-
-    } while (nxt_lvlhsh_free_entry(bucket));
-
-    value = nxt_lvlhsh_entry_value(bucket);
-    lhe->key_hash = nxt_lvlhsh_entry_key(bucket);
-
-    lhe->entries--;
-
-    if (lhe->entries == 0) {
-        next = *nxt_lvlhsh_next_bucket(lhe->proto, lhe->bucket);
-
-        lhe->bucket = (next == NULL) ? NXT_LVLHSH_BUCKET_DONE
-                                     : nxt_lvlhsh_bucket(lhe->proto, next);
-
-        lhe->entries = nxt_lvlhsh_bucket_entries(lhe->proto, next);
-        lhe->entry = 0;
-    }
-
-    return value;
-}
diff --git a/nxt/nxt_lvlhsh.h b/nxt/nxt_lvlhsh.h
deleted file mode 100644 (file)
index cc0343e..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_LVLHSH_H_INCLUDED_
-#define _NXT_LVLHSH_H_INCLUDED_
-
-
-typedef struct nxt_lvlhsh_query_s  nxt_lvlhsh_query_t;
-
-typedef nxt_int_t (*nxt_lvlhsh_test_t)(nxt_lvlhsh_query_t *lhq, void *data);
-typedef void *(*nxt_lvlhsh_alloc_t)(void *ctx, size_t size);
-typedef void (*nxt_lvlhsh_free_t)(void *ctx, void *p, size_t size);
-
-
-#if (NXT_64BIT)
-
-#define NXT_LVLHSH_DEFAULT_BUCKET_SIZE  128
-#define NXT_LVLHSH_ENTRY_SIZE           3
-
-/* 3 is shift of 64-bit pointer. */
-#define NXT_LVLHSH_MEMALIGN_SHIFT       (NXT_MAX_MEMALIGN_SHIFT - 3)
-
-#else
-
-#define NXT_LVLHSH_DEFAULT_BUCKET_SIZE  64
-#define NXT_LVLHSH_ENTRY_SIZE           2
-
-/* 2 is shift of 32-bit pointer. */
-#define NXT_LVLHSH_MEMALIGN_SHIFT       (NXT_MAX_MEMALIGN_SHIFT - 2)
-
-#endif
-
-
-#if (NXT_LVLHSH_MEMALIGN_SHIFT < 10)
-#define NXT_LVLHSH_MAX_MEMALIGN_SHIFT   NXT_LVLHSH_MEMALIGN_SHIFT
-#else
-#define NXT_LVLHSH_MAX_MEMALIGN_SHIFT   10
-#endif
-
-
-#define NXT_LVLHSH_BUCKET_END(bucket_size)                                    \
-    (((bucket_size) - sizeof(void *))                                         \
-        / (NXT_LVLHSH_ENTRY_SIZE * sizeof(uint32_t))                          \
-     * NXT_LVLHSH_ENTRY_SIZE)
-
-
-#define NXT_LVLHSH_BUCKET_SIZE(bucket_size)                                   \
-    NXT_LVLHSH_BUCKET_END(bucket_size), bucket_size, (bucket_size - 1)
-
-
-#define NXT_LVLHSH_DEFAULT                                                    \
-    NXT_LVLHSH_BUCKET_SIZE(NXT_LVLHSH_DEFAULT_BUCKET_SIZE),                   \
-    { 4, 4, 4, 4, 4, 4, 4, 0 }
-
-
-#define NXT_LVLHSH_LARGE_SLAB                                                 \
-    NXT_LVLHSH_BUCKET_SIZE(NXT_LVLHSH_DEFAULT_BUCKET_SIZE),                   \
-    { 10, 4, 4, 4, 4, 4, 4, 0 }
-
-
-#define NXT_LVLHSH_LARGE_MEMALIGN                                             \
-    NXT_LVLHSH_BUCKET_SIZE(NXT_LVLHSH_DEFAULT_BUCKET_SIZE),                   \
-    { NXT_LVLHSH_MAX_MEMALIGN_SHIFT, 4, 4, 4, 4, 0, 0, 0 }
-
-
-typedef struct {
-    uint32_t                  bucket_end;
-    uint32_t                  bucket_size;
-    uint32_t                  bucket_mask;
-    uint8_t                   shift[8];
-
-    nxt_lvlhsh_test_t         test;
-    nxt_lvlhsh_alloc_t        alloc;
-    nxt_lvlhsh_free_t         free;
-} nxt_lvlhsh_proto_t;
-
-
-typedef struct {
-    void                      *slot;
-} nxt_lvlhsh_t;
-
-
-struct nxt_lvlhsh_query_s {
-    uint32_t                  key_hash;
-    nxt_str_t                 key;
-
-    uint8_t                   replace;     /* 1 bit */
-    void                      *value;
-
-    const nxt_lvlhsh_proto_t  *proto;
-    void                      *pool;
-
-    /* Opaque data passed for the test function. */
-    void                      *data;
-};
-
-
-#define nxt_lvlhsh_is_empty(lh)                                               \
-    ((lh)->slot == NULL)
-
-
-#define nxt_lvlhsh_init(lh)                                                   \
-    (lh)->slot = NULL
-
-/*
- * nxt_lvlhsh_find() finds a hash element.  If the element has been
- * found then it is stored in the lhq->value and nxt_lvlhsh_find()
- * returns NXT_OK.  Otherwise NXT_DECLINED is returned.
- *
- * The required nxt_lvlhsh_query_t fields: key_hash, key, proto.
- */
-NXT_EXPORT nxt_int_t nxt_lvlhsh_find(const nxt_lvlhsh_t *lh,
-    nxt_lvlhsh_query_t *lhq);
-
-/*
- * nxt_lvlhsh_insert() adds a hash element.  If the element already
- * presents in lvlhsh and the lhq->replace flag is zero, then lhq->value
- * is updated with the old element and NXT_DECLINED is returned.
- * If the element already presents in lvlhsh and the lhq->replace flag
- * is non-zero, then the old element is replaced with the new element.
- * lhq->value is updated with the old element, and NXT_OK is returned.
- * If the element is not present in lvlhsh, then it is inserted and
- * NXT_OK is returned.  The lhq->value is not changed.
- * On memory allocation failure NXT_ERROR is returned.
- *
- * The required nxt_lvlhsh_query_t fields: key_hash, key, proto, replace, value.
- * The optional nxt_lvlhsh_query_t fields: pool.
- */
-NXT_EXPORT nxt_int_t nxt_lvlhsh_insert(nxt_lvlhsh_t *lh,
-    nxt_lvlhsh_query_t *lhq);
-
-/*
- * nxt_lvlhsh_delete() deletes a hash element.  If the element has been
- * found then it is removed from lvlhsh and is stored in the lhq->value,
- * and NXT_OK is returned.  Otherwise NXT_DECLINED is returned.
- *
- * The required nxt_lvlhsh_query_t fields: key_hash, key, proto.
- * The optional nxt_lvlhsh_query_t fields: pool.
- */
-NXT_EXPORT nxt_int_t nxt_lvlhsh_delete(nxt_lvlhsh_t *lh,
-    nxt_lvlhsh_query_t *lhq);
-
-
-typedef struct {
-    const nxt_lvlhsh_proto_t  *proto;
-
-    /*
-     * Fields to store current bucket entry position.  They cannot be
-     * combined in a single bucket pointer with number of entries in low
-     * bits, because entry positions are not aligned.  A current level is
-     * stored as key bit path from the root.
-     */
-    uint32_t                  *bucket;
-    uint32_t                  current;
-    uint32_t                  entry;
-    uint32_t                  entries;
-    uint32_t                  key_hash;
-} nxt_lvlhsh_each_t;
-
-
-#define nxt_lvlhsh_each_init(lhe, _proto)                                     \
-    do {                                                                      \
-        nxt_memzero(lhe, sizeof(nxt_lvlhsh_each_t));                          \
-        (lhe)->proto = _proto;                                                \
-    } while (0)
-
-NXT_EXPORT void *nxt_lvlhsh_each(const nxt_lvlhsh_t *lh,
-    nxt_lvlhsh_each_t *lhe);
-
-
-#endif /* _NXT_LVLHSH_H_INCLUDED_ */
diff --git a/nxt/nxt_malloc.h b/nxt/nxt_malloc.h
deleted file mode 100644 (file)
index 586274c..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_MALLOC_H_INCLUDED_
-#define _NXT_MALLOC_H_INCLUDED_
-
-#include <stdlib.h>
-
-/*
- * alloca() is defined in stdlib.h in Linux, FreeBSD and MacOSX
- * and in alloca.h in Linux, Solaris and MacOSX.
- */
-#if (NXT_SOLARIS)
-#include <alloca.h>
-#endif
-
-
-#define nxt_malloc(size)   malloc(size)
-#define nxt_free(p)        free(p)
-
-
-NXT_EXPORT void *nxt_memalign(size_t alignment, size_t size);
-
-
-#endif /* _NXT_MALLOC_H_INCLUDED_ */
diff --git a/nxt/nxt_md5.h b/nxt/nxt_md5.h
deleted file mode 100644 (file)
index 8c39d25..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) Nginx, Inc.
- */
-
-
-#ifndef _NXT_MD5_H_INCLUDED_
-#define _NXT_MD5_H_INCLUDED_
-
-
-typedef struct {
-    uint64_t  bytes;
-    uint32_t  a, b, c, d;
-    u_char    buffer[64];
-} nxt_md5_t;
-
-
-NXT_EXPORT void nxt_md5_init(nxt_md5_t *ctx);
-NXT_EXPORT void nxt_md5_update(nxt_md5_t *ctx, const void *data, size_t size);
-NXT_EXPORT void nxt_md5_final(u_char result[16], nxt_md5_t *ctx);
-
-#endif /* _NXT_MD5_H_INCLUDED_ */
diff --git a/nxt/nxt_mp.h b/nxt/nxt_mp.h
deleted file mode 100644 (file)
index 77a9b21..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_MP_H_INCLUDED_
-#define _NXT_MP_H_INCLUDED_
-
-
-typedef struct nxt_mp_s  nxt_mp_t;
-
-
-NXT_EXPORT nxt_mp_t *nxt_mp_create(const nxt_mem_proto_t *proto, void *mem,
-    void *trace, size_t cluster_size, size_t page_alignment, size_t page_size,
-    size_t min_chunk_size)
-    NXT_MALLOC_LIKE;
-NXT_EXPORT nxt_mp_t * nxt_mp_fast_create(const nxt_mem_proto_t *proto,
-    void *mem, void *trace, size_t cluster_size, size_t page_alignment,
-    size_t page_size, size_t min_chunk_size)
-    NXT_MALLOC_LIKE;
-NXT_EXPORT nxt_bool_t nxt_mp_is_empty(nxt_mp_t *mp);
-NXT_EXPORT void nxt_mp_destroy(nxt_mp_t *mp);
-
-NXT_EXPORT void *nxt_mp_alloc(nxt_mp_t *mp, size_t size)
-    NXT_MALLOC_LIKE;
-NXT_EXPORT void *nxt_mp_zalloc(nxt_mp_t *mp, size_t size)
-    NXT_MALLOC_LIKE;
-NXT_EXPORT void *nxt_mp_align(nxt_mp_t *mp, size_t alignment, size_t size)
-    NXT_MALLOC_LIKE;
-NXT_EXPORT void *nxt_mp_zalign(nxt_mp_t *mp,
-    size_t alignment, size_t size)
-    NXT_MALLOC_LIKE;
-NXT_EXPORT void nxt_mp_free(nxt_mp_t *mp, void *p);
-
-
-#endif /* _NXT_MP_H_INCLUDED_ */
diff --git a/nxt/nxt_murmur_hash.h b/nxt/nxt_murmur_hash.h
deleted file mode 100644 (file)
index 289dc5b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_MURMUR_HASH_H_INCLUDED_
-#define _NXT_MURMUR_HASH_H_INCLUDED_
-
-
-NXT_EXPORT uint32_t nxt_murmur_hash2(const void *data, size_t len);
-NXT_EXPORT uint32_t nxt_murmur_hash2_uint32(const void *data);
-
-
-#endif /* _NXT_MURMUR_HASH_H_INCLUDED_ */
diff --git a/nxt/nxt_queue.c b/nxt/nxt_queue.c
deleted file mode 100644 (file)
index de091ea..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_queue.h>
-
-
-/*
- * Find the middle queue element if the queue has odd number of elements,
- * or the first element of the queue's second part otherwise.
- */
-
-nxt_queue_link_t *
-nxt_queue_middle(nxt_queue_t *queue)
-{
-    nxt_queue_link_t  *middle, *next;
-
-    middle = nxt_queue_first(queue);
-
-    if (middle == nxt_queue_last(queue)) {
-        return middle;
-    }
-
-    next = middle;
-
-    for ( ;; ) {
-        middle = nxt_queue_next(middle);
-
-        next = nxt_queue_next(next);
-
-        if (next == nxt_queue_last(queue)) {
-            return middle;
-        }
-
-        next = nxt_queue_next(next);
-
-        if (next == nxt_queue_last(queue)) {
-            return middle;
-        }
-    }
-}
-
-
-/*
- * nxt_queue_sort() provides a stable sort because it uses the insertion
- * sort algorithm.  Its worst and average computational complexity is O^2.
- */
-
-void
-nxt_queue_sort(nxt_queue_t *queue,
-    nxt_int_t (*compare)(const void *data, const nxt_queue_link_t *,
-    const nxt_queue_link_t *), const void *data)
-{
-    nxt_queue_link_t  *link, *prev, *next;
-
-    link = nxt_queue_first(queue);
-
-    if (link == nxt_queue_last(queue)) {
-        return;
-    }
-
-    for (link = nxt_queue_next(link);
-         link != nxt_queue_tail(queue);
-         link = next)
-    {
-        prev = nxt_queue_prev(link);
-        next = nxt_queue_next(link);
-
-        nxt_queue_remove(link);
-
-        do {
-            if (compare(data, prev, link) <= 0) {
-                break;
-            }
-
-            prev = nxt_queue_prev(prev);
-
-        } while (prev != nxt_queue_head(queue));
-
-        nxt_queue_insert_after(prev, link);
-    }
-}
diff --git a/nxt/nxt_random.h b/nxt/nxt_random.h
deleted file mode 100644 (file)
index caa4ddb..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_RANDOM_H_INCLUDED_
-#define _NXT_RANDOM_H_INCLUDED_
-
-
-typedef struct {
-    int32_t    count;
-    nxt_pid_t  pid;
-    uint8_t    i;
-    uint8_t    j;
-    uint8_t    s[256];
-} nxt_random_t;
-
-
-/*
- * The nxt_random_t structure must be either initialized with zeros
- * or initialized by nxt_random_init() function.  The later is intended
- * mainly for unit test.  nxt_random() automatically stirs itself if
- * process pid changed after fork().  This pid testing can be disabled by
- * passing -1 as the pid argument to nxt_random_init() or nxt_random_stir()
- * functions.  The testing can be later enabled by passing any positive
- * number, for example, a real pid number.
- */
-
-NXT_EXPORT void nxt_random_init(nxt_random_t *r, nxt_pid_t pid);
-NXT_EXPORT void nxt_random_stir(nxt_random_t *r, nxt_pid_t pid);
-NXT_EXPORT void nxt_random_add(nxt_random_t *r, const u_char *key,
-    uint32_t len);
-NXT_EXPORT uint32_t nxt_random(nxt_random_t *r);
-
-
-#endif /* _NXT_RANDOM_H_INCLUDED_ */
diff --git a/nxt/nxt_rbtree.h b/nxt/nxt_rbtree.h
deleted file mode 100644 (file)
index 9501ad0..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_RBTREE_H_INCLUDED_
-#define _NXT_RBTREE_H_INCLUDED_
-
-
-typedef struct nxt_rbtree_node_s  nxt_rbtree_node_t;
-
-struct nxt_rbtree_node_s {
-    nxt_rbtree_node_t         *left;
-    nxt_rbtree_node_t         *right;
-    nxt_rbtree_node_t         *parent;
-
-    uint8_t                   color;
-};
-
-
-typedef struct {
-    nxt_rbtree_node_t         *left;
-    nxt_rbtree_node_t         *right;
-    nxt_rbtree_node_t         *parent;
-} nxt_rbtree_part_t;
-
-
-#define NXT_RBTREE_NODE(node)                                                 \
-    nxt_rbtree_part_t         node;                                           \
-    uint8_t                   node##_color
-
-
-#define NXT_RBTREE_NODE_INIT  { NULL, NULL, NULL }, 0
-
-
-typedef struct {
-    nxt_rbtree_node_t         sentinel;
-} nxt_rbtree_t;
-
-
-typedef intptr_t (*nxt_rbtree_compare_t)(nxt_rbtree_node_t *node1,
-    nxt_rbtree_node_t *node2);
-
-
-#define nxt_rbtree_root(tree)                                                 \
-    ((tree)->sentinel.left)
-
-
-#define nxt_rbtree_sentinel(tree)                                             \
-    (&(tree)->sentinel)
-
-
-#define nxt_rbtree_is_empty(tree)                                             \
-    (nxt_rbtree_root(tree) == nxt_rbtree_sentinel(tree))
-
-
-#define nxt_rbtree_min(tree)                                                  \
-    nxt_rbtree_branch_min(tree, &(tree)->sentinel)
-
-
-nxt_inline nxt_rbtree_node_t *
-nxt_rbtree_branch_min(nxt_rbtree_t *tree, nxt_rbtree_node_t *node)
-{
-    while (node->left != nxt_rbtree_sentinel(tree)) {
-        node = node->left;
-    }
-
-    return node;
-}
-
-
-#define nxt_rbtree_is_there_successor(tree, node)                             \
-    ((node) != nxt_rbtree_sentinel(tree))
-
-
-nxt_inline nxt_rbtree_node_t *
-nxt_rbtree_node_successor(nxt_rbtree_t *tree, nxt_rbtree_node_t *node)
-{
-    nxt_rbtree_node_t  *parent;
-
-    if (node->right != nxt_rbtree_sentinel(tree)) {
-        return nxt_rbtree_branch_min(tree, node->right);
-    }
-
-    for ( ;; ) {
-        parent = node->parent;
-
-        /*
-         * Explicit test for a root node is not required here, because
-         * the root node is always the left child of the sentinel.
-         */
-        if (node == parent->left) {
-            return parent;
-        }
-
-        node = parent;
-    }
-}
-
-
-NXT_EXPORT void nxt_rbtree_init(nxt_rbtree_t *tree,
-    nxt_rbtree_compare_t compare);
-NXT_EXPORT void nxt_rbtree_insert(nxt_rbtree_t *tree, nxt_rbtree_part_t *node);
-NXT_EXPORT nxt_rbtree_node_t *nxt_rbtree_find(nxt_rbtree_t *tree,
-    nxt_rbtree_part_t *node);
-NXT_EXPORT nxt_rbtree_node_t *nxt_rbtree_find_less_or_equal(nxt_rbtree_t *tree,
-    nxt_rbtree_part_t *node);
-NXT_EXPORT nxt_rbtree_node_t
-    *nxt_rbtree_find_greater_or_equal(nxt_rbtree_t *tree,
-    nxt_rbtree_part_t *node);
-NXT_EXPORT void nxt_rbtree_delete(nxt_rbtree_t *tree, nxt_rbtree_part_t *node);
-
-/*
- * nxt_rbtree_destroy_next() is iterator to use only while rbtree destruction.
- * It deletes a node from rbtree and returns the node.  The rbtree is not
- * rebalanced after deletion.  At the beginning the "next" parameter should
- * be equal to rbtree root.  The iterator should be called in loop until
- * the "next" parameter will be equal to the rbtree sentinel.  No other
- * operations must be performed on the rbtree while destruction.
- */
-NXT_EXPORT nxt_rbtree_node_t *nxt_rbtree_destroy_next(nxt_rbtree_t *tree,
-    nxt_rbtree_node_t **next);
-
-
-#endif /* _NXT_RBTREE_H_INCLUDED_ */
diff --git a/nxt/nxt_regex.h b/nxt/nxt_regex.h
deleted file mode 100644 (file)
index 1e27589..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_REGEX_H_INCLUDED_
-#define _NXT_REGEX_H_INCLUDED_
-
-
-typedef void *(*nxt_pcre_malloc_t)(size_t size, void *memory_data);
-typedef void (*nxt_pcre_free_t)(void *p, void *memory_data);
-
-
-typedef struct nxt_regex_s             nxt_regex_t;
-typedef struct nxt_regex_match_data_s  nxt_regex_match_data_t;
-
-
-typedef struct {
-    nxt_pcre_malloc_t  private_malloc;
-    nxt_pcre_free_t    private_free;
-    void               *memory_data;
-    nxt_trace_t        *trace;
-} nxt_regex_context_t;
-
-
-NXT_EXPORT nxt_regex_context_t *
-    nxt_regex_context_create(nxt_pcre_malloc_t private_malloc,
-    nxt_pcre_free_t private_free, void *memory_data);
-NXT_EXPORT nxt_int_t nxt_regex_compile(nxt_regex_t *regex, u_char *source,
-    size_t len, nxt_uint_t options, nxt_regex_context_t *ctx);
-NXT_EXPORT nxt_bool_t nxt_regex_is_valid(nxt_regex_t *regex);
-NXT_EXPORT nxt_uint_t nxt_regex_ncaptures(nxt_regex_t *regex);
-NXT_EXPORT nxt_int_t nxt_regex_named_captures(nxt_regex_t *regex,
-    nxt_str_t *name, int n);
-NXT_EXPORT nxt_regex_match_data_t *nxt_regex_match_data(nxt_regex_t *regex,
-    nxt_regex_context_t *ctx);
-NXT_EXPORT void nxt_regex_match_data_free(nxt_regex_match_data_t *match_data,
-    nxt_regex_context_t *ctx);
-NXT_EXPORT nxt_int_t nxt_regex_match(nxt_regex_t *regex, const u_char *subject,
-    size_t len, nxt_regex_match_data_t *match_data, nxt_regex_context_t *ctx);
-NXT_EXPORT int *nxt_regex_captures(nxt_regex_match_data_t *match_data);
-
-
-#endif /* _NXT_REGEX_H_INCLUDED_ */
diff --git a/nxt/nxt_sha1.h b/nxt/nxt_sha1.h
deleted file mode 100644 (file)
index 2816982..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-
-#ifndef _NXT_SHA1_H_INCLUDED_
-#define _NXT_SHA1_H_INCLUDED_
-
-
-typedef struct {
-    uint64_t  bytes;
-    uint32_t  a, b, c, d, e;
-    u_char    buffer[64];
-} nxt_sha1_t;
-
-
-NXT_EXPORT void nxt_sha1_init(nxt_sha1_t *ctx);
-NXT_EXPORT void nxt_sha1_update(nxt_sha1_t *ctx, const void *data, size_t size);
-NXT_EXPORT void nxt_sha1_final(u_char result[20], nxt_sha1_t *ctx);
-
-
-#endif /* _NXT_SHA1_H_INCLUDED_ */
diff --git a/nxt/nxt_sha2.h b/nxt/nxt_sha2.h
deleted file mode 100644 (file)
index 778cd28..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-
-/*
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) NGINX, Inc.
- */
-
-
-#ifndef _NXT_SHA2_H_INCLUDED_
-#define _NXT_SHA2_H_INCLUDED_
-
-
-typedef struct {
-    uint64_t  bytes;
-    uint32_t  a, b, c, d, e, f, g, h;
-    u_char    buffer[64];
-} nxt_sha2_t;
-
-
-NXT_EXPORT void nxt_sha2_init(nxt_sha2_t *ctx);
-NXT_EXPORT void nxt_sha2_update(nxt_sha2_t *ctx, const void *data, size_t size);
-NXT_EXPORT void nxt_sha2_final(u_char result[32], nxt_sha2_t *ctx);
-
-
-#endif /* _NXT_SHA2_H_INCLUDED_ */
diff --git a/nxt/nxt_sprintf.h b/nxt/nxt_sprintf.h
deleted file mode 100644 (file)
index 27afbf7..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_SPRINTF_H_INCLUDED_
-#define _NXT_SPRINTF_H_INCLUDED_
-
-
-NXT_EXPORT u_char *nxt_sprintf(u_char *buf, u_char *end, const char *fmt, ...);
-NXT_EXPORT u_char *nxt_vsprintf(u_char *buf, u_char *end, const char *fmt,
-    va_list args);
-
-NXT_EXPORT int nxt_dprint(int fd, u_char *buf, size_t size);
-NXT_EXPORT int nxt_dprintf(int fd, const char *fmt, ...);
-
-#define nxt_print(buf, size)                                                 \
-    nxt_dprint(STDOUT_FILENO, (u_char *) buf, size)
-
-#define nxt_printf(fmt, ...)                                                 \
-    nxt_dprintf(STDOUT_FILENO, fmt, ##__VA_ARGS__)
-
-#define nxt_error(fmt, ...)                                                  \
-    nxt_dprintf(STDERR_FILENO, fmt, ##__VA_ARGS__)
-
-#endif /* _NXT_SPRINTF_H_INCLUDED_ */
diff --git a/nxt/nxt_strtod.h b/nxt/nxt_strtod.h
deleted file mode 100644 (file)
index c36cc7b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-
-/*
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) Nginx, Inc.
- */
-
-#ifndef _NXT_STRTOD_H_INCLUDED_
-#define _NXT_STRTOD_H_INCLUDED_
-
-NXT_EXPORT double nxt_strtod(const u_char **start, const u_char *end);
-
-#endif /* _NXT_STRTOD_H_INCLUDED_ */
diff --git a/nxt/nxt_stub.h b/nxt/nxt_stub.h
deleted file mode 100644 (file)
index 8c88848..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_STUB_H_INCLUDED_
-#define _NXT_STUB_H_INCLUDED_
-
-
-#define nxt_max(val1, val2)                                                   \
-    ((val1 < val2) ? (val2) : (val1))
-
-#define nxt_min(val1, val2)                                                   \
-    ((val1 < val2) ? (val1) : (val2))
-
-
-#define NXT_OK             0
-#define NXT_ERROR          (-1)
-#define NXT_AGAIN          (-2)
-#define NXT_DECLINED       (-3)
-#define NXT_DONE           (-4)
-
-
-typedef struct {
-    void           *(*alloc)(void *mem, size_t size);
-    void           *(*zalloc)(void *mem, size_t size);
-    void           *(*align)(void *mem, size_t alignment, size_t size);
-    void           *(*zalign)(void *mem, size_t alignment, size_t size);
-    void           (*free)(void *mem, void *p);
-    void           (*alert)(void *trace, const char *fmt, ...);
-    void nxt_cdecl  (*trace)(void *trace, const char *fmt, ...);
-} nxt_mem_proto_t;
-
-
-#define nxt_thread_log_alert(...)
-#define nxt_thread_log_error(...)
-#define nxt_log_error(...)
-#define nxt_thread_log_debug(...)
-
-#include <unistd.h>
-#define nxt_pagesize()      getpagesize()
-
-
-#endif /* _NXT_STUB_H_INCLUDED_ */
diff --git a/nxt/nxt_time.h b/nxt/nxt_time.h
deleted file mode 100644 (file)
index 3d84963..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_TIME_H_INCLUDED_
-#define _NXT_TIME_H_INCLUDED_
-
-
-#if (NXT_HAVE_TM_GMTOFF)
-
-#define nxt_timezone(tm)                                                      \
-    ((tm)->tm_gmtoff)
-
-#elif (NXT_HAVE_ALTZONE)
-
-#define nxt_timezone(tm)                                                      \
-    (-(((tm)->tm_isdst > 0) ? altzone : timezone))
-
-#endif
-
-
-uint64_t nxt_time(void);
-
-
-#endif /* _NXT_TIME_H_INCLUDED_ */
diff --git a/nxt/nxt_types.h b/nxt/nxt_types.h
deleted file mode 100644 (file)
index f550e3d..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_TYPES_H_INCLUDED_
-#define _NXT_TYPES_H_INCLUDED_
-
-
-/*
- * off_t is 32 bit on Linux, Solaris and HP-UX by default.
- * Must be before <sys/types.h>.
- */
-#define _FILE_OFFSET_BITS  64
-
-/* u_char, u_int, int8_t, int32_t, int64_t, size_t, off_t. */
-#include <sys/types.h>
-#include <inttypes.h>
-
-
-#if (__LP64__)
-#define NXT_64BIT       1
-#define NXT_PTR_SIZE    8
-#else
-#define NXT_64BIT       0
-#define NXT_PTR_SIZE    4
-#endif
-
-
-/*
- * nxt_int_t corresponds to the most efficient integer type, an architecture
- * word.  It is usually the long type, however on Win64 the long is int32_t,
- * so pointer size suits better.  nxt_int_t must be no less than int32_t.
- */
-
-#if (__amd64__)
-/*
- * AMD64 64-bit multiplication and division operations are slower and 64-bit
- * instructions are longer.
- */
-#define NXT_INT_T_SIZE  4
-typedef int             nxt_int_t;
-typedef u_int           nxt_uint_t;
-
-#else
-#define NXT_INT_T_SIZE  NXT_PTR_SIZE
-typedef intptr_t        nxt_int_t;
-typedef uintptr_t       nxt_uint_t;
-#endif
-
-
-#if (NXT_HAVE_UNSIGNED_INT128)
-typedef unsigned __int128 nxt_uint128_t;
-#endif
-
-
-#if (NXT_INT_T_SIZE == 8)
-#define NXT_INT_T_LEN        NXT_INT64_T_LEN
-#define NXT_INT_T_HEXLEN     NXT_INT64_T_HEXLEN
-#define NXT_INT_T_MAX        NXT_INT64_T_MAX
-
-#else
-#define NXT_INT_T_LEN        NXT_INT32_T_LEN
-#define NXT_INT_T_HEXLEN     NXT_INT32_T_HEXLEN
-#define NXT_INT_T_MAX        NXT_INT32_T_MAX
-#endif
-
-
-typedef nxt_uint_t      nxt_bool_t;
-typedef int             nxt_err_t;
-
-
-/*
- * nxt_off_t corresponds to OS's off_t, a file offset type.  Although Linux,
- * Solaris, and HP-UX define both off_t and off64_t, setting _FILE_OFFSET_BITS
- * to 64 defines off_t as off64_t.
- */
-#if (NXT_WINDOWS)
-/* Windows defines off_t as a 32-bit "long". */
-typedef __int64        nxt_off_t;
-
-#else
-typedef off_t          nxt_off_t;
-#endif
-
-
-/*
- * nxt_time_t corresponds to OS's time_t, time in seconds.  nxt_time_t is
- * a signed integer.  OS's time_t may be an integer or real-floating type,
- * though it is usually a signed 32-bit or 64-bit integer depending on
- * platform bits length.  There are however exceptions, e.g., time_t is:
- *   32-bit on 64-bit NetBSD prior to 6.0 version;
- *   64-bit on 32-bit NetBSD 6.0;
- *   32-bit on 64-bit OpenBSD;
- *   64-bit in Linux x32 ABI;
- *   64-bit in 32-bit Visual Studio C++ 2005.
- *
- * Besides, QNX defines time_t as uint32_t.
- */
-#if (NXT_QNX)
-/* Y2038 fix: "typedef int64_t  nxt_time_t". */
-typedef int32_t        nxt_time_t;
-
-#else
-/* Y2038, if time_t is 32-bit integer. */
-typedef time_t         nxt_time_t;
-#endif
-
-
-typedef pid_t          nxt_pid_t;
-
-
-#define NXT_INT32_T_LEN      nxt_length("-2147483648")
-#define NXT_INT64_T_LEN      nxt_length("-9223372036854775808")
-
-#define NXT_DOUBLE_LEN       (1 + DBL_MAX_10_EXP)
-
-#define NXT_MAX_ERROR_STR    2048
-
-
-#endif /* _NXT_TYPES_H_INCLUDED_ */
diff --git a/nxt/test/lvlhsh_unit_test.c b/nxt/test/lvlhsh_unit_test.c
deleted file mode 100644 (file)
index 525cd05..0000000
+++ /dev/null
@@ -1,276 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_sprintf.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_malloc.h>
-#include <nxt_lvlhsh.h>
-#include <nxt_murmur_hash.h>
-#include <nxt_mp.h>
-#include <string.h>
-
-
-static nxt_int_t
-lvlhsh_unit_test_key_test(nxt_lvlhsh_query_t *lhq, void *data)
-{
-    if (*(uintptr_t *) lhq->key.start == (uintptr_t) data) {
-        return NXT_OK;
-    }
-
-    return NXT_DECLINED;
-}
-
-
-static void *
-lvlhsh_unit_test_pool_alloc(void *pool, size_t size)
-{
-    return nxt_mp_align(pool, size, size);
-}
-
-
-static void
-lvlhsh_unit_test_pool_free(void *pool, void *p, size_t size)
-{
-    nxt_mp_free(pool, p);
-}
-
-
-static const nxt_lvlhsh_proto_t  lvlhsh_proto  nxt_aligned(64) = {
-    NXT_LVLHSH_LARGE_SLAB,
-    lvlhsh_unit_test_key_test,
-    lvlhsh_unit_test_pool_alloc,
-    lvlhsh_unit_test_pool_free,
-};
-
-
-static nxt_int_t
-lvlhsh_unit_test_add(nxt_lvlhsh_t *lh, const nxt_lvlhsh_proto_t *proto,
-    void *pool, uintptr_t key)
-{
-    nxt_lvlhsh_query_t  lhq;
-
-    lhq.key_hash = key;
-    lhq.replace = 0;
-    lhq.key.length = sizeof(uintptr_t);
-    lhq.key.start = (u_char *) &key;
-    lhq.value = (void *) key;
-    lhq.proto = proto;
-    lhq.pool = pool;
-
-    switch (nxt_lvlhsh_insert(lh, &lhq)) {
-
-    case NXT_OK:
-        return NXT_OK;
-
-    case NXT_DECLINED:
-        nxt_printf("lvlhsh unit test failed: key %08Xl is already in hash\n",
-                   (long) key);
-        /* Fall through. */
-
-    default:
-        return NXT_ERROR;
-    }
-}
-
-
-static nxt_int_t
-lvlhsh_unit_test_get(nxt_lvlhsh_t *lh, const nxt_lvlhsh_proto_t *proto,
-    uintptr_t key)
-{
-    nxt_lvlhsh_query_t  lhq;
-
-    lhq.key_hash = key;
-    lhq.key.length = sizeof(uintptr_t);
-    lhq.key.start = (u_char *) &key;
-    lhq.proto = proto;
-
-    if (nxt_lvlhsh_find(lh, &lhq) == NXT_OK) {
-
-        if (key == (uintptr_t) lhq.value) {
-            return NXT_OK;
-        }
-    }
-
-    nxt_printf("lvlhsh unit test failed: key %08Xl not found in hash\n",
-               (long) key);
-
-    return NXT_ERROR;
-}
-
-
-static nxt_int_t
-lvlhsh_unit_test_delete(nxt_lvlhsh_t *lh, const nxt_lvlhsh_proto_t *proto,
-    void *pool, uintptr_t key)
-{
-    nxt_int_t           ret;
-    nxt_lvlhsh_query_t  lhq;
-
-    lhq.key_hash = key;
-    lhq.key.length = sizeof(uintptr_t);
-    lhq.key.start = (u_char *) &key;
-    lhq.proto = proto;
-    lhq.pool = pool;
-
-    ret = nxt_lvlhsh_delete(lh, &lhq);
-
-    if (ret != NXT_OK) {
-        nxt_printf("lvlhsh unit test failed: key %08lX not found in hash\n",
-               (long) key);
-    }
-
-    return ret;
-}
-
-
-static void *
-lvlhsh_malloc(void *mem, size_t size)
-{
-    return nxt_malloc(size);
-}
-
-
-static void *
-lvlhsh_zalloc(void *mem, size_t size)
-{
-    void  *p;
-
-    p = nxt_malloc(size);
-
-    if (p != NULL) {
-        nxt_memzero(p, size);
-    }
-
-    return p;
-}
-
-
-static void *
-lvlhsh_align(void *mem, size_t alignment, size_t size)
-{
-    return nxt_memalign(alignment, size);
-}
-
-
-static void
-lvlhsh_free(void *mem, void *p)
-{
-    nxt_free(p);
-}
-
-
-static void
-lvlhsh_alert(void *mem, const char *fmt, ...)
-{
-    u_char   buf[1024], *p;
-    va_list  args;
-
-    va_start(args, fmt);
-    p = nxt_sprintf(buf, buf + sizeof(buf), fmt, args);
-    va_end(args);
-
-    (void) nxt_error("alert: \"%*s\"\n", p - buf, buf);
-}
-
-
-static const nxt_mem_proto_t  lvl_mp_proto = {
-    lvlhsh_malloc,
-    lvlhsh_zalloc,
-    lvlhsh_align,
-    NULL,
-    lvlhsh_free,
-    lvlhsh_alert,
-    NULL,
-};
-
-
-static nxt_int_t
-lvlhsh_unit_test(nxt_uint_t n)
-{
-    nxt_mp_t           *pool;
-    uint32_t           key;
-    nxt_uint_t         i;
-    nxt_lvlhsh_t       lh;
-    nxt_lvlhsh_each_t  lhe;
-
-    const size_t       min_chunk_size = 32;
-    const size_t       page_size = 1024;
-    const size_t       page_alignment = 128;
-    const size_t       cluster_size = 4096;
-
-    pool = nxt_mp_create(&lvl_mp_proto, NULL, NULL, cluster_size,
-                         page_alignment, page_size, min_chunk_size);
-    if (pool == NULL) {
-        return NXT_ERROR;
-    }
-
-    nxt_printf("lvlhsh unit test started: %l items\n", (long) n);
-
-    nxt_memzero(&lh, sizeof(nxt_lvlhsh_t));
-
-    key = 0;
-    for (i = 0; i < n; i++) {
-        key = nxt_murmur_hash2(&key, sizeof(uint32_t));
-
-        if (lvlhsh_unit_test_add(&lh, &lvlhsh_proto, pool, key) != NXT_OK) {
-            nxt_printf("lvlhsh add unit test failed at %l\n", (long) i);
-            return NXT_ERROR;
-        }
-    }
-
-    key = 0;
-    for (i = 0; i < n; i++) {
-        key = nxt_murmur_hash2(&key, sizeof(uint32_t));
-
-        if (lvlhsh_unit_test_get(&lh, &lvlhsh_proto, key) != NXT_OK) {
-            return NXT_ERROR;
-        }
-    }
-
-    nxt_lvlhsh_each_init(&lhe, &lvlhsh_proto);
-
-    for (i = 0; i < n + 1; i++) {
-        if (nxt_lvlhsh_each(&lh, &lhe) == NULL) {
-            break;
-        }
-    }
-
-    if (i != n) {
-        nxt_printf("lvlhsh each unit test failed at %l of %l\n",
-                   (long) i, (long) n);
-        return NXT_ERROR;
-    }
-
-    key = 0;
-    for (i = 0; i < n; i++) {
-        key = nxt_murmur_hash2(&key, sizeof(uint32_t));
-
-        if (lvlhsh_unit_test_delete(&lh, &lvlhsh_proto, pool, key) != NXT_OK) {
-            return NXT_ERROR;
-        }
-    }
-
-    if (!nxt_mp_is_empty(pool)) {
-        nxt_printf("mem cache pool is not empty\n");
-        return NXT_ERROR;
-    }
-
-    nxt_mp_destroy(pool);
-
-    nxt_printf("lvlhsh unit test passed\n");
-
-    return NXT_OK;
-}
-
-
-int
-main(void)
-{
-     return lvlhsh_unit_test(1000 * 1000);
-}
diff --git a/nxt/test/random_unit_test.c b/nxt/test/random_unit_test.c
deleted file mode 100644 (file)
index ed6dc45..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_sprintf.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_random.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-static nxt_int_t
-random_unit_test(void)
-{
-    nxt_uint_t    n;
-    nxt_random_t  r;
-
-    nxt_random_init(&r, -1);
-
-    r.count = 400000;
-
-    nxt_random_add(&r, (u_char *) "arc4random", nxt_length("arc4random"));
-
-    /*
-     * Test arc4random() numbers.
-     * RC4 pseudorandom numbers would be 0x4642AFC3 and 0xBAF0FFF0.
-     */
-
-    if (nxt_random(&r) == 0xD6270B27) {
-
-        for (n = 100000; n != 0; n--) {
-            (void) nxt_random(&r);
-        }
-
-        if (nxt_random(&r) == 0x6FCAE186) {
-            nxt_printf("random unit test passed\n");
-
-            nxt_random_stir(&r, getpid());
-
-            nxt_printf("random unit test: 0x%08uXD\n", nxt_random(&r));
-
-            return NXT_OK;
-        }
-    }
-
-    nxt_printf("random unit test failed\n");
-
-    return NXT_ERROR;
-}
-
-
-int
-main(void)
-{
-    return random_unit_test();
-}
diff --git a/nxt/test/rbtree_unit_test.c b/nxt/test/rbtree_unit_test.c
deleted file mode 100644 (file)
index 8fd9efc..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_stub.h>
-#include <nxt_sprintf.h>
-#include <nxt_string.h>
-#include <nxt_rbtree.h>
-#include <nxt_murmur_hash.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-typedef struct {
-    NXT_RBTREE_NODE  (node);
-    uint32_t         key;
-} nxt_rbtree_test_t;
-
-
-static intptr_t rbtree_unit_test_comparison(nxt_rbtree_node_t *node1,
-    nxt_rbtree_node_t *node2);
-static nxt_int_t rbtree_unit_test_compare(uint32_t key1, uint32_t key2);
-static int nxt_cdecl rbtree_unit_test_sort_cmp(const void *one,
-    const void *two);
-
-
-static nxt_int_t
-rbtree_unit_test(nxt_uint_t n)
-{
-    void               *mark;
-    uint32_t           key, *keys;
-    nxt_uint_t         i;
-    nxt_rbtree_t       tree;
-    nxt_rbtree_node_t  *node;
-    nxt_rbtree_test_t  *items, *item;
-
-    nxt_printf("rbtree unit test started: %l nodes\n", (long) n);
-
-    nxt_rbtree_init(&tree, rbtree_unit_test_comparison);
-
-    mark = tree.sentinel.right;
-
-    items = malloc(n * sizeof(nxt_rbtree_test_t));
-    if (items == NULL) {
-        return NXT_ERROR;
-    }
-
-    keys = malloc(n * sizeof(uint32_t));
-    if (keys == NULL) {
-        free(items);
-        return NXT_ERROR;
-    }
-
-    key = 0;
-
-    for (i = 0; i < n; i++) {
-        key = nxt_murmur_hash2(&key, sizeof(uint32_t));
-        keys[i] = key;
-        items[i].key = key;
-    }
-
-    qsort(keys, n, sizeof(uint32_t), rbtree_unit_test_sort_cmp);
-
-    for (i = 0; i < n; i++) {
-        nxt_rbtree_insert(&tree, &items[i].node);
-    }
-
-    for (i = 0; i < n; i++) {
-        node = nxt_rbtree_find(&tree, &items[i].node);
-
-        if (node != (nxt_rbtree_node_t *) &items[i].node) {
-            nxt_printf("rbtree unit test failed: %08uXD not found\n",
-                       items[i].key);
-            goto fail;
-        }
-    }
-
-    i = 0;
-    node = nxt_rbtree_min(&tree);
-
-    while (nxt_rbtree_is_there_successor(&tree, node)) {
-
-        item = (nxt_rbtree_test_t *) node;
-
-        if (keys[i] != item->key) {
-            nxt_printf("rbtree unit test failed: %l: %08uXD %08uXD\n",
-                       (long) i, keys[i], item->key);
-            goto fail;
-        }
-
-        i++;
-        node = nxt_rbtree_node_successor(&tree, node);
-    }
-
-    if (i != n) {
-        nxt_printf("rbtree unit test failed: %l\n", (long) i);
-        goto fail;
-    }
-
-    for (i = 0; i < n; i++) {
-        nxt_rbtree_delete(&tree, &items[i].node);
-        nxt_memset(&items[i], 0xA5, sizeof(nxt_rbtree_test_t));
-    }
-
-    if (!nxt_rbtree_is_empty(&tree)) {
-        nxt_printf("rbtree unit test failed: tree is not empty\n");
-        goto fail;
-    }
-
-    /* Check that the sentinel callback was not modified. */
-
-    if (mark != tree.sentinel.right) {
-        nxt_printf("rbtree sentinel unit test failed\n");
-        goto fail;
-    }
-
-    free(keys);
-    free(items);
-
-    nxt_printf("rbtree unit test passed\n");
-
-    return NXT_OK;
-
-fail:
-
-    free(keys);
-    free(items);
-
-    return NXT_ERROR;
-}
-
-
-static intptr_t
-rbtree_unit_test_comparison(nxt_rbtree_node_t *node1, nxt_rbtree_node_t *node2)
-{
-    nxt_rbtree_test_t  *item1, *item2;
-
-    item1 = (nxt_rbtree_test_t *) node1;
-    item2 = (nxt_rbtree_test_t *) node2;
-
-    return rbtree_unit_test_compare(item1->key, item2->key);
-}
-
-
-/*
- * Subtraction cannot be used in these comparison functions because
- * the key values are spread uniform in whole 0 .. 2^32 range but are
- * not grouped around some value as timeout values are.
- */
-
-static nxt_int_t
-rbtree_unit_test_compare(uint32_t key1, uint32_t key2)
-{
-    if (key1 < key2) {
-        return -1;
-    }
-
-    if (key1 == key2) {
-        return 0;
-    }
-
-    return 1;
-}
-
-
-static int nxt_cdecl
-rbtree_unit_test_sort_cmp(const void *one, const void *two)
-{
-    const uint32_t  *first, *second;
-
-    first = one;
-    second = two;
-
-    if (*first < *second) {
-        return -1;
-    }
-
-    if (*first == *second) {
-        return 0;
-    }
-
-    return 1;
-}
-
-
-int
-main(void)
-{
-    return rbtree_unit_test(1000 * 1000);
-}
similarity index 59%
rename from njs/njs.h
rename to src/njs.h
index e4dbc5d5a8781540a62ca6e28d3d8f8dbaef6408..f494a7d38c048a03a368110544c4a1c52e0fce9f 100644 (file)
--- a/njs/njs.h
+++ b/src/njs.h
@@ -9,17 +9,17 @@
 #ifndef _NJS_H_INCLUDED_
 #define _NJS_H_INCLUDED_
 
-#include <nxt_auto_config.h>
+#include <njs_auto_config.h>
 
 #define NJS_VERSION                 "0.3.4"
 
 
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_array.h>
-#include <nxt_lvlhsh.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_arr.h>
+#include <njs_lvlhsh.h>
 
 
 typedef intptr_t                    njs_ret_t;
@@ -63,20 +63,20 @@ extern const njs_value_t            njs_value_undefined;
 typedef njs_ret_t (*njs_extern_get_t)(njs_vm_t *vm, njs_value_t *value,
     void *obj, uintptr_t data);
 typedef njs_ret_t (*njs_extern_set_t)(njs_vm_t *vm, void *obj, uintptr_t data,
-    nxt_str_t *value);
+    njs_str_t *value);
 typedef njs_ret_t (*njs_extern_find_t)(njs_vm_t *vm, void *obj, uintptr_t data,
-    nxt_bool_t delete);
+    njs_bool_t delete);
 typedef njs_ret_t (*njs_extern_foreach_t)(njs_vm_t *vm, void *obj, void *next);
 typedef njs_ret_t (*njs_extern_next_t)(njs_vm_t *vm, njs_value_t *value,
     void *obj, void *next);
 typedef njs_ret_t (*njs_extern_method_t)(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 
 typedef struct njs_external_s       njs_external_t;
 
 struct njs_external_s {
-    nxt_str_t                       name;
+    njs_str_t                       name;
 
 #define NJS_EXTERN_PROPERTY         0x00
 #define NJS_EXTERN_METHOD           0x01
@@ -86,7 +86,7 @@ struct njs_external_s {
     uintptr_t                       type;
 
     njs_external_t                  *properties;
-    nxt_uint_t                      nproperties;
+    njs_uint_t                      nproperties;
 
     njs_extern_get_t                get;
     njs_extern_set_t                set;
@@ -141,10 +141,10 @@ typedef struct {
     njs_external_ptr_t              external;
     njs_vm_shared_t                 *shared;
     njs_vm_ops_t                    *ops;
-    nxt_str_t                       file;
+    njs_str_t                       file;
 
     char                            **argv;
-    nxt_uint_t                      argc;
+    njs_uint_t                      argc;
 
     uint8_t                         trailer;         /* 1 bit */
     uint8_t                         init;            /* 1 bit */
@@ -156,35 +156,28 @@ typedef struct {
 } njs_vm_opt_t;
 
 
-#define NJS_OK                      NXT_OK
-#define NJS_ERROR                   NXT_ERROR
-#define NJS_AGAIN                   NXT_AGAIN
-#define NJS_DECLINED                NXT_DECLINED
-#define NJS_DONE                    NXT_DONE
+NJS_EXPORT njs_vm_t *njs_vm_create(njs_vm_opt_t *options);
+NJS_EXPORT void njs_vm_destroy(njs_vm_t *vm);
 
+NJS_EXPORT njs_int_t njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end);
+NJS_EXPORT njs_vm_t *njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external);
 
-NXT_EXPORT njs_vm_t *njs_vm_create(njs_vm_opt_t *options);
-NXT_EXPORT void njs_vm_destroy(njs_vm_t *vm);
-
-NXT_EXPORT nxt_int_t njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end);
-NXT_EXPORT njs_vm_t *njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external);
-
-NXT_EXPORT njs_vm_event_t njs_vm_add_event(njs_vm_t *vm,
-    njs_function_t *function, nxt_uint_t once, njs_host_event_t host_ev,
+NJS_EXPORT njs_vm_event_t njs_vm_add_event(njs_vm_t *vm,
+    njs_function_t *function, njs_uint_t once, njs_host_event_t host_ev,
     njs_event_destructor_t destructor);
-NXT_EXPORT void njs_vm_del_event(njs_vm_t *vm, njs_vm_event_t vm_event);
-NXT_EXPORT nxt_int_t njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event,
-    const njs_value_t *args, nxt_uint_t nargs);
+NJS_EXPORT void njs_vm_del_event(njs_vm_t *vm, njs_vm_event_t vm_event);
+NJS_EXPORT njs_int_t njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event,
+    const njs_value_t *args, njs_uint_t nargs);
 
 /*
  * Returns 1 if async events are present.
  */
-NXT_EXPORT nxt_int_t njs_vm_waiting(njs_vm_t *vm);
+NJS_EXPORT njs_int_t njs_vm_waiting(njs_vm_t *vm);
 
 /*
  * Returns 1 if posted events are ready to be executed.
  */
-NXT_EXPORT nxt_int_t njs_vm_posted(njs_vm_t *vm);
+NJS_EXPORT njs_int_t njs_vm_posted(njs_vm_t *vm);
 
 #define njs_vm_pending(vm)  (njs_vm_waiting(vm) || njs_vm_posted(vm))
 
@@ -196,10 +189,10 @@ NXT_EXPORT nxt_int_t njs_vm_posted(njs_vm_t *vm);
  *
  *  njs_vm_retval(vm) can be used to get the retval or exception value.
  */
-NXT_EXPORT nxt_int_t njs_vm_call(njs_vm_t *vm, njs_function_t *function,
-    const njs_value_t *args, nxt_uint_t nargs);
-NXT_EXPORT nxt_int_t njs_vm_invoke(njs_vm_t *vm, njs_function_t *function,
-    const njs_value_t *args, nxt_uint_t nargs, njs_index_t retval);
+NJS_EXPORT njs_int_t njs_vm_call(njs_vm_t *vm, njs_function_t *function,
+    const njs_value_t *args, njs_uint_t nargs);
+NJS_EXPORT njs_int_t njs_vm_invoke(njs_vm_t *vm, njs_function_t *function,
+    const njs_value_t *args, njs_uint_t nargs, njs_index_t retval);
 
 /*
  * Runs posted events.
@@ -209,7 +202,7 @@ NXT_EXPORT nxt_int_t njs_vm_invoke(njs_vm_t *vm, njs_function_t *function,
  *  NJS_ERROR some exception or internal error happens.
  *    njs_vm_retval(vm) can be used to get the retval or exception value.
  */
-NXT_EXPORT nxt_int_t njs_vm_run(njs_vm_t *vm);
+NJS_EXPORT njs_int_t njs_vm_run(njs_vm_t *vm);
 
 /*
  * Runs the global code.
@@ -218,90 +211,90 @@ NXT_EXPORT nxt_int_t njs_vm_run(njs_vm_t *vm);
  *
  *   njs_vm_retval(vm) can be used to get the retval or exception value.
  */
-NXT_EXPORT nxt_int_t njs_vm_start(njs_vm_t *vm);
+NJS_EXPORT njs_int_t njs_vm_start(njs_vm_t *vm);
 
-NXT_EXPORT nxt_int_t njs_vm_add_path(njs_vm_t *vm, const nxt_str_t *path);
+NJS_EXPORT njs_int_t njs_vm_add_path(njs_vm_t *vm, const njs_str_t *path);
 
-NXT_EXPORT const njs_extern_t *njs_vm_external_prototype(njs_vm_t *vm,
+NJS_EXPORT const njs_extern_t *njs_vm_external_prototype(njs_vm_t *vm,
     njs_external_t *external);
-NXT_EXPORT nxt_int_t njs_vm_external_create(njs_vm_t *vm,
+NJS_EXPORT njs_int_t njs_vm_external_create(njs_vm_t *vm,
     njs_value_t *value, const njs_extern_t *proto, njs_external_ptr_t object);
-NXT_EXPORT nxt_int_t njs_vm_external_bind(njs_vm_t *vm,
-    const nxt_str_t *var_name, const njs_value_t *value);
-NXT_EXPORT njs_external_ptr_t njs_vm_external(njs_vm_t *vm,
+NJS_EXPORT njs_int_t njs_vm_external_bind(njs_vm_t *vm,
+    const njs_str_t *var_name, const njs_value_t *value);
+NJS_EXPORT njs_external_ptr_t njs_vm_external(njs_vm_t *vm,
     const njs_value_t *value);
 
-NXT_EXPORT void njs_disassembler(njs_vm_t *vm);
-NXT_EXPORT nxt_array_t *njs_vm_completions(njs_vm_t *vm, nxt_str_t *expression);
+NJS_EXPORT void njs_disassembler(njs_vm_t *vm);
+NJS_EXPORT njs_arr_t *njs_vm_completions(njs_vm_t *vm, njs_str_t *expression);
 
-NXT_EXPORT const njs_value_t *njs_vm_value(njs_vm_t *vm, const nxt_str_t *name);
-NXT_EXPORT njs_function_t *njs_vm_function(njs_vm_t *vm, const nxt_str_t *name);
-NXT_EXPORT njs_value_t *njs_vm_retval(njs_vm_t *vm);
-NXT_EXPORT void njs_vm_retval_set(njs_vm_t *vm, const njs_value_t *value);
+NJS_EXPORT const njs_value_t *njs_vm_value(njs_vm_t *vm, const njs_str_t *name);
+NJS_EXPORT njs_function_t *njs_vm_function(njs_vm_t *vm, const njs_str_t *name);
+NJS_EXPORT njs_value_t *njs_vm_retval(njs_vm_t *vm);
+NJS_EXPORT void njs_vm_retval_set(njs_vm_t *vm, const njs_value_t *value);
 
 /*
  * Sets a byte string value.
  *   start data is not copied and should not be freed.
  */
-NXT_EXPORT njs_ret_t njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value,
+NJS_EXPORT njs_ret_t njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value,
     const u_char *start, uint32_t size);
-NXT_EXPORT u_char *njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value,
+NJS_EXPORT u_char *njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value,
     uint32_t size);
-NXT_EXPORT nxt_int_t njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval,
+NJS_EXPORT njs_int_t njs_vm_value_string_copy(njs_vm_t *vm, njs_str_t *retval,
     const njs_value_t *value, uintptr_t *next);
 
 /*
  * Converts a value to string.
  */
-NXT_EXPORT njs_ret_t njs_vm_value_to_string(njs_vm_t *vm, nxt_str_t *dst,
+NJS_EXPORT njs_ret_t njs_vm_value_to_string(njs_vm_t *vm, njs_str_t *dst,
     const njs_value_t *src);
 
 /*
  * Calls njs_vm_value_to_string(), if exception was thrown adds backtrace.
  */
-NXT_EXPORT njs_ret_t njs_vm_value_string(njs_vm_t *vm, nxt_str_t *dst,
+NJS_EXPORT njs_ret_t njs_vm_value_string(njs_vm_t *vm, njs_str_t *dst,
     const njs_value_t *src);
-NXT_EXPORT njs_ret_t njs_vm_retval_string(njs_vm_t *vm, nxt_str_t *dst);
+NJS_EXPORT njs_ret_t njs_vm_retval_string(njs_vm_t *vm, njs_str_t *dst);
 
-NXT_EXPORT njs_ret_t njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *dst,
-    const njs_value_t *value, nxt_uint_t console, nxt_uint_t indent);
-NXT_EXPORT njs_ret_t njs_vm_retval_dump(njs_vm_t *vm, nxt_str_t *dst,
-    nxt_uint_t indent);
+NJS_EXPORT njs_ret_t njs_vm_value_dump(njs_vm_t *vm, njs_str_t *dst,
+    const njs_value_t *value, njs_uint_t console, njs_uint_t indent);
+NJS_EXPORT njs_ret_t njs_vm_retval_dump(njs_vm_t *vm, njs_str_t *dst,
+    njs_uint_t indent);
 
-NXT_EXPORT void njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value,
+NJS_EXPORT void njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value,
     const char *fmt, ...);
-NXT_EXPORT void njs_vm_memory_error(njs_vm_t *vm);
-
-NXT_EXPORT void njs_value_undefined_set(njs_value_t *value);
-NXT_EXPORT void njs_value_boolean_set(njs_value_t *value, int yn);
-NXT_EXPORT void njs_value_number_set(njs_value_t *value, double num);
-NXT_EXPORT void njs_value_data_set(njs_value_t *value, void *data);
-
-NXT_EXPORT uint8_t njs_value_bool(const njs_value_t *value);
-NXT_EXPORT double njs_value_number(const njs_value_t *value);
-NXT_EXPORT void *njs_value_data(const njs_value_t *value);
-NXT_EXPORT njs_function_t *njs_value_function(const njs_value_t *value);
-
-NXT_EXPORT nxt_int_t njs_value_is_null(const njs_value_t *value);
-NXT_EXPORT nxt_int_t njs_value_is_undefined(const njs_value_t *value);
-NXT_EXPORT nxt_int_t njs_value_is_null_or_undefined(const njs_value_t *value);
-NXT_EXPORT nxt_int_t njs_value_is_boolean(const njs_value_t *value);
-NXT_EXPORT nxt_int_t njs_value_is_number(const njs_value_t *value);
-NXT_EXPORT nxt_int_t njs_value_is_valid_number(const njs_value_t *value);
-NXT_EXPORT nxt_int_t njs_value_is_string(const njs_value_t *value);
-NXT_EXPORT nxt_int_t njs_value_is_object(const njs_value_t *value);
-NXT_EXPORT nxt_int_t njs_value_is_function(const njs_value_t *value);
-
-NXT_EXPORT njs_ret_t njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval,
+NJS_EXPORT void njs_vm_memory_error(njs_vm_t *vm);
+
+NJS_EXPORT void njs_value_undefined_set(njs_value_t *value);
+NJS_EXPORT void njs_value_boolean_set(njs_value_t *value, int yn);
+NJS_EXPORT void njs_value_number_set(njs_value_t *value, double num);
+NJS_EXPORT void njs_value_data_set(njs_value_t *value, void *data);
+
+NJS_EXPORT uint8_t njs_value_bool(const njs_value_t *value);
+NJS_EXPORT double njs_value_number(const njs_value_t *value);
+NJS_EXPORT void *njs_value_data(const njs_value_t *value);
+NJS_EXPORT njs_function_t *njs_value_function(const njs_value_t *value);
+
+NJS_EXPORT njs_int_t njs_value_is_null(const njs_value_t *value);
+NJS_EXPORT njs_int_t njs_value_is_undefined(const njs_value_t *value);
+NJS_EXPORT njs_int_t njs_value_is_null_or_undefined(const njs_value_t *value);
+NJS_EXPORT njs_int_t njs_value_is_boolean(const njs_value_t *value);
+NJS_EXPORT njs_int_t njs_value_is_number(const njs_value_t *value);
+NJS_EXPORT njs_int_t njs_value_is_valid_number(const njs_value_t *value);
+NJS_EXPORT njs_int_t njs_value_is_string(const njs_value_t *value);
+NJS_EXPORT njs_int_t njs_value_is_object(const njs_value_t *value);
+NJS_EXPORT njs_int_t njs_value_is_function(const njs_value_t *value);
+
+NJS_EXPORT njs_ret_t njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval,
     ...);
-NXT_EXPORT njs_value_t *njs_vm_object_prop(njs_vm_t *vm,
-    const njs_value_t *value, const nxt_str_t *key);
+NJS_EXPORT njs_value_t *njs_vm_object_prop(njs_vm_t *vm,
+    const njs_value_t *value, const njs_str_t *key);
 
-NXT_EXPORT njs_ret_t njs_vm_json_parse(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs);
-NXT_EXPORT njs_ret_t njs_vm_json_stringify(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs);
+NJS_EXPORT njs_ret_t njs_vm_json_parse(njs_vm_t *vm, njs_value_t *args,
+    njs_uint_t nargs);
+NJS_EXPORT njs_ret_t njs_vm_json_stringify(njs_vm_t *vm, njs_value_t *args,
+    njs_uint_t nargs);
 
-extern const nxt_mem_proto_t  njs_vm_mp_proto;
+extern const njs_mem_proto_t  njs_vm_mp_proto;
 
 #endif /* _NJS_H_INCLUDED_ */
diff --git a/src/njs_alignment.h b/src/njs_alignment.h
new file mode 100644 (file)
index 0000000..0c57670
--- /dev/null
@@ -0,0 +1,49 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_ALIGNMENT_H_INCLUDED_
+#define _NJS_ALIGNMENT_H_INCLUDED_
+
+
+#ifndef NJS_MAX_ALIGNMENT
+
+#if (NJS_SOLARIS)
+/* x86_64: 16, i386: 4, sparcv9: 16, sparcv8: 8. */
+#define NJS_MAX_ALIGNMENT  _MAX_ALIGNMENT
+
+#elif (NJS_WINDOWS)
+/* Win64: 16, Win32: 8. */
+#define NJS_MAX_ALIGNMENT  MEMORY_ALLOCATION_ALIGNMENT
+
+#elif (__amd64__)
+#define NJS_MAX_ALIGNMENT  16
+
+#elif (__i386__ || __i386)
+#define NJS_MAX_ALIGNMENT  4
+
+#elif (__arm__)
+#define NJS_MAX_ALIGNMENT  16
+
+#else
+#define NJS_MAX_ALIGNMENT  16
+#endif
+
+#endif
+
+
+#define njs_align_size(size, a)                                               \
+    (((size) + ((size_t) (a) - 1)) & ~((size_t) (a) - 1))
+
+
+#define njs_align_ptr(p, a)                                                   \
+    (u_char *) (((uintptr_t) (p) + ((uintptr_t) (a) - 1))                     \
+                 & ~((uintptr_t) (a) - 1))
+
+#define njs_trunc_ptr(p, a)                                                   \
+    (u_char *) ((uintptr_t) (p) & ~((uintptr_t) (a) - 1))
+
+
+#endif /* _NJS_ALIGNMENT_H_INCLUDED_ */
similarity index 66%
rename from nxt/nxt_array.c
rename to src/njs_arr.c
index 6d4ecbdd64ef7f6e81873010113246978b8a9eb4..04f4da682ea5fc4641da98ae9a914a4a967f473e 100644 (file)
@@ -4,25 +4,25 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_stub.h>
-#include <nxt_array.h>
-#include <nxt_string.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_stub.h>
+#include <njs_arr.h>
+#include <njs_str.h>
 #include <string.h>
 
 
-nxt_array_t *
-nxt_array_create(uint32_t items, uint32_t item_size,
-    const nxt_mem_proto_t *proto, void *pool)
+njs_arr_t *
+njs_arr_create(uint32_t items, uint32_t item_size,
+    const njs_mem_proto_t *proto, void *pool)
 {
-    nxt_array_t  *array;
+    njs_arr_t  *array;
 
-    array = proto->alloc(pool, sizeof(nxt_array_t) + items * item_size);
+    array = proto->alloc(pool, sizeof(njs_arr_t) + items * item_size);
 
-    if (nxt_fast_path(array != NULL)) {
-        array->start = (char *) array + sizeof(nxt_array_t);
+    if (njs_fast_path(array != NULL)) {
+        array->start = (char *) array + sizeof(njs_arr_t);
         array->items = 0;
         array->item_size = item_size;
         array->avalaible = items;
@@ -35,8 +35,8 @@ nxt_array_create(uint32_t items, uint32_t item_size,
 
 
 void *
-nxt_array_init(nxt_array_t *array, void *start, uint32_t items,
-    uint32_t item_size, const nxt_mem_proto_t *proto, void *pool)
+njs_arr_init(njs_arr_t *array, void *start, uint32_t items,
+    uint32_t item_size, const njs_mem_proto_t *proto, void *pool)
 {
     array->start = start;
     array->items = items;
@@ -57,11 +57,11 @@ nxt_array_init(nxt_array_t *array, void *start, uint32_t items,
 
 
 void
-nxt_array_destroy(nxt_array_t *array, const nxt_mem_proto_t *proto, void *pool)
+njs_arr_destroy(njs_arr_t *array, const njs_mem_proto_t *proto, void *pool)
 {
     if (array->separate) {
         proto->free(pool, array->start);
-#if (NXT_DEBUG)
+#if (NJS_DEBUG)
         array->start = NULL;
         array->items = 0;
         array->avalaible = 0;
@@ -75,14 +75,14 @@ nxt_array_destroy(nxt_array_t *array, const nxt_mem_proto_t *proto, void *pool)
 
 
 void *
-nxt_array_add(nxt_array_t *array, const nxt_mem_proto_t *proto, void *pool)
+njs_arr_add(njs_arr_t *array, const njs_mem_proto_t *proto, void *pool)
 {
-    return nxt_array_add_multiple(array, proto, pool, 1);
+    return njs_arr_add_multiple(array, proto, pool, 1);
 }
 
 
 void *
-nxt_array_add_multiple(nxt_array_t *array, const nxt_mem_proto_t *proto,
+njs_arr_add_multiple(njs_arr_t *array, const njs_mem_proto_t *proto,
     void *pool, uint32_t items)
 {
     void      *item, *start, *old;
@@ -107,7 +107,7 @@ nxt_array_add_multiple(nxt_array_t *array, const nxt_mem_proto_t *proto,
         }
 
         start = proto->alloc(pool, n * array->item_size);
-        if (nxt_slow_path(start == NULL)) {
+        if (njs_slow_path(start == NULL)) {
             return NULL;
         }
 
@@ -134,14 +134,14 @@ nxt_array_add_multiple(nxt_array_t *array, const nxt_mem_proto_t *proto,
 
 
 void *
-nxt_array_zero_add(nxt_array_t *array, const nxt_mem_proto_t *proto, void *pool)
+njs_arr_zero_add(njs_arr_t *array, const njs_mem_proto_t *proto, void *pool)
 {
     void  *item;
 
-    item = nxt_array_add(array, proto, pool);
+    item = njs_arr_add(array, proto, pool);
 
-    if (nxt_fast_path(item != NULL)) {
-        nxt_memzero(item, array->item_size);
+    if (njs_fast_path(item != NULL)) {
+        njs_memzero(item, array->item_size);
     }
 
     return item;
@@ -149,7 +149,7 @@ nxt_array_zero_add(nxt_array_t *array, const nxt_mem_proto_t *proto, void *pool)
 
 
 void
-nxt_array_remove(nxt_array_t *array, void *item)
+njs_arr_remove(njs_arr_t *array, void *item)
 {
     u_char    *next, *last, *end;
     uint32_t  item_size;
diff --git a/src/njs_arr.h b/src/njs_arr.h
new file mode 100644 (file)
index 0000000..5c81b33
--- /dev/null
@@ -0,0 +1,67 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_ARR_H_INCLUDED_
+#define _NJS_ARR_H_INCLUDED_
+
+
+typedef struct {
+    void              *start;
+    /*
+     * A array can hold no more than 65536 items.
+     * The item size is no more than 64K.
+     */
+    uint16_t          items;
+    uint16_t          avalaible;
+    uint16_t          item_size;
+
+    uint8_t           pointer;
+    uint8_t           separate;
+} njs_arr_t;
+
+
+NJS_EXPORT njs_arr_t *njs_arr_create(uint32_t items, uint32_t item_size,
+    const njs_mem_proto_t *proto, void *pool);
+NJS_EXPORT void *njs_arr_init(njs_arr_t *array, void *start, uint32_t items,
+    uint32_t item_size, const njs_mem_proto_t *proto, void *pool);
+NJS_EXPORT void njs_arr_destroy(njs_arr_t *array,
+    const njs_mem_proto_t *proto, void *pool);
+NJS_EXPORT void *njs_arr_add(njs_arr_t *array, const njs_mem_proto_t *proto,
+    void *pool);
+NJS_EXPORT void *njs_arr_add_multiple(njs_arr_t *array,
+    const njs_mem_proto_t *proto, void *pool, uint32_t items);
+NJS_EXPORT void *njs_arr_zero_add(njs_arr_t *array,
+    const njs_mem_proto_t *proto, void *pool);
+NJS_EXPORT void njs_arr_remove(njs_arr_t *array, void *item);
+
+
+#define njs_arr_item(array, i)                                              \
+    ((void *) ((char *) (array)->start + (array)->item_size * (i)))
+
+
+#define njs_arr_last(array)                                                 \
+    ((void *)                                                                 \
+        ((char *) (array)->start                                              \
+                      + (array)->item_size * ((array)->items - 1)))
+
+
+#define njs_arr_reset(array)                                                \
+    (array)->items = 0;
+
+
+#define njs_arr_is_empty(array)                                             \
+    ((array)->items == 0)
+
+
+njs_inline void *
+njs_arr_remove_last(njs_arr_t *array)
+{
+    array->items--;
+    return (char *) array->start + array->item_size * array->items;
+}
+
+
+#endif /* _NJS_ARR_H_INCLUDED_ */
similarity index 85%
rename from njs/njs_array.c
rename to src/njs_array.c
index dbeb00142c849e2f0094ddebb81861ff1233a5cf..c2852d566e35e506bef18b354d8863e32c838b62 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 #include <stdint.h>
 
@@ -20,29 +20,29 @@ njs_array_alloc(njs_vm_t *vm, uint64_t length, uint32_t spare)
     uint64_t     size;
     njs_array_t  *array;
 
-    if (nxt_slow_path(length > UINT32_MAX)) {
+    if (njs_slow_path(length > UINT32_MAX)) {
         goto overflow;
     }
 
     size = length + spare;
 
-    if (nxt_slow_path(size > NJS_ARRAY_MAX_LENGTH)) {
+    if (njs_slow_path(size > NJS_ARRAY_MAX_LENGTH)) {
         goto memory_error;
     }
 
-    array = nxt_mp_alloc(vm->mem_pool, sizeof(njs_array_t));
-    if (nxt_slow_path(array == NULL)) {
+    array = njs_mp_alloc(vm->mem_pool, sizeof(njs_array_t));
+    if (njs_slow_path(array == NULL)) {
         goto memory_error;
     }
 
-    array->data = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
+    array->data = njs_mp_align(vm->mem_pool, sizeof(njs_value_t),
                                size * sizeof(njs_value_t));
-    if (nxt_slow_path(array->data == NULL)) {
+    if (njs_slow_path(array->data == NULL)) {
         goto memory_error;
     }
 
     array->start = array->data;
-    nxt_lvlhsh_init(&array->object.hash);
+    njs_lvlhsh_init(&array->object.hash);
     array->object.shared_hash = vm->shared->array_instance_hash;
     array->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_ARRAY].object;
     array->object.type = NJS_ARRAY;
@@ -74,7 +74,7 @@ njs_array_add(njs_vm_t *vm, njs_array_t *array, njs_value_t *value)
 
     ret = njs_array_expand(vm, array, 0, 1);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         /* GC: retain value. */
         array->start[array->length++] = *value;
     }
@@ -91,7 +91,7 @@ njs_array_string_add(njs_vm_t *vm, njs_array_t *array, const u_char *start,
 
     ret = njs_array_expand(vm, array, 0, 1);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return njs_string_new(vm, &array->start[array->length++], start, size,
                               length);
     }
@@ -111,8 +111,8 @@ njs_array_expand(njs_vm_t *vm, njs_array_t *array, uint32_t prepend,
     free_before = array->start - array->data;
     free_after = array->size - array->length - free_before;
 
-    if (nxt_fast_path(free_before >= prepend && free_after >= append)) {
-        return NXT_OK;
+    if (njs_fast_path(free_before >= prepend && free_after >= append)) {
+        return NJS_OK;
     }
 
     size = (uint64_t) prepend + array->length + append;
@@ -124,13 +124,13 @@ njs_array_expand(njs_vm_t *vm, njs_array_t *array, uint32_t prepend,
         size += size / 2;
     }
 
-    if (nxt_slow_path(size > NJS_ARRAY_MAX_LENGTH)) {
+    if (njs_slow_path(size > NJS_ARRAY_MAX_LENGTH)) {
         goto memory_error;
     }
 
-    start = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
+    start = njs_mp_align(vm->mem_pool, sizeof(njs_value_t),
                          size * sizeof(njs_value_t));
-    if (nxt_slow_path(start == NULL)) {
+    if (njs_slow_path(start == NULL)) {
         goto memory_error;
     }
 
@@ -144,20 +144,20 @@ njs_array_expand(njs_vm_t *vm, njs_array_t *array, uint32_t prepend,
 
     array->start = start;
 
-    nxt_mp_free(vm->mem_pool, old);
+    njs_mp_free(vm->mem_pool, old);
 
-    return NXT_OK;
+    return NJS_OK;
 
 memory_error:
 
     njs_memory_error(vm);
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 njs_ret_t
-njs_array_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double       num;
@@ -174,7 +174,7 @@ njs_array_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         if ((double) size != num) {
             njs_range_error(vm, "Invalid array length");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         args = NULL;
@@ -182,7 +182,7 @@ njs_array_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     array = njs_array_alloc(vm, size, NJS_ARRAY_SPARE);
 
-    if (nxt_fast_path(array != NULL)) {
+    if (njs_fast_path(array != NULL)) {
 
         value = array->start;
 
@@ -204,16 +204,16 @@ njs_array_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         njs_set_array(&vm->retval, array);
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 static njs_ret_t
 njs_array_is_array(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     const njs_value_t  *value;
 
@@ -226,13 +226,13 @@ njs_array_is_array(njs_vm_t *vm, njs_value_t *args,
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_array_of(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
         uint32_t     length, i;
         njs_array_t  *array;
@@ -240,8 +240,8 @@ njs_array_of(njs_vm_t *vm, njs_value_t *args,
         length = nargs > 1 ? nargs - 1 : 0;
 
         array = njs_array_alloc(vm, length, NJS_ARRAY_SPARE);
-        if (nxt_slow_path(array == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(array == NULL)) {
+            return NJS_ERROR;
         }
 
         njs_set_array(&vm->retval, array);
@@ -250,7 +250,7 @@ njs_array_of(njs_vm_t *vm, njs_value_t *args,
             array->start[i] = args[i + 1];
         }
 
-        return NXT_OK;
+        return NJS_OK;
 }
 
 
@@ -301,9 +301,9 @@ static const njs_object_prop_t  njs_array_constructor_properties[] =
 
 
 const njs_object_init_t  njs_array_constructor_init = {
-    nxt_string("Array"),
+    njs_str("Array"),
     njs_array_constructor_properties,
-    nxt_nitems(njs_array_constructor_properties),
+    njs_nitems(njs_array_constructor_properties),
 };
 
 
@@ -322,16 +322,16 @@ njs_array_length(njs_vm_t *vm, njs_value_t *value, njs_value_t *setval,
 
     proto = njs_object(value);
 
-    if (nxt_fast_path(setval == NULL)) {
+    if (njs_fast_path(setval == NULL)) {
         do {
-            if (nxt_fast_path(proto->type == NJS_ARRAY)) {
+            if (njs_fast_path(proto->type == NJS_ARRAY)) {
                 break;
             }
 
             proto = proto->__proto__;
         } while (proto != NULL);
 
-        if (nxt_slow_path(proto == NULL)) {
+        if (njs_slow_path(proto == NULL)) {
             njs_internal_error(vm, "no array in proto chain");
             return NJS_ERROR;
         }
@@ -346,9 +346,9 @@ njs_array_length(njs_vm_t *vm, njs_value_t *value, njs_value_t *setval,
         return NJS_DECLINED;
     }
 
-    if (nxt_slow_path(!njs_is_number(setval))) {
+    if (njs_slow_path(!njs_is_number(setval))) {
         ret = njs_value_to_numeric(vm, &val_length, setval);
-        if (ret != NXT_OK) {
+        if (ret != NJS_OK) {
             return ret;
         }
 
@@ -371,7 +371,7 @@ njs_array_length(njs_vm_t *vm, njs_value_t *value, njs_value_t *setval,
 
     if (size > 0) {
         ret = njs_array_expand(vm, array, 0, size);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
 
@@ -397,7 +397,7 @@ njs_array_length(njs_vm_t *vm, njs_value_t *value, njs_value_t *setval,
  */
 
 static njs_ret_t
-njs_array_prototype_slice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_slice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     int64_t      start, end, length;
@@ -407,13 +407,13 @@ njs_array_prototype_slice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     static const njs_value_t  string_length = njs_string("length");
 
     ret = njs_value_property(vm, &args[0], &string_length, &prop_length);
-    if (nxt_slow_path(ret == NXT_ERROR)) {
+    if (njs_slow_path(ret == NJS_ERROR)) {
         return ret;
     }
 
-    if (nxt_slow_path(!njs_is_primitive(&prop_length))) {
+    if (njs_slow_path(!njs_is_primitive(&prop_length))) {
         ret = njs_value_to_numeric(vm, &prop_length, &prop_length);
-        if (ret != NXT_OK) {
+        if (ret != NJS_OK) {
             return ret;
         }
     }
@@ -477,8 +477,8 @@ njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this,
     njs_string_prop_t  string;
 
     array = njs_array_alloc(vm, length, NJS_ARRAY_SPARE);
-    if (nxt_slow_path(array == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(array == NULL)) {
+        return NJS_ERROR;
     }
 
     njs_set_array(&vm->retval, array);
@@ -486,7 +486,7 @@ njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this,
     if (length != 0) {
         n = 0;
 
-        if (nxt_fast_path(njs_is_array(this))) {
+        if (njs_fast_path(njs_is_array(this))) {
             value = njs_array_start(this);
 
             do {
@@ -526,7 +526,7 @@ njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this,
                 do {
                     value = &array->start[n++];
                     dst = njs_string_short_start(value);
-                    dst = nxt_utf8_copy(dst, &src, end);
+                    dst = njs_utf8_copy(dst, &src, end);
                     size = dst - njs_string_short_start(value);
                     njs_string_short_set(value, size, 1);
 
@@ -542,7 +542,7 @@ njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this,
                 value = &array->start[n++];
                 ret = njs_value_property(vm, this, &name, value);
 
-                if (ret != NXT_OK) {
+                if (ret != NJS_OK) {
                     *value = njs_value_invalid;
                 }
 
@@ -562,16 +562,16 @@ njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this,
         }
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_ret_t    ret;
-    nxt_uint_t   i;
+    njs_uint_t   i;
     njs_array_t  *array;
 
     if (njs_is_array(&args[0])) {
@@ -579,7 +579,7 @@ njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         if (nargs != 0) {
             ret = njs_array_expand(vm, array, 0, nargs);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -592,12 +592,12 @@ njs_array_prototype_push(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         njs_set_number(&vm->retval, array->length);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_pop(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_pop(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_array_t        *array;
@@ -620,16 +620,16 @@ njs_array_prototype_pop(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_ret_t    ret;
-    nxt_uint_t   n;
+    njs_uint_t   n;
     njs_array_t  *array;
 
     if (njs_is_array(&args[0])) {
@@ -638,7 +638,7 @@ njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         if (n != 0) {
             ret = njs_array_expand(vm, array, n, 0);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -656,12 +656,12 @@ njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         njs_set_number(&vm->retval, array->length);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_shift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_shift(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_array_t        *array;
@@ -686,17 +686,17 @@ njs_array_prototype_shift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_ret_t    ret;
-    nxt_int_t    n, start, length, items, delta, delete;
-    nxt_uint_t   i;
+    njs_int_t    n, start, length, items, delta, delete;
+    njs_uint_t   i;
     njs_array_t  *array, *deleted;
 
     array = NULL;
@@ -737,14 +737,14 @@ njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     deleted = njs_array_alloc(vm, delete, 0);
-    if (nxt_slow_path(deleted == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(deleted == NULL)) {
+        return NJS_ERROR;
     }
 
     if (array != NULL && (delete >= 0 || nargs > 3)) {
 
         /* Move deleted items to a new array to return. */
-        for (i = 0, n = start; i < (nxt_uint_t) delete; i++, n++) {
+        for (i = 0, n = start; i < (njs_uint_t) delete; i++, n++) {
             /* No retention required. */
             deleted->start[i] = array->start[n];
         }
@@ -764,7 +764,7 @@ njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
              */
             if (delta > 0) {
                 ret = njs_array_expand(vm, array, 0, delta);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
             }
@@ -786,15 +786,15 @@ njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_array(&vm->retval, deleted);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_uint_t   i, n, length;
+    njs_uint_t   i, n, length;
     njs_value_t  value;
     njs_array_t  *array;
 
@@ -817,24 +817,24 @@ njs_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         vm->retval = args[0];
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_to_string(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     if (njs_is_object(&args[0])) {
         lhq.key_hash = NJS_JOIN_HASH;
-        lhq.key = nxt_string_value("join");
+        lhq.key = njs_str_value("join");
 
         prop = njs_object_property(vm, njs_object(&args[0]), &lhq);
 
-        if (nxt_fast_path(prop != NULL && njs_is_function(&prop->value))) {
+        if (njs_fast_path(prop != NULL && njs_is_function(&prop->value))) {
             return njs_function_apply(vm, njs_function(&prop->value), args,
                                       nargs, &vm->retval);
         }
@@ -845,21 +845,21 @@ njs_array_prototype_to_string(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char             *p;
     uint32_t           max;
     size_t             size, length, mask;
     njs_ret_t          ret;
-    nxt_uint_t         i, n;
+    njs_uint_t         i, n;
     njs_array_t        *array;
     njs_value_t        *value, *values;
     njs_string_prop_t  separator, string;
 
     if (!njs_is_array(&args[0]) || njs_array_len(&args[0]) == 0) {
         vm->retval = njs_string_empty;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     array = njs_array(&args[0]);
@@ -879,11 +879,11 @@ njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     if (max != 0) {
-        values = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
+        values = njs_mp_align(vm->mem_pool, sizeof(njs_value_t),
                               sizeof(njs_value_t) * max);
-        if (nxt_slow_path(values == NULL)) {
+        if (njs_slow_path(values == NULL)) {
             njs_memory_error(vm);
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         n = 0;
@@ -921,7 +921,7 @@ njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
                 if (!njs_is_string(value)) {
                     ret = njs_value_to_string(vm, value, value);
-                    if (ret != NXT_OK) {
+                    if (ret != NJS_OK) {
                         return ret;
                     }
                 }
@@ -953,8 +953,8 @@ njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     length &= mask;
 
     p = njs_string_alloc(vm, &vm->retval, size, length);
-    if (nxt_slow_path(p == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(p == NULL)) {
+        return NJS_ERROR;
     }
 
     n = 0;
@@ -983,18 +983,18 @@ njs_array_prototype_join(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         njs_release(vm, &values[i]);
     }
 
-    nxt_mp_free(vm->mem_pool, values);
+    njs_mp_free(vm->mem_pool, values);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_concat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     uint64_t     length;
-    nxt_uint_t   i;
+    njs_uint_t   i;
     njs_value_t  *value;
     njs_array_t  *array;
 
@@ -1010,8 +1010,8 @@ njs_array_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     array = njs_array_alloc(vm, length, NJS_ARRAY_SPARE);
-    if (nxt_slow_path(array == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(array == NULL)) {
+        return NJS_ERROR;
     }
 
     njs_set_array(&vm->retval, array);
@@ -1022,14 +1022,14 @@ njs_array_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         value = njs_array_copy(value, &args[i]);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_value_t *
 njs_array_copy(njs_value_t *dst, njs_value_t *src)
 {
-    nxt_uint_t  n;
+    njs_uint_t  n;
 
     n = 1;
 
@@ -1049,10 +1049,10 @@ njs_array_copy(njs_value_t *dst, njs_value_t *src)
 
 
 static njs_ret_t
-njs_array_prototype_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_index_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_int_t    i, index, length;
+    njs_int_t    i, index, length;
     njs_value_t  *value, *start;
     njs_array_t  *array;
 
@@ -1104,15 +1104,15 @@ done:
 
     njs_set_number(&vm->retval, index);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_array_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
-    nxt_int_t          k, n, index, length;
+    njs_int_t          k, n, index, length;
     njs_value_t        *start;
     njs_array_t        *array;
     const njs_value_t  *this, *value;
@@ -1140,7 +1140,7 @@ njs_array_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
     }
 
     if (n >= 0) {
-        k = nxt_min(n, length - 1);
+        k = njs_min(n, length - 1);
 
     } else {
         k = n + length;
@@ -1167,15 +1167,15 @@ done:
 
     njs_set_number(&vm->retval, index);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_includes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_includes(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_int_t          i, length;
+    njs_int_t          i, length;
     njs_value_t        *value, *start;
     njs_array_t        *array;
     const njs_value_t  *retval;
@@ -1244,16 +1244,16 @@ done:
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_fill(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_fill(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_ret_t          ret;
-    nxt_int_t          i, start, end, length;
+    njs_int_t          i, start, end, length;
     njs_array_t        *array;
     njs_value_t        name, prop_length;
     njs_object_t       *object;
@@ -1271,13 +1271,13 @@ njs_array_prototype_fill(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         }
 
         object = njs_object_value_alloc(vm, this, this->type);
-        if (nxt_slow_path(object == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(object == NULL)) {
+            return NJS_ERROR;
         }
 
         njs_set_type_object(&vm->retval, object, object->type);
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     array = NULL;
@@ -1288,13 +1288,13 @@ njs_array_prototype_fill(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     } else {
         ret = njs_value_property(vm, this, &string_length, &prop_length);
-        if (nxt_slow_path(ret == NXT_ERROR)) {
+        if (njs_slow_path(ret == NJS_ERROR)) {
             return ret;
         }
 
-        if (nxt_slow_path(!njs_is_primitive(&prop_length))) {
+        if (njs_slow_path(!njs_is_primitive(&prop_length))) {
             ret = njs_value_to_numeric(vm, &prop_length, &prop_length);
-            if (ret != NXT_OK) {
+            if (ret != NJS_OK) {
                 return ret;
             }
         }
@@ -1303,7 +1303,7 @@ njs_array_prototype_fill(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     start = njs_primitive_value_to_integer(njs_arg(args, nargs, 2));
-    start = (start < 0) ? nxt_max(length + start, 0) : nxt_min(start, length);
+    start = (start < 0) ? njs_max(length + start, 0) : njs_min(start, length);
 
     if (njs_is_undefined(njs_arg(args, nargs, 3))) {
         end = length;
@@ -1312,7 +1312,7 @@ njs_array_prototype_fill(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         end = njs_primitive_value_to_integer(njs_arg(args, nargs, 3));
     }
 
-    end = (end < 0) ? nxt_max(length + end, 0) : nxt_min(end, length);
+    end = (end < 0) ? njs_max(length + end, 0) : njs_min(end, length);
 
     value = njs_arg(args, nargs, 1);
 
@@ -1323,7 +1323,7 @@ njs_array_prototype_fill(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         vm->retval = *this;
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     value = njs_arg(args, nargs, 1);
@@ -1333,18 +1333,18 @@ njs_array_prototype_fill(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         ret = njs_value_property_set(vm, (njs_value_t *) this, &name,
                                      (njs_value_t *) value);
-        if (nxt_slow_path(ret == NXT_ERROR)) {
+        if (njs_slow_path(ret == NJS_ERROR)) {
             return ret;
         }
     }
 
     vm->retval = *this;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-nxt_inline njs_ret_t
+njs_inline njs_ret_t
 njs_array_iterator_call(njs_vm_t *vm, njs_function_t *function,
     const njs_value_t *this_arg, njs_value_t *value, uint32_t n,
     njs_value_t *array)
@@ -1363,18 +1363,18 @@ njs_array_iterator_call(njs_vm_t *vm, njs_function_t *function,
 
 
 static njs_ret_t
-njs_array_prototype_for_each(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_for_each(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     uint32_t           i, length;
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_value_t        *array, *value;
     njs_function_t     *function;
     const njs_value_t  *this_arg;
 
     if (nargs < 2 || !njs_is_array(&args[0]) || !njs_is_function(&args[1])) {
         njs_type_error(vm, "unexpected iterator arguments");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = &args[0];
@@ -1388,33 +1388,33 @@ njs_array_prototype_for_each(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         if (njs_is_valid(value)) {
             ret = njs_array_iterator_call(vm, function, this_arg, value, i,
                                           array);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
         }
 
-        length = nxt_min(length, njs_array_len(array));
+        length = njs_min(length, njs_array_len(array));
     }
 
     vm->retval = njs_value_undefined;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_some(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_some(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     uint32_t           i, length;
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_value_t        *array, *value;
     njs_function_t     *function;
     const njs_value_t  *this_arg, *retval;
 
     if (nargs < 2 || !njs_is_array(&args[0]) || !njs_is_function(&args[1])) {
         njs_type_error(vm, "unexpected iterator arguments");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = &args[0];
@@ -1430,7 +1430,7 @@ njs_array_prototype_some(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         if (njs_is_valid(value)) {
             ret = njs_array_iterator_call(vm, function, this_arg, value, i,
                                           array);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -1440,28 +1440,28 @@ njs_array_prototype_some(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             }
         }
 
-        length = nxt_min(length, njs_array_len(array));
+        length = njs_min(length, njs_array_len(array));
     }
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_every(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_every(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     uint32_t           i, length;
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_value_t        *array, *value;
     njs_function_t     *function;
     const njs_value_t  *this_arg, *retval;
 
     if (nargs < 2 || !njs_is_array(&args[0]) || !njs_is_function(&args[1])) {
         njs_type_error(vm, "unexpected iterator arguments");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = &args[0];
@@ -1477,7 +1477,7 @@ njs_array_prototype_every(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         if (njs_is_valid(value)) {
             ret = njs_array_iterator_call(vm, function, this_arg, value, i,
                                           array);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -1487,21 +1487,21 @@ njs_array_prototype_every(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             }
         }
 
-        length = nxt_min(length, njs_array_len(array));
+        length = njs_min(length, njs_array_len(array));
     }
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_filter(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_filter(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     uint32_t           i, length;
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_array_t        *retval;
     njs_value_t        *array, value;
     njs_function_t     *function;
@@ -1509,7 +1509,7 @@ njs_array_prototype_filter(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (nargs < 2 || !njs_is_array(&args[0]) || !njs_is_function(&args[1])) {
         njs_type_error(vm, "unexpected iterator arguments");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = &args[0];
@@ -1518,8 +1518,8 @@ njs_array_prototype_filter(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     this_arg = njs_arg(args, nargs, 2);
 
     retval = njs_array_alloc(vm, 0, NJS_ARRAY_SPARE);
-    if (nxt_slow_path(retval == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(retval == NULL)) {
+        return NJS_ERROR;
     }
 
     for (i = 0; i < length; i++) {
@@ -1528,40 +1528,40 @@ njs_array_prototype_filter(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         if (njs_is_valid(&value)) {
             ret = njs_array_iterator_call(vm, function, this_arg, &value, i,
                                           array);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
             if (njs_is_true(&vm->retval)) {
                 ret = njs_array_add(vm, retval, &value);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
             }
         }
 
-        length = nxt_min(length, njs_array_len(array));
+        length = njs_min(length, njs_array_len(array));
     }
 
     njs_set_array(&vm->retval, retval);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_find(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_find(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     uint32_t           i, length;
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_value_t        *array, value;
     njs_function_t     *function;
     const njs_value_t  *this_arg, *retval;
 
     if (nargs < 2 || !njs_is_array(&args[0]) || !njs_is_function(&args[1])) {
         njs_type_error(vm, "unexpected iterator arguments");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = &args[0];
@@ -1579,7 +1579,7 @@ njs_array_prototype_find(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         }
 
         ret = njs_array_iterator_call(vm, function, this_arg, &value, i, array);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -1588,29 +1588,29 @@ njs_array_prototype_find(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             break;
         }
 
-        length = nxt_min(length, njs_array_len(array));
+        length = njs_min(length, njs_array_len(array));
     }
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_array_prototype_find_index(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double             index;
     uint32_t           i, length;
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_value_t        *array, value;
     njs_function_t     *function;
     const njs_value_t  *this_arg;
 
     if (nargs < 2 || !njs_is_array(&args[0]) || !njs_is_function(&args[1])) {
         njs_type_error(vm, "unexpected iterator arguments");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = &args[0];
@@ -1628,7 +1628,7 @@ njs_array_prototype_find_index(njs_vm_t *vm, njs_value_t *args,
         }
 
         ret = njs_array_iterator_call(vm, function, this_arg, &value, i, array);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -1637,21 +1637,21 @@ njs_array_prototype_find_index(njs_vm_t *vm, njs_value_t *args,
             break;
         }
 
-        length = nxt_min(length, njs_array_len(array));
+        length = njs_min(length, njs_array_len(array));
     }
 
     njs_set_number(&vm->retval, index);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     uint32_t           i, length, size;
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_array_t        *retval;
     njs_value_t        *array, *value;
     njs_function_t     *function;
@@ -1659,7 +1659,7 @@ njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (nargs < 2 || !njs_is_array(&args[0]) || !njs_is_function(&args[1])) {
         njs_type_error(vm, "unexpected iterator arguments");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = &args[0];
@@ -1670,8 +1670,8 @@ njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     size = length;
 
     retval = njs_array_alloc(vm, length, 0);
-    if (nxt_slow_path(retval == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(retval == NULL)) {
+        return NJS_ERROR;
     }
 
     for (i = 0; i < length; i++) {
@@ -1682,7 +1682,7 @@ njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         if (njs_is_valid(value)) {
             ret = njs_array_iterator_call(vm, function, this_arg, value, i,
                                           array);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -1691,7 +1691,7 @@ njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             }
         }
 
-        length = nxt_min(length, njs_array_len(array));
+        length = njs_min(length, njs_array_len(array));
     }
 
     for ( ; i < size; i++) {
@@ -1700,11 +1700,11 @@ njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_array(&vm->retval, retval);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-nxt_inline njs_ret_t
+njs_inline njs_ret_t
 njs_array_iterator_reduce(njs_vm_t *vm, njs_function_t *function,
     njs_value_t *accumulator, njs_value_t *value, uint32_t n,
     njs_value_t *array)
@@ -1724,17 +1724,17 @@ njs_array_iterator_reduce(njs_vm_t *vm, njs_function_t *function,
 
 
 static njs_ret_t
-njs_array_prototype_reduce(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_array_prototype_reduce(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     uint32_t        i, length;
-    nxt_int_t       ret;
+    njs_int_t       ret;
     njs_value_t     accumulator, *array, *value;
     njs_function_t  *function;
 
     if (nargs < 2 || !njs_is_array(&args[0]) || !njs_is_function(&args[1])) {
         njs_type_error(vm, "unexpected iterator arguments");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = &args[0];
@@ -1759,38 +1759,38 @@ njs_array_prototype_reduce(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
             ret = njs_array_iterator_reduce(vm, function, &accumulator, value,
                                             i, array);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
         }
 
-        length = nxt_min(length, njs_array_len(array));
+        length = njs_min(length, njs_array_len(array));
     }
 
     if (!njs_is_valid(&accumulator)) {
         njs_type_error(vm, "invalid index");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     vm->retval = accumulator;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_array_prototype_reduce_right(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     int32_t         i;
     uint32_t        length;
-    nxt_int_t       ret;
+    njs_int_t       ret;
     njs_value_t     accumulator, *array, *value;
     njs_function_t  *function;
 
     if (nargs < 2 || !njs_is_array(&args[0]) || !njs_is_function(&args[1])) {
         njs_type_error(vm, "unexpected iterator arguments");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = &args[0];
@@ -1815,36 +1815,36 @@ njs_array_prototype_reduce_right(njs_vm_t *vm, njs_value_t *args,
 
             ret = njs_array_iterator_reduce(vm, function, &accumulator, value,
                                             i, array);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
         }
 
-        length = nxt_min(length, njs_array_len(array));
+        length = njs_min(length, njs_array_len(array));
     }
 
     if (!njs_is_valid(&accumulator)) {
         njs_type_error(vm, "invalid index");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     vm->retval = accumulator;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_array_string_sort(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
-    nxt_int_t   ret;
-    nxt_uint_t  i;
+    njs_int_t   ret;
+    njs_uint_t  i;
 
     for (i = 1; i < nargs; i++) {
         if (!njs_is_string(&args[i])) {
             ret = njs_value_to_string(vm, &args[i], &args[i]);
-            if (ret != NXT_OK) {
+            if (ret != NJS_OK) {
                 return ret;
             }
         }
@@ -1854,7 +1854,7 @@ njs_array_string_sort(njs_vm_t *vm, njs_value_t *args,
 
     njs_set_number(&vm->retval, ret);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1869,17 +1869,17 @@ static const njs_function_t  njs_array_string_sort_function = {
 
 static njs_ret_t
 njs_array_prototype_sort(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     uint32_t        n, index, current;
-    nxt_int_t       ret;
+    njs_int_t       ret;
     njs_array_t     *array;
     njs_value_t     retval, value, *start, arguments[3];;
     njs_function_t  *function;
 
     if (!njs_is_array(&args[0]) || njs_array_len(&args[0]) == 0) {
         vm->retval = args[0];
-        return NXT_OK;
+        return NJS_OK;
     }
 
     if (nargs > 1 && njs_is_function(&args[1])) {
@@ -1936,7 +1936,7 @@ start:
                         ret = njs_function_apply(vm, function, arguments, 3,
                                                  &retval);
 
-                        if (nxt_slow_path(ret != NXT_OK)) {
+                        if (njs_slow_path(ret != NJS_OK)) {
                             return ret;
                         }
 
@@ -1958,7 +1958,7 @@ start:
 
     vm->retval = args[0];
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -2187,9 +2187,9 @@ static const njs_object_prop_t  njs_array_prototype_properties[] =
 
 
 const njs_object_init_t  njs_array_prototype_init = {
-    nxt_string("Array"),
+    njs_str("Array"),
     njs_array_prototype_properties,
-    nxt_nitems(njs_array_prototype_properties),
+    njs_nitems(njs_array_prototype_properties),
 };
 
 
@@ -2205,7 +2205,7 @@ const njs_object_prop_t  njs_array_instance_properties[] =
 
 
 const njs_object_init_t  njs_array_instance_init = {
-    nxt_string("Array instance"),
+    njs_str("Array instance"),
     njs_array_instance_properties,
-    nxt_nitems(njs_array_instance_properties),
+    njs_nitems(njs_array_instance_properties),
 };
similarity index 95%
rename from njs/njs_array.h
rename to src/njs_array.h
index 326e72107877f79626ef8753fe748c03c680c582..88f88a8ff71f72f9646ca78cf7dcac1b1c5a459e 100644 (file)
@@ -22,7 +22,7 @@ njs_ret_t njs_array_string_add(njs_vm_t *vm, njs_array_t *array,
 njs_ret_t njs_array_expand(njs_vm_t *vm, njs_array_t *array, uint32_t prepend,
     uint32_t append);
 njs_ret_t njs_array_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 extern const njs_object_init_t  njs_array_constructor_init;
 extern const njs_object_init_t  njs_array_prototype_init;
similarity index 86%
rename from njs/njs_boolean.c
rename to src/njs_boolean.c
index 441829d7ee6d8367eb00bc3894a7caa28b5316a1..e409ec38f19f3844d2b6614d37a3a66aad9fb7d1 100644 (file)
@@ -4,11 +4,11 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 
 
 njs_ret_t
-njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_object_t       *object;
@@ -23,8 +23,8 @@ njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (vm->top_frame->ctor) {
         object = njs_object_value_alloc(vm, value, value->type);
-        if (nxt_slow_path(object == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(object == NULL)) {
+            return NJS_ERROR;
         }
 
         njs_set_type_object(&vm->retval, object, NJS_OBJECT_BOOLEAN);
@@ -33,7 +33,7 @@ njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         vm->retval = *value;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -65,15 +65,15 @@ static const njs_object_prop_t  njs_boolean_constructor_properties[] =
 
 
 const njs_object_init_t  njs_boolean_constructor_init = {
-    nxt_string("Boolean"),
+    njs_str("Boolean"),
     njs_boolean_constructor_properties,
-    nxt_nitems(njs_boolean_constructor_properties),
+    njs_nitems(njs_boolean_constructor_properties),
 };
 
 
 static njs_ret_t
 njs_boolean_prototype_value_of(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     njs_value_t  *value;
 
@@ -87,19 +87,19 @@ njs_boolean_prototype_value_of(njs_vm_t *vm, njs_value_t *args,
         } else {
             njs_type_error(vm, "unexpected value type:%s",
                            njs_type_string(value->type));
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_boolean_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     njs_value_t  *value;
 
@@ -113,13 +113,13 @@ njs_boolean_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
         } else {
             njs_type_error(vm, "unexpected value type:%s",
                            njs_type_string(value->type));
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
     vm->retval = njs_is_true(value) ? njs_string_true : njs_string_false;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -160,7 +160,7 @@ static const njs_object_prop_t  njs_boolean_prototype_properties[] =
 
 
 const njs_object_init_t  njs_boolean_prototype_init = {
-    nxt_string("Boolean"),
+    njs_str("Boolean"),
     njs_boolean_prototype_properties,
-    nxt_nitems(njs_boolean_prototype_properties),
+    njs_nitems(njs_boolean_prototype_properties),
 };
similarity index 89%
rename from njs/njs_boolean.h
rename to src/njs_boolean.h
index 9f087537841eb1235de680c3ef6c9faf33081a67..cf8de9edf60104786f41864593bdc3a5a48f27da 100644 (file)
@@ -9,7 +9,7 @@
 
 
 njs_ret_t njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 extern const njs_object_init_t  njs_boolean_constructor_init;
 extern const njs_object_init_t  njs_boolean_prototype_init;
similarity index 77%
rename from njs/njs_builtin.c
rename to src/njs_builtin.c
index acdd7a0bd2db9a7ae3f2391ca234e6026da9b418..0e50c285d3494e3765950108ac772dba0293768e 100644 (file)
@@ -5,10 +5,10 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_regexp.h>
 #include <njs_date.h>
-#include <njs_time.h>
+#include <njs_timer.h>
 #include <njs_math.h>
 #include <njs_json.h>
 #include <njs_module.h>
@@ -24,11 +24,11 @@ typedef struct {
 
 
 static njs_ret_t njs_prototype_function(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
-static nxt_array_t *njs_vm_expression_completions(njs_vm_t *vm,
-    nxt_str_t *expression);
-static nxt_array_t *njs_object_completions(njs_vm_t *vm, njs_object_t *object);
-static nxt_int_t njs_env_hash_init(njs_vm_t *vm, nxt_lvlhsh_t *hash,
+    njs_uint_t nargs, njs_index_t unused);
+static njs_arr_t *njs_vm_expression_completions(njs_vm_t *vm,
+    njs_str_t *expression);
+static njs_arr_t *njs_object_completions(njs_vm_t *vm, njs_object_t *object);
+static njs_int_t njs_env_hash_init(njs_vm_t *vm, njs_lvlhsh_t *hash,
     char **environment);
 
 
@@ -221,59 +221,59 @@ const njs_object_prototype_t  njs_prototype_values[] = {
 extern char  **environ;
 
 
-nxt_inline nxt_int_t
-njs_object_hash_init(njs_vm_t *vm, nxt_lvlhsh_t *hash,
+njs_inline njs_int_t
+njs_object_hash_init(njs_vm_t *vm, njs_lvlhsh_t *hash,
     const njs_object_init_t *init)
 {
     return njs_object_hash_create(vm, hash, init->properties, init->items);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_builtin_objects_create(njs_vm_t *vm)
 {
-    nxt_int_t                  ret;
+    njs_int_t                  ret;
     njs_module_t               *module;
     njs_object_t               *object, *string_object;
     njs_function_t             *func;
     njs_vm_shared_t            *shared;
-    nxt_lvlhsh_query_t         lhq;
+    njs_lvlhsh_query_t         lhq;
     njs_object_prototype_t     *prototype;
     const njs_object_init_t    *obj, **p;
     const njs_function_init_t  *f;
 
-    static const nxt_str_t  sandbox_key = nxt_string("sandbox");
+    static const njs_str_t  sandbox_key = njs_str("sandbox");
 
     shared = vm->shared;
 
     ret = njs_object_hash_init(vm, &shared->array_instance_hash,
                                &njs_array_instance_init);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     ret = njs_object_hash_init(vm, &shared->string_instance_hash,
                                &njs_string_instance_init);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     ret = njs_object_hash_init(vm, &shared->function_instance_hash,
                                &njs_function_instance_init);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     ret = njs_object_hash_init(vm, &shared->arrow_instance_hash,
                                &njs_arrow_instance_init);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     ret = njs_object_hash_init(vm, &shared->arguments_object_instance_hash,
                                &njs_arguments_object_instance_init);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     object = shared->objects;
@@ -282,8 +282,8 @@ njs_builtin_objects_create(njs_vm_t *vm)
         obj = *p;
 
         ret = njs_object_hash_init(vm, &object->shared_hash, obj);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         object->shared = 1;
@@ -293,8 +293,8 @@ njs_builtin_objects_create(njs_vm_t *vm)
     }
 
     ret = njs_env_hash_init(vm, &shared->env_hash, environ);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     lhq.replace = 0;
@@ -303,25 +303,25 @@ njs_builtin_objects_create(njs_vm_t *vm)
     for (p = njs_module_init; *p != NULL; p++) {
         obj = *p;
 
-        module = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_module_t));
-        if (nxt_slow_path(module == NULL)) {
+        module = njs_mp_zalloc(vm->mem_pool, sizeof(njs_module_t));
+        if (njs_slow_path(module == NULL)) {
             return NJS_ERROR;
         }
 
         module->function.native = 1;
 
         ret = njs_object_hash_init(vm, &module->object.shared_hash, obj);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         if (vm->options.sandbox) {
             lhq.key = sandbox_key;
-            lhq.key_hash = nxt_djb_hash(sandbox_key.start, sandbox_key.length);
+            lhq.key_hash = njs_djb_hash(sandbox_key.start, sandbox_key.length);
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(&module->object.shared_hash, &lhq);
-            if (nxt_fast_path(ret != NXT_OK)) {
+            ret = njs_lvlhsh_find(&module->object.shared_hash, &lhq);
+            if (njs_fast_path(ret != NJS_OK)) {
                 continue;
             }
         }
@@ -330,13 +330,13 @@ njs_builtin_objects_create(njs_vm_t *vm)
         module->object.shared = 1;
 
         lhq.key = module->name;
-        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
         lhq.proto = &njs_modules_hash_proto;
         lhq.value = module;
 
-        ret = nxt_lvlhsh_insert(&vm->modules_hash, &lhq);
-        if (nxt_fast_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        ret = njs_lvlhsh_insert(&vm->modules_hash, &lhq);
+        if (njs_fast_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
     }
 
@@ -347,8 +347,8 @@ njs_builtin_objects_create(njs_vm_t *vm)
         obj = *p;
 
         ret = njs_object_hash_init(vm, &func->object.shared_hash, obj);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         func->object.shared = 1;
@@ -370,8 +370,8 @@ njs_builtin_objects_create(njs_vm_t *vm)
         obj = *p;
 
         ret = njs_object_hash_init(vm, &prototype->object.shared_hash, obj);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         prototype->object.extensible = 1;
@@ -383,7 +383,7 @@ njs_builtin_objects_create(njs_vm_t *vm)
                                               vm->shared->empty_regexp_pattern;
 
     string_object = &shared->string_object;
-    nxt_lvlhsh_init(&string_object->hash);
+    njs_lvlhsh_init(&string_object->hash);
     string_object->shared_hash = vm->shared->string_instance_hash;
     string_object->type = NJS_OBJECT_STRING;
     string_object->shared = 1;
@@ -407,25 +407,25 @@ njs_builtin_objects_create(njs_vm_t *vm)
         memcpy(func->args_types, f->args_types, NJS_ARGS_TYPES_MAX);
 
         ret = njs_object_hash_init(vm, &func->object.shared_hash, obj);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         f++;
         func++;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_prototype_function(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_prototype_function(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     vm->retval = njs_value_undefined;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -503,11 +503,11 @@ njs_prototype_function(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
  * eval.__proto__               -> Function_Prototype.
  */
 
-nxt_int_t
+njs_int_t
 njs_builtin_objects_clone(njs_vm_t *vm)
 {
     size_t        size;
-    nxt_uint_t    i;
+    njs_uint_t    i;
     njs_value_t   *values;
     njs_object_t  *object_prototype, *function_prototype, *error_prototype;
 
@@ -543,26 +543,26 @@ njs_builtin_objects_clone(njs_vm_t *vm)
     vm->string_object = vm->shared->string_object;
     vm->string_object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_STRING].object;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static size_t
 njs_builtin_completions_size(njs_vm_t *vm)
 {
-    nxt_uint_t               n;
+    njs_uint_t               n;
     njs_keyword_t            *keyword;
-    nxt_lvlhsh_each_t        lhe, lhe_prop;
+    njs_lvlhsh_each_t        lhe, lhe_prop;
     njs_extern_value_t       *ev;
     const njs_extern_t       *ext_proto, *ext_prop;
     const njs_object_init_t  **p;
 
     n = 0;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_keyword_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_keyword_hash_proto);
 
     for ( ;; ) {
-        keyword = nxt_lvlhsh_each(&vm->shared->keywords_hash, &lhe);
+        keyword = njs_lvlhsh_each(&vm->shared->keywords_hash, &lhe);
 
         if (keyword == NULL) {
             break;
@@ -583,10 +583,10 @@ njs_builtin_completions_size(njs_vm_t *vm)
         n += (*p)->items;
     }
 
-    nxt_lvlhsh_each_init(&lhe, &njs_extern_value_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_extern_value_hash_proto);
 
     for ( ;; ) {
-        ev = nxt_lvlhsh_each(&vm->externals_hash, &lhe);
+        ev = njs_lvlhsh_each(&vm->externals_hash, &lhe);
 
         if (ev == NULL) {
             break;
@@ -594,12 +594,12 @@ njs_builtin_completions_size(njs_vm_t *vm)
 
         ext_proto = ev->value.external.proto;
 
-        nxt_lvlhsh_each_init(&lhe_prop, &njs_extern_hash_proto);
+        njs_lvlhsh_each_init(&lhe_prop, &njs_extern_hash_proto);
 
         n++;
 
         for ( ;; ) {
-            ext_prop = nxt_lvlhsh_each(&ext_proto->hash, &lhe_prop);
+            ext_prop = njs_lvlhsh_each(&ext_proto->hash, &lhe_prop);
 
             if (ext_prop == NULL) {
                 break;
@@ -613,15 +613,15 @@ njs_builtin_completions_size(njs_vm_t *vm)
 }
 
 
-static nxt_array_t *
-njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
+static njs_arr_t *
+njs_builtin_completions(njs_vm_t *vm, njs_arr_t *array)
 {
     u_char                   *compl;
     size_t                   n, len;
-    nxt_str_t                string, *completions;
-    nxt_uint_t               i, k;
+    njs_str_t                string, *completions;
+    njs_uint_t               i, k;
     njs_keyword_t            *keyword;
-    nxt_lvlhsh_each_t        lhe, lhe_prop;
+    njs_lvlhsh_each_t        lhe, lhe_prop;
     njs_extern_value_t       *ev;
     const njs_extern_t       *ext_proto, *ext_prop;
     const njs_object_prop_t  *prop;
@@ -630,10 +630,10 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
     n = 0;
     completions = array->start;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_keyword_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_keyword_hash_proto);
 
     for ( ;; ) {
-        keyword = nxt_lvlhsh_each(&vm->shared->keywords_hash, &lhe);
+        keyword = njs_lvlhsh_each(&vm->shared->keywords_hash, &lhe);
 
         if (keyword == NULL) {
             break;
@@ -650,12 +650,12 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
             njs_string_get(&prop->name, &string);
             len = obj->name.length + string.length + 2;
 
-            compl = nxt_mp_zalloc(vm->mem_pool, len);
+            compl = njs_mp_zalloc(vm->mem_pool, len);
             if (compl == NULL) {
                 return NULL;
             }
 
-            nxt_sprintf(compl, compl + len, "%s.%s%Z", obj->name.start,
+            njs_sprintf(compl, compl + len, "%s.%s%Z", obj->name.start,
                         string.start);
 
             completions[n].length = len;
@@ -671,15 +671,15 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
             njs_string_get(&prop->name, &string);
             len = string.length + 2;
 
-            compl = nxt_mp_zalloc(vm->mem_pool, len);
+            compl = njs_mp_zalloc(vm->mem_pool, len);
             if (compl == NULL) {
                 return NULL;
             }
 
-            nxt_sprintf(compl, compl + len, ".%s%Z", string.start);
+            njs_sprintf(compl, compl + len, ".%s%Z", string.start);
 
             for (k = 0; k < n; k++) {
-                if (nxt_strncmp(completions[k].start, compl, len) == 0) {
+                if (njs_strncmp(completions[k].start, compl, len) == 0) {
                     break;
                 }
             }
@@ -699,12 +699,12 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
             njs_string_get(&prop->name, &string);
             len = obj->name.length + string.length + 2;
 
-            compl = nxt_mp_zalloc(vm->mem_pool, len);
+            compl = njs_mp_zalloc(vm->mem_pool, len);
             if (compl == NULL) {
                 return NULL;
             }
 
-            nxt_sprintf(compl, compl + len, "%s.%s%Z", obj->name.start,
+            njs_sprintf(compl, compl + len, "%s.%s%Z", obj->name.start,
                         string.start);
 
             completions[n].length = len;
@@ -712,10 +712,10 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
         }
     }
 
-    nxt_lvlhsh_each_init(&lhe, &njs_extern_value_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_extern_value_hash_proto);
 
     for ( ;; ) {
-        ev = nxt_lvlhsh_each(&vm->externals_hash, &lhe);
+        ev = njs_lvlhsh_each(&vm->externals_hash, &lhe);
 
         if (ev == NULL) {
             break;
@@ -723,33 +723,33 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
 
         ext_proto = ev->value.external.proto;
 
-        nxt_lvlhsh_each_init(&lhe_prop, &njs_extern_hash_proto);
+        njs_lvlhsh_each_init(&lhe_prop, &njs_extern_hash_proto);
 
         len = ev->name.length + 1;
-        compl = nxt_mp_zalloc(vm->mem_pool, len);
+        compl = njs_mp_zalloc(vm->mem_pool, len);
         if (compl == NULL) {
             return NULL;
         }
 
-        nxt_sprintf(compl, compl + len, "%V%Z", &ev->name);
+        njs_sprintf(compl, compl + len, "%V%Z", &ev->name);
 
         completions[n].length = len;
         completions[n++].start = (u_char *) compl;
 
         for ( ;; ) {
-            ext_prop = nxt_lvlhsh_each(&ext_proto->hash, &lhe_prop);
+            ext_prop = njs_lvlhsh_each(&ext_proto->hash, &lhe_prop);
 
             if (ext_prop == NULL) {
                 break;
             }
 
             len = ev->name.length + ev->name.length + 2;
-            compl = nxt_mp_zalloc(vm->mem_pool, len);
+            compl = njs_mp_zalloc(vm->mem_pool, len);
             if (compl == NULL) {
                 return NULL;
             }
 
-            nxt_sprintf(compl, compl + len, "%V.%V%Z", &ev->name,
+            njs_sprintf(compl, compl + len, "%V.%V%Z", &ev->name,
                         &ext_prop->name);
 
             completions[n].length = len;
@@ -763,19 +763,19 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
 }
 
 
-nxt_array_t *
-njs_vm_completions(njs_vm_t *vm, nxt_str_t *expression)
+njs_arr_t *
+njs_vm_completions(njs_vm_t *vm, njs_str_t *expression)
 {
     size_t       size;
-    nxt_array_t  *completions;
+    njs_arr_t  *completions;
 
     if (expression == NULL) {
         size = njs_builtin_completions_size(vm);
 
-        completions = nxt_array_create(size, sizeof(nxt_str_t),
-                                       &njs_array_mem_proto, vm->mem_pool);
+        completions = njs_arr_create(size, sizeof(njs_str_t),
+                                     &njs_array_mem_proto, vm->mem_pool);
 
-        if (nxt_slow_path(completions == NULL)) {
+        if (njs_slow_path(completions == NULL)) {
             return NULL;
         }
 
@@ -786,17 +786,17 @@ njs_vm_completions(njs_vm_t *vm, nxt_str_t *expression)
 }
 
 
-static nxt_array_t *
-njs_vm_expression_completions(njs_vm_t *vm, nxt_str_t *expression)
+static njs_arr_t *
+njs_vm_expression_completions(njs_vm_t *vm, njs_str_t *expression)
 {
     u_char              *p, *end;
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_value_t         *value;
     njs_variable_t      *var;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    if (nxt_slow_path(vm->parser == NULL)) {
+    if (njs_slow_path(vm->parser == NULL)) {
         return NULL;
     }
 
@@ -809,10 +809,10 @@ njs_vm_expression_completions(njs_vm_t *vm, nxt_str_t *expression)
 
     lhq.proto = &njs_variables_hash_proto;
     lhq.key.length = p - lhq.key.start;
-    lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+    lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
 
-    ret = nxt_lvlhsh_find(&vm->parser->scope->variables, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_find(&vm->parser->scope->variables, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
 
@@ -836,10 +836,10 @@ njs_vm_expression_completions(njs_vm_t *vm, nxt_str_t *expression)
         while (p < end && *p != '.') { p++; }
 
         lhq.key.length = p - lhq.key.start;
-        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
 
-        ret = nxt_lvlhsh_find(njs_object_hash(value), &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_find(njs_object_hash(value), &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             return NULL;
         }
 
@@ -856,25 +856,25 @@ njs_vm_expression_completions(njs_vm_t *vm, nxt_str_t *expression)
 }
 
 
-static nxt_array_t *
+static njs_arr_t *
 njs_object_completions(njs_vm_t *vm, njs_object_t *object)
 {
     size_t             size;
-    nxt_uint_t         n, k;
-    nxt_str_t          *compl;
-    nxt_array_t        *completions;
+    njs_str_t          *compl;
+    njs_arr_t          *completions;
+    njs_uint_t         n, k;
     njs_object_t       *o;
     njs_object_prop_t  *prop;
-    nxt_lvlhsh_each_t  lhe;
+    njs_lvlhsh_each_t  lhe;
 
     size = 0;
     o = object;
 
     do {
-        nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+        njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
 
         for ( ;; ) {
-            prop = nxt_lvlhsh_each(&o->hash, &lhe);
+            prop = njs_lvlhsh_each(&o->hash, &lhe);
             if (prop == NULL) {
                 break;
             }
@@ -882,10 +882,10 @@ njs_object_completions(njs_vm_t *vm, njs_object_t *object)
             size++;
         }
 
-        nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+        njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
 
         for ( ;; ) {
-            prop = nxt_lvlhsh_each(&o->shared_hash, &lhe);
+            prop = njs_lvlhsh_each(&o->shared_hash, &lhe);
             if (prop == NULL) {
                 break;
             }
@@ -897,10 +897,10 @@ njs_object_completions(njs_vm_t *vm, njs_object_t *object)
 
     } while (o != NULL);
 
-    completions = nxt_array_create(size, sizeof(nxt_str_t),
-                                   &njs_array_mem_proto, vm->mem_pool);
+    completions = njs_arr_create(size, sizeof(njs_str_t),
+                                 &njs_array_mem_proto, vm->mem_pool);
 
-    if (nxt_slow_path(completions == NULL)) {
+    if (njs_slow_path(completions == NULL)) {
         return NULL;
     }
 
@@ -909,10 +909,10 @@ njs_object_completions(njs_vm_t *vm, njs_object_t *object)
     compl = completions->start;
 
     do {
-        nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+        njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
 
         for ( ;; ) {
-            prop = nxt_lvlhsh_each(&o->hash, &lhe);
+            prop = njs_lvlhsh_each(&o->hash, &lhe);
             if (prop == NULL) {
                 break;
             }
@@ -920,7 +920,7 @@ njs_object_completions(njs_vm_t *vm, njs_object_t *object)
             njs_string_get(&prop->name, &compl[n]);
 
             for (k = 0; k < n; k++) {
-                if (nxt_strstr_eq(&compl[k], &compl[n])) {
+                if (njs_strstr_eq(&compl[k], &compl[n])) {
                     break;
                 }
             }
@@ -930,10 +930,10 @@ njs_object_completions(njs_vm_t *vm, njs_object_t *object)
             }
         }
 
-        nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+        njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
 
         for ( ;; ) {
-            prop = nxt_lvlhsh_each(&o->shared_hash, &lhe);
+            prop = njs_lvlhsh_each(&o->shared_hash, &lhe);
             if (prop == NULL) {
                 break;
             }
@@ -941,7 +941,7 @@ njs_object_completions(njs_vm_t *vm, njs_object_t *object)
             njs_string_get(&prop->name, &compl[n]);
 
             for (k = 0; k < n; k++) {
-                if (nxt_strstr_eq(&compl[k], &compl[n])) {
+                if (njs_strstr_eq(&compl[k], &compl[n])) {
                     break;
                 }
             }
@@ -961,11 +961,11 @@ njs_object_completions(njs_vm_t *vm, njs_object_t *object)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_builtin_match(const njs_object_init_t **objects, njs_function_t *function,
     const njs_object_prop_t **prop, const njs_object_init_t **object)
 {
-    nxt_uint_t               i;
+    njs_uint_t               i;
     const njs_object_init_t  *o, **p;
     const njs_object_prop_t  *pr;
 
@@ -986,43 +986,43 @@ njs_builtin_match(const njs_object_init_t **objects, njs_function_t *function,
             *prop = pr;
             *object = o;
 
-            return NXT_OK;
+            return NJS_OK;
         }
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
-nxt_int_t
+njs_int_t
 njs_builtin_match_native_function(njs_vm_t *vm, njs_function_t *function,
-    nxt_str_t *name)
+    njs_str_t *name)
 {
     size_t                     len;
-    nxt_str_t                  string, middle;
-    nxt_int_t                  rc;
+    njs_str_t                  string, middle;
+    njs_int_t                  rc;
     const njs_object_init_t    *obj, **p;
     const njs_object_prop_t    *prop;
     const njs_function_init_t  *fun;
 
-    middle = nxt_string_value(".");
+    middle = njs_str_value(".");
 
     rc = njs_builtin_match(njs_object_init, function, &prop, &obj);
 
-    if (rc == NXT_OK) {
+    if (rc == NJS_OK) {
         goto found;
     }
 
     rc = njs_builtin_match(njs_prototype_init, function, &prop, &obj);
 
-    if (rc == NXT_OK) {
-        middle = nxt_string_value(".prototype.");
+    if (rc == NJS_OK) {
+        middle = njs_str_value(".prototype.");
         goto found;
     }
 
     rc = njs_builtin_match(njs_constructor_init, function, &prop, &obj);
 
-    if (rc == NXT_OK) {
+    if (rc == NJS_OK) {
         goto found;
     }
 
@@ -1032,17 +1032,17 @@ njs_builtin_match_native_function(njs_vm_t *vm, njs_function_t *function,
         if (function->u.native == fun->native) {
             *name = (*p)->name;
 
-            return NXT_OK;
+            return NJS_OK;
         }
     }
 
     rc = njs_builtin_match(njs_module_init, function, &prop, &obj);
 
-    if (rc == NXT_OK) {
+    if (rc == NJS_OK) {
         goto found;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 
 found:
 
@@ -1051,34 +1051,34 @@ found:
     len = obj->name.length + middle.length + string.length;
 
     name->length = len;
-    name->start = nxt_mp_zalloc(vm->mem_pool, len);
+    name->start = njs_mp_zalloc(vm->mem_pool, len);
     if (name->start == NULL) {
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
-    nxt_sprintf(name->start, name->start + len,
+    njs_sprintf(name->start, name->start + len,
                 "%V%V%V", &obj->name, &middle, &string);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_dump_value(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_dump_value(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_str_t          str;
-    nxt_uint_t         n;
+    njs_str_t          str;
+    njs_uint_t         n;
     const njs_value_t  *value, *indent;
 
     value = njs_arg(args, nargs, 1);
     indent = njs_arg(args, nargs, 2);
 
     n = njs_primitive_value_to_integer(indent);
-    n = nxt_min(n, 5);
+    n = njs_min(n, 5);
 
-    if (njs_vm_value_dump(vm, &str, value, 1, n) != NXT_OK) {
-        return NXT_ERROR;
+    if (njs_vm_value_dump(vm, &str, value, 1, n) != NJS_OK) {
+        return NJS_ERROR;
     }
 
     return njs_string_new(vm, &vm->retval, str.start, str.length, 0);
@@ -1108,9 +1108,9 @@ static const njs_object_prop_t  njs_global_this_object_properties[] =
 
 
 const njs_object_init_t  njs_global_this_init = {
-    nxt_string("this"),
+    njs_str("this"),
     njs_global_this_object_properties,
-    nxt_nitems(njs_global_this_object_properties)
+    njs_nitems(njs_global_this_object_properties)
 };
 
 
@@ -1135,9 +1135,9 @@ static const njs_object_prop_t  njs_njs_object_properties[] =
 
 
 const njs_object_init_t  njs_njs_object_init = {
-    nxt_string("njs"),
+    njs_str("njs"),
     njs_njs_object_properties,
-    nxt_nitems(njs_njs_object_properties),
+    njs_nitems(njs_njs_object_properties),
 };
 
 
@@ -1146,33 +1146,33 @@ njs_process_object_argv(njs_vm_t *vm, njs_value_t *process,
     njs_value_t *unused, njs_value_t *retval)
 {
     char                **arg;
-    nxt_int_t           ret;
-    nxt_uint_t          i;
+    njs_int_t           ret;
+    njs_uint_t          i;
     njs_array_t         *argv;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     static const njs_value_t  argv_string = njs_string("argv");
 
-    if (nxt_slow_path(vm->options.argv == NULL)) {
+    if (njs_slow_path(vm->options.argv == NULL)) {
         njs_internal_error(vm, "argv was not provided by host environment");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     argv = njs_array_alloc(vm, vm->options.argc, 0);
-    if (nxt_slow_path(argv == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(argv == NULL)) {
+        return NJS_ERROR;
     }
 
     i = 0;
 
     for (arg = vm->options.argv; i < vm->options.argc; arg++) {
         njs_string_set(vm, &argv->start[i++], (u_char *) *arg,
-                       nxt_strlen(*arg));
+                       njs_strlen(*arg));
     }
 
     prop = njs_object_prop_alloc(vm, &argv_string, &njs_value_undefined, 1);
-    if (nxt_slow_path(prop == NULL)) {
+    if (njs_slow_path(prop == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1180,32 +1180,32 @@ njs_process_object_argv(njs_vm_t *vm, njs_value_t *process,
 
     lhq.value = prop;
     lhq.key_hash = NJS_ARGV_HASH;
-    lhq.key = nxt_string_value("argv");
+    lhq.key = njs_str_value("argv");
     lhq.replace = 0;
     lhq.pool = vm->mem_pool;
     lhq.proto = &njs_object_hash_proto;
 
-    ret = nxt_lvlhsh_insert(njs_object_hash(process), &lhq);
+    ret = njs_lvlhsh_insert(njs_object_hash(process), &lhq);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         *retval = prop->value;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     njs_internal_error(vm, "lvlhsh insert failed");
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
-static nxt_int_t
-njs_env_hash_init(njs_vm_t *vm, nxt_lvlhsh_t *hash, char **environment)
+static njs_int_t
+njs_env_hash_init(njs_vm_t *vm, njs_lvlhsh_t *hash, char **environment)
 {
     char                **ep;
     u_char              *val, *entry;
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     lhq.replace = 0;
     lhq.pool = vm->mem_pool;
@@ -1216,41 +1216,41 @@ njs_env_hash_init(njs_vm_t *vm, nxt_lvlhsh_t *hash, char **environment)
     while (*ep != NULL) {
         prop = njs_object_prop_alloc(vm, &njs_value_undefined,
                                      &njs_value_undefined, 1);
-        if (nxt_slow_path(prop == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(prop == NULL)) {
+            return NJS_ERROR;
         }
 
         entry = (u_char *) *ep++;
 
-        val = nxt_strchr(entry, '=');
-        if (nxt_slow_path(val == NULL)) {
+        val = njs_strchr(entry, '=');
+        if (njs_slow_path(val == NULL)) {
             continue;
         }
 
         ret = njs_string_set(vm, &prop->name, entry, val - entry);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         val++;
 
-        ret = njs_string_set(vm, &prop->value, val, nxt_strlen(val));
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        ret = njs_string_set(vm, &prop->value, val, njs_strlen(val));
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         lhq.value = prop;
         njs_string_get(&prop->name, &lhq.key);
-        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
 
-        ret = nxt_lvlhsh_insert(hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1258,23 +1258,23 @@ static njs_ret_t
 njs_process_object_env(njs_vm_t *vm, njs_value_t *process,
     njs_value_t *unused, njs_value_t *retval)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_object_t        *env;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     static const njs_value_t  env_string = njs_string("env");
 
     env = njs_object_alloc(vm);
-    if (nxt_slow_path(env == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(env == NULL)) {
+        return NJS_ERROR;
     }
 
     env->shared_hash = vm->shared->env_hash;
 
     prop = njs_object_prop_alloc(vm, &env_string, &njs_value_undefined, 1);
-    if (nxt_slow_path(prop == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(prop == NULL)) {
+        return NJS_ERROR;
     }
 
     njs_set_object(&prop->value, env);
@@ -1283,19 +1283,19 @@ njs_process_object_env(njs_vm_t *vm, njs_value_t *process,
     lhq.pool = vm->mem_pool;
     lhq.proto = &njs_object_hash_proto;
     lhq.value = prop;
-    lhq.key = nxt_string_value("env");
+    lhq.key = njs_str_value("env");
     lhq.key_hash = NJS_ENV_HASH;
 
-    ret = nxt_lvlhsh_insert(njs_object_hash(process), &lhq);
+    ret = njs_lvlhsh_insert(njs_object_hash(process), &lhq);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         *retval = prop->value;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     njs_internal_error(vm, "lvlhsh insert failed");
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -1349,7 +1349,7 @@ static const njs_object_prop_t  njs_process_object_properties[] =
 
 
 const njs_object_init_t  njs_process_object_init = {
-    nxt_string("process"),
+    njs_str("process"),
     njs_process_object_properties,
-    nxt_nitems(njs_process_object_properties),
+    njs_nitems(njs_process_object_properties),
 };
similarity index 100%
rename from njs/njs_builtin.h
rename to src/njs_builtin.h
diff --git a/src/njs_clang.h b/src/njs_clang.h
new file mode 100644 (file)
index 0000000..bbc81f0
--- /dev/null
@@ -0,0 +1,160 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_CLANG_H_INCLUDED_
+#define _NJS_CLANG_H_INCLUDED_
+
+
+#include <stdarg.h>
+#include <stddef.h>       /* offsetof(). */
+#include <unistd.h>       /* NULL. */
+
+
+#define njs_inline         static inline __attribute__((always_inline))
+#define njs_noinline       __attribute__((noinline))
+#define njs_cdecl
+
+
+#define njs_container_of(p, type, field)                                      \
+    (type *) ((u_char *) (p) - offsetof(type, field))
+
+#define njs_nitems(x)                                                         \
+    (sizeof(x) / sizeof((x)[0]))
+
+
+#if (NJS_HAVE_BUILTIN_EXPECT)
+#define njs_expect(c, x)   __builtin_expect((long) (x), (c))
+#define njs_fast_path(x)   njs_expect(1, x)
+#define njs_slow_path(x)   njs_expect(0, x)
+
+#else
+#define njs_expect(c, x)   (x)
+#define njs_fast_path(x)   (x)
+#define njs_slow_path(x)   (x)
+#endif
+
+
+#if (NJS_HAVE_BUILTIN_UNREACHABLE)
+#define njs_unreachable()  __builtin_unreachable()
+
+#else
+#define njs_unreachable()
+#endif
+
+
+#if (NJS_HAVE_BUILTIN_PREFETCH)
+#define njs_prefetch(a)    __builtin_prefetch(a)
+
+#else
+#define njs_prefetch(a)
+#endif
+
+
+#if (NJS_HAVE_BUILTIN_CLZ)
+#define njs_leading_zeros(x)  (((x) == 0) ? 32 : __builtin_clz(x))
+
+#else
+
+njs_inline uint32_t
+njs_leading_zeros(uint32_t x)
+{
+    uint32_t  n;
+
+    /*
+     * There is no sense to optimize this function, since almost
+     * all platforms nowadays support the built-in instruction.
+     */
+
+    if (x == 0) {
+        return 32;
+    }
+
+    n = 0;
+
+    while ((x & 0x80000000) == 0) {
+        n++;
+        x <<= 1;
+    }
+
+    return n;
+}
+
+#endif
+
+
+#if (NJS_HAVE_BUILTIN_CLZLL)
+#define njs_leading_zeros64(x)  (((x) == 0) ? 64 : __builtin_clzll(x))
+
+#else
+
+njs_inline uint64_t
+njs_leading_zeros64(uint64_t x)
+{
+    uint64_t  n;
+
+    /*
+     * There is no sense to optimize this function, since almost
+     * all platforms nowadays support the built-in instruction.
+     */
+
+    if (x == 0) {
+        return 64;
+    }
+
+    n = 0;
+
+    while ((x & 0x8000000000000000) == 0) {
+        n++;
+        x <<= 1;
+    }
+
+    return n;
+}
+
+#endif
+
+
+#if (NJS_HAVE_GCC_ATTRIBUTE_VISIBILITY)
+#define NJS_EXPORT         __attribute__((visibility("default")))
+
+#else
+#define NJS_EXPORT
+#endif
+
+
+#if (NJS_HAVE_GCC_ATTRIBUTE_ALIGNED)
+#define njs_aligned(x)     __attribute__((aligned(x)))
+
+#else
+#define njs_aligned(x)
+#endif
+
+
+#if (NJS_HAVE_GCC_ATTRIBUTE_MALLOC)
+#define NJS_MALLOC_LIKE    __attribute__((__malloc__))
+
+#else
+#define NJS_MALLOC_LIKE
+#endif
+
+
+#if (NJS_CLANG)
+/* Any __asm__ directive disables loop vectorization in GCC and Clang. */
+#define njs_pragma_loop_disable_vectorization  __asm__("")
+
+#else
+#define njs_pragma_loop_disable_vectorization
+#endif
+
+
+#if (NJS_HAVE_MEMORY_SANITIZER)
+#include <sanitizer/msan_interface.h>
+
+#define njs_msan_unpoison(ptr, size)  __msan_unpoison(ptr, size)
+#endif
+
+
+#endif /* _NJS_CLANG_H_INCLUDED_ */
similarity index 73%
rename from njs/njs_crypto.c
rename to src/njs_crypto.c
index cb58b73bf4474c677f542aad7d6af9899319d56a..f7835b1af3b05c28b2679f0bc3a68f37216a9146 100644 (file)
@@ -4,10 +4,10 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
-#include <nxt_md5.h>
-#include <nxt_sha1.h>
-#include <nxt_sha2.h>
+#include <njs_main.h>
+#include <njs_md5.h>
+#include <njs_sha1.h>
+#include <njs_sha2.h>
 #include <njs_crypto.h>
 #include <string.h>
 #include <math.h>
@@ -18,11 +18,11 @@ typedef void (*njs_hash_update)(void *ctx, const void *data, size_t size);
 typedef void (*njs_hash_final)(u_char *result, void *ctx);
 
 typedef njs_ret_t (*njs_digest_encode)(njs_vm_t *vm, njs_value_t *value,
-    const nxt_str_t *src);
+    const njs_str_t *src);
 
 
 typedef struct {
-    nxt_str_t           name;
+    njs_str_t           name;
 
     size_t              size;
     njs_hash_init       init;
@@ -32,22 +32,22 @@ typedef struct {
 
 typedef struct {
     union {
-        nxt_md5_t       md5;
-        nxt_sha1_t      sha1;
-        nxt_sha2_t      sha2;
+        njs_md5_t       md5;
+        njs_sha1_t      sha1;
+        njs_sha2_t      sha2;
     } u;
 
     njs_hash_alg_t      *alg;
 } njs_digest_t;
 
 typedef struct {
-    nxt_str_t           key;
+    njs_str_t           key;
     u_char              opad[64];
 
     union {
-        nxt_md5_t       md5;
-        nxt_sha1_t      sha1;
-        nxt_sha2_t      sha2;
+        njs_md5_t       md5;
+        njs_sha1_t      sha1;
+        njs_sha2_t      sha2;
     } u;
 
     njs_hash_alg_t      *alg;
@@ -55,7 +55,7 @@ typedef struct {
 
 
 typedef struct {
-    nxt_str_t             name;
+    njs_str_t             name;
 
     njs_digest_encode     encode;
 } njs_crypto_enc_t;
@@ -64,31 +64,31 @@ typedef struct {
 static njs_hash_alg_t njs_hash_algorithms[] = {
 
    {
-     nxt_string("md5"),
+     njs_str("md5"),
      16,
-     (njs_hash_init) nxt_md5_init,
-     (njs_hash_update) nxt_md5_update,
-     (njs_hash_final) nxt_md5_final
+     (njs_hash_init) njs_md5_init,
+     (njs_hash_update) njs_md5_update,
+     (njs_hash_final) njs_md5_final
    },
 
    {
-     nxt_string("sha1"),
+     njs_str("sha1"),
      20,
-     (njs_hash_init) nxt_sha1_init,
-     (njs_hash_update) nxt_sha1_update,
-     (njs_hash_final) nxt_sha1_final
+     (njs_hash_init) njs_sha1_init,
+     (njs_hash_update) njs_sha1_update,
+     (njs_hash_final) njs_sha1_final
    },
 
    {
-     nxt_string("sha256"),
+     njs_str("sha256"),
      32,
-     (njs_hash_init) nxt_sha2_init,
-     (njs_hash_update) nxt_sha2_update,
-     (njs_hash_final) nxt_sha2_final
+     (njs_hash_init) njs_sha2_init,
+     (njs_hash_update) njs_sha2_update,
+     (njs_hash_final) njs_sha2_final
    },
 
    {
-    nxt_null_string,
+    njs_null_str,
     0,
     NULL,
     NULL,
@@ -100,42 +100,42 @@ static njs_hash_alg_t njs_hash_algorithms[] = {
 static njs_crypto_enc_t njs_encodings[] = {
 
    {
-     nxt_string("hex"),
+     njs_str("hex"),
      njs_string_hex
    },
 
    {
-     nxt_string("base64"),
+     njs_str("base64"),
      njs_string_base64
    },
 
    {
-     nxt_string("base64url"),
+     njs_str("base64url"),
      njs_string_base64url
    },
 
    {
-    nxt_null_string,
+    njs_null_str,
     NULL
    }
 };
 
 
-static njs_hash_alg_t *njs_crypto_alg(njs_vm_t *vm, const nxt_str_t *name);
+static njs_hash_alg_t *njs_crypto_alg(njs_vm_t *vm, const njs_str_t *name);
 static njs_crypto_enc_t *njs_crypto_encoding(njs_vm_t *vm,
-    const nxt_str_t *name);
+    const njs_str_t *name);
 
 
 static njs_object_value_t *
-njs_crypto_object_value_alloc(njs_vm_t *vm, nxt_uint_t proto)
+njs_crypto_object_value_alloc(njs_vm_t *vm, njs_uint_t proto)
 {
     njs_object_value_t  *ov;
 
-    ov = nxt_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t));
+    ov = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t));
 
-    if (nxt_fast_path(ov != NULL)) {
-        nxt_lvlhsh_init(&ov->object.hash);
-        nxt_lvlhsh_init(&ov->object.shared_hash);
+    if (njs_fast_path(ov != NULL)) {
+        njs_lvlhsh_init(&ov->object.hash);
+        njs_lvlhsh_init(&ov->object.shared_hash);
         ov->object.type = NJS_OBJECT_VALUE;
         ov->object.shared = 0;
         ov->object.extensible = 1;
@@ -151,15 +151,15 @@ njs_crypto_object_value_alloc(njs_vm_t *vm, nxt_uint_t proto)
 
 
 static njs_ret_t
-njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_str_t           alg_name;
+    njs_str_t           alg_name;
     njs_digest_t        *dgst;
     njs_hash_alg_t      *alg;
     njs_object_value_t  *hash;
 
-    if (nxt_slow_path(nargs < 2 || !njs_is_string(&args[1]))) {
+    if (njs_slow_path(nargs < 2 || !njs_is_string(&args[1]))) {
         njs_type_error(vm, "algorithm must be a string");
         return NJS_ERROR;
     }
@@ -167,17 +167,17 @@ njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_string_get(&args[1], &alg_name);
 
     alg = njs_crypto_alg(vm, &alg_name);
-    if (nxt_slow_path(alg == NULL)) {
+    if (njs_slow_path(alg == NULL)) {
         return NJS_ERROR;
     }
 
     hash = njs_crypto_object_value_alloc(vm, NJS_PROTOTYPE_CRYPTO_HASH);
-    if (nxt_slow_path(hash == NULL)) {
+    if (njs_slow_path(hash == NULL)) {
         return NJS_ERROR;
     }
 
-    dgst = nxt_mp_alloc(vm->mem_pool, sizeof(njs_digest_t));
-    if (nxt_slow_path(dgst == NULL)) {
+    dgst = njs_mp_alloc(vm->mem_pool, sizeof(njs_digest_t));
+    if (njs_slow_path(dgst == NULL)) {
         njs_memory_error(vm);
         return NJS_ERROR;
     }
@@ -194,23 +194,23 @@ njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_str_t     data;
+    njs_str_t     data;
     njs_digest_t  *dgst;
 
-    if (nxt_slow_path(nargs < 2 || !njs_is_string(&args[1]))) {
+    if (njs_slow_path(nargs < 2 || !njs_is_string(&args[1]))) {
         njs_type_error(vm, "data must be a string");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_object_value(&args[0]))) {
+    if (njs_slow_path(!njs_is_object_value(&args[0]))) {
         njs_type_error(vm, "\"this\" is not an object_value");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_data(njs_object_value(&args[0])))) {
+    if (njs_slow_path(!njs_is_data(njs_object_value(&args[0])))) {
         njs_type_error(vm, "value of \"this\" is not a data type");
         return NJS_ERROR;
     }
@@ -219,7 +219,7 @@ njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     dgst = njs_value_data(njs_object_value(&args[0]));
 
-    if (nxt_slow_path(dgst->alg == NULL)) {
+    if (njs_slow_path(dgst->alg == NULL)) {
         njs_error(vm, "Digest already called");
         return NJS_ERROR;
     }
@@ -233,27 +233,27 @@ njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_hash_prototype_digest(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_hash_prototype_digest(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char            digest[32], *p;
     njs_ret_t         ret;
-    nxt_str_t         enc_name, str;
+    njs_str_t         enc_name, str;
     njs_digest_t      *dgst;
     njs_hash_alg_t    *alg;
     njs_crypto_enc_t  *enc;
 
-    if (nxt_slow_path(nargs > 1 && !njs_is_string(&args[1]))) {
+    if (njs_slow_path(nargs > 1 && !njs_is_string(&args[1]))) {
         njs_type_error(vm, "encoding must be a string");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_object_value(&args[0]))) {
+    if (njs_slow_path(!njs_is_object_value(&args[0]))) {
         njs_type_error(vm, "\"this\" is not an object_value");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_data(njs_object_value(&args[0])))) {
+    if (njs_slow_path(!njs_is_data(njs_object_value(&args[0])))) {
         njs_type_error(vm, "value of \"this\" is not a data type");
         return NJS_ERROR;
     }
@@ -264,14 +264,14 @@ njs_hash_prototype_digest(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         njs_string_get(&args[1], &enc_name);
 
         enc = njs_crypto_encoding(vm, &enc_name);
-        if (nxt_slow_path(enc == NULL)) {
+        if (njs_slow_path(enc == NULL)) {
             return NJS_ERROR;
         }
     }
 
     dgst = njs_value_data(njs_object_value(&args[0]));
 
-    if (nxt_slow_path(dgst->alg == NULL)) {
+    if (njs_slow_path(dgst->alg == NULL)) {
         njs_error(vm, "Digest already called");
         return NJS_ERROR;
     }
@@ -286,7 +286,7 @@ njs_hash_prototype_digest(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (enc == NULL) {
         p = njs_string_alloc(vm, &vm->retval, str.length, 0);
 
-        if (nxt_fast_path(p != NULL)) {
+        if (njs_fast_path(p != NULL)) {
             memcpy(p, str.start, str.length);
             ret = NJS_OK;
 
@@ -305,7 +305,7 @@ njs_hash_prototype_digest(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_hash_prototype_to_string(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_hash_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     static const njs_value_t  string = njs_string("[object Hash]");
@@ -354,44 +354,44 @@ static const njs_object_prop_t  njs_hash_prototype_properties[] =
 
 
 const njs_object_init_t  njs_hash_prototype_init = {
-    nxt_string("Hash"),
+    njs_str("Hash"),
     njs_hash_prototype_properties,
-    nxt_nitems(njs_hash_prototype_properties),
+    njs_nitems(njs_hash_prototype_properties),
 };
 
 
 njs_ret_t
 njs_hash_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_crypto_create_hash(vm, args, nargs, unused);
 }
 
 
 const njs_object_init_t  njs_hash_constructor_init = {
-    nxt_string("Hash"),
+    njs_str("Hash"),
     NULL,
     0,
 };
 
 
 static njs_ret_t
-njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char              digest[32], key_buf[64];
-    nxt_str_t           alg_name, key;
-    nxt_uint_t          i;
+    njs_str_t           alg_name, key;
+    njs_uint_t          i;
     njs_hmac_t          *ctx;
     njs_hash_alg_t      *alg;
     njs_object_value_t  *hmac;
 
-    if (nxt_slow_path(nargs < 2 || !njs_is_string(&args[1]))) {
+    if (njs_slow_path(nargs < 2 || !njs_is_string(&args[1]))) {
         njs_type_error(vm, "algorithm must be a string");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(nargs < 3 || !njs_is_string(&args[2]))) {
+    if (njs_slow_path(nargs < 3 || !njs_is_string(&args[2]))) {
         njs_type_error(vm, "key must be a string");
         return NJS_ERROR;
     }
@@ -399,14 +399,14 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_string_get(&args[1], &alg_name);
 
     alg = njs_crypto_alg(vm, &alg_name);
-    if (nxt_slow_path(alg == NULL)) {
+    if (njs_slow_path(alg == NULL)) {
         return NJS_ERROR;
     }
 
     njs_string_get(&args[2], &key);
 
-    ctx = nxt_mp_alloc(vm->mem_pool, sizeof(njs_hmac_t));
-    if (nxt_slow_path(ctx == NULL)) {
+    ctx = njs_mp_alloc(vm->mem_pool, sizeof(njs_hmac_t));
+    if (njs_slow_path(ctx == NULL)) {
         njs_memory_error(vm);
         return NJS_ERROR;
     }
@@ -419,11 +419,11 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         alg->final(digest, &ctx->u);
 
         memcpy(key_buf, digest, alg->size);
-        nxt_explicit_memzero(key_buf + alg->size, sizeof(key_buf) - alg->size);
+        njs_explicit_memzero(key_buf + alg->size, sizeof(key_buf) - alg->size);
 
     } else {
         memcpy(key_buf, key.start, key.length);
-        nxt_explicit_memzero(key_buf + key.length,
+        njs_explicit_memzero(key_buf + key.length,
                              sizeof(key_buf) - key.length);
     }
 
@@ -439,7 +439,7 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     alg->update(&ctx->u, key_buf, 64);
 
     hmac = njs_crypto_object_value_alloc(vm, NJS_PROTOTYPE_CRYPTO_HMAC);
-    if (nxt_slow_path(hmac == NULL)) {
+    if (njs_slow_path(hmac == NULL)) {
         return NJS_ERROR;
     }
 
@@ -451,23 +451,23 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_hmac_prototype_update(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_hmac_prototype_update(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_str_t   data;
+    njs_str_t   data;
     njs_hmac_t  *ctx;
 
-    if (nxt_slow_path(nargs < 2 || !njs_is_string(&args[1]))) {
+    if (njs_slow_path(nargs < 2 || !njs_is_string(&args[1]))) {
         njs_type_error(vm, "data must be a string");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_object_value(&args[0]))) {
+    if (njs_slow_path(!njs_is_object_value(&args[0]))) {
         njs_type_error(vm, "\"this\" is not an object_value");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_data(njs_object_value(&args[0])))) {
+    if (njs_slow_path(!njs_is_data(njs_object_value(&args[0])))) {
         njs_type_error(vm, "value of \"this\" is not a data type");
         return NJS_ERROR;
     }
@@ -476,7 +476,7 @@ njs_hmac_prototype_update(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     ctx = njs_value_data(njs_object_value(&args[0]));
 
-    if (nxt_slow_path(ctx->alg == NULL)) {
+    if (njs_slow_path(ctx->alg == NULL)) {
         njs_error(vm, "Digest already called");
         return NJS_ERROR;
     }
@@ -490,27 +490,27 @@ njs_hmac_prototype_update(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_hmac_prototype_digest(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_hmac_prototype_digest(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char            hash1[32], digest[32], *p;
-    nxt_str_t         enc_name, str;
+    njs_str_t         enc_name, str;
     njs_ret_t         ret;
     njs_hmac_t        *ctx;
     njs_hash_alg_t    *alg;
     njs_crypto_enc_t  *enc;
 
-    if (nxt_slow_path(nargs > 1 && !njs_is_string(&args[1]))) {
+    if (njs_slow_path(nargs > 1 && !njs_is_string(&args[1]))) {
         njs_type_error(vm, "encoding must be a string");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_object_value(&args[0]))) {
+    if (njs_slow_path(!njs_is_object_value(&args[0]))) {
         njs_type_error(vm, "\"this\" is not an object_value");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_data(njs_object_value(&args[0])))) {
+    if (njs_slow_path(!njs_is_data(njs_object_value(&args[0])))) {
         njs_type_error(vm, "value of \"this\" is not a data type");
         return NJS_ERROR;
     }
@@ -521,14 +521,14 @@ njs_hmac_prototype_digest(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         njs_string_get(&args[1], &enc_name);
 
         enc = njs_crypto_encoding(vm, &enc_name);
-        if (nxt_slow_path(enc == NULL)) {
+        if (njs_slow_path(enc == NULL)) {
             return NJS_ERROR;
         }
     }
 
     ctx = njs_value_data(njs_object_value(&args[0]));
 
-    if (nxt_slow_path(ctx->alg == NULL)) {
+    if (njs_slow_path(ctx->alg == NULL)) {
         njs_error(vm, "Digest already called");
         return NJS_ERROR;
     }
@@ -548,7 +548,7 @@ njs_hmac_prototype_digest(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (enc == NULL) {
         p = njs_string_alloc(vm, &vm->retval, str.length, 0);
 
-        if (nxt_fast_path(p != NULL)) {
+        if (njs_fast_path(p != NULL)) {
             memcpy(p, str.start, str.length);
             ret = NJS_OK;
 
@@ -567,7 +567,7 @@ njs_hmac_prototype_digest(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_hmac_prototype_to_string(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_hmac_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     static const njs_value_t  string = njs_string("[object Hmac]");
@@ -616,22 +616,22 @@ static const njs_object_prop_t  njs_hmac_prototype_properties[] =
 
 
 const njs_object_init_t  njs_hmac_prototype_init = {
-    nxt_string("Hmac"),
+    njs_str("Hmac"),
     njs_hmac_prototype_properties,
-    nxt_nitems(njs_hmac_prototype_properties),
+    njs_nitems(njs_hmac_prototype_properties),
 };
 
 
 njs_ret_t
 njs_hmac_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_crypto_create_hmac(vm, args, nargs, unused);
 }
 
 
 const njs_object_init_t  njs_hmac_constructor_init = {
-    nxt_string("Hmac"),
+    njs_str("Hmac"),
     NULL,
     0,
 };
@@ -674,19 +674,19 @@ static const njs_object_prop_t  njs_crypto_object_properties[] =
 
 
 const njs_object_init_t  njs_crypto_object_init = {
-    nxt_string("crypto"),
+    njs_str("crypto"),
     njs_crypto_object_properties,
-    nxt_nitems(njs_crypto_object_properties),
+    njs_nitems(njs_crypto_object_properties),
 };
 
 
 static njs_hash_alg_t *
-njs_crypto_alg(njs_vm_t *vm, const nxt_str_t *name)
+njs_crypto_alg(njs_vm_t *vm, const njs_str_t *name)
 {
     njs_hash_alg_t *e;
 
     for (e = &njs_hash_algorithms[0]; e->name.length != 0; e++) {
-        if (nxt_strstr_eq(name, &e->name)) {
+        if (njs_strstr_eq(name, &e->name)) {
             return e;
         }
     }
@@ -698,12 +698,12 @@ njs_crypto_alg(njs_vm_t *vm, const nxt_str_t *name)
 
 
 static njs_crypto_enc_t *
-njs_crypto_encoding(njs_vm_t *vm, const nxt_str_t *name)
+njs_crypto_encoding(njs_vm_t *vm, const njs_str_t *name)
 {
     njs_crypto_enc_t *e;
 
     for (e = &njs_encodings[0]; e->name.length != 0; e++) {
-        if (nxt_strstr_eq(name, &e->name)) {
+        if (njs_strstr_eq(name, &e->name)) {
             return e;
         }
     }
similarity index 87%
rename from njs/njs_crypto.h
rename to src/njs_crypto.h
index c45b8775c70e18d745986e13953cb2331e346486..c9d082fb806b6a3e921e40d2a4d0a31dfb0a5f11 100644 (file)
@@ -8,9 +8,9 @@
 #define _NJS_CRYPTO_H_INCLUDED_
 
 njs_ret_t njs_hash_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_hmac_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 extern const njs_object_init_t  njs_crypto_object_init;
 
similarity index 87%
rename from njs/njs_date.c
rename to src/njs_date.c
index ea6cd1247dae4c744bfbae105412318e5635639e..8f85f2fb6199c00c3b3fe808dfb6f307953a358a 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_date.h>
 #include <string.h>
 #include <sys/time.h>
@@ -30,10 +30,10 @@ static double njs_date_js_string_parse(struct tm *tm, const u_char *p,
     const u_char *end);
 static const u_char *njs_date_skip_week_day(const u_char *p, const u_char *end);
 static const u_char *njs_date_skip_spaces(const u_char *p, const u_char *end);
-static nxt_int_t njs_date_month_parse(const u_char *p, const u_char *end);
+static njs_int_t njs_date_month_parse(const u_char *p, const u_char *end);
 static const u_char *njs_date_time_parse(struct tm *tm, const u_char *p,
     const u_char *end);
-static nxt_int_t njs_date_gmtoff_parse(const u_char *start, const u_char *end);
+static njs_int_t njs_date_gmtoff_parse(const u_char *start, const u_char *end);
 static const u_char *njs_date_number_parse(int *value, const u_char *p,
     const u_char *end, size_t size);
 static int64_t njs_timegm(struct tm *tm);
@@ -68,13 +68,13 @@ njs_timeclip(double time)
 
 
 njs_ret_t
-njs_date_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double      num, time;
     int64_t     values[8];
     njs_ret_t   ret;
-    nxt_uint_t  i, n;
+    njs_uint_t  i, n;
     njs_date_t  *date;
     struct tm   tm;
 
@@ -87,7 +87,7 @@ njs_date_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             if (njs_is_object(&args[1])) {
                 if (!njs_is_date(&args[1])) {
                     ret = njs_value_to_primitive(vm, &args[1], &args[1], 0);
-                    if (ret != NXT_OK) {
+                    if (ret != NJS_OK) {
                         return ret;
                     }
                 }
@@ -104,16 +104,16 @@ njs_date_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             }
 
         } else {
-            nxt_memzero(values, 8 * sizeof(int64_t));
+            njs_memzero(values, 8 * sizeof(int64_t));
             /* Month. */
             values[2] = 1;
 
-            n = nxt_min(8, nargs);
+            n = njs_min(8, nargs);
 
             for (i = 1; i < n; i++) {
                 if (!njs_is_numeric(&args[i])) {
                     ret = njs_value_to_numeric(vm, &args[i], &args[i]);
-                    if (ret != NXT_OK) {
+                    if (ret != NJS_OK) {
                         return ret;
                     }
                 }
@@ -146,14 +146,14 @@ njs_date_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     done:
 
-        date = nxt_mp_alloc(vm->mem_pool, sizeof(njs_date_t));
-        if (nxt_slow_path(date == NULL)) {
+        date = njs_mp_alloc(vm->mem_pool, sizeof(njs_date_t));
+        if (njs_slow_path(date == NULL)) {
             njs_memory_error(vm);
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
-        nxt_lvlhsh_init(&date->object.hash);
-        nxt_lvlhsh_init(&date->object.shared_hash);
+        njs_lvlhsh_init(&date->object.hash);
+        njs_lvlhsh_init(&date->object.shared_hash);
         date->object.type = NJS_DATE;
         date->object.shared = 0;
         date->object.extensible = 1;
@@ -163,7 +163,7 @@ njs_date_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         njs_set_date(&vm->retval, date);
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     return njs_date_string(vm, "%a %b %d %Y %T GMT%z (%Z)", njs_gettime());
@@ -171,26 +171,26 @@ njs_date_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_date_utc(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_utc(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double      num, time;
     struct tm   tm;
     njs_ret_t   ret;
-    nxt_uint_t  i, n;
+    njs_uint_t  i, n;
     int32_t     values[8];
 
     time = NAN;
 
     if (nargs > 2) {
-        nxt_memzero(values, 8 * sizeof(int32_t));
+        njs_memzero(values, 8 * sizeof(int32_t));
 
-        n = nxt_min(8, nargs);
+        n = njs_min(8, nargs);
 
         for (i = 1; i < n; i++) {
             if (!njs_is_numeric(&args[i])) {
                 ret = njs_value_to_numeric(vm, &args[i], &args[i]);
-                if (ret != NXT_OK) {
+                if (ret != NJS_OK) {
                     return ret;
                 }
             }
@@ -223,7 +223,7 @@ done:
 
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -277,17 +277,17 @@ njs_timegm(struct tm *tm)
 
 
 static njs_ret_t
-njs_date_now(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_now(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_set_number(&vm->retval, njs_gettime());
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_date_parse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  time;
@@ -301,7 +301,7 @@ njs_date_parse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -310,9 +310,9 @@ njs_date_string_parse(njs_value_t *date)
 {
     int                ext, ms, ms_length, skipped;
     double             time;
-    nxt_str_t          string;
+    njs_str_t          string;
     struct tm          tm;
-    nxt_bool_t         sign, week, utc;
+    njs_bool_t         sign, week, utc;
     const u_char       *p, *next, *end;
 
     njs_string_get(date, &string);
@@ -320,7 +320,7 @@ njs_date_string_parse(njs_value_t *date)
     p = string.start;
     end = p + string.length;
 
-    if (nxt_slow_path(p >= end)) {
+    if (njs_slow_path(p >= end)) {
         return NAN;
     }
 
@@ -351,7 +351,7 @@ njs_date_string_parse(njs_value_t *date)
             /* Extended ISO-8601 format: "+001970-09-28T06:00:00.000Z" */
 
             next = njs_date_number_parse(&ext, next, end, 2);
-            if (nxt_slow_path(next == NULL)) {
+            if (njs_slow_path(next == NULL)) {
                 return NAN;
             }
 
@@ -377,7 +377,7 @@ njs_date_string_parse(njs_value_t *date)
         tm.tm_year -= 1900;
 
         p = njs_date_number_parse(&tm.tm_mon, next + 1, end, 2);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             return NAN;
         }
 
@@ -387,12 +387,12 @@ njs_date_string_parse(njs_value_t *date)
             goto done;
         }
 
-        if (nxt_slow_path(*p != '-')) {
+        if (njs_slow_path(*p != '-')) {
             return NAN;
         }
 
         p = njs_date_number_parse(&tm.tm_mday, p + 1, end, 2);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             return NAN;
         }
 
@@ -400,7 +400,7 @@ njs_date_string_parse(njs_value_t *date)
             goto done;
         }
 
-        if (nxt_slow_path(*p != 'T')) {
+        if (njs_slow_path(*p != 'T')) {
             return NAN;
         }
 
@@ -413,7 +413,7 @@ njs_date_string_parse(njs_value_t *date)
         }
 
         p = njs_date_time_parse(&tm, p + 1, end);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             return NAN;
         }
 
@@ -421,7 +421,7 @@ njs_date_string_parse(njs_value_t *date)
             goto done;
         }
 
-        if (nxt_slow_path(p > end || *p != '.')) {
+        if (njs_slow_path(p > end || *p != '.')) {
             return NAN;
         }
 
@@ -430,13 +430,13 @@ njs_date_string_parse(njs_value_t *date)
         ms_length = (end - p < 3) ? end - p : 3;
 
         p = njs_date_number_parse(&ms, p, end, ms_length);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             return NAN;
         }
 
         if (end > p) {
             p = njs_date_number_parse(&skipped, p, end, end - p);
-            if (nxt_slow_path(p == NULL)) {
+            if (njs_slow_path(p == NULL)) {
                 return NAN;
             }
         }
@@ -491,12 +491,12 @@ njs_date_string_parse(njs_value_t *date)
         }
 
         p = njs_date_skip_week_day(p, end);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             return NAN;
         }
 
         p = njs_date_skip_spaces(p, end);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             return NAN;
         }
 
@@ -519,22 +519,22 @@ njs_date_rfc2822_string_parse(struct tm *tm, const u_char *p, const u_char *end)
     int  gmtoff;
 
     p = njs_date_skip_spaces(p, end);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
     tm->tm_mon = njs_date_month_parse(p, end);
-    if (nxt_slow_path(tm->tm_mon < 0)) {
+    if (njs_slow_path(tm->tm_mon < 0)) {
         return NAN;
     }
 
     p = njs_date_skip_spaces(p + 3, end);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
     p = njs_date_number_parse(&tm->tm_year, p, end, 4);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
@@ -545,7 +545,7 @@ njs_date_rfc2822_string_parse(struct tm *tm, const u_char *p, const u_char *end)
     }
 
     p = njs_date_skip_spaces(p, end);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
@@ -554,7 +554,7 @@ njs_date_rfc2822_string_parse(struct tm *tm, const u_char *p, const u_char *end)
     }
 
     p = njs_date_time_parse(tm, p, end);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
@@ -563,7 +563,7 @@ njs_date_rfc2822_string_parse(struct tm *tm, const u_char *p, const u_char *end)
     }
 
     p = njs_date_skip_spaces(p, end);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
@@ -571,7 +571,7 @@ njs_date_rfc2822_string_parse(struct tm *tm, const u_char *p, const u_char *end)
         goto done;
     }
 
-    if (nxt_slow_path(p + 2 >= end)) {
+    if (njs_slow_path(p + 2 >= end)) {
         return NAN;
     }
 
@@ -583,7 +583,7 @@ njs_date_rfc2822_string_parse(struct tm *tm, const u_char *p, const u_char *end)
     } else {
         gmtoff = njs_date_gmtoff_parse(p, end);
 
-        if (nxt_slow_path(gmtoff == -1)) {
+        if (njs_slow_path(gmtoff == -1)) {
             return NAN;
         }
     }
@@ -602,22 +602,22 @@ njs_date_js_string_parse(struct tm *tm, const u_char *p, const u_char *end)
     int  gmtoff;
 
     p = njs_date_skip_spaces(p, end);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
     p = njs_date_number_parse(&tm->tm_mday, p, end, 2);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
     p = njs_date_skip_spaces(p, end);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
     p = njs_date_number_parse(&tm->tm_year, p, end, 4);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
@@ -628,7 +628,7 @@ njs_date_js_string_parse(struct tm *tm, const u_char *p, const u_char *end)
     }
 
     p = njs_date_skip_spaces(p, end);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
@@ -637,7 +637,7 @@ njs_date_js_string_parse(struct tm *tm, const u_char *p, const u_char *end)
     }
 
     p = njs_date_time_parse(tm, p, end);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
@@ -646,7 +646,7 @@ njs_date_js_string_parse(struct tm *tm, const u_char *p, const u_char *end)
     }
 
     p = njs_date_skip_spaces(p, end);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NAN;
     }
 
@@ -658,7 +658,7 @@ njs_date_js_string_parse(struct tm *tm, const u_char *p, const u_char *end)
 
         gmtoff = njs_date_gmtoff_parse(&p[3], end);
 
-        if (nxt_fast_path(gmtoff != -1)) {
+        if (njs_fast_path(gmtoff != -1)) {
             return (njs_timegm(tm) - gmtoff * 60) * 1000;
         }
     }
@@ -706,7 +706,7 @@ njs_date_skip_spaces(const u_char *p, const u_char *end)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_date_month_parse(const u_char *p, const u_char *end)
 {
     if (p + 2 < end) {
@@ -798,16 +798,16 @@ static const u_char *
 njs_date_time_parse(struct tm *tm, const u_char *p, const u_char *end)
 {
     p = njs_date_number_parse(&tm->tm_hour, p, end, 2);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return p;
     }
 
-    if (nxt_slow_path(p >= end || *p != ':')) {
+    if (njs_slow_path(p >= end || *p != ':')) {
         return NULL;
     }
 
     p = njs_date_number_parse(&tm->tm_min, p + 1, end, 2);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return p;
     }
 
@@ -815,7 +815,7 @@ njs_date_time_parse(struct tm *tm, const u_char *p, const u_char *end)
         return p;
     }
 
-    if (nxt_slow_path(*p != ':')) {
+    if (njs_slow_path(*p != ':')) {
         return NULL;
     }
 
@@ -823,21 +823,21 @@ njs_date_time_parse(struct tm *tm, const u_char *p, const u_char *end)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_date_gmtoff_parse(const u_char *start, const u_char *end)
 {
     int           gmtoff, hour, min;
     const u_char  *p;
 
-    if (nxt_fast_path(start + 4 < end && (*start == '+' || *start == '-'))) {
+    if (njs_fast_path(start + 4 < end && (*start == '+' || *start == '-'))) {
 
         p = njs_date_number_parse(&hour, start + 1, end, 2);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             return -1;
         }
 
         p = njs_date_number_parse(&min, p, end, 2);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             return -1;
         }
 
@@ -859,12 +859,12 @@ njs_date_number_parse(int *value, const u_char *p, const u_char *end,
     size_t size)
 {
     u_char     c;
-    nxt_int_t  n;
+    njs_int_t  n;
 
     n = 0;
 
     do {
-        if (nxt_slow_path(p >= end)) {
+        if (njs_slow_path(p >= end)) {
             return NULL;
         }
 
@@ -873,7 +873,7 @@ njs_date_number_parse(int *value, const u_char *p, const u_char *end,
         /* Values below '0' become >= 208. */
         c = c - '0';
 
-        if (nxt_slow_path(c > 9)) {
+        if (njs_slow_path(c > 9)) {
             return NULL;
         }
 
@@ -942,24 +942,24 @@ static const njs_object_prop_t  njs_date_constructor_properties[] =
 
 
 const njs_object_init_t  njs_date_constructor_init = {
-    nxt_string("Date"),
+    njs_str("Date"),
     njs_date_constructor_properties,
-    nxt_nitems(njs_date_constructor_properties),
+    njs_nitems(njs_date_constructor_properties),
 };
 
 
 static njs_ret_t
-njs_date_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_set_number(&vm->retval, njs_date(&args[0])->time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_date_prototype_to_string(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return njs_date_string(vm, "%a %b %d %Y %T GMT%z (%Z)",
@@ -969,7 +969,7 @@ njs_date_prototype_to_string(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 static njs_ret_t
 njs_date_prototype_to_date_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_date_string(vm, "%a %b %d %Y", njs_date(&args[0])->time);
 }
@@ -977,7 +977,7 @@ njs_date_prototype_to_date_string(njs_vm_t *vm, njs_value_t *args,
 
 static njs_ret_t
 njs_date_prototype_to_time_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_date_string(vm, "%T GMT%z (%Z)", njs_date(&args[0])->time);
 }
@@ -1002,13 +1002,13 @@ njs_date_string(njs_vm_t *vm, const char *fmt, double time)
 
     vm->retval = njs_string_invalid_date;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_to_utc_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double             time;
     time_t             clock;
@@ -1027,7 +1027,7 @@ njs_date_prototype_to_utc_string(njs_vm_t *vm, njs_value_t *args,
         clock = time / 1000;
         gmtime_r(&clock, &tm);
 
-        p = nxt_sprintf(buf, buf + NJS_DATE_TIME_LEN,
+        p = njs_sprintf(buf, buf + NJS_DATE_TIME_LEN,
                         "%s %s %02d %4d %02d:%02d:%02d GMT",
                         week[tm.tm_wday], month[tm.tm_mon], tm.tm_mday,
                         tm.tm_year + 1900, tm.tm_hour, tm.tm_min, tm.tm_sec);
@@ -1037,13 +1037,13 @@ njs_date_prototype_to_utc_string(njs_vm_t *vm, njs_value_t *args,
 
     vm->retval = njs_string_invalid_date;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_to_iso_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_date_to_string(vm, &vm->retval, &args[0]);
 }
@@ -1067,7 +1067,7 @@ njs_date_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *date)
 
         year = tm.tm_year + 1900;
 
-        p = nxt_sprintf(buf, buf + NJS_ISO_DATE_TIME_LEN,
+        p = njs_sprintf(buf, buf + NJS_ISO_DATE_TIME_LEN,
                         (year < 0) ? "%07d-%02d-%02dT%02d:%02d:%02d.%03dZ"
                                    : "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ",
                         year, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min,
@@ -1078,13 +1078,13 @@ njs_date_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *date)
 
     *retval = njs_string_invalid_date;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_full_year(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     value;
     time_t     clock;
@@ -1092,7 +1092,7 @@ njs_date_prototype_get_full_year(njs_vm_t *vm, njs_value_t *args,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
         localtime_r(&clock, &tm);
 
@@ -1101,13 +1101,13 @@ njs_date_prototype_get_full_year(njs_vm_t *vm, njs_value_t *args,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_utc_full_year(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     value;
     time_t     clock;
@@ -1115,7 +1115,7 @@ njs_date_prototype_get_utc_full_year(njs_vm_t *vm, njs_value_t *args,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
         gmtime_r(&clock, &tm);
 
@@ -1124,12 +1124,12 @@ njs_date_prototype_get_utc_full_year(njs_vm_t *vm, njs_value_t *args,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_date_prototype_get_month(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_get_month(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double     value;
@@ -1138,7 +1138,7 @@ njs_date_prototype_get_month(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
         localtime_r(&clock, &tm);
 
@@ -1147,13 +1147,13 @@ njs_date_prototype_get_month(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_utc_month(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     value;
     time_t     clock;
@@ -1161,7 +1161,7 @@ njs_date_prototype_get_utc_month(njs_vm_t *vm, njs_value_t *args,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
 
         gmtime_r(&clock, &tm);
@@ -1171,12 +1171,12 @@ njs_date_prototype_get_utc_month(njs_vm_t *vm, njs_value_t *args,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_date_prototype_get_date(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_get_date(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double     value;
@@ -1185,7 +1185,7 @@ njs_date_prototype_get_date(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
         localtime_r(&clock, &tm);
 
@@ -1194,13 +1194,13 @@ njs_date_prototype_get_date(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_utc_date(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     value;
     time_t     clock;
@@ -1208,7 +1208,7 @@ njs_date_prototype_get_utc_date(njs_vm_t *vm, njs_value_t *args,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
         gmtime_r(&clock, &tm);
 
@@ -1217,12 +1217,12 @@ njs_date_prototype_get_utc_date(njs_vm_t *vm, njs_value_t *args,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_date_prototype_get_day(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_get_day(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double     value;
@@ -1231,7 +1231,7 @@ njs_date_prototype_get_day(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
         localtime_r(&clock, &tm);
 
@@ -1240,13 +1240,13 @@ njs_date_prototype_get_day(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_utc_day(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     value;
     time_t     clock;
@@ -1254,7 +1254,7 @@ njs_date_prototype_get_utc_day(njs_vm_t *vm, njs_value_t *args,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
         gmtime_r(&clock, &tm);
 
@@ -1263,12 +1263,12 @@ njs_date_prototype_get_utc_day(njs_vm_t *vm, njs_value_t *args,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_date_prototype_get_hours(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_get_hours(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double     value;
@@ -1277,7 +1277,7 @@ njs_date_prototype_get_hours(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
 
         localtime_r(&clock, &tm);
@@ -1287,13 +1287,13 @@ njs_date_prototype_get_hours(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_utc_hours(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     value;
     time_t     clock;
@@ -1301,7 +1301,7 @@ njs_date_prototype_get_utc_hours(njs_vm_t *vm, njs_value_t *args,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
         gmtime_r(&clock, &tm);
 
@@ -1310,13 +1310,13 @@ njs_date_prototype_get_utc_hours(njs_vm_t *vm, njs_value_t *args,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_minutes(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     value;
     time_t     clock;
@@ -1324,7 +1324,7 @@ njs_date_prototype_get_minutes(njs_vm_t *vm, njs_value_t *args,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
 
         localtime_r(&clock, &tm);
@@ -1334,13 +1334,13 @@ njs_date_prototype_get_minutes(njs_vm_t *vm, njs_value_t *args,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_utc_minutes(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     value;
     time_t     clock;
@@ -1348,7 +1348,7 @@ njs_date_prototype_get_utc_minutes(njs_vm_t *vm, njs_value_t *args,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
         gmtime_r(&clock, &tm);
 
@@ -1357,49 +1357,49 @@ njs_date_prototype_get_utc_minutes(njs_vm_t *vm, njs_value_t *args,
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_seconds(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double  value;
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         value = (int64_t) (value / 1000) % 60;
     }
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_milliseconds(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double  value;
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         value = (int64_t) value % 1000;
     }
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_get_timezone_offset(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     value;
     time_t     clock;
@@ -1407,28 +1407,28 @@ njs_date_prototype_get_timezone_offset(njs_vm_t *vm, njs_value_t *args,
 
     value = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(value))) {
+    if (njs_fast_path(!isnan(value))) {
         clock = value / 1000;
         localtime_r(&clock, &tm);
 
-        value = - nxt_timezone(&tm) / 60;
+        value = - njs_timezone(&tm) / 60;
     }
 
     njs_set_number(&vm->retval, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_date_prototype_set_time(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_set_time(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  time;
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             time = njs_number(&args[1]);
@@ -1441,19 +1441,19 @@ njs_date_prototype_set_time(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_set_milliseconds(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double  time;
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             time = (int64_t) (time / 1000) * 1000 + njs_number(&args[1]);
@@ -1466,20 +1466,20 @@ njs_date_prototype_set_milliseconds(njs_vm_t *vm, njs_value_t *args,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_set_seconds(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double   time;
     int64_t  sec, ms;
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             sec = njs_number(&args[1]);
@@ -1495,13 +1495,13 @@ njs_date_prototype_set_seconds(njs_vm_t *vm, njs_value_t *args,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_set_minutes(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     time;
     time_t     clock;
@@ -1510,7 +1510,7 @@ njs_date_prototype_set_minutes(njs_vm_t *vm, njs_value_t *args,
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             clock = time / 1000;
@@ -1534,20 +1534,20 @@ njs_date_prototype_set_minutes(njs_vm_t *vm, njs_value_t *args,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_set_utc_minutes(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double   time;
     int64_t  clock, min, sec, ms;
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             clock = time / 1000;
@@ -1569,12 +1569,12 @@ njs_date_prototype_set_utc_minutes(njs_vm_t *vm, njs_value_t *args,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_date_prototype_set_hours(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_set_hours(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double     time;
@@ -1584,7 +1584,7 @@ njs_date_prototype_set_hours(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             clock = time / 1000;
@@ -1612,20 +1612,20 @@ njs_date_prototype_set_hours(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_set_utc_hours(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double   time;
     int64_t  clock, hour, min, sec, ms;
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             clock = time / 1000;
@@ -1648,12 +1648,12 @@ njs_date_prototype_set_utc_hours(njs_vm_t *vm, njs_value_t *args,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_date_prototype_set_date(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_set_date(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double     time;
@@ -1662,7 +1662,7 @@ njs_date_prototype_set_date(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             clock = time / 1000;
@@ -1680,13 +1680,13 @@ njs_date_prototype_set_date(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_set_utc_date(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     time;
     time_t     clock;
@@ -1694,7 +1694,7 @@ njs_date_prototype_set_utc_date(njs_vm_t *vm, njs_value_t *args,
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             clock = time / 1000;
@@ -1712,12 +1712,12 @@ njs_date_prototype_set_utc_date(njs_vm_t *vm, njs_value_t *args,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_date_prototype_set_month(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_set_month(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double     time;
@@ -1726,7 +1726,7 @@ njs_date_prototype_set_month(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             clock = time / 1000;
@@ -1748,13 +1748,13 @@ njs_date_prototype_set_month(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_set_utc_month(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     time;
     time_t     clock;
@@ -1762,7 +1762,7 @@ njs_date_prototype_set_utc_month(njs_vm_t *vm, njs_value_t *args,
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             clock = time / 1000;
@@ -1784,13 +1784,13 @@ njs_date_prototype_set_utc_month(njs_vm_t *vm, njs_value_t *args,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_set_full_year(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     time;
     time_t     clock;
@@ -1798,7 +1798,7 @@ njs_date_prototype_set_full_year(njs_vm_t *vm, njs_value_t *args,
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             clock = time / 1000;
@@ -1824,13 +1824,13 @@ njs_date_prototype_set_full_year(njs_vm_t *vm, njs_value_t *args,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_date_prototype_set_utc_full_year(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double     time;
     time_t     clock;
@@ -1838,7 +1838,7 @@ njs_date_prototype_set_utc_full_year(njs_vm_t *vm, njs_value_t *args,
 
     time = njs_date(&args[0])->time;
 
-    if (nxt_fast_path(!isnan(time))) {
+    if (njs_fast_path(!isnan(time))) {
 
         if (nargs > 1) {
             clock = time / 1000;
@@ -1864,7 +1864,7 @@ njs_date_prototype_set_utc_full_year(njs_vm_t *vm, njs_value_t *args,
     njs_date(&args[0])->time = time;
     njs_set_number(&vm->retval, time);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1877,7 +1877,7 @@ njs_date_time(struct tm *tm, int64_t ms)
     tm->tm_isdst = -1;
     clock = mktime(tm);
 
-    if (nxt_fast_path(clock != -1)) {
+    if (njs_fast_path(clock != -1)) {
         time = (int64_t) clock * 1000 + ms;
 
     } else {
@@ -1896,19 +1896,19 @@ njs_date_utc_time(struct tm *tm, double time)
 
 
 static njs_ret_t
-njs_date_prototype_to_json(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_date_prototype_to_json(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t retval)
 {
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     if (njs_is_object(&args[0])) {
         lhq.key_hash = NJS_TO_ISO_STRING_HASH;
-        lhq.key = nxt_string_value("toISOString");
+        lhq.key = njs_str_value("toISOString");
 
         prop = njs_object_property(vm, njs_object(&args[0]), &lhq);
 
-        if (nxt_fast_path(prop != NULL && njs_is_function(&prop->value))) {
+        if (njs_fast_path(prop != NULL && njs_is_function(&prop->value))) {
             return njs_function_apply(vm, njs_function(&prop->value), args,
                                       nargs, &vm->retval);
         }
@@ -1916,7 +1916,7 @@ njs_date_prototype_to_json(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_type_error(vm, "\"this\" argument is not an object");
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -2330,7 +2330,7 @@ static const njs_object_prop_t  njs_date_prototype_properties[] =
 
 
 const njs_object_init_t  njs_date_prototype_init = {
-    nxt_string("Date"),
+    njs_str("Date"),
     njs_date_prototype_properties,
-    nxt_nitems(njs_date_prototype_properties),
+    njs_nitems(njs_date_prototype_properties),
 };
similarity index 91%
rename from njs/njs_date.h
rename to src/njs_date.h
index 38be5a3a426fdbfe1b84062b411d7eebb10f43d1..908aec734748f8b6429b6ce20515b0f1b3ca252e 100644 (file)
@@ -9,7 +9,7 @@
 
 
 njs_ret_t njs_date_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 njs_ret_t njs_date_to_string(njs_vm_t *vm, njs_value_t *retval,
     const njs_value_t *date);
similarity index 76%
rename from njs/njs_disassembler.c
rename to src/njs_disassembler.c
index 20181e0f804bdfad4c095e074785d497e52ecc89..6dda9a7a4ceea89a6a890ceafb795f01ab3c5510 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 
 
 static void njs_disassemble(u_char *start, u_char *end);
@@ -13,123 +13,123 @@ static void njs_disassemble(u_char *start, u_char *end);
 typedef struct {
     njs_vmcode_operation_t     operation;
     size_t                     size;
-    nxt_str_t                  name;
+    njs_str_t                  name;
 } njs_code_name_t;
 
 
 static njs_code_name_t  code_names[] = {
 
     { NJS_VMCODE_OBJECT, sizeof(njs_vmcode_object_t),
-          nxt_string("OBJECT          ") },
+          njs_str("OBJECT          ") },
     { NJS_VMCODE_FUNCTION, sizeof(njs_vmcode_function_t),
-          nxt_string("FUNCTION        ") },
+          njs_str("FUNCTION        ") },
     { NJS_VMCODE_THIS, sizeof(njs_vmcode_this_t),
-          nxt_string("THIS            ") },
+          njs_str("THIS            ") },
     { NJS_VMCODE_ARGUMENTS, sizeof(njs_vmcode_arguments_t),
-          nxt_string("ARGUMENTS       ") },
+          njs_str("ARGUMENTS       ") },
     { NJS_VMCODE_REGEXP, sizeof(njs_vmcode_regexp_t),
-          nxt_string("REGEXP          ") },
+          njs_str("REGEXP          ") },
     { NJS_VMCODE_TEMPLATE_LITERAL, sizeof(njs_vmcode_template_literal_t),
-          nxt_string("TEMPLATE LITERAL") },
+          njs_str("TEMPLATE LITERAL") },
     { NJS_VMCODE_OBJECT_COPY, sizeof(njs_vmcode_object_copy_t),
-          nxt_string("OBJECT COPY     ") },
+          njs_str("OBJECT COPY     ") },
 
     { NJS_VMCODE_PROPERTY_GET, sizeof(njs_vmcode_prop_get_t),
-          nxt_string("PROPERTY GET    ") },
+          njs_str("PROPERTY GET    ") },
     { NJS_VMCODE_PROPERTY_INIT, sizeof(njs_vmcode_prop_set_t),
-          nxt_string("PROPERTY INIT   ") },
+          njs_str("PROPERTY INIT   ") },
     { NJS_VMCODE_PROPERTY_SET, sizeof(njs_vmcode_prop_set_t),
-          nxt_string("PROPERTY SET    ") },
+          njs_str("PROPERTY SET    ") },
     { NJS_VMCODE_PROPERTY_IN, sizeof(njs_vmcode_3addr_t),
-          nxt_string("PROPERTY IN     ") },
+          njs_str("PROPERTY IN     ") },
     { NJS_VMCODE_PROPERTY_DELETE, sizeof(njs_vmcode_3addr_t),
-          nxt_string("PROPERTY DELETE ") },
+          njs_str("PROPERTY DELETE ") },
     { NJS_VMCODE_INSTANCE_OF, sizeof(njs_vmcode_instance_of_t),
-          nxt_string("INSTANCE OF     ") },
+          njs_str("INSTANCE OF     ") },
 
     { NJS_VMCODE_FUNCTION_CALL, sizeof(njs_vmcode_function_call_t),
-          nxt_string("FUNCTION CALL   ") },
+          njs_str("FUNCTION CALL   ") },
     { NJS_VMCODE_RETURN, sizeof(njs_vmcode_return_t),
-          nxt_string("RETURN          ") },
+          njs_str("RETURN          ") },
     { NJS_VMCODE_STOP, sizeof(njs_vmcode_stop_t),
-          nxt_string("STOP            ") },
+          njs_str("STOP            ") },
 
     { NJS_VMCODE_INCREMENT, sizeof(njs_vmcode_3addr_t),
-          nxt_string("INC             ") },
+          njs_str("INC             ") },
     { NJS_VMCODE_DECREMENT, sizeof(njs_vmcode_3addr_t),
-          nxt_string("DEC             ") },
+          njs_str("DEC             ") },
     { NJS_VMCODE_POST_INCREMENT, sizeof(njs_vmcode_3addr_t),
-          nxt_string("POST INC        ") },
+          njs_str("POST INC        ") },
     { NJS_VMCODE_POST_DECREMENT, sizeof(njs_vmcode_3addr_t),
-          nxt_string("POST DEC        ") },
+          njs_str("POST DEC        ") },
 
     { NJS_VMCODE_DELETE, sizeof(njs_vmcode_2addr_t),
-          nxt_string("DELETE          ") },
+          njs_str("DELETE          ") },
     { NJS_VMCODE_VOID, sizeof(njs_vmcode_2addr_t),
-          nxt_string("VOID            ") },
+          njs_str("VOID            ") },
     { NJS_VMCODE_TYPEOF, sizeof(njs_vmcode_2addr_t),
-          nxt_string("TYPEOF          ") },
+          njs_str("TYPEOF          ") },
 
     { NJS_VMCODE_UNARY_PLUS, sizeof(njs_vmcode_2addr_t),
-          nxt_string("PLUS            ") },
+          njs_str("PLUS            ") },
     { NJS_VMCODE_UNARY_NEGATION, sizeof(njs_vmcode_2addr_t),
-          nxt_string("NEGATION        ") },
+          njs_str("NEGATION        ") },
 
     { NJS_VMCODE_ADDITION, sizeof(njs_vmcode_3addr_t),
-          nxt_string("ADD             ") },
+          njs_str("ADD             ") },
     { NJS_VMCODE_SUBSTRACTION, sizeof(njs_vmcode_3addr_t),
-          nxt_string("SUBSTRACT       ") },
+          njs_str("SUBSTRACT       ") },
     { NJS_VMCODE_MULTIPLICATION, sizeof(njs_vmcode_3addr_t),
-          nxt_string("MULTIPLY        ") },
+          njs_str("MULTIPLY        ") },
     { NJS_VMCODE_EXPONENTIATION, sizeof(njs_vmcode_3addr_t),
-          nxt_string("POWER           ") },
+          njs_str("POWER           ") },
     { NJS_VMCODE_DIVISION, sizeof(njs_vmcode_3addr_t),
-          nxt_string("DIVIDE          ") },
+          njs_str("DIVIDE          ") },
     { NJS_VMCODE_REMAINDER, sizeof(njs_vmcode_3addr_t),
-          nxt_string("REMAINDER       ") },
+          njs_str("REMAINDER       ") },
 
     { NJS_VMCODE_LEFT_SHIFT, sizeof(njs_vmcode_3addr_t),
-          nxt_string("LEFT SHIFT      ") },
+          njs_str("LEFT SHIFT      ") },
     { NJS_VMCODE_RIGHT_SHIFT, sizeof(njs_vmcode_3addr_t),
-          nxt_string("RIGHT SHIFT     ") },
+          njs_str("RIGHT SHIFT     ") },
     { NJS_VMCODE_UNSIGNED_RIGHT_SHIFT, sizeof(njs_vmcode_3addr_t),
-          nxt_string("USGN RIGHT SHIFT") },
+          njs_str("USGN RIGHT SHIFT") },
 
     { NJS_VMCODE_LOGICAL_NOT, sizeof(njs_vmcode_2addr_t),
-          nxt_string("LOGICAL NOT     ") },
+          njs_str("LOGICAL NOT     ") },
 
     { NJS_VMCODE_BITWISE_NOT, sizeof(njs_vmcode_2addr_t),
-          nxt_string("BINARY NOT      ") },
+          njs_str("BINARY NOT      ") },
     { NJS_VMCODE_BITWISE_AND, sizeof(njs_vmcode_3addr_t),
-          nxt_string("BINARY AND      ") },
+          njs_str("BINARY AND      ") },
     { NJS_VMCODE_BITWISE_XOR, sizeof(njs_vmcode_3addr_t),
-          nxt_string("BINARY XOR      ") },
+          njs_str("BINARY XOR      ") },
     { NJS_VMCODE_BITWISE_OR, sizeof(njs_vmcode_3addr_t),
-          nxt_string("BINARY OR       ") },
+          njs_str("BINARY OR       ") },
 
     { NJS_VMCODE_EQUAL, sizeof(njs_vmcode_3addr_t),
-          nxt_string("EQUAL           ") },
+          njs_str("EQUAL           ") },
     { NJS_VMCODE_NOT_EQUAL, sizeof(njs_vmcode_3addr_t),
-          nxt_string("NOT EQUAL       ") },
+          njs_str("NOT EQUAL       ") },
     { NJS_VMCODE_LESS, sizeof(njs_vmcode_3addr_t),
-          nxt_string("LESS            ") },
+          njs_str("LESS            ") },
     { NJS_VMCODE_LESS_OR_EQUAL, sizeof(njs_vmcode_3addr_t),
-          nxt_string("LESS OR EQUAL   ") },
+          njs_str("LESS OR EQUAL   ") },
     { NJS_VMCODE_GREATER, sizeof(njs_vmcode_3addr_t),
-          nxt_string("GREATER         ") },
+          njs_str("GREATER         ") },
     { NJS_VMCODE_GREATER_OR_EQUAL, sizeof(njs_vmcode_3addr_t),
-          nxt_string("GREATER OR EQUAL") },
+          njs_str("GREATER OR EQUAL") },
 
     { NJS_VMCODE_STRICT_EQUAL, sizeof(njs_vmcode_3addr_t),
-          nxt_string("STRICT EQUAL    ") },
+          njs_str("STRICT EQUAL    ") },
     { NJS_VMCODE_STRICT_NOT_EQUAL, sizeof(njs_vmcode_3addr_t),
-          nxt_string("STRICT NOT EQUAL") },
+          njs_str("STRICT NOT EQUAL") },
 
     { NJS_VMCODE_MOVE, sizeof(njs_vmcode_move_t),
-          nxt_string("MOVE            ") },
+          njs_str("MOVE            ") },
 
     { NJS_VMCODE_THROW, sizeof(njs_vmcode_throw_t),
-          nxt_string("THROW           ") },
+          njs_str("THROW           ") },
 
 };
 
@@ -137,14 +137,14 @@ static njs_code_name_t  code_names[] = {
 void
 njs_disassembler(njs_vm_t *vm)
 {
-    nxt_uint_t     n;
+    njs_uint_t     n;
     njs_vm_code_t  *code;
 
     code = vm->codes->start;
     n = vm->codes->items;
 
     while (n != 0) {
-        nxt_printf("%V:%V\n", &code->file, &code->name);
+        njs_printf("%V:%V\n", &code->file, &code->name);
         njs_disassemble(code->start, code->end);
         code++;
         n--;
@@ -156,8 +156,8 @@ static void
 njs_disassemble(u_char *start, u_char *end)
 {
     u_char                       *p;
-    nxt_str_t                    *name;
-    nxt_uint_t                   n;
+    njs_str_t                    *name;
+    njs_uint_t                   n;
     const char                   *sign;
     njs_code_name_t              *code_name;
     njs_vmcode_jump_t            *jump;
@@ -194,7 +194,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_ARRAY) {
             array = (njs_vmcode_array_t *) p;
 
-            nxt_printf("%05uz ARRAY             %04Xz %uz%s\n",
+            njs_printf("%05uz ARRAY             %04Xz %uz%s\n",
                        p - start, (size_t) array->retval,
                        (size_t) array->length, array->ctor ? " INIT" : "");
 
@@ -207,7 +207,7 @@ njs_disassemble(u_char *start, u_char *end)
             cond_jump = (njs_vmcode_cond_jump_t *) p;
             sign = (cond_jump->offset >= 0) ? "+" : "";
 
-            nxt_printf("%05uz JUMP IF TRUE      %04Xz %s%uz\n",
+            njs_printf("%05uz JUMP IF TRUE      %04Xz %s%uz\n",
                        p - start, (size_t) cond_jump->cond, sign,
                        (size_t) cond_jump->offset);
 
@@ -220,7 +220,7 @@ njs_disassemble(u_char *start, u_char *end)
             cond_jump = (njs_vmcode_cond_jump_t *) p;
             sign = (cond_jump->offset >= 0) ? "+" : "";
 
-            nxt_printf("%05uz JUMP IF FALSE     %04Xz %s%uz\n",
+            njs_printf("%05uz JUMP IF FALSE     %04Xz %s%uz\n",
                        p - start, (size_t) cond_jump->cond, sign,
                        (size_t) cond_jump->offset);
 
@@ -233,7 +233,7 @@ njs_disassemble(u_char *start, u_char *end)
             jump = (njs_vmcode_jump_t *) p;
             sign = (jump->offset >= 0) ? "+" : "";
 
-            nxt_printf("%05uz JUMP              %s%uz\n",
+            njs_printf("%05uz JUMP              %s%uz\n",
                        p - start, sign, (size_t) jump->offset);
 
             p += sizeof(njs_vmcode_jump_t);
@@ -244,7 +244,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_IF_EQUAL_JUMP) {
             equal = (njs_vmcode_equal_jump_t *) p;
 
-            nxt_printf("%05uz JUMP IF EQUAL     %04Xz %04Xz +%uz\n",
+            njs_printf("%05uz JUMP IF EQUAL     %04Xz %04Xz +%uz\n",
                        p - start, (size_t) equal->value1,
                        (size_t) equal->value2, (size_t) equal->offset);
 
@@ -256,7 +256,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_TEST_IF_TRUE) {
             test_jump = (njs_vmcode_test_jump_t *) p;
 
-            nxt_printf("%05uz TEST IF TRUE      %04Xz %04Xz +%uz\n",
+            njs_printf("%05uz TEST IF TRUE      %04Xz %04Xz +%uz\n",
                        p - start, (size_t) test_jump->retval,
                        (size_t) test_jump->value, (size_t) test_jump->offset);
 
@@ -268,7 +268,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_TEST_IF_FALSE) {
             test_jump = (njs_vmcode_test_jump_t *) p;
 
-            nxt_printf("%05uz TEST IF FALSE     %04Xz %04Xz +%uz\n",
+            njs_printf("%05uz TEST IF FALSE     %04Xz %04Xz +%uz\n",
                        p - start, (size_t) test_jump->retval,
                        (size_t) test_jump->value, (size_t) test_jump->offset);
 
@@ -280,7 +280,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_FUNCTION_FRAME) {
             function = (njs_vmcode_function_frame_t *) p;
 
-            nxt_printf("%05uz FUNCTION FRAME    %04Xz %uz%s\n",
+            njs_printf("%05uz FUNCTION FRAME    %04Xz %uz%s\n",
                        p - start, (size_t) function->name, function->nargs,
                        function->ctor ? " CTOR" : "");
 
@@ -292,7 +292,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_METHOD_FRAME) {
             method = (njs_vmcode_method_frame_t *) p;
 
-            nxt_printf("%05uz METHOD FRAME      %04Xz %04Xz %uz%s\n",
+            njs_printf("%05uz METHOD FRAME      %04Xz %04Xz %uz%s\n",
                        p - start, (size_t) method->object,
                        (size_t) method->method, method->nargs,
                        method->ctor ? " CTOR" : "");
@@ -304,7 +304,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_PROPERTY_FOREACH) {
             prop_foreach = (njs_vmcode_prop_foreach_t *) p;
 
-            nxt_printf("%05uz PROPERTY FOREACH  %04Xz %04Xz +%uz\n",
+            njs_printf("%05uz PROPERTY FOREACH  %04Xz %04Xz +%uz\n",
                        p - start, (size_t) prop_foreach->next,
                        (size_t) prop_foreach->object,
                        (size_t) prop_foreach->offset);
@@ -316,7 +316,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_PROPERTY_NEXT) {
             prop_next = (njs_vmcode_prop_next_t *) p;
 
-            nxt_printf("%05uz PROPERTY NEXT     %04Xz %04Xz %04Xz %uz\n",
+            njs_printf("%05uz PROPERTY NEXT     %04Xz %04Xz %04Xz %uz\n",
                        p - start, (size_t) prop_next->retval,
                        (size_t) prop_next->object, (size_t) prop_next->next,
                        (size_t) prop_next->offset);
@@ -329,7 +329,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_TRY_START) {
             try_start = (njs_vmcode_try_start_t *) p;
 
-            nxt_printf("%05uz TRY START         %04Xz %04Xz +%uz\n",
+            njs_printf("%05uz TRY START         %04Xz %04Xz +%uz\n",
                        p - start, (size_t) try_start->exception_value,
                        (size_t) try_start->exit_value,
                        (size_t) try_start->offset);
@@ -342,7 +342,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_TRY_BREAK) {
             try_tramp = (njs_vmcode_try_trampoline_t *) p;
 
-            nxt_printf("%05uz TRY BREAK         %04Xz %uz\n",
+            njs_printf("%05uz TRY BREAK         %04Xz %uz\n",
                        p - start, (size_t) try_tramp->exit_value,
                        (size_t) try_tramp->offset);
 
@@ -354,7 +354,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_TRY_CONTINUE) {
             try_tramp = (njs_vmcode_try_trampoline_t *) p;
 
-            nxt_printf("%05uz TRY CONTINUE      %04Xz %uz\n",
+            njs_printf("%05uz TRY CONTINUE      %04Xz %uz\n",
                        p - start, (size_t) try_tramp->exit_value,
                        (size_t) try_tramp->offset);
 
@@ -366,7 +366,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_TRY_RETURN) {
             try_return = (njs_vmcode_try_return_t *) p;
 
-            nxt_printf("%05uz TRY RETURN        %04Xz %04Xz +%uz\n",
+            njs_printf("%05uz TRY RETURN        %04Xz %04Xz +%uz\n",
                        p - start, (size_t) try_return->save,
                        (size_t) try_return->retval,
                        (size_t) try_return->offset);
@@ -379,7 +379,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_CATCH) {
             catch = (njs_vmcode_catch_t *) p;
 
-            nxt_printf("%05uz CATCH             %04Xz +%uz\n",
+            njs_printf("%05uz CATCH             %04Xz +%uz\n",
                        p - start, (size_t) catch->exception,
                        (size_t) catch->offset);
 
@@ -391,7 +391,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_TRY_END) {
             try_end = (njs_vmcode_try_end_t *) p;
 
-            nxt_printf("%05uz TRY END           +%uz\n",
+            njs_printf("%05uz TRY END           +%uz\n",
                        p - start, (size_t) try_end->offset);
 
             p += sizeof(njs_vmcode_try_end_t);
@@ -402,7 +402,7 @@ njs_disassemble(u_char *start, u_char *end)
         if (operation == NJS_VMCODE_FINALLY) {
             finally = (njs_vmcode_finally_t *) p;
 
-            nxt_printf("%05uz TRY FINALLY       %04Xz %04Xz +%uz +%uz\n",
+            njs_printf("%05uz TRY FINALLY       %04Xz %04Xz +%uz +%uz\n",
                        p - start, (size_t) finally->retval,
                        (size_t) finally->exit_value,
                        (size_t) finally->continue_offset,
@@ -414,7 +414,7 @@ njs_disassemble(u_char *start, u_char *end)
         }
 
         if (operation == NJS_VMCODE_REFERENCE_ERROR) {
-            nxt_printf("%05uz REFERENCE ERROR\n", p - start);
+            njs_printf("%05uz REFERENCE ERROR\n", p - start);
 
             p += sizeof(njs_vmcode_reference_error_t);
 
@@ -422,7 +422,7 @@ njs_disassemble(u_char *start, u_char *end)
         }
 
         code_name = code_names;
-        n = nxt_nitems(code_names);
+        n = njs_nitems(code_names);
 
         do {
             if (operation == code_name->operation) {
@@ -431,7 +431,7 @@ njs_disassemble(u_char *start, u_char *end)
                 if (code_name->size == sizeof(njs_vmcode_3addr_t)) {
                     code3 = (njs_vmcode_3addr_t *) p;
 
-                    nxt_printf("%05uz %*s  %04Xz %04Xz %04Xz\n",
+                    njs_printf("%05uz %*s  %04Xz %04Xz %04Xz\n",
                                p - start, name->length, name->start,
                                (size_t) code3->dst, (size_t) code3->src1,
                                (size_t) code3->src2);
@@ -439,14 +439,14 @@ njs_disassemble(u_char *start, u_char *end)
                 } else if (code_name->size == sizeof(njs_vmcode_2addr_t)) {
                     code2 = (njs_vmcode_2addr_t *) p;
 
-                    nxt_printf("%05uz %*s  %04Xz %04Xz\n",
+                    njs_printf("%05uz %*s  %04Xz %04Xz\n",
                                p - start, name->length, name->start,
                                (size_t) code2->dst, (size_t) code2->src);
 
                 } else if (code_name->size == sizeof(njs_vmcode_1addr_t)) {
                     code1 = (njs_vmcode_1addr_t *) p;
 
-                    nxt_printf("%05uz %*s  %04Xz\n",
+                    njs_printf("%05uz %*s  %04Xz\n",
                                p - start, name->length, name->start,
                                (size_t) code1->index);
                 }
@@ -461,7 +461,7 @@ njs_disassemble(u_char *start, u_char *end)
 
         } while (n != 0);
 
-        nxt_printf("%05uz UNKNOWN           %04Xz\n",
+        njs_printf("%05uz UNKNOWN           %04Xz\n",
                    p - start, (size_t) (uintptr_t) operation);
 
         p += sizeof(njs_vmcode_operation_t);
diff --git a/src/njs_diyfp.c b/src/njs_diyfp.c
new file mode 100644 (file)
index 0000000..676b6f8
--- /dev/null
@@ -0,0 +1,150 @@
+
+/*
+ * Copyright (C) Dmitry Volyntsev
+ * Copyright (C) NGINX, Inc.
+ *
+ * An internal diy_fp implementation.
+ * For details, see Loitsch, Florian. "Printing floating-point numbers quickly
+ * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_diyfp.h>
+
+
+typedef struct njs_cpe_s {
+  uint64_t  significand;
+  int16_t   bin_exp;
+  int16_t   dec_exp;
+} njs_cpe_t;
+
+
+static const njs_cpe_t njs_cached_powers[] = {
+  { njs_uint64(0xfa8fd5a0, 0x081c0288), -1220, -348 },
+  { njs_uint64(0xbaaee17f, 0xa23ebf76), -1193, -340 },
+  { njs_uint64(0x8b16fb20, 0x3055ac76), -1166, -332 },
+  { njs_uint64(0xcf42894a, 0x5dce35ea), -1140, -324 },
+  { njs_uint64(0x9a6bb0aa, 0x55653b2d), -1113, -316 },
+  { njs_uint64(0xe61acf03, 0x3d1a45df), -1087, -308 },
+  { njs_uint64(0xab70fe17, 0xc79ac6ca), -1060, -300 },
+  { njs_uint64(0xff77b1fc, 0xbebcdc4f), -1034, -292 },
+  { njs_uint64(0xbe5691ef, 0x416bd60c), -1007, -284 },
+  { njs_uint64(0x8dd01fad, 0x907ffc3c),  -980, -276 },
+  { njs_uint64(0xd3515c28, 0x31559a83),  -954, -268 },
+  { njs_uint64(0x9d71ac8f, 0xada6c9b5),  -927, -260 },
+  { njs_uint64(0xea9c2277, 0x23ee8bcb),  -901, -252 },
+  { njs_uint64(0xaecc4991, 0x4078536d),  -874, -244 },
+  { njs_uint64(0x823c1279, 0x5db6ce57),  -847, -236 },
+  { njs_uint64(0xc2109436, 0x4dfb5637),  -821, -228 },
+  { njs_uint64(0x9096ea6f, 0x3848984f),  -794, -220 },
+  { njs_uint64(0xd77485cb, 0x25823ac7),  -768, -212 },
+  { njs_uint64(0xa086cfcd, 0x97bf97f4),  -741, -204 },
+  { njs_uint64(0xef340a98, 0x172aace5),  -715, -196 },
+  { njs_uint64(0xb23867fb, 0x2a35b28e),  -688, -188 },
+  { njs_uint64(0x84c8d4df, 0xd2c63f3b),  -661, -180 },
+  { njs_uint64(0xc5dd4427, 0x1ad3cdba),  -635, -172 },
+  { njs_uint64(0x936b9fce, 0xbb25c996),  -608, -164 },
+  { njs_uint64(0xdbac6c24, 0x7d62a584),  -582, -156 },
+  { njs_uint64(0xa3ab6658, 0x0d5fdaf6),  -555, -148 },
+  { njs_uint64(0xf3e2f893, 0xdec3f126),  -529, -140 },
+  { njs_uint64(0xb5b5ada8, 0xaaff80b8),  -502, -132 },
+  { njs_uint64(0x87625f05, 0x6c7c4a8b),  -475, -124 },
+  { njs_uint64(0xc9bcff60, 0x34c13053),  -449, -116 },
+  { njs_uint64(0x964e858c, 0x91ba2655),  -422, -108 },
+  { njs_uint64(0xdff97724, 0x70297ebd),  -396, -100 },
+  { njs_uint64(0xa6dfbd9f, 0xb8e5b88f),  -369,  -92 },
+  { njs_uint64(0xf8a95fcf, 0x88747d94),  -343,  -84 },
+  { njs_uint64(0xb9447093, 0x8fa89bcf),  -316,  -76 },
+  { njs_uint64(0x8a08f0f8, 0xbf0f156b),  -289,  -68 },
+  { njs_uint64(0xcdb02555, 0x653131b6),  -263,  -60 },
+  { njs_uint64(0x993fe2c6, 0xd07b7fac),  -236,  -52 },
+  { njs_uint64(0xe45c10c4, 0x2a2b3b06),  -210,  -44 },
+  { njs_uint64(0xaa242499, 0x697392d3),  -183,  -36 },
+  { njs_uint64(0xfd87b5f2, 0x8300ca0e),  -157,  -28 },
+  { njs_uint64(0xbce50864, 0x92111aeb),  -130,  -20 },
+  { njs_uint64(0x8cbccc09, 0x6f5088cc),  -103,  -12 },
+  { njs_uint64(0xd1b71758, 0xe219652c),   -77,   -4 },
+  { njs_uint64(0x9c400000, 0x00000000),   -50,    4 },
+  { njs_uint64(0xe8d4a510, 0x00000000),   -24,   12 },
+  { njs_uint64(0xad78ebc5, 0xac620000),     3,   20 },
+  { njs_uint64(0x813f3978, 0xf8940984),    30,   28 },
+  { njs_uint64(0xc097ce7b, 0xc90715b3),    56,   36 },
+  { njs_uint64(0x8f7e32ce, 0x7bea5c70),    83,   44 },
+  { njs_uint64(0xd5d238a4, 0xabe98068),   109,   52 },
+  { njs_uint64(0x9f4f2726, 0x179a2245),   136,   60 },
+  { njs_uint64(0xed63a231, 0xd4c4fb27),   162,   68 },
+  { njs_uint64(0xb0de6538, 0x8cc8ada8),   189,   76 },
+  { njs_uint64(0x83c7088e, 0x1aab65db),   216,   84 },
+  { njs_uint64(0xc45d1df9, 0x42711d9a),   242,   92 },
+  { njs_uint64(0x924d692c, 0xa61be758),   269,  100 },
+  { njs_uint64(0xda01ee64, 0x1a708dea),   295,  108 },
+  { njs_uint64(0xa26da399, 0x9aef774a),   322,  116 },
+  { njs_uint64(0xf209787b, 0xb47d6b85),   348,  124 },
+  { njs_uint64(0xb454e4a1, 0x79dd1877),   375,  132 },
+  { njs_uint64(0x865b8692, 0x5b9bc5c2),   402,  140 },
+  { njs_uint64(0xc83553c5, 0xc8965d3d),   428,  148 },
+  { njs_uint64(0x952ab45c, 0xfa97a0b3),   455,  156 },
+  { njs_uint64(0xde469fbd, 0x99a05fe3),   481,  164 },
+  { njs_uint64(0xa59bc234, 0xdb398c25),   508,  172 },
+  { njs_uint64(0xf6c69a72, 0xa3989f5c),   534,  180 },
+  { njs_uint64(0xb7dcbf53, 0x54e9bece),   561,  188 },
+  { njs_uint64(0x88fcf317, 0xf22241e2),   588,  196 },
+  { njs_uint64(0xcc20ce9b, 0xd35c78a5),   614,  204 },
+  { njs_uint64(0x98165af3, 0x7b2153df),   641,  212 },
+  { njs_uint64(0xe2a0b5dc, 0x971f303a),   667,  220 },
+  { njs_uint64(0xa8d9d153, 0x5ce3b396),   694,  228 },
+  { njs_uint64(0xfb9b7cd9, 0xa4a7443c),   720,  236 },
+  { njs_uint64(0xbb764c4c, 0xa7a44410),   747,  244 },
+  { njs_uint64(0x8bab8eef, 0xb6409c1a),   774,  252 },
+  { njs_uint64(0xd01fef10, 0xa657842c),   800,  260 },
+  { njs_uint64(0x9b10a4e5, 0xe9913129),   827,  268 },
+  { njs_uint64(0xe7109bfb, 0xa19c0c9d),   853,  276 },
+  { njs_uint64(0xac2820d9, 0x623bf429),   880,  284 },
+  { njs_uint64(0x80444b5e, 0x7aa7cf85),   907,  292 },
+  { njs_uint64(0xbf21e440, 0x03acdd2d),   933,  300 },
+  { njs_uint64(0x8e679c2f, 0x5e44ff8f),   960,  308 },
+  { njs_uint64(0xd433179d, 0x9c8cb841),   986,  316 },
+  { njs_uint64(0x9e19db92, 0xb4e31ba9),  1013,  324 },
+  { njs_uint64(0xeb96bf6e, 0xbadf77d9),  1039,  332 },
+  { njs_uint64(0xaf87023b, 0x9bf0ee6b),  1066,  340 },
+};
+
+
+#define NJS_D_1_LOG2_10     0.30102999566398114 /* 1 / log2(10). */
+
+
+njs_diyfp_t
+njs_cached_power_dec(int exp, int *dec_exp)
+{
+    u_int            index;
+    const njs_cpe_t  *cp;
+
+    index = (exp + NJS_DECIMAL_EXPONENT_OFF) / NJS_DECIMAL_EXPONENT_DIST;
+    cp = &njs_cached_powers[index];
+
+    *dec_exp = cp->dec_exp;
+
+    return njs_diyfp(cp->significand, cp->bin_exp);
+}
+
+
+njs_diyfp_t
+njs_cached_power_bin(int exp, int *dec_exp)
+{
+    int              k;
+    u_int            index;
+    const njs_cpe_t  *cp;
+
+    k = (int) ceil((-61 - exp) * NJS_D_1_LOG2_10)
+        + NJS_DECIMAL_EXPONENT_OFF - 1;
+
+    index = (unsigned) (k >> 3) + 1;
+
+    cp = &njs_cached_powers[index];
+
+    *dec_exp = -(NJS_DECIMAL_EXPONENT_MIN + (int) (index << 3));
+
+    return njs_diyfp(cp->significand, cp->bin_exp);
+}
diff --git a/src/njs_diyfp.h b/src/njs_diyfp.h
new file mode 100644 (file)
index 0000000..e7190a7
--- /dev/null
@@ -0,0 +1,212 @@
+
+/*
+ * Copyright (C) Dmitry Volyntsev
+ * Copyright (C) NGINX, Inc.
+ *
+ * An internal diy_fp implementation.
+ * For details, see Loitsch, Florian. "Printing floating-point numbers quickly
+ * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
+ */
+
+#ifndef _NJS_DIYFP_H_INCLUDED_
+#define _NJS_DIYFP_H_INCLUDED_
+
+#include <njs_types.h>
+#include <math.h>
+
+
+typedef struct {
+    uint64_t    significand;
+    int         exp;
+} njs_diyfp_t;
+
+
+#define njs_diyfp(_s, _e)           (njs_diyfp_t) \
+                                    { .significand = (_s), .exp = (_e) }
+#define njs_uint64(h, l)            (((uint64_t) (h) << 32) + (l))
+
+
+#define NJS_DBL_SIGNIFICAND_SIZE    52
+#define NJS_DBL_EXPONENT_BIAS       (0x3FF + NJS_DBL_SIGNIFICAND_SIZE)
+#define NJS_DBL_EXPONENT_MIN        (-NJS_DBL_EXPONENT_BIAS)
+#define NJS_DBL_EXPONENT_MAX        (0x7FF - NJS_DBL_EXPONENT_BIAS)
+#define NJS_DBL_EXPONENT_DENORMAL   (-NJS_DBL_EXPONENT_BIAS + 1)
+
+#define NJS_DBL_SIGNIFICAND_MASK    njs_uint64(0x000FFFFF, 0xFFFFFFFF)
+#define NJS_DBL_HIDDEN_BIT          njs_uint64(0x00100000, 0x00000000)
+#define NJS_DBL_EXPONENT_MASK       njs_uint64(0x7FF00000, 0x00000000)
+
+#define NJS_DIYFP_SIGNIFICAND_SIZE  64
+
+#define NJS_SIGNIFICAND_SIZE        53
+#define NJS_SIGNIFICAND_SHIFT       (NJS_DIYFP_SIGNIFICAND_SIZE     \
+                                     - NJS_DBL_SIGNIFICAND_SIZE)
+
+#define NJS_DECIMAL_EXPONENT_OFF    348
+#define NJS_DECIMAL_EXPONENT_MIN    (-348)
+#define NJS_DECIMAL_EXPONENT_MAX    340
+#define NJS_DECIMAL_EXPONENT_DIST   8
+
+
+njs_inline njs_diyfp_t
+njs_d2diyfp(double d)
+{
+    int           biased_exp;
+    uint64_t      significand;
+    njs_diyfp_t   r;
+
+    union {
+        double    d;
+        uint64_t  u64;
+    } u;
+
+    u.d = d;
+
+    biased_exp = (u.u64 & NJS_DBL_EXPONENT_MASK) >> NJS_DBL_SIGNIFICAND_SIZE;
+    significand = u.u64 & NJS_DBL_SIGNIFICAND_MASK;
+
+    if (biased_exp != 0) {
+        r.significand = significand + NJS_DBL_HIDDEN_BIT;
+        r.exp = biased_exp - NJS_DBL_EXPONENT_BIAS;
+
+    } else {
+        r.significand = significand;
+        r.exp = NJS_DBL_EXPONENT_MIN + 1;
+    }
+
+    return r;
+}
+
+
+njs_inline double
+njs_diyfp2d(njs_diyfp_t v)
+{
+    int           exp;
+    uint64_t      significand, biased_exp;
+
+    union {
+        double    d;
+        uint64_t  u64;
+    } u;
+
+    exp = v.exp;
+    significand = v.significand;
+
+    while (significand > NJS_DBL_HIDDEN_BIT + NJS_DBL_SIGNIFICAND_MASK) {
+        significand >>= 1;
+        exp++;
+    }
+
+    if (exp >= NJS_DBL_EXPONENT_MAX) {
+        return INFINITY;
+    }
+
+    if (exp < NJS_DBL_EXPONENT_DENORMAL) {
+        return 0.0;
+    }
+
+    while (exp > NJS_DBL_EXPONENT_DENORMAL
+           && (significand & NJS_DBL_HIDDEN_BIT) == 0)
+    {
+        significand <<= 1;
+        exp--;
+    }
+
+    if (exp == NJS_DBL_EXPONENT_DENORMAL
+        && (significand & NJS_DBL_HIDDEN_BIT) == 0)
+    {
+        biased_exp = 0;
+
+    } else {
+        biased_exp = (uint64_t) (exp + NJS_DBL_EXPONENT_BIAS);
+    }
+
+    u.u64 = (significand & NJS_DBL_SIGNIFICAND_MASK)
+            | (biased_exp << NJS_DBL_SIGNIFICAND_SIZE);
+
+    return u.d;
+}
+
+
+njs_inline njs_diyfp_t
+njs_diyfp_shift_left(njs_diyfp_t v, unsigned shift)
+{
+    return njs_diyfp(v.significand << shift, v.exp - shift);
+}
+
+
+njs_inline njs_diyfp_t
+njs_diyfp_shift_right(njs_diyfp_t v, unsigned shift)
+{
+    return njs_diyfp(v.significand >> shift, v.exp + shift);
+}
+
+
+njs_inline njs_diyfp_t
+njs_diyfp_sub(njs_diyfp_t lhs, njs_diyfp_t rhs)
+{
+    return njs_diyfp(lhs.significand - rhs.significand, lhs.exp);
+}
+
+
+njs_inline njs_diyfp_t
+njs_diyfp_mul(njs_diyfp_t lhs, njs_diyfp_t rhs)
+{
+#if (NJS_HAVE_UNSIGNED_INT128)
+
+    uint64_t       l, h;
+    njs_uint128_t  u128;
+
+    u128 = (njs_uint128_t) (lhs.significand)
+           * (njs_uint128_t) (rhs.significand);
+
+    h = u128 >> 64;
+    l = (uint64_t) u128;
+
+    /* rounding. */
+
+    if (l & ((uint64_t) 1 << 63)) {
+        h++;
+    }
+
+    return njs_diyfp(h, lhs.exp + rhs.exp + 64);
+
+#else
+
+    uint64_t  a, b, c, d, ac, bc, ad, bd, tmp;
+
+    a = lhs.significand >> 32;
+    b = lhs.significand & 0xffffffff;
+    c = rhs.significand >> 32;
+    d = rhs.significand & 0xffffffff;
+
+    ac = a * c;
+    bc = b * c;
+    ad = a * d;
+    bd = b * d;
+
+    tmp = (bd >> 32) + (ad & 0xffffffff) + (bc & 0xffffffff);
+
+    /* mult_round. */
+
+    tmp += 1U << 31;
+
+    return njs_diyfp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32),
+                     lhs.exp + rhs.exp + 64);
+
+#endif
+}
+
+
+njs_inline njs_diyfp_t
+njs_diyfp_normalize(njs_diyfp_t v)
+{
+    return njs_diyfp_shift_left(v, njs_leading_zeros64(v.significand));
+}
+
+
+njs_diyfp_t njs_cached_power_dec(int exp, int *dec_exp);
+njs_diyfp_t njs_cached_power_bin(int exp, int *dec_exp);
+
+
+#endif /* _NJS_DIYFP_H_INCLUDED_ */
diff --git a/src/njs_djb_hash.c b/src/njs_djb_hash.c
new file mode 100644 (file)
index 0000000..77fa34f
--- /dev/null
@@ -0,0 +1,48 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_djb_hash.h>
+
+
+uint32_t
+njs_djb_hash(const void *data, size_t len)
+{
+    uint32_t      hash;
+    const u_char  *p;
+
+    p = data;
+    hash = NJS_DJB_HASH_INIT;
+
+    while (len != 0) {
+        hash = njs_djb_hash_add(hash, *p++);
+        len--;
+    }
+
+    return hash;
+}
+
+
+uint32_t
+njs_djb_hash_lowcase(const void *data, size_t len)
+{
+    uint32_t      hash;
+    const u_char  *p;
+
+    p = data;
+    hash = NJS_DJB_HASH_INIT;
+
+    while (len != 0) {
+        hash = njs_djb_hash_add(hash, njs_lower_case(*p++));
+        len--;
+    }
+
+    return hash;
+}
diff --git a/src/njs_djb_hash.h b/src/njs_djb_hash.h
new file mode 100644 (file)
index 0000000..0cfe69a
--- /dev/null
@@ -0,0 +1,25 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_DJB_HASH_H_INCLUDED_
+#define _NJS_DJB_HASH_H_INCLUDED_
+
+
+/* A fast and simple hash function by Daniel J. Bernstein. */
+
+
+NJS_EXPORT uint32_t njs_djb_hash(const void *data, size_t len);
+NJS_EXPORT uint32_t njs_djb_hash_lowcase(const void *data, size_t len);
+
+
+#define NJS_DJB_HASH_INIT  5381
+
+
+#define njs_djb_hash_add(hash, val)                                           \
+    ((uint32_t) ((((hash) << 5) + (hash)) ^ (uint32_t) (val)))
+
+
+#endif /* _NJS_DJB_HASH_H_INCLUDED_ */
similarity index 74%
rename from nxt/nxt_dtoa.c
rename to src/njs_dtoa.c
index ebf74e56b1def984eb9b24654e2a316a0acb7c0b..1c3d44538df9224bf137f7db34fb255cd54eee34 100644 (file)
  * THE SOFTWARE.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_string.h>
-#include <nxt_diyfp.h>
-#include <nxt_dtoa.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_str.h>
+#include <njs_diyfp.h>
+#include <njs_dtoa.h>
 
 #include <math.h>
 #include <string.h>
 
 
-nxt_inline void
-nxt_grisu2_round(char *start, size_t len, uint64_t delta, uint64_t rest,
+njs_inline void
+njs_grisu2_round(char *start, size_t len, uint64_t delta, uint64_t rest,
     uint64_t ten_kappa, uint64_t wp_w)
 {
     while (rest < wp_w && delta - rest >= ten_kappa
@@ -58,8 +58,8 @@ nxt_grisu2_round(char *start, size_t len, uint64_t delta, uint64_t rest,
 }
 
 
-nxt_inline int
-nxt_dec_count(uint32_t n)
+njs_inline int
+njs_dec_count(uint32_t n)
 {
     if (n < 10000) {
         if (n < 100) {
@@ -85,15 +85,15 @@ nxt_dec_count(uint32_t n)
 }
 
 
-nxt_inline size_t
-nxt_grisu2_gen(nxt_diyfp_t W, nxt_diyfp_t Mp, uint64_t delta, char *start,
+njs_inline size_t
+njs_grisu2_gen(njs_diyfp_t W, njs_diyfp_t Mp, uint64_t delta, char *start,
     int *dec_exp)
 {
     int          kappa;
     char         c, *p;
     uint32_t     p1, d;
     uint64_t     p2, tmp;
-    nxt_diyfp_t  one, wp_w;
+    njs_diyfp_t  one, wp_w;
 
     static const uint64_t pow10[] = {
         1,
@@ -108,9 +108,9 @@ nxt_grisu2_gen(nxt_diyfp_t W, nxt_diyfp_t Mp, uint64_t delta, char *start,
         1000000000
     };
 
-    wp_w = nxt_diyfp_sub(Mp, W);
+    wp_w = njs_diyfp_sub(Mp, W);
 
-    one = nxt_diyfp((uint64_t) 1 << -Mp.exp, Mp.exp);
+    one = njs_diyfp((uint64_t) 1 << -Mp.exp, Mp.exp);
     p1 = (uint32_t) (Mp.significand >> -one.exp);
     p2 = Mp.significand & (one.significand - 1);
 
@@ -119,7 +119,7 @@ nxt_grisu2_gen(nxt_diyfp_t W, nxt_diyfp_t Mp, uint64_t delta, char *start,
     /* GCC 4.2 complains about uninitialized d. */
     d = 0;
 
-    kappa = nxt_dec_count(p1);
+    kappa = njs_dec_count(p1);
 
     while (kappa > 0) {
 
@@ -135,7 +135,7 @@ nxt_grisu2_gen(nxt_diyfp_t W, nxt_diyfp_t Mp, uint64_t delta, char *start,
             case  2: d = p1 /         10; p1 %=         10; break;
             case  1: d = p1;              p1 =           0; break;
             default:
-                nxt_unreachable();
+                njs_unreachable();
         }
 
         if (d != 0 || p != start) {
@@ -148,7 +148,7 @@ nxt_grisu2_gen(nxt_diyfp_t W, nxt_diyfp_t Mp, uint64_t delta, char *start,
 
         if (tmp <= delta) {
             *dec_exp += kappa;
-            nxt_grisu2_round(start, p - start, delta, tmp,
+            njs_grisu2_round(start, p - start, delta, tmp,
                              pow10[kappa] << -one.exp, wp_w.significand);
             return p - start;
         }
@@ -171,7 +171,7 @@ nxt_grisu2_gen(nxt_diyfp_t W, nxt_diyfp_t Mp, uint64_t delta, char *start,
         if (p2 < delta) {
             *dec_exp += kappa;
             tmp = (-kappa < 10) ? pow10[-kappa] : 0;
-            nxt_grisu2_round(start, p - start, delta, p2, one.significand,
+            njs_grisu2_round(start, p - start, delta, p2, one.significand,
                              wp_w.significand * tmp);
             break;
         }
@@ -181,32 +181,32 @@ nxt_grisu2_gen(nxt_diyfp_t W, nxt_diyfp_t Mp, uint64_t delta, char *start,
 }
 
 
-nxt_inline nxt_diyfp_t
-nxt_diyfp_normalize_boundary(nxt_diyfp_t v)
+njs_inline njs_diyfp_t
+njs_diyfp_normalize_boundary(njs_diyfp_t v)
 {
-    while ((v.significand & (NXT_DBL_HIDDEN_BIT << 1)) == 0) {
+    while ((v.significand & (NJS_DBL_HIDDEN_BIT << 1)) == 0) {
         v.significand <<= 1;
         v.exp--;
     }
 
-    return nxt_diyfp_shift_left(v, NXT_SIGNIFICAND_SHIFT - 2);
+    return njs_diyfp_shift_left(v, NJS_SIGNIFICAND_SHIFT - 2);
 }
 
 
-nxt_inline void
-nxt_diyfp_normalize_boundaries(nxt_diyfp_t v, nxt_diyfp_t* minus,
-    nxt_diyfp_t* plus)
+njs_inline void
+njs_diyfp_normalize_boundaries(njs_diyfp_t v, njs_diyfp_t* minus,
+    njs_diyfp_t* plus)
 {
-    nxt_diyfp_t  pl, mi;
+    njs_diyfp_t  pl, mi;
 
-    pl = nxt_diyfp_normalize_boundary(nxt_diyfp((v.significand << 1) + 1,
+    pl = njs_diyfp_normalize_boundary(njs_diyfp((v.significand << 1) + 1,
                                                 v.exp - 1));
 
-    if (v.significand == NXT_DBL_HIDDEN_BIT) {
-        mi = nxt_diyfp((v.significand << 2) - 1, v.exp - 2);
+    if (v.significand == NJS_DBL_HIDDEN_BIT) {
+        mi = njs_diyfp((v.significand << 2) - 1, v.exp - 2);
 
     } else {
-        mi = nxt_diyfp((v.significand << 1) - 1, v.exp - 1);
+        mi = njs_diyfp((v.significand << 1) - 1, v.exp - 1);
     }
 
     mi.significand <<= mi.exp - pl.exp;
@@ -217,31 +217,31 @@ nxt_diyfp_normalize_boundaries(nxt_diyfp_t v, nxt_diyfp_t* minus,
 }
 
 
-nxt_inline size_t
-nxt_grisu2(double value, char *start, int *dec_exp)
+njs_inline size_t
+njs_grisu2(double value, char *start, int *dec_exp)
 {
-    nxt_diyfp_t  v, w_m, w_p, c_mk, W, Wp, Wm;
+    njs_diyfp_t  v, w_m, w_p, c_mk, W, Wp, Wm;
 
-    v = nxt_d2diyfp(value);
+    v = njs_d2diyfp(value);
 
-    nxt_diyfp_normalize_boundaries(v, &w_m, &w_p);
+    njs_diyfp_normalize_boundaries(v, &w_m, &w_p);
 
-    c_mk = nxt_cached_power_bin(w_p.exp, dec_exp);
-    W = nxt_diyfp_mul(nxt_diyfp_normalize(v), c_mk);
+    c_mk = njs_cached_power_bin(w_p.exp, dec_exp);
+    W = njs_diyfp_mul(njs_diyfp_normalize(v), c_mk);
 
-    Wp = nxt_diyfp_mul(w_p, c_mk);
-    Wm = nxt_diyfp_mul(w_m, c_mk);
+    Wp = njs_diyfp_mul(w_p, c_mk);
+    Wm = njs_diyfp_mul(w_m, c_mk);
 
     Wm.significand++;
     Wp.significand--;
 
-   return nxt_grisu2_gen(W, Wp, Wp.significand - Wm.significand, start,
+   return njs_grisu2_gen(W, Wp, Wp.significand - Wm.significand, start,
                          dec_exp);
 }
 
 
-nxt_inline size_t
-nxt_write_exponent(int exp, char* start)
+njs_inline size_t
+njs_write_exponent(int exp, char* start)
 {
     char      *p;
     size_t    len;
@@ -259,14 +259,14 @@ nxt_write_exponent(int exp, char* start)
     }
 
     u32 = exp;
-    p = buf + nxt_length(buf);
+    p = buf + njs_length(buf);
 
     do {
         *--p = u32 % 10 + '0';
         u32 /= 10;
     } while (u32 != 0);
 
-    len = buf + nxt_length(buf) - p;
+    len = buf + njs_length(buf) - p;
 
     memcpy(start, p, len);
 
@@ -274,8 +274,8 @@ nxt_write_exponent(int exp, char* start)
 }
 
 
-nxt_inline size_t
-nxt_prettify(char *start, size_t len, int dec_exp)
+njs_inline size_t
+njs_prettify(char *start, size_t len, int dec_exp)
 {
     int     kk, offset, length;
     size_t  size;
@@ -290,7 +290,7 @@ nxt_prettify(char *start, size_t len, int dec_exp)
         /* 1234e7 -> 12340000000 */
 
         if (kk - length > 0) {
-            nxt_memset(&start[length], '0', kk - length);
+            njs_memset(&start[length], '0', kk - length);
         }
 
         return kk;
@@ -315,7 +315,7 @@ nxt_prettify(char *start, size_t len, int dec_exp)
         start[1] = '.';
 
         if (offset - 2 > 0) {
-            nxt_memset(&start[2], '0', offset - 2);
+            njs_memset(&start[2], '0', offset - 2);
         }
 
         return (length + offset);
@@ -326,7 +326,7 @@ nxt_prettify(char *start, size_t len, int dec_exp)
 
         start[1] = 'e';
 
-        size =  nxt_write_exponent(kk - 1, &start[2]);
+        size =  njs_write_exponent(kk - 1, &start[2]);
 
         return (size + 2);
 
@@ -338,14 +338,14 @@ nxt_prettify(char *start, size_t len, int dec_exp)
     start[1] = '.';
     start[length + 1] = 'e';
 
-    size = nxt_write_exponent(kk - 1, &start[length + 2]);
+    size = njs_write_exponent(kk - 1, &start[length + 2]);
 
     return (size + length + 2);
 }
 
 
 size_t
-nxt_dtoa(double value, char *start)
+njs_dtoa(double value, char *start)
 {
     int     dec_exp, minus;
     char    *p;
@@ -368,9 +368,9 @@ nxt_dtoa(double value, char *start)
         minus = 1;
     }
 
-    length = nxt_grisu2(value, p, &dec_exp);
+    length = njs_grisu2(value, p, &dec_exp);
 
-    length = nxt_prettify(p, length, dec_exp);
+    length = njs_prettify(p, length, dec_exp);
 
     return (minus + length);
 }
diff --git a/src/njs_dtoa.h b/src/njs_dtoa.h
new file mode 100644 (file)
index 0000000..69d2cde
--- /dev/null
@@ -0,0 +1,12 @@
+
+/*
+ * Copyright (C) Dmitry Volyntsev
+ * Copyright (C) Nginx, Inc.
+ */
+
+#ifndef _NJS_DTOA_H_INCLUDED_
+#define _NJS_DTOA_H_INCLUDED_
+
+NJS_EXPORT size_t njs_dtoa(double value, char* buffer);
+
+#endif /* _NJS_DTOA_H_INCLUDED_ */
similarity index 85%
rename from njs/njs_error.c
rename to src/njs_error.c
index 245105cca8afe23e7da68ad448f3f74fb6701263..e2fb16d1e00c5200eb7c3d3f5b662647219ae7b2 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 #include <math.h>
 
@@ -17,18 +17,18 @@ void
 njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_value_type_t type,
     u_char *start, size_t size)
 {
-    nxt_int_t     ret;
+    njs_int_t     ret;
     njs_value_t   string;
     njs_object_t  *error;
 
     ret = njs_string_new(vm, &string, start, size, size);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return;
     }
 
     error = njs_error_alloc(vm, type, NULL, &string);
 
-    if (nxt_fast_path(error != NULL)) {
+    if (njs_fast_path(error != NULL)) {
         njs_set_type_object(dst, error, type);
     }
 }
@@ -39,13 +39,13 @@ njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst, njs_value_type_t type,
     const char *fmt, ...)
 {
     va_list  args;
-    u_char   buf[NXT_MAX_ERROR_STR], *p;
+    u_char   buf[NJS_MAX_ERROR_STR], *p;
 
     p = buf;
 
     if (fmt != NULL) {
         va_start(args, fmt);
-        p = nxt_vsprintf(buf, buf + sizeof(buf), fmt, args);
+        p = njs_vsprintf(buf, buf + sizeof(buf), fmt, args);
         va_end(args);
     }
 
@@ -57,18 +57,18 @@ njs_object_t *
 njs_error_alloc(njs_vm_t *vm, njs_value_type_t type, const njs_value_t *name,
     const njs_value_t *message)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_object_t        *error;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    error = nxt_mp_alloc(vm->mem_pool, sizeof(njs_object_t));
-    if (nxt_slow_path(error == NULL)) {
+    error = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_t));
+    if (njs_slow_path(error == NULL)) {
         goto memory_error;
     }
 
-    nxt_lvlhsh_init(&error->hash);
-    nxt_lvlhsh_init(&error->shared_hash);
+    njs_lvlhsh_init(&error->hash);
+    njs_lvlhsh_init(&error->shared_hash);
     error->type = type;
     error->shared = 0;
     error->extensible = 1;
@@ -78,31 +78,31 @@ njs_error_alloc(njs_vm_t *vm, njs_value_type_t type, const njs_value_t *name,
     lhq.pool = vm->mem_pool;
 
     if (name != NULL) {
-        lhq.key = nxt_string_value("name");
+        lhq.key = njs_str_value("name");
         lhq.key_hash = NJS_NAME_HASH;
         lhq.proto = &njs_object_hash_proto;
 
         prop = njs_object_prop_alloc(vm, &njs_error_name_string, name, 1);
-        if (nxt_slow_path(prop == NULL)) {
+        if (njs_slow_path(prop == NULL)) {
             goto memory_error;
         }
 
         lhq.value = prop;
 
-        ret = nxt_lvlhsh_insert(&error->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&error->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
             return NULL;
         }
     }
 
     if (message!= NULL) {
-        lhq.key = nxt_string_value("message");
+        lhq.key = njs_str_value("message");
         lhq.key_hash = NJS_MESSAGE_HASH;
         lhq.proto = &njs_object_hash_proto;
 
         prop = njs_object_prop_alloc(vm, &njs_error_message_string, message, 1);
-        if (nxt_slow_path(prop == NULL)) {
+        if (njs_slow_path(prop == NULL)) {
             goto memory_error;
         }
 
@@ -110,8 +110,8 @@ njs_error_alloc(njs_vm_t *vm, njs_value_type_t type, const njs_value_t *name,
 
         lhq.value = prop;
 
-        ret = nxt_lvlhsh_insert(&error->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&error->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
             return NULL;
         }
@@ -128,7 +128,7 @@ memory_error:
 
 
 static njs_ret_t
-njs_error_create(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_error_create(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_value_type_t type)
 {
     njs_object_t       *error;
@@ -142,18 +142,18 @@ njs_error_create(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     error = njs_error_alloc(vm, type, NULL, value);
-    if (nxt_slow_path(error == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(error == NULL)) {
+        return NJS_ERROR;
     }
 
     njs_set_type_object(&vm->retval, error, type);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t
-njs_error_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_error_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return njs_error_create(vm, args, nargs, NJS_OBJECT_ERROR);
@@ -188,14 +188,14 @@ static const njs_object_prop_t  njs_error_constructor_properties[] =
 
 
 const njs_object_init_t  njs_error_constructor_init = {
-    nxt_string("Error"),
+    njs_str("Error"),
     njs_error_constructor_properties,
-    nxt_nitems(njs_error_constructor_properties),
+    njs_nitems(njs_error_constructor_properties),
 };
 
 
 njs_ret_t
-njs_eval_error_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_eval_error_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return njs_error_create(vm, args, nargs, NJS_OBJECT_EVAL_ERROR);
@@ -230,15 +230,15 @@ static const njs_object_prop_t  njs_eval_error_constructor_properties[] =
 
 
 const njs_object_init_t  njs_eval_error_constructor_init = {
-    nxt_string("EvalError"),
+    njs_str("EvalError"),
     njs_eval_error_constructor_properties,
-    nxt_nitems(njs_eval_error_constructor_properties),
+    njs_nitems(njs_eval_error_constructor_properties),
 };
 
 
 njs_ret_t
 njs_internal_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_error_create(vm, args, nargs, NJS_OBJECT_INTERNAL_ERROR);
 }
@@ -272,15 +272,15 @@ static const njs_object_prop_t  njs_internal_error_constructor_properties[] =
 
 
 const njs_object_init_t  njs_internal_error_constructor_init = {
-    nxt_string("InternalError"),
+    njs_str("InternalError"),
     njs_internal_error_constructor_properties,
-    nxt_nitems(njs_internal_error_constructor_properties),
+    njs_nitems(njs_internal_error_constructor_properties),
 };
 
 
 njs_ret_t
 njs_range_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_error_create(vm, args, nargs, NJS_OBJECT_RANGE_ERROR);
 }
@@ -314,15 +314,15 @@ static const njs_object_prop_t  njs_range_error_constructor_properties[] =
 
 
 const njs_object_init_t  njs_range_error_constructor_init = {
-    nxt_string("RangeError"),
+    njs_str("RangeError"),
     njs_range_error_constructor_properties,
-    nxt_nitems(njs_range_error_constructor_properties),
+    njs_nitems(njs_range_error_constructor_properties),
 };
 
 
 njs_ret_t
 njs_reference_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_error_create(vm, args, nargs, NJS_OBJECT_REF_ERROR);
 }
@@ -356,15 +356,15 @@ static const njs_object_prop_t  njs_reference_error_constructor_properties[] =
 
 
 const njs_object_init_t  njs_reference_error_constructor_init = {
-    nxt_string("ReferenceError"),
+    njs_str("ReferenceError"),
     njs_reference_error_constructor_properties,
-    nxt_nitems(njs_reference_error_constructor_properties),
+    njs_nitems(njs_reference_error_constructor_properties),
 };
 
 
 njs_ret_t
 njs_syntax_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_error_create(vm, args, nargs, NJS_OBJECT_SYNTAX_ERROR);
 }
@@ -398,15 +398,15 @@ static const njs_object_prop_t  njs_syntax_error_constructor_properties[] =
 
 
 const njs_object_init_t  njs_syntax_error_constructor_init = {
-    nxt_string("SyntaxError"),
+    njs_str("SyntaxError"),
     njs_syntax_error_constructor_properties,
-    nxt_nitems(njs_syntax_error_constructor_properties),
+    njs_nitems(njs_syntax_error_constructor_properties),
 };
 
 
 njs_ret_t
 njs_type_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_error_create(vm, args, nargs, NJS_OBJECT_TYPE_ERROR);
 }
@@ -440,15 +440,15 @@ static const njs_object_prop_t  njs_type_error_constructor_properties[] =
 
 
 const njs_object_init_t  njs_type_error_constructor_init = {
-    nxt_string("TypeError"),
+    njs_str("TypeError"),
     njs_type_error_constructor_properties,
-    nxt_nitems(njs_type_error_constructor_properties),
+    njs_nitems(njs_type_error_constructor_properties),
 };
 
 
 njs_ret_t
 njs_uri_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_error_create(vm, args, nargs, NJS_OBJECT_URI_ERROR);
 }
@@ -482,9 +482,9 @@ static const njs_object_prop_t  njs_uri_error_constructor_properties[] =
 
 
 const njs_object_init_t  njs_uri_error_constructor_init = {
-    nxt_string("URIError"),
+    njs_str("URIError"),
     njs_uri_error_constructor_properties,
-    nxt_nitems(njs_uri_error_constructor_properties),
+    njs_nitems(njs_uri_error_constructor_properties),
 };
 
 
@@ -497,8 +497,8 @@ njs_memory_error_set(njs_vm_t *vm, njs_value_t *value)
     prototypes = vm->prototypes;
     object = &vm->memory_error_object;
 
-    nxt_lvlhsh_init(&object->hash);
-    nxt_lvlhsh_init(&object->shared_hash);
+    njs_lvlhsh_init(&object->hash);
+    njs_lvlhsh_init(&object->shared_hash);
     object->__proto__ = &prototypes[NJS_PROTOTYPE_INTERNAL_ERROR].object;
     object->type = NJS_OBJECT_INTERNAL_ERROR;
     object->shared = 1;
@@ -522,11 +522,11 @@ njs_memory_error(njs_vm_t *vm)
 
 njs_ret_t
 njs_memory_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     njs_memory_error_set(vm, &vm->retval);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -551,7 +551,7 @@ njs_memory_error_prototype_create(njs_vm_t *vm, njs_value_t *value,
 
     *retval = *proto;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -583,29 +583,29 @@ static const njs_object_prop_t  njs_memory_error_constructor_properties[] =
 
 
 const njs_object_init_t  njs_memory_error_constructor_init = {
-    nxt_string("MemoryError"),
+    njs_str("MemoryError"),
     njs_memory_error_constructor_properties,
-    nxt_nitems(njs_memory_error_constructor_properties),
+    njs_nitems(njs_memory_error_constructor_properties),
 };
 
 
 static njs_ret_t
-njs_error_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_error_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     vm->retval = args[0];
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_error_prototype_to_string(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_error_prototype_to_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     if (nargs < 1 || !njs_is_object(&args[0])) {
         njs_type_error(vm, "\"this\" argument is not an object");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     return njs_error_to_string(vm, &vm->retval, &args[0]);
@@ -617,15 +617,15 @@ njs_error_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *error)
 {
     size_t              size;
     u_char              *p;
-    nxt_str_t           name, message;
+    njs_str_t           name, message;
     const njs_value_t   *name_value, *message_value;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     static const njs_value_t  default_name = njs_string("Error");
 
     lhq.key_hash = NJS_NAME_HASH;
-    lhq.key = nxt_string_value("name");
+    lhq.key = njs_str_value("name");
     lhq.proto = &njs_object_hash_proto;
 
     prop = njs_object_property(vm, njs_object(error), &lhq);
@@ -640,7 +640,7 @@ njs_error_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *error)
     njs_string_get(name_value, &name);
 
     lhq.key_hash = NJS_MESSAGE_HASH;
-    lhq.key = nxt_string_value("message");
+    lhq.key = njs_str_value("message");
 
     prop = njs_object_property(vm, njs_object(error), &lhq);
 
@@ -667,8 +667,8 @@ njs_error_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *error)
 
     p = njs_string_alloc(vm, retval, size, size);
 
-    if (nxt_fast_path(p != NULL)) {
-        p = nxt_cpymem(p, name.start, name.length);
+    if (njs_fast_path(p != NULL)) {
+        p = njs_cpymem(p, name.start, name.length);
         *p++ = ':';
         *p++ = ' ';
         memcpy(p, message.start, message.length);
@@ -727,9 +727,9 @@ static const njs_object_prop_t  njs_error_prototype_properties[] =
 
 
 const njs_object_init_t  njs_error_prototype_init = {
-    nxt_string("Error"),
+    njs_str("Error"),
     njs_error_prototype_properties,
-    nxt_nitems(njs_error_prototype_properties),
+    njs_nitems(njs_error_prototype_properties),
 };
 
 
@@ -754,15 +754,15 @@ static const njs_object_prop_t  njs_eval_error_prototype_properties[] =
 
 
 const njs_object_init_t  njs_eval_error_prototype_init = {
-    nxt_string("EvalError"),
+    njs_str("EvalError"),
     njs_eval_error_prototype_properties,
-    nxt_nitems(njs_eval_error_prototype_properties),
+    njs_nitems(njs_eval_error_prototype_properties),
 };
 
 
 static njs_ret_t
 njs_internal_error_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     if (nargs >= 1 && njs_is_object(&args[0])) {
 
@@ -801,9 +801,9 @@ static const njs_object_prop_t  njs_internal_error_prototype_properties[] =
 
 
 const njs_object_init_t  njs_internal_error_prototype_init = {
-    nxt_string("InternalError"),
+    njs_str("InternalError"),
     njs_internal_error_prototype_properties,
-    nxt_nitems(njs_internal_error_prototype_properties),
+    njs_nitems(njs_internal_error_prototype_properties),
 };
 
 
@@ -828,9 +828,9 @@ static const njs_object_prop_t  njs_range_error_prototype_properties[] =
 
 
 const njs_object_init_t  njs_range_error_prototype_init = {
-    nxt_string("RangeError"),
+    njs_str("RangeError"),
     njs_range_error_prototype_properties,
-    nxt_nitems(njs_range_error_prototype_properties),
+    njs_nitems(njs_range_error_prototype_properties),
 };
 
 
@@ -855,9 +855,9 @@ static const njs_object_prop_t  njs_reference_error_prototype_properties[] =
 
 
 const njs_object_init_t  njs_reference_error_prototype_init = {
-    nxt_string("ReferenceError"),
+    njs_str("ReferenceError"),
     njs_reference_error_prototype_properties,
-    nxt_nitems(njs_reference_error_prototype_properties),
+    njs_nitems(njs_reference_error_prototype_properties),
 };
 
 
@@ -882,9 +882,9 @@ static const njs_object_prop_t  njs_syntax_error_prototype_properties[] =
 
 
 const njs_object_init_t  njs_syntax_error_prototype_init = {
-    nxt_string("SyntaxError"),
+    njs_str("SyntaxError"),
     njs_syntax_error_prototype_properties,
-    nxt_nitems(njs_syntax_error_prototype_properties),
+    njs_nitems(njs_syntax_error_prototype_properties),
 };
 
 
@@ -909,9 +909,9 @@ static const njs_object_prop_t  njs_type_error_prototype_properties[] =
 
 
 const njs_object_init_t  njs_type_error_prototype_init = {
-    nxt_string("TypeError"),
+    njs_str("TypeError"),
     njs_type_error_prototype_properties,
-    nxt_nitems(njs_type_error_prototype_properties),
+    njs_nitems(njs_type_error_prototype_properties),
 };
 
 
@@ -936,7 +936,7 @@ static const njs_object_prop_t  njs_uri_error_prototype_properties[] =
 
 
 const njs_object_init_t  njs_uri_error_prototype_init = {
-    nxt_string("URIError"),
+    njs_str("URIError"),
     njs_uri_error_prototype_properties,
-    nxt_nitems(njs_uri_error_prototype_properties),
+    njs_nitems(njs_uri_error_prototype_properties),
 };
similarity index 89%
rename from njs/njs_error.h
rename to src/njs_error.h
index 05a8ad671dc8f19a4b626ecbfdd8f7ab53285914..34145f36b9c0714d72f2bbde95efd4c087f277b3 100644 (file)
@@ -34,7 +34,7 @@
 
 void njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_value_type_t type,
     u_char *start, size_t size);
-void nxt_noinline njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst,
+void njs_noinline njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst,
     njs_value_type_t type, const char *fmt, ...);
 
 void njs_memory_error(njs_vm_t *vm);
@@ -43,23 +43,23 @@ void njs_memory_error_set(njs_vm_t *vm, njs_value_t *value);
 njs_object_t *njs_error_alloc(njs_vm_t *vm, njs_value_type_t type,
     const njs_value_t *name, const njs_value_t *message);
 njs_ret_t njs_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_eval_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_internal_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_range_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_reference_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_syntax_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_type_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_uri_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_memory_error_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 njs_ret_t njs_error_to_string(njs_vm_t *vm, njs_value_t *retval,
     const njs_value_t *error);
similarity index 60%
rename from njs/njs_event.c
rename to src/njs_event.c
index 90f71ed9a3e2dfeb1adf88a447eb2e4b744d668c..a78c5099aa4925b1d8ade6a6eaeca4a5aa1b3e2a 100644 (file)
@@ -4,57 +4,57 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 
 
-static nxt_int_t njs_event_hash_test(nxt_lvlhsh_query_t *lhq, void *data);
+static njs_int_t njs_event_hash_test(njs_lvlhsh_query_t *lhq, void *data);
 
 
-const nxt_lvlhsh_proto_t  njs_event_hash_proto
-    nxt_aligned(64) =
+const njs_lvlhsh_proto_t  njs_event_hash_proto
+    njs_aligned(64) =
 {
-    NXT_LVLHSH_DEFAULT,
+    NJS_LVLHSH_DEFAULT,
     njs_event_hash_test,
     njs_lvlhsh_alloc,
     njs_lvlhsh_free,
 };
 
 
-static nxt_int_t
-njs_event_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+njs_event_hash_test(njs_lvlhsh_query_t *lhq, void *data)
 {
-    nxt_str_t    id;
+    njs_str_t    id;
     njs_event_t  *event;
 
     event = data;
 
     njs_string_get(&event->id, &id);
 
-    if (nxt_strstr_eq(&lhq->key, &id)) {
-        return NXT_OK;
+    if (njs_strstr_eq(&lhq->key, &id)) {
+        return NJS_OK;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
-nxt_int_t
+njs_int_t
 njs_add_event(njs_vm_t *vm, njs_event_t *event)
 {
-    nxt_int_t           ret;
-    nxt_lvlhsh_query_t  lhq;
+    njs_int_t           ret;
+    njs_lvlhsh_query_t  lhq;
 
     njs_uint32_to_string(&event->id, vm->event_id++);
 
     njs_string_get(&event->id, &lhq.key);
-    lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+    lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
     lhq.value = event;
     lhq.proto = &njs_event_hash_proto;
     lhq.pool = vm->mem_pool;
 
-    ret = nxt_lvlhsh_insert(&vm->events_hash, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&vm->events_hash, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_internal_error(vm, "Failed to add event with id: %s",
                            njs_string_short_start(&event->id));
 
@@ -69,9 +69,9 @@ njs_add_event(njs_vm_t *vm, njs_event_t *event)
 
 
 void
-njs_del_event(njs_vm_t *vm, njs_event_t *ev, nxt_uint_t action)
+njs_del_event(njs_vm_t *vm, njs_event_t *ev, njs_uint_t action)
 {
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     if (action & NJS_EVENT_RELEASE) {
         if (ev->destructor != NULL && ev->host_event != NULL) {
@@ -83,15 +83,15 @@ njs_del_event(njs_vm_t *vm, njs_event_t *ev, nxt_uint_t action)
 
     if (action & NJS_EVENT_DELETE) {
         njs_string_get(&ev->id, &lhq.key);
-        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
         lhq.proto = &njs_event_hash_proto;
         lhq.pool = vm->mem_pool;
 
         if (ev->posted) {
             ev->posted = 0;
-            nxt_queue_remove(&ev->link);
+            njs_queue_remove(&ev->link);
         }
 
-        (void) nxt_lvlhsh_delete(&vm->events_hash, &lhq);
+        (void) njs_lvlhsh_delete(&vm->events_hash, &lhq);
     }
 }
similarity index 60%
rename from njs/njs_event.h
rename to src/njs_event.h
index 405c607e16413ea696fb6dbceaa7240c08307da8..64baad8654103bde17164ad8253ab25c4d5d39a2 100644 (file)
 #define NJS_EVENT_DELETE       2
 
 
-#define njs_waiting_events(vm) (!nxt_lvlhsh_is_empty(&(vm)->events_hash))
+#define njs_waiting_events(vm) (!njs_lvlhsh_is_empty(&(vm)->events_hash))
 
-#define njs_posted_events(vm) (!nxt_queue_is_empty(&(vm)->posted_events))
+#define njs_posted_events(vm) (!njs_queue_is_empty(&(vm)->posted_events))
 
 
 typedef struct {
     njs_function_t          *function;
     njs_value_t             *args;
-    nxt_uint_t              nargs;
+    njs_uint_t              nargs;
     njs_host_event_t        host_event;
     njs_event_destructor_t  destructor;
 
     njs_value_t             id;
-    nxt_queue_link_t        link;
+    njs_queue_link_t        link;
 
     unsigned                posted:1;
     unsigned                once:1;
 } njs_event_t;
 
 
-nxt_int_t njs_add_event(njs_vm_t *vm, njs_event_t *event);
-void njs_del_event(njs_vm_t *vm, njs_event_t *event, nxt_uint_t action);
+njs_int_t njs_add_event(njs_vm_t *vm, njs_event_t *event);
+void njs_del_event(njs_vm_t *vm, njs_event_t *event, njs_uint_t action);
 
 
-extern const nxt_lvlhsh_proto_t  njs_event_hash_proto;
+extern const njs_lvlhsh_proto_t  njs_event_hash_proto;
 
 
 #endif /* _NJS_EVENT_H_INCLUDED_ */
similarity index 63%
rename from njs/njs_extern.c
rename to src/njs_extern.c
index 6f33fddbc3461725ec6df5615fe6d1de28dfde62..94ed0ff6bd1f1a06ea54caee586a188803f02a99 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 
 
@@ -12,54 +12,54 @@ typedef struct njs_extern_part_s  njs_extern_part_t;
 
 struct njs_extern_part_s {
     njs_extern_part_t  *next;
-    nxt_str_t          str;
+    njs_str_t          str;
 };
 
 
-static nxt_int_t
-njs_extern_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+njs_extern_hash_test(njs_lvlhsh_query_t *lhq, void *data)
 {
     njs_extern_t  *ext;
 
     ext = (njs_extern_t *) data;
 
-    if (nxt_strstr_eq(&lhq->key, &ext->name)) {
-        return NXT_OK;
+    if (njs_strstr_eq(&lhq->key, &ext->name)) {
+        return NJS_OK;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
-static nxt_int_t
-njs_extern_value_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+njs_extern_value_hash_test(njs_lvlhsh_query_t *lhq, void *data)
 {
     njs_extern_value_t  *ev;
 
     ev = (njs_extern_value_t *) data;
 
-    if (nxt_strstr_eq(&lhq->key, &ev->name)) {
-        return NXT_OK;
+    if (njs_strstr_eq(&lhq->key, &ev->name)) {
+        return NJS_OK;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
-const nxt_lvlhsh_proto_t  njs_extern_hash_proto
-    nxt_aligned(64) =
+const njs_lvlhsh_proto_t  njs_extern_hash_proto
+    njs_aligned(64) =
 {
-    NXT_LVLHSH_DEFAULT,
+    NJS_LVLHSH_DEFAULT,
     njs_extern_hash_test,
     njs_lvlhsh_alloc,
     njs_lvlhsh_free,
 };
 
 
-const nxt_lvlhsh_proto_t  njs_extern_value_hash_proto
-    nxt_aligned(64) =
+const njs_lvlhsh_proto_t  njs_extern_value_hash_proto
+    njs_aligned(64) =
 {
-    NXT_LVLHSH_DEFAULT,
+    NJS_LVLHSH_DEFAULT,
     njs_extern_value_hash_test,
     njs_lvlhsh_alloc,
     njs_lvlhsh_free,
@@ -67,23 +67,23 @@ const nxt_lvlhsh_proto_t  njs_extern_value_hash_proto
 
 
 static njs_extern_t *
-njs_vm_external_add(njs_vm_t *vm, nxt_lvlhsh_t *hash, njs_external_t *external,
-    nxt_uint_t n)
+njs_vm_external_add(njs_vm_t *vm, njs_lvlhsh_t *hash, njs_external_t *external,
+    njs_uint_t n)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_extern_t        *ext, *child;
     njs_function_t      *function;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     do {
-        ext = nxt_mp_alloc(vm->mem_pool, sizeof(njs_extern_t));
-        if (nxt_slow_path(ext == NULL)) {
+        ext = njs_mp_alloc(vm->mem_pool, sizeof(njs_extern_t));
+        if (njs_slow_path(ext == NULL)) {
             goto memory_error;
         }
 
         ext->name = external->name;
 
-        nxt_lvlhsh_init(&ext->hash);
+        njs_lvlhsh_init(&ext->hash);
 
         ext->type = external->type;
         ext->get = external->get;
@@ -94,14 +94,14 @@ njs_vm_external_add(njs_vm_t *vm, nxt_lvlhsh_t *hash, njs_external_t *external,
         ext->data = external->data;
 
         if (external->method != NULL) {
-            function = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_function_t));
-            if (nxt_slow_path(function == NULL)) {
+            function = njs_mp_zalloc(vm->mem_pool, sizeof(njs_function_t));
+            if (njs_slow_path(function == NULL)) {
                 goto memory_error;
             }
 
             /*
-             * nxt_mp_zalloc() does also:
-             *   nxt_lvlhsh_init(&function->object.hash);
+             * njs_mp_zalloc() does also:
+             *   njs_lvlhsh_init(&function->object.hash);
              *   function->object.__proto__ = NULL;
              *   function->ctor = 0;
              */
@@ -125,13 +125,13 @@ njs_vm_external_add(njs_vm_t *vm, nxt_lvlhsh_t *hash, njs_external_t *external,
         if (external->properties != NULL) {
             child = njs_vm_external_add(vm, &ext->hash, external->properties,
                                         external->nproperties);
-            if (nxt_slow_path(child == NULL)) {
+            if (njs_slow_path(child == NULL)) {
                 goto memory_error;
             }
         }
 
         if (hash != NULL) {
-            lhq.key_hash = nxt_djb_hash(external->name.start,
+            lhq.key_hash = njs_djb_hash(external->name.start,
                                         external->name.length);
             lhq.key = ext->name;
             lhq.replace = 0;
@@ -139,8 +139,8 @@ njs_vm_external_add(njs_vm_t *vm, nxt_lvlhsh_t *hash, njs_external_t *external,
             lhq.pool = vm->mem_pool;
             lhq.proto = &njs_extern_hash_proto;
 
-            ret = nxt_lvlhsh_insert(hash, &lhq);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            ret = njs_lvlhsh_insert(hash, &lhq);
+            if (njs_slow_path(ret != NJS_OK)) {
                 njs_internal_error(vm, "lvlhsh insert failed");
                 return NULL;
             }
@@ -168,20 +168,20 @@ njs_vm_external_prototype(njs_vm_t *vm, njs_external_t *external)
 }
 
 
-nxt_int_t
+njs_int_t
 njs_vm_external_create(njs_vm_t *vm, njs_value_t *ext_val,
     const njs_extern_t *proto, njs_external_ptr_t object)
 {
     void  *obj;
 
-    if (nxt_slow_path(proto == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(proto == NULL)) {
+        return NJS_ERROR;
     }
 
-    obj = nxt_array_add(vm->external_objects, &njs_array_mem_proto,
-                        vm->mem_pool);
-    if (nxt_slow_path(obj == NULL)) {
-        return NXT_ERROR;
+    obj = njs_arr_add(vm->external_objects, &njs_array_mem_proto,
+                      vm->mem_pool);
+    if (njs_slow_path(obj == NULL)) {
+        return NJS_ERROR;
     }
 
     memcpy(obj, &object, sizeof(void *));
@@ -191,53 +191,53 @@ njs_vm_external_create(njs_vm_t *vm, njs_value_t *ext_val,
     ext_val->external.proto = proto;
     ext_val->external.index = vm->external_objects->items - 1;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-nxt_int_t
-njs_vm_external_bind(njs_vm_t *vm, const nxt_str_t *var_name,
+njs_int_t
+njs_vm_external_bind(njs_vm_t *vm, const njs_str_t *var_name,
     const njs_value_t *value)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_extern_value_t  *ev;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    if (nxt_slow_path(!njs_is_external(value))) {
-        return NXT_ERROR;
+    if (njs_slow_path(!njs_is_external(value))) {
+        return NJS_ERROR;
     }
 
-    ev = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
+    ev = njs_mp_align(vm->mem_pool, sizeof(njs_value_t),
                       sizeof(njs_extern_value_t));
-    if (nxt_slow_path(ev == NULL)) {
+    if (njs_slow_path(ev == NULL)) {
         njs_memory_error(vm);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     ev->value = *value;
     ev->name = *var_name;
 
     lhq.key = *var_name;
-    lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+    lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
     lhq.proto = &njs_extern_value_hash_proto;
     lhq.value = ev;
     lhq.replace = 0;
     lhq.pool = vm->mem_pool;
 
-    ret = nxt_lvlhsh_insert(&vm->externals_hash, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&vm->externals_hash, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_internal_error(vm, "lvlhsh insert failed");
         return ret;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_external_ptr_t
 njs_vm_external(njs_vm_t *vm, const njs_value_t *value)
 {
-    if (nxt_fast_path(njs_is_external(value))) {
+    if (njs_fast_path(njs_is_external(value))) {
         return njs_extern_object(vm, value);
     }
 
@@ -253,18 +253,18 @@ njs_extern_keys_array(njs_vm_t *vm, const njs_extern_t *external)
     uint32_t            n, keys_length;
     njs_ret_t           ret;
     njs_array_t         *keys;
-    const nxt_lvlhsh_t  *hash;
-    nxt_lvlhsh_each_t   lhe;
+    const njs_lvlhsh_t  *hash;
+    njs_lvlhsh_each_t   lhe;
     const njs_extern_t  *ext;
 
     keys_length = 0;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_extern_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_extern_hash_proto);
 
     hash = &external->hash;
 
     for ( ;; ) {
-        ext = nxt_lvlhsh_each(hash, &lhe);
+        ext = njs_lvlhsh_each(hash, &lhe);
 
         if (ext == NULL) {
             break;
@@ -274,16 +274,16 @@ njs_extern_keys_array(njs_vm_t *vm, const njs_extern_t *external)
     }
 
     keys = njs_array_alloc(vm, keys_length, NJS_ARRAY_SPARE);
-    if (nxt_slow_path(keys == NULL)) {
+    if (njs_slow_path(keys == NULL)) {
         return NULL;
     }
 
     n = 0;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_extern_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_extern_hash_proto);
 
     for ( ;; ) {
-        ext = nxt_lvlhsh_each(hash, &lhe);
+        ext = njs_lvlhsh_each(hash, &lhe);
 
         if (ext == NULL) {
             break;
@@ -292,7 +292,7 @@ njs_extern_keys_array(njs_vm_t *vm, const njs_extern_t *external)
         ret = njs_string_new(vm, &keys->start[n++], ext->name.start,
                              ext->name.length, 0);
 
-        if (ret != NXT_OK) {
+        if (ret != NJS_OK) {
             return NULL;
         }
     }
@@ -302,16 +302,16 @@ njs_extern_keys_array(njs_vm_t *vm, const njs_extern_t *external)
 
 
 njs_value_t *
-njs_external_lookup(njs_vm_t *vm, nxt_str_t *name, uint32_t hash)
+njs_external_lookup(njs_vm_t *vm, njs_str_t *name, uint32_t hash)
 {
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
     njs_extern_value_t  *ev;
 
     lhq.key_hash = hash;
     lhq.key = *name;
     lhq.proto = &njs_extern_value_hash_proto;
 
-    if (nxt_lvlhsh_find(&vm->externals_hash, &lhq) == NXT_OK) {
+    if (njs_lvlhsh_find(&vm->externals_hash, &lhq) == NJS_OK) {
         ev = (njs_extern_value_t *) lhq.value;
         return &ev->value;
     }
@@ -320,23 +320,23 @@ njs_external_lookup(njs_vm_t *vm, nxt_str_t *name, uint32_t hash)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_external_match(njs_vm_t *vm, njs_function_native_t func, njs_extern_t *ext,
-    nxt_str_t *name, njs_extern_part_t *head, njs_extern_part_t *ppart)
+    njs_str_t *name, njs_extern_part_t *head, njs_extern_part_t *ppart)
 {
     u_char             *buf, *p;
     size_t             len;
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_extern_t       *prop;
     njs_extern_part_t  part, *pr;
-    nxt_lvlhsh_each_t  lhe;
+    njs_lvlhsh_each_t  lhe;
 
     ppart->next = &part;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_extern_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_extern_hash_proto);
 
     for ( ;; ) {
-        prop = nxt_lvlhsh_each(&ext->hash, &lhe);
+        prop = njs_lvlhsh_each(&ext->hash, &lhe);
         if (prop == NULL) {
             break;
         }
@@ -349,52 +349,52 @@ njs_external_match(njs_vm_t *vm, njs_function_native_t func, njs_extern_t *ext,
         }
 
         ret = njs_external_match(vm, func, prop, name, head, &part);
-        if (ret != NXT_DECLINED) {
+        if (ret != NJS_DECLINED) {
             return ret;
         }
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 
 found:
 
     len = 0;
 
     for (pr = head; pr != NULL; pr = pr->next) {
-        len += pr->str.length + nxt_length(".");
+        len += pr->str.length + njs_length(".");
     }
 
-    buf = nxt_mp_zalloc(vm->mem_pool, len);
+    buf = njs_mp_zalloc(vm->mem_pool, len);
     if (buf == NULL) {
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     p = buf;
 
     for (pr = head; pr != NULL; pr = pr->next) {
-        p = nxt_sprintf(p, buf + len, "%V.", &pr->str);
+        p = njs_sprintf(p, buf + len, "%V.", &pr->str);
     }
 
     name->start = (u_char *) buf;
     name->length = len - 1;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-nxt_int_t
+njs_int_t
 njs_external_match_native_function(njs_vm_t *vm, njs_function_native_t func,
-    nxt_str_t *name)
+    njs_str_t *name)
 {
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_extern_t       *ext;
     njs_extern_part_t  part;
-    nxt_lvlhsh_each_t  lhe;
+    njs_lvlhsh_each_t  lhe;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_extern_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_extern_hash_proto);
 
     for ( ;; ) {
-        ext = nxt_lvlhsh_each(&vm->external_prototypes_hash, &lhe);
+        ext = njs_lvlhsh_each(&vm->external_prototypes_hash, &lhe);
         if (ext == NULL) {
             break;
         }
@@ -403,10 +403,10 @@ njs_external_match_native_function(njs_vm_t *vm, njs_function_native_t func,
         part.str = ext->name;
 
         ret = njs_external_match(vm, func, ext, name, &part, &part);
-        if (ret != NXT_DECLINED) {
+        if (ret != NJS_DECLINED) {
             return ret;
         }
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
similarity index 62%
rename from njs/njs_extern.h
rename to src/njs_extern.h
index 0e00fb4da219b58c4b47116c4effd7794fe0e3f9..c11557b3d0e14ceb04b6afe9730bdf87238b0f4c 100644 (file)
@@ -9,18 +9,18 @@
 
 
 #define njs_extern_object(vm, ext)                                          \
-    (*(void **) nxt_array_item((vm)->external_objects, (ext)->external.index))
+    (*(void **) njs_arr_item((vm)->external_objects, (ext)->external.index))
 
 #define njs_extern_index(vm, idx)                                          \
-    (*(void **) nxt_array_item((vm)->external_objects, idx))
+    (*(void **) njs_arr_item((vm)->external_objects, idx))
 
 
 struct njs_extern_s {
     /* A hash of inclusive njs_extern_t. */
-    nxt_lvlhsh_t                 hash;
+    njs_lvlhsh_t                 hash;
 
     uintptr_t                    type;
-    nxt_str_t                    name;
+    njs_str_t                    name;
 
     njs_extern_get_t             get;
     njs_extern_set_t             set;
@@ -37,18 +37,18 @@ struct njs_extern_s {
 
 typedef struct {
     njs_value_t             value;
-    nxt_str_t               name;
+    njs_str_t               name;
 } njs_extern_value_t;
 
 
 njs_array_t *njs_extern_keys_array(njs_vm_t *vm, const njs_extern_t *external);
-njs_value_t *njs_external_lookup(njs_vm_t *vm, nxt_str_t *name, uint32_t hash);
-nxt_int_t njs_external_match_native_function(njs_vm_t *vm,
-    njs_function_native_t func, nxt_str_t *name);
+njs_value_t *njs_external_lookup(njs_vm_t *vm, njs_str_t *name, uint32_t hash);
+njs_int_t njs_external_match_native_function(njs_vm_t *vm,
+    njs_function_native_t func, njs_str_t *name);
 
 
-extern const nxt_lvlhsh_proto_t  njs_extern_hash_proto;
-extern const nxt_lvlhsh_proto_t  njs_extern_value_hash_proto;
+extern const njs_lvlhsh_proto_t  njs_extern_hash_proto;
+extern const njs_lvlhsh_proto_t  njs_extern_value_hash_proto;
 
 
 #endif /* _NJS_EXTERN_H_INCLUDED_ */
similarity index 76%
rename from nxt/nxt_file.c
rename to src/njs_file.c
index 40edbcc92f30ec0909b7b264a71085cda6ea6281..e71adb171cfbfae0a14a11206c23810c50153d33 100644 (file)
@@ -4,17 +4,17 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_string.h>
-#include <nxt_file.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_str.h>
+#include <njs_file.h>
 
 #include <string.h>
 
 
 void
-nxt_file_basename(const nxt_str_t *path, nxt_str_t *name)
+njs_file_basename(const njs_str_t *path, njs_str_t *name)
 {
     const u_char  *p, *end;
 
@@ -33,7 +33,7 @@ nxt_file_basename(const nxt_str_t *path, nxt_str_t *name)
 
 
 void
-nxt_file_dirname(const nxt_str_t *path, nxt_str_t *name)
+njs_file_dirname(const njs_str_t *path, njs_str_t *name)
 {
     const u_char  *p, *end;
 
@@ -70,5 +70,5 @@ nxt_file_dirname(const nxt_str_t *path, nxt_str_t *name)
 
 current_dir:
 
-    *name = nxt_string_value(".");
+    *name = njs_str_value(".");
 }
diff --git a/src/njs_file.h b/src/njs_file.h
new file mode 100644 (file)
index 0000000..86adfb2
--- /dev/null
@@ -0,0 +1,15 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_FILE_H_INCLUDED_
+#define _NJS_FILE_H_INCLUDED_
+
+
+void njs_file_basename(const njs_str_t *path, njs_str_t *name);
+void njs_file_dirname(const njs_str_t *path, njs_str_t *name);
+
+
+#endif /* _NJS_FILE_H_INCLUDED_ */
similarity index 76%
rename from njs/njs_fs.c
rename to src/njs_fs.c
index be570e21898246b1724a05f8b672a41520744cf7..269f14ad69b60222061d8bb9a03d96aa465cb588 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_fs.h>
 #include <string.h>
 #include <fcntl.h>
 
 
 typedef struct {
-    nxt_str_t               name;
+    njs_str_t               name;
     int                     value;
 } njs_fs_entry_t;
 
 
 static njs_ret_t njs_fs_read_file(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_fs_append_file(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_fs_write_file(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_fs_append_file_sync(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_fs_write_file_sync(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, int default_flags);
+    njs_uint_t nargs, int default_flags);
 static njs_ret_t njs_fs_write_file_sync_internal(njs_vm_t *vm,
-    njs_value_t *args, nxt_uint_t nargs, int default_flags);
+    njs_value_t *args, njs_uint_t nargs, int default_flags);
 
 static njs_ret_t njs_fs_error(njs_vm_t *vm, const char *syscall,
     const char *description, njs_value_t *path, int errn, njs_value_t *retval);
-static int njs_fs_flags(nxt_str_t *value);
+static int njs_fs_flags(njs_str_t *value);
 static mode_t njs_fs_mode(njs_value_t *value);
 
 
@@ -47,49 +47,49 @@ static const njs_value_t  njs_fs_syscall_string = njs_string("syscall");
 
 
 static njs_fs_entry_t njs_flags_table[] = {
-    { nxt_string("r"),   O_RDONLY },
-    { nxt_string("r+"),  O_RDWR },
-    { nxt_string("w"),   O_TRUNC  | O_CREAT  | O_WRONLY },
-    { nxt_string("w+"),  O_TRUNC  | O_CREAT  | O_RDWR },
-    { nxt_string("a"),   O_APPEND | O_CREAT  | O_WRONLY },
-    { nxt_string("a+"),  O_APPEND | O_CREAT  | O_RDWR },
-    { nxt_string("rs"),  O_SYNC   | O_RDONLY },
-    { nxt_string("sr"),  O_SYNC   | O_RDONLY },
-    { nxt_string("wx"),  O_TRUNC  | O_CREAT  | O_EXCL | O_WRONLY },
-    { nxt_string("xw"),  O_TRUNC  | O_CREAT  | O_EXCL | O_WRONLY },
-    { nxt_string("ax"),  O_APPEND | O_CREAT  | O_EXCL | O_WRONLY },
-    { nxt_string("xa"),  O_APPEND | O_CREAT  | O_EXCL | O_WRONLY },
-    { nxt_string("rs+"), O_SYNC   | O_RDWR },
-    { nxt_string("sr+"), O_SYNC   | O_RDWR },
-    { nxt_string("wx+"), O_TRUNC  | O_CREAT  | O_EXCL | O_RDWR },
-    { nxt_string("xw+"), O_TRUNC  | O_CREAT  | O_EXCL | O_RDWR },
-    { nxt_string("ax+"), O_APPEND | O_CREAT  | O_EXCL | O_RDWR },
-    { nxt_string("xa+"), O_APPEND | O_CREAT  | O_EXCL | O_RDWR },
-    { nxt_null_string, 0 }
+    { njs_str("r"),   O_RDONLY },
+    { njs_str("r+"),  O_RDWR },
+    { njs_str("w"),   O_TRUNC  | O_CREAT  | O_WRONLY },
+    { njs_str("w+"),  O_TRUNC  | O_CREAT  | O_RDWR },
+    { njs_str("a"),   O_APPEND | O_CREAT  | O_WRONLY },
+    { njs_str("a+"),  O_APPEND | O_CREAT  | O_RDWR },
+    { njs_str("rs"),  O_SYNC   | O_RDONLY },
+    { njs_str("sr"),  O_SYNC   | O_RDONLY },
+    { njs_str("wx"),  O_TRUNC  | O_CREAT  | O_EXCL | O_WRONLY },
+    { njs_str("xw"),  O_TRUNC  | O_CREAT  | O_EXCL | O_WRONLY },
+    { njs_str("ax"),  O_APPEND | O_CREAT  | O_EXCL | O_WRONLY },
+    { njs_str("xa"),  O_APPEND | O_CREAT  | O_EXCL | O_WRONLY },
+    { njs_str("rs+"), O_SYNC   | O_RDWR },
+    { njs_str("sr+"), O_SYNC   | O_RDWR },
+    { njs_str("wx+"), O_TRUNC  | O_CREAT  | O_EXCL | O_RDWR },
+    { njs_str("xw+"), O_TRUNC  | O_CREAT  | O_EXCL | O_RDWR },
+    { njs_str("ax+"), O_APPEND | O_CREAT  | O_EXCL | O_RDWR },
+    { njs_str("xa+"), O_APPEND | O_CREAT  | O_EXCL | O_RDWR },
+    { njs_null_str, 0 }
 };
 
 
 static njs_ret_t
-njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     int                 fd, errn, flags;
     u_char              *p, *start, *end;
     ssize_t             n, length;
-    nxt_str_t           flag, encoding;
+    njs_str_t           flag, encoding;
     njs_ret_t           ret;
     const char          *path, *syscall, *description;
     struct stat         sb;
     njs_value_t         *callback, arguments[3];
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    if (nxt_slow_path(nargs < 3)) {
+    if (njs_slow_path(nargs < 3)) {
         njs_type_error(vm, "too few arguments");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_string(&args[1]))) {
+    if (njs_slow_path(!njs_is_string(&args[1]))) {
         njs_type_error(vm, "path must be a string");
         return NJS_ERROR;
     }
@@ -104,21 +104,21 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         } else if (njs_is_object(&args[2])) {
             lhq.key_hash = NJS_FLAG_HASH;
-            lhq.key = nxt_string_value("flag");
+            lhq.key = njs_str_value("flag");
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&args[2]), &lhq);
-            if (ret == NXT_OK) {
+            ret = njs_lvlhsh_find(njs_object_hash(&args[2]), &lhq);
+            if (ret == NJS_OK) {
                 prop = lhq.value;
                 njs_string_get(&prop->value, &flag);
             }
 
             lhq.key_hash = NJS_ENCODING_HASH;
-            lhq.key = nxt_string_value("encoding");
+            lhq.key = njs_str_value("encoding");
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&args[2]), &lhq);
-            if (ret == NXT_OK) {
+            ret = njs_lvlhsh_find(njs_object_hash(&args[2]), &lhq);
+            if (ret == NJS_OK) {
                 prop = lhq.value;
                 njs_string_get(&prop->value, &encoding);
             }
@@ -129,7 +129,7 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             return NJS_ERROR;
         }
 
-        if (nxt_slow_path(nargs < 4 || !njs_is_function(&args[3]))) {
+        if (njs_slow_path(nargs < 4 || !njs_is_function(&args[3]))) {
             njs_type_error(vm, "callback must be a function");
             return NJS_ERROR;
         }
@@ -137,7 +137,7 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         callback = &args[3];
 
     } else {
-        if (nxt_slow_path(!njs_is_function(&args[2]))) {
+        if (njs_slow_path(!njs_is_function(&args[2]))) {
             njs_type_error(vm, "callback must be a function");
             return NJS_ERROR;
         }
@@ -146,17 +146,17 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     if (flag.start == NULL) {
-        flag = nxt_string_value("r");
+        flag = njs_str_value("r");
     }
 
     flags = njs_fs_flags(&flag);
-    if (nxt_slow_path(flags == -1)) {
+    if (njs_slow_path(flags == -1)) {
         njs_type_error(vm, "Unknown file open flags: \"%V\"", &flag);
         return NJS_ERROR;
     }
 
     path = (char *) njs_string_to_c_string(vm, &args[1]);
-    if (nxt_slow_path(path == NULL)) {
+    if (njs_slow_path(path == NULL)) {
         return NJS_ERROR;
     }
 
@@ -174,7 +174,7 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     syscall = NULL;
 
     fd = open(path, flags);
-    if (nxt_slow_path(fd < 0)) {
+    if (njs_slow_path(fd < 0)) {
         errn = errno;
         description = strerror(errno);
         syscall = "open";
@@ -182,14 +182,14 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     ret = fstat(fd, &sb);
-    if (nxt_slow_path(ret == -1)) {
+    if (njs_slow_path(ret == -1)) {
         errn = errno;
         description = strerror(errno);
         syscall = "stat";
         goto done;
     }
 
-    if (nxt_slow_path(!S_ISREG(sb.st_mode))) {
+    if (njs_slow_path(!S_ISREG(sb.st_mode))) {
         errn = 0;
         description = "File is not regular";
         syscall = "stat";
@@ -214,7 +214,7 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     start = njs_string_alloc(vm, &arguments[2], sb.st_size, length);
-    if (nxt_slow_path(start == NULL)) {
+    if (njs_slow_path(start == NULL)) {
         goto fail;
     }
 
@@ -223,7 +223,7 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     while (p < end) {
         n = read(fd, p, end - p);
-        if (nxt_slow_path(n == -1)) {
+        if (njs_slow_path(n == -1)) {
             if (errno == EINTR) {
                 continue;
             }
@@ -238,7 +238,7 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     if (encoding.length != 0) {
-        length = nxt_utf8_length(start, sb.st_size);
+        length = njs_utf8_length(start, sb.st_size);
 
         if (length >= 0) {
             njs_string_length_set(&arguments[2], length);
@@ -261,7 +261,7 @@ done:
         ret = njs_fs_error(vm, syscall, description, &args[1], errn,
                            &arguments[1]);
 
-        if (nxt_slow_path(ret != NJS_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
 
@@ -276,13 +276,13 @@ done:
     ret = njs_function_apply(vm, njs_function(callback), arguments, 3,
                              &vm->retval);
 
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     vm->retval = njs_value_undefined;
 
-    return NXT_OK;
+    return NJS_OK;
 
 fail:
 
@@ -295,25 +295,25 @@ fail:
 
 
 static njs_ret_t
-njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     int                 fd, errn, flags;
     u_char              *p, *start, *end;
     ssize_t             n, length;
-    nxt_str_t           flag, encoding;
+    njs_str_t           flag, encoding;
     njs_ret_t           ret;
     const char          *path, *syscall, *description;
     struct stat         sb;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    if (nxt_slow_path(nargs < 2)) {
+    if (njs_slow_path(nargs < 2)) {
         njs_type_error(vm, "too few arguments");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_string(&args[1]))) {
+    if (njs_slow_path(!njs_is_string(&args[1]))) {
         njs_type_error(vm, "path must be a string");
         return NJS_ERROR;
     }
@@ -328,21 +328,21 @@ njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         } else if (njs_is_object(&args[2])) {
             lhq.key_hash = NJS_FLAG_HASH;
-            lhq.key = nxt_string_value("flag");
+            lhq.key = njs_str_value("flag");
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&args[2]), &lhq);
-            if (ret == NXT_OK) {
+            ret = njs_lvlhsh_find(njs_object_hash(&args[2]), &lhq);
+            if (ret == NJS_OK) {
                 prop = lhq.value;
                 njs_string_get(&prop->value, &flag);
             }
 
             lhq.key_hash = NJS_ENCODING_HASH;
-            lhq.key = nxt_string_value("encoding");
+            lhq.key = njs_str_value("encoding");
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&args[2]), &lhq);
-            if (ret == NXT_OK) {
+            ret = njs_lvlhsh_find(njs_object_hash(&args[2]), &lhq);
+            if (ret == NJS_OK) {
                 prop = lhq.value;
                 njs_string_get(&prop->value, &encoding);
             }
@@ -355,17 +355,17 @@ njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     if (flag.start == NULL) {
-        flag = nxt_string_value("r");
+        flag = njs_str_value("r");
     }
 
     flags = njs_fs_flags(&flag);
-    if (nxt_slow_path(flags == -1)) {
+    if (njs_slow_path(flags == -1)) {
         njs_type_error(vm, "Unknown file open flags: \"%V\"", &flag);
         return NJS_ERROR;
     }
 
     path = (char *) njs_string_to_c_string(vm, &args[1]);
-    if (nxt_slow_path(path == NULL)) {
+    if (njs_slow_path(path == NULL)) {
         return NJS_ERROR;
     }
 
@@ -383,7 +383,7 @@ njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     syscall = NULL;
 
     fd = open(path, flags);
-    if (nxt_slow_path(fd < 0)) {
+    if (njs_slow_path(fd < 0)) {
         errn = errno;
         description = strerror(errno);
         syscall = "open";
@@ -391,14 +391,14 @@ njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     ret = fstat(fd, &sb);
-    if (nxt_slow_path(ret == -1)) {
+    if (njs_slow_path(ret == -1)) {
         errn = errno;
         description = strerror(errno);
         syscall = "stat";
         goto done;
     }
 
-    if (nxt_slow_path(!S_ISREG(sb.st_mode))) {
+    if (njs_slow_path(!S_ISREG(sb.st_mode))) {
         errn = 0;
         description = "File is not regular";
         syscall = "stat";
@@ -423,7 +423,7 @@ njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     start = njs_string_alloc(vm, &vm->retval, sb.st_size, length);
-    if (nxt_slow_path(start == NULL)) {
+    if (njs_slow_path(start == NULL)) {
         goto fail;
     }
 
@@ -432,7 +432,7 @@ njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     while (p < end) {
         n = read(fd, p, end - p);
-        if (nxt_slow_path(n == -1)) {
+        if (njs_slow_path(n == -1)) {
             if (errno == EINTR) {
                 continue;
             }
@@ -447,7 +447,7 @@ njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     if (encoding.length != 0) {
-        length = nxt_utf8_length(start, sb.st_size);
+        length = njs_utf8_length(start, sb.st_size);
 
         if (length >= 0) {
             njs_string_length_set(&vm->retval, length);
@@ -486,7 +486,7 @@ fail:
 
 
 static njs_ret_t
-njs_fs_append_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_fs_append_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return njs_fs_write_file_internal(vm, args, nargs,
@@ -495,7 +495,7 @@ njs_fs_append_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_fs_write_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_fs_write_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return njs_fs_write_file_internal(vm, args, nargs,
@@ -504,7 +504,7 @@ njs_fs_write_file(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t njs_fs_append_file_sync(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_fs_write_file_sync_internal(vm, args, nargs,
                                            O_APPEND | O_CREAT | O_WRONLY);
@@ -512,7 +512,7 @@ static njs_ret_t njs_fs_append_file_sync(njs_vm_t *vm, njs_value_t *args,
 
 
 static njs_ret_t njs_fs_write_file_sync(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_fs_write_file_sync_internal(vm, args, nargs,
                                            O_TRUNC | O_CREAT | O_WRONLY);
@@ -520,30 +520,30 @@ static njs_ret_t njs_fs_write_file_sync(njs_vm_t *vm, njs_value_t *args,
 
 
 static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, int default_flags)
+    njs_uint_t nargs, int default_flags)
 {
     int                 fd, errn, flags;
     u_char              *p, *end;
     mode_t              md;
     ssize_t             n;
-    nxt_str_t           data, flag, encoding;
+    njs_str_t           data, flag, encoding;
     njs_ret_t           ret;
     const char          *path, *syscall, *description;
     njs_value_t         *callback, *mode, arguments[2];
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    if (nxt_slow_path(nargs < 4)) {
+    if (njs_slow_path(nargs < 4)) {
         njs_type_error(vm, "too few arguments");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_string(&args[1]))) {
+    if (njs_slow_path(!njs_is_string(&args[1]))) {
         njs_type_error(vm, "path must be a string");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_string(&args[2]))) {
+    if (njs_slow_path(!njs_is_string(&args[2]))) {
         njs_type_error(vm, "data must be a string");
         return NJS_ERROR;
     }
@@ -561,31 +561,31 @@ static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args,
 
         } else if (njs_is_object(&args[3])) {
             lhq.key_hash = NJS_FLAG_HASH;
-            lhq.key = nxt_string_value("flag");
+            lhq.key = njs_str_value("flag");
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
-            if (ret == NXT_OK) {
+            ret = njs_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
+            if (ret == NJS_OK) {
                 prop = lhq.value;
                 njs_string_get(&prop->value, &flag);
             }
 
             lhq.key_hash = NJS_ENCODING_HASH;
-            lhq.key = nxt_string_value("encoding");
+            lhq.key = njs_str_value("encoding");
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
-            if (ret == NXT_OK) {
+            ret = njs_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
+            if (ret == NJS_OK) {
                 prop = lhq.value;
                 njs_string_get(&prop->value, &encoding);
             }
 
             lhq.key_hash = NJS_MODE_HASH;
-            lhq.key = nxt_string_value("mode");
+            lhq.key = njs_str_value("mode");
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
-            if (ret == NXT_OK) {
+            ret = njs_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
+            if (ret == NJS_OK) {
                 prop = lhq.value;
                 mode = &prop->value;
             }
@@ -596,7 +596,7 @@ static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args,
             return NJS_ERROR;
         }
 
-        if (nxt_slow_path(nargs < 5 || !njs_is_function(&args[4]))) {
+        if (njs_slow_path(nargs < 5 || !njs_is_function(&args[4]))) {
             njs_type_error(vm, "callback must be a function");
             return NJS_ERROR;
         }
@@ -604,7 +604,7 @@ static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args,
         callback = &args[4];
 
     } else {
-        if (nxt_slow_path(!njs_is_function(&args[3]))) {
+        if (njs_slow_path(!njs_is_function(&args[3]))) {
             njs_type_error(vm, "callback must be a function");
             return NJS_ERROR;
         }
@@ -614,7 +614,7 @@ static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args,
 
     if (flag.start != NULL) {
         flags = njs_fs_flags(&flag);
-        if (nxt_slow_path(flags == -1)) {
+        if (njs_slow_path(flags == -1)) {
             njs_type_error(vm, "Unknown file open flags: \"%V\"", &flag);
             return NJS_ERROR;
         }
@@ -631,7 +631,7 @@ static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args,
     }
 
     path = (char *) njs_string_to_c_string(vm, &args[1]);
-    if (nxt_slow_path(path == NULL)) {
+    if (njs_slow_path(path == NULL)) {
         return NJS_ERROR;
     }
 
@@ -649,7 +649,7 @@ static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args,
     syscall = NULL;
 
     fd = open(path, flags, md);
-    if (nxt_slow_path(fd < 0)) {
+    if (njs_slow_path(fd < 0)) {
         errn = errno;
         description = strerror(errno);
         syscall = "open";
@@ -663,7 +663,7 @@ static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args,
 
     while (p < end) {
         n = write(fd, p, end - p);
-        if (nxt_slow_path(n == -1)) {
+        if (njs_slow_path(n == -1)) {
             if (errno == EINTR) {
                 continue;
             }
@@ -687,7 +687,7 @@ done:
         ret = njs_fs_error(vm, syscall, description, &args[1], errn,
                            &arguments[1]);
 
-        if (nxt_slow_path(ret != NJS_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
 
@@ -700,42 +700,42 @@ done:
     ret = njs_function_apply(vm, njs_function(callback), arguments, 2,
                              &vm->retval);
 
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     vm->retval = njs_value_undefined;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, int default_flags)
+    njs_uint_t nargs, int default_flags)
 {
     int                 fd, errn, flags;
     u_char              *p, *end;
     mode_t              md;
     ssize_t             n;
-    nxt_str_t           data, flag, encoding;
+    njs_str_t           data, flag, encoding;
     njs_ret_t           ret;
     const char          *path, *syscall, *description;
     njs_value_t         *mode;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    if (nxt_slow_path(nargs < 3)) {
+    if (njs_slow_path(nargs < 3)) {
         njs_type_error(vm, "too few arguments");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_string(&args[1]))) {
+    if (njs_slow_path(!njs_is_string(&args[1]))) {
         njs_type_error(vm, "path must be a string");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_string(&args[2]))) {
+    if (njs_slow_path(!njs_is_string(&args[2]))) {
         njs_type_error(vm, "data must be a string");
         return NJS_ERROR;
     }
@@ -753,31 +753,31 @@ njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args,
 
         } else if (njs_is_object(&args[3])) {
             lhq.key_hash = NJS_FLAG_HASH;
-            lhq.key = nxt_string_value("flag");
+            lhq.key = njs_str_value("flag");
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
-            if (ret == NXT_OK) {
+            ret = njs_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
+            if (ret == NJS_OK) {
                 prop = lhq.value;
                 njs_string_get(&prop->value, &flag);
             }
 
             lhq.key_hash = NJS_ENCODING_HASH;
-            lhq.key = nxt_string_value("encoding");
+            lhq.key = njs_str_value("encoding");
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
-            if (ret == NXT_OK) {
+            ret = njs_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
+            if (ret == NJS_OK) {
                 prop = lhq.value;
                 njs_string_get(&prop->value, &encoding);
             }
 
             lhq.key_hash = NJS_MODE_HASH;
-            lhq.key = nxt_string_value("mode");
+            lhq.key = njs_str_value("mode");
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
-            if (ret == NXT_OK) {
+            ret = njs_lvlhsh_find(njs_object_hash(&args[3]), &lhq);
+            if (ret == NJS_OK) {
                 prop = lhq.value;
                 mode = &prop->value;
             }
@@ -791,7 +791,7 @@ njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args,
 
     if (flag.start != NULL) {
         flags = njs_fs_flags(&flag);
-        if (nxt_slow_path(flags == -1)) {
+        if (njs_slow_path(flags == -1)) {
             njs_type_error(vm, "Unknown file open flags: \"%V\"", &flag);
             return NJS_ERROR;
         }
@@ -808,7 +808,7 @@ njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args,
     }
 
     path = (char *) njs_string_to_c_string(vm, &args[1]);
-    if (nxt_slow_path(path == NULL)) {
+    if (njs_slow_path(path == NULL)) {
         return NJS_ERROR;
     }
 
@@ -826,7 +826,7 @@ njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args,
     syscall = NULL;
 
     fd = open(path, flags, md);
-    if (nxt_slow_path(fd < 0)) {
+    if (njs_slow_path(fd < 0)) {
         errn = errno;
         description = strerror(errno);
         syscall = "open";
@@ -840,7 +840,7 @@ njs_fs_write_file_sync_internal(njs_vm_t *vm, njs_value_t *args,
 
     while (p < end) {
         n = write(fd, p, end - p);
-        if (nxt_slow_path(n == -1)) {
+        if (njs_slow_path(n == -1)) {
             if (errno == EINTR) {
                 continue;
             }
@@ -864,7 +864,7 @@ done:
         ret = njs_fs_error(vm, syscall, description, &args[1], errn,
                            &vm->retval);
 
-        if (nxt_slow_path(ret != NJS_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
 
@@ -880,21 +880,21 @@ static njs_ret_t njs_fs_error(njs_vm_t *vm, const char *syscall,
     const char *description, njs_value_t *path, int errn, njs_value_t *retval)
 {
     size_t              size;
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_value_t         string, value;
     njs_object_t        *error;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    size = description != NULL ? nxt_strlen(description) : 0;
+    size = description != NULL ? njs_strlen(description) : 0;
 
     ret = njs_string_new(vm, &string, (u_char *) description, size, size);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
     error = njs_error_alloc(vm, NJS_OBJECT_ERROR, NULL, &string);
-    if (nxt_slow_path(error == NULL)) {
+    if (njs_slow_path(error == NULL)) {
         return NJS_ERROR;
     }
 
@@ -902,65 +902,65 @@ static njs_ret_t njs_fs_error(njs_vm_t *vm, const char *syscall,
     lhq.pool = vm->mem_pool;
 
     if (errn != 0) {
-        lhq.key = nxt_string_value("errno");
+        lhq.key = njs_str_value("errno");
         lhq.key_hash = NJS_ERRNO_HASH;
         lhq.proto = &njs_object_hash_proto;
 
         njs_set_number(&value, errn);
 
         prop = njs_object_prop_alloc(vm, &njs_fs_errno_string, &value, 1);
-        if (nxt_slow_path(prop == NULL)) {
+        if (njs_slow_path(prop == NULL)) {
             return NJS_ERROR;
         }
 
         lhq.value = prop;
 
-        ret = nxt_lvlhsh_insert(&error->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&error->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
             return NJS_ERROR;
         }
     }
 
     if (path != NULL) {
-        lhq.key = nxt_string_value("path");
+        lhq.key = njs_str_value("path");
         lhq.key_hash = NJS_PATH_HASH;
         lhq.proto = &njs_object_hash_proto;
 
         prop = njs_object_prop_alloc(vm, &njs_fs_path_string, path, 1);
-        if (nxt_slow_path(prop == NULL)) {
+        if (njs_slow_path(prop == NULL)) {
             return NJS_ERROR;
         }
 
         lhq.value = prop;
 
-        ret = nxt_lvlhsh_insert(&error->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&error->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
             return NJS_ERROR;
         }
     }
 
     if (syscall != NULL) {
-        size = nxt_strlen(syscall);
+        size = njs_strlen(syscall);
         ret = njs_string_new(vm, &string, (u_char *) syscall, size, size);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
 
-        lhq.key = nxt_string_value("sycall");
+        lhq.key = njs_str_value("sycall");
         lhq.key_hash = NJS_SYSCALL_HASH;
         lhq.proto = &njs_object_hash_proto;
 
         prop = njs_object_prop_alloc(vm, &njs_fs_syscall_string, &string, 1);
-        if (nxt_slow_path(prop == NULL)) {
+        if (njs_slow_path(prop == NULL)) {
             return NJS_ERROR;
         }
 
         lhq.value = prop;
 
-        ret = nxt_lvlhsh_insert(&error->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&error->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
             return NJS_ERROR;
         }
@@ -973,12 +973,12 @@ static njs_ret_t njs_fs_error(njs_vm_t *vm, const char *syscall,
 
 
 static int
-njs_fs_flags(nxt_str_t *value)
+njs_fs_flags(njs_str_t *value)
 {
     njs_fs_entry_t  *fl;
 
     for (fl = &njs_flags_table[0]; fl->name.length != 0; fl++) {
-        if (nxt_strstr_eq(value, &fl->name)) {
+        if (njs_strstr_eq(value, &fl->name)) {
             return fl->value;
         }
     }
@@ -1072,7 +1072,7 @@ static const njs_object_prop_t  njs_fs_object_properties[] =
 
 
 const njs_object_init_t  njs_fs_object_init = {
-    nxt_string("fs"),
+    njs_str("fs"),
     njs_fs_object_properties,
-    nxt_nitems(njs_fs_object_properties),
+    njs_nitems(njs_fs_object_properties),
 };
similarity index 100%
rename from njs/njs_fs.h
rename to src/njs_fs.h
similarity index 83%
rename from njs/njs_function.c
rename to src/njs_function.c
index 121225facf2b319b2c0b106a5f50d2fc39e39d49..cd2290f5cb3597ed35ca3ce5496ff45a3cca8cfd 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 
 
@@ -12,28 +12,28 @@ static njs_function_t *njs_function_copy(njs_vm_t *vm,
     njs_function_t *function);
 static njs_native_frame_t *njs_function_frame_alloc(njs_vm_t *vm, size_t size);
 static njs_ret_t njs_normalize_args(njs_vm_t *vm, njs_value_t *args,
-    uint8_t *args_types, nxt_uint_t nargs);
+    uint8_t *args_types, njs_uint_t nargs);
 
 
 njs_function_t *
 njs_function_alloc(njs_vm_t *vm, njs_function_lambda_t *lambda,
-    njs_closure_t *closures[], nxt_bool_t shared)
+    njs_closure_t *closures[], njs_bool_t shared)
 {
     size_t          size;
-    nxt_uint_t      n, nesting;
+    njs_uint_t      n, nesting;
     njs_function_t  *function;
 
     nesting = lambda->nesting;
     size = sizeof(njs_function_t) + nesting * sizeof(njs_closure_t *);
 
-    function = nxt_mp_zalloc(vm->mem_pool, size);
-    if (nxt_slow_path(function == NULL)) {
+    function = njs_mp_zalloc(vm->mem_pool, size);
+    if (njs_slow_path(function == NULL)) {
         goto fail;
     }
 
     /*
-     * nxt_mp_zalloc() does also:
-     *   nxt_lvlhsh_init(&function->object.hash);
+     * njs_mp_zalloc() does also:
+     *   njs_lvlhsh_init(&function->object.hash);
      *   function->object.__proto__ = NULL;
      */
 
@@ -87,7 +87,7 @@ njs_function_value_copy(njs_vm_t *vm, njs_value_t *value)
     }
 
     copy = njs_function_copy(vm, function);
-    if (nxt_slow_path(copy == NULL)) {
+    if (njs_slow_path(copy == NULL)) {
         njs_memory_error(vm);
         return NULL;
     }
@@ -98,7 +98,7 @@ njs_function_value_copy(njs_vm_t *vm, njs_value_t *value)
 }
 
 
-nxt_inline njs_closure_t **
+njs_inline njs_closure_t **
 njs_function_closures(njs_vm_t *vm, njs_function_t *function)
 {
     return (function->closure) ? function->closures
@@ -110,7 +110,7 @@ static njs_function_t *
 njs_function_copy(njs_vm_t *vm, njs_function_t *function)
 {
     size_t          size;
-    nxt_uint_t      n, nesting;
+    njs_uint_t      n, nesting;
     njs_closure_t   **closures;
     njs_function_t  *copy;
 
@@ -118,8 +118,8 @@ njs_function_copy(njs_vm_t *vm, njs_function_t *function)
 
     size = sizeof(njs_function_t) + nesting * sizeof(njs_closure_t *);
 
-    copy = nxt_mp_alloc(vm->mem_pool, size);
-    if (nxt_slow_path(copy == NULL)) {
+    copy = njs_mp_alloc(vm->mem_pool, size);
+    if (njs_slow_path(copy == NULL)) {
         return NULL;
     }
 
@@ -153,18 +153,18 @@ njs_function_copy(njs_vm_t *vm, njs_function_t *function)
 njs_ret_t
 njs_function_arguments_object_init(njs_vm_t *vm, njs_native_frame_t *frame)
 {
-    nxt_int_t           ret;
-    nxt_uint_t          nargs, n;
+    njs_int_t           ret;
+    njs_uint_t          nargs, n;
     njs_value_t         value;
     njs_object_t        *arguments;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     static const njs_value_t  njs_string_length = njs_string("length");
 
     arguments = njs_object_alloc(vm);
-    if (nxt_slow_path(arguments == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(arguments == NULL)) {
+        return NJS_ERROR;
     }
 
     arguments->shared_hash = vm->shared->arguments_object_instance_hash;
@@ -174,8 +174,8 @@ njs_function_arguments_object_init(njs_vm_t *vm, njs_native_frame_t *frame)
     njs_set_number(&value, nargs);
 
     prop = njs_object_prop_alloc(vm, &njs_string_length, &value, 1);
-    if (nxt_slow_path(prop == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(prop == NULL)) {
+        return NJS_ERROR;
     }
 
     prop->enumerable = 0;
@@ -188,34 +188,34 @@ njs_function_arguments_object_init(njs_vm_t *vm, njs_native_frame_t *frame)
     lhq.pool = vm->mem_pool;
     lhq.proto = &njs_object_hash_proto;
 
-    ret = nxt_lvlhsh_insert(&arguments->hash, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&arguments->hash, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_internal_error(vm, "lvlhsh insert failed");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     for (n = 0; n < nargs; n++) {
         njs_uint32_to_string(&value, n);
 
         prop = njs_object_prop_alloc(vm, &value, &frame->arguments[n + 1], 1);
-        if (nxt_slow_path(prop == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(prop == NULL)) {
+            return NJS_ERROR;
         }
 
         lhq.value = prop;
         njs_string_get(&prop->name, &lhq.key);
-        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
 
-        ret = nxt_lvlhsh_insert(&arguments->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&arguments->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
     frame->arguments_object = arguments;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -223,7 +223,7 @@ njs_ret_t
 njs_function_rest_parameters_init(njs_vm_t *vm, njs_native_frame_t *frame)
 {
     uint32_t     length;
-    nxt_uint_t   nargs, n, i;
+    njs_uint_t   nargs, n, i;
     njs_array_t  *array;
     njs_value_t  *rest_arguments;
 
@@ -232,8 +232,8 @@ njs_function_rest_parameters_init(njs_vm_t *vm, njs_native_frame_t *frame)
     length = (nargs >= n) ? (nargs - n + 1) : 0;
 
     array = njs_array_alloc(vm, length, 0);
-    if (nxt_slow_path(array == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(array == NULL)) {
+        return NJS_ERROR;
     }
 
     if (n <= nargs) {
@@ -249,7 +249,7 @@ njs_function_rest_parameters_init(njs_vm_t *vm, njs_native_frame_t *frame)
     /* GC: retain. */
     njs_set_array(rest_arguments, array);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -258,7 +258,7 @@ njs_function_arguments_thrower(njs_vm_t *vm, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval)
 {
     njs_type_error(vm, "\"caller\", \"callee\" properties may not be accessed");
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -279,19 +279,19 @@ const njs_object_prop_t  njs_arguments_object_instance_properties[] =
 
 
 const njs_object_init_t  njs_arguments_object_instance_init = {
-    nxt_string("Argument object instance"),
+    njs_str("Argument object instance"),
     njs_arguments_object_instance_properties,
-    nxt_nitems(njs_arguments_object_instance_properties),
+    njs_nitems(njs_arguments_object_instance_properties),
 };
 
 
 njs_ret_t
 njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
-    const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,
-    nxt_bool_t ctor)
+    const njs_value_t *this, const njs_value_t *args, njs_uint_t nargs,
+    njs_bool_t ctor)
 {
     size_t              size;
-    nxt_uint_t          n;
+    njs_uint_t          n;
     njs_value_t         *value, *bound;
     njs_native_frame_t  *frame;
 
@@ -299,8 +299,8 @@ njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
            + (function->args_offset + nargs) * sizeof(njs_value_t);
 
     frame = njs_function_frame_alloc(vm, size);
-    if (nxt_slow_path(frame == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(frame == NULL)) {
+        return NJS_ERROR;
     }
 
     frame->function = function;
@@ -332,17 +332,17 @@ njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
         memcpy(value, args, nargs * sizeof(njs_value_t));
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t
 njs_function_lambda_frame(njs_vm_t *vm, njs_function_t *function,
-    const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,
-    nxt_bool_t ctor)
+    const njs_value_t *this, const njs_value_t *args, njs_uint_t nargs,
+    njs_bool_t ctor)
 {
     size_t                 size;
-    nxt_uint_t             n, max_args, closures;
+    njs_uint_t             n, max_args, closures;
     njs_value_t            *value, *bound;
     njs_frame_t            *frame;
     njs_native_frame_t     *native_frame;
@@ -350,7 +350,7 @@ njs_function_lambda_frame(njs_vm_t *vm, njs_function_t *function,
 
     lambda = function->u.lambda;
 
-    max_args = nxt_max(nargs, lambda->nargs);
+    max_args = njs_max(nargs, lambda->nargs);
 
     closures = lambda->nesting + lambda->block_closures;
 
@@ -359,8 +359,8 @@ njs_function_lambda_frame(njs_vm_t *vm, njs_function_t *function,
            + lambda->local_size;
 
     native_frame = njs_function_frame_alloc(vm, size);
-    if (nxt_slow_path(native_frame == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(native_frame == NULL)) {
+        return NJS_ERROR;
     }
 
     native_frame->function = function;
@@ -407,7 +407,7 @@ njs_function_lambda_frame(njs_vm_t *vm, njs_function_t *function,
     frame->local = value;
     frame->previous_active_frame = vm->active_frame;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -423,25 +423,25 @@ njs_function_frame_alloc(njs_vm_t *vm, size_t size)
      * in njs_vm_continuation() which is expected to return pointers aligned
      * to njs_value_t.
      */
-    size = nxt_align_size(size, sizeof(njs_value_t));
+    size = njs_align_size(size, sizeof(njs_value_t));
 
     spare_size = vm->top_frame->free_size;
 
-    if (nxt_fast_path(size <= spare_size)) {
+    if (njs_fast_path(size <= spare_size)) {
         frame = (njs_native_frame_t *) vm->top_frame->free;
         chunk_size = 0;
 
     } else {
         spare_size = size + NJS_FRAME_SPARE_SIZE;
-        spare_size = nxt_align_size(spare_size, NJS_FRAME_SPARE_SIZE);
+        spare_size = njs_align_size(spare_size, NJS_FRAME_SPARE_SIZE);
 
         if (vm->stack_size + spare_size > NJS_MAX_STACK_SIZE) {
             njs_range_error(vm, "Maximum call stack size exceeded");
             return NULL;
         }
 
-        frame = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t), spare_size);
-        if (nxt_slow_path(frame == NULL)) {
+        frame = njs_mp_align(vm->mem_pool, sizeof(njs_value_t), spare_size);
+        if (njs_slow_path(frame == NULL)) {
             njs_memory_error(vm);
             return NULL;
         }
@@ -450,7 +450,7 @@ njs_function_frame_alloc(njs_vm_t *vm, size_t size)
         vm->stack_size += spare_size;
     }
 
-    nxt_memzero(frame, sizeof(njs_native_frame_t));
+    njs_memzero(frame, sizeof(njs_native_frame_t));
 
     frame->size = chunk_size;
     frame->free_size = spare_size - size;
@@ -465,19 +465,19 @@ njs_function_frame_alloc(njs_vm_t *vm, size_t size)
 
 njs_ret_t
 njs_function_call(njs_vm_t *vm, njs_function_t *function, njs_value_t *this,
-    njs_value_t *args, nxt_uint_t nargs, njs_value_t *retval)
+    njs_value_t *args, njs_uint_t nargs, njs_value_t *retval)
 {
     njs_ret_t    ret;
-    njs_value_t  dst nxt_aligned(16);
+    njs_value_t  dst njs_aligned(16);
 
     ret = njs_function_frame(vm, function, this, args, nargs, 0);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     ret = njs_function_frame_invoke(vm, (njs_index_t) &dst);
 
-    if (ret == NXT_OK) {
+    if (ret == NJS_OK) {
         *retval = dst;
     }
 
@@ -490,7 +490,7 @@ njs_function_lambda_call(njs_vm_t *vm)
 {
     size_t                 size;
     njs_ret_t              ret;
-    nxt_uint_t             n, nesting;
+    njs_uint_t             n, nesting;
     njs_frame_t            *frame;
     njs_value_t            *dst, *src;
     njs_closure_t          *closure, **closures;
@@ -502,7 +502,7 @@ njs_function_lambda_call(njs_vm_t *vm)
 
     lambda = function->u.lambda;
 
-#if (NXT_DEBUG)
+#if (NJS_DEBUG)
     vm->scopes[NJS_SCOPE_CALLEE_ARGUMENTS] = NULL;
 #endif
 
@@ -539,10 +539,10 @@ njs_function_lambda_call(njs_vm_t *vm)
         size = lambda->closure_size;
 
         if (size != 0) {
-            closure = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t), size);
-            if (nxt_slow_path(closure == NULL)) {
+            closure = njs_mp_align(vm->mem_pool, sizeof(njs_value_t), size);
+            if (njs_slow_path(closure == NULL)) {
                 njs_memory_error(vm);
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
             size -= sizeof(njs_value_t);
@@ -563,8 +563,8 @@ njs_function_lambda_call(njs_vm_t *vm)
 
     if (lambda->rest_parameters) {
         ret = njs_function_rest_parameters_init(vm, &frame->native);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
     }
 
@@ -596,12 +596,12 @@ njs_function_native_call(njs_vm_t *vm)
     ret = function->u.native(vm, native->arguments, native->nargs,
                              frame->retval);
 
-    if (nxt_slow_path(ret == NXT_ERROR)) {
+    if (njs_slow_path(ret == NJS_ERROR)) {
         return ret;
     }
 
     if (ret == NJS_DECLINED) {
-        return NXT_OK;
+        return NJS_OK;
     }
 
     previous = njs_function_previous_frame(native);
@@ -619,18 +619,18 @@ njs_function_native_call(njs_vm_t *vm)
 
     njs_function_frame_free(vm, native);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_normalize_args(njs_vm_t *vm, njs_value_t *args, uint8_t *args_types,
-    nxt_uint_t nargs)
+    njs_uint_t nargs)
 {
     njs_ret_t   ret;
-    nxt_uint_t  n;
+    njs_uint_t  n;
 
-    n = nxt_min(nargs, NJS_ARGS_TYPES_MAX);
+    n = njs_min(nargs, NJS_ARGS_TYPES_MAX);
 
     while (n != 0) {
 
@@ -648,7 +648,7 @@ njs_normalize_args(njs_vm_t *vm, njs_value_t *args, uint8_t *args_types,
 
             if (!njs_is_string(args)) {
                 ret = njs_value_to_string(vm, args, args);
-                if (ret != NXT_OK) {
+                if (ret != NJS_OK) {
                     return ret;
                 }
             }
@@ -659,7 +659,7 @@ njs_normalize_args(njs_vm_t *vm, njs_value_t *args, uint8_t *args_types,
 
             if (!njs_is_numeric(args)) {
                 ret = njs_value_to_numeric(vm, args, args);
-                if (ret != NXT_OK) {
+                if (ret != NJS_OK) {
                     return ret;
                 }
             }
@@ -670,7 +670,7 @@ njs_normalize_args(njs_vm_t *vm, njs_value_t *args, uint8_t *args_types,
 
             if (!njs_is_numeric(args)) {
                 ret = njs_value_to_numeric(vm, args, args);
-                if (ret != NXT_OK) {
+                if (ret != NJS_OK) {
                     return ret;
                 }
             }
@@ -697,7 +697,7 @@ njs_normalize_args(njs_vm_t *vm, njs_value_t *args, uint8_t *args_types,
 
             default:
                 ret = njs_value_to_string(vm, args, args);
-                if (ret != NXT_OK) {
+                if (ret != NJS_OK) {
                     return ret;
                 }
             }
@@ -714,7 +714,7 @@ njs_normalize_args(njs_vm_t *vm, njs_value_t *args, uint8_t *args_types,
 
             default:
                 ret = njs_value_to_string(vm, args, args);
-                if (ret != NXT_OK) {
+                if (ret != NJS_OK) {
                     return ret;
                 }
             }
@@ -755,7 +755,7 @@ type_error:
     njs_type_error(vm, "cannot convert %s to %s", njs_type_string(args->type),
                    njs_arg_type_string(*args_types));
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -771,7 +771,7 @@ njs_function_frame_free(njs_vm_t *vm, njs_native_frame_t *native)
 
         if (native->size != 0) {
             vm->stack_size -= native->size;
-            nxt_mp_free(vm->mem_pool, native);
+            njs_mp_free(vm->mem_pool, native);
         }
 
         native = previous;
@@ -797,12 +797,12 @@ njs_function_prototype_create(njs_vm_t *vm, njs_value_t *value,
 
     proto = njs_function_property_prototype_create(vm, value);
 
-    if (nxt_fast_path(proto != NULL)) {
+    if (njs_fast_path(proto != NULL)) {
         *retval = *proto;
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -815,25 +815,25 @@ njs_function_property_prototype_create(njs_vm_t *vm, njs_value_t *value)
 
     prototype = njs_object_alloc(vm);
 
-    if (nxt_slow_path(prototype == NULL)) {
+    if (njs_slow_path(prototype == NULL)) {
         return NULL;
     }
 
     function = njs_function_value_copy(vm, value);
 
-    if (nxt_slow_path(function == NULL)) {
+    if (njs_slow_path(function == NULL)) {
         return NULL;
     }
 
     proto = njs_property_prototype_create(vm, &function->object.hash,
                                           prototype);
-    if (nxt_slow_path(proto == NULL)) {
+    if (njs_slow_path(proto == NULL)) {
         return NULL;
     }
 
     cons = njs_property_constructor_create(vm, &prototype->hash, value);
 
-    if (nxt_fast_path(cons != NULL)) {
+    if (njs_fast_path(cons != NULL)) {
         return proto;
     }
 
@@ -842,12 +842,12 @@ njs_function_property_prototype_create(njs_vm_t *vm, njs_value_t *value)
 
 
 njs_ret_t
-njs_function_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_function_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_internal_error(vm, "Not implemented");
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -879,9 +879,9 @@ static const njs_object_prop_t  njs_function_constructor_properties[] =
 
 
 const njs_object_init_t  njs_function_constructor_init = {
-    nxt_string("Function"),
+    njs_str("Function"),
     njs_function_constructor_properties,
-    nxt_nitems(njs_function_constructor_properties),
+    njs_nitems(njs_function_constructor_properties),
 };
 
 
@@ -893,7 +893,7 @@ static njs_ret_t
 njs_function_instance_length(njs_vm_t *vm, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval)
 {
-    nxt_uint_t             n;
+    njs_uint_t             n;
     njs_object_t           *proto;
     njs_function_t         *function;
     njs_function_lambda_t  *lambda;
@@ -901,14 +901,14 @@ njs_function_instance_length(njs_vm_t *vm, njs_value_t *value,
     proto = njs_object(value);
 
     do {
-        if (nxt_fast_path(proto->type == NJS_FUNCTION)) {
+        if (njs_fast_path(proto->type == NJS_FUNCTION)) {
             break;
         }
 
         proto = proto->__proto__;
     } while (proto != NULL);
 
-    if (nxt_slow_path(proto == NULL)) {
+    if (njs_slow_path(proto == NULL)) {
         njs_internal_error(vm, "no function in proto chain");
         return NJS_ERROR;
     }
@@ -936,12 +936,12 @@ njs_function_instance_length(njs_vm_t *vm, njs_value_t *value,
 
     njs_set_number(retval, n);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_function_prototype_call(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_function_prototype_call(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t retval)
 {
     njs_ret_t       ret;
@@ -950,7 +950,7 @@ njs_function_prototype_call(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (!njs_is_function(&args[0])) {
         njs_type_error(vm, "\"this\" argument is not a function");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     if (nargs > 1) {
@@ -968,12 +968,12 @@ njs_function_prototype_call(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     vm->top_frame->skip = 1;
 
     ret = njs_function_frame(vm, function, this, &args[2], nargs, 0);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     ret = njs_function_frame_invoke(vm, retval);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -993,7 +993,7 @@ njs_function_prototype_call(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
  *                                        0:'b', 1:'c'})
  */
 static njs_ret_t
-njs_function_prototype_apply(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_function_prototype_apply(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t retval)
 {
     uint32_t           i;
@@ -1007,7 +1007,7 @@ njs_function_prototype_apply(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (!njs_is_function(njs_arg(args, nargs, 0))) {
         njs_type_error(vm, "\"this\" argument is not a function");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     func = njs_function(njs_argument(args, 0));
@@ -1027,26 +1027,26 @@ njs_function_prototype_apply(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         goto activate;
 
-    } else if (nxt_slow_path(!njs_is_object(arr_like))) {
+    } else if (njs_slow_path(!njs_is_object(arr_like))) {
         njs_type_error(vm, "second argument is not an array-like object");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     ret = njs_value_property(vm, arr_like, &njs_string_length, &length);
-    if (nxt_slow_path(ret == NXT_ERROR)) {
+    if (njs_slow_path(ret == NJS_ERROR)) {
         return ret;
     }
 
     if (!njs_is_primitive(&length)) {
         njs_type_error(vm, "non-primitive length values are not supported");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     nargs = njs_primitive_value_to_length(&length);
 
     arr = njs_array_alloc(vm, nargs, NJS_ARRAY_SPARE);
-    if (nxt_slow_path(arr == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(arr == NULL)) {
+        return NJS_ERROR;
     }
 
     args = arr->start;
@@ -1055,7 +1055,7 @@ njs_function_prototype_apply(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         njs_uint32_to_string(&name, i);
 
         ret = njs_value_property(vm, arr_like, &name, &args[i]);
-        if (nxt_slow_path(ret == NXT_ERROR)) {
+        if (njs_slow_path(ret == NJS_ERROR)) {
             return ret;
         }
     }
@@ -1066,12 +1066,12 @@ activate:
     vm->top_frame->skip = 1;
 
     ret = njs_function_frame(vm, func, (njs_value_t *) this, args, nargs, 0);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     ret = njs_function_frame_invoke(vm, retval);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1080,7 +1080,7 @@ activate:
 
 
 static njs_ret_t
-njs_function_prototype_bind(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_function_prototype_bind(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     size_t          size;
@@ -1089,13 +1089,13 @@ njs_function_prototype_bind(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (!njs_is_function(&args[0])) {
         njs_type_error(vm, "\"this\" argument is not a function");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     function = njs_function_copy(vm, njs_function(&args[0]));
-    if (nxt_slow_path(function == NULL)) {
+    if (njs_slow_path(function == NULL)) {
         njs_memory_error(vm);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     if (nargs == 1) {
@@ -1109,11 +1109,11 @@ njs_function_prototype_bind(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     function->args_offset = nargs;
     size = nargs * sizeof(njs_value_t);
 
-    values = nxt_mp_alloc(vm->mem_pool, size);
-    if (nxt_slow_path(values == NULL)) {
+    values = njs_mp_alloc(vm->mem_pool, size);
+    if (njs_slow_path(values == NULL)) {
         njs_memory_error(vm);
-        nxt_mp_free(vm->mem_pool, function);
-        return NXT_ERROR;
+        njs_mp_free(vm->mem_pool, function);
+        return NJS_ERROR;
     }
 
     function->bound = values;
@@ -1124,7 +1124,7 @@ njs_function_prototype_bind(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_function(&vm->retval, function);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1179,9 +1179,9 @@ static const njs_object_prop_t  njs_function_prototype_properties[] =
 
 
 const njs_object_init_t  njs_function_prototype_init = {
-    nxt_string("Function"),
+    njs_str("Function"),
     njs_function_prototype_properties,
-    nxt_nitems(njs_function_prototype_properties),
+    njs_nitems(njs_function_prototype_properties),
 };
 
 
@@ -1203,9 +1203,9 @@ const njs_object_prop_t  njs_function_instance_properties[] =
 
 
 const njs_object_init_t  njs_function_instance_init = {
-    nxt_string("Function instance"),
+    njs_str("Function instance"),
     njs_function_instance_properties,
-    nxt_nitems(njs_function_instance_properties),
+    njs_nitems(njs_function_instance_properties),
 };
 
 
@@ -1221,19 +1221,19 @@ const njs_object_prop_t  njs_arrow_instance_properties[] =
 
 
 const njs_object_init_t  njs_arrow_instance_init = {
-    nxt_string("Arrow instance"),
+    njs_str("Arrow instance"),
     njs_arrow_instance_properties,
-    nxt_nitems(njs_arrow_instance_properties),
+    njs_nitems(njs_arrow_instance_properties),
 };
 
 
 njs_ret_t
-njs_eval_function(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_eval_function(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_internal_error(vm, "Not implemented");
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -1258,7 +1258,7 @@ static const njs_object_prop_t  njs_eval_function_properties[] =
 
 
 const njs_object_init_t  njs_eval_function_init = {
-    nxt_string("eval"),
+    njs_str("eval"),
     njs_eval_function_properties,
-    nxt_nitems(njs_eval_function_properties),
+    njs_nitems(njs_eval_function_properties),
 };
similarity index 85%
rename from njs/njs_function.h
rename to src/njs_function.h
index 48665db7027aba44787725a4e3317c3aa7d4b44f..adfa136a0720ed4f30d073ac4767906780c133e7 100644 (file)
@@ -43,16 +43,16 @@ struct njs_function_lambda_s {
 
 /* The frame size must be aligned to njs_value_t. */
 #define NJS_NATIVE_FRAME_SIZE                                                 \
-    nxt_align_size(sizeof(njs_native_frame_t), sizeof(njs_value_t))
+    njs_align_size(sizeof(njs_native_frame_t), sizeof(njs_value_t))
 
 /* The frame size must be aligned to njs_value_t. */
 #define njs_frame_size(closures)                                              \
-    nxt_align_size(sizeof(njs_frame_t) + closures * sizeof(njs_closure_t *),  \
+    njs_align_size(sizeof(njs_frame_t) + closures * sizeof(njs_closure_t *),  \
                    sizeof(njs_value_t))
 
 /* The retval field is not used in the global frame. */
 #define NJS_GLOBAL_FRAME_SIZE                                                 \
-    nxt_align_size(offsetof(njs_frame_t, retval), sizeof(njs_value_t))
+    njs_align_size(offsetof(njs_frame_t, retval), sizeof(njs_value_t))
 
 #define NJS_FRAME_SPARE_SIZE       512
 
@@ -101,7 +101,7 @@ struct njs_frame_s {
     njs_frame_t                    *previous_active_frame;
 
     njs_value_t                    *local;
-#if (NXT_SUNC)
+#if (NJS_SUNC)
     njs_closure_t                  *closures[1];
 #else
     njs_closure_t                  *closures[];
@@ -110,7 +110,7 @@ struct njs_frame_s {
 
 
 njs_function_t *njs_function_alloc(njs_vm_t *vm, njs_function_lambda_t *lambda,
-    njs_closure_t *closures[], nxt_bool_t shared);
+    njs_closure_t *closures[], njs_bool_t shared);
 njs_function_t *njs_function_value_copy(njs_vm_t *vm, njs_value_t *value);
 njs_ret_t njs_function_arguments_object_init(njs_vm_t *vm,
     njs_native_frame_t *frame);
@@ -121,29 +121,29 @@ njs_ret_t njs_function_prototype_create(njs_vm_t *vm, njs_value_t *value,
 njs_value_t *njs_function_property_prototype_create(njs_vm_t *vm,
     njs_value_t *value);
 njs_ret_t njs_function_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_function_native_frame(njs_vm_t *vm, njs_function_t *function,
-    const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,
-    nxt_bool_t ctor);
+    const njs_value_t *this, const njs_value_t *args, njs_uint_t nargs,
+    njs_bool_t ctor);
 njs_ret_t njs_function_lambda_frame(njs_vm_t *vm, njs_function_t *function,
-    const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,
-    nxt_bool_t ctor);
+    const njs_value_t *this, const njs_value_t *args, njs_uint_t nargs,
+    njs_bool_t ctor);
 njs_ret_t njs_function_call(njs_vm_t *vm, njs_function_t *function,
-    njs_value_t *this, njs_value_t *args, nxt_uint_t nargs,
+    njs_value_t *this, njs_value_t *args, njs_uint_t nargs,
     njs_value_t *retval);
 njs_ret_t njs_function_lambda_call(njs_vm_t *vm);
 njs_ret_t njs_function_native_call(njs_vm_t *vm);
 void njs_function_frame_free(njs_vm_t *vm, njs_native_frame_t *frame);
 
 
-nxt_inline njs_function_lambda_t *
+njs_inline njs_function_lambda_t *
 njs_function_lambda_alloc(njs_vm_t *vm, uint8_t ctor)
 {
     njs_function_lambda_t  *lambda;
 
-    lambda = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_function_lambda_t));
+    lambda = njs_mp_zalloc(vm->mem_pool, sizeof(njs_function_lambda_t));
 
-    if (nxt_fast_path(lambda != NULL)) {
+    if (njs_fast_path(lambda != NULL)) {
         lambda->ctor = ctor;
     }
 
@@ -151,10 +151,10 @@ njs_function_lambda_alloc(njs_vm_t *vm, uint8_t ctor)
 }
 
 
-nxt_inline njs_ret_t
+njs_inline njs_ret_t
 njs_function_frame(njs_vm_t *vm, njs_function_t *function,
-    const njs_value_t *this, const njs_value_t *args, nxt_uint_t nargs,
-    nxt_bool_t ctor)
+    const njs_value_t *this, const njs_value_t *args, njs_uint_t nargs,
+    njs_bool_t ctor)
 {
     if (function->native) {
         return njs_function_native_frame(vm, function, this, args, nargs, ctor);
@@ -165,7 +165,7 @@ njs_function_frame(njs_vm_t *vm, njs_function_t *function,
 }
 
 
-nxt_inline njs_native_frame_t *
+njs_inline njs_native_frame_t *
 njs_function_previous_frame(njs_native_frame_t *frame)
 {
     njs_native_frame_t  *previous;
@@ -180,7 +180,7 @@ njs_function_previous_frame(njs_native_frame_t *frame)
 }
 
 
-nxt_inline njs_ret_t
+njs_inline njs_ret_t
 njs_function_frame_invoke(njs_vm_t *vm, njs_index_t retval)
 {
     njs_frame_t  *frame;
@@ -198,9 +198,9 @@ njs_function_frame_invoke(njs_vm_t *vm, njs_index_t retval)
 }
 
 
-nxt_inline njs_ret_t
+njs_inline njs_ret_t
 njs_function_apply(njs_vm_t *vm, njs_function_t *function, njs_value_t *args,
-    nxt_uint_t nargs, njs_value_t *retval)
+    njs_uint_t nargs, njs_value_t *retval)
 {
     return njs_function_call(vm, function, &args[0], &args[1], nargs - 1,
                              retval);
@@ -213,7 +213,7 @@ extern const njs_object_init_t  njs_function_instance_init;
 extern const njs_object_init_t  njs_arrow_instance_init;
 extern const njs_object_init_t  njs_arguments_object_instance_init;
 
-njs_ret_t njs_eval_function(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_ret_t njs_eval_function(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused);
 
 extern const njs_object_init_t  njs_eval_function_init;
similarity index 81%
rename from njs/njs_generator.c
rename to src/njs_generator.c
index 845f5f2f47f41cb2dfa261b1f4e46dcb000ea000..a3f2972162704c9905aade364de4d5dfe0b9e787 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 
 
@@ -21,7 +21,7 @@ struct njs_generator_patch_s {
     njs_ret_t                       jump_offset;
     njs_generator_patch_t           *next;
 
-    nxt_str_t                       label;
+    njs_str_t                       label;
 };
 
 
@@ -36,7 +36,7 @@ typedef enum {
 
 struct njs_generator_block_s {
     njs_generator_block_type_t      type;    /* 4 bits */
-    nxt_str_t                       label;
+    njs_str_t                       label;
 
     /* list of "continue" instruction offsets to be patched. */
     njs_generator_patch_t           *continuation;
@@ -53,110 +53,110 @@ struct njs_generator_block_s {
 };
 
 
-static nxt_int_t njs_generator(njs_vm_t *vm, njs_generator_t *generator,
+static njs_int_t njs_generator(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node);
 static u_char *njs_generate_reserve(njs_vm_t *vm, njs_generator_t *generator,
     size_t size);
-static nxt_int_t njs_generate_name(njs_vm_t *vm, njs_generator_t *generator,
+static njs_int_t njs_generate_name(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node);
-static nxt_int_t njs_generate_builtin_object(njs_vm_t *vm,
+static njs_int_t njs_generate_builtin_object(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_variable(njs_vm_t *vm, njs_generator_t *generator,
+static njs_int_t njs_generate_variable(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node);
-static nxt_int_t njs_generate_var_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_var_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_if_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_if_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_cond_expression(njs_vm_t *vm,
+static njs_int_t njs_generate_cond_expression(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_switch_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_switch_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_while_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_while_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_do_while_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_do_while_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_for_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_for_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_for_in_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_for_in_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_start_block(njs_vm_t *vm,
+static njs_int_t njs_generate_start_block(njs_vm_t *vm,
     njs_generator_t *generator, njs_generator_block_type_t type,
-    const nxt_str_t *label);
+    const njs_str_t *label);
 static njs_generator_block_t *njs_generate_lookup_block(
-    njs_generator_block_t *block, uint32_t mask, const nxt_str_t *label);
+    njs_generator_block_t *block, uint32_t mask, const njs_str_t *label);
 static njs_generator_block_t *njs_generate_find_block(
-    njs_generator_block_t *block, uint32_t mask, const nxt_str_t *label);
+    njs_generator_block_t *block, uint32_t mask, const njs_str_t *label);
 static void njs_generate_patch_block(njs_vm_t *vm, njs_generator_t *generator,
     njs_generator_patch_t *list);
 static njs_generator_patch_t *njs_generate_make_continuation_patch(njs_vm_t *vm,
-    njs_generator_block_t *block, const nxt_str_t *label, njs_ret_t offset);
+    njs_generator_block_t *block, const njs_str_t *label, njs_ret_t offset);
 static njs_generator_patch_t *njs_generate_make_exit_patch(njs_vm_t *vm,
-    njs_generator_block_t *block, const nxt_str_t *label, njs_ret_t offset);
+    njs_generator_block_t *block, const njs_str_t *label, njs_ret_t offset);
 static void njs_generate_patch_block_exit(njs_vm_t *vm,
     njs_generator_t *generator);
-static const nxt_str_t *njs_generate_jump_destination(njs_vm_t *vm,
+static const njs_str_t *njs_generate_jump_destination(njs_vm_t *vm,
     njs_generator_block_t *block, const char *inst_type, uint32_t mask,
-    const nxt_str_t *label1, const nxt_str_t *label2);
-static nxt_int_t njs_generate_continue_statement(njs_vm_t *vm,
+    const njs_str_t *label1, const njs_str_t *label2);
+static njs_int_t njs_generate_continue_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_break_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_break_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_block_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_block_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_children(njs_vm_t *vm, njs_generator_t *generator,
+static njs_int_t njs_generate_children(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node);
-static nxt_int_t njs_generate_stop_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_stop_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_comma_expression(njs_vm_t *vm,
+static njs_int_t njs_generate_comma_expression(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_assignment(njs_vm_t *vm,
+static njs_int_t njs_generate_assignment(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_operation_assignment(njs_vm_t *vm,
+static njs_int_t njs_generate_operation_assignment(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_object(njs_vm_t *vm, njs_generator_t *generator,
+static njs_int_t njs_generate_object(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node);
-static nxt_int_t njs_generate_array(njs_vm_t *vm, njs_generator_t *generator,
+static njs_int_t njs_generate_array(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node);
-static nxt_int_t njs_generate_function(njs_vm_t *vm, njs_generator_t *generator,
+static njs_int_t njs_generate_function(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node);
-static nxt_int_t njs_generate_regexp(njs_vm_t *vm, njs_generator_t *generator,
+static njs_int_t njs_generate_regexp(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node);
-static nxt_int_t njs_generate_template_literal(njs_vm_t *vm,
+static njs_int_t njs_generate_template_literal(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_test_jump_expression(njs_vm_t *vm,
+static njs_int_t njs_generate_test_jump_expression(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_3addr_operation(njs_vm_t *vm,
-    njs_generator_t *generator, njs_parser_node_t *node, nxt_bool_t swap);
-static nxt_int_t njs_generate_2addr_operation(njs_vm_t *vm,
+static njs_int_t njs_generate_3addr_operation(njs_vm_t *vm,
+    njs_generator_t *generator, njs_parser_node_t *node, njs_bool_t swap);
+static njs_int_t njs_generate_2addr_operation(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_typeof_operation(njs_vm_t *vm,
+static njs_int_t njs_generate_typeof_operation(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_inc_dec_operation(njs_vm_t *vm,
-    njs_generator_t *generator, njs_parser_node_t *node, nxt_bool_t post);
-static nxt_int_t njs_generate_function_declaration(njs_vm_t *vm,
+static njs_int_t njs_generate_inc_dec_operation(njs_vm_t *vm,
+    njs_generator_t *generator, njs_parser_node_t *node, njs_bool_t post);
+static njs_int_t njs_generate_function_declaration(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_function_scope(njs_vm_t *vm,
+static njs_int_t njs_generate_function_scope(njs_vm_t *vm,
     njs_function_lambda_t *lambda, njs_parser_node_t *node,
-    const nxt_str_t *name);
-static nxt_int_t njs_generate_lambda_variables(njs_vm_t *vm,
+    const njs_str_t *name);
+static njs_int_t njs_generate_lambda_variables(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_return_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_return_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_function_call(njs_vm_t *vm,
+static njs_int_t njs_generate_function_call(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_method_call(njs_vm_t *vm,
+static njs_int_t njs_generate_method_call(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_call(njs_vm_t *vm, njs_generator_t *generator,
+static njs_int_t njs_generate_call(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node);
-static nxt_int_t njs_generate_try_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_try_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_throw_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_throw_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_import_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_import_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_export_statement(njs_vm_t *vm,
+static njs_int_t njs_generate_export_statement(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
 static njs_index_t njs_generate_dest_index(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
@@ -166,25 +166,25 @@ static njs_index_t njs_generate_node_temp_index_get(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
 static njs_index_t njs_generate_temp_index_get(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_children_indexes_release(njs_vm_t *vm,
+static njs_int_t njs_generate_children_indexes_release(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_node_index_release(njs_vm_t *vm,
+static njs_int_t njs_generate_node_index_release(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
-static nxt_int_t njs_generate_index_release(njs_vm_t *vm,
+static njs_int_t njs_generate_index_release(njs_vm_t *vm,
     njs_generator_t *generator, njs_index_t index);
-static nxt_int_t njs_generate_reference_error(njs_vm_t *vm,
+static njs_int_t njs_generate_reference_error(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
 
-static nxt_int_t njs_generate_function_debug(njs_vm_t *vm,
-    const nxt_str_t *name, njs_function_lambda_t *lambda,
+static njs_int_t njs_generate_function_debug(njs_vm_t *vm,
+    const njs_str_t *name, njs_function_lambda_t *lambda,
     njs_parser_node_t *node);
 
 
 #define njs_generate_code(generator, type, _code, _op, nargs)                 \
     do {                                                                      \
         _code = (type *) njs_generate_reserve(vm, generator, sizeof(type));   \
-        if (nxt_slow_path(_code == NULL)) {                                   \
-            return NXT_ERROR;                                                 \
+        if (njs_slow_path(_code == NULL)) {                                   \
+            return NJS_ERROR;                                                 \
         }                                                                     \
                                                                               \
         generator->code_end += sizeof(type);                                  \
@@ -246,17 +246,17 @@ static nxt_int_t njs_generate_function_debug(njs_vm_t *vm,
     njs_parser_node_error(vm, node, NJS_OBJECT_SYNTAX_ERROR, fmt, ##__VA_ARGS__)
 
 
-static const nxt_str_t  no_label     = nxt_string("");
-static const nxt_str_t  return_label = nxt_string("@return");
+static const njs_str_t  no_label     = njs_str("");
+static const njs_str_t  return_label = njs_str("@return");
 /* GCC and Clang complain about NULL argument passed to memcmp(). */
-static const nxt_str_t  undef_label  = { 0xffffffff, (u_char *) "" };
+static const njs_str_t  undef_label  = { 0xffffffff, (u_char *) "" };
 
 
-static nxt_int_t
+static njs_int_t
 njs_generator(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node)
 {
     if (node == NULL) {
-        return NXT_OK;
+        return NJS_OK;
     }
 
     switch (node->token) {
@@ -383,15 +383,15 @@ njs_generator(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node)
     case NJS_TOKEN_NUMBER:
     case NJS_TOKEN_STRING:
         node->index = njs_value_index(vm, &node->u.value, generator->runtime);
-        if (nxt_fast_path(node->index != NJS_INDEX_NONE)) {
-            return NXT_OK;
+        if (njs_fast_path(node->index != NJS_INDEX_NONE)) {
+            return NJS_OK;
         }
 
-        return NXT_ERROR;
+        return NJS_ERROR;
 
     case NJS_TOKEN_OBJECT_VALUE:
         node->index = node->u.object->index;
-        return NXT_OK;
+        return NJS_OK;
 
     case NJS_TOKEN_OBJECT:
         return njs_generate_object(vm, generator, node);
@@ -427,7 +427,7 @@ njs_generator(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node)
     case NJS_TOKEN_URI_ERROR_CONSTRUCTOR:
     case NJS_TOKEN_MEMORY_ERROR_CONSTRUCTOR:
     case NJS_TOKEN_EXTERNAL:
-        return NXT_OK;
+        return NJS_OK;
 
     case NJS_TOKEN_NAME:
     case NJS_TOKEN_ARGUMENTS:
@@ -438,11 +438,11 @@ njs_generator(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node)
         if (vm->options.module) {
             node->index = njs_value_index(vm, &node->u.value,
                                           generator->runtime);
-            if (nxt_fast_path(node->index != NJS_INDEX_NONE)) {
-                return NXT_OK;
+            if (njs_fast_path(node->index != NJS_INDEX_NONE)) {
+                return NJS_OK;
             }
 
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         /* Fall through. */
@@ -492,10 +492,10 @@ njs_generator(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node)
         return njs_generate_export_statement(vm, generator, node);
 
     default:
-        nxt_thread_log_debug("unknown token: %d", node->token);
+        njs_thread_log_debug("unknown token: %d", node->token);
         njs_internal_error(vm, "Generator failed: unknown token");
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 }
 
@@ -511,7 +511,7 @@ njs_generate_reserve(njs_vm_t *vm, njs_generator_t *generator, size_t size)
         return generator->code_end;
     }
 
-    size = nxt_max(generator->code_end - generator->code_start + size,
+    size = njs_max(generator->code_end - generator->code_start + size,
                    generator->code_size);
 
     if (size < 1024) {
@@ -521,8 +521,8 @@ njs_generate_reserve(njs_vm_t *vm, njs_generator_t *generator, size_t size)
         size += size / 2;
     }
 
-    p = nxt_mp_alloc(vm->mem_pool, size);
-    if (nxt_slow_path(p == NULL)) {
+    p = njs_mp_alloc(vm->mem_pool, size);
+    if (njs_slow_path(p == NULL)) {
         njs_memory_error(vm);
         return NULL;
     }
@@ -532,7 +532,7 @@ njs_generate_reserve(njs_vm_t *vm, njs_generator_t *generator, size_t size)
     size = generator->code_end - generator->code_start;
     memcpy(p, generator->code_start, size);
 
-    nxt_mp_free(vm->mem_pool, generator->code_start);
+    njs_mp_free(vm->mem_pool, generator->code_start);
 
     generator->code_start = p;
     generator->code_end = p + size;
@@ -541,7 +541,7 @@ njs_generate_reserve(njs_vm_t *vm, njs_generator_t *generator, size_t size)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_name(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
@@ -549,14 +549,14 @@ njs_generate_name(njs_vm_t *vm, njs_generator_t *generator,
     njs_vmcode_object_copy_t  *copy;
 
     var = njs_variable_resolve(vm, node);
-    if (nxt_slow_path(var == NULL)) {
+    if (njs_slow_path(var == NULL)) {
         return njs_generate_reference_error(vm, generator, node);
     }
 
     if (var->type == NJS_VARIABLE_FUNCTION) {
 
         node->index = njs_generate_dest_index(vm, generator, node);
-        if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
+        if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
             return node->index;
         }
 
@@ -565,14 +565,14 @@ njs_generate_name(njs_vm_t *vm, njs_generator_t *generator,
         copy->retval = node->index;
         copy->object = var->index;
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     return njs_generate_variable(vm, generator, node);
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_builtin_object(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
@@ -580,13 +580,13 @@ njs_generate_builtin_object(njs_vm_t *vm, njs_generator_t *generator,
     njs_vmcode_object_copy_t  *copy;
 
     index = njs_variable_index(vm, node);
-    if (nxt_slow_path(index == NJS_INDEX_NONE)) {
-        return NXT_ERROR;
+    if (njs_slow_path(index == NJS_INDEX_NONE)) {
+        return NJS_ERROR;
     }
 
     node->index = njs_generate_dest_index(vm, generator, node);
-    if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     njs_generate_code(generator, njs_vmcode_object_copy_t, copy,
@@ -594,32 +594,32 @@ njs_generate_builtin_object(njs_vm_t *vm, njs_generator_t *generator,
     copy->retval = node->index;
     copy->object = index;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_variable(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_index_t  index;
 
     index = njs_variable_index(vm, node);
-    if (nxt_slow_path(index == NJS_INDEX_NONE)) {
+    if (njs_slow_path(index == NJS_INDEX_NONE)) {
         return njs_generate_reference_error(vm, generator, node);
     }
 
     node->index = index;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_var_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_index_t        index;
     njs_parser_node_t  *lvalue, *expr;
     njs_vmcode_move_t  *move;
@@ -627,8 +627,8 @@ njs_generate_var_statement(njs_vm_t *vm, njs_generator_t *generator,
     lvalue = node->left;
 
     index = njs_variable_index(vm, lvalue);
-    if (nxt_slow_path(index == NJS_INDEX_NONE)) {
-        return NXT_ERROR;
+    if (njs_slow_path(index == NJS_INDEX_NONE)) {
+        return NJS_ERROR;
     }
 
     lvalue->index = index;
@@ -637,13 +637,13 @@ njs_generate_var_statement(njs_vm_t *vm, njs_generator_t *generator,
 
     if (expr == NULL) {
         /* Variable is only declared. */
-        return NXT_OK;
+        return NJS_OK;
     }
 
     expr->dest = lvalue;
 
     ret = njs_generator(vm, generator, expr);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -658,23 +658,23 @@ njs_generate_var_statement(njs_vm_t *vm, njs_generator_t *generator,
     node->index = expr->index;
     node->temporary = expr->temporary;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_if_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_ret_t               jump_offset, label_offset;
-    nxt_int_t               ret;
+    njs_int_t               ret;
     njs_vmcode_jump_t       *jump;
     njs_vmcode_cond_jump_t  *cond_jump;
 
     /* The condition expression. */
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -683,7 +683,7 @@ njs_generate_if_statement(njs_vm_t *vm, njs_generator_t *generator,
     cond_jump->cond = node->left->index;
 
     ret = njs_generate_node_index_release(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -697,12 +697,12 @@ njs_generate_if_statement(njs_vm_t *vm, njs_generator_t *generator,
         node = node->right;
 
         ret = njs_generator(vm, generator, node->left);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
         ret = njs_generate_node_index_release(vm, generator, node->left);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -720,27 +720,27 @@ njs_generate_if_statement(njs_vm_t *vm, njs_generator_t *generator,
      */
 
     ret = njs_generator(vm, generator, node->right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     ret = njs_generate_node_index_release(vm, generator, node->right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     njs_code_set_offset(generator, label_offset, jump_offset);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_cond_expression(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_ret_t               jump_offset, cond_jump_offset;
-    nxt_int_t               ret;
+    njs_int_t               ret;
     njs_parser_node_t       *branch;
     njs_vmcode_move_t       *move;
     njs_vmcode_jump_t       *jump;
@@ -749,7 +749,7 @@ njs_generate_cond_expression(njs_vm_t *vm, njs_generator_t *generator,
     /* The condition expression. */
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -760,7 +760,7 @@ njs_generate_cond_expression(njs_vm_t *vm, njs_generator_t *generator,
     cond_jump->cond = node->left->index;
 
     node->index = njs_generate_dest_index(vm, generator, node);
-    if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
+    if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
         return node->index;
     }
 
@@ -769,7 +769,7 @@ njs_generate_cond_expression(njs_vm_t *vm, njs_generator_t *generator,
     /* The "true" branch. */
 
     ret = njs_generator(vm, generator, branch->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -785,7 +785,7 @@ njs_generate_cond_expression(njs_vm_t *vm, njs_generator_t *generator,
     }
 
     ret = njs_generate_node_index_release(vm, generator, branch->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -798,7 +798,7 @@ njs_generate_cond_expression(njs_vm_t *vm, njs_generator_t *generator,
     /* The "false" branch. */
 
     ret = njs_generator(vm, generator, branch->right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -810,20 +810,20 @@ njs_generate_cond_expression(njs_vm_t *vm, njs_generator_t *generator,
     njs_code_set_jump_offset(generator, njs_vmcode_cond_jump_t, jump_offset);
 
     ret = njs_generate_node_index_release(vm, generator, branch->right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_switch_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *swtch)
 {
     njs_ret_t                jump_offset;
-    nxt_int_t                ret;
+    njs_int_t                ret;
     njs_index_t              index;
     njs_parser_node_t        *node, *expr, *branch;
     njs_vmcode_move_t        *move;
@@ -836,7 +836,7 @@ njs_generate_switch_statement(njs_vm_t *vm, njs_generator_t *generator,
     expr = swtch->left;
 
     ret = njs_generator(vm, generator, expr);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -844,8 +844,8 @@ njs_generate_switch_statement(njs_vm_t *vm, njs_generator_t *generator,
 
     if (!expr->temporary) {
         index = njs_generate_temp_index_get(vm, generator, swtch);
-        if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
-            return NXT_ERROR;
+        if (njs_slow_path(index == NJS_INDEX_ERROR)) {
+            return NJS_ERROR;
         }
 
         njs_generate_code_move(generator, move, index, expr->index);
@@ -853,7 +853,7 @@ njs_generate_switch_statement(njs_vm_t *vm, njs_generator_t *generator,
 
     ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_SWITCH,
                                    &swtch->name);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -869,7 +869,7 @@ njs_generate_switch_statement(njs_vm_t *vm, njs_generator_t *generator,
             node = branch->right;
 
             ret = njs_generator(vm, generator, node->left);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -880,13 +880,13 @@ njs_generate_switch_statement(njs_vm_t *vm, njs_generator_t *generator,
             equal->value2 = node->left->index;
 
             ret = njs_generate_node_index_release(vm, generator, node->left);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
-            patch = nxt_mp_alloc(vm->mem_pool, sizeof(njs_generator_patch_t));
-            if (nxt_slow_path(patch == NULL)) {
-                return NXT_ERROR;
+            patch = njs_mp_alloc(vm->mem_pool, sizeof(njs_generator_patch_t));
+            if (njs_slow_path(patch == NULL)) {
+                return NJS_ERROR;
             }
 
             patch->jump_offset = njs_code_offset(generator, equal)
@@ -900,7 +900,7 @@ njs_generate_switch_statement(njs_vm_t *vm, njs_generator_t *generator,
 
     /* Release either temporary index or temporary expr->index. */
     ret = njs_generate_index_release(vm, generator, index);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -923,7 +923,7 @@ njs_generate_switch_statement(njs_vm_t *vm, njs_generator_t *generator,
 
             next = patch->next;
 
-            nxt_mp_free(vm->mem_pool, patch);
+            njs_mp_free(vm->mem_pool, patch);
 
             patch = next;
             node = branch->right;
@@ -932,7 +932,7 @@ njs_generate_switch_statement(njs_vm_t *vm, njs_generator_t *generator,
         /* The "case/default" statements. */
 
         ret = njs_generator(vm, generator, node->right);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
     }
@@ -945,16 +945,16 @@ njs_generate_switch_statement(njs_vm_t *vm, njs_generator_t *generator,
     /* Patch "break" statements offsets. */
     njs_generate_patch_block_exit(vm, generator);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_while_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_ret_t               jump_offset, loop_offset;
-    nxt_int_t               ret;
+    njs_int_t               ret;
     njs_parser_node_t       *condition;
     njs_vmcode_jump_t       *jump;
     njs_vmcode_cond_jump_t  *cond_jump;
@@ -972,14 +972,14 @@ njs_generate_while_statement(njs_vm_t *vm, njs_generator_t *generator,
 
     ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
                                    &node->name);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     loop_offset = njs_code_offset(generator, generator->code_end);
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -992,7 +992,7 @@ njs_generate_while_statement(njs_vm_t *vm, njs_generator_t *generator,
     condition = node->right;
 
     ret = njs_generator(vm, generator, condition);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1007,12 +1007,12 @@ njs_generate_while_statement(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_do_while_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_ret_t               loop_offset;
-    nxt_int_t               ret;
+    njs_int_t               ret;
     njs_parser_node_t       *condition;
     njs_vmcode_cond_jump_t  *cond_jump;
 
@@ -1020,14 +1020,14 @@ njs_generate_do_while_statement(njs_vm_t *vm, njs_generator_t *generator,
 
     ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
                                    &node->name);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     loop_offset = njs_code_offset(generator, generator->code_end);
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1038,7 +1038,7 @@ njs_generate_do_while_statement(njs_vm_t *vm, njs_generator_t *generator,
     condition = node->right;
 
     ret = njs_generator(vm, generator, condition);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1053,19 +1053,19 @@ njs_generate_do_while_statement(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_for_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_ret_t               jump_offset, loop_offset;
-    nxt_int_t               ret;
+    njs_int_t               ret;
     njs_parser_node_t       *condition, *update;
     njs_vmcode_jump_t       *jump;
     njs_vmcode_cond_jump_t  *cond_jump;
 
     ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
                                    &node->name);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1074,12 +1074,12 @@ njs_generate_for_statement(njs_vm_t *vm, njs_generator_t *generator,
     /* The loop initialization. */
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     ret = njs_generate_node_index_release(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1106,7 +1106,7 @@ njs_generate_for_statement(njs_vm_t *vm, njs_generator_t *generator,
     node = node->right;
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1117,12 +1117,12 @@ njs_generate_for_statement(njs_vm_t *vm, njs_generator_t *generator,
     update = node->right;
 
     ret = njs_generator(vm, generator, update);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     ret = njs_generate_node_index_release(vm, generator, update);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1132,7 +1132,7 @@ njs_generate_for_statement(njs_vm_t *vm, njs_generator_t *generator,
         njs_code_set_jump_offset(generator, njs_vmcode_jump_t, jump_offset);
 
         ret = njs_generator(vm, generator, condition);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -1151,16 +1151,16 @@ njs_generate_for_statement(njs_vm_t *vm, njs_generator_t *generator,
 
     njs_generate_patch_block_exit(vm, generator);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_for_in_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_ret_t                  loop_offset, prop_offset;
-    nxt_int_t                  ret;
+    njs_int_t                  ret;
     njs_index_t                index;
     njs_parser_node_t          *foreach;
     njs_vmcode_prop_next_t     *prop_next;
@@ -1168,7 +1168,7 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_generator_t *generator,
 
     ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
                                    &node->name);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1177,7 +1177,7 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_generator_t *generator,
     foreach = node->left;
 
     ret = njs_generator(vm, generator, foreach->right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1187,8 +1187,8 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_generator_t *generator,
     prop_foreach->object = foreach->right->index;
 
     index = njs_generate_temp_index_get(vm, generator, foreach->right);
-    if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     prop_foreach->next = index;
@@ -1198,7 +1198,7 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_generator_t *generator,
     loop_offset = njs_code_offset(generator, generator->code_end);
 
     ret = njs_generator(vm, generator, node->right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1209,7 +1209,7 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_code_set_jump_offset(generator, njs_vmcode_prop_foreach_t, prop_offset);
 
     ret = njs_generator(vm, generator, node->left->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1228,7 +1228,7 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_generator_t *generator,
      * or a property of another object and an iterator can be given with "let".
      */
     ret = njs_generate_children_indexes_release(vm, generator, foreach);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1236,15 +1236,15 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_start_block(njs_vm_t *vm, njs_generator_t *generator,
-    njs_generator_block_type_t type, const nxt_str_t *label)
+    njs_generator_block_type_t type, const njs_str_t *label)
 {
     njs_generator_block_t  *block;
 
-    block = nxt_mp_alloc(vm->mem_pool, sizeof(njs_generator_block_t));
+    block = njs_mp_alloc(vm->mem_pool, sizeof(njs_generator_block_t));
 
-    if (nxt_fast_path(block != NULL)) {
+    if (njs_fast_path(block != NULL)) {
         block->next = generator->block;
         generator->block = block;
 
@@ -1255,25 +1255,25 @@ njs_generate_start_block(njs_vm_t *vm, njs_generator_t *generator,
 
         block->index = 0;
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 static njs_generator_block_t *
 njs_generate_lookup_block(njs_generator_block_t *block, uint32_t mask,
-    const nxt_str_t *label)
+    const njs_str_t *label)
 {
-    if (nxt_strstr_eq(label, &return_label)) {
+    if (njs_strstr_eq(label, &return_label)) {
         mask = NJS_GENERATOR_TRY;
         label = &no_label;
     }
 
     while (block != NULL) {
         if ((block->type & mask) != 0
-            && (label->length == 0 || nxt_strstr_eq(&block->label, label)))
+            && (label->length == 0 || njs_strstr_eq(&block->label, label)))
         {
             return block;
         }
@@ -1287,7 +1287,7 @@ njs_generate_lookup_block(njs_generator_block_t *block, uint32_t mask,
 
 static njs_generator_block_t *
 njs_generate_find_block(njs_generator_block_t *block, uint32_t mask,
-    const nxt_str_t *label)
+    const njs_str_t *label)
 {
     njs_generator_block_t  *dest_block;
 
@@ -1297,7 +1297,7 @@ njs_generate_find_block(njs_generator_block_t *block, uint32_t mask,
      * loop or switch statement.
      */
     if ((mask & NJS_GENERATOR_ALL) == NJS_GENERATOR_ALL
-        && !nxt_strstr_eq(label, &no_label))
+        && !njs_strstr_eq(label, &no_label))
     {
         mask |= NJS_GENERATOR_BLOCK;
     }
@@ -1330,12 +1330,12 @@ njs_generate_find_block(njs_generator_block_t *block, uint32_t mask,
 
 static njs_generator_patch_t *
 njs_generate_make_continuation_patch(njs_vm_t *vm, njs_generator_block_t *block,
-    const nxt_str_t *label, njs_ret_t offset)
+    const njs_str_t *label, njs_ret_t offset)
 {
     njs_generator_patch_t  *patch;
 
-    patch = nxt_mp_alloc(vm->mem_pool, sizeof(njs_generator_patch_t));
-    if (nxt_slow_path(patch == NULL)) {
+    patch = njs_mp_alloc(vm->mem_pool, sizeof(njs_generator_patch_t));
+    if (njs_slow_path(patch == NULL)) {
         njs_memory_error(vm);
         return NULL;
     }
@@ -1361,19 +1361,19 @@ njs_generate_patch_block(njs_vm_t *vm, njs_generator_t *generator,
         njs_code_update_offset(generator, patch);
         next = patch->next;
 
-        nxt_mp_free(vm->mem_pool, patch);
+        njs_mp_free(vm->mem_pool, patch);
     }
 }
 
 
 static njs_generator_patch_t *
 njs_generate_make_exit_patch(njs_vm_t *vm, njs_generator_block_t *block,
-    const nxt_str_t *label, njs_ret_t offset)
+    const njs_str_t *label, njs_ret_t offset)
 {
     njs_generator_patch_t  *patch;
 
-    patch = nxt_mp_alloc(vm->mem_pool, sizeof(njs_generator_patch_t));
-    if (nxt_slow_path(patch == NULL)) {
+    patch = njs_mp_alloc(vm->mem_pool, sizeof(njs_generator_patch_t));
+    if (njs_slow_path(patch == NULL)) {
         njs_memory_error(vm);
         return NULL;
     }
@@ -1399,17 +1399,17 @@ njs_generate_patch_block_exit(njs_vm_t *vm, njs_generator_t *generator)
 
     njs_generate_patch_block(vm, generator, block->exit);
 
-    nxt_mp_free(vm->mem_pool, block);
+    njs_mp_free(vm->mem_pool, block);
 }
 
 
 /*
  * TODO: support multiple destination points from within try-catch block.
  */
-static const nxt_str_t *
+static const njs_str_t *
 njs_generate_jump_destination(njs_vm_t *vm, njs_generator_block_t *block,
-    const char *inst_type, uint32_t mask, const nxt_str_t *label1,
-    const nxt_str_t *label2)
+    const char *inst_type, uint32_t mask, const njs_str_t *label1,
+    const njs_str_t *label2)
 {
     njs_generator_block_t  *block1, *block2;
 
@@ -1437,11 +1437,11 @@ njs_generate_jump_destination(njs_vm_t *vm, njs_generator_block_t *block,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_continue_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    const nxt_str_t        *label, *dest;
+    const njs_str_t        *label, *dest;
     njs_vmcode_jump_t      *jump;
     njs_generator_patch_t  *patch;
     njs_generator_block_t  *block;
@@ -1451,7 +1451,7 @@ njs_generate_continue_statement(njs_vm_t *vm, njs_generator_t *generator,
     block = njs_generate_find_block(generator->block, NJS_GENERATOR_LOOP,
                                     label);
 
-    if (nxt_slow_path(block == NULL)) {
+    if (njs_slow_path(block == NULL)) {
         goto syntax_error;
     }
 
@@ -1460,8 +1460,8 @@ njs_generate_continue_statement(njs_vm_t *vm, njs_generator_t *generator,
                                              NJS_GENERATOR_LOOP,
                                              &block->continuation->label,
                                              label);
-        if (nxt_slow_path(dest == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(dest == NULL)) {
+            return NJS_ERROR;
         }
     }
 
@@ -1471,25 +1471,25 @@ njs_generate_continue_statement(njs_vm_t *vm, njs_generator_t *generator,
     patch = njs_generate_make_continuation_patch(vm, block, label,
                                          njs_code_offset(generator, jump)
                                          + offsetof(njs_vmcode_jump_t, offset));
-    if (nxt_slow_path(patch == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(patch == NULL)) {
+        return NJS_ERROR;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 
 syntax_error:
 
     njs_generate_syntax_error(vm, node, "Illegal continue statement");
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_break_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    const nxt_str_t        *label, *dest;
+    const njs_str_t        *label, *dest;
     njs_vmcode_jump_t      *jump;
     njs_generator_patch_t  *patch;
     njs_generator_block_t  *block;
@@ -1497,7 +1497,7 @@ njs_generate_break_statement(njs_vm_t *vm, njs_generator_t *generator,
     label = &node->name;
 
     block = njs_generate_find_block(generator->block, NJS_GENERATOR_ALL, label);
-    if (nxt_slow_path(block == NULL)) {
+    if (njs_slow_path(block == NULL)) {
         goto syntax_error;
      }
 
@@ -1505,8 +1505,8 @@ njs_generate_break_statement(njs_vm_t *vm, njs_generator_t *generator,
         dest = njs_generate_jump_destination(vm, block->next, "break/return",
                                              NJS_GENERATOR_ALL,
                                              &block->exit->label, label);
-        if (nxt_slow_path(dest == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(dest == NULL)) {
+            return NJS_ERROR;
         }
     }
 
@@ -1516,29 +1516,29 @@ njs_generate_break_statement(njs_vm_t *vm, njs_generator_t *generator,
     patch = njs_generate_make_exit_patch(vm, block, label,
                                          njs_code_offset(generator, jump)
                                          + offsetof(njs_vmcode_jump_t, offset));
-    if (nxt_slow_path(patch == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(patch == NULL)) {
+        return NJS_ERROR;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 
 syntax_error:
 
     njs_generate_syntax_error(vm, node, "Illegal break statement");
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t  ret;
+    njs_int_t  ret;
 
     ret = njs_generate_children(vm, generator, node);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return njs_generate_node_index_release(vm, generator, node->right);
     }
 
@@ -1546,20 +1546,20 @@ njs_generate_statement(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_block_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t  ret;
+    njs_int_t  ret;
 
     ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_BLOCK,
                                    &node->name);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     ret = njs_generate_statement(vm, generator, node);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1569,19 +1569,19 @@ njs_generate_block_statement(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_children(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t  ret;
+    njs_int_t  ret;
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     ret = njs_generate_node_index_release(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1589,17 +1589,17 @@ njs_generate_children(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_stop_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_index_t        index;
     njs_vmcode_stop_t  *stop;
 
     ret = njs_generate_children(vm, generator, node);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         njs_generate_code(generator, njs_vmcode_stop_t, stop,
                           NJS_VMCODE_STOP, 1);
 
@@ -1622,15 +1622,15 @@ njs_generate_stop_statement(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_comma_expression(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t  ret;
+    njs_int_t  ret;
 
     ret = njs_generate_children(vm, generator, node);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         node->index = node->right->index;
     }
 
@@ -1638,11 +1638,11 @@ njs_generate_comma_expression(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_assignment(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t              ret;
+    njs_int_t              ret;
     njs_index_t            index, src;
     njs_parser_node_t      *lvalue, *expr, *object, *property;
     njs_vmcode_move_t      *move;
@@ -1655,14 +1655,14 @@ njs_generate_assignment(njs_vm_t *vm, njs_generator_t *generator,
     if (lvalue->token == NJS_TOKEN_NAME) {
 
         ret = njs_generate_variable(vm, generator, lvalue);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
         expr->dest = lvalue;
 
         ret = njs_generator(vm, generator, expr);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -1677,7 +1677,7 @@ njs_generate_assignment(njs_vm_t *vm, njs_generator_t *generator,
         node->index = expr->index;
         node->temporary = expr->temporary;
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     /* lvalue->token == NJS_TOKEN_PROPERTY(_INIT) */
@@ -1687,7 +1687,7 @@ njs_generate_assignment(njs_vm_t *vm, njs_generator_t *generator,
     object = lvalue->left;
 
     ret = njs_generator(vm, generator, object);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1696,11 +1696,11 @@ njs_generate_assignment(njs_vm_t *vm, njs_generator_t *generator,
     property = lvalue->right;
 
     ret = njs_generator(vm, generator, property);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
-    if (nxt_slow_path(njs_parser_has_side_effect(expr))) {
+    if (njs_slow_path(njs_parser_has_side_effect(expr))) {
         /*
          * Preserve object and property values stored in variables in a case
          * if the variables can be changed by side effects in expression.
@@ -1709,8 +1709,8 @@ njs_generate_assignment(njs_vm_t *vm, njs_generator_t *generator,
             src = object->index;
 
             index = njs_generate_node_temp_index_get(vm, generator, object);
-            if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
-                return NXT_ERROR;
+            if (njs_slow_path(index == NJS_INDEX_ERROR)) {
+                return NJS_ERROR;
             }
 
             njs_generate_code_move(generator, move, index, src);
@@ -1720,8 +1720,8 @@ njs_generate_assignment(njs_vm_t *vm, njs_generator_t *generator,
             src = property->index;
 
             index = njs_generate_node_temp_index_get(vm, generator, property);
-            if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
-                return NXT_ERROR;
+            if (njs_slow_path(index == NJS_INDEX_ERROR)) {
+                return NJS_ERROR;
             }
 
             njs_generate_code_move(generator, move, index, src);
@@ -1729,7 +1729,7 @@ njs_generate_assignment(njs_vm_t *vm, njs_generator_t *generator,
     }
 
     ret = njs_generator(vm, generator, expr);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1752,11 +1752,11 @@ njs_generate_assignment(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_operation_assignment(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t              ret;
+    njs_int_t              ret;
     njs_index_t            index;
     njs_parser_node_t      *lvalue, *expr, *object, *property;
     njs_vmcode_move_t      *move;
@@ -1769,14 +1769,14 @@ njs_generate_operation_assignment(njs_vm_t *vm, njs_generator_t *generator,
     if (lvalue->token == NJS_TOKEN_NAME) {
 
         ret = njs_generate_variable(vm, generator, lvalue);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
         index = lvalue->index;
         expr = node->right;
 
-        if (nxt_slow_path(njs_parser_has_side_effect(expr))) {
+        if (njs_slow_path(njs_parser_has_side_effect(expr))) {
             /* Preserve variable value if it may be changed by expression. */
 
             njs_generate_code(generator, njs_vmcode_move_t, move,
@@ -1784,15 +1784,15 @@ njs_generate_operation_assignment(njs_vm_t *vm, njs_generator_t *generator,
             move->src = lvalue->index;
 
             index = njs_generate_temp_index_get(vm, generator, expr);
-            if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
-                return NXT_ERROR;
+            if (njs_slow_path(index == NJS_INDEX_ERROR)) {
+                return NJS_ERROR;
             }
 
             move->dst = index;
         }
 
         ret = njs_generator(vm, generator, expr);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -1806,7 +1806,7 @@ njs_generate_operation_assignment(njs_vm_t *vm, njs_generator_t *generator,
 
         if (lvalue->index != index) {
             ret = njs_generate_index_release(vm, generator, index);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
         }
@@ -1821,7 +1821,7 @@ njs_generate_operation_assignment(njs_vm_t *vm, njs_generator_t *generator,
     object = lvalue->left;
 
     ret = njs_generator(vm, generator, object);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1830,13 +1830,13 @@ njs_generate_operation_assignment(njs_vm_t *vm, njs_generator_t *generator,
     property = lvalue->right;
 
     ret = njs_generator(vm, generator, property);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     index = njs_generate_node_temp_index_get(vm, generator, node);
-    if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     njs_generate_code(generator, njs_vmcode_prop_get_t, prop_get,
@@ -1848,7 +1848,7 @@ njs_generate_operation_assignment(njs_vm_t *vm, njs_generator_t *generator,
     expr = node->right;
 
     ret = njs_generator(vm, generator, expr);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1865,7 +1865,7 @@ njs_generate_operation_assignment(njs_vm_t *vm, njs_generator_t *generator,
     prop_set->property = property->index;
 
     ret = njs_generate_children_indexes_release(vm, generator, lvalue);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1873,15 +1873,15 @@ njs_generate_operation_assignment(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_object(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_vmcode_object_t  *object;
 
     node->index = njs_generate_object_dest_index(vm, generator, node);
-    if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     njs_generate_code(generator, njs_vmcode_object_t, object,
@@ -1893,15 +1893,15 @@ njs_generate_object(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_array(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_vmcode_array_t  *array;
 
     node->index = njs_generate_object_dest_index(vm, generator, node);
-    if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     njs_generate_code(generator, njs_vmcode_array_t, array,
@@ -1915,13 +1915,13 @@ njs_generate_array(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_function(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t              ret;
-    nxt_bool_t             module;
-    const nxt_str_t        *name;
+    njs_int_t              ret;
+    njs_bool_t             module;
+    const njs_str_t        *name;
     njs_function_lambda_t  *lambda;
     njs_vmcode_function_t  *function;
 
@@ -1932,14 +1932,14 @@ njs_generate_function(njs_vm_t *vm, njs_generator_t *generator,
 
     ret = njs_generate_function_scope(vm, lambda, node, name);
 
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     if (vm->debug != NULL) {
         ret = njs_generate_function_debug(vm, name, lambda,
                                           module ? node->right : node);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
     }
@@ -1949,25 +1949,25 @@ njs_generate_function(njs_vm_t *vm, njs_generator_t *generator,
     function->lambda = lambda;
 
     node->index = njs_generate_object_dest_index(vm, generator, node);
-    if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     function->retval = node->index;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_regexp(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_vmcode_regexp_t  *regexp;
 
     node->index = njs_generate_object_dest_index(vm, generator, node);
-    if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     njs_generate_code(generator, njs_vmcode_regexp_t, regexp,
@@ -1975,19 +1975,19 @@ njs_generate_regexp(njs_vm_t *vm, njs_generator_t *generator,
     regexp->retval = node->index;
     regexp->pattern = node->u.value.data.u.data;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_template_literal(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t                      ret;
+    njs_int_t                      ret;
     njs_vmcode_template_literal_t  *code;
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -1997,21 +1997,21 @@ njs_generate_template_literal(njs_vm_t *vm, njs_generator_t *generator,
 
     node->index = node->left->index;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_test_jump_expression(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_ret_t               jump_offset;
-    nxt_int_t               ret;
+    njs_int_t               ret;
     njs_vmcode_move_t       *move;
     njs_vmcode_test_jump_t  *test_jump;
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2021,14 +2021,14 @@ njs_generate_test_jump_expression(njs_vm_t *vm, njs_generator_t *generator,
     test_jump->value = node->left->index;
 
     node->index = njs_generate_node_temp_index_get(vm, generator, node);
-    if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
+    if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
         return node->index;
     }
 
     test_jump->retval = node->index;
 
     ret = njs_generator(vm, generator, node->right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2049,11 +2049,11 @@ njs_generate_test_jump_expression(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_3addr_operation(njs_vm_t *vm, njs_generator_t *generator,
-    njs_parser_node_t *node, nxt_bool_t swap)
+    njs_parser_node_t *node, njs_bool_t swap)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_index_t         index;
     njs_parser_node_t   *left, *right;
     njs_vmcode_move_t   *move;
@@ -2062,7 +2062,7 @@ njs_generate_3addr_operation(njs_vm_t *vm, njs_generator_t *generator,
     left = node->left;
 
     ret = njs_generator(vm, generator, left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2070,14 +2070,14 @@ njs_generate_3addr_operation(njs_vm_t *vm, njs_generator_t *generator,
 
     if (left->token == NJS_TOKEN_NAME) {
 
-        if (nxt_slow_path(njs_parser_has_side_effect(right))) {
+        if (njs_slow_path(njs_parser_has_side_effect(right))) {
             njs_generate_code(generator, njs_vmcode_move_t, move,
                               NJS_VMCODE_MOVE, 2);
             move->src = left->index;
 
             index = njs_generate_node_temp_index_get(vm, generator, left);
-            if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
-                return NXT_ERROR;
+            if (njs_slow_path(index == NJS_INDEX_ERROR)) {
+                return NJS_ERROR;
             }
 
             move->dst = index;
@@ -2085,7 +2085,7 @@ njs_generate_3addr_operation(njs_vm_t *vm, njs_generator_t *generator,
     }
 
     ret = njs_generator(vm, generator, right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2106,28 +2106,28 @@ njs_generate_3addr_operation(njs_vm_t *vm, njs_generator_t *generator,
      * will be released here as index of node->left.
      */
     node->index = njs_generate_dest_index(vm, generator, node);
-    if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
+    if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
         return node->index;
     }
 
     code->dst = node->index;
 
-    nxt_thread_log_debug("CODE3  %p, %p, %p",
+    njs_thread_log_debug("CODE3  %p, %p, %p",
                          code->dst, code->src1, code->src2);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_2addr_operation(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_vmcode_2addr_t  *code;
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2136,23 +2136,23 @@ njs_generate_2addr_operation(njs_vm_t *vm, njs_generator_t *generator,
     code->src = node->left->index;
 
     node->index = njs_generate_dest_index(vm, generator, node);
-    if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
+    if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
         return node->index;
     }
 
     code->dst = node->index;
 
-    nxt_thread_log_debug("CODE2  %p, %p", code->dst, code->src);
+    njs_thread_log_debug("CODE2  %p, %p", code->dst, code->src);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_typeof_operation(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_parser_node_t   *expr;
     njs_vmcode_2addr_t  *code;
 
@@ -2163,8 +2163,8 @@ njs_generate_typeof_operation(njs_vm_t *vm, njs_generator_t *generator,
 
         if (expr->u.reference.variable) {
             ret = njs_generate_variable(vm, generator, expr);
-            if (nxt_slow_path(ret != NXT_OK)) {
-                return NXT_ERROR;
+            if (njs_slow_path(ret != NJS_OK)) {
+                return NJS_ERROR;
             }
 
         } else {
@@ -2174,7 +2174,7 @@ njs_generate_typeof_operation(njs_vm_t *vm, njs_generator_t *generator,
 
     } else {
         ret = njs_generator(vm, generator, node->left);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
     }
@@ -2184,23 +2184,23 @@ njs_generate_typeof_operation(njs_vm_t *vm, njs_generator_t *generator,
     code->src = node->left->index;
 
     node->index = njs_generate_dest_index(vm, generator, node);
-    if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
+    if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
         return node->index;
     }
 
     code->dst = node->index;
 
-    nxt_thread_log_debug("CODE2  %p, %p", code->dst, code->src);
+    njs_thread_log_debug("CODE2  %p, %p", code->dst, code->src);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_inc_dec_operation(njs_vm_t *vm, njs_generator_t *generator,
-    njs_parser_node_t *node, nxt_bool_t post)
+    njs_parser_node_t *node, njs_bool_t post)
 {
-    nxt_int_t              ret;
+    njs_int_t              ret;
     njs_index_t            index, dest_index;
     njs_parser_node_t      *lvalue;
     njs_vmcode_3addr_t     *code;
@@ -2212,12 +2212,12 @@ njs_generate_inc_dec_operation(njs_vm_t *vm, njs_generator_t *generator,
     if (lvalue->token == NJS_TOKEN_NAME) {
 
         ret = njs_generate_variable(vm, generator, lvalue);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
         index = njs_generate_dest_index(vm, generator, node);
-        if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
+        if (njs_slow_path(index == NJS_INDEX_ERROR)) {
             return index;
         }
 
@@ -2229,7 +2229,7 @@ njs_generate_inc_dec_operation(njs_vm_t *vm, njs_generator_t *generator,
         code->src1 = lvalue->index;
         code->src2 = lvalue->index;
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     /* lvalue->token == NJS_TOKEN_PROPERTY */
@@ -2237,14 +2237,14 @@ njs_generate_inc_dec_operation(njs_vm_t *vm, njs_generator_t *generator,
     /* Object. */
 
     ret = njs_generator(vm, generator, lvalue->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     /* Property. */
 
     ret = njs_generator(vm, generator, lvalue->right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2267,8 +2267,8 @@ found:
     index = post ? njs_generate_temp_index_get(vm, generator, node)
                  : dest_index;
 
-    if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     njs_generate_code(generator, njs_vmcode_prop_get_t, prop_get,
@@ -2291,7 +2291,7 @@ found:
 
     if (post) {
         ret = njs_generate_index_release(vm, generator, index);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
     }
@@ -2300,29 +2300,29 @@ found:
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_function_declaration(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t              ret;
+    njs_int_t              ret;
     njs_variable_t         *var;
     njs_function_lambda_t  *lambda;
 
     var = njs_variable_resolve(vm, node);
-    if (nxt_slow_path(var == NULL)) {
+    if (njs_slow_path(var == NULL)) {
         return njs_generate_reference_error(vm, generator, node);
     }
 
     if (!njs_is_function(&var->value)) {
         /* A variable was declared with the same name. */
-        return NXT_OK;
+        return NJS_OK;
     }
 
     lambda = njs_function_lambda(&var->value);
 
     ret = njs_generate_function_scope(vm, lambda, node,
                                       &node->u.reference.name);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2334,22 +2334,22 @@ njs_generate_function_declaration(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_function_scope(njs_vm_t *vm, njs_function_lambda_t *lambda,
-    njs_parser_node_t *node, const nxt_str_t *name)
+    njs_parser_node_t *node, const njs_str_t *name)
 {
     size_t           size;
-    nxt_int_t        ret;
-    nxt_array_t      *closure;
+    njs_arr_t        *closure;
+    njs_int_t        ret;
     njs_generator_t  generator;
 
     node = node->right;
 
-    nxt_memzero(&generator, sizeof(njs_generator_t));
+    njs_memzero(&generator, sizeof(njs_generator_t));
 
     ret = njs_generate_scope(vm, &generator, node->scope, name);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         size = 0;
         closure = node->scope->values[1];
 
@@ -2372,35 +2372,35 @@ njs_generate_function_scope(njs_vm_t *vm, njs_function_lambda_t *lambda,
 }
 
 
-nxt_int_t
+njs_int_t
 njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator,
-    njs_parser_scope_t *scope, const nxt_str_t *name)
+    njs_parser_scope_t *scope, const njs_str_t *name)
 {
     u_char         *p;
     size_t          size;
     uintptr_t       scope_size;
-    nxt_int_t       ret;
-    nxt_uint_t      n;
+    njs_int_t       ret;
+    njs_uint_t      n;
     njs_value_t    *value;
     njs_vm_code_t  *code;
 
     generator->code_size = 128;
 
-    p = nxt_mp_alloc(vm->mem_pool, generator->code_size);
-    if (nxt_slow_path(p == NULL)) {
-        return NXT_ERROR;
+    p = njs_mp_alloc(vm->mem_pool, generator->code_size);
+    if (njs_slow_path(p == NULL)) {
+        return NJS_ERROR;
     }
 
     generator->code_start = p;
     generator->code_end = p;
 
     ret = njs_generate_lambda_variables(vm, generator, scope->top);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
-    if (nxt_slow_path(njs_generator(vm, generator, scope->top) != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(njs_generator(vm, generator, scope->top) != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     generator->code_size = generator->code_end - generator->code_start;
@@ -2411,16 +2411,16 @@ njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator,
         scope_size -= NJS_INDEX_GLOBAL_OFFSET;
     }
 
-    generator->local_scope = nxt_mp_alloc(vm->mem_pool, scope_size);
-    if (nxt_slow_path(generator->local_scope == NULL)) {
-        return NXT_ERROR;
+    generator->local_scope = njs_mp_alloc(vm->mem_pool, scope_size);
+    if (njs_slow_path(generator->local_scope == NULL)) {
+        return NJS_ERROR;
     }
 
     generator->scope_size = scope_size;
 
     size = scope->values[0]->items * sizeof(njs_value_t);
 
-    nxt_thread_log_debug("SCOPE SIZE: %uz %uz", size, scope_size);
+    njs_thread_log_debug("SCOPE SIZE: %uz %uz", size, scope_size);
 
     p = memcpy(generator->local_scope, scope->values[0]->start, size);
     value = (njs_value_t *) (p + size);
@@ -2430,16 +2430,16 @@ njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator,
     }
 
     if (vm->codes == NULL) {
-        vm->codes = nxt_array_create(4, sizeof(njs_vm_code_t),
-                                    &njs_array_mem_proto, vm->mem_pool);
-        if (nxt_slow_path(vm->codes == NULL)) {
-            return NXT_ERROR;
+        vm->codes = njs_arr_create(4, sizeof(njs_vm_code_t),
+                                   &njs_array_mem_proto, vm->mem_pool);
+        if (njs_slow_path(vm->codes == NULL)) {
+            return NJS_ERROR;
         }
     }
 
-    code = nxt_array_add(vm->codes, &njs_array_mem_proto, vm->mem_pool);
-    if (nxt_slow_path(code == NULL)) {
-        return NXT_ERROR;
+    code = njs_arr_add(vm->codes, &njs_array_mem_proto, vm->mem_pool);
+    if (njs_slow_path(code == NULL)) {
+        return NJS_ERROR;
     }
 
     code->start = generator->code_start;
@@ -2447,25 +2447,25 @@ njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator,
     code->file = scope->file;
     code->name = *name;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_lambda_variables(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_index_t             index;
     njs_variable_t          *var;
     njs_vmcode_move_t       *move;
-    nxt_lvlhsh_each_t       lhe;
+    njs_lvlhsh_each_t       lhe;
     njs_vmcode_this_t       *this;
     njs_vmcode_arguments_t  *arguments;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_variables_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_variables_hash_proto);
 
     for ( ;; ) {
-        var = nxt_lvlhsh_each(&node->scope->variables, &lhe);
+        var = njs_lvlhsh_each(&node->scope->variables, &lhe);
 
         if (var == NULL) {
             break;
@@ -2490,24 +2490,24 @@ njs_generate_lambda_variables(njs_vm_t *vm, njs_generator_t *generator,
         }
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_return_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t                ret;
+    njs_int_t                ret;
     njs_index_t              index;
-    const nxt_str_t          *dest;
+    const njs_str_t          *dest;
     njs_vmcode_return_t      *code;
     njs_generator_patch_t    *patch;
     njs_generator_block_t    *block, *immediate, *top;
     njs_vmcode_try_return_t  *try_return;
 
     ret = njs_generator(vm, generator, node->right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2521,13 +2521,13 @@ njs_generate_return_statement(njs_vm_t *vm, njs_generator_t *generator,
     immediate = njs_generate_lookup_block(generator->block, NJS_GENERATOR_TRY,
                                           &no_label);
 
-    if (nxt_fast_path(immediate == NULL)) {
+    if (njs_fast_path(immediate == NULL)) {
         njs_generate_code(generator, njs_vmcode_return_t, code,
                           NJS_VMCODE_RETURN, 1);
         code->retval = index;
         node->index = index;
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     if (immediate->type == NJS_GENERATOR_TRY && immediate->exit != NULL) {
@@ -2536,8 +2536,8 @@ njs_generate_return_statement(njs_vm_t *vm, njs_generator_t *generator,
                                              NJS_GENERATOR_ALL,
                                              &immediate->exit->label,
                                              &return_label);
-        if (nxt_slow_path(dest == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(dest == NULL)) {
+            return NJS_ERROR;
         }
     }
 
@@ -2562,15 +2562,15 @@ njs_generate_return_statement(njs_vm_t *vm, njs_generator_t *generator,
                                          njs_code_offset(generator, try_return)
                                          + offsetof(njs_vmcode_try_return_t,
                                                     offset));
-    if (nxt_slow_path(patch == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(patch == NULL)) {
+        return NJS_ERROR;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_function_call(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
@@ -2582,7 +2582,7 @@ njs_generate_function_call(njs_vm_t *vm, njs_generator_t *generator,
     if (node->left != NULL) {
         /* Generate function code in function expression. */
         ret = njs_generator(vm, generator, node->left);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -2590,7 +2590,7 @@ njs_generate_function_call(njs_vm_t *vm, njs_generator_t *generator,
 
     } else {
         ret = njs_generate_variable(vm, generator, node);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -2598,7 +2598,7 @@ njs_generate_function_call(njs_vm_t *vm, njs_generator_t *generator,
     }
 
     if (node->u.reference.not_defined) {
-        return NXT_OK;
+        return NJS_OK;
     }
 
     njs_generate_code(generator, njs_vmcode_function_frame_t, func,
@@ -2609,23 +2609,23 @@ njs_generate_function_call(njs_vm_t *vm, njs_generator_t *generator,
 
     ret = njs_generate_call(vm, generator, node);
 
-    if (nxt_fast_path(ret >= 0)) {
+    if (njs_fast_path(ret >= 0)) {
         func = njs_code_ptr(generator, njs_vmcode_function_frame_t,
                             func_offset);
         func->nargs = ret;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     return ret;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_method_call(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_ret_t                  method_offset;
-    nxt_int_t                  ret;
+    njs_int_t                  ret;
     njs_parser_node_t          *prop;
     njs_vmcode_method_frame_t  *method;
 
@@ -2634,14 +2634,14 @@ njs_generate_method_call(njs_vm_t *vm, njs_generator_t *generator,
     /* Object. */
 
     ret = njs_generator(vm, generator, prop->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     /* Method name. */
 
     ret = njs_generator(vm, generator, prop->right);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2653,29 +2653,29 @@ njs_generate_method_call(njs_vm_t *vm, njs_generator_t *generator,
     method->method = prop->right->index;
 
     ret = njs_generate_children_indexes_release(vm, generator, prop);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     ret = njs_generate_call(vm, generator, node);
 
-    if (nxt_fast_path(ret >= 0)) {
+    if (njs_fast_path(ret >= 0)) {
         method = njs_code_ptr(generator, njs_vmcode_method_frame_t,
                               method_offset);
         method->nargs = ret;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     return ret;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_call(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t                   ret;
-    nxt_uint_t                  nargs;
+    njs_int_t                   ret;
+    njs_uint_t                  nargs;
     njs_index_t                 retval;
     njs_parser_node_t           *arg;
     njs_vmcode_move_t           *move;
@@ -2687,7 +2687,7 @@ njs_generate_call(njs_vm_t *vm, njs_generator_t *generator,
         nargs++;
 
         ret = njs_generator(vm, generator, arg->left);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -2698,7 +2698,7 @@ njs_generate_call(njs_vm_t *vm, njs_generator_t *generator,
     }
 
     retval = njs_generate_dest_index(vm, generator, node);
-    if (nxt_slow_path(retval == NJS_INDEX_ERROR)) {
+    if (njs_slow_path(retval == NJS_INDEX_ERROR)) {
         return retval;
     }
 
@@ -2734,17 +2734,17 @@ njs_generate_call(njs_vm_t *vm, njs_generator_t *generator,
     } while (0)
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_ret_t                    try_offset, try_end_offset, catch_offset,
                                  catch_end_offset;
-    nxt_int_t                    ret;
+    njs_int_t                    ret;
     njs_index_t                  exception_index, exit_index, catch_index;
-    nxt_str_t                    try_cont_label, try_exit_label,
+    njs_str_t                    try_cont_label, try_exit_label,
                                  catch_cont_label, catch_exit_label;
-    const nxt_str_t              *dest_label;
+    const njs_str_t              *dest_label;
     njs_vmcode_catch_t           *catch;
     njs_vmcode_finally_t         *finally;
     njs_vmcode_try_end_t         *try_end, *catch_end;
@@ -2758,8 +2758,8 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
     try_offset = njs_code_offset(generator, try_start);
 
     exception_index = njs_generate_temp_index_get(vm, generator, node);
-    if (nxt_slow_path(exception_index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(exception_index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     try_start->exception_value = exception_index;
@@ -2771,14 +2771,14 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
      */
 
     exit_index = njs_generate_temp_index_get(vm, generator, node);
-    if (nxt_slow_path(exit_index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(exit_index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     try_start->exit_value = exit_index;
 
     ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_TRY, &no_label);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2786,7 +2786,7 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
     try_block->index = exit_index;
 
     ret = njs_generator(vm, generator, node->left);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2842,14 +2842,14 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
         /* A "try/catch" case. */
 
         catch_index = njs_variable_index(vm, node->left);
-        if (nxt_slow_path(catch_index == NJS_INDEX_NONE)) {
-            return NXT_ERROR;
+        if (njs_slow_path(catch_index == NJS_INDEX_NONE)) {
+            return NJS_ERROR;
         }
 
         njs_generate_code_catch(generator, catch, catch_index);
 
         ret = njs_generator(vm, generator, node->right);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -2872,8 +2872,8 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
                                                              &try_cont_label,
                             njs_code_offset(generator, finally)
                              + offsetof(njs_vmcode_finally_t, continue_offset));
-                if (nxt_slow_path(patch == NULL)) {
-                    return NXT_ERROR;
+                if (njs_slow_path(patch == NULL)) {
+                    return NJS_ERROR;
                 }
             }
 
@@ -2887,8 +2887,8 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
                                                          &try_exit_label,
                                 njs_code_offset(generator, finally)
                                 + offsetof(njs_vmcode_finally_t, break_offset));
-                    if (nxt_slow_path(patch == NULL)) {
-                        return NXT_ERROR;
+                    if (njs_slow_path(patch == NULL)) {
+                        return NJS_ERROR;
                     }
                 }
             }
@@ -2901,8 +2901,8 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
             /* A try/catch/finally case. */
 
             catch_index = njs_variable_index(vm, node->left->left);
-            if (nxt_slow_path(catch_index == NJS_INDEX_NONE)) {
-                return NXT_ERROR;
+            if (njs_slow_path(catch_index == NJS_INDEX_NONE)) {
+                return NJS_ERROR;
             }
 
             njs_generate_code_catch(generator, catch, catch_index);
@@ -2910,7 +2910,7 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
 
             ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_TRY,
                                            &no_label);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -2918,7 +2918,7 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
             catch_block->index = exit_index;
 
             ret = njs_generator(vm, generator, node->left->right);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -2983,7 +2983,7 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
         njs_code_set_jump_offset(generator, njs_vmcode_try_end_t, try_offset);
 
         ret = njs_generator(vm, generator, node->right);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -2998,8 +2998,8 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
                                                        NJS_GENERATOR_LOOP,
                                                        &try_cont_label,
                                                        &catch_cont_label);
-            if (nxt_slow_path(dest_label == NULL)) {
-                return NXT_ERROR;
+            if (njs_slow_path(dest_label == NULL)) {
+                return NJS_ERROR;
             }
 
             /*
@@ -3012,8 +3012,8 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
             patch = njs_generate_make_continuation_patch(vm, block, dest_label,
                              njs_code_offset(generator, finally)
                              + offsetof(njs_vmcode_finally_t, continue_offset));
-            if (nxt_slow_path(patch == NULL)) {
-                return NXT_ERROR;
+            if (njs_slow_path(patch == NULL)) {
+                return NJS_ERROR;
             }
         }
 
@@ -3026,8 +3026,8 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
                                                        | NJS_GENERATOR_TRY,
                                                        &try_exit_label,
                                                        &catch_exit_label);
-            if (nxt_slow_path(dest_label == NULL)) {
-                return NXT_ERROR;
+            if (njs_slow_path(dest_label == NULL)) {
+                return NJS_ERROR;
             }
 
             /*
@@ -3041,8 +3041,8 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
                 patch = njs_generate_make_exit_patch(vm, block, dest_label,
                                 njs_code_offset(generator, finally)
                                 + offsetof(njs_vmcode_finally_t, break_offset));
-                if (nxt_slow_path(patch == NULL)) {
-                    return NXT_ERROR;
+                if (njs_slow_path(patch == NULL)) {
+                    return NJS_ERROR;
                 }
             }
         }
@@ -3052,16 +3052,16 @@ njs_generate_try_statement(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_throw_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_vmcode_throw_t  *throw;
 
     ret = njs_generator(vm, generator, node->right);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         njs_generate_code(generator, njs_vmcode_throw_t, throw,
                           NJS_VMCODE_THROW, 1);
 
@@ -3073,11 +3073,11 @@ njs_generate_throw_statement(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_import_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t                 ret;
+    njs_int_t                 ret;
     njs_index_t               index;
     njs_module_t              *module;
     njs_parser_node_t         *lvalue, *expr;
@@ -3087,13 +3087,13 @@ njs_generate_import_statement(njs_vm_t *vm, njs_generator_t *generator,
     expr = node->right;
 
     index = njs_variable_index(vm, lvalue);
-    if (nxt_slow_path(index == NJS_INDEX_NONE)) {
-        return NXT_ERROR;
+    if (njs_slow_path(index == NJS_INDEX_NONE)) {
+        return NJS_ERROR;
     }
 
     if (expr->left != NULL) {
         ret = njs_generator(vm, generator, expr->left);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
     }
@@ -3105,22 +3105,22 @@ njs_generate_import_statement(njs_vm_t *vm, njs_generator_t *generator,
     copy->retval = index;
     copy->object = module->index;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_export_statement(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t            ret;
+    njs_int_t            ret;
     njs_parser_node_t    *obj;
     njs_vmcode_return_t  *code;
 
     obj = node->right;
 
     ret = njs_generator(vm, generator, obj);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -3129,7 +3129,7 @@ njs_generate_export_statement(njs_vm_t *vm, njs_generator_t *generator,
     code->retval = obj->index;
     node->index = obj->index;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -3141,7 +3141,7 @@ njs_generate_dest_index(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t  *dest;
 
     ret = njs_generate_children_indexes_release(vm, generator, node);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -3198,16 +3198,16 @@ static njs_index_t
 njs_generate_temp_index_get(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_array_t         *cache;
+    njs_arr_t           *cache;
     njs_index_t         *last;
     njs_parser_scope_t  *scope;
 
     cache = generator->index_cache;
 
     if (cache != NULL && cache->items != 0) {
-        last = nxt_array_remove_last(cache);
+        last = njs_arr_remove_last(cache);
 
-        nxt_thread_log_debug("CACHE %p", *last);
+        njs_thread_log_debug("CACHE %p", *last);
 
         return *last;
     }
@@ -3223,15 +3223,15 @@ njs_generate_temp_index_get(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_children_indexes_release(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    nxt_int_t  ret;
+    njs_int_t  ret;
 
     ret = njs_generate_node_index_release(vm, generator, node->left);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return njs_generate_node_index_release(vm, generator, node->right);
     }
 
@@ -3239,7 +3239,7 @@ njs_generate_children_indexes_release(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_node_index_release(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
@@ -3247,49 +3247,49 @@ njs_generate_node_index_release(njs_vm_t *vm, njs_generator_t *generator,
         return njs_generate_index_release(vm, generator, node->index);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_index_release(njs_vm_t *vm, njs_generator_t *generator,
     njs_index_t index)
 {
+    njs_arr_t    *cache;
     njs_index_t  *last;
-    nxt_array_t  *cache;
 
-    nxt_thread_log_debug("RELEASE %p", index);
+    njs_thread_log_debug("RELEASE %p", index);
 
     cache = generator->index_cache;
 
     if (cache == NULL) {
-        cache = nxt_array_create(4, sizeof(njs_value_t *),
-                                 &njs_array_mem_proto, vm->mem_pool);
-        if (nxt_slow_path(cache == NULL)) {
-            return NXT_ERROR;
+        cache = njs_arr_create(4, sizeof(njs_value_t *),
+                               &njs_array_mem_proto, vm->mem_pool);
+        if (njs_slow_path(cache == NULL)) {
+            return NJS_ERROR;
         }
 
         generator->index_cache = cache;
     }
 
-    last = nxt_array_add(cache, &njs_array_mem_proto, vm->mem_pool);
-    if (nxt_fast_path(last != NULL)) {
+    last = njs_arr_add(cache, &njs_array_mem_proto, vm->mem_pool);
+    if (njs_fast_path(last != NULL)) {
         *last = index;
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_generate_reference_error(njs_vm_t *vm, njs_generator_t *generator,
                              njs_parser_node_t *node)
 {
     njs_ret_t                     ret;
     njs_vmcode_reference_error_t  *ref_err;
 
-    if (nxt_slow_path(!node->u.reference.not_defined)) {
+    if (njs_slow_path(!node->u.reference.not_defined)) {
         njs_internal_error(vm, "variable is not defined but not_defined "
                                "is not set");
         return NJS_ERROR;
@@ -3301,7 +3301,7 @@ njs_generate_reference_error(njs_vm_t *vm, njs_generator_t *generator,
     ref_err->token_line = node->token_line;
 
     ret = njs_name_copy(vm, &ref_err->file, &node->scope->file);
-    if (nxt_slow_path(ret != NJS_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
@@ -3309,15 +3309,15 @@ njs_generate_reference_error(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
-static nxt_int_t
-njs_generate_function_debug(njs_vm_t *vm, const nxt_str_t *name,
+static njs_int_t
+njs_generate_function_debug(njs_vm_t *vm, const njs_str_t *name,
     njs_function_lambda_t *lambda, njs_parser_node_t *node)
 {
     njs_function_debug_t  *debug;
 
-    debug = nxt_array_add(vm->debug, &njs_array_mem_proto, vm->mem_pool);
-    if (nxt_slow_path(debug == NULL)) {
-        return NXT_ERROR;
+    debug = njs_arr_add(vm->debug, &njs_array_mem_proto, vm->mem_pool);
+    if (njs_slow_path(debug == NULL)) {
+        return NJS_ERROR;
     }
 
     debug->lambda = lambda;
@@ -3327,10 +3327,10 @@ njs_generate_function_debug(njs_vm_t *vm, const nxt_str_t *name,
         debug->file = node->scope->file;
 
     } else {
-        debug->file = nxt_string_value("");
+        debug->file = njs_str_value("");
     }
 
     debug->name = (name != NULL) ? *name : no_label;
 
-    return NXT_OK;
+    return NJS_OK;
 }
similarity index 80%
rename from njs/njs_generator.h
rename to src/njs_generator.h
index fc1b406791f5e976bd01e20b4588260fa2b00dc1..51128d7a1b06fa4c12aa260232ad354104c320a1 100644 (file)
@@ -16,7 +16,7 @@ struct njs_generator_s {
     size_t                          scope_size;
 
     njs_generator_block_t           *block;
-    nxt_array_t                     *index_cache;
+    njs_arr_t                       *index_cache;
 
     size_t                          code_size;
     u_char                          *code_start;
@@ -27,8 +27,8 @@ struct njs_generator_s {
 };
 
 
-nxt_int_t njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator,
-    njs_parser_scope_t *scope, const nxt_str_t *name);
+njs_int_t njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator,
+    njs_parser_scope_t *scope, const njs_str_t *name);
 
 
 #endif /* _NJS_GENERATOR_H_INCLUDED_ */
similarity index 83%
rename from njs/njs_json.c
rename to src/njs_json.c
index e08536a6881bdb3be78478a9c8eca423cbca8f43..93bd29ca213f8fbab6153db1274dbeab1ffbd3c3 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_json.h>
 #include <njs_date.h>
 #include <njs_regexp.h>
@@ -13,8 +13,8 @@
 
 typedef struct {
     njs_vm_t                   *vm;
-    nxt_mp_t                   *pool;
-    nxt_uint_t                 depth;
+    njs_mp_t                   *pool;
+    njs_uint_t                 depth;
     const u_char               *start;
     const u_char               *end;
 } njs_json_parse_ctx_t;
@@ -45,7 +45,7 @@ typedef struct {
 typedef struct {
     njs_value_t                retval;
 
-    nxt_array_t                stack;
+    njs_arr_t                  stack;
     njs_json_state_t           *state;
     njs_function_t             *function;
 } njs_json_parse_t;
@@ -66,14 +66,14 @@ typedef struct {
     njs_value_t                key;
 
     njs_vm_t                   *vm;
-    nxt_mp_t                   *pool;
+    njs_mp_t                   *pool;
     njs_chb_node_t             *nodes;
     njs_chb_node_t             *last;
-    nxt_array_t                stack;
+    njs_arr_t                  stack;
     njs_json_state_t           *state;
 
     njs_value_t                replacer;
-    nxt_str_t                  space;
+    njs_str_t                  space;
 } njs_json_stringify_t;
 
 
@@ -87,7 +87,7 @@ static const u_char *njs_json_parse_string(njs_json_parse_ctx_t *ctx,
     njs_value_t *value, const u_char *p);
 static const u_char *njs_json_parse_number(njs_json_parse_ctx_t *ctx,
     njs_value_t *value, const u_char *p);
-nxt_inline uint32_t njs_json_unicode(const u_char *p);
+njs_inline uint32_t njs_json_unicode(const u_char *p);
 static const u_char *njs_json_skip_space(const u_char *start,
     const u_char *end);
 
@@ -116,11 +116,11 @@ static njs_json_state_t *njs_json_push_stringify_state(njs_vm_t *vm,
 static njs_json_state_t *njs_json_pop_stringify_state(
     njs_json_stringify_t *stringify);
 
-static nxt_int_t njs_json_append_value(njs_json_stringify_t *stringify,
+static njs_int_t njs_json_append_value(njs_json_stringify_t *stringify,
     const njs_value_t *value);
-static nxt_int_t njs_json_append_string(njs_json_stringify_t *stringify,
+static njs_int_t njs_json_append_string(njs_json_stringify_t *stringify,
     const njs_value_t *value, char quote);
-static nxt_int_t njs_json_append_number(njs_json_stringify_t *stringify,
+static njs_int_t njs_json_append_number(njs_json_stringify_t *stringify,
     const njs_value_t *value);
 
 static njs_value_t *njs_json_wrap_value(njs_vm_t *vm, const njs_value_t *value);
@@ -134,19 +134,19 @@ static njs_value_t *njs_json_wrap_value(njs_vm_t *vm, const njs_value_t *value);
 #define njs_json_buf_node_size(n) (size_t) ((n)->pos - (n)->start)
 #define njs_json_buf_node_room(n) (size_t) ((n)->end - (n)->pos)
 
-static nxt_int_t njs_json_buf_append(njs_json_stringify_t *stringify,
+static njs_int_t njs_json_buf_append(njs_json_stringify_t *stringify,
     const char *msg, size_t len);
 static u_char *njs_json_buf_reserve(njs_json_stringify_t *stringify,
     size_t size);
-static nxt_int_t njs_json_buf_pullup(njs_json_stringify_t *stringify,
-    nxt_str_t *str);
+static njs_int_t njs_json_buf_pullup(njs_json_stringify_t *stringify,
+    njs_str_t *str);
 
 
 static const njs_object_prop_t  njs_json_object_properties[];
 
 
 static njs_ret_t
-njs_json_parse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_json_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_value_t           *value, *wrapper;
@@ -158,10 +158,10 @@ njs_json_parse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     parse = &json_parse;
 
-    value = nxt_mp_alloc(vm->mem_pool, sizeof(njs_value_t));
-    if (nxt_slow_path(value == NULL)) {
+    value = njs_mp_alloc(vm->mem_pool, sizeof(njs_value_t));
+    if (njs_slow_path(value == NULL)) {
         njs_memory_error(vm);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     text = njs_arg(args, nargs, 1);
@@ -182,34 +182,34 @@ njs_json_parse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     ctx.end = end;
 
     p = njs_json_skip_space(p, end);
-    if (nxt_slow_path(p == end)) {
+    if (njs_slow_path(p == end)) {
         njs_json_parse_exception(&ctx, "Unexpected end of input", p);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     p = njs_json_parse_value(&ctx, value, p);
-    if (nxt_slow_path(p == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(p == NULL)) {
+        return NJS_ERROR;
     }
 
     p = njs_json_skip_space(p, end);
-    if (nxt_slow_path(p != end)) {
+    if (njs_slow_path(p != end)) {
         njs_json_parse_exception(&ctx, "Unexpected token", p);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     reviver = njs_arg(args, nargs, 2);
 
     if (njs_is_function(reviver) && njs_is_object(value)) {
         wrapper = njs_json_wrap_value(vm, value);
-        if (nxt_slow_path(wrapper == NULL)) {
+        if (njs_slow_path(wrapper == NULL)) {
             goto memory_error;
         }
 
         parse->function = njs_function(reviver);
 
-        if (nxt_array_init(&parse->stack, NULL, 4, sizeof(njs_json_state_t),
-                           &njs_array_mem_proto, vm->mem_pool)
+        if (njs_arr_init(&parse->stack, NULL, 4, sizeof(njs_json_state_t),
+                         &njs_array_mem_proto, vm->mem_pool)
             == NULL)
         {
             goto memory_error;
@@ -224,18 +224,18 @@ njs_json_parse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 
 memory_error:
 
     njs_memory_error(vm);
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 njs_ret_t
-njs_vm_json_parse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs)
+njs_vm_json_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs)
 {
     njs_function_t  *parse;
 
@@ -246,11 +246,11 @@ njs_vm_json_parse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs)
 
 
 static njs_ret_t
-njs_json_stringify(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_json_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double                num;
-    nxt_int_t             i;
+    njs_int_t             i;
     njs_ret_t             ret;
     njs_value_t           *wrapper;
     const njs_value_t     *replacer, *space;
@@ -269,7 +269,7 @@ njs_json_stringify(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         stringify->replacer = *replacer;
         if (njs_is_array(replacer)) {
             ret = njs_json_stringify_array(vm, stringify);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 goto memory_error;
             }
         }
@@ -285,17 +285,17 @@ njs_json_stringify(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (njs_is_string(space) || njs_is_number(space)) {
         if (njs_is_string(space)) {
             njs_string_get(space, &stringify->space);
-            stringify->space.length = nxt_min(stringify->space.length, 10);
+            stringify->space.length = njs_min(stringify->space.length, 10);
 
         } else {
             num = njs_number(space);
             if (!isnan(num) && !isinf(num) && num > 0) {
-                num = nxt_min(num, 10);
+                num = njs_min(num, 10);
 
                 stringify->space.length = (size_t) num;
-                stringify->space.start = nxt_mp_alloc(vm->mem_pool,
+                stringify->space.start = njs_mp_alloc(vm->mem_pool,
                                                       (size_t) num + 1);
-                if (nxt_slow_path(stringify->space.start == NULL)) {
+                if (njs_slow_path(stringify->space.start == NULL)) {
                     goto memory_error;
                 }
 
@@ -306,15 +306,15 @@ njs_json_stringify(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         }
     }
 
-    if (nxt_array_init(&stringify->stack, NULL, 4, sizeof(njs_json_state_t),
-                       &njs_array_mem_proto, vm->mem_pool)
+    if (njs_arr_init(&stringify->stack, NULL, 4, sizeof(njs_json_state_t),
+                     &njs_array_mem_proto, vm->mem_pool)
         == NULL)
     {
         goto memory_error;
     }
 
     wrapper = njs_json_wrap_value(vm, njs_arg(args, nargs, 1));
-    if (nxt_slow_path(wrapper == NULL)) {
+    if (njs_slow_path(wrapper == NULL)) {
         goto memory_error;
     }
 
@@ -328,12 +328,12 @@ memory_error:
 
     njs_memory_error(vm);
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 njs_ret_t
-njs_vm_json_stringify(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs)
+njs_vm_json_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs)
 {
     njs_function_t  *stringify;
 
@@ -358,7 +358,7 @@ njs_json_parse_value(njs_json_parse_ctx_t *ctx, njs_value_t *value,
         return njs_json_parse_string(ctx, value, p);
 
     case 't':
-        if (nxt_fast_path(ctx->end - p >= 4 && memcmp(p, "true", 4) == 0)) {
+        if (njs_fast_path(ctx->end - p >= 4 && memcmp(p, "true", 4) == 0)) {
             *value = njs_value_true;
 
             return p + 4;
@@ -367,7 +367,7 @@ njs_json_parse_value(njs_json_parse_ctx_t *ctx, njs_value_t *value,
         goto error;
 
     case 'f':
-        if (nxt_fast_path(ctx->end - p >= 5 && memcmp(p, "false", 5) == 0)) {
+        if (njs_fast_path(ctx->end - p >= 5 && memcmp(p, "false", 5) == 0)) {
             *value = njs_value_false;
 
             return p + 5;
@@ -376,7 +376,7 @@ njs_json_parse_value(njs_json_parse_ctx_t *ctx, njs_value_t *value,
         goto error;
 
     case 'n':
-        if (nxt_fast_path(ctx->end - p >= 4 && memcmp(p, "null", 4) == 0)) {
+        if (njs_fast_path(ctx->end - p >= 4 && memcmp(p, "null", 4) == 0)) {
             *value = njs_value_null;
 
             return p + 4;
@@ -385,7 +385,7 @@ njs_json_parse_value(njs_json_parse_ctx_t *ctx, njs_value_t *value,
         goto error;
     }
 
-    if (nxt_fast_path(*p == '-' || (*p - '0') <= 9)) {
+    if (njs_fast_path(*p == '-' || (*p - '0') <= 9)) {
         return njs_json_parse_number(ctx, value, p);
     }
 
@@ -401,19 +401,19 @@ static const u_char *
 njs_json_parse_object(njs_json_parse_ctx_t *ctx, njs_value_t *value,
     const u_char *p)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_object_t        *object;
     njs_value_t         *prop_name, *prop_value;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    if (nxt_slow_path(--ctx->depth == 0)) {
+    if (njs_slow_path(--ctx->depth == 0)) {
         njs_json_parse_exception(ctx, "Nested too deep", p);
         return NULL;
     }
 
     object = njs_object_alloc(ctx->vm);
-    if (nxt_slow_path(object == NULL)) {
+    if (njs_slow_path(object == NULL)) {
         goto memory_error;
     }
 
@@ -421,13 +421,13 @@ njs_json_parse_object(njs_json_parse_ctx_t *ctx, njs_value_t *value,
 
     for ( ;; ) {
         p = njs_json_skip_space(p + 1, ctx->end);
-        if (nxt_slow_path(p == ctx->end)) {
+        if (njs_slow_path(p == ctx->end)) {
             goto error_end;
         }
 
         if (*p != '"') {
-            if (nxt_fast_path(*p == '}')) {
-                if (nxt_slow_path(prop != NULL)) {
+            if (njs_fast_path(*p == '}')) {
+                if (njs_slow_path(prop != NULL)) {
                     njs_json_parse_exception(ctx, "Trailing comma", p - 1);
                     return NULL;
                 }
@@ -438,63 +438,63 @@ njs_json_parse_object(njs_json_parse_ctx_t *ctx, njs_value_t *value,
             goto error_token;
         }
 
-        prop_name = nxt_mp_alloc(ctx->pool, sizeof(njs_value_t));
-        if (nxt_slow_path(prop_name == NULL)) {
+        prop_name = njs_mp_alloc(ctx->pool, sizeof(njs_value_t));
+        if (njs_slow_path(prop_name == NULL)) {
             goto memory_error;
         }
 
         p = njs_json_parse_string(ctx, prop_name, p);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             /* The exception is set by the called function. */
             return NULL;
         }
 
         p = njs_json_skip_space(p, ctx->end);
-        if (nxt_slow_path(p == ctx->end || *p != ':')) {
+        if (njs_slow_path(p == ctx->end || *p != ':')) {
             goto error_token;
         }
 
         p = njs_json_skip_space(p + 1, ctx->end);
-        if (nxt_slow_path(p == ctx->end)) {
+        if (njs_slow_path(p == ctx->end)) {
             goto error_end;
         }
 
-        prop_value = nxt_mp_alloc(ctx->pool, sizeof(njs_value_t));
-        if (nxt_slow_path(prop_value == NULL)) {
+        prop_value = njs_mp_alloc(ctx->pool, sizeof(njs_value_t));
+        if (njs_slow_path(prop_value == NULL)) {
             goto memory_error;
         }
 
         p = njs_json_parse_value(ctx, prop_value, p);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             /* The exception is set by the called function. */
             return NULL;
         }
 
         prop = njs_object_prop_alloc(ctx->vm, prop_name, prop_value, 1);
-        if (nxt_slow_path(prop == NULL)) {
+        if (njs_slow_path(prop == NULL)) {
             goto memory_error;
         }
 
         njs_string_get(prop_name, &lhq.key);
-        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
         lhq.value = prop;
         lhq.replace = 1;
         lhq.pool = ctx->pool;
         lhq.proto = &njs_object_hash_proto;
 
-        ret = nxt_lvlhsh_insert(&object->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&object->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(ctx->vm, "lvlhsh insert/replace failed");
             return NULL;
         }
 
         p = njs_json_skip_space(p, ctx->end);
-        if (nxt_slow_path(p == ctx->end)) {
+        if (njs_slow_path(p == ctx->end)) {
             goto error_end;
         }
 
         if (*p != ',') {
-            if (nxt_fast_path(*p == '}')) {
+            if (njs_fast_path(*p == '}')) {
                 break;
             }
 
@@ -532,17 +532,17 @@ static const u_char *
 njs_json_parse_array(njs_json_parse_ctx_t *ctx, njs_value_t *value,
     const u_char *p)
 {
-    nxt_int_t    ret;
+    njs_int_t    ret;
     njs_array_t  *array;
     njs_value_t  *element;
 
-    if (nxt_slow_path(--ctx->depth == 0)) {
+    if (njs_slow_path(--ctx->depth == 0)) {
         njs_json_parse_exception(ctx, "Nested too deep", p);
         return NULL;
     }
 
     array = njs_array_alloc(ctx->vm, 0, 0);
-    if (nxt_slow_path(array == NULL)) {
+    if (njs_slow_path(array == NULL)) {
         return NULL;
     }
 
@@ -550,12 +550,12 @@ njs_json_parse_array(njs_json_parse_ctx_t *ctx, njs_value_t *value,
 
     for ( ;; ) {
         p = njs_json_skip_space(p + 1, ctx->end);
-        if (nxt_slow_path(p == ctx->end)) {
+        if (njs_slow_path(p == ctx->end)) {
             goto error_end;
         }
 
         if (*p == ']') {
-            if (nxt_slow_path(element != NULL)) {
+            if (njs_slow_path(element != NULL)) {
                 njs_json_parse_exception(ctx, "Trailing comma", p - 1);
                 return NULL;
             }
@@ -563,29 +563,29 @@ njs_json_parse_array(njs_json_parse_ctx_t *ctx, njs_value_t *value,
             break;
         }
 
-        element = nxt_mp_alloc(ctx->pool, sizeof(njs_value_t));
-        if (nxt_slow_path(element == NULL)) {
+        element = njs_mp_alloc(ctx->pool, sizeof(njs_value_t));
+        if (njs_slow_path(element == NULL)) {
             njs_memory_error(ctx->vm);
             return NULL;
         }
 
         p = njs_json_parse_value(ctx, element, p);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             return NULL;
         }
 
         ret = njs_array_add(ctx->vm, array, element);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NULL;
         }
 
         p = njs_json_skip_space(p, ctx->end);
-        if (nxt_slow_path(p == ctx->end)) {
+        if (njs_slow_path(p == ctx->end)) {
             goto error_end;
         }
 
         if (*p != ',') {
-            if (nxt_fast_path(*p == ']')) {
+            if (njs_fast_path(*p == ']')) {
                 break;
             }
 
@@ -655,7 +655,7 @@ njs_json_parse_string(njs_json_parse_ctx_t *ctx, njs_value_t *value,
                 continue;
             }
 
-            if (nxt_fast_path(ch >= ' ')) {
+            if (njs_fast_path(ch >= ' ')) {
                 continue;
             }
 
@@ -700,7 +700,7 @@ njs_json_parse_string(njs_json_parse_ctx_t *ctx, njs_value_t *value,
         case sw_encoded3:
         case sw_encoded4:
 
-            if (nxt_fast_path((ch >= '0' && ch <= '9')
+            if (njs_fast_path((ch >= '0' && ch <= '9')
                               || (ch >= 'A' && ch <= 'F')
                               || (ch >= 'a' && ch <= 'f')))
             {
@@ -716,7 +716,7 @@ njs_json_parse_string(njs_json_parse_ctx_t *ctx, njs_value_t *value,
         break;
     }
 
-    if (nxt_slow_path(p == ctx->end)) {
+    if (njs_slow_path(p == ctx->end)) {
         njs_json_parse_exception(ctx, "Unexpected end of input", p);
         return NULL;
     }
@@ -729,8 +729,8 @@ njs_json_parse_string(njs_json_parse_ctx_t *ctx, njs_value_t *value,
     if (surplus != 0) {
         p = start;
 
-        dst = nxt_mp_alloc(ctx->pool, size);
-        if (nxt_slow_path(dst == NULL)) {
+        dst = njs_mp_alloc(ctx->pool, size);
+        if (njs_slow_path(dst == NULL)) {
             njs_memory_error(ctx->vm);;
             return NULL;
         }
@@ -785,7 +785,7 @@ njs_json_parse_string(njs_json_parse_ctx_t *ctx, njs_value_t *value,
                 /* Surrogate pair. */
 
                 if (utf > 0xdbff || p[0] != '\\' || p[1] != 'u') {
-                    s = nxt_utf8_encode(s, NXT_UTF8_REPLACEMENT);
+                    s = njs_utf8_encode(s, NJS_UTF8_REPLACEMENT);
                     continue;
                 }
 
@@ -794,20 +794,20 @@ njs_json_parse_string(njs_json_parse_ctx_t *ctx, njs_value_t *value,
                 utf_low = njs_json_unicode(p);
                 p += 4;
 
-                if (nxt_fast_path(utf_low >= 0xdc00 && utf_low <= 0xdfff)) {
+                if (njs_fast_path(utf_low >= 0xdc00 && utf_low <= 0xdfff)) {
                     utf = njs_string_surrogate_pair(utf, utf_low);
 
                 } else if (utf_low >= 0xd800 && utf_low <= 0xdbff) {
-                    utf = NXT_UTF8_REPLACEMENT;
-                    s = nxt_utf8_encode(s, NXT_UTF8_REPLACEMENT);
+                    utf = NJS_UTF8_REPLACEMENT;
+                    s = njs_utf8_encode(s, NJS_UTF8_REPLACEMENT);
 
                 } else {
                     utf = utf_low;
-                    s = nxt_utf8_encode(s, NXT_UTF8_REPLACEMENT);
+                    s = njs_utf8_encode(s, NJS_UTF8_REPLACEMENT);
                 }
             }
 
-            s = nxt_utf8_encode(s, utf);
+            s = njs_utf8_encode(s, utf);
 
         } while (p != last);
 
@@ -815,18 +815,18 @@ njs_json_parse_string(njs_json_parse_ctx_t *ctx, njs_value_t *value,
         start = dst;
     }
 
-    length = nxt_utf8_length(start, size);
-    if (nxt_slow_path(length < 0)) {
+    length = njs_utf8_length(start, size);
+    if (njs_slow_path(length < 0)) {
         length = 0;
     }
 
     ret = njs_string_new(ctx->vm, value, (u_char *) start, size, length);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
 
     if (dst != NULL) {
-        nxt_mp_free(ctx->pool, dst);
+        njs_mp_free(ctx->pool, dst);
     }
 
     return last + 1;
@@ -838,7 +838,7 @@ njs_json_parse_number(njs_json_parse_ctx_t *ctx, njs_value_t *value,
     const u_char *p)
 {
     double        num;
-    nxt_int_t     sign;
+    njs_int_t     sign;
     const u_char  *start;
 
     sign = 1;
@@ -867,12 +867,12 @@ error:
 }
 
 
-nxt_inline uint32_t
+njs_inline uint32_t
 njs_json_unicode(const u_char *p)
 {
     u_char      c;
     uint32_t    utf;
-    nxt_uint_t  i;
+    njs_uint_t  i;
 
     utf = 0;
 
@@ -896,7 +896,7 @@ njs_json_skip_space(const u_char *start, const u_char *end)
 {
     const u_char  *p;
 
-    for (p = start; nxt_fast_path(p != end); p++) {
+    for (p = start; njs_fast_path(p != end); p++) {
 
         switch (*p) {
         case ' ':
@@ -915,18 +915,18 @@ njs_json_skip_space(const u_char *start, const u_char *end)
 
 #define njs_json_is_non_empty(_value)                                         \
     (((_value)->type == NJS_OBJECT)                                           \
-      && !nxt_lvlhsh_is_empty(njs_object_hash(_value)))                       \
+      && !njs_lvlhsh_is_empty(njs_object_hash(_value)))                       \
      || (((_value)->type == NJS_ARRAY) && njs_array_len(_value) != 0)
 
 
 static njs_ret_t
 njs_json_parse_iterator(njs_vm_t *vm, njs_json_parse_t *parse)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_value_t         *key, *value;
     njs_json_state_t    *state;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
 start:
 
@@ -938,11 +938,11 @@ start:
             if (state->index < state->keys->length) {
                 key = &state->keys->start[state->index];
                 njs_string_get(key, &lhq.key);
-                lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+                lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
                 lhq.proto = &njs_object_hash_proto;
 
-                ret = nxt_lvlhsh_find(njs_object_hash(&state->value), &lhq);
-                if (nxt_slow_path(ret == NXT_DECLINED)) {
+                ret = njs_lvlhsh_find(njs_object_hash(&state->value), &lhq);
+                if (njs_slow_path(ret == NJS_DECLINED)) {
                     state->index++;
                     break;
                 }
@@ -970,12 +970,12 @@ start:
                 if (state == NULL) {
                     vm->retval = parse->retval;
 
-                    return NXT_OK;
+                    return NJS_OK;
                 }
             }
 
             ret = njs_json_parse_iterator_call(vm, parse);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -984,27 +984,27 @@ start:
         case NJS_JSON_OBJECT_REPLACED:
             key = &state->keys->start[state->index];
             njs_string_get(key, &lhq.key);
-            lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+            lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
             lhq.replace = 1;
             lhq.proto = &njs_object_hash_proto;
             lhq.pool = vm->mem_pool;
 
             if (njs_is_undefined(&parse->retval)) {
-                ret = nxt_lvlhsh_delete(njs_object_hash(&state->value), &lhq);
+                ret = njs_lvlhsh_delete(njs_object_hash(&state->value), &lhq);
 
             } else {
                 prop = njs_object_prop_alloc(vm, key, &parse->retval, 1);
-                if (nxt_slow_path(prop == NULL)) {
+                if (njs_slow_path(prop == NULL)) {
                     goto memory_error;
                 }
 
                 lhq.value = prop;
-                ret = nxt_lvlhsh_insert(njs_object_hash(&state->value), &lhq);
+                ret = njs_lvlhsh_insert(njs_object_hash(&state->value), &lhq);
             }
 
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 njs_internal_error(vm, "lvlhsh insert/replace failed");
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
             state->index++;
@@ -1030,7 +1030,7 @@ start:
             }
 
             ret = njs_json_parse_iterator_call(vm, parse);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -1048,7 +1048,7 @@ start:
         default:
             njs_internal_error(vm, "Unexpected state %d in JSON.parse()",
                                state->type);
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
@@ -1056,7 +1056,7 @@ memory_error:
 
     njs_memory_error(vm);
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -1088,7 +1088,7 @@ njs_json_parse_iterator_call(njs_vm_t *vm, njs_json_parse_t *parse)
     default:
         njs_internal_error(vm, "Unexpected state %d in JSON.parse() apply",
                            state->type);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     njs_set_invalid(&parse->retval);
@@ -1104,9 +1104,9 @@ njs_json_push_parse_state(njs_vm_t *vm, njs_json_parse_t *parse,
 {
     njs_json_state_t  *state;
 
-    state = nxt_array_add(&parse->stack, &njs_array_mem_proto, vm->mem_pool);
+    state = njs_arr_add(&parse->stack, &njs_array_mem_proto, vm->mem_pool);
     if (state != NULL) {
-        state = nxt_array_last(&parse->stack);
+        state = njs_arr_last(&parse->stack);
         state->value = *value;
         state->index = 0;
 
@@ -1134,7 +1134,7 @@ njs_json_pop_parse_state(njs_json_parse_t *parse)
 {
     if (parse->stack.items > 1) {
         parse->stack.items--;
-        parse->state = nxt_array_last(&parse->stack);
+        parse->state = njs_arr_last(&parse->stack);
         return parse->state;
     }
 
@@ -1148,8 +1148,8 @@ njs_json_parse_exception(njs_json_parse_ctx_t *ctx, const char *msg,
 {
     ssize_t  length;
 
-    length = nxt_utf8_length(ctx->start, pos - ctx->start);
-    if (nxt_slow_path(length < 0)) {
+    length = njs_utf8_length(ctx->start, pos - ctx->start);
+    if (njs_slow_path(length < 0)) {
         length = 0;
     }
 
@@ -1165,7 +1165,7 @@ njs_json_parse_exception(njs_json_parse_ctx_t *ctx, const char *msg,
 
 #define njs_json_stringify_append(str, len)                                   \
     ret = njs_json_buf_append(stringify, str, len);                           \
-    if (ret != NXT_OK) {                                                      \
+    if (ret != NJS_OK) {                                                      \
         goto memory_error;                                                    \
     }
 
@@ -1173,7 +1173,7 @@ njs_json_parse_exception(njs_json_parse_ctx_t *ctx, const char *msg,
 #define njs_json_stringify_indent(times)                                      \
     if (stringify->space.length != 0) {                                       \
         njs_json_stringify_append("\n", 1);                                   \
-        for (i = 0; i < (nxt_int_t) (times) - 1; i++) {                       \
+        for (i = 0; i < (njs_int_t) (times) - 1; i++) {                       \
             njs_json_stringify_append((char *) stringify->space.start,        \
                                       stringify->space.length);               \
         }                                                                     \
@@ -1197,9 +1197,9 @@ njs_json_parse_exception(njs_json_parse_ctx_t *ctx, const char *msg,
 #define njs_json_stringify_append_value(value)                                \
     state->written = 1;                                                       \
     ret = njs_json_append_value(stringify, value);                            \
-    if (nxt_slow_path(ret != NXT_OK)) {                                       \
-        if (ret == NXT_DECLINED) {                                            \
-            return NXT_ERROR;                                                 \
+    if (njs_slow_path(ret != NJS_OK)) {                                       \
+        if (ret == NJS_DECLINED) {                                            \
+            return NJS_ERROR;                                                 \
         }                                                                     \
                                                                               \
         goto memory_error;                                                    \
@@ -1212,14 +1212,14 @@ njs_json_stringify_iterator(njs_vm_t *vm, njs_json_stringify_t *stringify)
     u_char              *start;
     size_t              size;
     ssize_t             length;
-    nxt_int_t           i;
+    njs_int_t           i;
     njs_ret_t           ret;
-    nxt_str_t           str;
+    njs_str_t           str;
     njs_value_t         *key, *value;
     njs_function_t      *to_json;
     njs_json_state_t    *state;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
 start:
 
@@ -1249,11 +1249,11 @@ start:
 
             key = &state->keys->start[state->index++];
             njs_string_get(key, &lhq.key);
-            lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+            lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
             lhq.proto = &njs_object_hash_proto;
 
-            ret = nxt_lvlhsh_find(njs_object_hash(&state->value), &lhq);
-            if (nxt_slow_path(ret == NXT_DECLINED)) {
+            ret = njs_lvlhsh_find(njs_object_hash(&state->value), &lhq);
+            if (njs_slow_path(ret == NJS_DECLINED)) {
                 break;
             }
 
@@ -1273,7 +1273,7 @@ start:
                     ret = njs_json_stringify_to_json(vm, stringify, to_json,
                                                      &prop->name,
                                                      &prop->value);
-                    if (nxt_slow_path(ret != NXT_OK)) {
+                    if (njs_slow_path(ret != NJS_OK)) {
                         return ret;
                     }
 
@@ -1284,7 +1284,7 @@ start:
             if (njs_is_function(&stringify->replacer)) {
                 ret = njs_json_stringify_replacer(vm, stringify, &prop->name,
                                                   &prop->value);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
 
@@ -1297,7 +1297,7 @@ start:
                 state = njs_json_push_stringify_state(vm, stringify,
                                                       &prop->value);
                 if (state == NULL) {
-                    return NXT_ERROR;
+                    return NJS_ERROR;
                 }
 
                 break;
@@ -1317,7 +1317,7 @@ start:
                 ret = njs_json_stringify_replacer(vm, stringify,
                                                   &stringify->key,
                                                   &stringify->retval);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
 
@@ -1339,7 +1339,7 @@ start:
             if (njs_is_object(value)) {
                 state = njs_json_push_stringify_state(vm, stringify, value);
                 if (state == NULL) {
-                    return NXT_ERROR;
+                    return NJS_ERROR;
                 }
 
                 break;
@@ -1381,7 +1381,7 @@ start:
                 if (to_json != NULL) {
                     ret = njs_json_stringify_to_json(vm, stringify, to_json,
                                                      NULL, value);
-                    if (nxt_slow_path(ret != NXT_OK)) {
+                    if (njs_slow_path(ret != NJS_OK)) {
                         return ret;
                     }
 
@@ -1391,7 +1391,7 @@ start:
 
             if (njs_is_function(&stringify->replacer)) {
                 ret = njs_json_stringify_replacer(vm, stringify, NULL, value);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
 
@@ -1401,7 +1401,7 @@ start:
             if (njs_json_is_object(value)) {
                 state = njs_json_push_stringify_state(vm, stringify, value);
                 if (state == NULL) {
-                    return NXT_ERROR;
+                    return NJS_ERROR;
                 }
 
                 break;
@@ -1417,7 +1417,7 @@ start:
             {
                 ret = njs_json_stringify_replacer(vm, stringify, NULL,
                                                   &stringify->retval);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
 
@@ -1433,7 +1433,7 @@ start:
                 state = njs_json_push_stringify_state(vm, stringify,
                                                       &stringify->retval);
                 if (state == NULL) {
-                    return NXT_ERROR;
+                    return NJS_ERROR;
                 }
 
                 break;
@@ -1448,7 +1448,7 @@ start:
 done:
 
     ret = njs_json_buf_pullup(stringify, &str);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         goto memory_error;
     }
 
@@ -1456,7 +1456,7 @@ done:
      * The value to stringify is wrapped as '{"": value}'.
      * An empty object means empty result.
      */
-    if (str.length <= nxt_length("{\n\n}")) {
+    if (str.length <= njs_length("{\n\n}")) {
         vm->retval = njs_value_undefined;
         goto release;
     }
@@ -1466,35 +1466,35 @@ done:
     start = str.start;
     size = str.length;
 
-    start += nxt_length("{\"\":");
-    size -= nxt_length("{\"\":}");
+    start += njs_length("{\"\":");
+    size -= njs_length("{\"\":}");
 
     if (stringify->space.length != 0) {
-        start += nxt_length("\n ");
-        size -= nxt_length("\n \n");
+        start += njs_length("\n ");
+        size -= njs_length("\n \n");
     }
 
-    length = nxt_utf8_length(start, size);
-    if (nxt_slow_path(length < 0)) {
+    length = njs_utf8_length(start, size);
+    if (njs_slow_path(length < 0)) {
         length = 0;
     }
 
     ret = njs_string_new(vm, &vm->retval, start, size, length);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         goto memory_error;
     }
 
 release:
 
-    nxt_mp_free(vm->mem_pool, str.start);
+    njs_mp_free(vm->mem_pool, str.start);
 
-    return NXT_OK;
+    return NJS_OK;
 
 memory_error:
 
     njs_memory_error(vm);
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -1502,10 +1502,10 @@ static njs_function_t *
 njs_object_to_json_function(njs_vm_t *vm, njs_value_t *value)
 {
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     lhq.key_hash = NJS_TO_JSON_HASH;
-    lhq.key = nxt_string_value("toJSON");
+    lhq.key = njs_str_value("toJSON");
 
     prop = njs_object_property(vm, njs_object(value), &lhq);
 
@@ -1555,7 +1555,7 @@ njs_json_stringify_to_json(njs_vm_t *vm, njs_json_stringify_t* stringify,
     default:
         njs_internal_error(vm, "Unexpected state %d in JSON.stringify() apply",
                            state->type);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     return njs_function_apply(vm, function, arguments, 2, &stringify->retval);
@@ -1596,7 +1596,7 @@ njs_json_stringify_replacer(njs_vm_t *vm, njs_json_stringify_t* stringify,
     default:
         njs_internal_error(vm, "Unexpected state %d in "
                            "JSON.stringify() replacer", state->type);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     njs_set_invalid(&stringify->retval);
@@ -1625,8 +1625,8 @@ njs_json_stringify_array(njs_vm_t *vm, njs_json_stringify_t  *stringify)
     }
 
     properties = njs_array_alloc(vm, properties_length, NJS_ARRAY_SPARE);
-    if (nxt_slow_path(properties == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(properties == NULL)) {
+        return NJS_ERROR;
     }
 
     n = 0;
@@ -1646,8 +1646,8 @@ njs_json_stringify_array(njs_vm_t *vm, njs_json_stringify_t  *stringify)
 
         case NJS_NUMBER:
             ret = njs_number_to_string(vm, &num_value, value);
-            if (nxt_slow_path(ret != NXT_OK)) {
-                return NXT_ERROR;
+            if (njs_slow_path(ret != NJS_OK)) {
+                return NJS_ERROR;
             }
 
             value = &num_value;
@@ -1678,7 +1678,7 @@ njs_json_stringify_array(njs_vm_t *vm, njs_json_stringify_t  *stringify)
     properties->length = n;
     stringify->replacer.data.u.array = properties;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1694,14 +1694,14 @@ njs_json_push_stringify_state(njs_vm_t *vm, njs_json_stringify_t *stringify,
         return NULL;
     }
 
-    state = nxt_array_add(&stringify->stack, &njs_array_mem_proto,
-                          vm->mem_pool);
-    if (nxt_slow_path(state == NULL)) {
+    state = njs_arr_add(&stringify->stack, &njs_array_mem_proto,
+                        vm->mem_pool);
+    if (njs_slow_path(state == NULL)) {
         njs_memory_error(vm);
         return NULL;
     }
 
-    state = nxt_array_last(&stringify->stack);
+    state = njs_arr_last(&stringify->stack);
     state->value = *value;
     state->index = 0;
     state->written = 0;
@@ -1741,7 +1741,7 @@ njs_json_pop_stringify_state(njs_json_stringify_t *stringify)
 {
     if (stringify->stack.items > 1) {
         stringify->stack.items--;
-        stringify->state = nxt_array_last(&stringify->stack);
+        stringify->state = njs_arr_last(&stringify->stack);
         stringify->state->written = 1;
         return stringify->state;
     }
@@ -1750,7 +1750,7 @@ njs_json_pop_stringify_state(njs_json_stringify_t *stringify)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_json_append_value(njs_json_stringify_t *stringify, const njs_value_t *value)
 {
     switch (value->type) {
@@ -1790,7 +1790,7 @@ njs_json_append_value(njs_json_stringify_t *stringify, const njs_value_t *value)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_json_append_string(njs_json_stringify_t *stringify,
     const njs_value_t *value, char quote)
 {
@@ -1809,8 +1809,8 @@ njs_json_append_string(njs_json_stringify_t *stringify,
     length = str.length;
 
     dst = njs_json_buf_reserve(stringify, 64);
-    if (nxt_slow_path(dst == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(dst == NULL)) {
+        return NJS_ERROR;
     }
 
     dst_end = dst + 64;
@@ -1870,7 +1870,7 @@ njs_json_append_string(njs_json_stringify_t *stringify,
 
             if (length != 0) {
                 /* UTF-8 or ASCII string. */
-                dst = nxt_utf8_copy(dst, &p, end);
+                dst = njs_utf8_copy(dst, &p, end);
 
             } else {
                 /* Byte string. */
@@ -1882,8 +1882,8 @@ njs_json_append_string(njs_json_stringify_t *stringify,
             njs_json_buf_written(stringify, dst - stringify->last->pos);
 
             dst = njs_json_buf_reserve(stringify, 64);
-            if (nxt_slow_path(dst == NULL)) {
-                return NXT_ERROR;
+            if (njs_slow_path(dst == NULL)) {
+                return NJS_ERROR;
             }
 
             dst_end = dst + 64;
@@ -1894,11 +1894,11 @@ njs_json_append_string(njs_json_stringify_t *stringify,
 
     njs_json_buf_append(stringify, &quote, 1);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_json_append_number(njs_json_stringify_t *stringify,
     const njs_value_t *value)
 {
@@ -1913,16 +1913,16 @@ njs_json_append_number(njs_json_stringify_t *stringify,
 
     } else {
         p = njs_json_buf_reserve(stringify, 64);
-        if (nxt_slow_path(p == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(p == NULL)) {
+            return NJS_ERROR;
         }
 
-        size = nxt_dtoa(num, (char *) p);
+        size = njs_dtoa(num, (char *) p);
 
         njs_json_buf_written(stringify, size);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1932,18 +1932,18 @@ njs_json_append_number(njs_json_stringify_t *stringify,
 static njs_value_t *
 njs_json_wrap_value(njs_vm_t *vm, const njs_value_t *value)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_value_t         *wrapper;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    wrapper = nxt_mp_alloc(vm->mem_pool, sizeof(njs_value_t));
-    if (nxt_slow_path(wrapper == NULL)) {
+    wrapper = njs_mp_alloc(vm->mem_pool, sizeof(njs_value_t));
+    if (njs_slow_path(wrapper == NULL)) {
         return NULL;
     }
 
     wrapper->data.u.object = njs_object_alloc(vm);
-    if (nxt_slow_path(njs_object(wrapper) == NULL)) {
+    if (njs_slow_path(njs_object(wrapper) == NULL)) {
         return NULL;
     }
 
@@ -1953,18 +1953,18 @@ njs_json_wrap_value(njs_vm_t *vm, const njs_value_t *value)
     lhq.replace = 0;
     lhq.proto = &njs_object_hash_proto;
     lhq.pool = vm->mem_pool;
-    lhq.key = nxt_string_value("");
-    lhq.key_hash = NXT_DJB_HASH_INIT;
+    lhq.key = njs_str_value("");
+    lhq.key_hash = NJS_DJB_HASH_INIT;
 
     prop = njs_object_prop_alloc(vm, &njs_string_empty, value, 1);
-    if (nxt_slow_path(prop == NULL)) {
+    if (njs_slow_path(prop == NULL)) {
         return NULL;
     }
 
     lhq.value = prop;
 
-    ret = nxt_lvlhsh_insert(njs_object_hash(wrapper), &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(njs_object_hash(wrapper), &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
 
@@ -1972,7 +1972,7 @@ njs_json_wrap_value(njs_vm_t *vm, const njs_value_t *value)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_json_buf_append(njs_json_stringify_t *stringify, const char *msg,
     size_t len)
 {
@@ -1980,8 +1980,8 @@ njs_json_buf_append(njs_json_stringify_t *stringify, const char *msg,
 
     if (len != 0) {
         p = njs_json_buf_reserve(stringify, len);
-        if (nxt_slow_path(p == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(p == NULL)) {
+            return NJS_ERROR;
         }
 
         memcpy(p, msg, len);
@@ -1989,7 +1989,7 @@ njs_json_buf_append(njs_json_stringify_t *stringify, const char *msg,
         njs_json_buf_written(stringify, len);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1998,13 +1998,13 @@ njs_json_buf_reserve(njs_json_stringify_t *stringify, size_t size)
 {
     njs_chb_node_t  *n;
 
-    if (nxt_slow_path(size == 0)) {
+    if (njs_slow_path(size == 0)) {
         return NULL;
     }
 
     n = stringify->last;
 
-    if (nxt_fast_path(n != NULL && njs_json_buf_node_room(n) >= size)) {
+    if (njs_fast_path(n != NULL && njs_json_buf_node_room(n) >= size)) {
         return n->pos;
     }
 
@@ -2012,8 +2012,8 @@ njs_json_buf_reserve(njs_json_stringify_t *stringify, size_t size)
         size = NJS_JSON_BUF_MIN_SIZE;
     }
 
-    n = nxt_mp_alloc(stringify->pool, sizeof(njs_chb_node_t) + size);
-    if (nxt_slow_path(n == NULL)) {
+    n = njs_mp_alloc(stringify->pool, sizeof(njs_chb_node_t) + size);
+    if (njs_slow_path(n == NULL)) {
         return NULL;
     }
 
@@ -2035,8 +2035,8 @@ njs_json_buf_reserve(njs_json_stringify_t *stringify, size_t size)
 }
 
 
-static nxt_int_t
-njs_json_buf_pullup(njs_json_stringify_t *stringify, nxt_str_t *str)
+static njs_int_t
+njs_json_buf_pullup(njs_json_stringify_t *stringify, njs_str_t *str)
 {
     u_char          *start;
     size_t          size;
@@ -2047,13 +2047,13 @@ njs_json_buf_pullup(njs_json_stringify_t *stringify, nxt_str_t *str)
     if (n == NULL) {
         str->length = 0;
         str->start = NULL;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     if (n->next == NULL) {
         str->length = njs_json_buf_node_size(n);
         str->start = n->start;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     size = 0;
@@ -2063,9 +2063,9 @@ njs_json_buf_pullup(njs_json_stringify_t *stringify, nxt_str_t *str)
         n = n->next;
     }
 
-    start = nxt_mp_alloc(stringify->pool, size);
-    if (nxt_slow_path(start == NULL)) {
-        return NXT_ERROR;
+    start = njs_mp_alloc(stringify->pool, size);
+    if (njs_slow_path(start == NULL)) {
+        return NJS_ERROR;
     }
 
     n = stringify->nodes;
@@ -2079,7 +2079,7 @@ njs_json_buf_pullup(njs_json_stringify_t *stringify, nxt_str_t *str)
         n = n->next;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -2110,15 +2110,15 @@ static const njs_object_prop_t  njs_json_object_properties[] =
 
 
 const njs_object_init_t  njs_json_object_init = {
-    nxt_string("JSON"),
+    njs_str("JSON"),
     njs_json_object_properties,
-    nxt_nitems(njs_json_object_properties),
+    njs_nitems(njs_json_object_properties),
 };
 
 
 #define njs_dump(str)                                                         \
-    ret = njs_json_buf_append(stringify, str, nxt_length(str));               \
-    if (nxt_slow_path(ret != NXT_OK)) {                                       \
+    ret = njs_json_buf_append(stringify, str, njs_length(str));               \
+    if (njs_slow_path(ret != NJS_OK)) {                                       \
         goto memory_error;                                                    \
     }
 
@@ -2129,19 +2129,19 @@ const njs_object_init_t  njs_json_object_init = {
     }                                                                         \
                                                                               \
     written = 1;                                                              \
-    ret = njs_json_buf_append(stringify, str, nxt_length(str));               \
-    if (nxt_slow_path(ret != NXT_OK)) {                                       \
+    ret = njs_json_buf_append(stringify, str, njs_length(str));               \
+    if (njs_slow_path(ret != NJS_OK)) {                                       \
         goto memory_error;                                                    \
     }
 
 
-static nxt_int_t
+static njs_int_t
 njs_dump_value(njs_json_stringify_t *stringify, const njs_value_t *value,
-    nxt_uint_t console)
+    njs_uint_t console)
 {
     njs_ret_t           ret;
-    nxt_str_t           str;
-    nxt_uint_t          written;
+    njs_str_t           str;
+    njs_uint_t          written;
     njs_value_t         str_val;
     const njs_extern_t  *ext_proto;
     u_char              buf[32], *p;
@@ -2174,7 +2174,7 @@ njs_dump_value(njs_json_stringify_t *stringify, const njs_value_t *value,
     case NJS_OBJECT_NUMBER:
         value = njs_object_value(value);
 
-        if (nxt_slow_path(njs_number(value) == 0.0
+        if (njs_slow_path(njs_number(value) == 0.0
                           && signbit(njs_number(value))))
         {
 
@@ -2183,8 +2183,8 @@ njs_dump_value(njs_json_stringify_t *stringify, const njs_value_t *value,
         }
 
         ret = njs_number_to_string(stringify->vm, &str_val, value);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         njs_string_get(&str_val, &str);
@@ -2289,7 +2289,7 @@ njs_dump_value(njs_json_stringify_t *stringify, const njs_value_t *value,
         return njs_json_buf_append(stringify, "]}", 2);
 
     case NJS_NUMBER:
-        if (nxt_slow_path(njs_number(value) == 0.0
+        if (njs_slow_path(njs_number(value) == 0.0
                           && signbit(njs_number(value))))
         {
 
@@ -2328,8 +2328,8 @@ njs_dump_value(njs_json_stringify_t *stringify, const njs_value_t *value,
         }
 
         ret = to_string(stringify->vm, &str_val, value);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         njs_string_get(&str_val, &str);
@@ -2337,7 +2337,7 @@ njs_dump_value(njs_json_stringify_t *stringify, const njs_value_t *value,
         return njs_json_buf_append(stringify, (char *) str.start, str.length);
 
     default:
-        p = nxt_sprintf(buf, buf + nxt_length(buf), "[Unknown value type:%uD]",
+        p = njs_sprintf(buf, buf + njs_length(buf), "[Unknown value type:%uD]",
                         value->type);
         return njs_json_buf_append(stringify, (char *) buf, p - buf);
     }
@@ -2348,7 +2348,7 @@ memory_error:
 
     njs_memory_error(stringify->vm);
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -2357,14 +2357,14 @@ memory_error:
      || ((value)->type == NJS_ARRAY)                                          \
      || ((value)->type == NJS_OBJECT_VALUE)                                   \
      || ((value)->type == NJS_EXTERNAL                                        \
-         && !nxt_lvlhsh_is_empty(&(value)->external.proto->hash)))
+         && !njs_lvlhsh_is_empty(&(value)->external.proto->hash)))
 
 
 #define njs_dump_append_value(value)                                          \
     state->written = 1;                                                       \
     ret = njs_dump_value(stringify, value, console);                          \
-    if (nxt_slow_path(ret != NXT_OK)) {                                       \
-        if (ret == NXT_DECLINED) {                                            \
+    if (njs_slow_path(ret != NJS_OK)) {                                       \
+        if (ret == NJS_DECLINED) {                                            \
             goto exception;                                                   \
         }                                                                     \
                                                                               \
@@ -2373,26 +2373,26 @@ memory_error:
 
 
 njs_ret_t
-njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value,
-    nxt_uint_t console, nxt_uint_t indent)
+njs_vm_value_dump(njs_vm_t *vm, njs_str_t *retval, const njs_value_t *value,
+    njs_uint_t console, njs_uint_t indent)
 {
-    nxt_int_t             i;
+    njs_int_t             i;
     njs_ret_t             ret;
-    nxt_str_t             str;
+    njs_str_t             str;
     njs_value_t           *key, *val, ext_val;
     njs_object_t          *object;
     njs_json_state_t      *state;
     njs_object_prop_t     *prop;
-    nxt_lvlhsh_query_t    lhq;
+    njs_lvlhsh_query_t    lhq;
     njs_json_stringify_t  *stringify;
 
     if (njs_vm_backtrace(vm) != NULL) {
         goto exception;
     }
 
-    stringify = nxt_mp_alloc(vm->mem_pool, sizeof(njs_json_stringify_t));
+    stringify = njs_mp_alloc(vm->mem_pool, sizeof(njs_json_stringify_t));
 
-    if (nxt_slow_path(stringify == NULL)) {
+    if (njs_slow_path(stringify == NULL)) {
         goto memory_error;
     }
 
@@ -2405,7 +2405,7 @@ njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value,
 
     if (!njs_dump_is_object(value)) {
         ret = njs_dump_value(stringify, value, console);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             goto memory_error;
         }
 
@@ -2413,15 +2413,15 @@ njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value,
     }
 
     stringify->space.length = indent;
-    stringify->space.start = nxt_mp_alloc(vm->mem_pool, indent);
-    if (nxt_slow_path(stringify->space.start == NULL)) {
+    stringify->space.start = njs_mp_alloc(vm->mem_pool, indent);
+    if (njs_slow_path(stringify->space.start == NULL)) {
         goto memory_error;
     }
 
-    nxt_memset(stringify->space.start, ' ', indent);
+    njs_memset(stringify->space.start, ' ', indent);
 
-    if (nxt_array_init(&stringify->stack, NULL, 4, sizeof(njs_json_state_t),
-                       &njs_array_mem_proto, vm->mem_pool)
+    if (njs_arr_init(&stringify->stack, NULL, 4, sizeof(njs_json_state_t),
+                     &njs_array_mem_proto, vm->mem_pool)
         == NULL)
     {
         goto memory_error;
@@ -2457,13 +2457,13 @@ njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value,
 
             key = &state->keys->start[state->index++];
             njs_string_get(key, &lhq.key);
-            lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+            lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
 
             if (njs_is_external(&state->value)) {
                 lhq.proto = &njs_extern_hash_proto;
 
-                ret = nxt_lvlhsh_find(&state->value.external.proto->hash, &lhq);
-                if (nxt_slow_path(ret == NXT_DECLINED)) {
+                ret = njs_lvlhsh_find(&state->value.external.proto->hash, &lhq);
+                if (njs_slow_path(ret == NJS_DECLINED)) {
                     break;
                 }
 
@@ -2477,10 +2477,10 @@ njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value,
                 object = njs_object(&state->value);
                 lhq.proto = &njs_object_hash_proto;
 
-                ret = nxt_lvlhsh_find(&object->hash, &lhq);
-                if (ret == NXT_DECLINED) {
-                    ret = nxt_lvlhsh_find(&object->shared_hash, &lhq);
-                    if (nxt_slow_path(ret == NXT_DECLINED)) {
+                ret = njs_lvlhsh_find(&object->hash, &lhq);
+                if (ret == NJS_DECLINED) {
+                    ret = njs_lvlhsh_find(&object->shared_hash, &lhq);
+                    if (njs_slow_path(ret == NJS_DECLINED)) {
                         break;
                     }
                 }
@@ -2559,20 +2559,20 @@ njs_vm_value_dump(njs_vm_t *vm, nxt_str_t *retval, const njs_value_t *value,
             break;
 
         default:
-            nxt_unreachable();
+            njs_unreachable();
         }
     }
 
 done:
 
     ret = njs_json_buf_pullup(stringify, &str);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         goto memory_error;
     }
 
     *retval = str;
 
-    return NXT_OK;
+    return NJS_OK;
 
 memory_error:
 
@@ -2582,5 +2582,5 @@ exception:
 
     njs_vm_value_string(vm, retval, &vm->retval);
 
-    return NXT_OK;
+    return NJS_OK;
 }
similarity index 100%
rename from njs/njs_json.h
rename to src/njs_json.h
similarity index 91%
rename from njs/njs_lexer.c
rename to src/njs_lexer.c
index a05c9a45d1442521f2c7208c211d794458bffcc1..7e9b0839fd8863422035dad15ca53976e2bf3d18 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 
 
@@ -32,12 +32,12 @@ static njs_token_t njs_lexer_string(njs_lexer_t *lexer, njs_lexer_token_t *lt,
 static njs_token_t njs_lexer_number(njs_lexer_t *lexer, njs_lexer_token_t *lt,
     u_char c);
 static njs_token_t njs_lexer_multi(njs_lexer_t *lexer, njs_lexer_token_t *lt,
-    njs_token_t token, nxt_uint_t n, const njs_lexer_multi_t *multi);
+    njs_token_t token, njs_uint_t n, const njs_lexer_multi_t *multi);
 static njs_token_t njs_lexer_division(njs_lexer_t *lexer,
     njs_token_t token);
 
 
-static const uint8_t  njs_tokens[256]  nxt_aligned(64) = {
+static const uint8_t  njs_tokens[256]  njs_aligned(64) = {
 
                 NJS_TOKEN_ILLEGAL,           NJS_TOKEN_ILLEGAL,
                 NJS_TOKEN_ILLEGAL,           NJS_TOKEN_ILLEGAL,
@@ -282,11 +282,11 @@ static const njs_lexer_multi_t  njs_assignment_token[] = {
 };
 
 
-nxt_int_t
-njs_lexer_init(njs_vm_t *vm, njs_lexer_t *lexer, nxt_str_t *file,
+njs_int_t
+njs_lexer_init(njs_vm_t *vm, njs_lexer_t *lexer, njs_str_t *file,
     u_char *start, u_char *end)
 {
-    nxt_memzero(lexer, sizeof(njs_lexer_t));
+    njs_memzero(lexer, sizeof(njs_lexer_t));
 
     lexer->file = *file;
     lexer->start = start;
@@ -294,9 +294,9 @@ njs_lexer_init(njs_vm_t *vm, njs_lexer_t *lexer, nxt_str_t *file,
     lexer->line = 1;
     lexer->keywords_hash = vm->shared->keywords_hash;
 
-    nxt_queue_init(&lexer->preread);
+    njs_queue_init(&lexer->preread);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -309,12 +309,12 @@ njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer)
 
     if (lexer->lexer_token != NULL) {
         lexer->prev_token = lexer->lexer_token->token;
-        nxt_mp_free(vm->mem_pool, lexer->lexer_token);
+        njs_mp_free(vm->mem_pool, lexer->lexer_token);
     }
 
-    if (nxt_queue_is_empty(&lexer->preread)) {
+    if (njs_queue_is_empty(&lexer->preread)) {
         lt = njs_lexer_token_push(vm, lexer);
-        if (nxt_slow_path(lt == NULL)) {
+        if (njs_slow_path(lt == NULL)) {
             return NJS_TOKEN_ERROR;
         }
     }
@@ -329,19 +329,19 @@ njs_token_t
 njs_lexer_peek_token(njs_vm_t *vm, njs_lexer_t *lexer, size_t offset)
 {
     size_t             i;
-    nxt_queue_link_t   *link;
+    njs_queue_link_t   *link;
     njs_lexer_token_t  *lt;
 
     /* GCC and Clang complain about uninitialized lt. */
     lt = NULL;
 
-    link = nxt_queue_first(&lexer->preread);
+    link = njs_queue_first(&lexer->preread);
 
     for (i = 0; i <= offset; i++) {
 
-        if (link != nxt_queue_tail(&lexer->preread)) {
+        if (link != njs_queue_tail(&lexer->preread)) {
 
-            lt = nxt_queue_link_data(link, njs_lexer_token_t, link);
+            lt = njs_queue_link_data(link, njs_lexer_token_t, link);
 
             /* NJS_TOKEN_DIVISION stands for regexp literal. */
 
@@ -351,13 +351,13 @@ njs_lexer_peek_token(njs_vm_t *vm, njs_lexer_t *lexer, size_t offset)
                 break;
             }
 
-            link = nxt_queue_next(link);
+            link = njs_queue_next(link);
 
         } else {
 
             lt = njs_lexer_token_push(vm, lexer);
 
-            if (nxt_slow_path(lt == NULL)) {
+            if (njs_slow_path(lt == NULL)) {
                 return NJS_TOKEN_ERROR;
             }
         }
@@ -372,14 +372,14 @@ njs_lexer_token_push(njs_vm_t *vm, njs_lexer_t *lexer)
 {
     njs_lexer_token_t  *lt;
 
-    lt = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_lexer_token_t));
-    if (nxt_slow_path(lt == NULL)) {
+    lt = njs_mp_zalloc(vm->mem_pool, sizeof(njs_lexer_token_t));
+    if (njs_slow_path(lt == NULL)) {
         return NULL;
     }
 
     lt->token = njs_lexer_next_token(lexer, lt);
 
-    nxt_queue_insert_tail(&lexer->preread, &lt->link);
+    njs_queue_insert_tail(&lexer->preread, &lt->link);
 
     return lt;
 }
@@ -388,30 +388,30 @@ njs_lexer_token_push(njs_vm_t *vm, njs_lexer_t *lexer)
 static njs_lexer_token_t *
 njs_lexer_token_pop(njs_lexer_t *lexer)
 {
-    nxt_queue_link_t  *lnk;
+    njs_queue_link_t  *lnk;
 
-    lnk = nxt_queue_first(&lexer->preread);
-    nxt_queue_remove(lnk);
+    lnk = njs_queue_first(&lexer->preread);
+    njs_queue_remove(lnk);
 
-    return nxt_queue_link_data(lnk, njs_lexer_token_t, link);
+    return njs_queue_link_data(lnk, njs_lexer_token_t, link);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_lexer_rollback(njs_vm_t *vm, njs_lexer_t *lexer)
 {
     njs_lexer_token_t  *lt;
 
-    lt = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_lexer_token_t));
-    if (nxt_slow_path(lt == NULL)) {
-        return NXT_ERROR;
+    lt = njs_mp_zalloc(vm->mem_pool, sizeof(njs_lexer_token_t));
+    if (njs_slow_path(lt == NULL)) {
+        return NJS_ERROR;
     }
 
     *lt = *lexer->lexer_token;
 
-    nxt_queue_insert_head(&lexer->preread, &lt->link);
+    njs_queue_insert_head(&lexer->preread, &lt->link);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -430,7 +430,7 @@ static njs_token_t
 njs_lexer_next_token(njs_lexer_t *lexer, njs_lexer_token_t *lt)
 {
     u_char                   c, *p;
-    nxt_uint_t               n;
+    njs_uint_t               n;
     njs_token_t              token;
     const njs_lexer_multi_t  *multi;
 
@@ -477,25 +477,25 @@ njs_lexer_next_token(njs_lexer_t *lexer, njs_lexer_token_t *lt)
             return njs_lexer_number(lexer, lt, c);
 
         case NJS_TOKEN_ASSIGNMENT:
-            n = nxt_nitems(njs_assignment_token),
+            n = njs_nitems(njs_assignment_token),
             multi = njs_assignment_token;
 
             goto multi;
 
         case NJS_TOKEN_ADDITION:
-            n = nxt_nitems(njs_addition_token),
+            n = njs_nitems(njs_addition_token),
             multi = njs_addition_token;
 
             goto multi;
 
         case NJS_TOKEN_SUBSTRACTION:
-            n = nxt_nitems(njs_substraction_token),
+            n = njs_nitems(njs_substraction_token),
             multi = njs_substraction_token;
 
             goto multi;
 
         case NJS_TOKEN_MULTIPLICATION:
-            n = nxt_nitems(njs_multiplication_token),
+            n = njs_nitems(njs_multiplication_token),
             multi = njs_multiplication_token;
 
             goto multi;
@@ -510,43 +510,43 @@ njs_lexer_next_token(njs_lexer_t *lexer, njs_lexer_token_t *lt)
             continue;
 
         case NJS_TOKEN_REMAINDER:
-            n = nxt_nitems(njs_remainder_token),
+            n = njs_nitems(njs_remainder_token),
             multi = njs_remainder_token;
 
             goto multi;
 
         case NJS_TOKEN_BITWISE_AND:
-            n = nxt_nitems(njs_bitwise_and_token),
+            n = njs_nitems(njs_bitwise_and_token),
             multi = njs_bitwise_and_token;
 
             goto multi;
 
         case NJS_TOKEN_BITWISE_XOR:
-            n = nxt_nitems(njs_bitwise_xor_token),
+            n = njs_nitems(njs_bitwise_xor_token),
             multi = njs_bitwise_xor_token;
 
             goto multi;
 
         case NJS_TOKEN_BITWISE_OR:
-            n = nxt_nitems(njs_bitwise_or_token),
+            n = njs_nitems(njs_bitwise_or_token),
             multi = njs_bitwise_or_token;
 
             goto multi;
 
         case NJS_TOKEN_LOGICAL_NOT:
-            n = nxt_nitems(njs_logical_not_token),
+            n = njs_nitems(njs_logical_not_token),
             multi = njs_logical_not_token;
 
             goto multi;
 
         case NJS_TOKEN_LESS:
-            n = nxt_nitems(njs_less_token),
+            n = njs_nitems(njs_less_token),
             multi = njs_less_token;
 
             goto multi;
 
         case NJS_TOKEN_GREATER:
-            n = nxt_nitems(njs_greater_token),
+            n = njs_nitems(njs_greater_token),
             multi = njs_greater_token;
 
             goto multi;
@@ -579,7 +579,7 @@ njs_lexer_word(njs_lexer_t *lexer, njs_lexer_token_t *lt, u_char c)
 
     /* TODO: UTF-8 */
 
-    static const uint8_t  letter_digit[32]  nxt_aligned(32) = {
+    static const uint8_t  letter_digit[32]  njs_aligned(32) = {
         0x00, 0x00, 0x00, 0x00, /* 0000 0000 0000 0000  0000 0000 0000 0000 */
 
                                 /* '&%$ #"!  /.-, |*)(  7654 3210 ?>=< ;:98 */
@@ -598,7 +598,7 @@ njs_lexer_word(njs_lexer_t *lexer, njs_lexer_token_t *lt, u_char c)
     };
 
     lt->token_line = lexer->line;
-    lt->key_hash = nxt_djb_hash_add(NXT_DJB_HASH_INIT, c);
+    lt->key_hash = njs_djb_hash_add(NJS_DJB_HASH_INIT, c);
     lt->text.start = lexer->start - 1;
 
     for (p = lexer->start; p < lexer->end; p++) {
@@ -608,7 +608,7 @@ njs_lexer_word(njs_lexer_t *lexer, njs_lexer_token_t *lt, u_char c)
             break;
         }
 
-        lt->key_hash = nxt_djb_hash_add(lt->key_hash, c);
+        lt->key_hash = njs_djb_hash_add(lt->key_hash, c);
     }
 
     lexer->start = p;
@@ -622,7 +622,7 @@ static njs_token_t
 njs_lexer_string(njs_lexer_t *lexer, njs_lexer_token_t *lt, u_char quote)
 {
     u_char      *p, c;
-    nxt_bool_t  escape;
+    njs_bool_t  escape;
 
     escape = 0;
     lt->text.start = lexer->start;
@@ -765,7 +765,7 @@ illegal_token:
 
 static njs_token_t
 njs_lexer_multi(njs_lexer_t *lexer, njs_lexer_token_t *lt, njs_token_t token,
-    nxt_uint_t n, const njs_lexer_multi_t *multi)
+    njs_uint_t n, const njs_lexer_multi_t *multi)
 {
     u_char  c;
 
similarity index 92%
rename from njs/njs_lexer.h
rename to src/njs_lexer.h
index a79a582722195de6d53e80163692fb6b1aaaef44..78b47adf74fcbd2dc6a2fac21a23bae35d201f76 100644 (file)
@@ -222,24 +222,24 @@ typedef struct {
     njs_token_t                     token:16;
     uint32_t                        token_line;
     uint32_t                        key_hash;
-    nxt_str_t                       text;
+    njs_str_t                       text;
     double                          number;
-    nxt_queue_link_t                link;
+    njs_queue_link_t                link;
 } njs_lexer_token_t;
 
 
 typedef struct {
     njs_lexer_token_t               *lexer_token;
-    nxt_queue_t                     preread; /*  of njs_lexer_token_t */
+    njs_queue_t                     preread; /*  of njs_lexer_token_t */
     uint8_t                         keyword;
 
     u_char                          *prev_start;
     njs_token_t                     prev_token:16;
 
     uint32_t                        line;
-    nxt_str_t                       file;
+    njs_str_t                       file;
 
-    nxt_lvlhsh_t                    keywords_hash;
+    njs_lvlhsh_t                    keywords_hash;
 
     u_char                          *start;
     u_char                          *end;
@@ -247,19 +247,19 @@ typedef struct {
 
 
 typedef struct {
-    nxt_str_t                       name;
+    njs_str_t                       name;
     njs_token_t                     token;
     double                          number;
 } njs_keyword_t;
 
 
-nxt_int_t njs_lexer_init(njs_vm_t *vm, njs_lexer_t *lexer, nxt_str_t *file,
+njs_int_t njs_lexer_init(njs_vm_t *vm, njs_lexer_t *lexer, njs_str_t *file,
     u_char *start, u_char *end);
 njs_token_t njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer);
 njs_token_t njs_lexer_peek_token(njs_vm_t *vm, njs_lexer_t *lexer,
     size_t offset);
-nxt_int_t njs_lexer_rollback(njs_vm_t *vm, njs_lexer_t *lexer);
-nxt_int_t njs_lexer_keywords_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash);
+njs_int_t njs_lexer_rollback(njs_vm_t *vm, njs_lexer_t *lexer);
+njs_int_t njs_lexer_keywords_init(njs_mp_t *mp, njs_lvlhsh_t *hash);
 void njs_lexer_keyword(njs_lexer_t *lexer, njs_lexer_token_t *lt);
 
 
diff --git a/src/njs_lexer_keyword.c b/src/njs_lexer_keyword.c
new file mode 100644 (file)
index 0000000..b5c556c
--- /dev/null
@@ -0,0 +1,195 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_main.h>
+#include <string.h>
+
+
+static const njs_keyword_t  njs_keywords[] = {
+
+    /* Values. */
+
+    { njs_str("undefined"),     NJS_TOKEN_UNDEFINED, 0 },
+    { njs_str("null"),          NJS_TOKEN_NULL, 0 },
+    { njs_str("false"),         NJS_TOKEN_BOOLEAN, 0 },
+    { njs_str("true"),          NJS_TOKEN_BOOLEAN, 1 },
+    { njs_str("NaN"),           NJS_TOKEN_NUMBER, NAN },
+    { njs_str("Infinity"),      NJS_TOKEN_NUMBER, INFINITY },
+
+    /* Operators. */
+
+    { njs_str("in"),            NJS_TOKEN_IN, 0 },
+    { njs_str("typeof"),        NJS_TOKEN_TYPEOF, 0 },
+    { njs_str("instanceof"),    NJS_TOKEN_INSTANCEOF, 0 },
+    { njs_str("void"),          NJS_TOKEN_VOID, 0 },
+    { njs_str("new"),           NJS_TOKEN_NEW, 0 },
+    { njs_str("delete"),        NJS_TOKEN_DELETE, 0 },
+    { njs_str("yield"),         NJS_TOKEN_YIELD, 0 },
+
+    /* Statements. */
+
+    { njs_str("var"),           NJS_TOKEN_VAR, 0 },
+    { njs_str("if"),            NJS_TOKEN_IF, 0 },
+    { njs_str("else"),          NJS_TOKEN_ELSE, 0 },
+    { njs_str("while"),         NJS_TOKEN_WHILE, 0 },
+    { njs_str("do"),            NJS_TOKEN_DO, 0 },
+    { njs_str("for"),           NJS_TOKEN_FOR, 0 },
+    { njs_str("break"),         NJS_TOKEN_BREAK, 0 },
+    { njs_str("continue"),      NJS_TOKEN_CONTINUE, 0 },
+    { njs_str("switch"),        NJS_TOKEN_SWITCH, 0 },
+    { njs_str("case"),          NJS_TOKEN_CASE, 0 },
+    { njs_str("default"),       NJS_TOKEN_DEFAULT, 0 },
+    { njs_str("function"),      NJS_TOKEN_FUNCTION, 0 },
+    { njs_str("return"),        NJS_TOKEN_RETURN, 0 },
+    { njs_str("with"),          NJS_TOKEN_WITH, 0 },
+    { njs_str("try"),           NJS_TOKEN_TRY, 0 },
+    { njs_str("catch"),         NJS_TOKEN_CATCH, 0 },
+    { njs_str("finally"),       NJS_TOKEN_FINALLY, 0 },
+    { njs_str("throw"),         NJS_TOKEN_THROW, 0 },
+
+    /* Builtin objects. */
+
+    { njs_str("this"),          NJS_TOKEN_THIS, 0 },
+    { njs_str("arguments"),     NJS_TOKEN_ARGUMENTS, 0 },
+    { njs_str("njs"),           NJS_TOKEN_NJS, 0 },
+    { njs_str("process"),       NJS_TOKEN_PROCESS, 0 },
+    { njs_str("Math"),          NJS_TOKEN_MATH, 0 },
+    { njs_str("JSON"),          NJS_TOKEN_JSON, 0 },
+
+    /* Builtin functions. */
+
+    { njs_str("Object"),        NJS_TOKEN_OBJECT_CONSTRUCTOR, 0 },
+    { njs_str("Array"),         NJS_TOKEN_ARRAY_CONSTRUCTOR, 0 },
+    { njs_str("Boolean"),       NJS_TOKEN_BOOLEAN_CONSTRUCTOR, 0 },
+    { njs_str("Number"),        NJS_TOKEN_NUMBER_CONSTRUCTOR, 0 },
+    { njs_str("String"),        NJS_TOKEN_STRING_CONSTRUCTOR, 0 },
+    { njs_str("Function"),      NJS_TOKEN_FUNCTION_CONSTRUCTOR, 0 },
+    { njs_str("RegExp"),        NJS_TOKEN_REGEXP_CONSTRUCTOR, 0 },
+    { njs_str("Date"),          NJS_TOKEN_DATE_CONSTRUCTOR, 0 },
+    { njs_str("Error"),         NJS_TOKEN_ERROR_CONSTRUCTOR, 0 },
+    { njs_str("EvalError"),     NJS_TOKEN_EVAL_ERROR_CONSTRUCTOR, 0 },
+    { njs_str("InternalError"), NJS_TOKEN_INTERNAL_ERROR_CONSTRUCTOR, 0 },
+    { njs_str("RangeError"),    NJS_TOKEN_RANGE_ERROR_CONSTRUCTOR, 0 },
+    { njs_str("ReferenceError"), NJS_TOKEN_REF_ERROR_CONSTRUCTOR, 0 },
+    { njs_str("SyntaxError"),   NJS_TOKEN_SYNTAX_ERROR_CONSTRUCTOR, 0 },
+    { njs_str("TypeError"),     NJS_TOKEN_TYPE_ERROR_CONSTRUCTOR, 0 },
+    { njs_str("URIError"),      NJS_TOKEN_URI_ERROR_CONSTRUCTOR, 0 },
+    { njs_str("MemoryError"),   NJS_TOKEN_MEMORY_ERROR_CONSTRUCTOR, 0 },
+
+    { njs_str("eval"),          NJS_TOKEN_EVAL, 0 },
+    { njs_str("toString"),      NJS_TOKEN_TO_STRING, 0 },
+    { njs_str("isNaN"),         NJS_TOKEN_IS_NAN, 0 },
+    { njs_str("isFinite"),      NJS_TOKEN_IS_FINITE, 0 },
+    { njs_str("parseInt"),      NJS_TOKEN_PARSE_INT, 0 },
+    { njs_str("parseFloat"),    NJS_TOKEN_PARSE_FLOAT, 0 },
+    { njs_str("encodeURI"),     NJS_TOKEN_ENCODE_URI, 0 },
+    { njs_str("encodeURIComponent"),  NJS_TOKEN_ENCODE_URI_COMPONENT, 0 },
+    { njs_str("decodeURI"),     NJS_TOKEN_DECODE_URI, 0 },
+    { njs_str("decodeURIComponent"),  NJS_TOKEN_DECODE_URI_COMPONENT, 0 },
+    { njs_str("require"),       NJS_TOKEN_REQUIRE, 0 },
+    { njs_str("setTimeout"),    NJS_TOKEN_SET_TIMEOUT, 0 },
+    { njs_str("setImmediate"),  NJS_TOKEN_SET_IMMEDIATE, 0 },
+    { njs_str("clearTimeout"),  NJS_TOKEN_CLEAR_TIMEOUT, 0 },
+
+    /* Module. */
+    { njs_str("import"),        NJS_TOKEN_IMPORT, 0 },
+    { njs_str("from"),          NJS_TOKEN_FROM, 0 },
+    { njs_str("export"),        NJS_TOKEN_EXPORT, 0 },
+
+    /* Reserved words. */
+
+    { njs_str("await"),         NJS_TOKEN_RESERVED, 0 },
+    { njs_str("class"),         NJS_TOKEN_RESERVED, 0 },
+    { njs_str("const"),         NJS_TOKEN_RESERVED, 0 },
+    { njs_str("debugger"),      NJS_TOKEN_RESERVED, 0 },
+    { njs_str("enum"),          NJS_TOKEN_RESERVED, 0 },
+    { njs_str("extends"),       NJS_TOKEN_RESERVED, 0 },
+    { njs_str("implements"),    NJS_TOKEN_RESERVED, 0 },
+    { njs_str("interface"),     NJS_TOKEN_RESERVED, 0 },
+    { njs_str("let"),           NJS_TOKEN_RESERVED, 0 },
+    { njs_str("package"),       NJS_TOKEN_RESERVED, 0 },
+    { njs_str("private"),       NJS_TOKEN_RESERVED, 0 },
+    { njs_str("protected"),     NJS_TOKEN_RESERVED, 0 },
+    { njs_str("public"),        NJS_TOKEN_RESERVED, 0 },
+    { njs_str("static"),        NJS_TOKEN_RESERVED, 0 },
+    { njs_str("super"),         NJS_TOKEN_RESERVED, 0 },
+};
+
+
+static njs_int_t
+njs_keyword_hash_test(njs_lvlhsh_query_t *lhq, void *data)
+{
+    njs_keyword_t  *keyword;
+
+    keyword = data;
+
+    if (njs_strstr_eq(&lhq->key, &keyword->name)) {
+        return NJS_OK;
+    }
+
+    return NJS_DECLINED;
+}
+
+
+const njs_lvlhsh_proto_t  njs_keyword_hash_proto
+    njs_aligned(64) =
+{
+    NJS_LVLHSH_DEFAULT,
+    njs_keyword_hash_test,
+    njs_lvlhsh_alloc,
+    njs_lvlhsh_free,
+};
+
+
+njs_int_t
+njs_lexer_keywords_init(njs_mp_t *mp, njs_lvlhsh_t *hash)
+{
+    njs_uint_t           n;
+    njs_lvlhsh_query_t   lhq;
+    const njs_keyword_t  *keyword;
+
+    keyword = njs_keywords;
+    n = njs_nitems(njs_keywords);
+
+    lhq.replace = 0;
+    lhq.proto = &njs_keyword_hash_proto;
+    lhq.pool = mp;
+
+    do {
+        lhq.key_hash = njs_djb_hash(keyword->name.start, keyword->name.length);
+        lhq.key = keyword->name;
+        lhq.value = (void *) keyword;
+
+        if (njs_slow_path(njs_lvlhsh_insert(hash, &lhq) != NJS_OK)) {
+            return NJS_ERROR;
+        }
+
+        keyword++;
+        n--;
+
+    } while (n != 0);
+
+    return NJS_OK;
+}
+
+
+void
+njs_lexer_keyword(njs_lexer_t *lexer, njs_lexer_token_t *lt)
+{
+    njs_keyword_t       *keyword;
+    njs_lvlhsh_query_t  lhq;
+
+    lhq.key_hash = lt->key_hash;
+    lhq.key = lt->text;
+    lhq.proto = &njs_keyword_hash_proto;
+
+    if (njs_lvlhsh_find(&lexer->keywords_hash, &lhq) == NJS_OK) {
+        keyword = lhq.value;
+        lt->token = keyword->token;
+        lt->number = keyword->number;
+        lexer->keyword = 1;
+    }
+}
diff --git a/src/njs_lvlhsh.c b/src/njs_lvlhsh.c
new file mode 100644 (file)
index 0000000..090b750
--- /dev/null
@@ -0,0 +1,859 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_lvlhsh.h>
+#include <string.h>
+
+
+/*
+ * The level hash consists of hierarchical levels of arrays of pointers.
+ * The pointers may point to another level, a bucket, or NULL.
+ * The levels and buckets must be allocated in manner alike posix_memalign()
+ * to bookkeep additional information in pointer low bits.
+ *
+ * A level is an array of pointers.  Its size is a power of 2.  Levels
+ * may be different sizes, but on the same level the sizes are the same.
+ * Level sizes are specified by number of bits per level in lvlhsh->shift
+ * array.  A hash may have up to 7 levels.  There are two predefined
+ * shift arrays given by the first two shift array values:
+ *
+ * 1) [0, 0]:  [4, 4, 4, 4, 4, 4, 4] on a 64-bit platform or
+ *             [5, 5, 5, 5, 5, 5, 0] on a 32-bit platform,
+ *    so default size of levels is 128 bytes.
+ *
+ * 2) [0, 10]: [10, 4, 4, 4, 4, 4, 0] on a 64-bit platform or
+ *             [10, 5, 5, 5, 5, 0, 0] on a 32-bit platform,
+ *    so default size of levels is 128 bytes on all levels except
+ *    the first level.  The first level is 8K or 4K on 64-bit or 32-bit
+ *    platforms respectively.
+ *
+ * All buckets in a hash are the same size which is a power of 2.
+ * A bucket contains several entries stored and tested sequentially.
+ * The bucket size should be one or two CPU cache line size, a minimum
+ * allowed size is 32 bytes.  A default 128-byte bucket contains 10 64-bit
+ * entries or 15 32-bit entries.  Each entry consists of pointer to value
+ * data and 32-bit key.  If an entry value pointer is NULL, the entry is free.
+ * On a 64-bit platform entry value pointers are no aligned, therefore they
+ * are accessed as two 32-bit integers.  The rest trailing space in a bucket
+ * is used as pointer to next bucket and this pointer is always aligned.
+ * Although the level hash allows to store a lot of values in a bucket chain,
+ * this is non optimal way.  The large data set should be stored using
+ * several levels.
+ */
+
+#define njs_lvlhsh_is_bucket(p)                                               \
+    ((uintptr_t) (p) & 1)
+
+
+#define njs_lvlhsh_count_inc(n)                                               \
+    n = (void *) ((uintptr_t) (n) + 2)
+
+
+#define njs_lvlhsh_count_dec(n)                                               \
+    n = (void *) ((uintptr_t) (n) - 2)
+
+
+#define njs_lvlhsh_level_size(proto, nlvl)                                    \
+    ((uintptr_t) 1 << proto->shift[nlvl])
+
+
+#define njs_lvlhsh_level(lvl, mask)                                           \
+    (void **) ((uintptr_t) lvl & (~mask << 2))
+
+
+#define njs_lvlhsh_level_entries(lvl, mask)                                   \
+    ((uintptr_t) lvl & (mask << 1))
+
+
+#define njs_lvlhsh_store_bucket(slot, bkt)                                    \
+    slot = (void **) ((uintptr_t) bkt | 2 | 1)
+
+
+#define njs_lvlhsh_bucket_size(proto)                                         \
+    proto->bucket_size
+
+
+#define njs_lvlhsh_bucket(proto, bkt)                                         \
+    (uint32_t *) ((uintptr_t) bkt & ~(uintptr_t) proto->bucket_mask)
+
+
+#define njs_lvlhsh_bucket_entries(proto, bkt)                                 \
+    (((uintptr_t) bkt & (uintptr_t) proto->bucket_mask) >> 1)
+
+
+#define njs_lvlhsh_bucket_end(proto, bkt)                                     \
+    &bkt[proto->bucket_end]
+
+
+#define njs_lvlhsh_free_entry(e)                                              \
+    (!(njs_lvlhsh_valid_entry(e)))
+
+
+#define njs_lvlhsh_next_bucket(proto, bkt)                                    \
+    ((void **) &bkt[proto->bucket_end])
+
+#if (NJS_64BIT)
+
+#define njs_lvlhsh_valid_entry(e)                                             \
+    (((e)[0] | (e)[1]) != 0)
+
+
+#define njs_lvlhsh_entry_value(e)                                             \
+    (void *) (((uintptr_t) (e)[1] << 32) + (e)[0])
+
+
+#define njs_lvlhsh_set_entry_value(e, n)                                      \
+    (e)[0] = (uint32_t)  (uintptr_t) n;                                       \
+    (e)[1] = (uint32_t) ((uintptr_t) n >> 32)
+
+
+#define njs_lvlhsh_entry_key(e)                                               \
+    (e)[2]
+
+
+#define njs_lvlhsh_set_entry_key(e, n)                                        \
+    (e)[2] = n
+
+#else
+
+#define njs_lvlhsh_valid_entry(e)                                             \
+    ((e)[0] != 0)
+
+
+#define njs_lvlhsh_entry_value(e)                                             \
+    (void *) (e)[0]
+
+
+#define njs_lvlhsh_set_entry_value(e, n)                                      \
+    (e)[0] = (uint32_t) n
+
+
+#define njs_lvlhsh_entry_key(e)                                               \
+    (e)[1]
+
+
+#define njs_lvlhsh_set_entry_key(e, n)                                        \
+    (e)[1] = n
+
+#endif
+
+
+#define NJS_LVLHSH_BUCKET_DONE  ((void *) -1)
+
+
+static njs_int_t njs_lvlhsh_level_find(njs_lvlhsh_query_t *lhq, void **lvl,
+    uint32_t key, njs_uint_t nlvl);
+static njs_int_t njs_lvlhsh_bucket_find(njs_lvlhsh_query_t *lhq, void **bkt);
+static njs_int_t njs_lvlhsh_new_bucket(njs_lvlhsh_query_t *lhq, void **slot);
+static njs_int_t njs_lvlhsh_level_insert(njs_lvlhsh_query_t *lhq,
+    void **slot, uint32_t key, njs_uint_t nlvl);
+static njs_int_t njs_lvlhsh_bucket_insert(njs_lvlhsh_query_t *lhq,
+    void **slot, uint32_t key, njs_int_t nlvl);
+static njs_int_t njs_lvlhsh_convert_bucket_to_level(njs_lvlhsh_query_t *lhq,
+    void **slot, njs_uint_t nlvl, uint32_t *bucket);
+static njs_int_t njs_lvlhsh_level_convertion_insert(njs_lvlhsh_query_t *lhq,
+    void **parent, uint32_t key, njs_uint_t nlvl);
+static njs_int_t njs_lvlhsh_bucket_convertion_insert(njs_lvlhsh_query_t *lhq,
+    void **slot, uint32_t key, njs_int_t nlvl);
+static njs_int_t njs_lvlhsh_free_level(njs_lvlhsh_query_t *lhq, void **level,
+    njs_uint_t size);
+static njs_int_t njs_lvlhsh_level_delete(njs_lvlhsh_query_t *lhq, void **slot,
+    uint32_t key, njs_uint_t nlvl);
+static njs_int_t njs_lvlhsh_bucket_delete(njs_lvlhsh_query_t *lhq, void **bkt);
+static void *njs_lvlhsh_level_each(njs_lvlhsh_each_t *lhe, void **level,
+    njs_uint_t nlvl, njs_uint_t shift);
+static void *njs_lvlhsh_bucket_each(njs_lvlhsh_each_t *lhe);
+
+
+njs_int_t
+njs_lvlhsh_find(const njs_lvlhsh_t *lh, njs_lvlhsh_query_t *lhq)
+{
+    void  *slot;
+
+    slot = lh->slot;
+
+    if (njs_fast_path(slot != NULL)) {
+
+        if (njs_lvlhsh_is_bucket(slot)) {
+            return njs_lvlhsh_bucket_find(lhq, slot);
+        }
+
+        return njs_lvlhsh_level_find(lhq, slot, lhq->key_hash, 0);
+    }
+
+    return NJS_DECLINED;
+}
+
+
+static njs_int_t
+njs_lvlhsh_level_find(njs_lvlhsh_query_t *lhq, void **lvl, uint32_t key,
+    njs_uint_t nlvl)
+{
+    void        **slot;
+    uintptr_t   mask;
+    njs_uint_t  shift;
+
+    shift = lhq->proto->shift[nlvl];
+    mask = ((uintptr_t) 1 << shift) - 1;
+
+    lvl = njs_lvlhsh_level(lvl, mask);
+    slot = lvl[key & mask];
+
+    if (slot != NULL) {
+
+        if (njs_lvlhsh_is_bucket(slot)) {
+            return njs_lvlhsh_bucket_find(lhq, slot);
+        }
+
+        return njs_lvlhsh_level_find(lhq, slot, key >> shift, nlvl + 1);
+    }
+
+    return NJS_DECLINED;
+}
+
+
+static njs_int_t
+njs_lvlhsh_bucket_find(njs_lvlhsh_query_t *lhq, void **bkt)
+{
+    void        *value;
+    uint32_t    *bucket, *e;
+    njs_uint_t  n;
+
+    do {
+        bucket = njs_lvlhsh_bucket(lhq->proto, bkt);
+        n = njs_lvlhsh_bucket_entries(lhq->proto, bkt);
+        e = bucket;
+
+        do {
+            if (njs_lvlhsh_valid_entry(e)) {
+                n--;
+
+                if (njs_lvlhsh_entry_key(e) == lhq->key_hash) {
+
+                    value = njs_lvlhsh_entry_value(e);
+
+                    if (lhq->proto->test(lhq, value) == NJS_OK) {
+                        lhq->value = value;
+
+                        return NJS_OK;
+                    }
+                }
+            }
+
+            e += NJS_LVLHSH_ENTRY_SIZE;
+
+        } while (n != 0);
+
+        bkt = *njs_lvlhsh_next_bucket(lhq->proto, bucket);
+
+    } while (bkt != NULL);
+
+    return NJS_DECLINED;
+}
+
+
+njs_int_t
+njs_lvlhsh_insert(njs_lvlhsh_t *lh, njs_lvlhsh_query_t *lhq)
+{
+    uint32_t  key;
+
+    if (njs_fast_path(lh->slot != NULL)) {
+
+        key = lhq->key_hash;
+
+        if (njs_lvlhsh_is_bucket(lh->slot)) {
+            return njs_lvlhsh_bucket_insert(lhq, &lh->slot, key, -1);
+        }
+
+        return njs_lvlhsh_level_insert(lhq, &lh->slot, key, 0);
+    }
+
+    return njs_lvlhsh_new_bucket(lhq, &lh->slot);
+}
+
+
+static njs_int_t
+njs_lvlhsh_new_bucket(njs_lvlhsh_query_t *lhq, void **slot)
+{
+    uint32_t  *bucket;
+
+    bucket = lhq->proto->alloc(lhq->pool, njs_lvlhsh_bucket_size(lhq->proto));
+
+    if (njs_fast_path(bucket != NULL)) {
+
+        njs_lvlhsh_set_entry_value(bucket, lhq->value);
+        njs_lvlhsh_set_entry_key(bucket, lhq->key_hash);
+
+        *njs_lvlhsh_next_bucket(lhq->proto, bucket) = NULL;
+
+        njs_lvlhsh_store_bucket(*slot, bucket);
+
+        return NJS_OK;
+    }
+
+    return NJS_ERROR;
+}
+
+
+static njs_int_t
+njs_lvlhsh_level_insert(njs_lvlhsh_query_t *lhq, void **parent, uint32_t key,
+    njs_uint_t nlvl)
+{
+    void        **slot, **lvl;
+    njs_int_t   ret;
+    uintptr_t   mask;
+    njs_uint_t  shift;
+
+    shift = lhq->proto->shift[nlvl];
+    mask = ((uintptr_t) 1 << shift) - 1;
+
+    lvl = njs_lvlhsh_level(*parent, mask);
+    slot = &lvl[key & mask];
+
+    if (*slot != NULL) {
+        key >>= shift;
+
+        if (njs_lvlhsh_is_bucket(*slot)) {
+            return njs_lvlhsh_bucket_insert(lhq, slot, key, nlvl);
+        }
+
+        return njs_lvlhsh_level_insert(lhq, slot, key, nlvl + 1);
+    }
+
+    ret = njs_lvlhsh_new_bucket(lhq, slot);
+
+    if (njs_fast_path(ret == NJS_OK)) {
+        njs_lvlhsh_count_inc(*parent);
+    }
+
+    return ret;
+}
+
+
+static njs_int_t
+njs_lvlhsh_bucket_insert(njs_lvlhsh_query_t *lhq, void **slot, uint32_t key,
+    njs_int_t nlvl)
+{
+    void                      **bkt, **vacant_bucket, *value;
+    uint32_t                  *bucket, *e, *vacant_entry;
+    njs_int_t                 ret;
+    uintptr_t                 n;
+    const void                *new_value;
+    const njs_lvlhsh_proto_t  *proto;
+
+    bkt = slot;
+    vacant_entry = NULL;
+    vacant_bucket = NULL;
+    proto = lhq->proto;
+
+    /* Search for duplicate entry in bucket chain. */
+
+    do {
+        bucket = njs_lvlhsh_bucket(proto, *bkt);
+        n = njs_lvlhsh_bucket_entries(proto, *bkt);
+        e = bucket;
+
+        do {
+            if (njs_lvlhsh_valid_entry(e)) {
+
+                if (njs_lvlhsh_entry_key(e) == lhq->key_hash) {
+
+                    value = njs_lvlhsh_entry_value(e);
+
+                    if (proto->test(lhq, value) == NJS_OK) {
+
+                        new_value = lhq->value;
+                        lhq->value = value;
+
+                        if (lhq->replace) {
+                            njs_lvlhsh_set_entry_value(e, new_value);
+
+                            return NJS_OK;
+                        }
+
+                        return NJS_DECLINED;
+                    }
+                }
+
+                n--;
+
+            } else {
+                /*
+                 * Save a hole vacant position in bucket
+                 * and continue to search for duplicate entry.
+                 */
+                if (vacant_entry == NULL) {
+                    vacant_entry = e;
+                    vacant_bucket = bkt;
+                }
+            }
+
+            e += NJS_LVLHSH_ENTRY_SIZE;
+
+        } while (n != 0);
+
+        if (e < njs_lvlhsh_bucket_end(proto, bucket)) {
+            /*
+             * Save a vacant position on incomplete bucket's end
+             * and continue to search for duplicate entry.
+             */
+            if (vacant_entry == NULL) {
+                vacant_entry = e;
+                vacant_bucket = bkt;
+            }
+        }
+
+        bkt = njs_lvlhsh_next_bucket(proto, bucket);
+
+    } while (*bkt != NULL);
+
+    if (vacant_entry != NULL) {
+        njs_lvlhsh_set_entry_value(vacant_entry, lhq->value);
+        njs_lvlhsh_set_entry_key(vacant_entry, lhq->key_hash);
+        njs_lvlhsh_count_inc(*vacant_bucket);
+
+        return NJS_OK;
+    }
+
+    /* All buckets are full. */
+
+    nlvl++;
+
+    if (njs_fast_path(proto->shift[nlvl] != 0)) {
+
+        ret = njs_lvlhsh_convert_bucket_to_level(lhq, slot, nlvl, bucket);
+
+        if (njs_fast_path(ret == NJS_OK)) {
+            return njs_lvlhsh_level_insert(lhq, slot, key, nlvl);
+        }
+
+        return ret;
+    }
+
+    /* The last allowed level, only buckets may be allocated here. */
+
+    return njs_lvlhsh_new_bucket(lhq, bkt);
+}
+
+
+static njs_int_t
+njs_lvlhsh_convert_bucket_to_level(njs_lvlhsh_query_t *lhq, void **slot,
+    njs_uint_t nlvl, uint32_t *bucket)
+{
+    void                      *lvl, **level;
+    uint32_t                  *e, *end, key;
+    njs_int_t                 ret;
+    njs_uint_t                i, shift, size;
+    njs_lvlhsh_query_t        q;
+    const njs_lvlhsh_proto_t  *proto;
+
+    proto = lhq->proto;
+    size = njs_lvlhsh_level_size(proto, nlvl);
+
+    lvl = proto->alloc(lhq->pool, size * (sizeof(void *)));
+
+    if (njs_slow_path(lvl == NULL)) {
+        return NJS_ERROR;
+    }
+
+    njs_memzero(lvl, size * (sizeof(void *)));
+
+    level = lvl;
+    shift = 0;
+
+    for (i = 0; i < nlvl; i++) {
+        /*
+         * Using SIMD operations in this trivial loop with maximum
+         * 8 iterations may increase code size by 170 bytes.
+         */
+        njs_pragma_loop_disable_vectorization;
+
+        shift += proto->shift[i];
+    }
+
+    end = njs_lvlhsh_bucket_end(proto, bucket);
+
+    for (e = bucket; e < end; e += NJS_LVLHSH_ENTRY_SIZE) {
+
+        q.proto = proto;
+        q.pool = lhq->pool;
+        q.value = njs_lvlhsh_entry_value(e);
+        key = njs_lvlhsh_entry_key(e);
+        q.key_hash = key;
+
+        ret = njs_lvlhsh_level_convertion_insert(&q, &lvl, key >> shift, nlvl);
+
+        if (njs_slow_path(ret != NJS_OK)) {
+            return njs_lvlhsh_free_level(lhq, level, size);
+        }
+    }
+
+    *slot = lvl;
+
+    proto->free(lhq->pool, bucket, njs_lvlhsh_bucket_size(proto));
+
+    return NJS_OK;
+}
+
+
+static njs_int_t
+njs_lvlhsh_level_convertion_insert(njs_lvlhsh_query_t *lhq, void **parent,
+    uint32_t key, njs_uint_t nlvl)
+{
+    void        **slot, **lvl;
+    njs_int_t   ret;
+    uintptr_t   mask;
+    njs_uint_t  shift;
+
+    shift = lhq->proto->shift[nlvl];
+    mask = ((uintptr_t) 1 << shift) - 1;
+
+    lvl = njs_lvlhsh_level(*parent, mask);
+    slot = &lvl[key & mask];
+
+    if (*slot == NULL) {
+        ret = njs_lvlhsh_new_bucket(lhq, slot);
+
+        if (njs_fast_path(ret == NJS_OK)) {
+            njs_lvlhsh_count_inc(*parent);
+        }
+
+        return ret;
+    }
+
+    /* Only backets can be here. */
+
+    return njs_lvlhsh_bucket_convertion_insert(lhq, slot, key >> shift, nlvl);
+}
+
+
+/*
+ * The special bucket insertion procedure is required because during
+ * convertion lhq->key contains garbage values and the test function
+ * cannot be called.  Besides, the procedure can be simpler because
+ * a new entry is inserted just after occupied entries.
+ */
+
+static njs_int_t
+njs_lvlhsh_bucket_convertion_insert(njs_lvlhsh_query_t *lhq, void **slot,
+    uint32_t key, njs_int_t nlvl)
+{
+    void                      **bkt;
+    uint32_t                  *bucket, *e;
+    njs_int_t                 ret;
+    uintptr_t                 n;
+    const njs_lvlhsh_proto_t  *proto;
+
+    bkt = slot;
+    proto = lhq->proto;
+
+    do {
+        bucket = njs_lvlhsh_bucket(proto, *bkt);
+        n = njs_lvlhsh_bucket_entries(proto, *bkt);
+        e = bucket + n * NJS_LVLHSH_ENTRY_SIZE;
+
+        if (njs_fast_path(e < njs_lvlhsh_bucket_end(proto, bucket))) {
+
+            njs_lvlhsh_set_entry_value(e, lhq->value);
+            njs_lvlhsh_set_entry_key(e, lhq->key_hash);
+            njs_lvlhsh_count_inc(*bkt);
+
+            return NJS_OK;
+        }
+
+        bkt = njs_lvlhsh_next_bucket(proto, bucket);
+
+    } while (*bkt != NULL);
+
+    /* All buckets are full. */
+
+    nlvl++;
+
+    if (njs_fast_path(proto->shift[nlvl] != 0)) {
+
+        ret = njs_lvlhsh_convert_bucket_to_level(lhq, slot, nlvl, bucket);
+
+        if (njs_fast_path(ret == NJS_OK)) {
+            return njs_lvlhsh_level_insert(lhq, slot, key, nlvl);
+        }
+
+        return ret;
+    }
+
+    /* The last allowed level, only buckets may be allocated here. */
+
+    return njs_lvlhsh_new_bucket(lhq, bkt);
+}
+
+
+static njs_int_t
+njs_lvlhsh_free_level(njs_lvlhsh_query_t *lhq, void **level, njs_uint_t size)
+{
+    size_t                    bsize;
+    njs_uint_t                i;
+    const njs_lvlhsh_proto_t  *proto;
+
+    proto = lhq->proto;
+    bsize = njs_lvlhsh_bucket_size(proto);
+
+    for (i = 0; i < size; i++) {
+
+        if (level[i] != NULL) {
+            /*
+             * Chained buckets are not possible here, since even
+             * in the worst case one bucket cannot be converted
+             * in two chained buckets but remains the same bucket.
+             */
+            proto->free(lhq->pool, njs_lvlhsh_bucket(proto, level[i]), bsize);
+        }
+    }
+
+    proto->free(lhq->pool, level, size * (sizeof(void *)));
+
+    return NJS_ERROR;
+}
+
+
+njs_int_t
+njs_lvlhsh_delete(njs_lvlhsh_t *lh, njs_lvlhsh_query_t *lhq)
+{
+    if (njs_fast_path(lh->slot != NULL)) {
+
+        if (njs_lvlhsh_is_bucket(lh->slot)) {
+            return njs_lvlhsh_bucket_delete(lhq, &lh->slot);
+        }
+
+        return njs_lvlhsh_level_delete(lhq, &lh->slot, lhq->key_hash, 0);
+    }
+
+    return NJS_DECLINED;
+}
+
+
+static njs_int_t
+njs_lvlhsh_level_delete(njs_lvlhsh_query_t *lhq, void **parent, uint32_t key,
+    njs_uint_t nlvl)
+{
+    size_t      size;
+    void        **slot, **lvl;
+    uintptr_t   mask;
+    njs_int_t   ret;
+    njs_uint_t  shift;
+
+    shift = lhq->proto->shift[nlvl];
+    mask = ((uintptr_t) 1 << shift) - 1;
+
+    lvl = njs_lvlhsh_level(*parent, mask);
+    slot = &lvl[key & mask];
+
+    if (*slot != NULL) {
+
+        if (njs_lvlhsh_is_bucket(*slot)) {
+            ret = njs_lvlhsh_bucket_delete(lhq, slot);
+
+        } else {
+            key >>= shift;
+            ret = njs_lvlhsh_level_delete(lhq, slot, key, nlvl + 1);
+        }
+
+        if (*slot == NULL) {
+            njs_lvlhsh_count_dec(*parent);
+
+            if (njs_lvlhsh_level_entries(*parent, mask) == 0) {
+                *parent = NULL;
+                size = njs_lvlhsh_level_size(lhq->proto, nlvl);
+                lhq->proto->free(lhq->pool, lvl, size * sizeof(void *));
+            }
+        }
+
+        return ret;
+    }
+
+    return NJS_DECLINED;
+}
+
+
+static njs_int_t
+njs_lvlhsh_bucket_delete(njs_lvlhsh_query_t *lhq, void **bkt)
+{
+    void                      *value;
+    size_t                    size;
+    uint32_t                  *bucket, *e;
+    uintptr_t                 n;
+    const njs_lvlhsh_proto_t  *proto;
+
+    proto = lhq->proto;
+
+    do {
+        bucket = njs_lvlhsh_bucket(proto, *bkt);
+        n = njs_lvlhsh_bucket_entries(proto, *bkt);
+        e = bucket;
+
+        do {
+            if (njs_lvlhsh_valid_entry(e)) {
+
+                if (njs_lvlhsh_entry_key(e) == lhq->key_hash) {
+
+                    value = njs_lvlhsh_entry_value(e);
+
+                    if (proto->test(lhq, value) == NJS_OK) {
+
+                        if (njs_lvlhsh_bucket_entries(proto, *bkt) == 1) {
+                            *bkt = *njs_lvlhsh_next_bucket(proto, bucket);
+                            size = njs_lvlhsh_bucket_size(proto);
+                            proto->free(lhq->pool, bucket, size);
+
+                        } else {
+                            njs_lvlhsh_count_dec(*bkt);
+                            njs_lvlhsh_set_entry_value(e, NULL);
+                        }
+
+                        lhq->value = value;
+
+                        return NJS_OK;
+                    }
+                }
+
+                n--;
+            }
+
+            e += NJS_LVLHSH_ENTRY_SIZE;
+
+        } while (n != 0);
+
+        bkt = njs_lvlhsh_next_bucket(proto, bucket);
+
+    } while (*bkt != NULL);
+
+    return NJS_DECLINED;
+}
+
+
+void *
+njs_lvlhsh_each(const njs_lvlhsh_t *lh, njs_lvlhsh_each_t *lhe)
+{
+    void  **slot;
+
+    if (lhe->bucket == NJS_LVLHSH_BUCKET_DONE) {
+        slot = lh->slot;
+
+        if (njs_lvlhsh_is_bucket(slot)) {
+            return NULL;
+        }
+
+    } else {
+        if (njs_slow_path(lhe->bucket == NULL)) {
+
+            /* The first iteration only. */
+
+            slot = lh->slot;
+
+            if (slot == NULL) {
+                return NULL;
+            }
+
+            if (!njs_lvlhsh_is_bucket(slot)) {
+                goto level;
+            }
+
+            lhe->bucket = njs_lvlhsh_bucket(lhe->proto, slot);
+            lhe->entries = njs_lvlhsh_bucket_entries(lhe->proto, slot);
+        }
+
+        return njs_lvlhsh_bucket_each(lhe);
+    }
+
+level:
+
+    return njs_lvlhsh_level_each(lhe, slot, 0, 0);
+}
+
+
+static void *
+njs_lvlhsh_level_each(njs_lvlhsh_each_t *lhe, void **level, njs_uint_t nlvl,
+    njs_uint_t shift)
+{
+    void        **slot, *value;
+    uintptr_t   mask;
+    njs_uint_t  n, level_shift;
+
+    level_shift = lhe->proto->shift[nlvl];
+    mask = ((uintptr_t) 1 << level_shift) - 1;
+
+    level = njs_lvlhsh_level(level, mask);
+
+    do {
+        n = (lhe->current >> shift) & mask;
+        slot = level[n];
+
+        if (slot != NULL) {
+            if (njs_lvlhsh_is_bucket(slot)) {
+
+                if (lhe->bucket != NJS_LVLHSH_BUCKET_DONE) {
+
+                    lhe->bucket = njs_lvlhsh_bucket(lhe->proto, slot);
+                    lhe->entries = njs_lvlhsh_bucket_entries(lhe->proto, slot);
+                    lhe->entry = 0;
+
+                    return njs_lvlhsh_bucket_each(lhe);
+                }
+
+                lhe->bucket = NULL;
+
+            } else {
+                value = njs_lvlhsh_level_each(lhe, slot, nlvl + 1,
+                                              shift + level_shift);
+                if (value != NULL) {
+                    return value;
+                }
+            }
+        }
+
+        lhe->current &= ~(mask << shift);
+        n = ((n + 1) & mask) << shift;
+        lhe->current |= n;
+
+    } while (n != 0);
+
+    return NULL;
+}
+
+
+static void *
+njs_lvlhsh_bucket_each(njs_lvlhsh_each_t *lhe)
+{
+    void      *value, **next;
+    uint32_t  *bucket;
+
+    /* At least one valid entry must present here. */
+    do {
+        bucket = &lhe->bucket[lhe->entry];
+        lhe->entry += NJS_LVLHSH_ENTRY_SIZE;
+
+    } while (njs_lvlhsh_free_entry(bucket));
+
+    value = njs_lvlhsh_entry_value(bucket);
+    lhe->key_hash = njs_lvlhsh_entry_key(bucket);
+
+    lhe->entries--;
+
+    if (lhe->entries == 0) {
+        next = *njs_lvlhsh_next_bucket(lhe->proto, lhe->bucket);
+
+        lhe->bucket = (next == NULL) ? NJS_LVLHSH_BUCKET_DONE
+                                     : njs_lvlhsh_bucket(lhe->proto, next);
+
+        lhe->entries = njs_lvlhsh_bucket_entries(lhe->proto, next);
+        lhe->entry = 0;
+    }
+
+    return value;
+}
diff --git a/src/njs_lvlhsh.h b/src/njs_lvlhsh.h
new file mode 100644 (file)
index 0000000..b913dcd
--- /dev/null
@@ -0,0 +1,174 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_LVLHSH_H_INCLUDED_
+#define _NJS_LVLHSH_H_INCLUDED_
+
+
+typedef struct njs_lvlhsh_query_s  njs_lvlhsh_query_t;
+
+typedef njs_int_t (*njs_lvlhsh_test_t)(njs_lvlhsh_query_t *lhq, void *data);
+typedef void *(*njs_lvlhsh_alloc_t)(void *ctx, size_t size);
+typedef void (*njs_lvlhsh_free_t)(void *ctx, void *p, size_t size);
+
+
+#if (NJS_64BIT)
+
+#define NJS_LVLHSH_DEFAULT_BUCKET_SIZE  128
+#define NJS_LVLHSH_ENTRY_SIZE           3
+
+/* 3 is shift of 64-bit pointer. */
+#define NJS_LVLHSH_MEMALIGN_SHIFT       (NJS_MAX_MEMALIGN_SHIFT - 3)
+
+#else
+
+#define NJS_LVLHSH_DEFAULT_BUCKET_SIZE  64
+#define NJS_LVLHSH_ENTRY_SIZE           2
+
+/* 2 is shift of 32-bit pointer. */
+#define NJS_LVLHSH_MEMALIGN_SHIFT       (NJS_MAX_MEMALIGN_SHIFT - 2)
+
+#endif
+
+
+#if (NJS_LVLHSH_MEMALIGN_SHIFT < 10)
+#define NJS_LVLHSH_MAX_MEMALIGN_SHIFT   NJS_LVLHSH_MEMALIGN_SHIFT
+#else
+#define NJS_LVLHSH_MAX_MEMALIGN_SHIFT   10
+#endif
+
+
+#define NJS_LVLHSH_BUCKET_END(bucket_size)                                    \
+    (((bucket_size) - sizeof(void *))                                         \
+        / (NJS_LVLHSH_ENTRY_SIZE * sizeof(uint32_t))                          \
+     * NJS_LVLHSH_ENTRY_SIZE)
+
+
+#define NJS_LVLHSH_BUCKET_SIZE(bucket_size)                                   \
+    NJS_LVLHSH_BUCKET_END(bucket_size), bucket_size, (bucket_size - 1)
+
+
+#define NJS_LVLHSH_DEFAULT                                                    \
+    NJS_LVLHSH_BUCKET_SIZE(NJS_LVLHSH_DEFAULT_BUCKET_SIZE),                   \
+    { 4, 4, 4, 4, 4, 4, 4, 0 }
+
+
+#define NJS_LVLHSH_LARGE_SLAB                                                 \
+    NJS_LVLHSH_BUCKET_SIZE(NJS_LVLHSH_DEFAULT_BUCKET_SIZE),                   \
+    { 10, 4, 4, 4, 4, 4, 4, 0 }
+
+
+#define NJS_LVLHSH_LARGE_MEMALIGN                                             \
+    NJS_LVLHSH_BUCKET_SIZE(NJS_LVLHSH_DEFAULT_BUCKET_SIZE),                   \
+    { NJS_LVLHSH_MAX_MEMALIGN_SHIFT, 4, 4, 4, 4, 0, 0, 0 }
+
+
+typedef struct {
+    uint32_t                  bucket_end;
+    uint32_t                  bucket_size;
+    uint32_t                  bucket_mask;
+    uint8_t                   shift[8];
+
+    njs_lvlhsh_test_t         test;
+    njs_lvlhsh_alloc_t        alloc;
+    njs_lvlhsh_free_t         free;
+} njs_lvlhsh_proto_t;
+
+
+typedef struct {
+    void                      *slot;
+} njs_lvlhsh_t;
+
+
+struct njs_lvlhsh_query_s {
+    uint32_t                  key_hash;
+    njs_str_t                 key;
+
+    uint8_t                   replace;     /* 1 bit */
+    void                      *value;
+
+    const njs_lvlhsh_proto_t  *proto;
+    void                      *pool;
+
+    /* Opaque data passed for the test function. */
+    void                      *data;
+};
+
+
+#define njs_lvlhsh_is_empty(lh)                                               \
+    ((lh)->slot == NULL)
+
+
+#define njs_lvlhsh_init(lh)                                                   \
+    (lh)->slot = NULL
+
+/*
+ * njs_lvlhsh_find() finds a hash element.  If the element has been
+ * found then it is stored in the lhq->value and njs_lvlhsh_find()
+ * returns NJS_OK.  Otherwise NJS_DECLINED is returned.
+ *
+ * The required njs_lvlhsh_query_t fields: key_hash, key, proto.
+ */
+NJS_EXPORT njs_int_t njs_lvlhsh_find(const njs_lvlhsh_t *lh,
+    njs_lvlhsh_query_t *lhq);
+
+/*
+ * njs_lvlhsh_insert() adds a hash element.  If the element already
+ * presents in lvlhsh and the lhq->replace flag is zero, then lhq->value
+ * is updated with the old element and NJS_DECLINED is returned.
+ * If the element already presents in lvlhsh and the lhq->replace flag
+ * is non-zero, then the old element is replaced with the new element.
+ * lhq->value is updated with the old element, and NJS_OK is returned.
+ * If the element is not present in lvlhsh, then it is inserted and
+ * NJS_OK is returned.  The lhq->value is not changed.
+ * On memory allocation failure NJS_ERROR is returned.
+ *
+ * The required njs_lvlhsh_query_t fields: key_hash, key, proto, replace, value.
+ * The optional njs_lvlhsh_query_t fields: pool.
+ */
+NJS_EXPORT njs_int_t njs_lvlhsh_insert(njs_lvlhsh_t *lh,
+    njs_lvlhsh_query_t *lhq);
+
+/*
+ * njs_lvlhsh_delete() deletes a hash element.  If the element has been
+ * found then it is removed from lvlhsh and is stored in the lhq->value,
+ * and NJS_OK is returned.  Otherwise NJS_DECLINED is returned.
+ *
+ * The required njs_lvlhsh_query_t fields: key_hash, key, proto.
+ * The optional njs_lvlhsh_query_t fields: pool.
+ */
+NJS_EXPORT njs_int_t njs_lvlhsh_delete(njs_lvlhsh_t *lh,
+    njs_lvlhsh_query_t *lhq);
+
+
+typedef struct {
+    const njs_lvlhsh_proto_t  *proto;
+
+    /*
+     * Fields to store current bucket entry position.  They cannot be
+     * combined in a single bucket pointer with number of entries in low
+     * bits, because entry positions are not aligned.  A current level is
+     * stored as key bit path from the root.
+     */
+    uint32_t                  *bucket;
+    uint32_t                  current;
+    uint32_t                  entry;
+    uint32_t                  entries;
+    uint32_t                  key_hash;
+} njs_lvlhsh_each_t;
+
+
+#define njs_lvlhsh_each_init(lhe, _proto)                                     \
+    do {                                                                      \
+        njs_memzero(lhe, sizeof(njs_lvlhsh_each_t));                          \
+        (lhe)->proto = _proto;                                                \
+    } while (0)
+
+NJS_EXPORT void *njs_lvlhsh_each(const njs_lvlhsh_t *lh,
+    njs_lvlhsh_each_t *lhe);
+
+
+#endif /* _NJS_LVLHSH_H_INCLUDED_ */
similarity index 55%
rename from njs/njs_core.h
rename to src/njs_main.h
index 091865380e9e306b243d859d1bcedac8435bb902..77803a0812400a412d33495c94aca96d88169ce3 100644 (file)
@@ -8,28 +8,28 @@
 #define _NJS_CORE_H_INCLUDED_
 
 
-#include <nxt_auto_config.h>
-
-#include <nxt_unix.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_alignment.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_utf8.h>
-#include <nxt_dtoa.h>
-#include <nxt_strtod.h>
-#include <nxt_djb_hash.h>
-#include <nxt_trace.h>
-#include <nxt_array.h>
-#include <nxt_queue.h>
-#include <nxt_lvlhsh.h>
-#include <nxt_random.h>
-#include <nxt_time.h>
-#include <nxt_file.h>
-#include <nxt_malloc.h>
-#include <nxt_mp.h>
-#include <nxt_sprintf.h>
+#include <njs_auto_config.h>
+
+#include <njs_unix.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_alignment.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_utf8.h>
+#include <njs_dtoa.h>
+#include <njs_strtod.h>
+#include <njs_djb_hash.h>
+#include <njs_trace.h>
+#include <njs_arr.h>
+#include <njs_queue.h>
+#include <njs_lvlhsh.h>
+#include <njs_random.h>
+#include <njs_time.h>
+#include <njs_file.h>
+#include <njs_malloc.h>
+#include <njs_mp.h>
+#include <njs_sprintf.h>
 
 #include <njs.h>
 #include <njs_value.h>
similarity index 62%
rename from nxt/nxt_malloc.c
rename to src/njs_malloc.c
index 3285fd5e18beaa2f1b05f92dc7c1709cb0e43652..c3d0a461dae2389570bfe652d2bb3a73ac47585f 100644 (file)
@@ -4,13 +4,13 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_malloc.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_malloc.h>
 
 
-#if (NXT_HAVE_POSIX_MEMALIGN)
+#if (NJS_HAVE_POSIX_MEMALIGN)
 
 /*
  * posix_memalign() presents in Linux glibc 2.1.91, FreeBSD 7.0,
  */
 
 void *
-nxt_memalign(size_t alignment, size_t size)
+njs_memalign(size_t alignment, size_t size)
 {
     int   err;
     void  *p;
 
     err = posix_memalign(&p, alignment, size);
 
-    if (nxt_fast_path(err == 0)) {
+    if (njs_fast_path(err == 0)) {
         return p;
     }
 
     // STUB
-    //nxt_errno_set(err);
+    //njs_errno_set(err);
 
     return NULL;
 }
 
-#elif (NXT_HAVE_MEMALIGN)
+#elif (NJS_HAVE_MEMALIGN)
 
 /* memalign() presents in Solaris, HP-UX. */
 
 void *
-nxt_memalign(size_t alignment, size_t size)
+njs_memalign(size_t alignment, size_t size)
 {
     return memalign(alignment, size);
 }
diff --git a/src/njs_malloc.h b/src/njs_malloc.h
new file mode 100644 (file)
index 0000000..c971e4f
--- /dev/null
@@ -0,0 +1,28 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_MALLOC_H_INCLUDED_
+#define _NJS_MALLOC_H_INCLUDED_
+
+#include <stdlib.h>
+
+/*
+ * alloca() is defined in stdlib.h in Linux, FreeBSD and MacOSX
+ * and in alloca.h in Linux, Solaris and MacOSX.
+ */
+#if (NJS_SOLARIS)
+#include <alloca.h>
+#endif
+
+
+#define njs_malloc(size)   malloc(size)
+#define njs_free(p)        free(p)
+
+
+NJS_EXPORT void *njs_memalign(size_t alignment, size_t size);
+
+
+#endif /* _NJS_MALLOC_H_INCLUDED_ */
similarity index 85%
rename from njs/njs_math.c
rename to src/njs_math.c
index 18fabad90e5a9e95858cb0ee6f2cae296dd93eb4..ebe36d469e3e46020459d22a6af444b13b322a9a 100644 (file)
@@ -4,12 +4,12 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <math.h>
 
 
 static njs_ret_t
-njs_object_math_abs(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_abs(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -23,12 +23,12 @@ njs_object_math_abs(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_acos(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_acos(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -36,7 +36,7 @@ njs_object_math_acos(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (nargs > 1) {
         num = njs_number(&args[1]);
 
-#if (NXT_SOLARIS)
+#if (NJS_SOLARIS)
         /* On Solaris acos(x) returns 0 for x > 1. */
         if (fabs(num) > 1.0) {
             num = NAN;
@@ -51,12 +51,12 @@ njs_object_math_acos(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_acosh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_acosh(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -70,12 +70,12 @@ njs_object_math_acosh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_asin(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_asin(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -83,7 +83,7 @@ njs_object_math_asin(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (nargs > 1) {
         num = njs_number(&args[1]);
 
-#if (NXT_SOLARIS)
+#if (NJS_SOLARIS)
         /* On Solaris asin(x) returns 0 for x > 1. */
         if (fabs(num) > 1.0) {
             num = NAN;
@@ -98,12 +98,12 @@ njs_object_math_asin(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_asinh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_asinh(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -117,12 +117,12 @@ njs_object_math_asinh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_atan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_atan(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -136,12 +136,12 @@ njs_object_math_atan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_atan2(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_atan2(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num, y, x;
@@ -158,12 +158,12 @@ njs_object_math_atan2(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_atanh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_atanh(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -177,12 +177,12 @@ njs_object_math_atanh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_cbrt(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_cbrt(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -196,12 +196,12 @@ njs_object_math_cbrt(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_ceil(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_ceil(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -215,12 +215,12 @@ njs_object_math_ceil(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_clz32(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_clz32(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double    num;
@@ -228,7 +228,7 @@ njs_object_math_clz32(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (nargs > 1) {
         ui32 = njs_number_to_uint32(njs_number(&args[1]));
-        num = nxt_leading_zeros(ui32);
+        num = njs_leading_zeros(ui32);
 
     } else {
         num = 32;
@@ -236,12 +236,12 @@ njs_object_math_clz32(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_cos(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_cos(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -255,12 +255,12 @@ njs_object_math_cos(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_cosh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_cosh(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -274,12 +274,12 @@ njs_object_math_cosh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_exp(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_exp(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -293,12 +293,12 @@ njs_object_math_exp(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_expm1(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_expm1(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -312,12 +312,12 @@ njs_object_math_expm1(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_floor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_floor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -331,12 +331,12 @@ njs_object_math_floor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_fround(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_fround(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -350,22 +350,22 @@ njs_object_math_fround(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_hypot(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_hypot(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double      num;
     njs_ret_t   ret;
-    nxt_uint_t  i;
+    njs_uint_t  i;
 
     for (i = 1; i < nargs; i++) {
         if (!njs_is_numeric(&args[i])) {
             ret = njs_value_to_numeric(vm, &args[i], &args[i]);
-            if (ret != NXT_OK) {
+            if (ret != NJS_OK) {
                 return ret;
             }
         }
@@ -383,12 +383,12 @@ njs_object_math_hypot(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_imul(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_imul(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double    num;
@@ -406,12 +406,12 @@ njs_object_math_imul(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -425,12 +425,12 @@ njs_object_math_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_log10(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_log10(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -444,12 +444,12 @@ njs_object_math_log10(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_log1p(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_log1p(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -463,12 +463,12 @@ njs_object_math_log1p(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_log2(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_log2(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -476,7 +476,7 @@ njs_object_math_log2(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (nargs > 1) {
         num = njs_number(&args[1]);
 
-#if (NXT_SOLARIS)
+#if (NJS_SOLARIS)
         /* On Solaris 10 log(-1) returns -Infinity. */
         if (num < 0) {
             num = NAN;
@@ -491,17 +491,17 @@ njs_object_math_log2(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_max(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_max(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double      num;
     njs_ret_t   ret;
-    nxt_uint_t  i;
+    njs_uint_t  i;
 
     if (nargs > 1) {
         for (i = 1; i < nargs; i++) {
@@ -511,7 +511,7 @@ njs_object_math_max(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
             } else if (!njs_is_numeric(&args[i])) {
                 ret = njs_value_to_numeric(vm, &args[i], &args[i]);
-                if (ret != NXT_OK) {
+                if (ret != NJS_OK) {
                     return ret;
                 }
             }
@@ -531,23 +531,23 @@ done:
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_min(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_min(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double      num;
     njs_ret_t   ret;
-    nxt_uint_t  i;
+    njs_uint_t  i;
 
     if (nargs > 1) {
         for (i = 1; i < nargs; i++) {
             if (!njs_is_numeric(&args[i])) {
                 ret = njs_value_to_numeric(vm, &args[i], &args[i]);
-                if (ret != NXT_OK) {
+                if (ret != NJS_OK) {
                     return ret;
                 }
             }
@@ -565,12 +565,12 @@ njs_object_math_min(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_pow(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_pow(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num, base, exponent;
@@ -598,26 +598,26 @@ njs_object_math_pow(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_random(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_random(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
 
-    num = nxt_random(&vm->random) / 4294967296.0;
+    num = njs_random(&vm->random) / 4294967296.0;
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_round(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_round(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -631,12 +631,12 @@ njs_object_math_round(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_sign(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_sign(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -654,12 +654,12 @@ njs_object_math_sign(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_sin(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_sin(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -673,12 +673,12 @@ njs_object_math_sin(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_sinh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_sinh(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -692,12 +692,12 @@ njs_object_math_sinh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_sqrt(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_sqrt(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -711,12 +711,12 @@ njs_object_math_sqrt(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_tan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_tan(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -730,12 +730,12 @@ njs_object_math_tan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_tanh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_tanh(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -749,12 +749,12 @@ njs_object_math_tanh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_math_trunc(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_trunc(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -768,7 +768,7 @@ njs_object_math_trunc(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1161,7 +1161,7 @@ static const njs_object_prop_t  njs_math_object_properties[] =
 
 
 const njs_object_init_t  njs_math_object_init = {
-    nxt_string("Math"),
+    njs_str("Math"),
     njs_math_object_properties,
-    nxt_nitems(njs_math_object_properties),
+    njs_nitems(njs_math_object_properties),
 };
similarity index 100%
rename from njs/njs_math.h
rename to src/njs_math.h
similarity index 91%
rename from nxt/nxt_md5.c
rename to src/njs_md5.c
index 1f488cf6750fda7c16fdfb0f6b5e004dcf6ce216..d21358eab35b3cf14b45f0b2893d0a4d73d537e0 100644 (file)
@@ -6,20 +6,20 @@
  */
 
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_md5.h>
-#include <nxt_string.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_md5.h>
+#include <njs_str.h>
 #include <string.h>
 
 
-static const u_char *nxt_md5_body(nxt_md5_t *ctx, const u_char *data,
+static const u_char *njs_md5_body(njs_md5_t *ctx, const u_char *data,
     size_t size);
 
 
 void
-nxt_md5_init(nxt_md5_t *ctx)
+njs_md5_init(njs_md5_t *ctx)
 {
     ctx->a = 0x67452301;
     ctx->b = 0xefcdab89;
@@ -31,7 +31,7 @@ nxt_md5_init(nxt_md5_t *ctx)
 
 
 void
-nxt_md5_update(nxt_md5_t *ctx, const void *data, size_t size)
+njs_md5_update(njs_md5_t *ctx, const void *data, size_t size)
 {
     size_t  used, free;
 
@@ -49,11 +49,11 @@ nxt_md5_update(nxt_md5_t *ctx, const void *data, size_t size)
         memcpy(&ctx->buffer[used], data, free);
         data = (u_char *) data + free;
         size -= free;
-        (void) nxt_md5_body(ctx, ctx->buffer, 64);
+        (void) njs_md5_body(ctx, ctx->buffer, 64);
     }
 
     if (size >= 64) {
-        data = nxt_md5_body(ctx, data, size & ~(size_t) 0x3f);
+        data = njs_md5_body(ctx, data, size & ~(size_t) 0x3f);
         size &= 0x3f;
     }
 
@@ -62,7 +62,7 @@ nxt_md5_update(nxt_md5_t *ctx, const void *data, size_t size)
 
 
 void
-nxt_md5_final(u_char result[16], nxt_md5_t *ctx)
+njs_md5_final(u_char result[16], njs_md5_t *ctx)
 {
     size_t  used, free;
 
@@ -73,13 +73,13 @@ nxt_md5_final(u_char result[16], nxt_md5_t *ctx)
     free = 64 - used;
 
     if (free < 8) {
-        nxt_memzero(&ctx->buffer[used], free);
-        (void) nxt_md5_body(ctx, ctx->buffer, 64);
+        njs_memzero(&ctx->buffer[used], free);
+        (void) njs_md5_body(ctx, ctx->buffer, 64);
         used = 0;
         free = 64;
     }
 
-    nxt_memzero(&ctx->buffer[used], free - 8);
+    njs_memzero(&ctx->buffer[used], free - 8);
 
     ctx->bytes <<= 3;
     ctx->buffer[56] = (u_char)  ctx->bytes;
@@ -91,7 +91,7 @@ nxt_md5_final(u_char result[16], nxt_md5_t *ctx)
     ctx->buffer[62] = (u_char) (ctx->bytes >> 48);
     ctx->buffer[63] = (u_char) (ctx->bytes >> 56);
 
-    (void) nxt_md5_body(ctx, ctx->buffer, 64);
+    (void) njs_md5_body(ctx, ctx->buffer, 64);
 
     result[0]  = (u_char)  ctx->a;
     result[1]  = (u_char) (ctx->a >> 8);
@@ -110,7 +110,7 @@ nxt_md5_final(u_char result[16], nxt_md5_t *ctx)
     result[14] = (u_char) (ctx->d >> 16);
     result[15] = (u_char) (ctx->d >> 24);
 
-    nxt_explicit_memzero(ctx, sizeof(*ctx));
+    njs_explicit_memzero(ctx, sizeof(*ctx));
 }
 
 
@@ -157,7 +157,7 @@ nxt_md5_final(u_char result[16], nxt_md5_t *ctx)
  */
 
 static const u_char *
-nxt_md5_body(nxt_md5_t *ctx, const u_char *data, size_t size)
+njs_md5_body(njs_md5_t *ctx, const u_char *data, size_t size)
 {
     uint32_t       a, b, c, d;
     uint32_t       saved_a, saved_b, saved_c, saved_d;
diff --git a/src/njs_md5.h b/src/njs_md5.h
new file mode 100644 (file)
index 0000000..23800ee
--- /dev/null
@@ -0,0 +1,23 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) Nginx, Inc.
+ */
+
+
+#ifndef _NJS_MD5_H_INCLUDED_
+#define _NJS_MD5_H_INCLUDED_
+
+
+typedef struct {
+    uint64_t  bytes;
+    uint32_t  a, b, c, d;
+    u_char    buffer[64];
+} njs_md5_t;
+
+
+NJS_EXPORT void njs_md5_init(njs_md5_t *ctx);
+NJS_EXPORT void njs_md5_update(njs_md5_t *ctx, const void *data, size_t size);
+NJS_EXPORT void njs_md5_final(u_char result[16], njs_md5_t *ctx);
+
+#endif /* _NJS_MD5_H_INCLUDED_ */
similarity index 58%
rename from njs/njs_module.c
rename to src/njs_module.c
index ccfb39a410a653c4428fe34911817c2e2176619f..665dff013628ff33e2894e7750b45349b39f3603 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_module.h>
 #include <string.h>
 #include <errno.h>
 
 typedef struct {
     int                 fd;
-    nxt_str_t           name;
-    nxt_str_t           file;
+    njs_str_t           name;
+    njs_str_t           file;
 } njs_module_info_t;
 
 
-static nxt_int_t njs_module_lookup(njs_vm_t *vm, const nxt_str_t *cwd,
+static njs_int_t njs_module_lookup(njs_vm_t *vm, const njs_str_t *cwd,
     njs_module_info_t *info);
-static nxt_int_t njs_module_relative_path(njs_vm_t *vm,
-    const nxt_str_t *dir, njs_module_info_t *info);
-static nxt_int_t njs_module_absolute_path(njs_vm_t *vm,
+static njs_int_t njs_module_relative_path(njs_vm_t *vm,
+    const njs_str_t *dir, njs_module_info_t *info);
+static njs_int_t njs_module_absolute_path(njs_vm_t *vm,
     njs_module_info_t *info);
-static nxt_bool_t njs_module_realpath_equal(const nxt_str_t *path1,
-    const nxt_str_t *path2);
-static nxt_int_t njs_module_read(njs_vm_t *vm, int fd, nxt_str_t *body);
-static njs_module_t *njs_module_find(njs_vm_t *vm, nxt_str_t *name);
-static njs_module_t *njs_module_add(njs_vm_t *vm, nxt_str_t *name);
-static nxt_int_t njs_module_insert(njs_vm_t *vm, njs_module_t *module);
+static njs_bool_t njs_module_realpath_equal(const njs_str_t *path1,
+    const njs_str_t *path2);
+static njs_int_t njs_module_read(njs_vm_t *vm, int fd, njs_str_t *body);
+static njs_module_t *njs_module_find(njs_vm_t *vm, njs_str_t *name);
+static njs_module_t *njs_module_add(njs_vm_t *vm, njs_str_t *name);
+static njs_int_t njs_module_insert(njs_vm_t *vm, njs_module_t *module);
 
 
-nxt_int_t
+njs_int_t
 njs_module_load(njs_vm_t *vm)
 {
-    nxt_int_t     ret;
-    nxt_uint_t    i;
+    njs_int_t     ret;
+    njs_uint_t    i;
     njs_value_t   *value;
     njs_module_t  **item, *module;
 
     if (vm->modules == NULL) {
-        return NXT_OK;
+        return NJS_OK;
     }
 
     item = vm->modules->start;
@@ -59,7 +59,7 @@ njs_module_load(njs_vm_t *vm)
 
         } else {
             ret = njs_vm_invoke(vm, &module->function, NULL, 0, module->index);
-            if (ret == NXT_ERROR) {
+            if (ret == NJS_ERROR) {
                 return ret;
             }
         }
@@ -67,16 +67,16 @@ njs_module_load(njs_vm_t *vm)
         item++;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 void
 njs_module_reset(njs_vm_t *vm)
 {
-    nxt_uint_t          i;
+    njs_uint_t          i;
     njs_module_t        **item, *module;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     if (vm->modules == NULL) {
         return;
@@ -89,25 +89,25 @@ njs_module_reset(njs_vm_t *vm)
 
         if (!module->function.native) {
             lhq.key = module->name;
-            lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+            lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
             lhq.proto = &njs_modules_hash_proto;
             lhq.pool = vm->mem_pool;
 
-            (void) nxt_lvlhsh_delete(&vm->modules_hash, &lhq);
+            (void) njs_lvlhsh_delete(&vm->modules_hash, &lhq);
         }
 
         item++;
     }
 
-    nxt_array_reset(vm->modules);
+    njs_arr_reset(vm->modules);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_parser_module(njs_vm_t *vm, njs_parser_t *parser)
 {
-    nxt_int_t          ret;
-    nxt_str_t          name, text;
+    njs_int_t          ret;
+    njs_str_t          name, text;
     njs_lexer_t        *prev, lexer;
     njs_token_t        token;
     njs_module_t       *module;
@@ -125,7 +125,7 @@ njs_parser_module(njs_vm_t *vm, njs_parser_t *parser)
 
     prev = parser->lexer;
 
-    nxt_memzero(&text, sizeof(nxt_str_t));
+    njs_memzero(&text, sizeof(njs_str_t));
 
     if (vm->options.sandbox || name.length == 0) {
         njs_parser_syntax_error(vm, parser, "Cannot find module \"%V\"", &name);
@@ -134,12 +134,12 @@ njs_parser_module(njs_vm_t *vm, njs_parser_t *parser)
 
     /* Non-native module. */
 
-    nxt_memzero(&info, sizeof(njs_module_info_t));
+    njs_memzero(&info, sizeof(njs_module_info_t));
 
     info.name = name;
 
     ret = njs_module_lookup(vm, &parser->scope->cwd, &info);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_parser_syntax_error(vm, parser, "Cannot find module \"%V\"", &name);
         goto fail;
     }
@@ -148,7 +148,7 @@ njs_parser_module(njs_vm_t *vm, njs_parser_t *parser)
 
     close(info.fd);
 
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_internal_error(vm, "while reading \"%V\" module", &name);
         goto fail;
     }
@@ -161,46 +161,46 @@ njs_parser_module(njs_vm_t *vm, njs_parser_t *parser)
 
     ret = njs_lexer_init(vm, &lexer, &info.file, text.start,
                          text.start + text.length);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
     parser->lexer = &lexer;
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         goto fail;
     }
 
     token = njs_parser_module_lambda(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         goto fail;
     }
 
     module = njs_module_add(vm, &name);
-    if (nxt_slow_path(module == NULL)) {
+    if (njs_slow_path(module == NULL)) {
         goto fail;
     }
 
     module->function.u.lambda = parser->node->u.value.data.u.lambda;
 
-    nxt_mp_free(vm->mem_pool, text.start);
+    njs_mp_free(vm->mem_pool, text.start);
 
     parser->lexer = prev;
 
 found:
 
     node = njs_parser_node_new(vm, parser, 0);
-    if (nxt_slow_path(node == NULL)) {
-       return NXT_ERROR;
+    if (njs_slow_path(node == NULL)) {
+       return NJS_ERROR;
     }
 
     node->left = parser->node;
 
     if (module->index == 0) {
         ret = njs_module_insert(vm, module);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
     }
 
@@ -208,64 +208,64 @@ found:
 
     parser->node = node;
 
-    return NXT_OK;
+    return NJS_OK;
 
 fail:
 
     parser->lexer = prev;
 
     if (text.start != NULL) {
-        nxt_mp_free(vm->mem_pool, text.start);
+        njs_mp_free(vm->mem_pool, text.start);
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
-static nxt_int_t
-njs_module_lookup(njs_vm_t *vm, const nxt_str_t *cwd, njs_module_info_t *info)
+static njs_int_t
+njs_module_lookup(njs_vm_t *vm, const njs_str_t *cwd, njs_module_info_t *info)
 {
-    nxt_int_t   ret;
-    nxt_str_t   *path;
-    nxt_uint_t  i;
+    njs_int_t   ret;
+    njs_str_t   *path;
+    njs_uint_t  i;
 
     if (info->name.start[0] == '/') {
         return njs_module_absolute_path(vm, info);
     }
 
     ret = njs_module_relative_path(vm, cwd, info);
-    if (ret == NXT_OK) {
+    if (ret == NJS_OK) {
         return ret;
     }
 
     if (vm->paths == NULL) {
-        return NXT_DECLINED;
+        return NJS_DECLINED;
     }
 
     path = vm->paths->start;
 
     for (i = 0; i < vm->paths->items; i++) {
         ret = njs_module_relative_path(vm, path, info);
-        if (ret == NXT_OK) {
+        if (ret == NJS_OK) {
             return ret;
         }
 
         path++;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_module_absolute_path(njs_vm_t *vm, njs_module_info_t *info)
 {
-    nxt_str_t  file;
+    njs_str_t  file;
 
     file.length = info->name.length;
-    file.start = nxt_mp_alloc(vm->mem_pool, file.length + 1);
-    if (nxt_slow_path(file.start == NULL)) {
-        return NXT_ERROR;
+    file.start = njs_mp_alloc(vm->mem_pool, file.length + 1);
+    if (njs_slow_path(file.start == NULL)) {
+        return NJS_ERROR;
     }
 
     memcpy(file.start, info->name.start, file.length);
@@ -273,23 +273,23 @@ njs_module_absolute_path(njs_vm_t *vm, njs_module_info_t *info)
 
     info->fd = open((char *) file.start, O_RDONLY);
     if (info->fd < 0) {
-        nxt_mp_free(vm->mem_pool, file.start);
-        return NXT_DECLINED;
+        njs_mp_free(vm->mem_pool, file.start);
+        return NJS_DECLINED;
     }
 
     info->file = file;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
-njs_module_relative_path(njs_vm_t *vm, const nxt_str_t *dir,
+static njs_int_t
+njs_module_relative_path(njs_vm_t *vm, const njs_str_t *dir,
     njs_module_info_t *info)
 {
     u_char      *p;
-    nxt_str_t   file;
-    nxt_bool_t  trail;
+    njs_str_t   file;
+    njs_bool_t  trail;
 
     file.length = dir->length;
 
@@ -301,37 +301,37 @@ njs_module_relative_path(njs_vm_t *vm, const nxt_str_t *dir,
 
     file.length += info->name.length;
 
-    file.start = nxt_mp_alloc(vm->mem_pool, file.length + 1);
-    if (nxt_slow_path(file.start == NULL)) {
-        return NXT_ERROR;
+    file.start = njs_mp_alloc(vm->mem_pool, file.length + 1);
+    if (njs_slow_path(file.start == NULL)) {
+        return NJS_ERROR;
     }
 
-    p = nxt_cpymem(file.start, dir->start, dir->length);
+    p = njs_cpymem(file.start, dir->start, dir->length);
 
     if (trail) {
         *p++ = '/';
     }
 
-    p = nxt_cpymem(p, info->name.start, info->name.length);
+    p = njs_cpymem(p, info->name.start, info->name.length);
     *p = '\0';
 
     info->fd = open((char *) file.start, O_RDONLY);
     if (info->fd < 0) {
-        nxt_mp_free(vm->mem_pool, file.start);
-        return NXT_DECLINED;
+        njs_mp_free(vm->mem_pool, file.start);
+        return NJS_DECLINED;
     }
 
     info->file = file;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 #define NJS_MODULE_START   "function() {"
 #define NJS_MODULE_END     "}"
 
-static nxt_int_t
-njs_module_read(njs_vm_t *vm, int fd, nxt_str_t *text)
+static njs_int_t
+njs_module_read(njs_vm_t *vm, int fd, njs_str_t *text)
 {
     u_char       *p;
     ssize_t      n;
@@ -345,15 +345,15 @@ njs_module_read(njs_vm_t *vm, int fd, nxt_str_t *text)
         goto fail;
     }
 
-    text->length = nxt_length(NJS_MODULE_START) + sb.st_size
-                   + nxt_length(NJS_MODULE_END);
+    text->length = njs_length(NJS_MODULE_START) + sb.st_size
+                   + njs_length(NJS_MODULE_END);
 
-    text->start = nxt_mp_alloc(vm->mem_pool, text->length);
+    text->start = njs_mp_alloc(vm->mem_pool, text->length);
     if (text->start == NULL) {
         goto fail;
     }
 
-    p = nxt_cpymem(text->start, NJS_MODULE_START, nxt_length(NJS_MODULE_START));
+    p = njs_cpymem(text->start, NJS_MODULE_START, njs_length(NJS_MODULE_START));
 
     n = read(fd, p, sb.st_size);
 
@@ -367,22 +367,22 @@ njs_module_read(njs_vm_t *vm, int fd, nxt_str_t *text)
 
     p += n;
 
-    memcpy(p, NJS_MODULE_END, nxt_length(NJS_MODULE_END));
+    memcpy(p, NJS_MODULE_END, njs_length(NJS_MODULE_END));
 
-    return NXT_OK;
+    return NJS_OK;
 
 fail:
 
     if (text->start != NULL) {
-        nxt_mp_free(vm->mem_pool, text->start);
+        njs_mp_free(vm->mem_pool, text->start);
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
-static nxt_bool_t
-njs_module_realpath_equal(const nxt_str_t *path1, const nxt_str_t *path2)
+static njs_bool_t
+njs_module_realpath_equal(const njs_str_t *path1, const njs_str_t *path2)
 {
     char  rpath1[MAXPATHLEN], rpath2[MAXPATHLEN];
 
@@ -393,25 +393,25 @@ njs_module_realpath_equal(const nxt_str_t *path1, const nxt_str_t *path2)
 }
 
 
-static nxt_int_t
-njs_module_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+njs_module_hash_test(njs_lvlhsh_query_t *lhq, void *data)
 {
     njs_module_t  *module;
 
     module = data;
 
-    if (nxt_strstr_eq(&lhq->key, &module->name)) {
-        return NXT_OK;
+    if (njs_strstr_eq(&lhq->key, &module->name)) {
+        return NJS_OK;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
-const nxt_lvlhsh_proto_t  njs_modules_hash_proto
-    nxt_aligned(64) =
+const njs_lvlhsh_proto_t  njs_modules_hash_proto
+    njs_aligned(64) =
 {
-    NXT_LVLHSH_DEFAULT,
+    NJS_LVLHSH_DEFAULT,
     njs_module_hash_test,
     njs_lvlhsh_alloc,
     njs_lvlhsh_free,
@@ -419,15 +419,15 @@ const nxt_lvlhsh_proto_t  njs_modules_hash_proto
 
 
 static njs_module_t *
-njs_module_find(njs_vm_t *vm, nxt_str_t *name)
+njs_module_find(njs_vm_t *vm, njs_str_t *name)
 {
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     lhq.key = *name;
-    lhq.key_hash = nxt_djb_hash(name->start, name->length);
+    lhq.key_hash = njs_djb_hash(name->start, name->length);
     lhq.proto = &njs_modules_hash_proto;
 
-    if (nxt_lvlhsh_find(&vm->modules_hash, &lhq) == NXT_OK) {
+    if (njs_lvlhsh_find(&vm->modules_hash, &lhq) == NJS_OK) {
         return lhq.value;
     }
 
@@ -436,40 +436,40 @@ njs_module_find(njs_vm_t *vm, nxt_str_t *name)
 
 
 static njs_module_t *
-njs_module_add(njs_vm_t *vm, nxt_str_t *name)
+njs_module_add(njs_vm_t *vm, njs_str_t *name)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_module_t        *module;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    module = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_module_t));
-    if (nxt_slow_path(module == NULL)) {
+    module = njs_mp_zalloc(vm->mem_pool, sizeof(njs_module_t));
+    if (njs_slow_path(module == NULL)) {
         njs_memory_error(vm);
         return NULL;
     }
 
     ret = njs_name_copy(vm, &module->name, name);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        nxt_mp_free(vm->mem_pool, module);
+    if (njs_slow_path(ret != NJS_OK)) {
+        njs_mp_free(vm->mem_pool, module);
         njs_memory_error(vm);
         return NULL;
     }
 
     lhq.replace = 0;
     lhq.key = *name;
-    lhq.key_hash = nxt_djb_hash(name->start, name->length);
+    lhq.key_hash = njs_djb_hash(name->start, name->length);
     lhq.value = module;
     lhq.pool = vm->mem_pool;
     lhq.proto = &njs_modules_hash_proto;
 
-    ret = nxt_lvlhsh_insert(&vm->modules_hash, &lhq);
+    ret = njs_lvlhsh_insert(&vm->modules_hash, &lhq);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return module;
     }
 
-    nxt_mp_free(vm->mem_pool, module->name.start);
-    nxt_mp_free(vm->mem_pool, module);
+    njs_mp_free(vm->mem_pool, module->name.start);
+    njs_mp_free(vm->mem_pool, module);
 
     njs_internal_error(vm, "lvlhsh insert failed");
 
@@ -477,7 +477,7 @@ njs_module_add(njs_vm_t *vm, nxt_str_t *name)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_module_insert(njs_vm_t *vm, njs_module_t *module)
 {
     njs_module_t        **value;
@@ -487,34 +487,34 @@ njs_module_insert(njs_vm_t *vm, njs_module_t *module)
 
     module->index = njs_scope_next_index(vm, scope, NJS_SCOPE_INDEX_LOCAL,
                                          &njs_value_undefined);
-    if (nxt_slow_path(module->index == NJS_INDEX_ERROR)) {
-        return NXT_ERROR;
+    if (njs_slow_path(module->index == NJS_INDEX_ERROR)) {
+        return NJS_ERROR;
     }
 
     if (vm->modules == NULL) {
-        vm->modules = nxt_array_create(4, sizeof(njs_module_t *),
-                                       &njs_array_mem_proto, vm->mem_pool);
-        if (nxt_slow_path(vm->modules == NULL)) {
-            return NXT_ERROR;
+        vm->modules = njs_arr_create(4, sizeof(njs_module_t *),
+                                     &njs_array_mem_proto, vm->mem_pool);
+        if (njs_slow_path(vm->modules == NULL)) {
+            return NJS_ERROR;
         }
     }
 
-    value = nxt_array_add(vm->modules, &njs_array_mem_proto, vm->mem_pool);
-    if (nxt_slow_path(value == NULL)) {
-        return NXT_ERROR;
+    value = njs_arr_add(vm->modules, &njs_array_mem_proto, vm->mem_pool);
+    if (njs_slow_path(value == NULL)) {
+        return NJS_ERROR;
     }
 
     *value = module;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t njs_module_require(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     njs_module_t        *module;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     if (nargs < 2) {
         njs_type_error(vm, "missing path");
@@ -522,16 +522,16 @@ njs_ret_t njs_module_require(njs_vm_t *vm, njs_value_t *args,
     }
 
     njs_string_get(&args[1], &lhq.key);
-    lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+    lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
     lhq.proto = &njs_modules_hash_proto;
 
-    if (nxt_lvlhsh_find(&vm->modules_hash, &lhq) == NXT_OK) {
+    if (njs_lvlhsh_find(&vm->modules_hash, &lhq) == NJS_OK) {
         module = lhq.value;
         module->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_OBJECT].object;
 
         njs_set_object(&vm->retval, &module->object);
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     njs_error(vm, "Cannot find module \"%V\"", &lhq.key);
@@ -541,7 +541,7 @@ njs_ret_t njs_module_require(njs_vm_t *vm, njs_value_t *args,
 
 
 const njs_object_init_t  njs_require_function_init = {
-    nxt_string("require"),
+    njs_str("require"),
     NULL,
     0,
 };
similarity index 67%
rename from njs/njs_module.h
rename to src/njs_module.h
index 97f0a45fc9441bcb06ed21a85595884741bb4c4f..c827fcc0e7b6e6d4663afdb98daaa709b94d0355 100644 (file)
@@ -9,21 +9,21 @@
 
 
 typedef struct {
-    nxt_str_t                   name;
+    njs_str_t                   name;
     njs_object_t                object;
     njs_index_t                 index;
     njs_function_t              function;
 } njs_module_t;
 
 
-nxt_int_t njs_module_load(njs_vm_t *vm);
+njs_int_t njs_module_load(njs_vm_t *vm);
 void njs_module_reset(njs_vm_t *vm);
-nxt_int_t njs_parser_module(njs_vm_t *vm, njs_parser_t *parser);
+njs_int_t njs_parser_module(njs_vm_t *vm, njs_parser_t *parser);
 njs_ret_t njs_module_require(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 
-extern const nxt_lvlhsh_proto_t  njs_modules_hash_proto;
+extern const njs_lvlhsh_proto_t  njs_modules_hash_proto;
 extern const njs_object_init_t   njs_require_function_init;
 
 
similarity index 56%
rename from nxt/nxt_mp.c
rename to src/njs_mp.c
index 18976d37a7d87f128107e224dbdf049cd1d99f1f..117002f99961bc67197ca2dd9eb2132ab80e99db 100644 (file)
@@ -4,15 +4,15 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_alignment.h>
-#include <nxt_stub.h>
-#include <nxt_string.h>
-#include <nxt_queue.h>
-#include <nxt_rbtree.h>
-#include <nxt_mp.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_alignment.h>
+#include <njs_stub.h>
+#include <njs_str.h>
+#include <njs_queue.h>
+#include <njs_rbtree.h>
+#include <njs_mp.h>
 #include <string.h>
 #include <stdint.h>
 
@@ -36,7 +36,7 @@ typedef struct {
      * Used to link pages with free chunks in pool chunk slot list
      * or to link free pages in clusters.
      */
-    nxt_queue_link_t            link;
+    njs_queue_link_t            link;
 
     /*
      * Size of chunks or page shifted by mp->chunk_size_shift.
@@ -57,42 +57,42 @@ typedef struct {
 
     /* Chunk bitmap.  There can be no more than 32 chunks in a page. */
     uint8_t                     map[4];
-} nxt_mp_page_t;
+} njs_mp_page_t;
 
 
 typedef enum {
     /* Block of cluster.  The block is allocated apart of the cluster. */
-    NXT_MP_CLUSTER_BLOCK = 0,
+    NJS_MP_CLUSTER_BLOCK = 0,
     /*
      * Block of large allocation.
      * The block is allocated apart of the allocation.
      */
-    NXT_MP_DISCRETE_BLOCK,
+    NJS_MP_DISCRETE_BLOCK,
     /*
      * Block of large allocation.
      * The block is allocated just after of the allocation.
      */
-    NXT_MP_EMBEDDED_BLOCK,
-} nxt_mp_block_type_t;
+    NJS_MP_EMBEDDED_BLOCK,
+} njs_mp_block_type_t;
 
 
 typedef struct {
-    NXT_RBTREE_NODE             (node);
-    nxt_mp_block_type_t         type:8;
+    NJS_RBTREE_NODE             (node);
+    njs_mp_block_type_t         type:8;
 
     /* Block size must be less than 4G. */
     uint32_t                    size;
 
     u_char                      *start;
-    nxt_mp_page_t               pages[];
-} nxt_mp_block_t;
+    njs_mp_page_t               pages[];
+} njs_mp_block_t;
 
 
 typedef struct {
-    nxt_queue_t                 pages;
+    njs_queue_t                 pages;
 
     /* Size of page chunks. */
-#if (NXT_64BIT)
+#if (NJS_64BIT)
     uint32_t                    size;
 #else
     uint16_t                    size;
@@ -100,14 +100,14 @@ typedef struct {
 
     /* Maximum number of free chunks in chunked page. */
     uint8_t                     chunks;
-} nxt_mp_slot_t;
+} njs_mp_slot_t;
 
 
-struct nxt_mp_s {
-    /* rbtree of nxt_mp_block_t. */
-    nxt_rbtree_t                blocks;
+struct njs_mp_s {
+    /* rbtree of njs_mp_block_t. */
+    njs_rbtree_t                blocks;
 
-    nxt_queue_t                 free_pages;
+    njs_queue_t                 free_pages;
 
     uint8_t                     chunk_size_shift;
     uint8_t                     page_size_shift;
@@ -115,63 +115,63 @@ struct nxt_mp_s {
     uint32_t                    page_alignment;
     uint32_t                    cluster_size;
 
-    const nxt_mem_proto_t       *proto;
+    const njs_mem_proto_t       *proto;
     void                        *mem;
     void                        *trace;
 
-    nxt_mp_slot_t               slots[];
+    njs_mp_slot_t               slots[];
 };
 
 
-#define nxt_mp_chunk_is_free(map, chunk)                                      \
+#define njs_mp_chunk_is_free(map, chunk)                                      \
     ((map[chunk / 8] & (0x80 >> (chunk & 7))) == 0)
 
 
-#define nxt_mp_chunk_set_free(map, chunk)                                     \
+#define njs_mp_chunk_set_free(map, chunk)                                     \
     map[chunk / 8] &= ~(0x80 >> (chunk & 7))
 
 
-#define nxt_mp_free_junk(p, size)                                             \
-    nxt_memset((p), 0x5A, size)
+#define njs_mp_free_junk(p, size)                                             \
+    njs_memset((p), 0x5A, size)
 
 
-#define nxt_is_power_of_two(value)                                            \
+#define njs_is_power_of_two(value)                                            \
     ((((value) - 1) & (value)) == 0)
 
 
-static nxt_uint_t nxt_mp_shift(nxt_uint_t n);
-#if !(NXT_DEBUG_MEMORY)
-static void *nxt_mp_alloc_small(nxt_mp_t *mp, size_t size);
-static nxt_uint_t nxt_mp_alloc_chunk(u_char *map, nxt_uint_t size);
-static nxt_mp_page_t *nxt_mp_alloc_page(nxt_mp_t *mp);
-static nxt_mp_block_t *nxt_mp_alloc_cluster(nxt_mp_t *mp);
+static njs_uint_t njs_mp_shift(njs_uint_t n);
+#if !(NJS_DEBUG_MEMORY)
+static void *njs_mp_alloc_small(njs_mp_t *mp, size_t size);
+static njs_uint_t njs_mp_alloc_chunk(u_char *map, njs_uint_t size);
+static njs_mp_page_t *njs_mp_alloc_page(njs_mp_t *mp);
+static njs_mp_block_t *njs_mp_alloc_cluster(njs_mp_t *mp);
 #endif
-static void *nxt_mp_alloc_large(nxt_mp_t *mp, size_t alignment, size_t size);
-static intptr_t nxt_mp_rbtree_compare(nxt_rbtree_node_t *node1,
-    nxt_rbtree_node_t *node2);
-static nxt_mp_block_t *nxt_mp_find_block(nxt_rbtree_t *tree,
+static void *njs_mp_alloc_large(njs_mp_t *mp, size_t alignment, size_t size);
+static intptr_t njs_mp_rbtree_compare(njs_rbtree_node_t *node1,
+    njs_rbtree_node_t *node2);
+static njs_mp_block_t *njs_mp_find_block(njs_rbtree_t *tree,
     u_char *p);
-static const char *nxt_mp_chunk_free(nxt_mp_t *mp, nxt_mp_block_t *cluster,
+static const char *njs_mp_chunk_free(njs_mp_t *mp, njs_mp_block_t *cluster,
     u_char *p);
 
 
-nxt_mp_t *
-nxt_mp_create(const nxt_mem_proto_t *proto, void *mem,
+njs_mp_t *
+njs_mp_create(const njs_mem_proto_t *proto, void *mem,
     void *trace, size_t cluster_size, size_t page_alignment, size_t page_size,
     size_t min_chunk_size)
 {
     /* Alignment and sizes must be a power of 2. */
 
-    if (nxt_slow_path(!nxt_is_power_of_two(page_alignment)
-                     || !nxt_is_power_of_two(page_size)
-                     || !nxt_is_power_of_two(min_chunk_size)))
+    if (njs_slow_path(!njs_is_power_of_two(page_alignment)
+                     || !njs_is_power_of_two(page_size)
+                     || !njs_is_power_of_two(min_chunk_size)))
     {
         return NULL;
     }
 
-    page_alignment = nxt_max(page_alignment, NXT_MAX_ALIGNMENT);
+    page_alignment = njs_max(page_alignment, NJS_MAX_ALIGNMENT);
 
-    if (nxt_slow_path(page_size < 64
+    if (njs_slow_path(page_size < 64
                      || page_size < page_alignment
                      || page_size < min_chunk_size
                      || min_chunk_size * 32 < page_size
@@ -182,19 +182,19 @@ nxt_mp_create(const nxt_mem_proto_t *proto, void *mem,
         return NULL;
     }
 
-    return nxt_mp_fast_create(proto, mem, trace, cluster_size, page_alignment,
+    return njs_mp_fast_create(proto, mem, trace, cluster_size, page_alignment,
                               page_size, min_chunk_size);
 }
 
 
-nxt_mp_t *
-nxt_mp_fast_create(const nxt_mem_proto_t *proto, void *mem,
+njs_mp_t *
+njs_mp_fast_create(const njs_mem_proto_t *proto, void *mem,
     void *trace, size_t cluster_size, size_t page_alignment, size_t page_size,
     size_t min_chunk_size)
 {
-    nxt_mp_t       *mp;
-    nxt_uint_t     slots, chunk_size;
-    nxt_mp_slot_t  *slot;
+    njs_mp_t       *mp;
+    njs_uint_t     slots, chunk_size;
+    njs_mp_slot_t  *slot;
 
     slots = 0;
     chunk_size = page_size;
@@ -204,21 +204,21 @@ nxt_mp_fast_create(const nxt_mem_proto_t *proto, void *mem,
         chunk_size /= 2;
     } while (chunk_size > min_chunk_size);
 
-    mp = proto->zalloc(mem, sizeof(nxt_mp_t) + slots * sizeof(nxt_mp_slot_t));
+    mp = proto->zalloc(mem, sizeof(njs_mp_t) + slots * sizeof(njs_mp_slot_t));
 
-    if (nxt_fast_path(mp != NULL)) {
+    if (njs_fast_path(mp != NULL)) {
         mp->proto = proto;
         mp->mem = mem;
         mp->trace = trace;
 
         mp->page_size = page_size;
-        mp->page_alignment = nxt_max(page_alignment, NXT_MAX_ALIGNMENT);
+        mp->page_alignment = njs_max(page_alignment, NJS_MAX_ALIGNMENT);
         mp->cluster_size = cluster_size;
 
         slot = mp->slots;
 
         do {
-            nxt_queue_init(&slot->pages);
+            njs_queue_init(&slot->pages);
 
             slot->size = chunk_size;
             /* slot->chunks should be one less than actual number of chunks. */
@@ -228,22 +228,22 @@ nxt_mp_fast_create(const nxt_mem_proto_t *proto, void *mem,
             chunk_size *= 2;
         } while (chunk_size < page_size);
 
-        mp->chunk_size_shift = nxt_mp_shift(min_chunk_size);
-        mp->page_size_shift = nxt_mp_shift(page_size);
+        mp->chunk_size_shift = njs_mp_shift(min_chunk_size);
+        mp->page_size_shift = njs_mp_shift(page_size);
 
-        nxt_rbtree_init(&mp->blocks, nxt_mp_rbtree_compare);
+        njs_rbtree_init(&mp->blocks, njs_mp_rbtree_compare);
 
-        nxt_queue_init(&mp->free_pages);
+        njs_queue_init(&mp->free_pages);
     }
 
     return mp;
 }
 
 
-static nxt_uint_t
-nxt_mp_shift(nxt_uint_t n)
+static njs_uint_t
+njs_mp_shift(njs_uint_t n)
 {
-    nxt_uint_t  shift;
+    njs_uint_t  shift;
 
     shift = 0;
     n /= 2;
@@ -257,31 +257,31 @@ nxt_mp_shift(nxt_uint_t n)
 }
 
 
-nxt_bool_t
-nxt_mp_is_empty(nxt_mp_t *mp)
+njs_bool_t
+njs_mp_is_empty(njs_mp_t *mp)
 {
-    return (nxt_rbtree_is_empty(&mp->blocks)
-            && nxt_queue_is_empty(&mp->free_pages));
+    return (njs_rbtree_is_empty(&mp->blocks)
+            && njs_queue_is_empty(&mp->free_pages));
 }
 
 
 void
-nxt_mp_destroy(nxt_mp_t *mp)
+njs_mp_destroy(njs_mp_t *mp)
 {
     void               *p;
-    nxt_mp_block_t     *block;
-    nxt_rbtree_node_t  *node, *next;
+    njs_mp_block_t     *block;
+    njs_rbtree_node_t  *node, *next;
 
-    next = nxt_rbtree_root(&mp->blocks);
+    next = njs_rbtree_root(&mp->blocks);
 
-    while (next != nxt_rbtree_sentinel(&mp->blocks)) {
+    while (next != njs_rbtree_sentinel(&mp->blocks)) {
 
-        node = nxt_rbtree_destroy_next(&mp->blocks, &next);
-        block = (nxt_mp_block_t *) node;
+        node = njs_rbtree_destroy_next(&mp->blocks, &next);
+        block = (njs_mp_block_t *) node;
 
         p = block->start;
 
-        if (block->type != NXT_MP_EMBEDDED_BLOCK) {
+        if (block->type != NJS_MP_EMBEDDED_BLOCK) {
             mp->proto->free(mp->mem, block);
         }
 
@@ -293,33 +293,33 @@ nxt_mp_destroy(nxt_mp_t *mp)
 
 
 void *
-nxt_mp_alloc(nxt_mp_t *mp, size_t size)
+njs_mp_alloc(njs_mp_t *mp, size_t size)
 {
     if (mp->proto->trace != NULL) {
         mp->proto->trace(mp->trace, "mem cache alloc: %zd", size);
     }
 
-#if !(NXT_DEBUG_MEMORY)
+#if !(NJS_DEBUG_MEMORY)
 
     if (size <= mp->page_size) {
-        return nxt_mp_alloc_small(mp, size);
+        return njs_mp_alloc_small(mp, size);
     }
 
 #endif
 
-    return nxt_mp_alloc_large(mp, NXT_MAX_ALIGNMENT, size);
+    return njs_mp_alloc_large(mp, NJS_MAX_ALIGNMENT, size);
 }
 
 
 void *
-nxt_mp_zalloc(nxt_mp_t *mp, size_t size)
+njs_mp_zalloc(njs_mp_t *mp, size_t size)
 {
     void  *p;
 
-    p = nxt_mp_alloc(mp, size);
+    p = njs_mp_alloc(mp, size);
 
-    if (nxt_fast_path(p != NULL)) {
-        nxt_memzero(p, size);
+    if (njs_fast_path(p != NULL)) {
+        njs_memzero(p, size);
     }
 
     return p;
@@ -327,7 +327,7 @@ nxt_mp_zalloc(nxt_mp_t *mp, size_t size)
 
 
 void *
-nxt_mp_align(nxt_mp_t *mp, size_t alignment, size_t size)
+njs_mp_align(njs_mp_t *mp, size_t alignment, size_t size)
 {
     if (mp->proto->trace != NULL) {
         mp->proto->trace(mp->trace,
@@ -336,21 +336,21 @@ nxt_mp_align(nxt_mp_t *mp, size_t alignment, size_t size)
 
     /* Alignment must be a power of 2. */
 
-    if (nxt_fast_path(nxt_is_power_of_two(alignment))) {
+    if (njs_fast_path(njs_is_power_of_two(alignment))) {
 
-#if !(NXT_DEBUG_MEMORY)
+#if !(NJS_DEBUG_MEMORY)
 
         if (size <= mp->page_size && alignment <= mp->page_alignment) {
-            size = nxt_max(size, alignment);
+            size = njs_max(size, alignment);
 
             if (size <= mp->page_size) {
-                return nxt_mp_alloc_small(mp, size);
+                return njs_mp_alloc_small(mp, size);
             }
         }
 
 #endif
 
-        return nxt_mp_alloc_large(mp, alignment, size);
+        return njs_mp_alloc_large(mp, alignment, size);
     }
 
     return NULL;
@@ -358,42 +358,42 @@ nxt_mp_align(nxt_mp_t *mp, size_t alignment, size_t size)
 
 
 void *
-nxt_mp_zalign(nxt_mp_t *mp, size_t alignment, size_t size)
+njs_mp_zalign(njs_mp_t *mp, size_t alignment, size_t size)
 {
     void  *p;
 
-    p = nxt_mp_align(mp, alignment, size);
+    p = njs_mp_align(mp, alignment, size);
 
-    if (nxt_fast_path(p != NULL)) {
-        nxt_memzero(p, size);
+    if (njs_fast_path(p != NULL)) {
+        njs_memzero(p, size);
     }
 
     return p;
 }
 
 
-#if !(NXT_DEBUG_MEMORY)
+#if !(NJS_DEBUG_MEMORY)
 
-nxt_inline u_char *
-nxt_mp_page_addr(nxt_mp_t *mp, nxt_mp_page_t *page)
+njs_inline u_char *
+njs_mp_page_addr(njs_mp_t *mp, njs_mp_page_t *page)
 {
-    nxt_mp_block_t  *block;
+    njs_mp_block_t  *block;
 
-    block = (nxt_mp_block_t *)
-                ((u_char *) page - page->number * sizeof(nxt_mp_page_t)
-                 - offsetof(nxt_mp_block_t, pages));
+    block = (njs_mp_block_t *)
+                ((u_char *) page - page->number * sizeof(njs_mp_page_t)
+                 - offsetof(njs_mp_block_t, pages));
 
     return block->start + (page->number << mp->page_size_shift);
 }
 
 
 static void *
-nxt_mp_alloc_small(nxt_mp_t *mp, size_t size)
+njs_mp_alloc_small(njs_mp_t *mp, size_t size)
 {
     u_char            *p;
-    nxt_mp_page_t     *page;
-    nxt_mp_slot_t     *slot;
-    nxt_queue_link_t  *link;
+    njs_mp_page_t     *page;
+    njs_mp_slot_t     *slot;
+    njs_queue_link_t  *link;
 
     p = NULL;
 
@@ -404,13 +404,13 @@ nxt_mp_alloc_small(nxt_mp_t *mp, size_t size)
 
         size = slot->size;
 
-        if (nxt_fast_path(!nxt_queue_is_empty(&slot->pages))) {
+        if (njs_fast_path(!njs_queue_is_empty(&slot->pages))) {
 
-            link = nxt_queue_first(&slot->pages);
-            page = nxt_queue_link_data(link, nxt_mp_page_t, link);
+            link = njs_queue_first(&slot->pages);
+            page = njs_queue_link_data(link, njs_mp_page_t, link);
 
-            p = nxt_mp_page_addr(mp, page);
-            p += nxt_mp_alloc_chunk(page->map, size);
+            p = njs_mp_page_addr(mp, page);
+            p += njs_mp_alloc_chunk(page->map, size);
 
             page->chunks--;
 
@@ -419,15 +419,15 @@ nxt_mp_alloc_small(nxt_mp_t *mp, size_t size)
                  * Remove full page from the mp chunk slot list
                  * of pages with free chunks.
                  */
-                nxt_queue_remove(&page->link);
+                njs_queue_remove(&page->link);
             }
 
         } else {
-            page = nxt_mp_alloc_page(mp);
+            page = njs_mp_alloc_page(mp);
 
-            if (nxt_fast_path(page != NULL)) {
+            if (njs_fast_path(page != NULL)) {
 
-                nxt_queue_insert_head(&slot->pages, &page->link);
+                njs_queue_insert_head(&slot->pages, &page->link);
 
                 /* Mark the first chunk as busy. */
                 page->map[0] = 0x80;
@@ -439,20 +439,20 @@ nxt_mp_alloc_small(nxt_mp_t *mp, size_t size)
                 page->chunks = slot->chunks;
                 page->size = size >> mp->chunk_size_shift;
 
-                p = nxt_mp_page_addr(mp, page);
+                p = njs_mp_page_addr(mp, page);
             }
         }
 
     } else {
-        page = nxt_mp_alloc_page(mp);
+        page = njs_mp_alloc_page(mp);
 
-        if (nxt_fast_path(page != NULL)) {
+        if (njs_fast_path(page != NULL)) {
             page->size = mp->page_size >> mp->chunk_size_shift;
 
-            p = nxt_mp_page_addr(mp, page);
+            p = njs_mp_page_addr(mp, page);
         }
 
-#if (NXT_DEBUG)
+#if (NJS_DEBUG)
         size = mp->page_size;
 #endif
     }
@@ -465,11 +465,11 @@ nxt_mp_alloc_small(nxt_mp_t *mp, size_t size)
 }
 
 
-static nxt_uint_t
-nxt_mp_alloc_chunk(uint8_t *map, nxt_uint_t size)
+static njs_uint_t
+njs_mp_alloc_chunk(uint8_t *map, njs_uint_t size)
 {
     uint8_t     mask;
-    nxt_uint_t  n, offset;
+    njs_uint_t  n, offset;
 
     offset = 0;
     n = 0;
@@ -503,68 +503,68 @@ nxt_mp_alloc_chunk(uint8_t *map, nxt_uint_t size)
 }
 
 
-static nxt_mp_page_t *
-nxt_mp_alloc_page(nxt_mp_t *mp)
+static njs_mp_page_t *
+njs_mp_alloc_page(njs_mp_t *mp)
 {
-    nxt_mp_page_t     *page;
-    nxt_mp_block_t    *cluster;
-    nxt_queue_link_t  *link;
+    njs_mp_page_t     *page;
+    njs_mp_block_t    *cluster;
+    njs_queue_link_t  *link;
 
-    if (nxt_queue_is_empty(&mp->free_pages)) {
-        cluster = nxt_mp_alloc_cluster(mp);
-        if (nxt_slow_path(cluster == NULL)) {
+    if (njs_queue_is_empty(&mp->free_pages)) {
+        cluster = njs_mp_alloc_cluster(mp);
+        if (njs_slow_path(cluster == NULL)) {
             return NULL;
         }
     }
 
-    link = nxt_queue_first(&mp->free_pages);
-    nxt_queue_remove(link);
+    link = njs_queue_first(&mp->free_pages);
+    njs_queue_remove(link);
 
-    page = nxt_queue_link_data(link, nxt_mp_page_t, link);
+    page = njs_queue_link_data(link, njs_mp_page_t, link);
 
     return page;
 }
 
 
-static nxt_mp_block_t *
-nxt_mp_alloc_cluster(nxt_mp_t *mp)
+static njs_mp_block_t *
+njs_mp_alloc_cluster(njs_mp_t *mp)
 {
-    nxt_uint_t      n;
-    nxt_mp_block_t  *cluster;
+    njs_uint_t      n;
+    njs_mp_block_t  *cluster;
 
     n = mp->cluster_size >> mp->page_size_shift;
 
     cluster = mp->proto->zalloc(mp->mem,
-                                sizeof(nxt_mp_block_t)
-                                + n * sizeof(nxt_mp_page_t));
+                                sizeof(njs_mp_block_t)
+                                + n * sizeof(njs_mp_page_t));
 
-    if (nxt_slow_path(cluster == NULL)) {
+    if (njs_slow_path(cluster == NULL)) {
         return NULL;
     }
 
-    /* NXT_MP_CLUSTER_BLOCK type is zero. */
+    /* NJS_MP_CLUSTER_BLOCK type is zero. */
 
     cluster->size = mp->cluster_size;
 
     cluster->start = mp->proto->align(mp->mem, mp->page_alignment,
                                       mp->cluster_size);
-    if (nxt_slow_path(cluster->start == NULL)) {
+    if (njs_slow_path(cluster->start == NULL)) {
         mp->proto->free(mp->mem, cluster);
         return NULL;
     }
 
     n--;
     cluster->pages[n].number = n;
-    nxt_queue_insert_head(&mp->free_pages, &cluster->pages[n].link);
+    njs_queue_insert_head(&mp->free_pages, &cluster->pages[n].link);
 
     while (n != 0) {
         n--;
         cluster->pages[n].number = n;
-        nxt_queue_insert_before(&cluster->pages[n + 1].link,
+        njs_queue_insert_before(&cluster->pages[n + 1].link,
                                 &cluster->pages[n].link);
     }
 
-    nxt_rbtree_insert(&mp->blocks, &cluster->node);
+    njs_rbtree_insert(&mp->blocks, &cluster->node);
 
     return cluster;
 }
@@ -573,93 +573,93 @@ nxt_mp_alloc_cluster(nxt_mp_t *mp)
 
 
 static void *
-nxt_mp_alloc_large(nxt_mp_t *mp, size_t alignment, size_t size)
+njs_mp_alloc_large(njs_mp_t *mp, size_t alignment, size_t size)
 {
     u_char          *p;
     size_t          aligned_size;
     uint8_t         type;
-    nxt_mp_block_t  *block;
+    njs_mp_block_t  *block;
 
     /* Allocation must be less than 4G. */
-    if (nxt_slow_path(size >= UINT32_MAX)) {
+    if (njs_slow_path(size >= UINT32_MAX)) {
         return NULL;
     }
 
-    if (nxt_is_power_of_two(size)) {
-        block = mp->proto->alloc(mp->mem, sizeof(nxt_mp_block_t));
-        if (nxt_slow_path(block == NULL)) {
+    if (njs_is_power_of_two(size)) {
+        block = mp->proto->alloc(mp->mem, sizeof(njs_mp_block_t));
+        if (njs_slow_path(block == NULL)) {
             return NULL;
         }
 
         p = mp->proto->align(mp->mem, alignment, size);
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             mp->proto->free(mp->mem, block);
             return NULL;
         }
 
-        type = NXT_MP_DISCRETE_BLOCK;
+        type = NJS_MP_DISCRETE_BLOCK;
 
     } else {
-        aligned_size = nxt_align_size(size, sizeof(uintptr_t));
+        aligned_size = njs_align_size(size, sizeof(uintptr_t));
 
         p = mp->proto->align(mp->mem, alignment,
-                             aligned_size + sizeof(nxt_mp_block_t));
+                             aligned_size + sizeof(njs_mp_block_t));
 
-        if (nxt_slow_path(p == NULL)) {
+        if (njs_slow_path(p == NULL)) {
             return NULL;
         }
 
-        block = (nxt_mp_block_t *) (p + aligned_size);
-        type = NXT_MP_EMBEDDED_BLOCK;
+        block = (njs_mp_block_t *) (p + aligned_size);
+        type = NJS_MP_EMBEDDED_BLOCK;
     }
 
     block->type = type;
     block->size = size;
     block->start = p;
 
-    nxt_rbtree_insert(&mp->blocks, &block->node);
+    njs_rbtree_insert(&mp->blocks, &block->node);
 
     return p;
 }
 
 
 static intptr_t
-nxt_mp_rbtree_compare(nxt_rbtree_node_t *node1, nxt_rbtree_node_t *node2)
+njs_mp_rbtree_compare(njs_rbtree_node_t *node1, njs_rbtree_node_t *node2)
 {
-    nxt_mp_block_t  *block1, *block2;
+    njs_mp_block_t  *block1, *block2;
 
-    block1 = (nxt_mp_block_t *) node1;
-    block2 = (nxt_mp_block_t *) node2;
+    block1 = (njs_mp_block_t *) node1;
+    block2 = (njs_mp_block_t *) node2;
 
     return (uintptr_t) block1->start - (uintptr_t) block2->start;
 }
 
 
 void
-nxt_mp_free(nxt_mp_t *mp, void *p)
+njs_mp_free(njs_mp_t *mp, void *p)
 {
     const char      *err;
-    nxt_mp_block_t  *block;
+    njs_mp_block_t  *block;
 
     if (mp->proto->trace != NULL) {
         mp->proto->trace(mp->trace, "mem cache free %p", p);
     }
 
-    block = nxt_mp_find_block(&mp->blocks, p);
+    block = njs_mp_find_block(&mp->blocks, p);
 
-    if (nxt_fast_path(block != NULL)) {
+    if (njs_fast_path(block != NULL)) {
 
-        if (block->type == NXT_MP_CLUSTER_BLOCK) {
-            err = nxt_mp_chunk_free(mp, block, p);
+        if (block->type == NJS_MP_CLUSTER_BLOCK) {
+            err = njs_mp_chunk_free(mp, block, p);
 
-            if (nxt_fast_path(err == NULL)) {
+            if (njs_fast_path(err == NULL)) {
                 return;
             }
 
-        } else if (nxt_fast_path(p == block->start)) {
-            nxt_rbtree_delete(&mp->blocks, &block->node);
+        } else if (njs_fast_path(p == block->start)) {
+            njs_rbtree_delete(&mp->blocks, &block->node);
 
-            if (block->type == NXT_MP_DISCRETE_BLOCK) {
+            if (block->type == NJS_MP_DISCRETE_BLOCK) {
                 mp->proto->free(mp->mem, block);
             }
 
@@ -681,18 +681,18 @@ nxt_mp_free(nxt_mp_t *mp, void *p)
 }
 
 
-static nxt_mp_block_t *
-nxt_mp_find_block(nxt_rbtree_t *tree, u_char *p)
+static njs_mp_block_t *
+njs_mp_find_block(njs_rbtree_t *tree, u_char *p)
 {
-    nxt_mp_block_t     *block;
-    nxt_rbtree_node_t  *node, *sentinel;
+    njs_mp_block_t     *block;
+    njs_rbtree_node_t  *node, *sentinel;
 
-    node = nxt_rbtree_root(tree);
-    sentinel = nxt_rbtree_sentinel(tree);
+    node = njs_rbtree_root(tree);
+    sentinel = njs_rbtree_sentinel(tree);
 
     while (node != sentinel) {
 
-        block = (nxt_mp_block_t *) node;
+        block = (njs_mp_block_t *) node;
 
         if (p < block->start) {
             node = node->left;
@@ -710,14 +710,14 @@ nxt_mp_find_block(nxt_rbtree_t *tree, u_char *p)
 
 
 static const char *
-nxt_mp_chunk_free(nxt_mp_t *mp, nxt_mp_block_t *cluster,
+njs_mp_chunk_free(njs_mp_t *mp, njs_mp_block_t *cluster,
     u_char *p)
 {
     u_char         *start;
     uintptr_t      offset;
-    nxt_uint_t     n, size, chunk;
-    nxt_mp_page_t  *page;
-    nxt_mp_slot_t  *slot;
+    njs_uint_t     n, size, chunk;
+    njs_mp_page_t  *page;
+    njs_mp_slot_t  *slot;
 
     n = (p - cluster->start) >> mp->page_size_shift;
     start = cluster->start + (n << mp->page_size_shift);
@@ -735,15 +735,15 @@ nxt_mp_chunk_free(nxt_mp_t *mp, nxt_mp_block_t *cluster,
         offset = (uintptr_t) (p - start) & (mp->page_size - 1);
         chunk = offset / size;
 
-        if (nxt_slow_path(offset != chunk * size)) {
+        if (njs_slow_path(offset != chunk * size)) {
             return "freed pointer points to wrong chunk: %p";
         }
 
-        if (nxt_slow_path(nxt_mp_chunk_is_free(page->map, chunk))) {
+        if (njs_slow_path(njs_mp_chunk_is_free(page->map, chunk))) {
             return "freed pointer points to already free chunk: %p";
         }
 
-        nxt_mp_chunk_set_free(page->map, chunk);
+        njs_mp_chunk_set_free(page->map, chunk);
 
         /* Find a slot with appropriate chunk size. */
         for (slot = mp->slots; slot->size < size; slot++) { /* void */ }
@@ -756,10 +756,10 @@ nxt_mp_chunk_free(nxt_mp_t *mp, nxt_mp_block_t *cluster,
                  * Add the page to the head of mp chunk slot list
                  * of pages with free chunks.
                  */
-                nxt_queue_insert_head(&slot->pages, &page->link);
+                njs_queue_insert_head(&slot->pages, &page->link);
             }
 
-            nxt_mp_free_junk(p, size);
+            njs_mp_free_junk(p, size);
 
             return NULL;
 
@@ -768,19 +768,19 @@ nxt_mp_chunk_free(nxt_mp_t *mp, nxt_mp_block_t *cluster,
              * All chunks are free, remove the page from mp chunk slot
              * list of pages with free chunks.
              */
-            nxt_queue_remove(&page->link);
+            njs_queue_remove(&page->link);
         }
 
-    } else if (nxt_slow_path(p != start)) {
+    } else if (njs_slow_path(p != start)) {
         return "invalid pointer to chunk: %p";
     }
 
     /* Add the free page to the mp's free pages tree. */
 
     page->size = 0;
-    nxt_queue_insert_head(&mp->free_pages, &page->link);
+    njs_queue_insert_head(&mp->free_pages, &page->link);
 
-    nxt_mp_free_junk(p, size);
+    njs_mp_free_junk(p, size);
 
     /* Test if all pages in the cluster are free. */
 
@@ -802,12 +802,12 @@ nxt_mp_chunk_free(nxt_mp_t *mp, nxt_mp_block_t *cluster,
     n = mp->cluster_size >> mp->page_size_shift;
 
     do {
-         nxt_queue_remove(&page->link);
+         njs_queue_remove(&page->link);
          page++;
          n--;
     } while (n != 0);
 
-    nxt_rbtree_delete(&mp->blocks, &cluster->node);
+    njs_rbtree_delete(&mp->blocks, &cluster->node);
 
     p = cluster->start;
 
diff --git a/src/njs_mp.h b/src/njs_mp.h
new file mode 100644 (file)
index 0000000..846a360
--- /dev/null
@@ -0,0 +1,37 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_MP_H_INCLUDED_
+#define _NJS_MP_H_INCLUDED_
+
+
+typedef struct njs_mp_s  njs_mp_t;
+
+
+NJS_EXPORT njs_mp_t *njs_mp_create(const njs_mem_proto_t *proto, void *mem,
+    void *trace, size_t cluster_size, size_t page_alignment, size_t page_size,
+    size_t min_chunk_size)
+    NJS_MALLOC_LIKE;
+NJS_EXPORT njs_mp_t * njs_mp_fast_create(const njs_mem_proto_t *proto,
+    void *mem, void *trace, size_t cluster_size, size_t page_alignment,
+    size_t page_size, size_t min_chunk_size)
+    NJS_MALLOC_LIKE;
+NJS_EXPORT njs_bool_t njs_mp_is_empty(njs_mp_t *mp);
+NJS_EXPORT void njs_mp_destroy(njs_mp_t *mp);
+
+NJS_EXPORT void *njs_mp_alloc(njs_mp_t *mp, size_t size)
+    NJS_MALLOC_LIKE;
+NJS_EXPORT void *njs_mp_zalloc(njs_mp_t *mp, size_t size)
+    NJS_MALLOC_LIKE;
+NJS_EXPORT void *njs_mp_align(njs_mp_t *mp, size_t alignment, size_t size)
+    NJS_MALLOC_LIKE;
+NJS_EXPORT void *njs_mp_zalign(njs_mp_t *mp,
+    size_t alignment, size_t size)
+    NJS_MALLOC_LIKE;
+NJS_EXPORT void njs_mp_free(njs_mp_t *mp, void *p);
+
+
+#endif /* _NJS_MP_H_INCLUDED_ */
similarity index 85%
rename from nxt/nxt_murmur_hash.c
rename to src/njs_murmur_hash.c
index 7b49419c1f11f059adfc418f0f4af4a3ea281e0a..336f2b75e6d035111893f4a36877048bed38fcb1 100644 (file)
@@ -4,14 +4,14 @@
  * released to the public domain.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_murmur_hash.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_murmur_hash.h>
 
 
 uint32_t
-nxt_murmur_hash2(const void *data, size_t len)
+njs_murmur_hash2(const void *data, size_t len)
 {
     uint32_t        h, k;
     const u_char    *p;
@@ -60,7 +60,7 @@ nxt_murmur_hash2(const void *data, size_t len)
 /* The MurmurHash2 for fixed 4 byte length. */
 
 uint32_t
-nxt_murmur_hash2_uint32(const void *data)
+njs_murmur_hash2_uint32(const void *data)
 {
     uint32_t        h, k;
     const u_char    *p;
diff --git a/src/njs_murmur_hash.h b/src/njs_murmur_hash.h
new file mode 100644 (file)
index 0000000..2f368be
--- /dev/null
@@ -0,0 +1,15 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_MURMUR_HASH_H_INCLUDED_
+#define _NJS_MURMUR_HASH_H_INCLUDED_
+
+
+NJS_EXPORT uint32_t njs_murmur_hash2(const void *data, size_t len);
+NJS_EXPORT uint32_t njs_murmur_hash2_uint32(const void *data);
+
+
+#endif /* _NJS_MURMUR_HASH_H_INCLUDED_ */
similarity index 90%
rename from njs/njs_number.c
rename to src/njs_number.c
index d2b898787c7cd5eaac570059f66eb0ae25f65f24..bc0837ac28c7e764645e79a8a81bc6f673d0b0ae 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <math.h>
 #include <string.h>
 #include <float.h>
@@ -30,7 +30,7 @@ njs_value_to_index(const njs_value_t *value)
 
     num = NAN;
 
-    if (nxt_fast_path(njs_is_numeric(value))) {
+    if (njs_fast_path(njs_is_numeric(value))) {
         num = njs_number(value);
 
     } else if (njs_is_string(value)) {
@@ -40,7 +40,7 @@ njs_value_to_index(const njs_value_t *value)
 
         array = njs_array(value);
 
-        if (nxt_lvlhsh_is_empty(&array->object.hash)) {
+        if (njs_lvlhsh_is_empty(&array->object.hash)) {
 
             if (array->length == 0) {
                 /* An empty array value is zero. */
@@ -65,7 +65,7 @@ njs_value_to_index(const njs_value_t *value)
 double
 njs_number_dec_parse(const u_char **start, const u_char *end)
 {
-    return nxt_strtod(start, end);
+    return njs_strtod(start, end);
 }
 
 
@@ -84,7 +84,7 @@ njs_number_oct_parse(const u_char **start, const u_char *end)
         /* Values less than '0' become >= 208. */
         c = *p - '0';
 
-        if (nxt_slow_path(c > 7)) {
+        if (njs_slow_path(c > 7)) {
             break;
         }
 
@@ -113,7 +113,7 @@ njs_number_bin_parse(const u_char **start, const u_char *end)
         /* Values less than '0' become >= 208. */
         c = *p - '0';
 
-        if (nxt_slow_path(c > 1)) {
+        if (njs_slow_path(c > 1)) {
             break;
         }
 
@@ -131,7 +131,7 @@ uint64_t
 njs_number_hex_parse(const u_char **start, const u_char *end)
 {
     uint64_t      num;
-    nxt_int_t     n;
+    njs_int_t     n;
     const u_char  *p;
 
     p = *start;
@@ -140,7 +140,7 @@ njs_number_hex_parse(const u_char **start, const u_char *end)
 
     while (p < end) {
         n = njs_char_to_hex(*p);
-        if (nxt_slow_path(n < 0)) {
+        if (njs_slow_path(n < 0)) {
             break;
         }
 
@@ -163,7 +163,7 @@ njs_number_radix_parse(const u_char **start, const u_char *end, uint8_t radix)
     const u_char  *p;
 
     static const int8_t  digits[256]
-        nxt_aligned(32) =
+        njs_aligned(32) =
     {
         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -189,7 +189,7 @@ njs_number_radix_parse(const u_char **start, const u_char *end, uint8_t radix)
     for (p = *start; p < end; p++) {
         d = digits[*p];
 
-        if (nxt_slow_path(d >= radix)) {
+        if (njs_slow_path(d >= radix)) {
             break;
         }
 
@@ -227,19 +227,19 @@ njs_number_to_string(njs_vm_t *vm, njs_value_t *string,
         }
 
     } else {
-        size = nxt_dtoa(num, (char *) buf);
+        size = njs_dtoa(num, (char *) buf);
 
         return njs_string_new(vm, string, buf, size, size);
     }
 
     *string = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t
-njs_number_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_number_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_object_t       *object;
@@ -254,8 +254,8 @@ njs_number_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (vm->top_frame->ctor) {
         object = njs_object_value_alloc(vm, value, NJS_NUMBER);
-        if (nxt_slow_path(object == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(object == NULL)) {
+            return NJS_ERROR;
         }
 
         njs_set_type_object(&vm->retval, object, NJS_OBJECT_NUMBER);
@@ -264,12 +264,12 @@ njs_number_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         njs_set_number(&vm->retval, njs_number(value));
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_number_is_integer(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_number_is_integer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double             num;
@@ -287,13 +287,13 @@ njs_number_is_integer(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 
 static njs_ret_t
-njs_number_is_safe_integer(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_number_is_safe_integer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double             num;
@@ -311,12 +311,12 @@ njs_number_is_safe_integer(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_number_is_nan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_number_is_nan(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     const njs_value_t  *value;
@@ -332,7 +332,7 @@ njs_number_is_nan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -471,14 +471,14 @@ static const njs_object_prop_t  njs_number_constructor_properties[] =
 
 
 const njs_object_init_t  njs_number_constructor_init = {
-    nxt_string("Number"),
+    njs_str("Number"),
     njs_number_constructor_properties,
-    nxt_nitems(njs_number_constructor_properties),
+    njs_nitems(njs_number_constructor_properties),
 };
 
 
 static njs_ret_t
-njs_number_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_number_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_value_t  *value;
@@ -493,19 +493,19 @@ njs_number_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         } else {
             njs_type_error(vm, "unexpected value type:%s",
                            njs_type_string(value->type));
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_number_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double       number, radix;
     njs_value_t  *value;
@@ -520,7 +520,7 @@ njs_number_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
         } else {
             njs_type_error(vm, "unexpected value type:%s",
                            njs_type_string(value->type));
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
@@ -529,7 +529,7 @@ njs_number_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
 
         if (radix < 2 || radix > 36 || radix != (int) radix) {
             njs_range_error(vm, NULL);
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         number = njs_number(value);
@@ -647,14 +647,14 @@ static const njs_object_prop_t  njs_number_prototype_properties[] =
 
 
 const njs_object_init_t  njs_number_prototype_init = {
-    nxt_string("Number"),
+    njs_str("Number"),
     njs_number_prototype_properties,
-    nxt_nitems(njs_number_prototype_properties),
+    njs_nitems(njs_number_prototype_properties),
 };
 
 
 njs_ret_t
-njs_number_global_is_nan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_number_global_is_nan(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     const njs_value_t  *value;
@@ -667,12 +667,12 @@ njs_number_global_is_nan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t
-njs_number_is_finite(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_number_is_finite(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double             num;
@@ -690,19 +690,19 @@ njs_number_is_finite(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t
-njs_number_parse_int(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_number_parse_int(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double             num;
     int64_t            n;
     uint8_t            radix;
-    nxt_str_t          string;
-    nxt_bool_t         minus, test_prefix;
+    njs_str_t          string;
+    njs_bool_t         minus, test_prefix;
     const u_char       *p, *end;
 
     num = NAN;
@@ -770,12 +770,12 @@ done:
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t
-njs_number_parse_float(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_number_parse_float(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     double  num;
@@ -788,7 +788,7 @@ njs_number_parse_float(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -813,9 +813,9 @@ static const njs_object_prop_t  njs_is_nan_function_properties[] =
 
 
 const njs_object_init_t  njs_is_nan_function_init = {
-    nxt_string("isNaN"),
+    njs_str("isNaN"),
     njs_is_nan_function_properties,
-    nxt_nitems(njs_is_nan_function_properties),
+    njs_nitems(njs_is_nan_function_properties),
 };
 
 
@@ -840,9 +840,9 @@ static const njs_object_prop_t  njs_is_finite_function_properties[] =
 
 
 const njs_object_init_t  njs_is_finite_function_init = {
-    nxt_string("isFinite"),
+    njs_str("isFinite"),
     njs_is_finite_function_properties,
-    nxt_nitems(njs_is_finite_function_properties),
+    njs_nitems(njs_is_finite_function_properties),
 };
 
 
@@ -867,9 +867,9 @@ static const njs_object_prop_t  njs_parse_int_function_properties[] =
 
 
 const njs_object_init_t  njs_parse_int_function_init = {
-    nxt_string("parseInt"),
+    njs_str("parseInt"),
     njs_parse_int_function_properties,
-    nxt_nitems(njs_parse_int_function_properties),
+    njs_nitems(njs_parse_int_function_properties),
 };
 
 
@@ -894,7 +894,7 @@ static const njs_object_prop_t  njs_parse_float_function_properties[] =
 
 
 const njs_object_init_t  njs_parse_float_function_init = {
-    nxt_string("parseFloat"),
+    njs_str("parseFloat"),
     njs_parse_float_function_properties,
-    nxt_nitems(njs_parse_float_function_properties),
+    njs_nitems(njs_parse_float_function_properties),
 };
similarity index 85%
rename from njs/njs_number.h
rename to src/njs_number.h
index bc47e49ad133a801db09757a1c231950bada3be2..7b9b1dc7428829689c8c3041ce9e273a6b68ac15 100644 (file)
@@ -22,21 +22,21 @@ int64_t njs_number_radix_parse(const u_char **start, const u_char *end,
 njs_ret_t njs_number_to_string(njs_vm_t *vm, njs_value_t *string,
     const njs_value_t *number);
 njs_ret_t njs_number_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_number_global_is_nan(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_number_is_finite(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_number_parse_int(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_number_parse_float(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 
-nxt_inline int64_t
+njs_inline int64_t
 njs_number_to_int64(double num)
 {
-#if (NXT_NAN_TO_UINT_CONVERSION != 0)
+#if (NJS_NAN_TO_UINT_CONVERSION != 0)
     /*
      * PPC32: NaN and Inf are converted to 0x8000000080000000
      * and become non-zero after truncation.
@@ -65,38 +65,38 @@ njs_number_to_int64(double num)
 }
 
 
-nxt_inline int32_t
+njs_inline int32_t
 njs_number_to_integer(double num)
 {
     return (int32_t) njs_number_to_int64(num);
 }
 
 
-nxt_inline int32_t
+njs_inline int32_t
 njs_number_to_int32(double num)
 {
     return (int32_t) njs_number_to_int64(num);
 }
 
 
-nxt_inline uint32_t
+njs_inline uint32_t
 njs_number_to_uint32(double num)
 {
     return (uint32_t) njs_number_to_int64(num);
 }
 
 
-nxt_inline uint16_t
+njs_inline uint16_t
 njs_number_to_uint16(double num)
 {
     return (uint16_t) njs_number_to_int64(num);
 }
 
 
-nxt_inline uint32_t
+njs_inline uint32_t
 njs_number_to_length(double num)
 {
-#if (NXT_NAN_TO_UINT_CONVERSION != 0)
+#if (NJS_NAN_TO_UINT_CONVERSION != 0)
     if (isnan(num)) {
         return 0;
     }
@@ -113,7 +113,7 @@ njs_number_to_length(double num)
 }
 
 
-nxt_inline nxt_int_t
+njs_inline njs_int_t
 njs_char_to_hex(u_char c)
 {
     c |= 0x20;
@@ -125,7 +125,7 @@ njs_char_to_hex(u_char c)
         /* Values less than 'a' become >= 159. */
         c = c - ('a' - '0');
 
-        if (nxt_slow_path(c > 5)) {
+        if (njs_slow_path(c > 5)) {
             return -1;
         }
 
@@ -136,10 +136,10 @@ njs_char_to_hex(u_char c)
 }
 
 
-nxt_inline double
+njs_inline double
 njs_primitive_value_to_number(const njs_value_t *value)
 {
-    if (nxt_fast_path(njs_is_numeric(value))) {
+    if (njs_fast_path(njs_is_numeric(value))) {
         return njs_number(value);
     }
 
@@ -147,41 +147,41 @@ njs_primitive_value_to_number(const njs_value_t *value)
 }
 
 
-nxt_inline int32_t
+njs_inline int32_t
 njs_primitive_value_to_integer(const njs_value_t *value)
 {
     return njs_number_to_integer(njs_primitive_value_to_number(value));
 }
 
 
-nxt_inline int32_t
+njs_inline int32_t
 njs_primitive_value_to_int32(const njs_value_t *value)
 {
     return njs_number_to_int32(njs_primitive_value_to_number(value));
 }
 
 
-nxt_inline uint32_t
+njs_inline uint32_t
 njs_primitive_value_to_uint32(const njs_value_t *value)
 {
     return njs_number_to_uint32(njs_primitive_value_to_number(value));
 }
 
 
-nxt_inline uint32_t
+njs_inline uint32_t
 njs_primitive_value_to_length(const njs_value_t *value)
 {
     return njs_number_to_length(njs_primitive_value_to_number(value));
 }
 
 
-nxt_inline void
+njs_inline void
 njs_uint32_to_string(njs_value_t *value, uint32_t u32)
 {
     u_char  *dst, *p;
 
     dst = njs_string_short_start(value);
-    p = nxt_sprintf(dst, dst + NJS_STRING_SHORT, "%uD", u32);
+    p = njs_sprintf(dst, dst + NJS_STRING_SHORT, "%uD", u32);
 
     njs_string_short_set(value, p - dst, p - dst);
 }
similarity index 82%
rename from njs/njs_object.c
rename to src/njs_object.c
index 166ef0d90a9f9bc10471dce17ffb3e53907b1a81..ed8cc8ca5dcca2dc34d6b6e969d42aca03aea869 100644 (file)
@@ -4,29 +4,29 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 
 
-static nxt_int_t njs_object_hash_test(nxt_lvlhsh_query_t *lhq, void *data);
+static njs_int_t njs_object_hash_test(njs_lvlhsh_query_t *lhq, void *data);
 static njs_object_prop_t *njs_object_exist_in_proto(const njs_object_t *begin,
-    const njs_object_t *end, nxt_lvlhsh_query_t *lhq);
+    const njs_object_t *end, njs_lvlhsh_query_t *lhq);
 static uint32_t njs_object_enumerate_array_length(const njs_object_t *object);
 static uint32_t njs_object_enumerate_string_length(const njs_object_t *object);
 static uint32_t njs_object_enumerate_object_length(const njs_object_t *object,
-    nxt_bool_t all);
+    njs_bool_t all);
 static uint32_t njs_object_own_enumerate_object_length(
-    const njs_object_t *object, const njs_object_t *parent, nxt_bool_t all);
+    const njs_object_t *object, const njs_object_t *parent, njs_bool_t all);
 static njs_ret_t njs_object_enumerate_array(njs_vm_t *vm,
     const njs_array_t *array, njs_array_t *items, njs_object_enum_t kind);
 static njs_ret_t njs_object_enumerate_string(njs_vm_t *vm,
     const njs_value_t *value, njs_array_t *items, njs_object_enum_t kind);
 static njs_ret_t njs_object_enumerate_object(njs_vm_t *vm,
     const njs_object_t *object, njs_array_t *items, njs_object_enum_t kind,
-    nxt_bool_t all);
+    njs_bool_t all);
 static njs_ret_t njs_object_own_enumerate_object(njs_vm_t *vm,
     const njs_object_t *object, const njs_object_t *parent, njs_array_t *items,
-    njs_object_enum_t kind, nxt_bool_t all);
+    njs_object_enum_t kind, njs_bool_t all);
 
 
 njs_object_t *
@@ -34,11 +34,11 @@ njs_object_alloc(njs_vm_t *vm)
 {
     njs_object_t  *object;
 
-    object = nxt_mp_alloc(vm->mem_pool, sizeof(njs_object_t));
+    object = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_t));
 
-    if (nxt_fast_path(object != NULL)) {
-        nxt_lvlhsh_init(&object->hash);
-        nxt_lvlhsh_init(&object->shared_hash);
+    if (njs_fast_path(object != NULL)) {
+        njs_lvlhsh_init(&object->hash);
+        njs_lvlhsh_init(&object->shared_hash);
         object->__proto__ = &vm->prototypes[NJS_PROTOTYPE_OBJECT].object;
         object->type = NJS_OBJECT;
         object->shared = 0;
@@ -63,9 +63,9 @@ njs_object_value_copy(njs_vm_t *vm, njs_value_t *value)
         return object;
     }
 
-    object = nxt_mp_alloc(vm->mem_pool, sizeof(njs_object_t));
+    object = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_t));
 
-    if (nxt_fast_path(object != NULL)) {
+    if (njs_fast_path(object != NULL)) {
         *object = *njs_object(value);
         object->__proto__ = &vm->prototypes[NJS_PROTOTYPE_OBJECT].object;
         object->shared = 0;
@@ -80,21 +80,21 @@ njs_object_value_copy(njs_vm_t *vm, njs_value_t *value)
 
 
 njs_object_t *
-njs_object_value_alloc(njs_vm_t *vm, const njs_value_t *value, nxt_uint_t type)
+njs_object_value_alloc(njs_vm_t *vm, const njs_value_t *value, njs_uint_t type)
 {
-    nxt_uint_t          index;
+    njs_uint_t          index;
     njs_object_value_t  *ov;
 
-    ov = nxt_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t));
+    ov = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t));
 
-    if (nxt_fast_path(ov != NULL)) {
-        nxt_lvlhsh_init(&ov->object.hash);
+    if (njs_fast_path(ov != NULL)) {
+        njs_lvlhsh_init(&ov->object.hash);
 
         if (type == NJS_STRING) {
             ov->object.shared_hash = vm->shared->string_instance_hash;
 
         } else {
-            nxt_lvlhsh_init(&ov->object.shared_hash);
+            njs_lvlhsh_init(&ov->object.shared_hash);
         }
 
         ov->object.type = njs_object_value_type(type);
@@ -115,12 +115,12 @@ njs_object_value_alloc(njs_vm_t *vm, const njs_value_t *value, nxt_uint_t type)
 }
 
 
-nxt_int_t
-njs_object_hash_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
-    const njs_object_prop_t *prop, nxt_uint_t n)
+njs_int_t
+njs_object_hash_create(njs_vm_t *vm, njs_lvlhsh_t *hash,
+    const njs_object_prop_t *prop, njs_uint_t n)
 {
-    nxt_int_t           ret;
-    nxt_lvlhsh_query_t  lhq;
+    njs_int_t           ret;
+    njs_lvlhsh_query_t  lhq;
 
     lhq.replace = 0;
     lhq.proto = &njs_object_hash_proto;
@@ -128,35 +128,35 @@ njs_object_hash_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
 
     while (n != 0) {
         njs_string_get(&prop->name, &lhq.key);
-        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
         lhq.value = (void *) prop;
 
-        ret = nxt_lvlhsh_insert(hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         prop++;
         n--;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-const nxt_lvlhsh_proto_t  njs_object_hash_proto
-    nxt_aligned(64) =
+const njs_lvlhsh_proto_t  njs_object_hash_proto
+    njs_aligned(64) =
 {
-    NXT_LVLHSH_DEFAULT,
+    NJS_LVLHSH_DEFAULT,
     njs_object_hash_test,
     njs_lvlhsh_alloc,
     njs_lvlhsh_free,
 };
 
 
-static nxt_int_t
-njs_object_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+njs_object_hash_test(njs_lvlhsh_query_t *lhq, void *data)
 {
     size_t             size;
     u_char             *start;
@@ -168,32 +168,32 @@ njs_object_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
 
     if (size != NJS_STRING_LONG) {
         if (lhq->key.length != size) {
-            return NXT_DECLINED;
+            return NJS_DECLINED;
         }
 
         start = prop->name.short_string.start;
 
     } else {
         if (lhq->key.length != prop->name.long_string.size) {
-            return NXT_DECLINED;
+            return NJS_DECLINED;
         }
 
         start = prop->name.long_string.data->start;
     }
 
     if (memcmp(start, lhq->key.start, lhq->key.length) == 0) {
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
 njs_ret_t
-njs_object_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_uint_t         type;
+    njs_uint_t         type;
     njs_object_t       *object;
     const njs_value_t  *value;
 
@@ -203,8 +203,8 @@ njs_object_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (njs_is_null_or_undefined(value)) {
 
         object = njs_object_alloc(vm);
-        if (nxt_slow_path(object == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(object == NULL)) {
+            return NJS_ERROR;
         }
 
         type = NJS_OBJECT;
@@ -218,8 +218,8 @@ njs_object_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
             /* value->type is the same as prototype offset. */
             object = njs_object_value_alloc(vm, value, type);
-            if (nxt_slow_path(object == NULL)) {
-                return NXT_ERROR;
+            if (njs_slow_path(object == NULL)) {
+                return NJS_ERROR;
             }
 
             type = njs_object_value_type(type);
@@ -228,20 +228,20 @@ njs_object_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             njs_type_error(vm, "unexpected constructor argument:%s",
                            njs_type_string(type));
 
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
     njs_set_type_object(&vm->retval, object, type);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 /* TODO: properties with attributes. */
 
 static njs_ret_t
-njs_object_create(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_create(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_object_t       *object;
@@ -252,8 +252,8 @@ njs_object_create(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (njs_is_object(value) || njs_is_null(value)) {
 
         object = njs_object_alloc(vm);
-        if (nxt_slow_path(object == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(object == NULL)) {
+            return NJS_ERROR;
         }
 
         if (!njs_is_null(value)) {
@@ -266,18 +266,18 @@ njs_object_create(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         njs_set_object(&vm->retval, object);
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     njs_type_error(vm, "prototype may only be an object or null: %s",
                    njs_type_string(value->type));
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 static njs_ret_t
-njs_object_keys(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_keys(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_array_t        *keys;
@@ -289,22 +289,22 @@ njs_object_keys(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         njs_type_error(vm, "cannot convert %s argument to object",
                        njs_type_string(value->type));
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     keys = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS, 0);
     if (keys == NULL) {
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     njs_set_array(&vm->retval, keys);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_values(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_values(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_array_t        *array;
@@ -316,22 +316,22 @@ njs_object_values(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         njs_type_error(vm, "cannot convert %s argument to object",
                        njs_type_string(value->type));
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = njs_value_own_enumerate(vm, value, NJS_ENUM_VALUES, 0);
     if (array == NULL) {
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     njs_set_array(&vm->retval, array);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_entries(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_entries(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_array_t        *array;
@@ -343,33 +343,33 @@ njs_object_entries(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         njs_type_error(vm, "cannot convert %s argument to object",
                        njs_type_string(value->type));
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     array = njs_value_own_enumerate(vm, value, NJS_ENUM_BOTH, 0);
     if (array == NULL) {
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     njs_set_array(&vm->retval, array);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_object_prop_t *
 njs_object_exist_in_proto(const njs_object_t *object, const njs_object_t *end,
-    nxt_lvlhsh_query_t *lhq)
+    njs_lvlhsh_query_t *lhq)
 {
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_object_prop_t  *prop;
 
     lhq->proto = &njs_object_hash_proto;
 
     while (object != end) {
-        ret = nxt_lvlhsh_find(&object->hash, lhq);
+        ret = njs_lvlhsh_find(&object->hash, lhq);
 
-        if (nxt_fast_path(ret == NXT_OK)) {
+        if (njs_fast_path(ret == NJS_OK)) {
             prop = lhq->value;
 
             if (prop->type == NJS_WHITEOUT) {
@@ -379,9 +379,9 @@ njs_object_exist_in_proto(const njs_object_t *object, const njs_object_t *end,
             return lhq->value;
         }
 
-        ret = nxt_lvlhsh_find(&object->shared_hash, lhq);
+        ret = njs_lvlhsh_find(&object->shared_hash, lhq);
 
-        if (nxt_fast_path(ret == NXT_OK)) {
+        if (njs_fast_path(ret == NJS_OK)) {
             return lhq->value;
         }
 
@@ -394,8 +394,8 @@ next:
 }
 
 
-nxt_inline uint32_t
-njs_object_enumerate_length(const njs_object_t *object, nxt_bool_t all)
+njs_inline uint32_t
+njs_object_enumerate_length(const njs_object_t *object, njs_bool_t all)
 {
     uint32_t  length;
 
@@ -418,9 +418,9 @@ njs_object_enumerate_length(const njs_object_t *object, nxt_bool_t all)
 }
 
 
-nxt_inline uint32_t
+njs_inline uint32_t
 njs_object_own_enumerate_length(const njs_object_t *object,
-    const njs_object_t *parent, nxt_bool_t all)
+    const njs_object_t *parent, njs_bool_t all)
 {
     uint32_t  length;
 
@@ -443,9 +443,9 @@ njs_object_own_enumerate_length(const njs_object_t *object,
 }
 
 
-nxt_inline njs_ret_t
+njs_inline njs_ret_t
 njs_object_enumerate_value(njs_vm_t *vm, const njs_object_t *object,
-    njs_array_t *items, njs_object_enum_t kind, nxt_bool_t all)
+    njs_array_t *items, njs_object_enum_t kind, njs_bool_t all)
 {
     njs_ret_t           ret;
     njs_object_value_t  *obj_val;
@@ -466,14 +466,14 @@ njs_object_enumerate_value(njs_vm_t *vm, const njs_object_t *object,
         goto object;
     }
 
-    if (nxt_slow_path(ret != NJS_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
 object:
 
     ret = njs_object_enumerate_object(vm, object, items, kind, all);
-    if (nxt_slow_path(ret != NJS_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
@@ -481,10 +481,10 @@ object:
 }
 
 
-nxt_inline njs_ret_t
+njs_inline njs_ret_t
 njs_object_own_enumerate_value(njs_vm_t *vm, const njs_object_t *object,
     const njs_object_t *parent, njs_array_t *items, njs_object_enum_t kind,
-    nxt_bool_t all)
+    njs_bool_t all)
 {
     njs_ret_t           ret;
     njs_object_value_t  *obj_val;
@@ -505,14 +505,14 @@ njs_object_own_enumerate_value(njs_vm_t *vm, const njs_object_t *object,
         goto object;
     }
 
-    if (nxt_slow_path(ret != NJS_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
 object:
 
     ret = njs_object_own_enumerate_object(vm, object, parent, items, kind, all);
-    if (nxt_slow_path(ret != NJS_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
@@ -522,7 +522,7 @@ object:
 
 njs_array_t *
 njs_object_enumerate(njs_vm_t *vm, const njs_object_t *object,
-    njs_object_enum_t kind, nxt_bool_t all)
+    njs_object_enum_t kind, njs_bool_t all)
 {
     uint32_t     length;
     njs_ret_t    ret;
@@ -531,12 +531,12 @@ njs_object_enumerate(njs_vm_t *vm, const njs_object_t *object,
     length = njs_object_enumerate_length(object, all);
 
     items = njs_array_alloc(vm, length, NJS_ARRAY_SPARE);
-    if (nxt_slow_path(items == NULL)) {
+    if (njs_slow_path(items == NULL)) {
         return NULL;
     }
 
     ret = njs_object_enumerate_value(vm, object, items, kind, all);
-    if (nxt_slow_path(ret != NJS_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
 
@@ -548,7 +548,7 @@ njs_object_enumerate(njs_vm_t *vm, const njs_object_t *object,
 
 njs_array_t *
 njs_object_own_enumerate(njs_vm_t *vm, const njs_object_t *object,
-    njs_object_enum_t kind, nxt_bool_t all)
+    njs_object_enum_t kind, njs_bool_t all)
 {
     uint32_t     length;
     njs_ret_t    ret;
@@ -557,12 +557,12 @@ njs_object_own_enumerate(njs_vm_t *vm, const njs_object_t *object,
     length = njs_object_own_enumerate_length(object, object, all);
 
     items = njs_array_alloc(vm, length, NJS_ARRAY_SPARE);
-    if (nxt_slow_path(items == NULL)) {
+    if (njs_slow_path(items == NULL)) {
         return NULL;
     }
 
     ret = njs_object_own_enumerate_value(vm, object, object, items, kind, all);
-    if (nxt_slow_path(ret != NJS_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
 
@@ -603,7 +603,7 @@ njs_object_enumerate_string_length(const njs_object_t *object)
 
 
 static uint32_t
-njs_object_enumerate_object_length(const njs_object_t *object, nxt_bool_t all)
+njs_object_enumerate_object_length(const njs_object_t *object, njs_bool_t all)
 {
     uint32_t            length;
     const njs_object_t  *proto;
@@ -623,22 +623,22 @@ njs_object_enumerate_object_length(const njs_object_t *object, nxt_bool_t all)
 
 static uint32_t
 njs_object_own_enumerate_object_length(const njs_object_t *object,
-    const njs_object_t *parent, nxt_bool_t all)
+    const njs_object_t *parent, njs_bool_t all)
 {
     uint32_t            length;
-    nxt_int_t           ret;
-    nxt_lvlhsh_each_t   lhe;
+    njs_int_t           ret;
+    njs_lvlhsh_each_t   lhe;
     njs_object_prop_t   *prop, *ext_prop;
-    nxt_lvlhsh_query_t  lhq;
-    const nxt_lvlhsh_t  *hash;
+    njs_lvlhsh_query_t  lhq;
+    const njs_lvlhsh_t  *hash;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
     hash = &object->hash;
 
     length = 0;
 
     for ( ;; ) {
-        prop = nxt_lvlhsh_each(hash, &lhe);
+        prop = njs_lvlhsh_each(hash, &lhe);
 
         if (prop == NULL) {
             break;
@@ -656,11 +656,11 @@ njs_object_own_enumerate_object_length(const njs_object_t *object,
         }
     }
 
-    nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
     hash = &object->shared_hash;
 
     for ( ;; ) {
-        prop = nxt_lvlhsh_each(hash, &lhe);
+        prop = njs_lvlhsh_each(hash, &lhe);
 
         if (prop == NULL) {
             break;
@@ -670,9 +670,9 @@ njs_object_own_enumerate_object_length(const njs_object_t *object,
         njs_string_get(&prop->name, &lhq.key);
 
         lhq.proto = &njs_object_hash_proto;
-        ret = nxt_lvlhsh_find(&object->hash, &lhq);
+        ret = njs_lvlhsh_find(&object->hash, &lhq);
 
-        if (ret != NXT_OK) {
+        if (ret != NJS_OK) {
             ext_prop = njs_object_exist_in_proto(parent, object, &lhq);
 
             if (ext_prop == NULL && (prop->enumerable || all)) {
@@ -720,7 +720,7 @@ njs_object_enumerate_array(njs_vm_t *vm, const njs_array_t *array,
             if (njs_is_valid(&array->start[i])) {
 
                 entry = njs_array_alloc(vm, 2, 0);
-                if (nxt_slow_path(entry == NULL)) {
+                if (njs_slow_path(entry == NULL)) {
                     return NJS_ERROR;
                 }
 
@@ -787,7 +787,7 @@ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value,
 
             do {
                 begin = (u_char *) src;
-                nxt_utf8_copy(njs_string_short_start(item), &src, end);
+                njs_utf8_copy(njs_string_short_start(item), &src, end);
                 size = (uint32_t) (src - begin);
 
                 njs_string_short_set(item, size, 1);
@@ -806,7 +806,7 @@ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value,
             for (i = 0; i < len; i++) {
 
                 entry = njs_array_alloc(vm, 2, 0);
-                if (nxt_slow_path(entry == NULL)) {
+                if (njs_slow_path(entry == NULL)) {
                     return NJS_ERROR;
                 }
 
@@ -833,7 +833,7 @@ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value,
 
             do {
                 entry = njs_array_alloc(vm, 2, 0);
-                if (nxt_slow_path(entry == NULL)) {
+                if (njs_slow_path(entry == NULL)) {
                     return NJS_ERROR;
                 }
 
@@ -842,7 +842,7 @@ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value,
                 string = &entry->start[1];
 
                 begin = (u_char *) src;
-                nxt_utf8_copy(njs_string_short_start(string), &src, end);
+                njs_utf8_copy(njs_string_short_start(string), &src, end);
                 size = (uint32_t) (src - begin);
 
                 njs_string_short_set(string, size, 1);
@@ -865,14 +865,14 @@ njs_object_enumerate_string(njs_vm_t *vm, const njs_value_t *value,
 
 static njs_ret_t
 njs_object_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
-    njs_array_t *items, njs_object_enum_t kind, nxt_bool_t all)
+    njs_array_t *items, njs_object_enum_t kind, njs_bool_t all)
 {
     njs_ret_t           ret;
     const njs_object_t  *proto;
 
     ret = njs_object_own_enumerate_object(vm, object, object, items, kind, all);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     proto = object->__proto__;
@@ -880,8 +880,8 @@ njs_object_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
     while (proto != NULL) {
         ret = njs_object_own_enumerate_value(vm, proto, object, items, kind,
                                              all);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         proto = proto->__proto__;
@@ -894,17 +894,17 @@ njs_object_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
 static njs_ret_t
 njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
     const njs_object_t *parent, njs_array_t *items, njs_object_enum_t kind,
-    nxt_bool_t all)
+    njs_bool_t all)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_value_t         *item;
     njs_array_t         *entry;
-    nxt_lvlhsh_each_t   lhe;
+    njs_lvlhsh_each_t   lhe;
     njs_object_prop_t   *prop, *ext_prop;
-    nxt_lvlhsh_query_t  lhq;
-    const nxt_lvlhsh_t  *hash;
+    njs_lvlhsh_query_t  lhq;
+    const njs_lvlhsh_t  *hash;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
 
     item = items->start;
     hash = &object->hash;
@@ -912,7 +912,7 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
     switch (kind) {
     case NJS_ENUM_KEYS:
         for ( ;; ) {
-            prop = nxt_lvlhsh_each(hash, &lhe);
+            prop = njs_lvlhsh_each(hash, &lhe);
 
             if (prop == NULL) {
                 break;
@@ -930,11 +930,11 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
             }
         }
 
-        nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+        njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
         hash = &object->shared_hash;
 
         for ( ;; ) {
-            prop = nxt_lvlhsh_each(hash, &lhe);
+            prop = njs_lvlhsh_each(hash, &lhe);
 
             if (prop == NULL) {
                 break;
@@ -944,9 +944,9 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
             njs_string_get(&prop->name, &lhq.key);
 
             lhq.proto = &njs_object_hash_proto;
-            ret = nxt_lvlhsh_find(&object->hash, &lhq);
+            ret = njs_lvlhsh_find(&object->hash, &lhq);
 
-            if (ret != NXT_OK) {
+            if (ret != NJS_OK) {
                 ext_prop = njs_object_exist_in_proto(parent, object, &lhq);
 
                 if (ext_prop == NULL && (prop->enumerable || all)) {
@@ -959,7 +959,7 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
 
     case NJS_ENUM_VALUES:
         for ( ;; ) {
-            prop = nxt_lvlhsh_each(hash, &lhe);
+            prop = njs_lvlhsh_each(hash, &lhe);
 
             if (prop == NULL) {
                 break;
@@ -978,11 +978,11 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
             }
         }
 
-        nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+        njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
         hash = &object->shared_hash;
 
         for ( ;; ) {
-            prop = nxt_lvlhsh_each(hash, &lhe);
+            prop = njs_lvlhsh_each(hash, &lhe);
 
             if (prop == NULL) {
                 break;
@@ -992,9 +992,9 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
             njs_string_get(&prop->name, &lhq.key);
 
             lhq.proto = &njs_object_hash_proto;
-            ret = nxt_lvlhsh_find(&object->hash, &lhq);
+            ret = njs_lvlhsh_find(&object->hash, &lhq);
 
-            if (ret != NXT_OK) {
+            if (ret != NJS_OK) {
                 ext_prop = njs_object_exist_in_proto(parent, object, &lhq);
 
                 if (ext_prop == NULL && (prop->enumerable || all)) {
@@ -1007,7 +1007,7 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
 
     case NJS_ENUM_BOTH:
         for ( ;; ) {
-            prop = nxt_lvlhsh_each(hash, &lhe);
+            prop = njs_lvlhsh_each(hash, &lhe);
 
             if (prop == NULL) {
                 break;
@@ -1022,7 +1022,7 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
                 && (prop->enumerable || all))
             {
                 entry = njs_array_alloc(vm, 2, 0);
-                if (nxt_slow_path(entry == NULL)) {
+                if (njs_slow_path(entry == NULL)) {
                     return NJS_ERROR;
                 }
 
@@ -1037,11 +1037,11 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
             }
         }
 
-        nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+        njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
         hash = &object->shared_hash;
 
         for ( ;; ) {
-            prop = nxt_lvlhsh_each(hash, &lhe);
+            prop = njs_lvlhsh_each(hash, &lhe);
 
             if (prop == NULL) {
                 break;
@@ -1051,14 +1051,14 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
             njs_string_get(&prop->name, &lhq.key);
 
             lhq.proto = &njs_object_hash_proto;
-            ret = nxt_lvlhsh_find(&object->hash, &lhq);
+            ret = njs_lvlhsh_find(&object->hash, &lhq);
 
-            if (ret != NXT_OK && (prop->enumerable || all)) {
+            if (ret != NJS_OK && (prop->enumerable || all)) {
                 ext_prop = njs_object_exist_in_proto(parent, object, &lhq);
 
                 if (ext_prop == NULL) {
                     entry = njs_array_alloc(vm, 2, 0);
-                    if (nxt_slow_path(entry == NULL)) {
+                    if (njs_slow_path(entry == NULL)) {
                         return NJS_ERROR;
                     }
 
@@ -1084,83 +1084,83 @@ njs_object_own_enumerate_object(njs_vm_t *vm, const njs_object_t *object,
 
 
 static njs_ret_t
-njs_object_define_property(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_define_property(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_value_t        *value;
     const njs_value_t  *name, *desc;
 
     if (!njs_is_object(njs_arg(args, nargs, 1))) {
         njs_type_error(vm, "cannot convert %s argument to object",
                        njs_type_string(njs_arg(args, nargs, 1)->type));
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     value = njs_argument(args, 1);
 
     if (!njs_object(value)->extensible) {
         njs_type_error(vm, "object is not extensible");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     desc = njs_arg(args, nargs, 3);
 
     if (!njs_is_object(desc)) {
         njs_type_error(vm, "descriptor is not an object");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     name = njs_arg(args, nargs, 2);
 
     ret = njs_object_prop_define(vm, value, name, desc);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_define_properties(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_define_properties(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_value_t        *value;
-    nxt_lvlhsh_t       *hash;
-    nxt_lvlhsh_each_t  lhe;
+    njs_lvlhsh_t       *hash;
+    njs_lvlhsh_each_t  lhe;
     njs_object_prop_t  *prop;
     const njs_value_t  *desc;
 
     if (!njs_is_object(njs_arg(args, nargs, 1))) {
         njs_type_error(vm, "cannot convert %s argument to object",
                        njs_type_string(njs_arg(args, nargs, 1)->type));
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     value = njs_argument(args, 1);
 
     if (!njs_object(value)->extensible) {
         njs_type_error(vm, "object is not extensible");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     desc = njs_arg(args, nargs, 2);
 
     if (!njs_is_object(desc)) {
         njs_type_error(vm, "descriptor is not an object");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
-    nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
 
     hash = njs_object_hash(desc);
 
     for ( ;; ) {
-        prop = nxt_lvlhsh_each(hash, &lhe);
+        prop = njs_lvlhsh_each(hash, &lhe);
 
         if (prop == NULL) {
             break;
@@ -1169,21 +1169,21 @@ njs_object_define_properties(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         if (prop->enumerable && njs_is_object(&prop->value)) {
             ret = njs_object_prop_define(vm, value, &prop->name, &prop->value);
 
-            if (nxt_slow_path(ret != NXT_OK)) {
-                return NXT_ERROR;
+            if (njs_slow_path(ret != NJS_OK)) {
+                return NJS_ERROR;
             }
         }
     }
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_object_get_own_property_descriptor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     const njs_value_t  *value, *property;
 
@@ -1192,7 +1192,7 @@ njs_object_get_own_property_descriptor(njs_vm_t *vm, njs_value_t *args,
     if (njs_is_null_or_undefined(value)) {
         njs_type_error(vm, "cannot convert %s argument to object",
                        njs_type_string(value->type));
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     property = njs_arg(args, nargs, 2);
@@ -1203,7 +1203,7 @@ njs_object_get_own_property_descriptor(njs_vm_t *vm, njs_value_t *args,
 
 static njs_ret_t
 njs_object_get_own_property_descriptors(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     njs_ret_t           ret;
     uint32_t            i, length;
@@ -1212,7 +1212,7 @@ njs_object_get_own_property_descriptors(njs_vm_t *vm, njs_value_t *args,
     njs_object_t        *descriptors;
     const njs_value_t   *value, *key;
     njs_object_prop_t   *pr;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     value = njs_arg(args, nargs, 1);
 
@@ -1220,19 +1220,19 @@ njs_object_get_own_property_descriptors(njs_vm_t *vm, njs_value_t *args,
         njs_type_error(vm, "cannot convert %s argument to object",
                        njs_type_string(value->type));
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     names = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS, 1);
-    if (nxt_slow_path(names == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(names == NULL)) {
+        return NJS_ERROR;
     }
 
     length = names->length;
 
     descriptors = njs_object_alloc(vm);
-    if (nxt_slow_path(descriptors == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(descriptors == NULL)) {
+        return NJS_ERROR;
     }
 
     lhq.replace = 0;
@@ -1242,35 +1242,35 @@ njs_object_get_own_property_descriptors(njs_vm_t *vm, njs_value_t *args,
     for (i = 0; i < length; i++) {
         key = &names->start[i];
         ret = njs_object_prop_descriptor(vm, &descriptor, value, key);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
         pr = njs_object_prop_alloc(vm, key, &descriptor, 1);
-        if (nxt_slow_path(pr == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(pr == NULL)) {
+            return NJS_ERROR;
         }
 
         njs_string_get(key, &lhq.key);
-        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
         lhq.value = pr;
 
-        ret = nxt_lvlhsh_insert(&descriptors->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&descriptors->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
     njs_set_object(&vm->retval, descriptors);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_object_get_own_property_names(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     njs_array_t        *names;
     const njs_value_t  *value;
@@ -1281,22 +1281,22 @@ njs_object_get_own_property_names(njs_vm_t *vm, njs_value_t *args,
         njs_type_error(vm, "cannot convert %s argument to object",
                        njs_type_string(value->type));
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     names = njs_value_own_enumerate(vm, value, NJS_ENUM_KEYS, 1);
     if (names == NULL) {
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     njs_set_array(&vm->retval, names);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_get_prototype_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_get_prototype_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     const njs_value_t  *value;
@@ -1306,42 +1306,42 @@ njs_object_get_prototype_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (njs_is_object(value)) {
         njs_object_prototype_proto(vm, (njs_value_t *) value, NULL,
                                    &vm->retval);
-        return NXT_OK;
+        return NJS_OK;
     }
 
     njs_type_error(vm, "cannot convert %s argument to object",
                    njs_type_string(value->type));
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 static njs_ret_t
-njs_object_freeze(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_freeze(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_lvlhsh_t       *hash;
+    njs_lvlhsh_t       *hash;
     njs_object_t       *object;
     njs_object_prop_t  *prop;
-    nxt_lvlhsh_each_t  lhe;
+    njs_lvlhsh_each_t  lhe;
     const njs_value_t  *value;
 
     value = njs_arg(args, nargs, 1);
 
     if (!njs_is_object(value)) {
         vm->retval = njs_value_undefined;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     object = njs_object(value);
     object->extensible = 0;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
 
     hash = &object->hash;
 
     for ( ;; ) {
-        prop = nxt_lvlhsh_each(hash, &lhe);
+        prop = njs_lvlhsh_each(hash, &lhe);
 
         if (prop == NULL) {
             break;
@@ -1353,31 +1353,31 @@ njs_object_freeze(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_is_frozen(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_is_frozen(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_lvlhsh_t       *hash;
+    njs_lvlhsh_t       *hash;
     njs_object_t       *object;
     njs_object_prop_t  *prop;
-    nxt_lvlhsh_each_t  lhe;
+    njs_lvlhsh_each_t  lhe;
     const njs_value_t  *value, *retval;
 
     value = njs_arg(args, nargs, 1);
 
     if (!njs_is_object(value)) {
         vm->retval = njs_value_true;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     retval = &njs_value_false;
 
     object = njs_object(value);
-    nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
 
     hash = &object->hash;
 
@@ -1386,7 +1386,7 @@ njs_object_is_frozen(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     for ( ;; ) {
-        prop = nxt_lvlhsh_each(hash, &lhe);
+        prop = njs_lvlhsh_each(hash, &lhe);
 
         if (prop == NULL) {
             break;
@@ -1407,36 +1407,36 @@ done:
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_seal(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_seal(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_lvlhsh_t       *hash;
+    njs_lvlhsh_t       *hash;
     njs_object_t       *object;
     const njs_value_t  *value;
     njs_object_prop_t  *prop;
-    nxt_lvlhsh_each_t  lhe;
+    njs_lvlhsh_each_t  lhe;
 
     value = njs_arg(args, nargs, 1);
 
     if (!njs_is_object(value)) {
         vm->retval = *value;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     object = njs_object(value);
     object->extensible = 0;
 
-    nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
 
     hash = &object->hash;
 
     for ( ;; ) {
-        prop = nxt_lvlhsh_each(hash, &lhe);
+        prop = njs_lvlhsh_each(hash, &lhe);
 
         if (prop == NULL) {
             break;
@@ -1447,31 +1447,31 @@ njs_object_seal(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_is_sealed(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_is_sealed(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_lvlhsh_t       *hash;
+    njs_lvlhsh_t       *hash;
     njs_object_t       *object;
     njs_object_prop_t  *prop;
-    nxt_lvlhsh_each_t  lhe;
+    njs_lvlhsh_each_t  lhe;
     const njs_value_t  *value, *retval;
 
     value = njs_arg(args, nargs, 1);
 
     if (!njs_is_object(value)) {
         vm->retval = njs_value_true;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     retval = &njs_value_false;
 
     object = njs_object(value);
-    nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+    njs_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
 
     hash = &object->hash;
 
@@ -1480,7 +1480,7 @@ njs_object_is_sealed(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     for ( ;; ) {
-        prop = nxt_lvlhsh_each(hash, &lhe);
+        prop = njs_lvlhsh_each(hash, &lhe);
 
         if (prop == NULL) {
             break;
@@ -1497,12 +1497,12 @@ done:
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_prevent_extensions(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_prevent_extensions(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     const njs_value_t  *value;
@@ -1511,19 +1511,19 @@ njs_object_prevent_extensions(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (!njs_is_object(value)) {
         vm->retval = *value;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     njs_object(&args[1])->extensible = 0;
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_object_is_extensible(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_is_extensible(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     const njs_value_t  *value, *retval;
@@ -1532,7 +1532,7 @@ njs_object_is_extensible(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (!njs_is_object(value)) {
         vm->retval = njs_value_false;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     retval = njs_object(value)->extensible ? &njs_value_true
@@ -1540,7 +1540,7 @@ njs_object_is_extensible(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1554,7 +1554,7 @@ njs_ret_t
 njs_primitive_prototype_get_proto(njs_vm_t *vm, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval)
 {
-    nxt_uint_t    index;
+    njs_uint_t    index;
     njs_object_t  *proto;
 
     /*
@@ -1571,7 +1571,7 @@ njs_primitive_prototype_get_proto(njs_vm_t *vm, njs_value_t *value,
 
     njs_set_type_object(retval, proto, proto->type);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1604,22 +1604,22 @@ njs_object_prototype_create(njs_vm_t *vm, njs_value_t *value,
 
     *retval = *proto;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_value_t *
-njs_property_prototype_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
+njs_property_prototype_create(njs_vm_t *vm, njs_lvlhsh_t *hash,
     njs_object_t *prototype)
 {
-    nxt_int_t                 ret;
+    njs_int_t                 ret;
     njs_object_prop_t         *prop;
-    nxt_lvlhsh_query_t        lhq;
+    njs_lvlhsh_query_t        lhq;
 
     static const njs_value_t  proto_string = njs_string("prototype");
 
     prop = njs_object_prop_alloc(vm, &proto_string, &njs_value_undefined, 0);
-    if (nxt_slow_path(prop == NULL)) {
+    if (njs_slow_path(prop == NULL)) {
         return NULL;
     }
 
@@ -1629,14 +1629,14 @@ njs_property_prototype_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
 
     lhq.value = prop;
     lhq.key_hash = NJS_PROTOTYPE_HASH;
-    lhq.key = nxt_string_value("prototype");
+    lhq.key = njs_str_value("prototype");
     lhq.replace = 0;
     lhq.pool = vm->mem_pool;
     lhq.proto = &njs_object_hash_proto;
 
-    ret = nxt_lvlhsh_insert(hash, &lhq);
+    ret = njs_lvlhsh_insert(hash, &lhq);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return &prop->value;
     }
 
@@ -1836,16 +1836,16 @@ static const njs_object_prop_t  njs_object_constructor_properties[] =
 
 
 const njs_object_init_t  njs_object_constructor_init = {
-    nxt_string("Object"),
+    njs_str("Object"),
     njs_object_constructor_properties,
-    nxt_nitems(njs_object_constructor_properties),
+    njs_nitems(njs_object_constructor_properties),
 };
 
 
 /*
  * ES6, 9.1.2: [[SetPrototypeOf]].
  */
-static nxt_bool_t
+static njs_bool_t
 njs_object_set_prototype_of(njs_vm_t *vm, njs_object_t *object,
     const njs_value_t *value)
 {
@@ -1854,11 +1854,11 @@ njs_object_set_prototype_of(njs_vm_t *vm, njs_object_t *object,
     proto = njs_is_object(value) ? njs_object(value)->__proto__
                                  : NULL;
 
-    if (nxt_slow_path(object->__proto__ == proto)) {
+    if (njs_slow_path(object->__proto__ == proto)) {
         return 1;
     }
 
-    if (nxt_slow_path(proto == NULL)) {
+    if (njs_slow_path(proto == NULL)) {
         object->__proto__ = NULL;
         return 1;
     }
@@ -1882,7 +1882,7 @@ njs_ret_t
 njs_object_prototype_proto(njs_vm_t *vm, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval)
 {
-    nxt_bool_t    ret;
+    njs_bool_t    ret;
     njs_object_t  *proto, *object;
 
     if (!njs_is_object(value)) {
@@ -1895,9 +1895,9 @@ njs_object_prototype_proto(njs_vm_t *vm, njs_value_t *value,
     if (setval != NULL) {
         if (njs_is_object(setval) || njs_is_null(setval)) {
             ret = njs_object_set_prototype_of(vm, object, setval);
-            if (nxt_slow_path(!ret)) {
+            if (njs_slow_path(!ret)) {
                 njs_type_error(vm, "Cyclic __proto__ value");
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
         }
 
@@ -1908,14 +1908,14 @@ njs_object_prototype_proto(njs_vm_t *vm, njs_value_t *value,
 
     proto = object->__proto__;
 
-    if (nxt_fast_path(proto != NULL)) {
+    if (njs_fast_path(proto != NULL)) {
         njs_set_type_object(retval, proto, proto->type);
 
     } else {
         *retval = njs_value_null;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1949,9 +1949,9 @@ njs_object_prototype_create_constructor(njs_vm_t *vm, njs_value_t *value,
 
         } while (object != NULL);
 
-        nxt_thread_log_alert("prototype not found");
+        njs_thread_log_alert("prototype not found");
 
-        return NXT_ERROR;
+        return NJS_ERROR;
 
     } else {
         index = njs_primitive_prototype_index(value->type);
@@ -1965,27 +1965,27 @@ found:
     }
 
     cons = njs_property_constructor_create(vm, &prototype->object.hash, setval);
-    if (nxt_fast_path(cons != NULL)) {
+    if (njs_fast_path(cons != NULL)) {
         *retval = *cons;
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 njs_value_t *
-njs_property_constructor_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
+njs_property_constructor_create(njs_vm_t *vm, njs_lvlhsh_t *hash,
     njs_value_t *constructor)
 {
-    nxt_int_t                 ret;
+    njs_int_t                 ret;
     njs_object_prop_t         *prop;
-    nxt_lvlhsh_query_t        lhq;
+    njs_lvlhsh_query_t        lhq;
 
     static const njs_value_t  constructor_string = njs_string("constructor");
 
     prop = njs_object_prop_alloc(vm, &constructor_string, constructor, 1);
-    if (nxt_slow_path(prop == NULL)) {
+    if (njs_slow_path(prop == NULL)) {
         return NULL;
     }
 
@@ -1996,14 +1996,14 @@ njs_property_constructor_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
 
     lhq.value = prop;
     lhq.key_hash = NJS_CONSTRUCTOR_HASH;
-    lhq.key = nxt_string_value("constructor");
+    lhq.key = njs_str_value("constructor");
     lhq.replace = 1;
     lhq.pool = vm->mem_pool;
     lhq.proto = &njs_object_hash_proto;
 
-    ret = nxt_lvlhsh_insert(hash, &lhq);
+    ret = njs_lvlhsh_insert(hash, &lhq);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return &prop->value;
     }
 
@@ -2014,12 +2014,12 @@ njs_property_constructor_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
 
 
 static njs_ret_t
-njs_object_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     vm->retval = args[0];
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -2051,7 +2051,7 @@ static const njs_value_t  njs_object_error_string =
 
 njs_ret_t
 njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     const njs_value_t  *name;
 
@@ -2097,23 +2097,23 @@ njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
 
     name = class_name[args[0].type];
 
-    if (nxt_fast_path(name != NULL)) {
+    if (njs_fast_path(name != NULL)) {
         vm->retval = *name;
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     njs_internal_error(vm, "Unknown value type");
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 static njs_ret_t
 njs_object_prototype_has_own_property(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
-    nxt_int_t             ret;
+    njs_int_t             ret;
     const njs_value_t     *value, *property;
     njs_property_query_t  pq;
 
@@ -2122,7 +2122,7 @@ njs_object_prototype_has_own_property(njs_vm_t *vm, njs_value_t *args,
     if (njs_is_null_or_undefined(value)) {
         njs_type_error(vm, "cannot convert %s argument to object",
                        njs_type_string(value->type));
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     property = njs_arg(args, nargs, 1);
@@ -2132,15 +2132,15 @@ njs_object_prototype_has_own_property(njs_vm_t *vm, njs_value_t *args,
     ret = njs_property_query(vm, &pq, (njs_value_t *) value, property);
 
     switch (ret) {
-    case NXT_OK:
+    case NJS_OK:
         vm->retval = njs_value_true;
-        return NXT_OK;
+        return NJS_OK;
 
-    case NXT_DECLINED:
+    case NJS_DECLINED:
         vm->retval = njs_value_false;
-        return NXT_OK;
+        return NJS_OK;
 
-    case NXT_ERROR:
+    case NJS_ERROR:
     default:
         return ret;
     }
@@ -2149,9 +2149,9 @@ njs_object_prototype_has_own_property(njs_vm_t *vm, njs_value_t *args,
 
 static njs_ret_t
 njs_object_prototype_prop_is_enumerable(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
-    nxt_int_t             ret;
+    njs_int_t             ret;
     const njs_value_t     *value, *property, *retval;
     njs_object_prop_t     *prop;
     njs_property_query_t  pq;
@@ -2161,7 +2161,7 @@ njs_object_prototype_prop_is_enumerable(njs_vm_t *vm, njs_value_t *args,
     if (njs_is_null_or_undefined(value)) {
         njs_type_error(vm, "cannot convert %s argument to object",
                        njs_type_string(value->type));
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     property = njs_arg(args, nargs, 1);
@@ -2171,29 +2171,29 @@ njs_object_prototype_prop_is_enumerable(njs_vm_t *vm, njs_value_t *args,
     ret = njs_property_query(vm, &pq, (njs_value_t *) value, property);
 
     switch (ret) {
-    case NXT_OK:
+    case NJS_OK:
         prop = pq.lhq.value;
         retval = prop->enumerable ? &njs_value_true : &njs_value_false;
         break;
 
-    case NXT_DECLINED:
+    case NJS_DECLINED:
         retval = &njs_value_false;
         break;
 
-    case NXT_ERROR:
+    case NJS_ERROR:
     default:
         return ret;
     }
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_object_prototype_is_prototype_of(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     njs_object_t       *object, *proto;
     const njs_value_t  *prototype, *value, *retval;
@@ -2219,7 +2219,7 @@ njs_object_prototype_is_prototype_of(njs_vm_t *vm, njs_value_t *args,
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -2287,7 +2287,7 @@ static const njs_object_prop_t  njs_object_prototype_properties[] =
 
 
 const njs_object_init_t  njs_object_prototype_init = {
-    nxt_string("Object"),
+    njs_str("Object"),
     njs_object_prototype_properties,
-    nxt_nitems(njs_object_prototype_properties),
+    njs_nitems(njs_object_prototype_properties),
 };
similarity index 89%
rename from njs/njs_object.h
rename to src/njs_object.h
index 74c3d3abdebf0e2c8b7da1026e1c675d438e21d2..8ffddfb3918bd18c162271a0f75ad8de996e5ac9 100644 (file)
@@ -60,7 +60,7 @@ typedef struct {
 
 
 typedef struct {
-    nxt_lvlhsh_query_t          lhq;
+    njs_lvlhsh_query_t          lhq;
 
     /* scratch is used to get the value of an NJS_PROPERTY_HANDLER property. */
     njs_object_prop_t           scratch;
@@ -91,38 +91,38 @@ typedef struct {
 
 
 struct njs_object_init_s {
-    nxt_str_t                   name;
+    njs_str_t                   name;
     const njs_object_prop_t     *properties;
-    nxt_uint_t                  items;
+    njs_uint_t                  items;
 };
 
 
 njs_object_t *njs_object_alloc(njs_vm_t *vm);
 njs_object_t *njs_object_value_copy(njs_vm_t *vm, njs_value_t *value);
 njs_object_t *njs_object_value_alloc(njs_vm_t *vm, const njs_value_t *value,
-    nxt_uint_t type);
+    njs_uint_t type);
 njs_array_t *njs_object_enumerate(njs_vm_t *vm, const njs_object_t *object,
-    njs_object_enum_t kind, nxt_bool_t all);
+    njs_object_enum_t kind, njs_bool_t all);
 njs_array_t *njs_object_own_enumerate(njs_vm_t *vm, const njs_object_t *object,
-    njs_object_enum_t kind, nxt_bool_t all);
-nxt_int_t njs_object_hash_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
-    const njs_object_prop_t *prop, nxt_uint_t n);
+    njs_object_enum_t kind, njs_bool_t all);
+njs_int_t njs_object_hash_create(njs_vm_t *vm, njs_lvlhsh_t *hash,
+    const njs_object_prop_t *prop, njs_uint_t n);
 njs_ret_t njs_object_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_primitive_prototype_get_proto(njs_vm_t *vm, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval);
 njs_ret_t njs_object_prototype_create(njs_vm_t *vm, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval);
-njs_value_t *njs_property_prototype_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
+njs_value_t *njs_property_prototype_create(njs_vm_t *vm, njs_lvlhsh_t *hash,
     njs_object_t *prototype);
 njs_ret_t njs_object_prototype_proto(njs_vm_t *vm, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval);
 njs_ret_t njs_object_prototype_create_constructor(njs_vm_t *vm,
     njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
-njs_value_t *njs_property_constructor_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
+njs_value_t *njs_property_constructor_create(njs_vm_t *vm, njs_lvlhsh_t *hash,
     njs_value_t *constructor);
 njs_ret_t njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 njs_ret_t njs_property_query(njs_vm_t *vm, njs_property_query_t *pq,
     njs_value_t *object, const njs_value_t *property);
@@ -133,7 +133,7 @@ njs_ret_t njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
 njs_object_prop_t *njs_object_prop_alloc(njs_vm_t *vm, const njs_value_t *name,
     const njs_value_t *value, uint8_t attributes);
 njs_object_prop_t *njs_object_property(njs_vm_t *vm, const njs_object_t *obj,
-    nxt_lvlhsh_query_t *lhq);
+    njs_lvlhsh_query_t *lhq);
 njs_ret_t njs_object_prop_define(njs_vm_t *vm, njs_value_t *object,
     const njs_value_t *name, const njs_value_t *value);
 njs_ret_t njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest,
diff --git a/src/njs_object_hash.h b/src/njs_object_hash.h
new file mode 100644 (file)
index 0000000..b9d8a7f
--- /dev/null
@@ -0,0 +1,288 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_OBJECT_HASH_H_INCLUDED_
+#define _NJS_OBJECT_HASH_H_INCLUDED_
+
+
+#define NJS_ARGV_HASH                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'a'), 'r'), 'g'), 'v')
+
+
+#define NJS_CONFIGURABLE_HASH                                                 \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'c'), 'o'), 'n'), 'f'), 'i'), 'g'), 'u'), 'r'), 'a'), 'b'), 'l'), 'e')
+
+
+#define NJS_CONSTRUCTOR_HASH                                                  \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'c'), 'o'), 'n'), 's'), 't'), 'r'), 'u'), 'c'), 't'), 'o'), 'r')
+
+
+#define NJS_ENUMERABLE_HASH                                                   \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'e'), 'n'), 'u'), 'm'), 'e'), 'r'), 'a'), 'b'), 'l'), 'e')
+
+
+#define NJS_ERRNO_HASH                                                        \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'e'), 'r'), 'r'), 'n'), 'o')
+
+
+#define NJS_ENCODING_HASH                                                     \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'e'), 'n'), 'c'), 'o'), 'd'), 'i'), 'n'), 'g')
+
+
+#define NJS_ENV_HASH                                                          \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'e'), 'n'), 'v')
+
+
+#define NJS_FLAG_HASH                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'f'), 'l'), 'a'), 'g')
+
+
+#define NJS_INDEX_HASH                                                        \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'i'), 'n'), 'd'), 'e'), 'x')
+
+
+#define NJS_INPUT_HASH                                                        \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'i'), 'n'), 'p'), 'u'), 't')
+
+
+#define NJS_GROUPS_HASH                                                       \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'g'), 'r'), 'o'), 'u'), 'p'), 's')
+
+
+#define NJS_JOIN_HASH                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'j'), 'o'), 'i'), 'n')
+
+
+#define NJS_LENGTH_HASH                                                       \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'l'), 'e'), 'n'), 'g'), 't'), 'h')
+
+
+#define NJS_NAME_HASH                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'n'), 'a'), 'm'), 'e')
+
+
+#define NJS_MESSAGE_HASH                                                      \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'm'), 'e'), 's'), 's'), 'a'), 'g'), 'e')
+
+
+#define NJS_MODE_HASH                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'm'), 'o'), 'd'), 'e')
+
+
+#define NJS_SYSCALL_HASH                                                      \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        's'), 'y'), 's'), 'c'), 'a'), 'l'), 'l')
+
+
+#define NJS_PATH_HASH                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'p'), 'a'), 't'), 'h')
+
+
+#define NJS_PROTOTYPE_HASH                                                    \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'p'), 'r'), 'o'), 't'), 'o'), 't'), 'y'), 'p'), 'e')
+
+
+#define NJS_TO_JSON_HASH                                                      \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        't'), 'o'), 'J'), 'S'), 'O'), 'N')
+
+
+#define NJS_TO_STRING_HASH                                                    \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        't'), 'o'), 'S'), 't'), 'r'), 'i'), 'n'), 'g')
+
+
+#define NJS_VALUE_HASH                                                        \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'v'), 'a'), 'l'), 'u'), 'e')
+
+
+#define NJS_VALUE_OF_HASH                                                     \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'v'), 'a'), 'l'), 'u'), 'e'), 'O'), 'f')
+
+
+#define NJS_TO_ISO_STRING_HASH                                                \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        't'), 'o'), 'I'), 'S'), 'O'), 'S'), 't'), 'r'), 'i'), 'n'), 'g')
+
+
+#define NJS_WRITABABLE_HASH                                                   \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'w'), 'r'), 'i'), 't'), 'a'), 'b'), 'l'), 'e')
+
+
+#define NJS_GET_HASH                                                          \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        'g'), 'e'), 't')
+
+
+#define NJS_SET_HASH                                                          \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(                                                         \
+    njs_djb_hash_add(NJS_DJB_HASH_INIT,                                       \
+        's'), 'e'), 't')
+
+
+#endif /* _NJS_OBJECT_HASH_H_INCLUDED_ */
similarity index 81%
rename from njs/njs_object_property.c
rename to src/njs_object_property.c
index 851a7cf91b612ede74868986a59677674992bd7b..e1c7bff6c3e316f5fe3667882ebc995d28a64e62 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 
 
@@ -28,17 +28,17 @@ static njs_object_prop_t *njs_descriptor_prop(njs_vm_t *vm,
 /*
  * ES5.1, 8.12.1: [[GetOwnProperty]], [[GetProperty]].
  * The njs_property_query() returns values
- *   NXT_OK               property has been found in object,
+ *   NJS_OK               property has been found in object,
  *     retval of type njs_object_prop_t * is in pq->lhq.value.
  *     in NJS_PROPERTY_QUERY_GET
  *       prop->type is NJS_PROPERTY, NJS_METHOD or NJS_PROPERTY_HANDLER.
  *     in NJS_PROPERTY_QUERY_SET, NJS_PROPERTY_QUERY_DELETE
  *       prop->type is NJS_PROPERTY, NJS_PROPERTY_REF, NJS_METHOD or
  *       NJS_PROPERTY_HANDLER.
- *   NXT_DECLINED         property was not found in object,
+ *   NJS_DECLINED         property was not found in object,
  *     if pq->lhq.value != NULL it contains retval of type
  *     njs_object_prop_t * where prop->type is NJS_WHITEOUT
- *   NXT_ERROR            exception has been thrown.
+ *   NJS_ERROR            exception has been thrown.
  *
  *   TODO:
  *     Object.defineProperty([1,2], '1', {configurable:false})
@@ -54,9 +54,9 @@ njs_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_value_t *object,
     njs_value_t     prop;
     njs_function_t  *function;
 
-    if (nxt_slow_path(!njs_is_primitive(property))) {
+    if (njs_slow_path(!njs_is_primitive(property))) {
         ret = njs_value_to_string(vm, &prop, (njs_value_t *) property);
-        if (ret != NXT_OK) {
+        if (ret != NJS_OK) {
             return ret;
         }
 
@@ -72,10 +72,10 @@ njs_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_value_t *object,
         break;
 
     case NJS_STRING:
-        if (nxt_fast_path(!njs_is_null_or_undefined_or_boolean(property))) {
+        if (njs_fast_path(!njs_is_null_or_undefined_or_boolean(property))) {
             index = njs_value_to_index(property);
 
-            if (nxt_fast_path(index < NJS_STRING_MAX_LENGTH)) {
+            if (njs_fast_path(index < NJS_STRING_MAX_LENGTH)) {
                 return njs_string_property_query(vm, pq, object, index);
             }
         }
@@ -104,8 +104,8 @@ njs_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_value_t *object,
 
     case NJS_FUNCTION:
         function = njs_function_value_copy(vm, object);
-        if (nxt_slow_path(function == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(function == NULL)) {
+            return NJS_ERROR;
         }
 
         obj = &function->object;
@@ -120,24 +120,24 @@ njs_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_value_t *object,
     default:
         ret = njs_primitive_value_to_string(vm, &pq->value, property);
 
-        if (nxt_fast_path(ret == NXT_OK)) {
+        if (njs_fast_path(ret == NJS_OK)) {
             njs_string_get(&pq->value, &pq->lhq.key);
             njs_type_error(vm, "cannot get property \"%V\" of undefined",
                            &pq->lhq.key);
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         njs_type_error(vm, "cannot get property \"unknown\" of undefined");
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     ret = njs_primitive_value_to_string(vm, &pq->value, property);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
 
         njs_string_get(&pq->value, &pq->lhq.key);
-        pq->lhq.key_hash = nxt_djb_hash(pq->lhq.key.start, pq->lhq.key.length);
+        pq->lhq.key_hash = njs_djb_hash(pq->lhq.key.start, pq->lhq.key.length);
 
         if (obj == NULL) {
             pq->own = 1;
@@ -157,7 +157,7 @@ njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq,
 {
     uint32_t            index;
     njs_ret_t           ret;
-    nxt_bool_t          own;
+    njs_bool_t          own;
     njs_array_t         *array;
     njs_object_t        *proto;
     njs_object_prop_t   *prop;
@@ -177,7 +177,7 @@ njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq,
             switch (proto->type) {
             case NJS_ARRAY:
                 index = njs_value_to_index(property);
-                if (nxt_fast_path(index < NJS_ARRAY_MAX_INDEX)) {
+                if (njs_fast_path(index < NJS_ARRAY_MAX_INDEX)) {
                     array = (njs_array_t *) proto;
                     return njs_array_property_query(vm, pq, array, index);
                 }
@@ -186,11 +186,11 @@ njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq,
 
             case NJS_OBJECT_STRING:
                 index = njs_value_to_index(property);
-                if (nxt_fast_path(index < NJS_STRING_MAX_LENGTH)) {
+                if (njs_fast_path(index < NJS_STRING_MAX_LENGTH)) {
                     ov = (njs_object_value_t *) proto;
                     ret = njs_string_property_query(vm, pq, &ov->value, index);
 
-                    if (nxt_fast_path(ret != NXT_DECLINED)) {
+                    if (njs_fast_path(ret != NJS_DECLINED)) {
                         return ret;
                     }
                 }
@@ -200,9 +200,9 @@ njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq,
             }
         }
 
-        ret = nxt_lvlhsh_find(&proto->hash, &pq->lhq);
+        ret = njs_lvlhsh_find(&proto->hash, &pq->lhq);
 
-        if (ret == NXT_OK) {
+        if (ret == NJS_OK) {
             prop = pq->lhq.value;
 
             if (prop->type != NJS_WHITEOUT) {
@@ -214,9 +214,9 @@ njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq,
             }
 
         } else {
-            ret = nxt_lvlhsh_find(&proto->shared_hash, &pq->lhq);
+            ret = njs_lvlhsh_find(&proto->shared_hash, &pq->lhq);
 
-            if (ret == NXT_OK) {
+            if (ret == NJS_OK) {
                 pq->shared = 1;
 
                 return ret;
@@ -224,7 +224,7 @@ njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq,
         }
 
         if (own) {
-            return NXT_DECLINED;
+            return NJS_DECLINED;
         }
 
         pq->own = 0;
@@ -232,7 +232,7 @@ njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq,
 
     } while (proto != NULL);
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
@@ -247,13 +247,13 @@ njs_array_property_query(njs_vm_t *vm, njs_property_query_t *pq,
 
     if (index >= array->length) {
         if (pq->query != NJS_PROPERTY_QUERY_SET) {
-            return NXT_DECLINED;
+            return NJS_DECLINED;
         }
 
         size = index - array->length;
 
         ret = njs_array_expand(vm, array, 0, size + 1);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -272,7 +272,7 @@ njs_array_property_query(njs_vm_t *vm, njs_property_query_t *pq,
 
     if (pq->query == NJS_PROPERTY_QUERY_GET) {
         if (!njs_is_valid(&array->start[index])) {
-            return NXT_DECLINED;
+            return NJS_DECLINED;
         }
 
         prop->value = array->start[index];
@@ -289,7 +289,7 @@ njs_array_property_query(njs_vm_t *vm, njs_property_query_t *pq,
 
     pq->lhq.value = prop;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -327,10 +327,10 @@ njs_string_property_query(njs_vm_t *vm, njs_property_query_t *pq,
             njs_string_get(&pq->value, &pq->lhq.key);
         }
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
@@ -354,9 +354,9 @@ njs_external_property_query(njs_vm_t *vm, njs_property_query_t *pq,
     ext_proto = object->external.proto;
 
     pq->lhq.proto = &njs_extern_hash_proto;
-    ret = nxt_lvlhsh_find(&ext_proto->hash, &pq->lhq);
+    ret = njs_lvlhsh_find(&ext_proto->hash, &pq->lhq);
 
-    if (ret == NXT_OK) {
+    if (ret == NJS_OK) {
         ext_proto = pq->lhq.value;
 
         prop->value.type = NJS_EXTERNAL;
@@ -380,7 +380,7 @@ njs_external_property_query(njs_vm_t *vm, njs_property_query_t *pq,
         if (ext_proto->get != NULL) {
             obj = njs_extern_object(vm, object);
             ret = ext_proto->get(vm, &prop->value, obj, data);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
         }
@@ -410,7 +410,7 @@ njs_external_property_query(njs_vm_t *vm, njs_property_query_t *pq,
 
         vm->stash = (uintptr_t) pq;
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
 done:
@@ -431,19 +431,19 @@ njs_external_property_set(njs_vm_t *vm, njs_value_t *value, njs_value_t *setval,
 {
     void                  *obj;
     njs_ret_t             ret;
-    nxt_str_t             s;
+    njs_str_t             s;
     njs_property_query_t  *pq;
 
     pq = (njs_property_query_t *) vm->stash;
 
     if (!njs_is_null_or_undefined(setval)) {
         ret = njs_vm_value_to_string(vm, &s, setval);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
     } else {
-        s = nxt_string_value("");
+        s = njs_str_value("");
     }
 
     *retval = *setval;
@@ -471,11 +471,11 @@ njs_external_property_delete(njs_vm_t *vm, njs_value_t *value,
 
 /*
  * ES5.1, 8.12.3: [[Get]].
- *   NXT_OK               property has been found in object,
+ *   NJS_OK               property has been found in object,
  *      retval will contain the property's value
  *
- *   NXT_DECLINED         property was not found in object
- *   NXT_ERROR            exception has been thrown.
+ *   NJS_DECLINED         property was not found in object
+ *   NJS_ERROR            exception has been thrown.
  *      retval will contain undefined
  */
 njs_ret_t
@@ -492,7 +492,7 @@ njs_value_property(njs_vm_t *vm, const njs_value_t *value,
 
     switch (ret) {
 
-    case NXT_OK:
+    case NJS_OK:
         prop = pq.lhq.value;
 
         switch (prop->type) {
@@ -501,7 +501,7 @@ njs_value_property(njs_vm_t *vm, const njs_value_t *value,
             if (pq.shared) {
                 ret = njs_prop_private_copy(vm, &pq);
 
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
 
@@ -530,7 +530,7 @@ njs_value_property(njs_vm_t *vm, const njs_value_t *value,
             ret = prop->value.data.u.prop_handler(vm, (njs_value_t *) value,
                                                   NULL, &prop->value);
 
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -542,29 +542,29 @@ njs_value_property(njs_vm_t *vm, const njs_value_t *value,
                                "while getting",
                                njs_prop_type_string(prop->type));
 
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         break;
 
-    case NXT_DECLINED:
+    case NJS_DECLINED:
         *retval = njs_value_undefined;
 
-        return NXT_DECLINED;
+        return NJS_DECLINED;
 
-    case NXT_ERROR:
+    case NJS_ERROR:
     default:
 
         return ret;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 /*
- *   NXT_OK               property has been set successfully
- *   NXT_ERROR            exception has been thrown.
+ *   NJS_OK               property has been set successfully
+ *   NJS_ERROR            exception has been thrown.
  */
 njs_ret_t
 njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
@@ -577,7 +577,7 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
     if (njs_is_primitive(object)) {
         njs_type_error(vm, "property set on primitive %s type",
                        njs_type_string(object->type));
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     shared = NULL;
@@ -588,7 +588,7 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
 
     switch (ret) {
 
-    case NXT_OK:
+    case NJS_OK:
         prop = pq.lhq.value;
 
         if (njs_is_data_descriptor(prop)) {
@@ -596,7 +596,7 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
                 njs_type_error(vm,
                              "Cannot assign to read-only property \"%V\" of %s",
                                &pq.lhq.key, njs_type_string(object->type));
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
         } else {
@@ -608,13 +608,13 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
             njs_type_error(vm,
                      "Cannot set property \"%V\" of %s which has only a getter",
                            &pq.lhq.key, njs_type_string(object->type));
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         if (prop->type == NJS_PROPERTY_HANDLER) {
             ret = prop->value.data.u.prop_handler(vm, object, value,
                                                   &vm->retval);
-            if (ret != NXT_DECLINED) {
+            if (ret != NJS_DECLINED) {
                 return ret;
             }
         }
@@ -623,7 +623,7 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
             switch (prop->type) {
             case NJS_PROPERTY:
             case NJS_METHOD:
-                if (nxt_slow_path(pq.shared)) {
+                if (njs_slow_path(pq.shared)) {
                     shared = prop;
                     break;
                 }
@@ -632,14 +632,14 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
 
             case NJS_PROPERTY_REF:
                 *prop->value.data.u.value = *value;
-                return NXT_OK;
+                return NJS_OK;
 
             default:
                 njs_internal_error(vm, "unexpected property type \"%s\" "
                                    "while setting",
                                    njs_prop_type_string(prop->type));
 
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
             break;
@@ -647,8 +647,8 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
 
         /* Fall through. */
 
-    case NXT_DECLINED:
-        if (nxt_slow_path(pq.own_whiteout != NULL)) {
+    case NJS_DECLINED:
+        if (njs_slow_path(pq.own_whiteout != NULL)) {
             /* Previously deleted property. */
             prop = pq.own_whiteout;
 
@@ -662,24 +662,24 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
 
         break;
 
-    case NXT_ERROR:
+    case NJS_ERROR:
     default:
 
         return ret;
     }
 
-    if (nxt_slow_path(!njs_object(object)->extensible)) {
+    if (njs_slow_path(!njs_object(object)->extensible)) {
         njs_type_error(vm, "Cannot add property \"%V\", "
                        "object is not extensible", &pq.lhq.key);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     prop = njs_object_prop_alloc(vm, &pq.value, &njs_value_undefined, 1);
-    if (nxt_slow_path(prop == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(prop == NULL)) {
+        return NJS_ERROR;
     }
 
-    if (nxt_slow_path(shared != NULL)) {
+    if (njs_slow_path(shared != NULL)) {
         prop->enumerable = shared->enumerable;
         prop->configurable = shared->configurable;
     }
@@ -688,17 +688,17 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
     pq.lhq.value = prop;
     pq.lhq.pool = vm->mem_pool;
 
-    ret = nxt_lvlhsh_insert(njs_object_hash(object), &pq.lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(njs_object_hash(object), &pq.lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_internal_error(vm, "lvlhsh insert failed");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
 found:
 
     prop->value = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -708,10 +708,10 @@ njs_object_prop_alloc(njs_vm_t *vm, const njs_value_t *name,
 {
     njs_object_prop_t  *prop;
 
-    prop = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
+    prop = njs_mp_align(vm->mem_pool, sizeof(njs_value_t),
                         sizeof(njs_object_prop_t));
 
-    if (nxt_fast_path(prop != NULL)) {
+    if (njs_fast_path(prop != NULL)) {
         /* GC: retain. */
         prop->value = *value;
 
@@ -737,22 +737,22 @@ njs_object_prop_alloc(njs_vm_t *vm, const njs_value_t *name,
 
 njs_object_prop_t *
 njs_object_property(njs_vm_t *vm, const njs_object_t *object,
-    nxt_lvlhsh_query_t *lhq)
+    njs_lvlhsh_query_t *lhq)
 {
-    nxt_int_t  ret;
+    njs_int_t  ret;
 
     lhq->proto = &njs_object_hash_proto;
 
     do {
-        ret = nxt_lvlhsh_find(&object->hash, lhq);
+        ret = njs_lvlhsh_find(&object->hash, lhq);
 
-        if (nxt_fast_path(ret == NXT_OK)) {
+        if (njs_fast_path(ret == NJS_OK)) {
             return lhq->value;
         }
 
-        ret = nxt_lvlhsh_find(&object->shared_hash, lhq);
+        ret = njs_lvlhsh_find(&object->shared_hash, lhq);
 
-        if (nxt_fast_path(ret == NXT_OK)) {
+        if (njs_fast_path(ret == NJS_OK)) {
             return lhq->value;
         }
 
@@ -773,28 +773,28 @@ njs_ret_t
 njs_object_prop_define(njs_vm_t *vm, njs_value_t *object,
     const njs_value_t *name, const njs_value_t *value)
 {
-    nxt_int_t             ret;
+    njs_int_t             ret;
     njs_object_prop_t     *prop, *prev;
     njs_property_query_t  pq;
 
     njs_string_get(name, &pq.lhq.key);
-    pq.lhq.key_hash = nxt_djb_hash(pq.lhq.key.start, pq.lhq.key.length);
+    pq.lhq.key_hash = njs_djb_hash(pq.lhq.key.start, pq.lhq.key.length);
     pq.lhq.proto = &njs_object_hash_proto;
 
     njs_property_query_init(&pq, NJS_PROPERTY_QUERY_SET, 1);
 
     ret = njs_property_query(vm, &pq, object, name);
 
-    if (ret != NXT_OK && ret != NXT_DECLINED) {
+    if (ret != NJS_OK && ret != NJS_DECLINED) {
         return ret;
     }
 
     prop = njs_descriptor_prop(vm, name, njs_object(value));
-    if (nxt_slow_path(prop == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(prop == NULL)) {
+        return NJS_ERROR;
     }
 
-    if (nxt_fast_path(ret == NXT_DECLINED)) {
+    if (njs_fast_path(ret == NJS_DECLINED)) {
 
         /* 6.2.5.6 CompletePropertypropriptor */
 
@@ -825,10 +825,10 @@ njs_object_prop_define(njs_vm_t *vm, njs_value_t *object,
             prop->configurable = 0;
         }
 
-        if (nxt_slow_path(pq.lhq.value != NULL)) {
+        if (njs_slow_path(pq.lhq.value != NULL)) {
             prev = pq.lhq.value;
 
-            if (nxt_slow_path(prev->type == NJS_WHITEOUT)) {
+            if (njs_slow_path(prev->type == NJS_WHITEOUT)) {
                 /* Previously deleted property.  */
                 *prev = *prop;
             }
@@ -838,22 +838,22 @@ njs_object_prop_define(njs_vm_t *vm, njs_value_t *object,
             pq.lhq.replace = 0;
             pq.lhq.pool = vm->mem_pool;
 
-            ret = nxt_lvlhsh_insert(njs_object_hash(object), &pq.lhq);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            ret = njs_lvlhsh_insert(njs_object_hash(object), &pq.lhq);
+            if (njs_slow_path(ret != NJS_OK)) {
                 njs_internal_error(vm, "lvlhsh insert failed");
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
         }
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     /* Updating existing prop. */
 
-    if (nxt_slow_path(pq.shared)) {
+    if (njs_slow_path(pq.shared)) {
         ret = njs_prop_private_copy(vm, &pq);
 
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
     }
@@ -873,14 +873,14 @@ njs_object_prop_define(njs_vm_t *vm, njs_value_t *object,
             *prev->value.data.u.value = njs_value_undefined;
         }
 
-        return NXT_OK;
+        return NJS_OK;
 
     default:
         njs_internal_error(vm, "unexpected property type \"%s\" "
                            "while defining property",
                            njs_prop_type_string(prev->type));
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     /* 9.1.6.3 ValidateAndApplyPropertyDescriptor */
@@ -982,7 +982,7 @@ done:
                 ret = prev->value.data.u.prop_handler(vm, object,
                                                          &prop->value,
                                                          &vm->retval);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
             }
@@ -1004,13 +1004,13 @@ done:
         prev->configurable = prop->configurable;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 
 exception:
 
     njs_type_error(vm, "Cannot redefine property: \"%V\"", &pq.lhq.key);
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -1018,22 +1018,22 @@ static njs_object_prop_t *
 njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name,
     const njs_object_t *desc)
 {
-    nxt_bool_t          data, accessor;
+    njs_bool_t          data, accessor;
     njs_object_prop_t   *prop, *pr;
     const njs_value_t   *setter, *getter;
-    nxt_lvlhsh_query_t  pq;
+    njs_lvlhsh_query_t  pq;
 
     data = 0;
     accessor = 0;
 
     prop = njs_object_prop_alloc(vm, name, &njs_value_invalid,
                                  NJS_ATTRIBUTE_UNSET);
-    if (nxt_slow_path(prop == NULL)) {
+    if (njs_slow_path(prop == NULL)) {
         return NULL;
     }
 
     getter = &njs_value_invalid;
-    pq.key = nxt_string_value("get");
+    pq.key = njs_str_value("get");
     pq.key_hash = NJS_GET_HASH;
 
     pr = njs_object_property(vm, desc, &pq);
@@ -1050,7 +1050,7 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name,
     prop->getter = *getter;
 
     setter = &njs_value_invalid;
-    pq.key = nxt_string_value("set");
+    pq.key = njs_str_value("set");
     pq.key_hash = NJS_SET_HASH;
 
     pr = njs_object_property(vm, desc, &pq);
@@ -1066,7 +1066,7 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name,
 
     prop->setter = *setter;
 
-    pq.key = nxt_string_value("value");
+    pq.key = njs_str_value("value");
     pq.key_hash = NJS_VALUE_HASH;
 
     pr = njs_object_property(vm, desc, &pq);
@@ -1075,7 +1075,7 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name,
         prop->value = pr->value;
     }
 
-    pq.key = nxt_string_value("writable");
+    pq.key = njs_str_value("writable");
     pq.key_hash = NJS_WRITABABLE_HASH;
 
     pr = njs_object_property(vm, desc, &pq);
@@ -1084,7 +1084,7 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name,
         prop->writable = pr->value.data.truth;
     }
 
-    pq.key = nxt_string_value("enumerable");
+    pq.key = njs_str_value("enumerable");
     pq.key_hash = NJS_ENUMERABLE_HASH;
 
     pr = njs_object_property(vm, desc, &pq);
@@ -1092,7 +1092,7 @@ njs_descriptor_prop(njs_vm_t *vm, const njs_value_t *name,
         prop->enumerable = pr->value.data.truth;
     }
 
-    pq.key = nxt_string_value("configurable");
+    pq.key = njs_str_value("configurable");
     pq.key_hash = NJS_CONFIGURABLE_HASH;
 
     pr = njs_object_property(vm, desc, &pq);
@@ -1114,9 +1114,9 @@ static const njs_value_t  njs_object_value_string = njs_string("value");
 static const njs_value_t  njs_object_get_string = njs_string("get");
 static const njs_value_t  njs_object_set_string = njs_string("set");
 static const njs_value_t  njs_object_writable_string =
-                                                    njs_string("writable");
+                                                                                                   njs_string("writable");
 static const njs_value_t  njs_object_enumerable_string =
-                                                    njs_string("enumerable");
+                                                                                                       njs_string("enumerable");
 static const njs_value_t  njs_object_configurable_string =
                                                     njs_string("configurable");
 
@@ -1125,11 +1125,11 @@ njs_ret_t
 njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest,
     const njs_value_t *value, const njs_value_t *property)
 {
-    nxt_int_t             ret;
+    njs_int_t             ret;
     njs_object_t          *desc;
     njs_object_prop_t     *pr, *prop;
     const njs_value_t     *setval;
-    nxt_lvlhsh_query_t    lhq;
+    njs_lvlhsh_query_t    lhq;
     njs_property_query_t  pq;
 
     njs_property_query_init(&pq, NJS_PROPERTY_QUERY_GET, 1);
@@ -1137,14 +1137,14 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest,
     ret = njs_property_query(vm, &pq, (njs_value_t *) value, property);
 
     switch (ret) {
-    case NXT_OK:
+    case NJS_OK:
         break;
 
-    case NXT_DECLINED:
+    case NJS_DECLINED:
         *dest = njs_value_undefined;
-        return NXT_OK;
+        return NJS_OK;
 
-    case NXT_ERROR:
+    case NJS_ERROR:
     default:
         return ret;
     }
@@ -1160,7 +1160,7 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest,
         prop = &pq.scratch;
         ret = prop->value.data.u.prop_handler(vm, (njs_value_t *) value,
                                               NULL, &prop->value);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -1170,7 +1170,7 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest,
         if (pq.shared) {
             ret = njs_prop_private_copy(vm, &pq);
 
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -1182,12 +1182,12 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest,
     default:
         njs_type_error(vm, "unexpected property type: %s",
                        njs_prop_type_string(prop->type));
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     desc = njs_object_alloc(vm);
-    if (nxt_slow_path(desc == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(desc == NULL)) {
+        return NJS_ERROR;
     }
 
     lhq.proto = &njs_object_hash_proto;
@@ -1196,135 +1196,135 @@ njs_object_prop_descriptor(njs_vm_t *vm, njs_value_t *dest,
 
     if (njs_is_data_descriptor(prop)) {
 
-        lhq.key = nxt_string_value("value");
+        lhq.key = njs_str_value("value");
         lhq.key_hash = NJS_VALUE_HASH;
 
         pr = njs_object_prop_alloc(vm, &njs_object_value_string, &prop->value,
                                    1);
-        if (nxt_slow_path(pr == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(pr == NULL)) {
+            return NJS_ERROR;
         }
 
         lhq.value = pr;
 
-        ret = nxt_lvlhsh_insert(&desc->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&desc->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
-        lhq.key = nxt_string_value("writable");
+        lhq.key = njs_str_value("writable");
         lhq.key_hash = NJS_WRITABABLE_HASH;
 
         setval = (prop->writable == 1) ? &njs_value_true : &njs_value_false;
 
         pr = njs_object_prop_alloc(vm, &njs_object_writable_string, setval, 1);
-        if (nxt_slow_path(pr == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(pr == NULL)) {
+            return NJS_ERROR;
         }
 
         lhq.value = pr;
 
-        ret = nxt_lvlhsh_insert(&desc->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&desc->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
     } else {
 
-        lhq.key = nxt_string_value("get");
+        lhq.key = njs_str_value("get");
         lhq.key_hash = NJS_GET_HASH;
 
         pr = njs_object_prop_alloc(vm, &njs_object_get_string, &prop->getter,
                                    1);
-        if (nxt_slow_path(pr == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(pr == NULL)) {
+            return NJS_ERROR;
         }
 
         lhq.value = pr;
 
-        ret = nxt_lvlhsh_insert(&desc->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&desc->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
-        lhq.key = nxt_string_value("set");
+        lhq.key = njs_str_value("set");
         lhq.key_hash = NJS_SET_HASH;
 
         pr = njs_object_prop_alloc(vm, &njs_object_set_string, &prop->setter,
                                    1);
-        if (nxt_slow_path(pr == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(pr == NULL)) {
+            return NJS_ERROR;
         }
 
         lhq.value = pr;
 
-        ret = nxt_lvlhsh_insert(&desc->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&desc->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert failed");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
-    lhq.key = nxt_string_value("enumerable");
+    lhq.key = njs_str_value("enumerable");
     lhq.key_hash = NJS_ENUMERABLE_HASH;
 
     setval = (prop->enumerable == 1) ? &njs_value_true : &njs_value_false;
 
     pr = njs_object_prop_alloc(vm, &njs_object_enumerable_string, setval, 1);
-    if (nxt_slow_path(pr == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(pr == NULL)) {
+        return NJS_ERROR;
     }
 
     lhq.value = pr;
 
-    ret = nxt_lvlhsh_insert(&desc->hash, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&desc->hash, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_internal_error(vm, "lvlhsh insert failed");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
-    lhq.key = nxt_string_value("configurable");
+    lhq.key = njs_str_value("configurable");
     lhq.key_hash = NJS_CONFIGURABLE_HASH;
 
     setval = (prop->configurable == 1) ? &njs_value_true : &njs_value_false;
 
     pr = njs_object_prop_alloc(vm, &njs_object_configurable_string, setval, 1);
-    if (nxt_slow_path(pr == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(pr == NULL)) {
+        return NJS_ERROR;
     }
 
     lhq.value = pr;
 
-    ret = nxt_lvlhsh_insert(&desc->hash, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&desc->hash, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_internal_error(vm, "lvlhsh insert failed");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     njs_set_object(dest, desc);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t
 njs_prop_private_copy(njs_vm_t *vm, njs_property_query_t *pq)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_function_t      *function;
     njs_object_prop_t   *prop, *shared, *name;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     static const njs_value_t  name_string = njs_string("name");
 
-    prop = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
+    prop = njs_mp_align(vm->mem_pool, sizeof(njs_value_t),
                         sizeof(njs_object_prop_t));
-    if (nxt_slow_path(prop == NULL)) {
+    if (njs_slow_path(prop == NULL)) {
         njs_memory_error(vm);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     shared = pq->lhq.value;
@@ -1334,19 +1334,19 @@ njs_prop_private_copy(njs_vm_t *vm, njs_property_query_t *pq)
     pq->lhq.value = prop;
     pq->lhq.pool = vm->mem_pool;
 
-    ret = nxt_lvlhsh_insert(&pq->prototype->hash, &pq->lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&pq->prototype->hash, &pq->lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_internal_error(vm, "lvlhsh insert failed");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     if (!njs_is_function(&prop->value)) {
-        return NXT_OK;
+        return NJS_OK;
     }
 
     function = njs_function_value_copy(vm, &prop->value);
-    if (nxt_slow_path(function == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(function == NULL)) {
+        return NJS_ERROR;
     }
 
     if (function->ctor) {
@@ -1357,26 +1357,26 @@ njs_prop_private_copy(njs_vm_t *vm, njs_property_query_t *pq)
     }
 
     name = njs_object_prop_alloc(vm, &name_string, &prop->name, 0);
-    if (nxt_slow_path(name == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(name == NULL)) {
+        return NJS_ERROR;
     }
 
     name->configurable = 1;
 
     lhq.key_hash = NJS_NAME_HASH;
-    lhq.key = nxt_string_value("name");
+    lhq.key = njs_str_value("name");
     lhq.replace = 0;
     lhq.value = name;
     lhq.proto = &njs_object_hash_proto;
     lhq.pool = vm->mem_pool;
 
-    ret = nxt_lvlhsh_insert(&function->object.hash, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&function->object.hash, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_internal_error(vm, "lvlhsh insert failed");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
similarity index 81%
rename from njs/njs_parser.c
rename to src/njs_parser.c
index 630c1dd11369573eca8f890fe87be3c230d27314..e527d7d705b581ce47edc3b796885aa475dbb3f9 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_regexp.h>
 #include <string.h>
 
@@ -13,7 +13,7 @@ static njs_ret_t njs_parser_scope_begin(njs_vm_t *vm, njs_parser_t *parser,
     njs_scope_t type);
 static void njs_parser_scope_end(njs_vm_t *vm, njs_parser_t *parser);
 static njs_token_t njs_parser_statement_chain(njs_vm_t *vm,
-    njs_parser_t *parser, njs_token_t token, nxt_bool_t top);
+    njs_parser_t *parser, njs_token_t token, njs_bool_t top);
 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_statement(njs_vm_t *vm,
@@ -36,7 +36,7 @@ static njs_parser_node_t *njs_parser_return_set(njs_vm_t *vm,
 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,
-    njs_token_t parent, nxt_bool_t var_in);
+    njs_token_t parent, njs_bool_t var_in);
 static njs_token_t njs_parser_if_statement(njs_vm_t *vm, njs_parser_t *parser);
 static njs_token_t njs_parser_switch_statement(njs_vm_t *vm,
     njs_parser_t *parser);
@@ -48,7 +48,7 @@ static njs_token_t njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser);
 static njs_token_t njs_parser_var_in_statement(njs_vm_t *vm,
     njs_parser_t *parser, njs_parser_node_t *name);
 static njs_token_t njs_parser_for_in_statement(njs_vm_t *vm,
-    njs_parser_t *parser, nxt_str_t *name, njs_token_t token);
+    njs_parser_t *parser, njs_str_t *name, njs_token_t token);
 static njs_token_t njs_parser_brk_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);
@@ -59,7 +59,7 @@ static njs_token_t njs_parser_import_statement(njs_vm_t *vm,
     njs_parser_t *parser);
 static njs_token_t njs_parser_export_statement(njs_vm_t *vm,
     njs_parser_t *parser);
-static nxt_int_t njs_parser_export_sink(njs_vm_t *vm, njs_parser_t *parser);
+static njs_int_t njs_parser_export_sink(njs_vm_t *vm, njs_parser_t *parser);
 static njs_token_t njs_parser_grouping_expression(njs_vm_t *vm,
     njs_parser_t *parser);
 
@@ -74,20 +74,20 @@ static njs_token_t njs_parser_grouping_expression(njs_vm_t *vm,
     (parser)->scope->top = node
 
 
-nxt_int_t
+njs_int_t
 njs_parser(njs_vm_t *vm, njs_parser_t *parser, njs_parser_t *prev)
 {
     njs_ret_t           ret;
     njs_token_t         token;
-    nxt_lvlhsh_t        *variables, *prev_variables;
+    njs_lvlhsh_t        *variables, *prev_variables;
     njs_variable_t      *var;
     njs_parser_node_t   *node;
-    nxt_lvlhsh_each_t   lhe;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_each_t   lhe;
+    njs_lvlhsh_query_t  lhq;
 
     ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_GLOBAL);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     if (prev != NULL) {
@@ -95,7 +95,7 @@ njs_parser(njs_vm_t *vm, njs_parser_t *parser, njs_parser_t *prev)
          * Copy the global scope variables from the previous
          * iteration of the accumulative mode.
          */
-        nxt_lvlhsh_each_init(&lhe, &njs_variables_hash_proto);
+        njs_lvlhsh_each_init(&lhe, &njs_variables_hash_proto);
 
         lhq.proto = &njs_variables_hash_proto;
         lhq.replace = 0;
@@ -105,7 +105,7 @@ njs_parser(njs_vm_t *vm, njs_parser_t *parser, njs_parser_t *prev)
         prev_variables = &prev->scope->variables;
 
         for ( ;; ) {
-            var = nxt_lvlhsh_each(prev_variables, &lhe);
+            var = njs_lvlhsh_each(prev_variables, &lhe);
 
             if (var == NULL) {
                 break;
@@ -113,11 +113,11 @@ njs_parser(njs_vm_t *vm, njs_parser_t *parser, njs_parser_t *prev)
 
             lhq.value = var;
             lhq.key = var->name;
-            lhq.key_hash = nxt_djb_hash(var->name.start, var->name.length);
+            lhq.key_hash = njs_djb_hash(var->name.start, var->name.length);
 
-            ret = nxt_lvlhsh_insert(variables, &lhq);
-            if (nxt_slow_path(ret != NXT_OK)) {
-                return NXT_ERROR;
+            ret = njs_lvlhsh_insert(variables, &lhq);
+            if (njs_slow_path(ret != NJS_OK)) {
+                return NJS_ERROR;
             }
         }
     }
@@ -127,8 +127,8 @@ njs_parser(njs_vm_t *vm, njs_parser_t *parser, njs_parser_t *prev)
     while (token != NJS_TOKEN_END) {
 
         token = njs_parser_statement_chain(vm, parser, token, 1);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            return NJS_ERROR;
         }
 
         if (token == NJS_TOKEN_CLOSE_BRACE && vm->options.trailer) {
@@ -143,8 +143,8 @@ njs_parser(njs_vm_t *vm, njs_parser_t *parser, njs_parser_t *prev)
         /* Empty string, just semicolons or variables declarations. */
 
         node = njs_parser_node_new(vm, parser, 0);
-        if (nxt_slow_path(node == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(node == NULL)) {
+            return NJS_ERROR;
         }
 
         njs_parser_chain_top_set(parser, node);
@@ -152,15 +152,15 @@ njs_parser(njs_vm_t *vm, njs_parser_t *parser, njs_parser_t *prev)
 
     node->token = NJS_TOKEN_END;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_parser_scope_begin(njs_vm_t *vm, njs_parser_t *parser, njs_scope_t type)
 {
-    nxt_uint_t          nesting;
-    nxt_array_t         *values;
+    njs_arr_t           *values;
+    njs_uint_t          nesting;
     njs_lexer_t         *lexer;
     njs_parser_scope_t  *scope, *parent;
 
@@ -181,14 +181,14 @@ njs_parser_scope_begin(njs_vm_t *vm, njs_parser_t *parser, njs_scope_t type)
                                         "The maximum function nesting "
                                         "level is \"%d\"", NJS_MAX_NESTING);
 
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
         }
     }
 
-    scope = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_parser_scope_t));
-    if (nxt_slow_path(scope == NULL)) {
-        return NXT_ERROR;
+    scope = njs_mp_zalloc(vm->mem_pool, sizeof(njs_parser_scope_t));
+    if (njs_slow_path(scope == NULL)) {
+        return NJS_ERROR;
     }
 
     scope->type = type;
@@ -210,18 +210,18 @@ njs_parser_scope_begin(njs_vm_t *vm, njs_parser_t *parser, njs_scope_t type)
     scope->nesting = nesting;
     scope->argument_closures = 0;
 
-    nxt_queue_init(&scope->nested);
-    nxt_lvlhsh_init(&scope->labels);
-    nxt_lvlhsh_init(&scope->variables);
-    nxt_lvlhsh_init(&scope->references);
+    njs_queue_init(&scope->nested);
+    njs_lvlhsh_init(&scope->labels);
+    njs_lvlhsh_init(&scope->variables);
+    njs_lvlhsh_init(&scope->references);
 
     values = NULL;
 
     if (scope->type < NJS_SCOPE_BLOCK) {
-        values = nxt_array_create(4, sizeof(njs_value_t), &njs_array_mem_proto,
-                                  vm->mem_pool);
-        if (nxt_slow_path(values == NULL)) {
-            return NXT_ERROR;
+        values = njs_arr_create(4, sizeof(njs_value_t), &njs_array_mem_proto,
+                                vm->mem_pool);
+        if (njs_slow_path(values == NULL)) {
+            return NJS_ERROR;
         }
     }
 
@@ -231,8 +231,8 @@ njs_parser_scope_begin(njs_vm_t *vm, njs_parser_t *parser, njs_scope_t type)
     lexer = parser->lexer;
 
     if (lexer->file.length != 0) {
-        nxt_file_basename(&lexer->file, &scope->file);
-        nxt_file_dirname(&lexer->file, &scope->cwd);
+        njs_file_basename(&lexer->file, &scope->file);
+        njs_file_dirname(&lexer->file, &scope->cwd);
     }
 
     parent = parser->scope;
@@ -240,7 +240,7 @@ njs_parser_scope_begin(njs_vm_t *vm, njs_parser_t *parser, njs_scope_t type)
     parser->scope = scope;
 
     if (parent != NULL) {
-        nxt_queue_insert_tail(&parent->nested, &scope->link);
+        njs_queue_insert_tail(&parent->nested, &scope->link);
 
         if (nesting == 0) {
             /* Inherit function nesting in blocks. */
@@ -248,7 +248,7 @@ njs_parser_scope_begin(njs_vm_t *vm, njs_parser_t *parser, njs_scope_t type)
         }
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -266,7 +266,7 @@ njs_parser_scope_end(njs_vm_t *vm, njs_parser_t *parser)
 
 static njs_token_t
 njs_parser_statement_chain(njs_vm_t *vm, njs_parser_t *parser,
-    njs_token_t token, nxt_bool_t top)
+    njs_token_t token, njs_bool_t top)
 {
     njs_parser_node_t  *stmt, *last, *node, *new_node, **child;
 
@@ -276,7 +276,7 @@ njs_parser_statement_chain(njs_vm_t *vm, njs_parser_t *parser,
     last = *child;
 
     token = njs_parser_statement(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return njs_parser_unexpected_token(vm, parser, token);
     }
 
@@ -304,7 +304,7 @@ njs_parser_statement_chain(njs_vm_t *vm, njs_parser_t *parser,
     }
 
     stmt = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT);
-    if (nxt_slow_path(stmt == NULL)) {
+    if (njs_slow_path(stmt == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -316,7 +316,7 @@ njs_parser_statement_chain(njs_vm_t *vm, njs_parser_t *parser,
 
     while (token == NJS_TOKEN_SEMICOLON) {
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             break;
         }
     }
@@ -365,7 +365,7 @@ njs_parser_statement(njs_vm_t *vm, njs_parser_t *parser,
     case NJS_TOKEN_CLOSE_BRACE:
         if (vm->options.trailer) {
             parser->node = NULL;
-            nxt_thread_log_debug("BLOCK END");
+            njs_thread_log_debug("BLOCK END");
             return token;
         }
 
@@ -412,7 +412,7 @@ njs_parser_statement(njs_vm_t *vm, njs_parser_t *parser,
             break;
         }
 
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -448,12 +448,12 @@ njs_parser_block_statement(njs_vm_t *vm, njs_parser_t *parser)
     njs_parser_node_t  *node;
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_BLOCK);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -461,13 +461,13 @@ njs_parser_block_statement(njs_vm_t *vm, njs_parser_t *parser)
 
     while (token != NJS_TOKEN_CLOSE_BRACE) {
         token = njs_parser_statement_chain(vm, parser, token, 0);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
     }
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_BLOCK);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -495,15 +495,15 @@ njs_parser_block(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
 
 
 static njs_parser_node_t *
-njs_parser_variable_node(njs_vm_t *vm, njs_parser_t *parser, nxt_str_t *name,
+njs_parser_variable_node(njs_vm_t *vm, njs_parser_t *parser, njs_str_t *name,
     uint32_t hash, njs_variable_type_t type)
 {
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_variable_t     *var;
     njs_parser_node_t  *node;
 
     var = njs_variable_add(vm, parser->scope, name, hash, type);
-    if (nxt_slow_path(var == NULL)) {
+    if (njs_slow_path(var == NULL)) {
         return NULL;
     }
 
@@ -521,13 +521,13 @@ njs_parser_variable_node(njs_vm_t *vm, njs_parser_t *parser, nxt_str_t *name,
     }
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_NAME);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NULL;
     }
 
     ret = njs_variable_reference(vm, parser->scope, node, name, hash,
                                  NJS_DECLARATION);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
 
@@ -540,7 +540,7 @@ njs_parser_labelled_statement(njs_vm_t *vm, njs_parser_t *parser)
 {
     uint32_t        hash;
     njs_ret_t       ret;
-    nxt_str_t       name;
+    njs_str_t       name;
     njs_token_t     token;
     njs_variable_t  *label;
 
@@ -548,41 +548,41 @@ njs_parser_labelled_statement(njs_vm_t *vm, njs_parser_t *parser)
     hash = njs_parser_key_hash(parser);
 
     label = njs_label_find(vm, parser->scope, &name, hash);
-    if (nxt_slow_path(label != NULL)) {
+    if (njs_slow_path(label != NULL)) {
         njs_parser_syntax_error(vm, parser, "Label \"%V\" "
                                 "has already been declared", &name);
         return NJS_TOKEN_ILLEGAL;
     }
 
     label = njs_label_add(vm, parser->scope, &name, hash);
-    if (nxt_slow_path(label == NULL)) {
+    if (njs_slow_path(label == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_COLON);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_statement(vm, parser, token);
 
-    if (nxt_fast_path(token > NJS_TOKEN_ILLEGAL)) {
+    if (njs_fast_path(token > NJS_TOKEN_ILLEGAL)) {
 
         if (parser->node != NULL) {
             /* The statement is not empty block or just semicolon. */
 
             ret = njs_name_copy(vm, &parser->node->name, &name);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return NJS_TOKEN_ERROR;
             }
 
             ret = njs_label_remove(vm, parser->scope, &name, hash);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return NJS_TOKEN_ERROR;
             }
         }
@@ -601,7 +601,7 @@ njs_parser_function_alloc(njs_vm_t *vm, njs_parser_t *parser,
     njs_function_lambda_t  *lambda;
 
     lambda = njs_function_lambda_alloc(vm, 1);
-    if (nxt_slow_path(lambda == NULL)) {
+    if (njs_slow_path(lambda == NULL)) {
         njs_memory_error(vm);
         return NULL;
     }
@@ -613,7 +613,7 @@ njs_parser_function_alloc(njs_vm_t *vm, njs_parser_t *parser,
      */
 
     function = njs_function_alloc(vm, lambda, NULL, 1);
-    if (nxt_slow_path(function == NULL)) {
+    if (njs_slow_path(function == NULL)) {
         return NULL;
     }
 
@@ -640,14 +640,14 @@ njs_parser_function_declaration(njs_vm_t *vm, njs_parser_t *parser)
     njs_parser_node_t  *node;
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_FUNCTION);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     node->token_line = njs_parser_token_line(parser);
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -662,24 +662,24 @@ njs_parser_function_declaration(njs_vm_t *vm, njs_parser_t *parser)
     }
 
     var = njs_parser_variable_add(vm, parser, NJS_VARIABLE_FUNCTION);
-    if (nxt_slow_path(var == NULL)) {
+    if (njs_slow_path(var == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     ret = njs_parser_variable_reference(vm, parser, node, NJS_DECLARATION);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_TOKEN_ERROR;
     }
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     parser->node = node;
 
     function = njs_parser_function_alloc(vm, parser, var);
-    if (nxt_slow_path(function == NULL)) {
+    if (njs_slow_path(function == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -698,7 +698,7 @@ njs_parser_function_expression(njs_vm_t *vm, njs_parser_t *parser)
     njs_function_lambda_t  *lambda;
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_FUNCTION_EXPRESSION);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -706,7 +706,7 @@ njs_parser_function_expression(njs_vm_t *vm, njs_parser_t *parser)
     parser->node = node;
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -715,23 +715,23 @@ njs_parser_function_expression(njs_vm_t *vm, njs_parser_t *parser)
      * in intermediate shim scope.
      */
     ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_SHIM);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_TOKEN_ERROR;
     }
 
     if (token == NJS_TOKEN_NAME) {
         var = njs_parser_variable_add(vm, parser, NJS_VARIABLE_SHIM);
-        if (nxt_slow_path(var == NULL)) {
+        if (njs_slow_path(var == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         function = njs_parser_function_alloc(vm, parser, var);
-        if (nxt_slow_path(function == NULL)) {
+        if (njs_slow_path(function == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -740,7 +740,7 @@ njs_parser_function_expression(njs_vm_t *vm, njs_parser_t *parser)
     } else {
         /* Anonymous function. */
         lambda = njs_function_lambda_alloc(vm, 1);
-        if (nxt_slow_path(lambda == NULL)) {
+        if (njs_slow_path(lambda == NULL)) {
             return NJS_TOKEN_ERROR;
         }
     }
@@ -763,7 +763,7 @@ njs_parser_function_lambda(njs_vm_t *vm, njs_parser_t *parser,
     njs_index_t  index;
 
     ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_FUNCTION);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -773,12 +773,12 @@ njs_parser_function_lambda(njs_vm_t *vm, njs_parser_t *parser,
     index += sizeof(njs_value_t);
 
     token = njs_parser_lambda_arguments(vm, parser, lambda, index, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_lambda_body(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -793,7 +793,7 @@ njs_parser_lambda_arguments(njs_vm_t *vm, njs_parser_t *parser,
     njs_function_lambda_t *lambda, njs_index_t index, njs_token_t token)
 {
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_OPEN_PARENTHESIS);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -801,31 +801,31 @@ njs_parser_lambda_arguments(njs_vm_t *vm, njs_parser_t *parser,
 
     while (token != NJS_TOKEN_CLOSE_PARENTHESIS) {
 
-        if (nxt_slow_path(lambda->rest_parameters)) {
+        if (njs_slow_path(lambda->rest_parameters)) {
             return NJS_TOKEN_ILLEGAL;
         }
 
-        if (nxt_slow_path(token == NJS_TOKEN_ELLIPSIS)) {
+        if (njs_slow_path(token == NJS_TOKEN_ELLIPSIS)) {
             lambda->rest_parameters = 1;
 
             token = njs_parser_token(vm, parser);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return NJS_TOKEN_ILLEGAL;
             }
         }
 
-        if (nxt_slow_path(token != NJS_TOKEN_NAME)) {
+        if (njs_slow_path(token != NJS_TOKEN_NAME)) {
             return NJS_TOKEN_ILLEGAL;
         }
 
         token = njs_parser_lambda_argument(vm, parser, index);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         if (token == NJS_TOKEN_COMMA) {
             token = njs_parser_token(vm, parser);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
         }
@@ -846,7 +846,7 @@ njs_parser_lambda_argument(njs_vm_t *vm, njs_parser_t *parser,
     njs_variable_t  *arg;
 
     arg = njs_parser_variable_add(vm, parser, NJS_VARIABLE_VAR);
-    if (nxt_slow_path(arg == NULL)) {
+    if (njs_slow_path(arg == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -859,7 +859,7 @@ njs_parser_lambda_argument(njs_vm_t *vm, njs_parser_t *parser,
     arg->index = index;
 
     ret = njs_name_copy(vm, &arg->name, njs_parser_text(parser));
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -875,7 +875,7 @@ njs_parser_lambda_body(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
     parent = parser->node;
 
     token = njs_parser_lambda_statements(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -901,7 +901,7 @@ njs_parser_lambda_body(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
          * body statement is not "return" statement.
          */
         body = njs_parser_return_set(vm, parser, NULL);
-        if (nxt_slow_path(body == NULL)) {
+        if (njs_slow_path(body == NULL)) {
             return NJS_TOKEN_ERROR;
         }
     }
@@ -921,14 +921,14 @@ njs_parser_return_set(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t  *stmt, *node;
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_RETURN);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NULL;
     }
 
     node->right = expr;
 
     stmt = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT);
-    if (nxt_slow_path(stmt == NULL)) {
+    if (njs_slow_path(stmt == NULL)) {
         return NULL;
     }
 
@@ -946,7 +946,7 @@ njs_parser_lambda_statements(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token)
 {
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_OPEN_BRACE);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -954,7 +954,7 @@ njs_parser_lambda_statements(njs_vm_t *vm, njs_parser_t *parser,
 
     while (token != NJS_TOKEN_CLOSE_BRACE) {
         token = njs_parser_statement_chain(vm, parser, token, 1);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
     }
@@ -981,19 +981,19 @@ njs_parser_return_statement(njs_vm_t *vm, njs_parser_t *parser)
         if (scope->type == NJS_SCOPE_GLOBAL) {
             njs_parser_syntax_error(vm, parser, "Illegal return statement");
 
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_RETURN);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     parser->node = node;
 
     token = njs_lexer_token(vm, parser->lexer);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -1009,7 +1009,7 @@ njs_parser_return_statement(njs_vm_t *vm, njs_parser_t *parser)
 
     default:
         token = njs_parser_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -1027,7 +1027,7 @@ 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, njs_token_t parent,
-    nxt_bool_t var_in)
+    njs_bool_t var_in)
 {
     njs_token_t          token;
     njs_parser_node_t    *left, *stmt, *name, *assign, *expr;
@@ -1040,7 +1040,7 @@ njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, njs_token_t parent,
 
     do {
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -1058,12 +1058,12 @@ njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, njs_token_t parent,
                                         njs_parser_text(parser),
                                         njs_parser_key_hash(parser),
                                         type);
-        if (nxt_slow_path(name == NULL)) {
+        if (njs_slow_path(name == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -1080,12 +1080,12 @@ njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, njs_token_t parent,
         if (token == NJS_TOKEN_ASSIGNMENT) {
 
             token = njs_parser_token(vm, parser);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
             token = njs_parser_assignment_expression(vm, parser, token);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
@@ -1093,7 +1093,7 @@ njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, njs_token_t parent,
         }
 
         assign = njs_parser_node_new(vm, parser, parent);
-        if (nxt_slow_path(assign == NULL)) {
+        if (njs_slow_path(assign == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -1102,7 +1102,7 @@ njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser, njs_token_t parent,
         assign->right = expr;
 
         stmt = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT);
-        if (nxt_slow_path(stmt == NULL)) {
+        if (njs_slow_path(stmt == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -1125,14 +1125,14 @@ njs_parser_if_statement(njs_vm_t *vm, njs_parser_t *parser)
     njs_parser_node_t  *node, *cond, *stmt;
 
     token = njs_parser_grouping_expression(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     cond = parser->node;
 
     token = njs_parser_block(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -1141,17 +1141,17 @@ njs_parser_if_statement(njs_vm_t *vm, njs_parser_t *parser)
         stmt = parser->node;
 
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         token = njs_parser_block(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_BRANCHING);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -1161,7 +1161,7 @@ njs_parser_if_statement(njs_vm_t *vm, njs_parser_t *parser)
     }
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_IF);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1184,12 +1184,12 @@ njs_parser_switch_statement(njs_vm_t *vm, njs_parser_t *parser)
     dflt = NULL;
 
     token = njs_parser_grouping_expression(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     swtch = njs_parser_node_new(vm, parser, NJS_TOKEN_SWITCH);
-    if (nxt_slow_path(swtch == NULL)) {
+    if (njs_slow_path(swtch == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1197,7 +1197,7 @@ njs_parser_switch_statement(njs_vm_t *vm, njs_parser_t *parser)
     last = &swtch->right;
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_OPEN_BRACE);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -1207,25 +1207,25 @@ njs_parser_switch_statement(njs_vm_t *vm, njs_parser_t *parser)
 
             do {
                 node = njs_parser_node_new(vm, parser, 0);
-                if (nxt_slow_path(node == NULL)) {
+                if (njs_slow_path(node == NULL)) {
                     return NJS_TOKEN_ERROR;
                 }
 
                 if (token == NJS_TOKEN_CASE) {
                     token = njs_parser_token(vm, parser);
-                    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                         return token;
                     }
 
                     token = njs_parser_expression(vm, parser, token);
-                    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                         return token;
                     }
 
                     node->left = parser->node;
 
                     branch = njs_parser_node_new(vm, parser, 0);
-                    if (nxt_slow_path(branch == NULL)) {
+                    if (njs_slow_path(branch == NULL)) {
                         return NJS_TOKEN_ERROR;
                     }
 
@@ -1245,7 +1245,7 @@ njs_parser_switch_statement(njs_vm_t *vm, njs_parser_t *parser)
                     dflt = branch;
 
                     token = njs_parser_token(vm, parser);
-                    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                         return token;
                     }
                 }
@@ -1254,7 +1254,7 @@ njs_parser_switch_statement(njs_vm_t *vm, njs_parser_t *parser)
                 last = &branch->left;
 
                 token = njs_parser_match(vm, parser, token, NJS_TOKEN_COLON);
-                if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                     return token;
                 }
 
@@ -1272,7 +1272,7 @@ njs_parser_switch_statement(njs_vm_t *vm, njs_parser_t *parser)
         }
 
         token = njs_parser_statement_chain(vm, parser, token, 0);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -1292,19 +1292,19 @@ njs_parser_while_statement(njs_vm_t *vm, njs_parser_t *parser)
     njs_parser_node_t  *node, *cond;
 
     token = njs_parser_grouping_expression(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     cond = parser->node;
 
     token = njs_parser_block(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_WHILE);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1323,28 +1323,28 @@ njs_parser_do_while_statement(njs_vm_t *vm, njs_parser_t *parser)
     njs_parser_node_t  *node, *stmt;
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_block(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     stmt = parser->node;
 
-    if (nxt_slow_path(token != NJS_TOKEN_WHILE)) {
+    if (njs_slow_path(token != NJS_TOKEN_WHILE)) {
         return NJS_TOKEN_ILLEGAL;
     }
 
     token = njs_parser_grouping_expression(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_DO);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1359,7 +1359,7 @@ 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)
 {
-    nxt_str_t          name;
+    njs_str_t          name;
     njs_token_t        token;
     njs_parser_node_t  *node, *init, *condition, *update, *cond, *body;
 
@@ -1368,12 +1368,12 @@ njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser)
     update = NULL;
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_OPEN_PARENTHESIS);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -1382,7 +1382,7 @@ njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser)
         if (token == NJS_TOKEN_VAR) {
 
             token = njs_parser_var_statement(vm, parser, token, 1);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
@@ -1397,7 +1397,7 @@ njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser)
             name = *njs_parser_text(parser);
 
             token = njs_parser_expression(vm, parser, token);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
@@ -1405,7 +1405,7 @@ njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser)
 
             if (init->token == NJS_TOKEN_IN) {
                 token = njs_parser_for_in_statement(vm, parser, &name, token);
-                if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                     return token;
                 }
 
@@ -1415,14 +1415,14 @@ njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser)
     }
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_SEMICOLON);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     if (token != NJS_TOKEN_SEMICOLON) {
 
         token = njs_parser_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -1430,14 +1430,14 @@ njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser)
     }
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_SEMICOLON);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     if (token != NJS_TOKEN_CLOSE_PARENTHESIS) {
 
         token = njs_parser_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -1445,27 +1445,27 @@ njs_parser_for_statement(njs_vm_t *vm, njs_parser_t *parser)
     }
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_CLOSE_PARENTHESIS);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_block(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_FOR);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     cond = njs_parser_node_new(vm, parser, 0);
-    if (nxt_slow_path(cond == NULL)) {
+    if (njs_slow_path(cond == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     body = njs_parser_node_new(vm, parser, 0);
-    if (nxt_slow_path(body == NULL)) {
+    if (njs_slow_path(body == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1494,17 +1494,17 @@ njs_parser_var_in_statement(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t  *node, *foreach;
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_expression(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_IN);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1512,17 +1512,17 @@ njs_parser_var_in_statement(njs_vm_t *vm, njs_parser_t *parser,
     node->right = parser->node;
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_CLOSE_PARENTHESIS);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_block(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     foreach = njs_parser_node_new(vm, parser, NJS_TOKEN_FOR_IN);
-    if (nxt_slow_path(foreach == NULL)) {
+    if (njs_slow_path(foreach == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1536,7 +1536,7 @@ njs_parser_var_in_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, nxt_str_t *name,
+njs_parser_for_in_statement(njs_vm_t *vm, njs_parser_t *parser, njs_str_t *name,
     njs_token_t token)
 {
     njs_parser_node_t  *node;
@@ -1551,19 +1551,19 @@ njs_parser_for_in_statement(njs_vm_t *vm, njs_parser_t *parser, nxt_str_t *name,
     }
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_FOR_IN);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     node->left = parser->node;
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_CLOSE_PARENTHESIS);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_block(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -1580,11 +1580,11 @@ njs_parser_brk_statement(njs_vm_t *vm, njs_parser_t *parser,
 {
     uint32_t           hash;
     njs_ret_t          ret;
-    nxt_str_t          name;
+    njs_str_t          name;
     njs_parser_node_t  *node;
 
     node = njs_parser_node_new(vm, parser, token);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1609,7 +1609,7 @@ njs_parser_brk_statement(njs_vm_t *vm, njs_parser_t *parser,
         }
 
         ret = njs_name_copy(vm, &parser->node->name, &name);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -1635,12 +1635,12 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser)
     njs_parser_node_t  *node, *try, *catch;
 
     token = njs_parser_try_block(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     try = njs_parser_node_new(vm, parser, NJS_TOKEN_TRY);
-    if (nxt_slow_path(try == NULL)) {
+    if (njs_slow_path(try == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1648,12 +1648,12 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser)
 
     if (token == NJS_TOKEN_CATCH) {
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         token = njs_parser_match(vm, parser, token, NJS_TOKEN_OPEN_PARENTHESIS);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -1662,7 +1662,7 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser)
         }
 
         catch = njs_parser_node_new(vm, parser, NJS_TOKEN_CATCH);
-        if (nxt_slow_path(catch == NULL)) {
+        if (njs_slow_path(catch == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -1673,30 +1673,30 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser)
          * which receives exception value.
          */
         ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_BLOCK);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_TOKEN_ERROR;
         }
 
         node = njs_parser_variable_node(vm, parser, njs_parser_text(parser),
                                         njs_parser_key_hash(parser),
                                         NJS_VARIABLE_CATCH);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
         catch->left = node;
 
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
-        if (nxt_slow_path(token != NJS_TOKEN_CLOSE_PARENTHESIS)) {
+        if (njs_slow_path(token != NJS_TOKEN_CLOSE_PARENTHESIS)) {
             return NJS_TOKEN_ILLEGAL;
         }
 
         token = njs_parser_try_block(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -1708,12 +1708,12 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser)
     if (token == NJS_TOKEN_FINALLY) {
 
         token = njs_parser_try_block(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_FINALLY);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -1746,12 +1746,12 @@ njs_parser_try_block(njs_vm_t *vm, njs_parser_t *parser)
     njs_parser_node_t  *node;
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token != NJS_TOKEN_OPEN_BRACE)) {
+    if (njs_slow_path(token != NJS_TOKEN_OPEN_BRACE)) {
         return NJS_TOKEN_ILLEGAL;
     }
 
     token = njs_parser_block_statement(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -1760,7 +1760,7 @@ njs_parser_try_block(njs_vm_t *vm, njs_parser_t *parser)
     if (node != NULL && node->token == NJS_TOKEN_BLOCK) {
         parser->node = node->left;
 
-        nxt_mp_free(vm->mem_pool, node);
+        njs_mp_free(vm->mem_pool, node);
     }
 
     return token;
@@ -1774,12 +1774,12 @@ njs_parser_throw_statement(njs_vm_t *vm, njs_parser_t *parser)
     njs_parser_node_t  *node;
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_THROW);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     token = njs_lexer_token(vm, parser->lexer);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -1791,7 +1791,7 @@ njs_parser_throw_statement(njs_vm_t *vm, njs_parser_t *parser)
 
     default:
         token = njs_parser_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -1819,7 +1819,7 @@ njs_parser_import_statement(njs_vm_t *vm, njs_parser_t *parser)
     }
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -1832,17 +1832,17 @@ njs_parser_import_statement(njs_vm_t *vm, njs_parser_t *parser)
     name = njs_parser_variable_node(vm, parser, njs_parser_text(parser),
                                     njs_parser_key_hash(parser),
                                     NJS_VARIABLE_VAR);
-    if (nxt_slow_path(name == NULL)) {
+    if (njs_slow_path(name == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_FROM);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -1851,12 +1851,12 @@ njs_parser_import_statement(njs_vm_t *vm, njs_parser_t *parser)
     }
 
     ret = njs_parser_module(vm, parser);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_TOKEN_ERROR;
     }
 
     import = njs_parser_node_new(vm, parser, NJS_TOKEN_IMPORT);
-    if (nxt_slow_path(import == NULL)) {
+    if (njs_slow_path(import == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1879,19 +1879,19 @@ njs_parser_module_lambda(njs_vm_t *vm, njs_parser_t *parser)
     njs_function_lambda_t  *lambda;
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_FUNCTION_EXPRESSION);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     node->token_line = njs_parser_token_line(parser);
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     lambda = njs_function_lambda_alloc(vm, 1);
-    if (nxt_slow_path(lambda == NULL)) {
+    if (njs_slow_path(lambda == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1899,31 +1899,31 @@ njs_parser_module_lambda(njs_vm_t *vm, njs_parser_t *parser)
     parser->node = node;
 
     ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_FUNCTION);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_TOKEN_ERROR;
     }
 
     parser->scope->module = 1;
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_OPEN_PARENTHESIS);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     parent = parser->node;
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_CLOSE_PARENTHESIS);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_lambda_statements(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     ret = njs_parser_export_sink(vm, parser);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1946,30 +1946,30 @@ njs_parser_export_statement(njs_vm_t *vm, njs_parser_t *parser)
 
     if (!parser->scope->module) {
         njs_parser_syntax_error(vm, parser, "Illegal export statement");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_EXPORT);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     parser->node = node;
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token != NJS_TOKEN_DEFAULT)) {
+    if (njs_slow_path(token != NJS_TOKEN_DEFAULT)) {
         njs_parser_syntax_error(vm, parser,
                                 "Non-default export is not supported");
         return NJS_TOKEN_ILLEGAL;
     }
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_expression(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -1980,10 +1980,10 @@ njs_parser_export_statement(njs_vm_t *vm, njs_parser_t *parser)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_parser_export_sink(njs_vm_t *vm, njs_parser_t *parser)
 {
-    nxt_uint_t         n;
+    njs_uint_t         n;
     njs_parser_node_t  *node, *prev;
 
     n = 0;
@@ -2003,13 +2003,13 @@ njs_parser_export_sink(njs_vm_t *vm, njs_parser_t *parser)
         njs_parser_syntax_error(vm, parser,
              (n == 0) ? "export statement is required"
                       : "Identifier \"default\" has already been declared");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     node = njs_parser_chain_top(parser);
 
     if (node->right && node->right->token == NJS_TOKEN_EXPORT) {
-        return NXT_OK;
+        return NJS_OK;
     }
 
     prev = njs_parser_chain_top(parser);
@@ -2030,7 +2030,7 @@ njs_parser_export_sink(njs_vm_t *vm, njs_parser_t *parser)
     node->left = njs_parser_chain_top(parser);
     njs_parser_chain_top_set(parser, node);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -2040,17 +2040,17 @@ njs_parser_grouping_expression(njs_vm_t *vm, njs_parser_t *parser)
     njs_token_t  token;
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_OPEN_PARENTHESIS);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     token = njs_parser_expression(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -2058,15 +2058,15 @@ njs_parser_grouping_expression(njs_vm_t *vm, njs_parser_t *parser)
 }
 
 
-nxt_int_t
+njs_int_t
 njs_parser_match_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token)
 {
     size_t      offset;
-    nxt_bool_t  rest_parameters;
+    njs_bool_t  rest_parameters;
 
     if (token != NJS_TOKEN_OPEN_PARENTHESIS && token != NJS_TOKEN_NAME) {
-        return NXT_DECLINED;
+        return NJS_DECLINED;
     }
 
     offset = 0;
@@ -2076,8 +2076,8 @@ njs_parser_match_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
     }
 
     token = njs_parser_peek_token(vm, parser, &offset);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-        return NXT_DECLINED;
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        return NJS_DECLINED;
     }
 
     rest_parameters = 0;
@@ -2085,31 +2085,31 @@ njs_parser_match_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
     while (token != NJS_TOKEN_CLOSE_PARENTHESIS) {
 
         if (rest_parameters) {
-            return NXT_DECLINED;
+            return NJS_DECLINED;
         }
 
-        if (nxt_slow_path(token == NJS_TOKEN_ELLIPSIS)) {
+        if (njs_slow_path(token == NJS_TOKEN_ELLIPSIS)) {
             rest_parameters = 1;
 
             token = njs_parser_peek_token(vm, parser, &offset);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-                return NXT_DECLINED;
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                return NJS_DECLINED;
             }
         }
 
-        if (nxt_slow_path(token != NJS_TOKEN_NAME)) {
-            return NXT_DECLINED;
+        if (njs_slow_path(token != NJS_TOKEN_NAME)) {
+            return NJS_DECLINED;
         }
 
         token = njs_parser_peek_token(vm, parser, &offset);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         if (token == NJS_TOKEN_COMMA) {
             token = njs_parser_peek_token(vm, parser, &offset);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-               return NXT_DECLINED;
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+               return NJS_DECLINED;
             }
         }
     }
@@ -2117,19 +2117,19 @@ njs_parser_match_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
 arrow:
 
     token = njs_parser_peek_token(vm, parser, &offset);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-        return NXT_DECLINED;
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        return NJS_DECLINED;
     }
 
     if (parser->lexer->prev_token == NJS_TOKEN_LINE_END) {
-        return NXT_DECLINED;
+        return NJS_DECLINED;
     }
 
-    if (nxt_slow_path(token != NJS_TOKEN_ARROW)) {
-        return NXT_DECLINED;
+    if (njs_slow_path(token != NJS_TOKEN_ARROW)) {
+        return NJS_DECLINED;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -2143,7 +2143,7 @@ njs_parser_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_function_lambda_t  *lambda;
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_FUNCTION_EXPRESSION);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -2151,14 +2151,14 @@ njs_parser_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
     parser->node = node;
 
     lambda = njs_function_lambda_alloc(vm, 0);
-    if (nxt_slow_path(lambda == NULL)) {
+    if (njs_slow_path(lambda == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     node->u.value.data.u.lambda = lambda;
 
     ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_FUNCTION);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -2171,13 +2171,13 @@ njs_parser_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
 
     if (token == NJS_TOKEN_OPEN_PARENTHESIS) {
         token = njs_parser_lambda_arguments(vm, parser, lambda, index, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
     } else {
         token = njs_parser_lambda_argument(vm, parser, index);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -2189,13 +2189,13 @@ njs_parser_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
     }
 
     token = njs_parser_match(vm, parser, token, NJS_TOKEN_ARROW);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     if (token == NJS_TOKEN_OPEN_BRACE) {
         token = njs_parser_lambda_body(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -2203,12 +2203,12 @@ njs_parser_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
         parent = parser->node;
 
         token = njs_parser_assignment_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         body = njs_parser_return_set(vm, parser, parser->node);
-        if (nxt_slow_path(body == NULL)) {
+        if (njs_slow_path(body == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -2222,10 +2222,10 @@ njs_parser_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
 }
 
 
-nxt_bool_t
+njs_bool_t
 njs_parser_has_side_effect(njs_parser_node_t *node)
 {
-    nxt_bool_t  side_effect;
+    njs_bool_t  side_effect;
 
     if (node == NULL) {
         return 0;
@@ -2245,7 +2245,7 @@ njs_parser_has_side_effect(njs_parser_node_t *node)
 
     side_effect = njs_parser_has_side_effect(node->left);
 
-    if (nxt_fast_path(!side_effect)) {
+    if (njs_fast_path(!side_effect)) {
         return njs_parser_has_side_effect(node->right);
     }
 
@@ -2270,7 +2270,7 @@ njs_parser_unexpected_token(njs_vm_t *vm, njs_parser_t *parser,
 
 
 u_char *
-njs_parser_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
+njs_parser_trace_handler(njs_trace_t *trace, njs_trace_data_t *td,
     u_char *start)
 {
     u_char        *p;
@@ -2279,7 +2279,7 @@ njs_parser_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
     njs_lexer_t   *lexer;
     njs_parser_t  *parser;
 
-    size = nxt_length("InternalError: ");
+    size = njs_length("InternalError: ");
     memcpy(start, "InternalError: ", size);
     p = start + size;
 
@@ -2314,28 +2314,28 @@ njs_parser_scope_error(njs_vm_t *vm, njs_parser_scope_t *scope,
     njs_value_type_t type, uint32_t line, const char *fmt, va_list args)
 {
     size_t     width;
-    u_char     msg[NXT_MAX_ERROR_STR];
+    u_char     msg[NJS_MAX_ERROR_STR];
     u_char     *p, *end;
-    nxt_str_t  *file;
+    njs_str_t  *file;
 
     file = &scope->file;
 
     p = msg;
-    end = msg + NXT_MAX_ERROR_STR;
+    end = msg + NJS_MAX_ERROR_STR;
 
-    p = nxt_vsprintf(p, end, fmt, args);
+    p = njs_vsprintf(p, end, fmt, args);
 
-    width = nxt_length(" in ") + file->length + NXT_INT_T_LEN;
+    width = njs_length(" in ") + file->length + NJS_INT_T_LEN;
 
     if (p > end - width) {
         p = end - width;
     }
 
     if (file->length != 0 && !vm->options.quiet) {
-        p = nxt_sprintf(p, end, " in %V:%uD", file, line);
+        p = njs_sprintf(p, end, " in %V:%uD", file, line);
 
     } else {
-        p = nxt_sprintf(p, end, " in %uD", line);
+        p = njs_sprintf(p, end, " in %uD", line);
     }
 
     njs_error_new(vm, &vm->retval, type, msg, p - msg);
similarity index 82%
rename from njs/njs_parser.h
rename to src/njs_parser.h
index e754d6d5d90c9557a76ffdc0783cb27ce93efc56..70f10c762c0777cb183d2b2242d1381b6901037b 100644 (file)
 struct njs_parser_scope_s {
     njs_parser_node_t               *top;
 
-    nxt_queue_link_t                link;
-    nxt_queue_t                     nested;
+    njs_queue_link_t                link;
+    njs_queue_t                     nested;
 
     njs_parser_scope_t              *parent;
-    nxt_lvlhsh_t                    labels;
-    nxt_lvlhsh_t                    variables;
-    nxt_lvlhsh_t                    references;
+    njs_lvlhsh_t                    labels;
+    njs_lvlhsh_t                    variables;
+    njs_lvlhsh_t                    references;
 
 #define NJS_SCOPE_INDEX_LOCAL       0
 #define NJS_SCOPE_INDEX_CLOSURE     1
 
-    nxt_array_t                     *values[2];  /* Array of njs_value_t. */
+    njs_arr_t                       *values[2];  /* Array of njs_value_t. */
     njs_index_t                     next_index[2];
 
-    nxt_str_t                       cwd;
-    nxt_str_t                       file;
+    njs_str_t                       cwd;
+    njs_str_t                       file;
 
     njs_scope_t                     type:8;
     uint8_t                         nesting;     /* 4 bits */
@@ -51,7 +51,7 @@ struct njs_parser_node_s {
         njs_parser_node_t           *object;
     } u;
 
-    nxt_str_t                       name;
+    njs_str_t                       name;
 
     njs_index_t                     index;
 
@@ -76,14 +76,14 @@ struct njs_parser_s {
 };
 
 
-nxt_int_t njs_parser(njs_vm_t *vm, njs_parser_t *parser,
+njs_int_t njs_parser(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_t *prev);
 njs_token_t njs_parser_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token);
 njs_token_t njs_parser_assignment_expression(njs_vm_t *vm,
     njs_parser_t *parser, njs_token_t token);
 njs_token_t njs_parser_function_expression(njs_vm_t *vm, njs_parser_t *parser);
-nxt_int_t njs_parser_match_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
+njs_int_t njs_parser_match_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token);
 njs_token_t njs_parser_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token);
@@ -94,7 +94,7 @@ njs_token_t njs_parser_template_literal(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *parent);
 njs_parser_node_t *njs_parser_argument(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *expr, njs_index_t index);
-nxt_int_t njs_parser_string_create(njs_vm_t *vm, njs_value_t *value);
+njs_int_t njs_parser_string_create(njs_vm_t *vm, njs_value_t *value);
 njs_token_t njs_parser_function_lambda(njs_vm_t *vm, njs_parser_t *parser,
     njs_function_lambda_t *lambda, njs_token_t token);
 njs_token_t njs_parser_lambda_statements(njs_vm_t *vm, njs_parser_t *parser,
@@ -102,10 +102,10 @@ njs_token_t njs_parser_lambda_statements(njs_vm_t *vm, njs_parser_t *parser,
 njs_variable_t *njs_variable_resolve(njs_vm_t *vm, njs_parser_node_t *node);
 njs_index_t njs_variable_typeof(njs_vm_t *vm, njs_parser_node_t *node);
 njs_index_t njs_variable_index(njs_vm_t *vm, njs_parser_node_t *node);
-nxt_bool_t njs_parser_has_side_effect(njs_parser_node_t *node);
+njs_bool_t njs_parser_has_side_effect(njs_parser_node_t *node);
 njs_token_t njs_parser_unexpected_token(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token);
-u_char *njs_parser_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
+u_char *njs_parser_trace_handler(njs_trace_t *trace, njs_trace_data_t *td,
     u_char *start);
 void njs_parser_lexer_error(njs_vm_t *vm, njs_parser_t *parser,
     njs_value_type_t type, const char *fmt, ...);
@@ -146,40 +146,40 @@ void njs_parser_node_error(njs_vm_t *vm, njs_parser_node_t *node,
     njs_parser_lexer_error(vm, parser, NJS_OBJECT_REF_ERROR, fmt, ##__VA_ARGS__)
 
 
-nxt_inline njs_token_t
+njs_inline njs_token_t
 njs_parser_token(njs_vm_t *vm, njs_parser_t *parser)
 {
     njs_token_t  token;
 
     do {
         token = njs_lexer_token(vm, parser->lexer);
-    } while (nxt_slow_path(token == NJS_TOKEN_LINE_END));
+    } while (njs_slow_path(token == NJS_TOKEN_LINE_END));
 
     return token;
 }
 
 
-nxt_inline njs_token_t
+njs_inline njs_token_t
 njs_parser_peek_token(njs_vm_t *vm, njs_parser_t *parser, size_t *offset)
 {
     njs_token_t  token;
 
     do {
         token = njs_lexer_peek_token(vm, parser->lexer, (*offset)++);
-    } while (nxt_slow_path(token == NJS_TOKEN_LINE_END));
+    } while (njs_slow_path(token == NJS_TOKEN_LINE_END));
 
     return token;
 }
 
 
-nxt_inline njs_parser_node_t *
+njs_inline njs_parser_node_t *
 njs_parser_node_new(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
 {
     njs_parser_node_t  *node;
 
-    node = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_parser_node_t));
+    node = njs_mp_zalloc(vm->mem_pool, sizeof(njs_parser_node_t));
 
-    if (nxt_fast_path(node != NULL)) {
+    if (njs_fast_path(node != NULL)) {
         node->token = token;
         node->scope = parser->scope;
     }
@@ -188,19 +188,19 @@ njs_parser_node_new(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
 }
 
 
-nxt_inline njs_parser_node_t *
+njs_inline njs_parser_node_t *
 njs_parser_node_string(njs_vm_t *vm, njs_parser_t *parser)
 {
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_parser_node_t  *node;
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_STRING);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NULL;
     }
 
     ret = njs_parser_string_create(vm, &node->u.value);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
 
@@ -208,11 +208,11 @@ njs_parser_node_string(njs_vm_t *vm, njs_parser_t *parser)
 }
 
 
-nxt_inline njs_token_t
+njs_inline njs_token_t
 njs_parser_match(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
     njs_token_t match)
 {
-    if (nxt_fast_path(token == match)) {
+    if (njs_fast_path(token == match)) {
         return njs_parser_token(vm, parser);
     }
 
@@ -220,7 +220,7 @@ njs_parser_match(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
 }
 
 
-nxt_inline njs_variable_t *
+njs_inline njs_variable_t *
 njs_parser_variable_add(njs_vm_t *vm, njs_parser_t *parser,
     njs_variable_type_t type)
 {
@@ -229,7 +229,7 @@ njs_parser_variable_add(njs_vm_t *vm, njs_parser_t *parser,
 }
 
 
-nxt_inline njs_ret_t
+njs_inline njs_ret_t
 njs_parser_variable_reference(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *node, njs_reference_type_t type)
 {
@@ -239,7 +239,7 @@ njs_parser_variable_reference(njs_vm_t *vm, njs_parser_t *parser,
 }
 
 
-nxt_inline njs_parser_scope_t *
+njs_inline njs_parser_scope_t *
 njs_parser_global_scope(njs_vm_t *vm)
 {
     njs_parser_scope_t  *scope;
@@ -254,8 +254,8 @@ njs_parser_global_scope(njs_vm_t *vm)
 }
 
 
-nxt_inline njs_parser_scope_t *
-njs_function_scope(njs_parser_scope_t *scope, nxt_bool_t any)
+njs_inline njs_parser_scope_t *
+njs_function_scope(njs_parser_scope_t *scope, njs_bool_t any)
 {
     while (scope->type != NJS_SCOPE_GLOBAL) {
         if (scope->type == NJS_SCOPE_FUNCTION
@@ -271,7 +271,7 @@ njs_function_scope(njs_parser_scope_t *scope, nxt_bool_t any)
 }
 
 
-extern const nxt_lvlhsh_proto_t  njs_keyword_hash_proto;
+extern const njs_lvlhsh_proto_t  njs_keyword_hash_proto;
 
 
 #endif /* _NJS_PARSER_H_INCLUDED_ */
similarity index 87%
rename from njs/njs_parser_expression.c
rename to src/njs_parser_expression.c
index d66b2022c867605b8eb2e01a1daa9c23273f1b08..b09d3e6b2810d183393cc409ad2203889a486d69 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 
 
@@ -22,9 +22,9 @@ struct njs_parser_expression_s {
                                        const njs_parser_expression_t *,
                                        njs_token_t);
     const njs_parser_expression_t  *expression;
-    nxt_uint_t                     count;
+    njs_uint_t                     count;
 
-#if (NXT_SUNC)
+#if (NJS_SUNC)
     /*
      * SunC supports C99 flexible array members but does not allow
      * static struct's initialization with arbitrary number of members.
@@ -226,7 +226,7 @@ njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_vmcode_operation_t  operation;
 
     token = njs_parser_conditional_expression(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -234,67 +234,67 @@ njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser,
         switch (token) {
 
         case NJS_TOKEN_ASSIGNMENT:
-            nxt_thread_log_debug("JS: =");
+            njs_thread_log_debug("JS: =");
             operation = NJS_VMCODE_MOVE;
             break;
 
         case NJS_TOKEN_ADDITION_ASSIGNMENT:
-            nxt_thread_log_debug("JS: +=");
+            njs_thread_log_debug("JS: +=");
             operation = NJS_VMCODE_ADDITION;
             break;
 
         case NJS_TOKEN_SUBSTRACTION_ASSIGNMENT:
-            nxt_thread_log_debug("JS: -=");
+            njs_thread_log_debug("JS: -=");
             operation = NJS_VMCODE_SUBSTRACTION;
             break;
 
         case NJS_TOKEN_MULTIPLICATION_ASSIGNMENT:
-            nxt_thread_log_debug("JS: *=");
+            njs_thread_log_debug("JS: *=");
             operation = NJS_VMCODE_MULTIPLICATION;
             break;
 
         case NJS_TOKEN_EXPONENTIATION_ASSIGNMENT:
-            nxt_thread_log_debug("JS: **=");
+            njs_thread_log_debug("JS: **=");
             operation = NJS_VMCODE_EXPONENTIATION;
             break;
 
         case NJS_TOKEN_DIVISION_ASSIGNMENT:
-            nxt_thread_log_debug("JS: /=");
+            njs_thread_log_debug("JS: /=");
             operation = NJS_VMCODE_DIVISION;
             break;
 
         case NJS_TOKEN_REMAINDER_ASSIGNMENT:
-            nxt_thread_log_debug("JS: %=");
+            njs_thread_log_debug("JS: %=");
             operation = NJS_VMCODE_REMAINDER;
             break;
 
         case NJS_TOKEN_LEFT_SHIFT_ASSIGNMENT:
-            nxt_thread_log_debug("JS: <<=");
+            njs_thread_log_debug("JS: <<=");
             operation = NJS_VMCODE_LEFT_SHIFT;
             break;
 
         case NJS_TOKEN_RIGHT_SHIFT_ASSIGNMENT:
-            nxt_thread_log_debug("JS: >>=");
+            njs_thread_log_debug("JS: >>=");
             operation = NJS_VMCODE_RIGHT_SHIFT;
             break;
 
         case NJS_TOKEN_UNSIGNED_RIGHT_SHIFT_ASSIGNMENT:
-            nxt_thread_log_debug("JS: >>=");
+            njs_thread_log_debug("JS: >>=");
             operation = NJS_VMCODE_UNSIGNED_RIGHT_SHIFT;
             break;
 
         case NJS_TOKEN_BITWISE_AND_ASSIGNMENT:
-            nxt_thread_log_debug("JS: &=");
+            njs_thread_log_debug("JS: &=");
             operation = NJS_VMCODE_BITWISE_AND;
             break;
 
         case NJS_TOKEN_BITWISE_XOR_ASSIGNMENT:
-            nxt_thread_log_debug("JS: ^=");
+            njs_thread_log_debug("JS: ^=");
             operation = NJS_VMCODE_BITWISE_XOR;
             break;
 
         case NJS_TOKEN_BITWISE_OR_ASSIGNMENT:
-            nxt_thread_log_debug("JS: |=");
+            njs_thread_log_debug("JS: |=");
             operation = NJS_VMCODE_BITWISE_OR;
             break;
 
@@ -320,7 +320,7 @@ njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser,
         }
 
         node = njs_parser_node_new(vm, parser, token);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -328,12 +328,12 @@ njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser,
         node->left = parser->node;
 
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         token = njs_parser_assignment_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -352,7 +352,7 @@ njs_parser_conditional_expression(njs_vm_t *vm, njs_parser_t *parser,
     token = njs_parser_binary_expression(vm, parser,
                                          &njs_parser_logical_or_expression,
                                          token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -362,30 +362,30 @@ njs_parser_conditional_expression(njs_vm_t *vm, njs_parser_t *parser,
         }
 
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         cond = njs_parser_node_new(vm, parser, NJS_TOKEN_CONDITIONAL);
-        if (nxt_slow_path(cond == NULL)) {
+        if (njs_slow_path(cond == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
         cond->left = parser->node;
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_BRANCHING);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
         cond->right = node;
 
         token = njs_parser_assignment_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
-        if (nxt_slow_path(token != NJS_TOKEN_COLON)) {
+        if (njs_slow_path(token != NJS_TOKEN_COLON)) {
             return NJS_TOKEN_ILLEGAL;
         }
 
@@ -393,12 +393,12 @@ njs_parser_conditional_expression(njs_vm_t *vm, njs_parser_t *parser,
         node->left->dest = cond;
 
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         token = njs_parser_assignment_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -414,12 +414,12 @@ 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_int_t                     n;
     njs_parser_node_t             *node;
     const njs_parser_operation_t  *op;
 
     token = expr->next(vm, parser, expr->expression, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -442,7 +442,7 @@ njs_parser_binary_expression(njs_vm_t *vm, njs_parser_t *parser,
     found:
 
         node = njs_parser_node_new(vm, parser, token);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -451,12 +451,12 @@ njs_parser_binary_expression(njs_vm_t *vm, njs_parser_t *parser,
         node->left->dest = node;
 
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         token = expr->next(vm, parser, expr->expression, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -474,14 +474,14 @@ njs_parser_exponential_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t  *node;
 
     token = njs_parser_unary_expression(vm, parser, NULL, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     if (token == NJS_TOKEN_EXPONENTIATION) {
 
         node = njs_parser_node_new(vm, parser, token);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -490,12 +490,12 @@ njs_parser_exponential_expression(njs_vm_t *vm, njs_parser_t *parser,
         node->left->dest = node;
 
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         token = njs_parser_exponential_expression(vm, parser, NULL, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -554,12 +554,12 @@ njs_parser_unary_expression(njs_vm_t *vm, njs_parser_t *parser,
     }
 
     next = njs_parser_token(vm, parser);
-    if (nxt_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
         return next;
     }
 
     next = njs_parser_unary_expression(vm, parser, NULL, next);
-    if (nxt_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
         return next;
     }
 
@@ -613,7 +613,7 @@ njs_parser_unary_expression(njs_vm_t *vm, njs_parser_t *parser,
     }
 
     node = njs_parser_node_new(vm, parser, token);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -649,12 +649,12 @@ njs_parser_inc_dec_expression(njs_vm_t *vm, njs_parser_t *parser,
     }
 
     next = njs_parser_token(vm, parser);
-    if (nxt_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
         return next;
     }
 
     next = njs_parser_call_expression(vm, parser, next);
-    if (nxt_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
         return next;
     }
 
@@ -665,7 +665,7 @@ njs_parser_inc_dec_expression(njs_vm_t *vm, njs_parser_t *parser,
     }
 
     node = njs_parser_node_new(vm, parser, token);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -681,12 +681,12 @@ static njs_token_t
 njs_parser_post_inc_dec_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token)
 {
-    nxt_int_t               ret;
+    njs_int_t               ret;
     njs_parser_node_t       *node;
     njs_vmcode_operation_t  operation;
 
     token = njs_parser_call_expression(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -710,7 +710,7 @@ njs_parser_post_inc_dec_expression(njs_vm_t *vm, njs_parser_t *parser,
 
     if (parser->lexer->prev_token == NJS_TOKEN_LINE_END) {
         ret = njs_lexer_rollback(vm, parser->lexer);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -724,7 +724,7 @@ njs_parser_post_inc_dec_expression(njs_vm_t *vm, njs_parser_t *parser,
     }
 
     node = njs_parser_node_new(vm, parser, token);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -747,13 +747,13 @@ njs_parser_call_expression(njs_vm_t *vm, njs_parser_t *parser,
         token = njs_parser_terminal(vm, parser, token);
     }
 
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
     for ( ;; ) {
         token = njs_parser_property_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -762,7 +762,7 @@ njs_parser_call_expression(njs_vm_t *vm, njs_parser_t *parser,
         }
 
         token = njs_parser_call(vm, parser, token, 0);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
     }
@@ -787,7 +787,7 @@ njs_parser_call(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
 
     case NJS_TOKEN_PROPERTY:
         func = njs_parser_node_new(vm, parser, NJS_TOKEN_METHOD_CALL);
-        if (nxt_slow_path(func == NULL)) {
+        if (njs_slow_path(func == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -811,7 +811,7 @@ njs_parser_call(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
          * NJS_TOKEN_EVAL.
          */
         func = njs_parser_node_new(vm, parser, NJS_TOKEN_FUNCTION_CALL);
-        if (nxt_slow_path(func == NULL)) {
+        if (njs_slow_path(func == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -826,7 +826,7 @@ njs_parser_call(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
 
     case NJS_TOKEN_OPEN_PARENTHESIS:
         token = njs_parser_arguments(vm, parser, func);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -834,7 +834,7 @@ njs_parser_call(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
 
     case NJS_TOKEN_GRAVE:
         token = njs_parser_template_literal(vm, parser, func);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -855,7 +855,7 @@ njs_parser_new_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token)
 {
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -864,14 +864,14 @@ njs_parser_new_expression(njs_vm_t *vm, njs_parser_t *parser,
 
     } else {
         token = njs_parser_terminal(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         token = njs_parser_property_expression(vm, parser, token);
     }
 
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
@@ -893,7 +893,7 @@ njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser,
         }
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_PROPERTY);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -908,23 +908,23 @@ njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser,
             }
 
             prop_node = njs_parser_node_string(vm, parser);
-            if (nxt_slow_path(prop_node == NULL)) {
+            if (njs_slow_path(prop_node == NULL)) {
                 return NJS_TOKEN_ERROR;
             }
 
             token = njs_parser_token(vm, parser);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
         } else {
             token = njs_parser_token(vm, parser);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
             token = njs_parser_property_brackets(vm, parser, token);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
@@ -942,11 +942,11 @@ njs_parser_property_brackets(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token)
 {
     token = njs_parser_expression(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
-    if (nxt_slow_path(token != NJS_TOKEN_CLOSE_BRACKET)) {
+    if (njs_slow_path(token != NJS_TOKEN_CLOSE_BRACKET)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -966,7 +966,7 @@ njs_parser_arguments(njs_vm_t *vm, njs_parser_t *parser,
 
     do {
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -975,12 +975,12 @@ njs_parser_arguments(njs_vm_t *vm, njs_parser_t *parser,
         }
 
         token = njs_parser_assignment_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         node = njs_parser_argument(vm, parser, parser->node, index);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -991,7 +991,7 @@ njs_parser_arguments(njs_vm_t *vm, njs_parser_t *parser,
 
     } while (token == NJS_TOKEN_COMMA);
 
-    if (nxt_slow_path(token != NJS_TOKEN_CLOSE_PARENTHESIS)) {
+    if (njs_slow_path(token != NJS_TOKEN_CLOSE_PARENTHESIS)) {
         return NJS_TOKEN_ILLEGAL;
     }
 
@@ -1006,7 +1006,7 @@ njs_parser_argument(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t  *node;
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_ARGUMENT);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NULL;
     }
 
similarity index 80%
rename from njs/njs_parser_terminal.c
rename to src/njs_parser_terminal.c
index c064d5a91fb5360882b3459c8405723cdc49c15f..88b11e6010f77d45479cea16f97f3026b8b36634 100644 (file)
@@ -4,29 +4,29 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_regexp.h>
 #include <string.h>
 
 
 static njs_parser_node_t *njs_parser_reference(njs_vm_t *vm,
-    njs_parser_t *parser, njs_token_t token, nxt_str_t *name, uint32_t hash,
+    njs_parser_t *parser, njs_token_t token, njs_str_t *name, uint32_t hash,
     uint32_t token_line);
-static nxt_int_t njs_parser_builtin(njs_vm_t *vm, njs_parser_t *parser,
-    njs_parser_node_t *node, njs_value_type_t type, nxt_str_t *name,
+static njs_int_t njs_parser_builtin(njs_vm_t *vm, njs_parser_t *parser,
+    njs_parser_node_t *node, njs_value_type_t type, njs_str_t *name,
     uint32_t hash);
 static njs_token_t njs_parser_object(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *obj);
-static nxt_int_t njs_parser_object_property(njs_vm_t *vm, njs_parser_t *parser,
+static njs_int_t njs_parser_object_property(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *parent, njs_parser_node_t *property,
     njs_parser_node_t *value);
 static njs_token_t njs_parser_array(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *array);
-static nxt_int_t njs_parser_array_item(njs_vm_t *vm, njs_parser_t *parser,
+static njs_int_t njs_parser_array_item(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *array, njs_parser_node_t *value);
-static nxt_int_t njs_parser_template_expression(njs_vm_t *vm,
+static njs_int_t njs_parser_template_expression(njs_vm_t *vm,
     njs_parser_t *parser);
-static nxt_int_t njs_parser_template_string(njs_vm_t *vm,
+static njs_int_t njs_parser_template_string(njs_vm_t *vm,
     njs_parser_t *parser);
 static njs_ret_t njs_parser_escape_string_calc_length(njs_vm_t *vm,
     njs_parser_t *parser, size_t *out_size, size_t *out_length);
@@ -42,19 +42,19 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
     njs_parser_node_t  *node;
 
     ret = njs_parser_match_arrow_expression(vm, parser, token);
-    if (ret == NXT_OK) {
+    if (ret == NJS_OK) {
         return njs_parser_arrow_expression(vm, parser, token);
     }
 
     if (token == NJS_TOKEN_OPEN_PARENTHESIS) {
 
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         token = njs_parser_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -68,30 +68,30 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
     switch (token) {
 
     case NJS_TOKEN_OPEN_BRACE:
-        nxt_thread_log_debug("JS: OBJECT");
+        njs_thread_log_debug("JS: OBJECT");
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_OBJECT);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
         return njs_parser_object(vm, parser, node);
 
     case NJS_TOKEN_OPEN_BRACKET:
-        nxt_thread_log_debug("JS: ARRAY");
+        njs_thread_log_debug("JS: ARRAY");
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_ARRAY);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
         return njs_parser_array(vm, parser, node);
 
     case NJS_TOKEN_GRAVE:
-        nxt_thread_log_debug("JS: TEMPLATE LITERAL");
+        njs_thread_log_debug("JS: TEMPLATE LITERAL");
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_TEMPLATE_LITERAL);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -99,44 +99,44 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
 
     case NJS_TOKEN_DIVISION:
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_REGEXP);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
         token = njs_regexp_literal(vm, parser, &node->u.value);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
-        nxt_thread_log_debug("REGEX: '%V'", njs_parser_text(parser));
+        njs_thread_log_debug("REGEX: '%V'", njs_parser_text(parser));
 
         break;
 
     case NJS_TOKEN_STRING:
-        nxt_thread_log_debug("JS: '%V'", njs_parser_text(parser));
+        njs_thread_log_debug("JS: '%V'", njs_parser_text(parser));
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_STRING);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
         ret = njs_parser_string_create(vm, &node->u.value);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_TOKEN_ERROR;
         }
 
         break;
 
     case NJS_TOKEN_ESCAPE_STRING:
-        nxt_thread_log_debug("JS: '%V'", njs_parser_text(parser));
+        njs_thread_log_debug("JS: '%V'", njs_parser_text(parser));
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_STRING);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
         ret = njs_parser_escape_string_create(vm, parser, &node->u.value);
-        if (nxt_slow_path(ret != NJS_TOKEN_STRING)) {
+        if (njs_slow_path(ret != NJS_TOKEN_STRING)) {
             return ret;
         }
 
@@ -150,10 +150,10 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
 
     case NJS_TOKEN_NUMBER:
         num = njs_parser_number(parser);
-        nxt_thread_log_debug("JS: %f", num);
+        njs_thread_log_debug("JS: %f", num);
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_NUMBER);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -163,10 +163,10 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
 
     case NJS_TOKEN_BOOLEAN:
         num = njs_parser_number(parser);
-        nxt_thread_log_debug("JS: boolean: %V", njs_parser_text(parser));
+        njs_thread_log_debug("JS: boolean: %V", njs_parser_text(parser));
 
         node = njs_parser_node_new(vm, parser, NJS_TOKEN_BOOLEAN);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -185,7 +185,7 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
                                     njs_parser_key_hash(parser),
                                     njs_parser_token_line(parser));
 
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -200,7 +200,7 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
 
 static njs_parser_node_t *
 njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
-    nxt_str_t *name, uint32_t hash, uint32_t token_line)
+    njs_str_t *name, uint32_t hash, uint32_t token_line)
 {
     njs_ret_t           ret;
     njs_value_t         *ext;
@@ -209,26 +209,26 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
     njs_parser_scope_t  *scope;
 
     node = njs_parser_node_new(vm, parser, token);
-    if (nxt_slow_path(node == NULL)) {
+    if (njs_slow_path(node == NULL)) {
         return NULL;
     }
 
     switch (token) {
 
     case NJS_TOKEN_NULL:
-        nxt_thread_log_debug("JS: null");
+        njs_thread_log_debug("JS: null");
 
         node->u.value = njs_value_null;
         break;
 
     case NJS_TOKEN_UNDEFINED:
-        nxt_thread_log_debug("JS: undefined");
+        njs_thread_log_debug("JS: undefined");
 
         node->u.value = njs_value_undefined;
         break;
 
     case NJS_TOKEN_THIS:
-        nxt_thread_log_debug("JS: this");
+        njs_thread_log_debug("JS: this");
 
         scope = njs_function_scope(parser->scope, 0);
 
@@ -243,12 +243,12 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
 
                 ret = njs_variable_reference(vm, scope, node, name, hash,
                                              NJS_REFERENCE);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return NULL;
                 }
 
                 var = njs_variable_add(vm, scope, name, hash, NJS_VARIABLE_VAR);
-                if (nxt_slow_path(var == NULL)) {
+                if (njs_slow_path(var == NULL)) {
                     return NULL;
                 }
 
@@ -272,7 +272,7 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
     case NJS_TOKEN_MATH:
     case NJS_TOKEN_JSON:
         ret = njs_parser_builtin(vm, parser, node, NJS_OBJECT, name, hash);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NULL;
         }
 
@@ -361,14 +361,14 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
     case NJS_TOKEN_SET_IMMEDIATE:
     case NJS_TOKEN_CLEAR_TIMEOUT:
         ret = njs_parser_builtin(vm, parser, node, NJS_FUNCTION, name, hash);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NULL;
         }
 
         break;
 
     case NJS_TOKEN_ARGUMENTS:
-        nxt_thread_log_debug("JS: arguments");
+        njs_thread_log_debug("JS: arguments");
 
         scope = njs_function_scope(parser->scope, 0);
 
@@ -383,12 +383,12 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
 
         ret = njs_variable_reference(vm, scope, node, name, hash,
                                      NJS_REFERENCE);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NULL;
         }
 
         var = njs_variable_add(vm, scope, name, hash, NJS_VARIABLE_VAR);
-        if (nxt_slow_path(var == NULL)) {
+        if (njs_slow_path(var == NULL)) {
             return NULL;
         }
 
@@ -397,7 +397,7 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
         break;
 
     case NJS_TOKEN_NAME:
-        nxt_thread_log_debug("JS: %V", name);
+        njs_thread_log_debug("JS: %V", name);
 
         node->token_line = token_line;
 
@@ -412,7 +412,7 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
 
         ret = njs_variable_reference(vm, parser->scope, node, name, hash,
                                      NJS_REFERENCE);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NULL;
         }
 
@@ -427,20 +427,20 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_parser_builtin(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node,
-    njs_value_type_t type, nxt_str_t *name, uint32_t hash)
+    njs_value_type_t type, njs_str_t *name, uint32_t hash)
 {
     njs_ret_t           ret;
-    nxt_uint_t          index;
+    njs_uint_t          index;
     njs_variable_t      *var;
     njs_parser_scope_t  *scope;
 
     scope = njs_parser_global_scope(vm);
 
     var = njs_variable_add(vm, scope, name, hash, NJS_VARIABLE_VAR);
-    if (nxt_slow_path(var == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(var == NULL)) {
+        return NJS_ERROR;
     }
 
     /* TODO: once */
@@ -456,15 +456,15 @@ njs_parser_builtin(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node,
         break;
 
     default:
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     ret = njs_variable_reference(vm, scope, node, name, hash, NJS_REFERENCE);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -481,8 +481,8 @@ static njs_token_t
 njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
 {
     uint32_t               hash, token_line;
-    nxt_int_t              ret;
-    nxt_str_t              name;
+    njs_int_t              ret;
+    njs_str_t              name;
     njs_token_t            token, prop_token;
     njs_lexer_t            *lexer;
     njs_parser_node_t      *object, *property, *expression;
@@ -495,7 +495,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
     token_line = 0;
 
     object = njs_parser_node_new(vm, parser, NJS_TOKEN_OBJECT_VALUE);
-    if (nxt_slow_path(object == NULL)) {
+    if (njs_slow_path(object == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -503,11 +503,11 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
 
     for ( ;; ) {
         prop_token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(prop_token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(prop_token <= NJS_TOKEN_ILLEGAL)) {
             return prop_token;
         }
 
-        nxt_memzero(&name, sizeof(nxt_str_t));
+        njs_memzero(&name, sizeof(njs_str_t));
 
         switch (prop_token) {
 
@@ -516,7 +516,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
 
         case NJS_TOKEN_OPEN_BRACKET:
             token = njs_parser_token(vm, parser);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
@@ -525,7 +525,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
             }
 
             token = njs_parser_assignment_expression(vm, parser, token);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
@@ -538,7 +538,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
         case NJS_TOKEN_STRING:
         case NJS_TOKEN_ESCAPE_STRING:
             token = njs_parser_terminal(vm, parser, prop_token);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
@@ -551,7 +551,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
             }
 
             property = njs_parser_node_string(vm, parser);
-            if (nxt_slow_path(property == NULL)) {
+            if (njs_slow_path(property == NULL)) {
                 return NJS_TOKEN_ERROR;
             }
 
@@ -577,7 +577,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
 
             expression = njs_parser_reference(vm, parser, prop_token, &name,
                                               hash, token_line);
-            if (nxt_slow_path(expression == NULL)) {
+            if (njs_slow_path(expression == NULL)) {
                 return NJS_TOKEN_ERROR;
             }
 
@@ -585,12 +585,12 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
 
         case NJS_TOKEN_COLON:
             token = njs_parser_token(vm, parser);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
             token = njs_parser_assignment_expression(vm, parser, token);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
@@ -600,7 +600,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
         case NJS_TOKEN_OPEN_PARENTHESIS:
             expression = njs_parser_node_new(vm, parser,
                                              NJS_TOKEN_FUNCTION_EXPRESSION);
-            if (nxt_slow_path(expression == NULL)) {
+            if (njs_slow_path(expression == NULL)) {
                 return NJS_TOKEN_ERROR;
             }
 
@@ -608,14 +608,14 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
             parser->node = expression;
 
             lambda = njs_function_lambda_alloc(vm, 0);
-            if (nxt_slow_path(lambda == NULL)) {
+            if (njs_slow_path(lambda == NULL)) {
                 return NJS_TOKEN_ERROR;
             }
 
             expression->u.value.data.u.lambda = lambda;
 
             token = njs_parser_function_lambda(vm, parser, lambda, token);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
 
@@ -626,7 +626,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
         }
 
         ret = njs_parser_object_property(vm, parser, obj, property, expression);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -634,7 +634,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
             break;
         }
 
-        if (nxt_slow_path(token != NJS_TOKEN_COMMA)) {
+        if (njs_slow_path(token != NJS_TOKEN_COMMA)) {
             return NJS_TOKEN_ILLEGAL;
         }
     }
@@ -647,7 +647,7 @@ done:
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_parser_object_property(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *parent, njs_parser_node_t *property,
     njs_parser_node_t *value)
@@ -655,23 +655,23 @@ njs_parser_object_property(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t  *stmt, *assign, *object, *propref;
 
     object = njs_parser_node_new(vm, parser, NJS_TOKEN_OBJECT_VALUE);
-    if (nxt_slow_path(object == NULL)) {
+    if (njs_slow_path(object == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     object->u.object = parent;
 
     propref = njs_parser_node_new(vm, parser, NJS_TOKEN_PROPERTY_INIT);
-    if (nxt_slow_path(propref == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(propref == NULL)) {
+        return NJS_ERROR;
     }
 
     propref->left = object;
     propref->right = property;
 
     assign = njs_parser_node_new(vm, parser, NJS_TOKEN_ASSIGNMENT);
-    if (nxt_slow_path(assign == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(assign == NULL)) {
+        return NJS_ERROR;
     }
 
     assign->u.operation = NJS_VMCODE_MOVE;
@@ -679,27 +679,27 @@ njs_parser_object_property(njs_vm_t *vm, njs_parser_t *parser,
     assign->right = value;
 
     stmt = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT);
-    if (nxt_slow_path(stmt == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(stmt == NULL)) {
+        return NJS_ERROR;
     }
 
     stmt->right = assign;
     stmt->left = parent->left;
     parent->left = stmt;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_token_t
 njs_parser_array(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *array)
 {
-    nxt_int_t    ret;
+    njs_int_t    ret;
     njs_token_t  token;
 
     for ( ;; ) {
         token = njs_parser_token(vm, parser);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
@@ -714,12 +714,12 @@ njs_parser_array(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *array)
         }
 
         token = njs_parser_assignment_expression(vm, parser, token);
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
             return token;
         }
 
         ret = njs_parser_array_item(vm, parser, array, parser->node);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -727,7 +727,7 @@ njs_parser_array(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *array)
             break;
         }
 
-        if (nxt_slow_path(token != NJS_TOKEN_COMMA)) {
+        if (njs_slow_path(token != NJS_TOKEN_COMMA)) {
             return NJS_TOKEN_ILLEGAL;
         }
     }
@@ -738,29 +738,29 @@ njs_parser_array(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *array)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_parser_array_item(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *array, njs_parser_node_t *value)
 {
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_parser_node_t  *number;
 
     number = njs_parser_node_new(vm, parser, NJS_TOKEN_NUMBER);
-    if (nxt_slow_path(number == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(number == NULL)) {
+        return NJS_ERROR;
     }
 
     njs_set_number(&number->u.value, array->u.length);
 
     ret = njs_parser_object_property(vm, parser, array, number, value);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     array->ctor = 0;
     array->u.length++;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -769,8 +769,8 @@ njs_parser_template_literal(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *parent)
 {
     uint8_t            tagged_template;
-    nxt_int_t          ret;
-    nxt_bool_t         expression;
+    njs_int_t          ret;
+    njs_bool_t         expression;
     njs_index_t        index;
     njs_parser_node_t  *node, *array;
 
@@ -779,13 +779,13 @@ njs_parser_template_literal(njs_vm_t *vm, njs_parser_t *parser,
     index = NJS_SCOPE_CALLEE_ARGUMENTS;
 
     array = njs_parser_node_new(vm, parser, NJS_TOKEN_ARRAY);
-    if (nxt_slow_path(array == NULL)) {
+    if (njs_slow_path(array == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     if (tagged_template) {
         node = njs_parser_argument(vm, parser, array, index);
-        if (nxt_slow_path(node == NULL)) {
+        if (njs_slow_path(node == NULL)) {
             return NJS_TOKEN_ERROR;
         }
 
@@ -804,7 +804,7 @@ njs_parser_template_literal(njs_vm_t *vm, njs_parser_t *parser,
         ret = expression ? njs_parser_template_expression(vm, parser)
                          : njs_parser_template_string(vm, parser);
 
-        if (ret == NXT_ERROR) {
+        if (ret == NJS_ERROR) {
             njs_parser_syntax_error(vm, parser,
                                     "Unterminated template literal");
             return NJS_TOKEN_ILLEGAL;
@@ -812,9 +812,9 @@ njs_parser_template_literal(njs_vm_t *vm, njs_parser_t *parser,
 
         node = parser->node;
 
-        if (ret == NXT_DONE) {
+        if (ret == NJS_DONE) {
             ret = njs_parser_array_item(vm, parser, array, node);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return NJS_TOKEN_ERROR;
             }
 
@@ -823,11 +823,11 @@ njs_parser_template_literal(njs_vm_t *vm, njs_parser_t *parser,
             return njs_parser_token(vm, parser);
         }
 
-        /* NXT_OK */
+        /* NJS_OK */
 
         if (tagged_template && expression) {
             node = njs_parser_argument(vm, parser, node, index);
-            if (nxt_slow_path(node == NULL)) {
+            if (njs_slow_path(node == NULL)) {
                 return NJS_TOKEN_ERROR;
             }
 
@@ -838,7 +838,7 @@ njs_parser_template_literal(njs_vm_t *vm, njs_parser_t *parser,
 
         } else {
             ret = njs_parser_array_item(vm, parser, array, node);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return NJS_TOKEN_ERROR;
             }
         }
@@ -848,38 +848,38 @@ njs_parser_template_literal(njs_vm_t *vm, njs_parser_t *parser,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_parser_template_expression(njs_vm_t *vm, njs_parser_t *parser)
 {
     njs_token_t  token;
 
     token = njs_parser_token(vm, parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        return NJS_ERROR;
     }
 
     token = njs_parser_expression(vm, parser, token);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+        return NJS_ERROR;
     }
 
     if (token != NJS_TOKEN_CLOSE_BRACE) {
         njs_parser_syntax_error(vm, parser,
                                 "Missing \"}\" in template expression");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_parser_template_string(njs_vm_t *vm, njs_parser_t *parser)
 {
     u_char             *p, c;
-    nxt_int_t          ret;
-    nxt_str_t          *text;
-    nxt_bool_t         escape;
+    njs_int_t          ret;
+    njs_str_t          *text;
+    njs_bool_t         escape;
     njs_lexer_t        *lexer;
     njs_parser_node_t  *node;
 
@@ -920,67 +920,67 @@ njs_parser_template_string(njs_vm_t *vm, njs_parser_t *parser)
         }
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 
 done:
 
     node = njs_parser_node_new(vm, parser, NJS_TOKEN_STRING);
-    if (nxt_slow_path(node == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(node == NULL)) {
+        return NJS_ERROR;
     }
 
     if (escape) {
         ret = njs_parser_escape_string_create(vm, parser, &node->u.value);
-        if (nxt_slow_path(ret != NJS_TOKEN_STRING)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_TOKEN_STRING)) {
+            return NJS_ERROR;
         }
 
     } else {
         ret = njs_parser_string_create(vm, &node->u.value);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
     }
 
     lexer->start = p;
     parser->node = node;
 
-    return c == '`' ? NXT_DONE : NXT_OK;
+    return c == '`' ? NJS_DONE : NJS_OK;
 }
 
 
-nxt_int_t
+njs_int_t
 njs_parser_string_create(njs_vm_t *vm, njs_value_t *value)
 {
     u_char        *dst;
     ssize_t       size, length;
     uint32_t      cp;
-    nxt_str_t     *src;
+    njs_str_t     *src;
     const u_char  *p, *end;
 
     src = njs_parser_text(vm->parser);
 
-    length = nxt_utf8_safe_length(src->start, src->length, &size);
+    length = njs_utf8_safe_length(src->start, src->length, &size);
 
     dst = njs_string_alloc(vm, value, size, length);
-    if (nxt_slow_path(dst == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(dst == NULL)) {
+        return NJS_ERROR;
     }
 
     p = src->start;
     end = src->start + src->length;
 
     while (p < end) {
-        cp = nxt_utf8_safe_decode(&p, end);
+        cp = njs_utf8_safe_decode(&p, end);
 
-        dst = nxt_utf8_encode(dst, cp);
+        dst = njs_utf8_encode(dst, cp);
     }
 
     if (length > NJS_STRING_MAP_STRIDE && size != length) {
         njs_string_offset_map_init(value->long_string.data->start, size);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -992,16 +992,16 @@ njs_parser_escape_string_create(njs_vm_t *vm, njs_parser_t *parser,
     size_t        size, length, hex_length;
     uint64_t      cp, cp_pair;
     njs_ret_t     ret;
-    nxt_str_t     *string;
+    njs_str_t     *string;
     const u_char  *src, *end, *hex_end;
 
     ret = njs_parser_escape_string_calc_length(vm, parser, &size, &length);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_TOKEN_ILLEGAL;
     }
 
     start = njs_string_alloc(vm, value, size, length);
-    if (nxt_slow_path(start == NULL)) {
+    if (njs_slow_path(start == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
@@ -1109,8 +1109,8 @@ njs_parser_escape_string_create(njs_vm_t *vm, njs_parser_t *parser,
 
         src--;
 
-        cp = nxt_utf8_safe_decode2(&src, end);
-        dst = nxt_utf8_encode(dst, cp);
+        cp = njs_utf8_safe_decode2(&src, end);
+        dst = njs_utf8_encode(dst, cp);
 
         continue;
 
@@ -1128,16 +1128,16 @@ njs_parser_escape_string_create(njs_vm_t *vm, njs_parser_t *parser,
         }
 
         if (cp_pair != 0) {
-            if (nxt_fast_path(cp >= 0xdc00 && cp <= 0xdfff)) {
+            if (njs_fast_path(cp >= 0xdc00 && cp <= 0xdfff)) {
                 cp = njs_string_surrogate_pair(cp_pair, cp);
 
-            } else if (nxt_slow_path(cp >= 0xd800 && cp <= 0xdbff)) {
-                cp = NXT_UTF8_REPLACEMENT;
+            } else if (njs_slow_path(cp >= 0xd800 && cp <= 0xdbff)) {
+                cp = NJS_UTF8_REPLACEMENT;
 
-                dst = nxt_utf8_encode(dst, (uint32_t) cp);
+                dst = njs_utf8_encode(dst, (uint32_t) cp);
 
             } else {
-                dst = nxt_utf8_encode(dst, NXT_UTF8_REPLACEMENT);
+                dst = njs_utf8_encode(dst, NJS_UTF8_REPLACEMENT);
             }
 
             cp_pair = 0;
@@ -1148,11 +1148,11 @@ njs_parser_escape_string_create(njs_vm_t *vm, njs_parser_t *parser,
                 continue;
             }
 
-            cp = NXT_UTF8_REPLACEMENT;
+            cp = NJS_UTF8_REPLACEMENT;
         }
 
-        dst = nxt_utf8_encode(dst, (uint32_t) cp);
-        if (nxt_slow_path(dst == NULL)) {
+        dst = njs_utf8_encode(dst, (uint32_t) cp);
+        if (njs_slow_path(dst == NULL)) {
             njs_parser_syntax_error(vm, parser,
                                     "Invalid Unicode code point \"%V\"",
                                     njs_parser_text(parser));
@@ -1175,7 +1175,7 @@ njs_parser_escape_string_calc_length(njs_vm_t *vm, njs_parser_t *parser,
 {
     size_t        size, length, hex_length;
     uint64_t      cp, cp_pair;
-    nxt_str_t     *string;
+    njs_str_t     *string;
     const u_char  *ptr, *src, *end, *hex_end;
 
     size = 0;
@@ -1230,9 +1230,9 @@ njs_parser_escape_string_calc_length(njs_vm_t *vm, njs_parser_t *parser,
         }
 
         if (*src >= 0x80) {
-            cp = nxt_utf8_safe_decode2(&src, end);
+            cp = njs_utf8_safe_decode2(&src, end);
 
-            size += nxt_utf8_size(cp);
+            size += njs_utf8_size(cp);
             length++;
 
             continue;
@@ -1248,7 +1248,7 @@ njs_parser_escape_string_calc_length(njs_vm_t *vm, njs_parser_t *parser,
 
         hex_end = src + hex_length;
 
-        if (nxt_slow_path(hex_end > end)) {
+        if (njs_slow_path(hex_end > end)) {
             goto invalid;
         }
 
@@ -1273,17 +1273,17 @@ njs_parser_escape_string_calc_length(njs_vm_t *vm, njs_parser_t *parser,
         }
 
         if (cp_pair != 0) {
-            if (nxt_fast_path(cp >= 0xdc00 && cp <= 0xdfff)) {
+            if (njs_fast_path(cp >= 0xdc00 && cp <= 0xdfff)) {
                 cp = njs_string_surrogate_pair(cp_pair, cp);
 
-            } else if (nxt_slow_path(cp >= 0xd800 && cp <= 0xdbff)) {
-                cp = NXT_UTF8_REPLACEMENT;
+            } else if (njs_slow_path(cp >= 0xd800 && cp <= 0xdbff)) {
+                cp = NJS_UTF8_REPLACEMENT;
 
-                size += nxt_utf8_size(cp);
+                size += njs_utf8_size(cp);
                 length++;
 
             } else {
-                size += nxt_utf8_size(NXT_UTF8_REPLACEMENT);
+                size += njs_utf8_size(NJS_UTF8_REPLACEMENT);
                 length++;
             }
 
@@ -1295,17 +1295,17 @@ njs_parser_escape_string_calc_length(njs_vm_t *vm, njs_parser_t *parser,
                 continue;
             }
 
-            cp = NXT_UTF8_REPLACEMENT;
+            cp = NJS_UTF8_REPLACEMENT;
         }
 
-        size += nxt_utf8_size(cp);
+        size += njs_utf8_size(cp);
         length++;
     }
 
     *out_size = size;
     *out_length = length;
 
-    return NXT_OK;
+    return NJS_OK;
 
 invalid:
 
similarity index 58%
rename from nxt/nxt_pcre.c
rename to src/njs_pcre.c
index 66fee8b4022c5f9ab3d076e59c8bd6db5ff28059..92ca3a5315f6e39e0f523cfc16d76b5558c5be6d 100644 (file)
@@ -4,40 +4,40 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_stub.h>
-#include <nxt_trace.h>
-#include <nxt_string.h>
-#include <nxt_regex.h>
-#include <nxt_pcre.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_stub.h>
+#include <njs_trace.h>
+#include <njs_str.h>
+#include <njs_regex.h>
+#include <njs_pcre.h>
 #include <string.h>
 
 
-static void *nxt_pcre_malloc(size_t size);
-static void nxt_pcre_free(void *p);
-static void *nxt_pcre_default_malloc(size_t size, void *memory_data);
-static void nxt_pcre_default_free(void *p, void *memory_data);
+static void *njs_pcre_malloc(size_t size);
+static void njs_pcre_free(void *p);
+static void *njs_pcre_default_malloc(size_t size, void *memory_data);
+static void njs_pcre_default_free(void *p, void *memory_data);
 
 
-static nxt_regex_context_t  *regex_context;
+static njs_regex_context_t  *regex_context;
 
 
-nxt_regex_context_t *
-nxt_regex_context_create(nxt_pcre_malloc_t private_malloc,
-    nxt_pcre_free_t private_free, void *memory_data)
+njs_regex_context_t *
+njs_regex_context_create(njs_pcre_malloc_t private_malloc,
+    njs_pcre_free_t private_free, void *memory_data)
 {
-    nxt_regex_context_t  *ctx;
+    njs_regex_context_t  *ctx;
 
     if (private_malloc == NULL) {
-        private_malloc = nxt_pcre_default_malloc;
-        private_free = nxt_pcre_default_free;
+        private_malloc = njs_pcre_default_malloc;
+        private_free = njs_pcre_default_free;
     }
 
-    ctx = private_malloc(sizeof(nxt_regex_context_t), memory_data);
+    ctx = private_malloc(sizeof(njs_regex_context_t), memory_data);
 
-    if (nxt_fast_path(ctx != NULL)) {
+    if (njs_fast_path(ctx != NULL)) {
         ctx->private_malloc = private_malloc;
         ctx->private_free = private_free;
         ctx->memory_data = memory_data;
@@ -47,9 +47,9 @@ nxt_regex_context_create(nxt_pcre_malloc_t private_malloc,
 }
 
 
-nxt_int_t
-nxt_regex_compile(nxt_regex_t *regex, u_char *source, size_t len,
-    nxt_uint_t options, nxt_regex_context_t *ctx)
+njs_int_t
+njs_regex_compile(njs_regex_t *regex, u_char *source, size_t len,
+    njs_uint_t options, njs_regex_context_t *ctx)
 {
     int         ret, err, erroff;
     char        *pattern, *error;
@@ -57,12 +57,12 @@ nxt_regex_compile(nxt_regex_t *regex, u_char *source, size_t len,
     void        (*saved_free)(void *p);
     const char  *errstr;
 
-    ret = NXT_ERROR;
+    ret = NJS_ERROR;
 
     saved_malloc = pcre_malloc;
-    pcre_malloc = nxt_pcre_malloc;
+    pcre_malloc = njs_pcre_malloc;
     saved_free = pcre_free;
-    pcre_free = nxt_pcre_free;
+    pcre_free = njs_pcre_free;
     regex_context = ctx;
 
     if (len == 0) {
@@ -70,7 +70,7 @@ nxt_regex_compile(nxt_regex_t *regex, u_char *source, size_t len,
 
     } else {
         pattern = ctx->private_malloc(len + 1, ctx->memory_data);
-        if (nxt_slow_path(pattern == NULL)) {
+        if (njs_slow_path(pattern == NULL)) {
             goto done;
         }
 
@@ -80,28 +80,28 @@ nxt_regex_compile(nxt_regex_t *regex, u_char *source, size_t len,
 
     regex->code = pcre_compile(pattern, options, &errstr, &erroff, NULL);
 
-    if (nxt_slow_path(regex->code == NULL)) {
+    if (njs_slow_path(regex->code == NULL)) {
         error = pattern + erroff;
 
         if (*error != '\0') {
-            nxt_alert(ctx->trace, NXT_LEVEL_ERROR,
+            njs_alert(ctx->trace, NJS_LEVEL_ERROR,
                       "pcre_compile(\"%s\") failed: %s at \"%s\"",
                       pattern, errstr, error);
 
         } else {
-            nxt_alert(ctx->trace, NXT_LEVEL_ERROR,
+            njs_alert(ctx->trace, NJS_LEVEL_ERROR,
                       "pcre_compile(\"%s\") failed: %s", pattern, errstr);
         }
 
-        ret = NXT_DECLINED;
+        ret = NJS_DECLINED;
 
         goto done;
     }
 
     regex->extra = pcre_study(regex->code, 0, &errstr);
 
-    if (nxt_slow_path(errstr != NULL)) {
-        nxt_alert(ctx->trace, NXT_LEVEL_ERROR,
+    if (njs_slow_path(errstr != NULL)) {
+        njs_alert(ctx->trace, NJS_LEVEL_ERROR,
                   "pcre_study(\"%s\") failed: %s", pattern, errstr);
 
         goto done;
@@ -110,8 +110,8 @@ nxt_regex_compile(nxt_regex_t *regex, u_char *source, size_t len,
     err = pcre_fullinfo(regex->code, NULL, PCRE_INFO_CAPTURECOUNT,
                         &regex->ncaptures);
 
-    if (nxt_slow_path(err < 0)) {
-        nxt_alert(ctx->trace, NXT_LEVEL_ERROR,
+    if (njs_slow_path(err < 0)) {
+        njs_alert(ctx->trace, NJS_LEVEL_ERROR,
                   "pcre_fullinfo(\"%s\", PCRE_INFO_CAPTURECOUNT) failed: %d",
                   pattern, err);
 
@@ -125,8 +125,8 @@ nxt_regex_compile(nxt_regex_t *regex, u_char *source, size_t len,
         err = pcre_fullinfo(regex->code, NULL, PCRE_INFO_NAMECOUNT,
                             &regex->nentries);
 
-        if (nxt_slow_path(err < 0)) {
-            nxt_alert(ctx->trace, NXT_LEVEL_ERROR,
+        if (njs_slow_path(err < 0)) {
+            njs_alert(ctx->trace, NJS_LEVEL_ERROR,
                       "pcre_fullinfo(\"%s\", PCRE_INFO_NAMECOUNT) failed: %d",
                       pattern, err);
 
@@ -137,8 +137,8 @@ nxt_regex_compile(nxt_regex_t *regex, u_char *source, size_t len,
             err = pcre_fullinfo(regex->code, NULL, PCRE_INFO_NAMEENTRYSIZE,
                                 &regex->entry_size);
 
-            if (nxt_slow_path(err < 0)) {
-                nxt_alert(ctx->trace, NXT_LEVEL_ERROR, "pcre_fullinfo(\"%s\", "
+            if (njs_slow_path(err < 0)) {
+                njs_alert(ctx->trace, NJS_LEVEL_ERROR, "pcre_fullinfo(\"%s\", "
                           "PCRE_INFO_NAMEENTRYSIZE) failed: %d", pattern, err);
 
                 goto done;
@@ -147,8 +147,8 @@ nxt_regex_compile(nxt_regex_t *regex, u_char *source, size_t len,
             err = pcre_fullinfo(regex->code, NULL, PCRE_INFO_NAMETABLE,
                                 &regex->entries);
 
-            if (nxt_slow_path(err < 0)) {
-                nxt_alert(ctx->trace, NXT_LEVEL_ERROR, "pcre_fullinfo(\"%s\", "
+            if (njs_slow_path(err < 0)) {
+                njs_alert(ctx->trace, NJS_LEVEL_ERROR, "pcre_fullinfo(\"%s\", "
                           "PCRE_INFO_NAMETABLE) failed: %d", pattern, err);
 
                 goto done;
@@ -156,7 +156,7 @@ nxt_regex_compile(nxt_regex_t *regex, u_char *source, size_t len,
         }
     }
 
-    ret = NXT_OK;
+    ret = NJS_OK;
 
 done:
 
@@ -168,22 +168,22 @@ done:
 }
 
 
-nxt_bool_t
-nxt_regex_is_valid(nxt_regex_t *regex)
+njs_bool_t
+njs_regex_is_valid(njs_regex_t *regex)
 {
     return (regex->code != NULL);
 }
 
 
-nxt_uint_t
-nxt_regex_ncaptures(nxt_regex_t *regex)
+njs_uint_t
+njs_regex_ncaptures(njs_regex_t *regex)
 {
     return regex->ncaptures;
 }
 
 
-nxt_int_t
-nxt_regex_named_captures(nxt_regex_t *regex, nxt_str_t *name, int n)
+njs_int_t
+njs_regex_named_captures(njs_regex_t *regex, njs_str_t *name, int n)
 {
     char  *entry;
 
@@ -192,24 +192,24 @@ nxt_regex_named_captures(nxt_regex_t *regex, nxt_str_t *name, int n)
     }
 
     if (n >= regex->nentries) {
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     entry = regex->entries + regex->entry_size * n;
 
     name->start = (u_char *) entry + 2;
-    name->length = nxt_strlen(name->start);
+    name->length = njs_strlen(name->start);
 
     return (entry[0] << 8) + entry[1];
 }
 
 
-nxt_regex_match_data_t *
-nxt_regex_match_data(nxt_regex_t *regex, nxt_regex_context_t *ctx)
+njs_regex_match_data_t *
+njs_regex_match_data(njs_regex_t *regex, njs_regex_context_t *ctx)
 {
     size_t                  size;
-    nxt_uint_t              ncaptures;
-    nxt_regex_match_data_t  *match_data;
+    njs_uint_t              ncaptures;
+    njs_regex_match_data_t  *match_data;
 
     if (regex != NULL) {
         ncaptures = regex->ncaptures - 1;
@@ -220,11 +220,11 @@ nxt_regex_match_data(nxt_regex_t *regex, nxt_regex_context_t *ctx)
 
     /* Each capture is stored in 3 "int" vector elements. */
     ncaptures *= 3;
-    size = sizeof(nxt_regex_match_data_t) + ncaptures * sizeof(int);
+    size = sizeof(njs_regex_match_data_t) + ncaptures * sizeof(int);
 
     match_data = ctx->private_malloc(size, ctx->memory_data);
 
-    if (nxt_fast_path(match_data != NULL)) {
+    if (njs_fast_path(match_data != NULL)) {
         match_data->ncaptures = ncaptures + 3;
     }
 
@@ -233,44 +233,44 @@ nxt_regex_match_data(nxt_regex_t *regex, nxt_regex_context_t *ctx)
 
 
 void
-nxt_regex_match_data_free(nxt_regex_match_data_t *match_data,
-    nxt_regex_context_t *ctx)
+njs_regex_match_data_free(njs_regex_match_data_t *match_data,
+    njs_regex_context_t *ctx)
 {
     ctx->private_free(match_data, ctx->memory_data);
 }
 
 
 static void *
-nxt_pcre_malloc(size_t size)
+njs_pcre_malloc(size_t size)
 {
     return regex_context->private_malloc(size, regex_context->memory_data);
 }
 
 
 static void
-nxt_pcre_free(void *p)
+njs_pcre_free(void *p)
 {
     regex_context->private_free(p, regex_context->memory_data);
 }
 
 
 static void *
-nxt_pcre_default_malloc(size_t size, void *memory_data)
+njs_pcre_default_malloc(size_t size, void *memory_data)
 {
     return malloc(size);
 }
 
 
 static void
-nxt_pcre_default_free(void *p, void *memory_data)
+njs_pcre_default_free(void *p, void *memory_data)
 {
     free(p);
 }
 
 
-nxt_int_t
-nxt_regex_match(nxt_regex_t *regex, const u_char *subject, size_t len,
-    nxt_regex_match_data_t *match_data, nxt_regex_context_t *ctx)
+njs_int_t
+njs_regex_match(njs_regex_t *regex, const u_char *subject, size_t len,
+    njs_regex_match_data_t *match_data, njs_regex_context_t *ctx)
 {
     int  ret;
 
@@ -279,8 +279,8 @@ nxt_regex_match(nxt_regex_t *regex, const u_char *subject, size_t len,
 
     /* PCRE_ERROR_NOMATCH is -1. */
 
-    if (nxt_slow_path(ret < PCRE_ERROR_NOMATCH)) {
-        nxt_alert(ctx->trace, NXT_LEVEL_ERROR, "pcre_exec() failed: %d", ret);
+    if (njs_slow_path(ret < PCRE_ERROR_NOMATCH)) {
+        njs_alert(ctx->trace, NJS_LEVEL_ERROR, "pcre_exec() failed: %d", ret);
     }
 
     return ret;
@@ -288,7 +288,7 @@ nxt_regex_match(nxt_regex_t *regex, const u_char *subject, size_t len,
 
 
 int *
-nxt_regex_captures(nxt_regex_match_data_t *match_data)
+njs_regex_captures(njs_regex_match_data_t *match_data)
 {
     return match_data->captures;
 }
similarity index 75%
rename from nxt/nxt_pcre.h
rename to src/njs_pcre.h
index c0cfb8d905ee30b15a35adead44a093045891e5e..41b8f075ef0896c65b6bed2bfabbc4e1c1152252 100644 (file)
@@ -4,17 +4,17 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#ifndef _NXT_PCRE_H_INCLUDED_
-#define _NXT_PCRE_H_INCLUDED_
+#ifndef _NJS_PCRE_H_INCLUDED_
+#define _NJS_PCRE_H_INCLUDED_
 
 
 #include <pcre.h>
 
 
-#define NXT_REGEX_NOMATCH  PCRE_ERROR_NOMATCH
+#define NJS_REGEX_NOMATCH  PCRE_ERROR_NOMATCH
 
 
-struct nxt_regex_s {
+struct njs_regex_s {
     pcre        *code;
     pcre_extra  *extra;
     int         ncaptures;
@@ -24,7 +24,7 @@ struct nxt_regex_s {
 };
 
 
-struct nxt_regex_match_data_s {
+struct njs_regex_match_data_s {
     int         ncaptures;
     /*
      * Each capture is stored in 3 "int" vector elements.
@@ -36,4 +36,4 @@ struct nxt_regex_match_data_s {
 };
 
 
-#endif /* _NXT_PCRE_H_INCLUDED_ */
+#endif /* _NJS_PCRE_H_INCLUDED_ */
diff --git a/src/njs_queue.c b/src/njs_queue.c
new file mode 100644 (file)
index 0000000..c2ae412
--- /dev/null
@@ -0,0 +1,87 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_queue.h>
+
+
+/*
+ * Find the middle queue element if the queue has odd number of elements,
+ * or the first element of the queue's second part otherwise.
+ */
+
+njs_queue_link_t *
+njs_queue_middle(njs_queue_t *queue)
+{
+    njs_queue_link_t  *middle, *next;
+
+    middle = njs_queue_first(queue);
+
+    if (middle == njs_queue_last(queue)) {
+        return middle;
+    }
+
+    next = middle;
+
+    for ( ;; ) {
+        middle = njs_queue_next(middle);
+
+        next = njs_queue_next(next);
+
+        if (next == njs_queue_last(queue)) {
+            return middle;
+        }
+
+        next = njs_queue_next(next);
+
+        if (next == njs_queue_last(queue)) {
+            return middle;
+        }
+    }
+}
+
+
+/*
+ * njs_queue_sort() provides a stable sort because it uses the insertion
+ * sort algorithm.  Its worst and average computational complexity is O^2.
+ */
+
+void
+njs_queue_sort(njs_queue_t *queue,
+    njs_int_t (*compare)(const void *data, const njs_queue_link_t *,
+    const njs_queue_link_t *), const void *data)
+{
+    njs_queue_link_t  *link, *prev, *next;
+
+    link = njs_queue_first(queue);
+
+    if (link == njs_queue_last(queue)) {
+        return;
+    }
+
+    for (link = njs_queue_next(link);
+         link != njs_queue_tail(queue);
+         link = next)
+    {
+        prev = njs_queue_prev(link);
+        next = njs_queue_next(link);
+
+        njs_queue_remove(link);
+
+        do {
+            if (compare(data, prev, link) <= 0) {
+                break;
+            }
+
+            prev = njs_queue_prev(prev);
+
+        } while (prev != njs_queue_head(queue));
+
+        njs_queue_insert_after(prev, link);
+    }
+}
similarity index 69%
rename from nxt/nxt_queue.h
rename to src/njs_queue.h
index 3a8a5ba99b929e0d1e67d4237a6b8efb5f3e3ef6..0fab9e1bc96242d5a3c8d8355374339d9d16fa69 100644 (file)
@@ -4,31 +4,31 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#ifndef _NXT_QUEUE_H_INCLUDED_
-#define _NXT_QUEUE_H_INCLUDED_
+#ifndef _NJS_QUEUE_H_INCLUDED_
+#define _NJS_QUEUE_H_INCLUDED_
 
 
-typedef struct nxt_queue_link_s  nxt_queue_link_t;
+typedef struct njs_queue_link_s  njs_queue_link_t;
 
-struct nxt_queue_link_s {
-    nxt_queue_link_t  *prev;
-    nxt_queue_link_t  *next;
+struct njs_queue_link_s {
+    njs_queue_link_t  *prev;
+    njs_queue_link_t  *next;
 };
 
 
 typedef struct {
-    nxt_queue_link_t  head;
-} nxt_queue_t;
+    njs_queue_link_t  head;
+} njs_queue_t;
 
 
-#define nxt_queue_init(queue)                                                 \
+#define njs_queue_init(queue)                                                 \
     do {                                                                      \
         (queue)->head.prev = &(queue)->head;                                  \
         (queue)->head.next = &(queue)->head;                                  \
     } while (0)
 
 
-#define nxt_queue_sentinel(link)                                              \
+#define njs_queue_sentinel(link)                                              \
     do {                                                                      \
         (link)->prev = (link);                                                \
         (link)->next = (link);                                                \
@@ -37,63 +37,63 @@ typedef struct {
 
 /*
  * Short-circuit a queue link to itself to allow once remove safely it
- * using nxt_queue_remove().
+ * using njs_queue_remove().
  */
 
-#define nxt_queue_self(link)                                                  \
-    nxt_queue_sentinel(link)
+#define njs_queue_self(link)                                                  \
+    njs_queue_sentinel(link)
 
 
-#define nxt_queue_is_empty(queue)                                             \
+#define njs_queue_is_empty(queue)                                             \
     (&(queue)->head == (queue)->head.prev)
 
 /*
  * A loop to iterate all queue links starting from head:
  *
- *      nxt_queue_link_t  link;
- *  } nxt_type_t  *tp;
+ *      njs_queue_link_t  link;
+ *  } njs_type_t  *tp;
  *
  *
- *  for (lnk = nxt_queue_first(queue);
- *       lnk != nxt_queue_tail(queue);
- *       lnk = nxt_queue_next(lnk))
+ *  for (lnk = njs_queue_first(queue);
+ *       lnk != njs_queue_tail(queue);
+ *       lnk = njs_queue_next(lnk))
  *  {
- *      tp = nxt_queue_link_data(lnk, nxt_type_t, link);
+ *      tp = njs_queue_link_data(lnk, njs_type_t, link);
  *
  * or starting from tail:
  *
- *  for (lnk = nxt_queue_last(queue);
- *       lnk != nxt_queue_head(queue);
- *       lnk = nxt_queue_next(lnk))
+ *  for (lnk = njs_queue_last(queue);
+ *       lnk != njs_queue_head(queue);
+ *       lnk = njs_queue_next(lnk))
  *  {
- *      tp = nxt_queue_link_data(lnk, nxt_type_t, link);
+ *      tp = njs_queue_link_data(lnk, njs_type_t, link);
  */
 
-#define nxt_queue_first(queue)                                                \
+#define njs_queue_first(queue)                                                \
     (queue)->head.next
 
 
-#define nxt_queue_last(queue)                                                 \
+#define njs_queue_last(queue)                                                 \
     (queue)->head.prev
 
 
-#define nxt_queue_head(queue)                                                 \
+#define njs_queue_head(queue)                                                 \
     (&(queue)->head)
 
 
-#define nxt_queue_tail(queue)                                                 \
+#define njs_queue_tail(queue)                                                 \
     (&(queue)->head)
 
 
-#define nxt_queue_next(link)                                                  \
+#define njs_queue_next(link)                                                  \
     (link)->next
 
 
-#define nxt_queue_prev(link)                                                  \
+#define njs_queue_prev(link)                                                  \
     (link)->prev
 
 
-#define nxt_queue_insert_head(queue, link)                                    \
+#define njs_queue_insert_head(queue, link)                                    \
     do {                                                                      \
         (link)->next = (queue)->head.next;                                    \
         (link)->next->prev = (link);                                          \
@@ -102,7 +102,7 @@ typedef struct {
     } while (0)
 
 
-#define nxt_queue_insert_tail(queue, link)                                    \
+#define njs_queue_insert_tail(queue, link)                                    \
     do {                                                                      \
         (link)->prev = (queue)->head.prev;                                    \
         (link)->prev->next = (link);                                          \
@@ -111,7 +111,7 @@ typedef struct {
     } while (0)
 
 
-#define nxt_queue_insert_after(target, link)                                  \
+#define njs_queue_insert_after(target, link)                                  \
     do {                                                                      \
         (link)->next = (target)->next;                                        \
         (link)->next->prev = (link);                                          \
@@ -120,7 +120,7 @@ typedef struct {
     } while (0)
 
 
-#define nxt_queue_insert_before(target, link)                                 \
+#define njs_queue_insert_before(target, link)                                 \
     do {                                                                      \
         (link)->next = (target);                                              \
         (link)->prev = (target)->prev;                                        \
@@ -129,9 +129,9 @@ typedef struct {
     } while (0)
 
 
-#if (NXT_DEBUG)
+#if (NJS_DEBUG)
 
-#define nxt_queue_remove(link)                                                \
+#define njs_queue_remove(link)                                                \
     do {                                                                      \
         (link)->next->prev = (link)->prev;                                    \
         (link)->prev->next = (link)->next;                                    \
@@ -141,7 +141,7 @@ typedef struct {
 
 #else
 
-#define nxt_queue_remove(link)                                                \
+#define njs_queue_remove(link)                                                \
     do {                                                                      \
         (link)->next->prev = (link)->prev;                                    \
         (link)->prev->next = (link)->next;                                    \
@@ -155,7 +155,7 @@ typedef struct {
  * the "tail" is the new tail queue.
  */
 
-#define nxt_queue_split(queue, link, tail)                                    \
+#define njs_queue_split(queue, link, tail)                                    \
     do {                                                                      \
         (tail)->head.prev = (queue)->head.prev;                               \
         (tail)->head.prev->next = &(tail)->head;                              \
@@ -168,7 +168,7 @@ typedef struct {
 
 /* Truncate the queue "queue" starting at element "link". */
 
-#define nxt_queue_truncate(queue, link)                                       \
+#define njs_queue_truncate(queue, link)                                       \
     do {                                                                      \
         (queue)->head.prev = (link)->prev;                                    \
         (queue)->head.prev->next = &(queue)->head;                            \
@@ -177,7 +177,7 @@ typedef struct {
 
 /* Add the queue "tail" to the queue "queue". */
 
-#define nxt_queue_add(queue, tail)                                            \
+#define njs_queue_add(queue, tail)                                            \
     do {                                                                      \
         (queue)->head.prev->next = (tail)->head.next;                         \
         (tail)->head.next->prev = (queue)->head.prev;                         \
@@ -186,14 +186,14 @@ typedef struct {
     } while (0)
 
 
-#define nxt_queue_link_data(lnk, type, link)                                  \
-    nxt_container_of(lnk, type, link)
+#define njs_queue_link_data(lnk, type, link)                                  \
+    njs_container_of(lnk, type, link)
 
 
-NXT_EXPORT nxt_queue_link_t *nxt_queue_middle(nxt_queue_t *queue);
-NXT_EXPORT void nxt_queue_sort(nxt_queue_t *queue,
-    nxt_int_t (*compare)(const void *, const nxt_queue_link_t *,
-    const nxt_queue_link_t *), const void *data);
+NJS_EXPORT njs_queue_link_t *njs_queue_middle(njs_queue_t *queue);
+NJS_EXPORT void njs_queue_sort(njs_queue_t *queue,
+    njs_int_t (*compare)(const void *, const njs_queue_link_t *,
+    const njs_queue_link_t *), const void *data);
 
 
-#endif /* _NXT_QUEUE_H_INCLUDED_ */
+#endif /* _NJS_QUEUE_H_INCLUDED_ */
similarity index 58%
rename from nxt/nxt_random.c
rename to src/njs_random.c
index 9e4b8654aaed98814b1a1219045a440c56625529..cbfd07b288510a35aeb225d7e37f346430957fc5 100644 (file)
@@ -5,19 +5,19 @@
  */
 
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_random.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_random.h>
 #include <fcntl.h>
 #include <sys/time.h>
 #include <unistd.h>
-#if (NXT_HAVE_GETRANDOM)
+#if (NJS_HAVE_GETRANDOM)
 #include <sys/random.h>
-#elif (NXT_HAVE_LINUX_SYS_GETRANDOM)
+#elif (NJS_HAVE_LINUX_SYS_GETRANDOM)
 #include <sys/syscall.h>
 #include <linux/random.h>
-#elif (NXT_HAVE_GETENTROPY_SYS_RANDOM)
+#elif (NJS_HAVE_GETENTROPY_SYS_RANDOM)
 #include <sys/random.h>
 #endif
 
 /*
  * The pseudorandom generator based on OpenBSD arc4random.  Although
  * it is usually stated that arc4random uses RC4 pseudorandom generation
- * algorithm they are actually different in nxt_random_add().
+ * algorithm they are actually different in njs_random_add().
  */
 
 
-#define NXT_RANDOM_KEY_SIZE  128
+#define NJS_RANDOM_KEY_SIZE  128
 
 
-nxt_inline uint8_t nxt_random_byte(nxt_random_t *r);
+njs_inline uint8_t njs_random_byte(njs_random_t *r);
 
 
 void
-nxt_random_init(nxt_random_t *r, nxt_pid_t pid)
+njs_random_init(njs_random_t *r, njs_pid_t pid)
 {
-    nxt_uint_t  i;
+    njs_uint_t  i;
 
     r->count = 0;
     r->pid = pid;
@@ -52,38 +52,38 @@ nxt_random_init(nxt_random_t *r, nxt_pid_t pid)
 
 
 void
-nxt_random_stir(nxt_random_t *r, nxt_pid_t pid)
+njs_random_stir(njs_random_t *r, njs_pid_t pid)
 {
     int             fd;
     ssize_t         n;
     struct timeval  tv;
     union {
         uint32_t    value[3];
-        u_char      bytes[NXT_RANDOM_KEY_SIZE];
+        u_char      bytes[NJS_RANDOM_KEY_SIZE];
     } key;
 
     if (r->pid == 0) {
-        nxt_random_init(r, pid);
+        njs_random_init(r, pid);
     }
 
     r->pid = pid;
 
-#if (NXT_HAVE_GETRANDOM)
+#if (NJS_HAVE_GETRANDOM)
 
-    n = getrandom(&key, NXT_RANDOM_KEY_SIZE, 0);
+    n = getrandom(&key, NJS_RANDOM_KEY_SIZE, 0);
 
-#elif (NXT_HAVE_LINUX_SYS_GETRANDOM)
+#elif (NJS_HAVE_LINUX_SYS_GETRANDOM)
 
     /* Linux 3.17 SYS_getrandom, not available in Glibc prior to 2.25. */
 
-    n = syscall(SYS_getrandom, &key, NXT_RANDOM_KEY_SIZE, 0);
+    n = syscall(SYS_getrandom, &key, NJS_RANDOM_KEY_SIZE, 0);
 
-#elif (NXT_HAVE_GETENTROPY || NXT_HAVE_GETENTROPY_SYS_RANDOM)
+#elif (NJS_HAVE_GETENTROPY || NJS_HAVE_GETENTROPY_SYS_RANDOM)
 
     n = 0;
 
-    if (getentropy(&key, NXT_RANDOM_KEY_SIZE) == 0) {
-        n = NXT_RANDOM_KEY_SIZE;
+    if (getentropy(&key, NJS_RANDOM_KEY_SIZE) == 0) {
+        n = NJS_RANDOM_KEY_SIZE;
     }
 
 #else
@@ -92,16 +92,16 @@ nxt_random_stir(nxt_random_t *r, nxt_pid_t pid)
 
 #endif
 
-    if (n != NXT_RANDOM_KEY_SIZE) {
+    if (n != NJS_RANDOM_KEY_SIZE) {
         fd = open("/dev/urandom", O_RDONLY);
 
         if (fd >= 0) {
-            n = read(fd, &key, NXT_RANDOM_KEY_SIZE);
+            n = read(fd, &key, NJS_RANDOM_KEY_SIZE);
             (void) close(fd);
         }
     }
 
-    if (n != NXT_RANDOM_KEY_SIZE) {
+    if (n != NJS_RANDOM_KEY_SIZE) {
         (void) gettimeofday(&tv, NULL);
 
         /* XOR with stack garbage. */
@@ -111,11 +111,11 @@ nxt_random_stir(nxt_random_t *r, nxt_pid_t pid)
         key.value[2] ^= getpid();
     }
 
-    nxt_random_add(r, key.bytes, NXT_RANDOM_KEY_SIZE);
+    njs_random_add(r, key.bytes, NJS_RANDOM_KEY_SIZE);
 
     /* Drop the first 3072 bytes. */
     for (n = 3072; n != 0; n--) {
-        (void) nxt_random_byte(r);
+        (void) njs_random_byte(r);
     }
 
     /* Stir again after 1,600,000 bytes. */
@@ -124,7 +124,7 @@ nxt_random_stir(nxt_random_t *r, nxt_pid_t pid)
 
 
 void
-nxt_random_add(nxt_random_t *r, const u_char *key, uint32_t len)
+njs_random_add(njs_random_t *r, const u_char *key, uint32_t len)
 {
     uint8_t   val;
     uint32_t  n;
@@ -147,11 +147,11 @@ nxt_random_add(nxt_random_t *r, const u_char *key, uint32_t len)
 
 
 uint32_t
-nxt_random(nxt_random_t *r)
+njs_random(njs_random_t *r)
 {
     uint32_t    val;
-    nxt_pid_t   pid;
-    nxt_bool_t  new_pid;
+    njs_pid_t   pid;
+    njs_bool_t  new_pid;
 
     new_pid = 0;
     pid = r->pid;
@@ -167,20 +167,20 @@ nxt_random(nxt_random_t *r)
     r->count--;
 
     if (r->count <= 0 || new_pid) {
-        nxt_random_stir(r, pid);
+        njs_random_stir(r, pid);
     }
 
-    val  = nxt_random_byte(r) << 24;
-    val |= nxt_random_byte(r) << 16;
-    val |= nxt_random_byte(r) << 8;
-    val |= nxt_random_byte(r);
+    val  = njs_random_byte(r) << 24;
+    val |= njs_random_byte(r) << 16;
+    val |= njs_random_byte(r) << 8;
+    val |= njs_random_byte(r);
 
     return val;
 }
 
 
-nxt_inline uint8_t
-nxt_random_byte(nxt_random_t *r)
+njs_inline uint8_t
+njs_random_byte(njs_random_t *r)
 {
     uint8_t  si, sj;
 
diff --git a/src/njs_random.h b/src/njs_random.h
new file mode 100644 (file)
index 0000000..8e8931b
--- /dev/null
@@ -0,0 +1,37 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_RANDOM_H_INCLUDED_
+#define _NJS_RANDOM_H_INCLUDED_
+
+
+typedef struct {
+    int32_t    count;
+    njs_pid_t  pid;
+    uint8_t    i;
+    uint8_t    j;
+    uint8_t    s[256];
+} njs_random_t;
+
+
+/*
+ * The njs_random_t structure must be either initialized with zeros
+ * or initialized by njs_random_init() function.  The later is intended
+ * mainly for unit test.  njs_random() automatically stirs itself if
+ * process pid changed after fork().  This pid testing can be disabled by
+ * passing -1 as the pid argument to njs_random_init() or njs_random_stir()
+ * functions.  The testing can be later enabled by passing any positive
+ * number, for example, a real pid number.
+ */
+
+NJS_EXPORT void njs_random_init(njs_random_t *r, njs_pid_t pid);
+NJS_EXPORT void njs_random_stir(njs_random_t *r, njs_pid_t pid);
+NJS_EXPORT void njs_random_add(njs_random_t *r, const u_char *key,
+    uint32_t len);
+NJS_EXPORT uint32_t njs_random(njs_random_t *r);
+
+
+#endif /* _NJS_RANDOM_H_INCLUDED_ */
similarity index 54%
rename from nxt/nxt_rbtree.c
rename to src/njs_rbtree.c
index 90d3a55a8ea2a2c4f229071f81ef6ca2182407e4..c856121e1969d7f4bfd2555c63a38bf608ba663d 100644 (file)
@@ -4,10 +4,10 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_rbtree.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_rbtree.h>
 
 
 /*
  */
 
 
-static void nxt_rbtree_insert_fixup(nxt_rbtree_node_t *node);
-static void nxt_rbtree_delete_fixup(nxt_rbtree_t *tree,
-    nxt_rbtree_node_t *node);
-nxt_inline void nxt_rbtree_left_rotate(nxt_rbtree_node_t *node);
-nxt_inline void nxt_rbtree_right_rotate(nxt_rbtree_node_t *node);
-nxt_inline void nxt_rbtree_parent_relink(nxt_rbtree_node_t *subst,
-    nxt_rbtree_node_t *node);
+static void njs_rbtree_insert_fixup(njs_rbtree_node_t *node);
+static void njs_rbtree_delete_fixup(njs_rbtree_t *tree,
+    njs_rbtree_node_t *node);
+njs_inline void njs_rbtree_left_rotate(njs_rbtree_node_t *node);
+njs_inline void njs_rbtree_right_rotate(njs_rbtree_node_t *node);
+njs_inline void njs_rbtree_parent_relink(njs_rbtree_node_t *subst,
+    njs_rbtree_node_t *node);
 
 
-#define NXT_RBTREE_BLACK  0
-#define NXT_RBTREE_RED    1
+#define NJS_RBTREE_BLACK  0
+#define NJS_RBTREE_RED    1
 
 
-#define nxt_rbtree_comparison_callback(tree)                                  \
-    ((nxt_rbtree_compare_t) (tree)->sentinel.right)
+#define njs_rbtree_comparison_callback(tree)                                  \
+    ((njs_rbtree_compare_t) (tree)->sentinel.right)
 
 
 void
-nxt_rbtree_init(nxt_rbtree_t *tree, nxt_rbtree_compare_t compare)
+njs_rbtree_init(njs_rbtree_t *tree, njs_rbtree_compare_t compare)
 {
     /*
      * The sentinel is used as a leaf node sentinel and as a tree root
      * sentinel: it is a parent of a root node and the root node is
      * the left child of the sentinel.  Combining two sentinels in one
      * entry and the fact that the sentinel's left child is a root node
-     * simplifies nxt_rbtree_node_successor() and eliminates explicit
-     * root node test before or inside nxt_rbtree_min().
+     * simplifies njs_rbtree_node_successor() and eliminates explicit
+     * root node test before or inside njs_rbtree_min().
      */
 
     /* The root is empty. */
@@ -55,33 +55,33 @@ nxt_rbtree_init(nxt_rbtree_t *tree, nxt_rbtree_compare_t compare)
     tree->sentinel.right = (void *) compare;
 
     /* The root and leaf sentinel must be black. */
-    tree->sentinel.color = NXT_RBTREE_BLACK;
+    tree->sentinel.color = NJS_RBTREE_BLACK;
 }
 
 
 void
-nxt_rbtree_insert(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
+njs_rbtree_insert(njs_rbtree_t *tree, njs_rbtree_part_t *part)
 {
-    nxt_rbtree_node_t     *node, *new_node, *sentinel, **child;
-    nxt_rbtree_compare_t  compare;
+    njs_rbtree_node_t     *node, *new_node, *sentinel, **child;
+    njs_rbtree_compare_t  compare;
 
-    new_node = (nxt_rbtree_node_t *) part;
+    new_node = (njs_rbtree_node_t *) part;
 
-    node = nxt_rbtree_root(tree);
-    sentinel = nxt_rbtree_sentinel(tree);
+    node = njs_rbtree_root(tree);
+    sentinel = njs_rbtree_sentinel(tree);
 
     new_node->left = sentinel;
     new_node->right = sentinel;
-    new_node->color = NXT_RBTREE_RED;
+    new_node->color = NJS_RBTREE_RED;
 
-    compare = (nxt_rbtree_compare_t) tree->sentinel.right;
-    child = &nxt_rbtree_root(tree);
+    compare = (njs_rbtree_compare_t) tree->sentinel.right;
+    child = &njs_rbtree_root(tree);
 
     while (*child != sentinel) {
         node = *child;
 
-        nxt_prefetch(node->left);
-        nxt_prefetch(node->right);
+        njs_prefetch(node->left);
+        njs_prefetch(node->right);
 
         child = (compare(new_node, node) < 0) ? &node->left : &node->right;
     }
@@ -89,17 +89,17 @@ nxt_rbtree_insert(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
     *child = new_node;
     new_node->parent = node;
 
-    nxt_rbtree_insert_fixup(new_node);
+    njs_rbtree_insert_fixup(new_node);
 
-    node = nxt_rbtree_root(tree);
-    node->color = NXT_RBTREE_BLACK;
+    node = njs_rbtree_root(tree);
+    node->color = NJS_RBTREE_BLACK;
 }
 
 
 static void
-nxt_rbtree_insert_fixup(nxt_rbtree_node_t *node)
+njs_rbtree_insert_fixup(njs_rbtree_node_t *node)
 {
-    nxt_rbtree_node_t  *parent, *grandparent, *uncle;
+    njs_rbtree_node_t  *parent, *grandparent, *uncle;
 
     /*
      * Prefetching parent nodes does not help here because they are
@@ -113,7 +113,7 @@ nxt_rbtree_insert_fixup(nxt_rbtree_node_t *node)
          * Testing whether a node is a tree root is not required here since
          * a root node's parent is the sentinel and it is always black.
          */
-        if (parent->color == NXT_RBTREE_BLACK) {
+        if (parent->color == NJS_RBTREE_BLACK) {
             return;
         }
 
@@ -122,25 +122,25 @@ nxt_rbtree_insert_fixup(nxt_rbtree_node_t *node)
         if (parent == grandparent->left) {
             uncle = grandparent->right;
 
-            if (uncle->color == NXT_RBTREE_BLACK) {
+            if (uncle->color == NJS_RBTREE_BLACK) {
 
                 if (node == parent->right) {
                     node = parent;
-                    nxt_rbtree_left_rotate(node);
+                    njs_rbtree_left_rotate(node);
                 }
 
                 /*
-                 * nxt_rbtree_left_rotate() swaps parent and
+                 * njs_rbtree_left_rotate() swaps parent and
                  * child whilst keeps grandparent the same.
                  */
                 parent = node->parent;
 
-                parent->color = NXT_RBTREE_BLACK;
-                grandparent->color = NXT_RBTREE_RED;
+                parent->color = NJS_RBTREE_BLACK;
+                grandparent->color = NJS_RBTREE_RED;
 
-                nxt_rbtree_right_rotate(grandparent);
+                njs_rbtree_right_rotate(grandparent);
                 /*
-                 * nxt_rbtree_right_rotate() does not change node->parent
+                 * njs_rbtree_right_rotate() does not change node->parent
                  * color which is now black, so testing color is not required
                  * to return from function.
                  */
@@ -150,51 +150,51 @@ nxt_rbtree_insert_fixup(nxt_rbtree_node_t *node)
         } else {
             uncle = grandparent->left;
 
-            if (uncle->color == NXT_RBTREE_BLACK) {
+            if (uncle->color == NJS_RBTREE_BLACK) {
 
                 if (node == parent->left) {
                     node = parent;
-                    nxt_rbtree_right_rotate(node);
+                    njs_rbtree_right_rotate(node);
                 }
 
                 /* See the comment in the symmetric branch above. */
                 parent = node->parent;
 
-                parent->color = NXT_RBTREE_BLACK;
-                grandparent->color = NXT_RBTREE_RED;
+                parent->color = NJS_RBTREE_BLACK;
+                grandparent->color = NJS_RBTREE_RED;
 
-                nxt_rbtree_left_rotate(grandparent);
+                njs_rbtree_left_rotate(grandparent);
 
                 /* See the comment in the symmetric branch above. */
                 return;
             }
         }
 
-        uncle->color = NXT_RBTREE_BLACK;
-        parent->color = NXT_RBTREE_BLACK;
-        grandparent->color = NXT_RBTREE_RED;
+        uncle->color = NJS_RBTREE_BLACK;
+        parent->color = NJS_RBTREE_BLACK;
+        grandparent->color = NJS_RBTREE_RED;
 
         node = grandparent;
     }
 }
 
 
-nxt_rbtree_node_t *
-nxt_rbtree_find(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
+njs_rbtree_node_t *
+njs_rbtree_find(njs_rbtree_t *tree, njs_rbtree_part_t *part)
 {
     intptr_t              n;
-    nxt_rbtree_node_t     *node, *next, *sentinel;
-    nxt_rbtree_compare_t  compare;
+    njs_rbtree_node_t     *node, *next, *sentinel;
+    njs_rbtree_compare_t  compare;
 
-    node = (nxt_rbtree_node_t *) part;
+    node = (njs_rbtree_node_t *) part;
 
-    next = nxt_rbtree_root(tree);
-    sentinel = nxt_rbtree_sentinel(tree);
-    compare = nxt_rbtree_comparison_callback(tree);
+    next = njs_rbtree_root(tree);
+    sentinel = njs_rbtree_sentinel(tree);
+    compare = njs_rbtree_comparison_callback(tree);
 
     while (next != sentinel) {
-        nxt_prefetch(next->left);
-        nxt_prefetch(next->right);
+        njs_prefetch(next->left);
+        njs_prefetch(next->right);
 
         n = compare(node, next);
 
@@ -213,23 +213,23 @@ nxt_rbtree_find(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
 }
 
 
-nxt_rbtree_node_t *
-nxt_rbtree_find_less_or_equal(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
+njs_rbtree_node_t *
+njs_rbtree_find_less_or_equal(njs_rbtree_t *tree, njs_rbtree_part_t *part)
 {
     intptr_t              n;
-    nxt_rbtree_node_t     *node, *retval, *next, *sentinel;
-    nxt_rbtree_compare_t  compare;
+    njs_rbtree_node_t     *node, *retval, *next, *sentinel;
+    njs_rbtree_compare_t  compare;
 
-    node = (nxt_rbtree_node_t *) part;
+    node = (njs_rbtree_node_t *) part;
 
     retval = NULL;
-    next = nxt_rbtree_root(tree);
-    sentinel = nxt_rbtree_sentinel(tree);
-    compare = nxt_rbtree_comparison_callback(tree);
+    next = njs_rbtree_root(tree);
+    sentinel = njs_rbtree_sentinel(tree);
+    compare = njs_rbtree_comparison_callback(tree);
 
     while (next != sentinel) {
-        nxt_prefetch(next->left);
-        nxt_prefetch(next->right);
+        njs_prefetch(next->left);
+        njs_prefetch(next->right);
 
         n = compare(node, next);
 
@@ -250,23 +250,23 @@ nxt_rbtree_find_less_or_equal(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
 }
 
 
-nxt_rbtree_node_t *
-nxt_rbtree_find_greater_or_equal(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
+njs_rbtree_node_t *
+njs_rbtree_find_greater_or_equal(njs_rbtree_t *tree, njs_rbtree_part_t *part)
 {
     intptr_t              n;
-    nxt_rbtree_node_t     *node, *retval, *next, *sentinel;
-    nxt_rbtree_compare_t  compare;
+    njs_rbtree_node_t     *node, *retval, *next, *sentinel;
+    njs_rbtree_compare_t  compare;
 
-    node = (nxt_rbtree_node_t *) part;
+    node = (njs_rbtree_node_t *) part;
 
     retval = NULL;
-    next = nxt_rbtree_root(tree);
-    sentinel = nxt_rbtree_sentinel(tree);
-    compare = nxt_rbtree_comparison_callback(tree);
+    next = njs_rbtree_root(tree);
+    sentinel = njs_rbtree_sentinel(tree);
+    compare = njs_rbtree_comparison_callback(tree);
 
     while (next != sentinel) {
-        nxt_prefetch(next->left);
-        nxt_prefetch(next->right);
+        njs_prefetch(next->left);
+        njs_prefetch(next->right);
 
         n = compare(node, next);
 
@@ -288,15 +288,15 @@ nxt_rbtree_find_greater_or_equal(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
 
 
 void
-nxt_rbtree_delete(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
+njs_rbtree_delete(njs_rbtree_t *tree, njs_rbtree_part_t *part)
 {
     uint8_t            color;
-    nxt_rbtree_node_t  *node, *sentinel, *subst, *child;
+    njs_rbtree_node_t  *node, *sentinel, *subst, *child;
 
-    node = (nxt_rbtree_node_t *) part;
+    node = (njs_rbtree_node_t *) part;
 
     subst = node;
-    sentinel = nxt_rbtree_sentinel(tree);
+    sentinel = njs_rbtree_sentinel(tree);
 
     if (node->left == sentinel) {
         child = node->right;
@@ -305,11 +305,11 @@ nxt_rbtree_delete(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
         child = node->left;
 
     } else {
-        subst = nxt_rbtree_branch_min(tree, node->right);
+        subst = njs_rbtree_branch_min(tree, node->right);
         child = subst->right;
     }
 
-    nxt_rbtree_parent_relink(child, subst);
+    njs_rbtree_parent_relink(child, subst);
 
     color = subst->color;
 
@@ -324,27 +324,27 @@ nxt_rbtree_delete(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
         subst->right = node->right;
         subst->right->parent = subst;
 
-        nxt_rbtree_parent_relink(subst, node);
+        njs_rbtree_parent_relink(subst, node);
     }
 
-#if (NXT_DEBUG)
+#if (NJS_DEBUG)
     node->left = NULL;
     node->right = NULL;
     node->parent = NULL;
 #endif
 
-    if (color == NXT_RBTREE_BLACK) {
-        nxt_rbtree_delete_fixup(tree, child);
+    if (color == NJS_RBTREE_BLACK) {
+        njs_rbtree_delete_fixup(tree, child);
     }
 }
 
 
 static void
-nxt_rbtree_delete_fixup(nxt_rbtree_t *tree, nxt_rbtree_node_t *node)
+njs_rbtree_delete_fixup(njs_rbtree_t *tree, njs_rbtree_node_t *node)
 {
-    nxt_rbtree_node_t  *parent, *sibling;
+    njs_rbtree_node_t  *parent, *sibling;
 
-    while (node != nxt_rbtree_root(tree) && node->color == NXT_RBTREE_BLACK) {
+    while (node != njs_rbtree_root(tree) && node->color == NJS_RBTREE_BLACK) {
         /*
          * Prefetching parent nodes does not help here according
          * to microbenchmarks.
@@ -354,28 +354,28 @@ nxt_rbtree_delete_fixup(nxt_rbtree_t *tree, nxt_rbtree_node_t *node)
         if (node == parent->left) {
             sibling = parent->right;
 
-            if (sibling->color != NXT_RBTREE_BLACK) {
+            if (sibling->color != NJS_RBTREE_BLACK) {
 
-                sibling->color = NXT_RBTREE_BLACK;
-                parent->color = NXT_RBTREE_RED;
+                sibling->color = NJS_RBTREE_BLACK;
+                parent->color = NJS_RBTREE_RED;
 
-                nxt_rbtree_left_rotate(parent);
+                njs_rbtree_left_rotate(parent);
 
                 sibling = parent->right;
             }
 
-            if (sibling->right->color == NXT_RBTREE_BLACK) {
+            if (sibling->right->color == NJS_RBTREE_BLACK) {
 
-                sibling->color = NXT_RBTREE_RED;
+                sibling->color = NJS_RBTREE_RED;
 
-                if (sibling->left->color == NXT_RBTREE_BLACK) {
+                if (sibling->left->color == NJS_RBTREE_BLACK) {
                     node = parent;
                     continue;
                 }
 
-                sibling->left->color = NXT_RBTREE_BLACK;
+                sibling->left->color = NJS_RBTREE_BLACK;
 
-                nxt_rbtree_right_rotate(sibling);
+                njs_rbtree_right_rotate(sibling);
                 /*
                  * If the node is the leaf sentinel then the right
                  * rotate above changes its parent so a sibling below
@@ -388,7 +388,7 @@ nxt_rbtree_delete_fixup(nxt_rbtree_t *tree, nxt_rbtree_node_t *node)
                  * algorithm node->parent must not be changed by both
                  * the left and right rotates above, it can be cached
                  * in a local variable.  This not only eliminates the
-                 * sentinel test in nxt_rbtree_parent_relink() but also
+                 * sentinel test in njs_rbtree_parent_relink() but also
                  * decreases the code size because C forces to reload
                  * non-restrict pointers.
                  */
@@ -396,84 +396,84 @@ nxt_rbtree_delete_fixup(nxt_rbtree_t *tree, nxt_rbtree_node_t *node)
             }
 
             sibling->color = parent->color;
-            parent->color = NXT_RBTREE_BLACK;
-            sibling->right->color = NXT_RBTREE_BLACK;
+            parent->color = NJS_RBTREE_BLACK;
+            sibling->right->color = NJS_RBTREE_BLACK;
 
-            nxt_rbtree_left_rotate(parent);
+            njs_rbtree_left_rotate(parent);
 
             return;
 
         } else {
             sibling = parent->left;
 
-            if (sibling->color != NXT_RBTREE_BLACK) {
+            if (sibling->color != NJS_RBTREE_BLACK) {
 
-                sibling->color = NXT_RBTREE_BLACK;
-                parent->color = NXT_RBTREE_RED;
+                sibling->color = NJS_RBTREE_BLACK;
+                parent->color = NJS_RBTREE_RED;
 
-                nxt_rbtree_right_rotate(parent);
+                njs_rbtree_right_rotate(parent);
 
                 sibling = parent->left;
             }
 
-            if (sibling->left->color == NXT_RBTREE_BLACK) {
+            if (sibling->left->color == NJS_RBTREE_BLACK) {
 
-                sibling->color = NXT_RBTREE_RED;
+                sibling->color = NJS_RBTREE_RED;
 
-                if (sibling->right->color == NXT_RBTREE_BLACK) {
+                if (sibling->right->color == NJS_RBTREE_BLACK) {
                     node = parent;
                     continue;
                 }
 
-                sibling->right->color = NXT_RBTREE_BLACK;
+                sibling->right->color = NJS_RBTREE_BLACK;
 
-                nxt_rbtree_left_rotate(sibling);
+                njs_rbtree_left_rotate(sibling);
 
                 /* See the comment in the symmetric branch above. */
                 sibling = parent->left;
             }
 
             sibling->color = parent->color;
-            parent->color = NXT_RBTREE_BLACK;
-            sibling->left->color = NXT_RBTREE_BLACK;
+            parent->color = NJS_RBTREE_BLACK;
+            sibling->left->color = NJS_RBTREE_BLACK;
 
-            nxt_rbtree_right_rotate(parent);
+            njs_rbtree_right_rotate(parent);
 
             return;
         }
     }
 
-    node->color = NXT_RBTREE_BLACK;
+    node->color = NJS_RBTREE_BLACK;
 }
 
 
-nxt_inline void
-nxt_rbtree_left_rotate(nxt_rbtree_node_t *node)
+njs_inline void
+njs_rbtree_left_rotate(njs_rbtree_node_t *node)
 {
-    nxt_rbtree_node_t  *child;
+    njs_rbtree_node_t  *child;
 
     child = node->right;
     node->right = child->left;
     child->left->parent = node;
     child->left = node;
 
-    nxt_rbtree_parent_relink(child, node);
+    njs_rbtree_parent_relink(child, node);
 
     node->parent = child;
 }
 
 
-nxt_inline void
-nxt_rbtree_right_rotate(nxt_rbtree_node_t *node)
+njs_inline void
+njs_rbtree_right_rotate(njs_rbtree_node_t *node)
 {
-    nxt_rbtree_node_t  *child;
+    njs_rbtree_node_t  *child;
 
     child = node->left;
     node->left = child->right;
     child->right->parent = node;
     child->right = node;
 
-    nxt_rbtree_parent_relink(child, node);
+    njs_rbtree_parent_relink(child, node);
 
     node->parent = child;
 }
@@ -481,15 +481,15 @@ nxt_rbtree_right_rotate(nxt_rbtree_node_t *node)
 
 /* Relink a parent from the node to the subst node. */
 
-nxt_inline void
-nxt_rbtree_parent_relink(nxt_rbtree_node_t *subst, nxt_rbtree_node_t *node)
+njs_inline void
+njs_rbtree_parent_relink(njs_rbtree_node_t *subst, njs_rbtree_node_t *node)
 {
-    nxt_rbtree_node_t  *parent, **link;
+    njs_rbtree_node_t  *parent, **link;
 
     parent = node->parent;
     /*
      * The leaf sentinel's parent can be safely changed here.
-     * See the comment in nxt_rbtree_delete_fixup() for details.
+     * See the comment in njs_rbtree_delete_fixup() for details.
      */
     subst->parent = parent;
     /*
@@ -501,12 +501,12 @@ nxt_rbtree_parent_relink(nxt_rbtree_node_t *subst, nxt_rbtree_node_t *node)
 }
 
 
-nxt_rbtree_node_t *
-nxt_rbtree_destroy_next(nxt_rbtree_t *tree, nxt_rbtree_node_t **next)
+njs_rbtree_node_t *
+njs_rbtree_destroy_next(njs_rbtree_t *tree, njs_rbtree_node_t **next)
 {
-    nxt_rbtree_node_t  *node, *subst, *parent, *sentinel;
+    njs_rbtree_node_t  *node, *subst, *parent, *sentinel;
 
-    sentinel = nxt_rbtree_sentinel(tree);
+    sentinel = njs_rbtree_sentinel(tree);
 
     /* Find the leftmost node. */
     for (node = *next; node->left != sentinel; node = node->left);
diff --git a/src/njs_rbtree.h b/src/njs_rbtree.h
new file mode 100644 (file)
index 0000000..244343d
--- /dev/null
@@ -0,0 +1,126 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_RBTREE_H_INCLUDED_
+#define _NJS_RBTREE_H_INCLUDED_
+
+
+typedef struct njs_rbtree_node_s  njs_rbtree_node_t;
+
+struct njs_rbtree_node_s {
+    njs_rbtree_node_t         *left;
+    njs_rbtree_node_t         *right;
+    njs_rbtree_node_t         *parent;
+
+    uint8_t                   color;
+};
+
+
+typedef struct {
+    njs_rbtree_node_t         *left;
+    njs_rbtree_node_t         *right;
+    njs_rbtree_node_t         *parent;
+} njs_rbtree_part_t;
+
+
+#define NJS_RBTREE_NODE(node)                                                 \
+    njs_rbtree_part_t         node;                                           \
+    uint8_t                   node##_color
+
+
+#define NJS_RBTREE_NODE_INIT  { NULL, NULL, NULL }, 0
+
+
+typedef struct {
+    njs_rbtree_node_t         sentinel;
+} njs_rbtree_t;
+
+
+typedef intptr_t (*njs_rbtree_compare_t)(njs_rbtree_node_t *node1,
+    njs_rbtree_node_t *node2);
+
+
+#define njs_rbtree_root(tree)                                                 \
+    ((tree)->sentinel.left)
+
+
+#define njs_rbtree_sentinel(tree)                                             \
+    (&(tree)->sentinel)
+
+
+#define njs_rbtree_is_empty(tree)                                             \
+    (njs_rbtree_root(tree) == njs_rbtree_sentinel(tree))
+
+
+#define njs_rbtree_min(tree)                                                  \
+    njs_rbtree_branch_min(tree, &(tree)->sentinel)
+
+
+njs_inline njs_rbtree_node_t *
+njs_rbtree_branch_min(njs_rbtree_t *tree, njs_rbtree_node_t *node)
+{
+    while (node->left != njs_rbtree_sentinel(tree)) {
+        node = node->left;
+    }
+
+    return node;
+}
+
+
+#define njs_rbtree_is_there_successor(tree, node)                             \
+    ((node) != njs_rbtree_sentinel(tree))
+
+
+njs_inline njs_rbtree_node_t *
+njs_rbtree_node_successor(njs_rbtree_t *tree, njs_rbtree_node_t *node)
+{
+    njs_rbtree_node_t  *parent;
+
+    if (node->right != njs_rbtree_sentinel(tree)) {
+        return njs_rbtree_branch_min(tree, node->right);
+    }
+
+    for ( ;; ) {
+        parent = node->parent;
+
+        /*
+         * Explicit test for a root node is not required here, because
+         * the root node is always the left child of the sentinel.
+         */
+        if (node == parent->left) {
+            return parent;
+        }
+
+        node = parent;
+    }
+}
+
+
+NJS_EXPORT void njs_rbtree_init(njs_rbtree_t *tree,
+    njs_rbtree_compare_t compare);
+NJS_EXPORT void njs_rbtree_insert(njs_rbtree_t *tree, njs_rbtree_part_t *node);
+NJS_EXPORT njs_rbtree_node_t *njs_rbtree_find(njs_rbtree_t *tree,
+    njs_rbtree_part_t *node);
+NJS_EXPORT njs_rbtree_node_t *njs_rbtree_find_less_or_equal(njs_rbtree_t *tree,
+    njs_rbtree_part_t *node);
+NJS_EXPORT njs_rbtree_node_t
+    *njs_rbtree_find_greater_or_equal(njs_rbtree_t *tree,
+    njs_rbtree_part_t *node);
+NJS_EXPORT void njs_rbtree_delete(njs_rbtree_t *tree, njs_rbtree_part_t *node);
+
+/*
+ * njs_rbtree_destroy_next() is iterator to use only while rbtree destruction.
+ * It deletes a node from rbtree and returns the node.  The rbtree is not
+ * rebalanced after deletion.  At the beginning the "next" parameter should
+ * be equal to rbtree root.  The iterator should be called in loop until
+ * the "next" parameter will be equal to the rbtree sentinel.  No other
+ * operations must be performed on the rbtree while destruction.
+ */
+NJS_EXPORT njs_rbtree_node_t *njs_rbtree_destroy_next(njs_rbtree_t *tree,
+    njs_rbtree_node_t **next);
+
+
+#endif /* _NJS_RBTREE_H_INCLUDED_ */
diff --git a/src/njs_regex.h b/src/njs_regex.h
new file mode 100644 (file)
index 0000000..fab19cd
--- /dev/null
@@ -0,0 +1,45 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_REGEX_H_INCLUDED_
+#define _NJS_REGEX_H_INCLUDED_
+
+
+typedef void *(*njs_pcre_malloc_t)(size_t size, void *memory_data);
+typedef void (*njs_pcre_free_t)(void *p, void *memory_data);
+
+
+typedef struct njs_regex_s             njs_regex_t;
+typedef struct njs_regex_match_data_s  njs_regex_match_data_t;
+
+
+typedef struct {
+    njs_pcre_malloc_t  private_malloc;
+    njs_pcre_free_t    private_free;
+    void               *memory_data;
+    njs_trace_t        *trace;
+} njs_regex_context_t;
+
+
+NJS_EXPORT njs_regex_context_t *
+    njs_regex_context_create(njs_pcre_malloc_t private_malloc,
+    njs_pcre_free_t private_free, void *memory_data);
+NJS_EXPORT njs_int_t njs_regex_compile(njs_regex_t *regex, u_char *source,
+    size_t len, njs_uint_t options, njs_regex_context_t *ctx);
+NJS_EXPORT njs_bool_t njs_regex_is_valid(njs_regex_t *regex);
+NJS_EXPORT njs_uint_t njs_regex_ncaptures(njs_regex_t *regex);
+NJS_EXPORT njs_int_t njs_regex_named_captures(njs_regex_t *regex,
+    njs_str_t *name, int n);
+NJS_EXPORT njs_regex_match_data_t *njs_regex_match_data(njs_regex_t *regex,
+    njs_regex_context_t *ctx);
+NJS_EXPORT void njs_regex_match_data_free(njs_regex_match_data_t *match_data,
+    njs_regex_context_t *ctx);
+NJS_EXPORT njs_int_t njs_regex_match(njs_regex_t *regex, const u_char *subject,
+    size_t len, njs_regex_match_data_t *match_data, njs_regex_context_t *ctx);
+NJS_EXPORT int *njs_regex_captures(njs_regex_match_data_t *match_data);
+
+
+#endif /* _NJS_REGEX_H_INCLUDED_ */
similarity index 80%
rename from njs/njs_regexp.c
rename to src/njs_regexp.c
index 7fdd5b9b442326ad459bec7b7704ed480e3d5867..f6e35f6324a3e8a3d11776f63788f2875aaf6fea 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_regexp.h>
 #include <njs_regexp_pattern.h>
 
@@ -12,7 +12,7 @@
 
 
 struct njs_regexp_group_s {
-    nxt_str_t  name;
+    njs_str_t  name;
     uint32_t   hash;
     uint32_t   capture;
 };
@@ -21,17 +21,17 @@ struct njs_regexp_group_s {
 static void *njs_regexp_malloc(size_t size, void *memory_data);
 static void njs_regexp_free(void *p, void *memory_data);
 static njs_regexp_flags_t njs_regexp_flags(u_char **start, u_char *end,
-    nxt_bool_t bound);
+    njs_bool_t bound);
 static njs_ret_t njs_regexp_prototype_source(njs_vm_t *vm, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval);
-static int njs_regexp_pattern_compile(njs_vm_t *vm, nxt_regex_t *regex,
+static int njs_regexp_pattern_compile(njs_vm_t *vm, njs_regex_t *regex,
     u_char *source, int options);
-static u_char *njs_regexp_compile_trace_handler(nxt_trace_t *trace,
-    nxt_trace_data_t *td, u_char *start);
-static u_char *njs_regexp_match_trace_handler(nxt_trace_t *trace,
-    nxt_trace_data_t *td, u_char *start);
+static u_char *njs_regexp_compile_trace_handler(njs_trace_t *trace,
+    njs_trace_data_t *td, u_char *start);
+static u_char *njs_regexp_match_trace_handler(njs_trace_t *trace,
+    njs_trace_data_t *td, u_char *start);
 static njs_ret_t njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp,
-    njs_utf8_t utf8, u_char *string, nxt_regex_match_data_t *match_data);
+    njs_utf8_t utf8, u_char *string, njs_regex_match_data_t *match_data);
 static njs_ret_t njs_regexp_string_create(njs_vm_t *vm, njs_value_t *value,
     u_char *start, uint32_t size, int32_t length);
 
@@ -39,36 +39,36 @@ static njs_ret_t njs_regexp_string_create(njs_vm_t *vm, njs_value_t *value,
 njs_ret_t
 njs_regexp_init(njs_vm_t *vm)
 {
-    vm->regex_context = nxt_regex_context_create(njs_regexp_malloc,
+    vm->regex_context = njs_regex_context_create(njs_regexp_malloc,
                                           njs_regexp_free, vm->mem_pool);
-    if (nxt_slow_path(vm->regex_context == NULL)) {
+    if (njs_slow_path(vm->regex_context == NULL)) {
         njs_memory_error(vm);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
-    vm->single_match_data = nxt_regex_match_data(NULL, vm->regex_context);
-    if (nxt_slow_path(vm->single_match_data == NULL)) {
+    vm->single_match_data = njs_regex_match_data(NULL, vm->regex_context);
+    if (njs_slow_path(vm->single_match_data == NULL)) {
         njs_memory_error(vm);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     vm->regex_context->trace = &vm->trace;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static void *
 njs_regexp_malloc(size_t size, void *memory_data)
 {
-    return nxt_mp_alloc(memory_data, size);
+    return njs_mp_alloc(memory_data, size);
 }
 
 
 static void
 njs_regexp_free(void *p, void *memory_data)
 {
-    nxt_mp_free(memory_data, p);
+    njs_mp_free(memory_data, p);
 }
 
 
@@ -99,12 +99,12 @@ njs_regexp_value_flags(njs_vm_t *vm, const njs_value_t *regexp)
 
 
 njs_ret_t
-njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char              *start;
     njs_ret_t           ret;
-    nxt_str_t           string;
+    njs_str_t           string;
     njs_value_t         source, flags_string;
     const njs_value_t   *pattern, *flags;
     njs_regexp_flags_t  re_flags;
@@ -113,7 +113,7 @@ njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (!njs_is_regexp(pattern) && !njs_is_primitive(pattern)) {
         ret = njs_value_to_string(vm, &args[1], &args[1]);
-        if (ret != NXT_OK) {
+        if (ret != NJS_OK) {
             return ret;
         }
     }
@@ -122,7 +122,7 @@ njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (!njs_is_primitive(flags)) {
         ret = njs_value_to_string(vm, &args[2], &args[2]);
-        if (ret != NXT_OK) {
+        if (ret != NJS_OK) {
             return ret;
         }
     }
@@ -132,7 +132,7 @@ njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (njs_is_regexp(pattern)) {
         ret = njs_regexp_prototype_source(vm, (njs_value_t *) pattern, NULL,
                                           &source);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -146,7 +146,7 @@ njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         }
 
         ret = njs_primitive_value_to_string(vm, &source, pattern);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -155,7 +155,7 @@ njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (!njs_is_undefined(flags)) {
         ret = njs_primitive_value_to_string(vm, &flags_string, flags);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -164,9 +164,9 @@ njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         start = string.start;
 
         re_flags = njs_regexp_flags(&start, start + string.length, 1);
-        if (nxt_slow_path(re_flags < 0)) {
+        if (njs_slow_path(re_flags < 0)) {
             njs_syntax_error(vm, "Invalid RegExp flags \"%V\"", &string);
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
@@ -177,7 +177,7 @@ njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 }
 
 
-nxt_int_t
+njs_int_t
 njs_regexp_create(njs_vm_t *vm, njs_value_t *value, u_char *start,
     size_t length, njs_regexp_flags_t flags)
 {
@@ -186,8 +186,8 @@ njs_regexp_create(njs_vm_t *vm, njs_value_t *value, u_char *start,
 
     if (length != 0) {
         pattern = njs_regexp_pattern_create(vm, start, length, flags);
-        if (nxt_slow_path(pattern == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(pattern == NULL)) {
+            return NJS_ERROR;
         }
 
     } else {
@@ -196,13 +196,13 @@ njs_regexp_create(njs_vm_t *vm, njs_value_t *value, u_char *start,
 
     regexp = njs_regexp_alloc(vm, pattern);
 
-    if (nxt_fast_path(regexp != NULL)) {
+    if (njs_fast_path(regexp != NULL)) {
         njs_set_regexp(value, regexp);
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -216,12 +216,12 @@ njs_regexp_create(njs_vm_t *vm, njs_value_t *value, u_char *start,
  * Escaping it here as a workaround.
  */
 
-nxt_inline njs_ret_t
-njs_regexp_escape(njs_vm_t *vm, nxt_str_t *text)
+njs_inline njs_ret_t
+njs_regexp_escape(njs_vm_t *vm, njs_str_t *text)
 {
     size_t      brackets, zeros;
     u_char      *p, *dst, *start, *end;
-    nxt_bool_t  in;
+    njs_bool_t  in;
 
     start = text->start;
     end = text->start + text->length;
@@ -261,15 +261,15 @@ njs_regexp_escape(njs_vm_t *vm, nxt_str_t *text)
     }
 
     if (!brackets && !zeros) {
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    text->length = text->length + brackets + zeros * nxt_length("\\u0000");
+    text->length = text->length + brackets + zeros * njs_length("\\u0000");
 
-    text->start = nxt_mp_alloc(vm->mem_pool, text->length);
-    if (nxt_slow_path(text->start == NULL)) {
+    text->start = njs_mp_alloc(vm->mem_pool, text->length);
+    if (njs_slow_path(text->start == NULL)) {
         njs_memory_error(vm);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     in = 0;
@@ -304,7 +304,7 @@ njs_regexp_escape(njs_vm_t *vm, nxt_str_t *text)
             /* Fall through. */
 
         case '\0':
-            dst = nxt_cpymem(dst, "\\u0000", 6);
+            dst = njs_cpymem(dst, "\\u0000", 6);
             continue;
         }
 
@@ -315,7 +315,7 @@ done:
 
     text->length = dst - text->start;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -323,7 +323,7 @@ njs_token_t
 njs_regexp_literal(njs_vm_t *vm, njs_parser_t *parser, njs_value_t *value)
 {
     u_char                *p;
-    nxt_str_t             text;
+    njs_str_t             text;
     njs_lexer_t           *lexer;
     njs_regexp_flags_t    flags;
     njs_regexp_pattern_t  *pattern;
@@ -370,7 +370,7 @@ njs_regexp_literal(njs_vm_t *vm, njs_parser_t *parser, njs_value_t *value)
 
             flags = njs_regexp_flags(&p, lexer->end, 0);
 
-            if (nxt_slow_path(flags < 0)) {
+            if (njs_slow_path(flags < 0)) {
                 njs_parser_syntax_error(vm, parser,
                                         "Invalid RegExp flags \"%*s\"",
                                         p - lexer->start, lexer->start);
@@ -383,7 +383,7 @@ njs_regexp_literal(njs_vm_t *vm, njs_parser_t *parser, njs_value_t *value)
             pattern = njs_regexp_pattern_create(vm, text.start, text.length,
                                                 flags);
 
-            if (nxt_slow_path(pattern == NULL)) {
+            if (njs_slow_path(pattern == NULL)) {
                 return NJS_TOKEN_ILLEGAL;
             }
 
@@ -403,7 +403,7 @@ failed:
 
 
 static njs_regexp_flags_t
-njs_regexp_flags(u_char **start, u_char *end, nxt_bool_t bound)
+njs_regexp_flags(u_char **start, u_char *end, njs_bool_t bound)
 {
     u_char              *p;
     njs_regexp_flags_t  flags, flag;
@@ -446,7 +446,7 @@ njs_regexp_flags(u_char **start, u_char *end, nxt_bool_t bound)
             goto invalid;
         }
 
-        if (nxt_slow_path((flags & flag) != 0)) {
+        if (njs_slow_path((flags & flag) != 0)) {
             goto invalid;
         }
 
@@ -474,9 +474,9 @@ njs_regexp_pattern_create(njs_vm_t *vm, u_char *start, size_t length,
     int                   options, ret;
     u_char                *p, *end;
     size_t                size;
-    nxt_str_t             text;
-    nxt_uint_t            n;
-    nxt_regex_t           *regex;
+    njs_str_t             text;
+    njs_uint_t            n;
+    njs_regex_t           *regex;
     njs_regexp_group_t    *group;
     njs_regexp_pattern_t  *pattern;
 
@@ -489,13 +489,13 @@ njs_regexp_pattern_create(njs_vm_t *vm, u_char *start, size_t length,
     text.length = length;
 
     ret = njs_regexp_escape(vm, &text);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
 
-    pattern = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_regexp_pattern_t) + 1
+    pattern = njs_mp_zalloc(vm->mem_pool, sizeof(njs_regexp_pattern_t) + 1
                                           + text.length + size + 1);
-    if (nxt_slow_path(pattern == NULL)) {
+    if (njs_slow_path(pattern == NULL)) {
         njs_memory_error(vm);
         return NULL;
     }
@@ -540,18 +540,18 @@ njs_regexp_pattern_create(njs_vm_t *vm, u_char *start, size_t length,
     ret = njs_regexp_pattern_compile(vm, &pattern->regex[0],
                                      &pattern->source[1], options);
 
-    if (nxt_fast_path(ret >= 0)) {
+    if (njs_fast_path(ret >= 0)) {
         pattern->ncaptures = ret;
 
-    } else if (ret < 0 && ret != NXT_DECLINED) {
+    } else if (ret < 0 && ret != NJS_DECLINED) {
         goto fail;
     }
 
     ret = njs_regexp_pattern_compile(vm, &pattern->regex[1],
                                      &pattern->source[1], options | PCRE_UTF8);
-    if (nxt_fast_path(ret >= 0)) {
+    if (njs_fast_path(ret >= 0)) {
 
-        if (nxt_slow_path(nxt_regex_is_valid(&pattern->regex[0])
+        if (njs_slow_path(njs_regex_is_valid(&pattern->regex[0])
                           && (u_int) ret != pattern->ncaptures))
         {
             njs_internal_error(vm, "regexp pattern compile failed");
@@ -560,14 +560,14 @@ njs_regexp_pattern_create(njs_vm_t *vm, u_char *start, size_t length,
 
         pattern->ncaptures = ret;
 
-    } else if (ret != NXT_DECLINED) {
+    } else if (ret != NJS_DECLINED) {
         goto fail;
     }
 
-    if (nxt_regex_is_valid(&pattern->regex[0])) {
+    if (njs_regex_is_valid(&pattern->regex[0])) {
         regex = &pattern->regex[0];
 
-    } else if (nxt_regex_is_valid(&pattern->regex[1])) {
+    } else if (njs_regex_is_valid(&pattern->regex[1])) {
         regex = &pattern->regex[1];
 
     } else {
@@ -576,13 +576,13 @@ njs_regexp_pattern_create(njs_vm_t *vm, u_char *start, size_t length,
 
     *end = '/';
 
-    pattern->ngroups = nxt_regex_named_captures(regex, NULL, 0);
+    pattern->ngroups = njs_regex_named_captures(regex, NULL, 0);
 
     if (pattern->ngroups != 0) {
         size = sizeof(njs_regexp_group_t) * pattern->ngroups;
 
-        pattern->groups = nxt_mp_alloc(vm->mem_pool, size);
-        if (nxt_slow_path(pattern->groups == NULL)) {
+        pattern->groups = njs_mp_alloc(vm->mem_pool, size);
+        if (njs_slow_path(pattern->groups == NULL)) {
             njs_memory_error(vm);
             return NULL;
         }
@@ -592,8 +592,8 @@ njs_regexp_pattern_create(njs_vm_t *vm, u_char *start, size_t length,
         do {
             group = &pattern->groups[n];
 
-            group->capture = nxt_regex_named_captures(regex, &group->name, n);
-            group->hash = nxt_djb_hash(group->name.start, group->name.length);
+            group->capture = njs_regex_named_captures(regex, &group->name, n);
+            group->hash = njs_djb_hash(group->name.start, group->name.length);
 
             n++;
 
@@ -606,27 +606,27 @@ njs_regexp_pattern_create(njs_vm_t *vm, u_char *start, size_t length,
 
 fail:
 
-    nxt_mp_free(vm->mem_pool, pattern);
+    njs_mp_free(vm->mem_pool, pattern);
     return NULL;
 }
 
 
 static int
-njs_regexp_pattern_compile(njs_vm_t *vm, nxt_regex_t *regex, u_char *source,
+njs_regexp_pattern_compile(njs_vm_t *vm, njs_regex_t *regex, u_char *source,
     int options)
 {
-    nxt_int_t            ret;
-    nxt_trace_handler_t  handler;
+    njs_int_t            ret;
+    njs_trace_handler_t  handler;
 
     handler = vm->trace.handler;
     vm->trace.handler = njs_regexp_compile_trace_handler;
 
     /* Zero length means a zero-terminated string. */
-    ret = nxt_regex_compile(regex, source, 0, options, vm->regex_context);
+    ret = njs_regex_compile(regex, source, 0, options, vm->regex_context);
 
     vm->trace.handler = handler;
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return regex->ncaptures;
     }
 
@@ -635,7 +635,7 @@ njs_regexp_pattern_compile(njs_vm_t *vm, nxt_regex_t *regex, u_char *source,
 
 
 static u_char *
-njs_regexp_compile_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
+njs_regexp_compile_trace_handler(njs_trace_t *trace, njs_trace_data_t *td,
     u_char *start)
 {
     u_char    *p;
@@ -658,17 +658,17 @@ njs_regexp_compile_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
 }
 
 
-nxt_int_t
-njs_regexp_match(njs_vm_t *vm, nxt_regex_t *regex, const u_char *subject,
-    size_t len, nxt_regex_match_data_t *match_data)
+njs_int_t
+njs_regexp_match(njs_vm_t *vm, njs_regex_t *regex, const u_char *subject,
+    size_t len, njs_regex_match_data_t *match_data)
 {
-    nxt_int_t            ret;
-    nxt_trace_handler_t  handler;
+    njs_int_t            ret;
+    njs_trace_handler_t  handler;
 
     handler = vm->trace.handler;
     vm->trace.handler = njs_regexp_match_trace_handler;
 
-    ret = nxt_regex_match(regex, subject, len, match_data, vm->regex_context);
+    ret = njs_regex_match(regex, subject, len, match_data, vm->regex_context);
 
     vm->trace.handler = handler;
 
@@ -677,7 +677,7 @@ njs_regexp_match(njs_vm_t *vm, nxt_regex_t *regex, const u_char *subject,
 
 
 static u_char *
-njs_regexp_match_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
+njs_regexp_match_trace_handler(njs_trace_t *trace, njs_trace_data_t *td,
     u_char *start)
 {
     u_char    *p;
@@ -699,11 +699,11 @@ njs_regexp_alloc(njs_vm_t *vm, njs_regexp_pattern_t *pattern)
 {
     njs_regexp_t  *regexp;
 
-    regexp = nxt_mp_alloc(vm->mem_pool, sizeof(njs_regexp_t));
+    regexp = njs_mp_alloc(vm->mem_pool, sizeof(njs_regexp_t));
 
-    if (nxt_fast_path(regexp != NULL)) {
-        nxt_lvlhsh_init(&regexp->object.hash);
-        nxt_lvlhsh_init(&regexp->object.shared_hash);
+    if (njs_fast_path(regexp != NULL)) {
+        njs_lvlhsh_init(&regexp->object.hash);
+        njs_lvlhsh_init(&regexp->object.shared_hash);
         regexp->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_REGEXP].object;
         regexp->object.type = NJS_REGEXP;
         regexp->object.shared = 0;
@@ -736,7 +736,7 @@ njs_regexp_prototype_last_index(njs_vm_t *vm, njs_value_t *value,
     index = njs_string_index(&string, regexp->last_index);
     njs_set_number(retval, index);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -750,7 +750,7 @@ njs_regexp_prototype_global(njs_vm_t *vm, njs_value_t *value,
     *retval = pattern->global ? njs_value_true : njs_value_false;
     njs_release(vm, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -764,7 +764,7 @@ njs_regexp_prototype_ignore_case(njs_vm_t *vm, njs_value_t *value,
     *retval = pattern->ignore_case ? njs_value_true : njs_value_false;
     njs_release(vm, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -778,7 +778,7 @@ njs_regexp_prototype_multiline(njs_vm_t *vm, njs_value_t *value,
     *retval = pattern->multiline ? njs_value_true : njs_value_false;
     njs_release(vm, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -795,8 +795,8 @@ njs_regexp_prototype_source(njs_vm_t *vm, njs_value_t *value,
     /* Skip starting "/". */
     source = pattern->source + 1;
 
-    size = nxt_strlen(source) - pattern->flags;
-    length = nxt_utf8_length(source, size);
+    size = njs_strlen(source) - pattern->flags;
+    length = njs_utf8_length(source, size);
 
     return njs_regexp_string_create(vm, retval, source, size, length);
 }
@@ -804,7 +804,7 @@ njs_regexp_prototype_source(njs_vm_t *vm, njs_value_t *value,
 
 static njs_ret_t
 njs_regexp_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     if (njs_is_regexp(njs_arg(args, nargs, 0))) {
         return njs_regexp_to_string(vm, &vm->retval, &args[0]);
@@ -812,7 +812,7 @@ njs_regexp_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
 
     njs_type_error(vm, "\"this\" argument is not a regexp");
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -828,26 +828,26 @@ njs_regexp_to_string(njs_vm_t *vm, njs_value_t *retval,
     pattern = njs_regexp_pattern(value);
     source = pattern->source;
 
-    size = nxt_strlen(source);
-    length = nxt_utf8_length(source, size);
+    size = njs_strlen(source);
+    length = njs_utf8_length(source, size);
 
     return njs_regexp_string_create(vm, retval, source, size, length);
 }
 
 
 static njs_ret_t
-njs_regexp_prototype_test(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_regexp_prototype_test(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_ret_t             ret;
-    nxt_uint_t            n;
+    njs_uint_t            n;
     const njs_value_t     *value, *retval;
     njs_string_prop_t     string;
     njs_regexp_pattern_t  *pattern;
 
     if (!njs_is_regexp(njs_arg(args, nargs, 0))) {
         njs_type_error(vm, "\"this\" argument is not a regexp");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     retval = &njs_value_false;
@@ -863,25 +863,25 @@ njs_regexp_prototype_test(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     pattern = njs_regexp_pattern(&args[0]);
 
-    if (nxt_regex_is_valid(&pattern->regex[n])) {
+    if (njs_regex_is_valid(&pattern->regex[n])) {
         ret = njs_regexp_match(vm, &pattern->regex[n], string.start,
                                string.size, vm->single_match_data);
         if (ret >= 0) {
             retval = &njs_value_true;
 
-        } else if (ret != NXT_REGEX_NOMATCH) {
-            return NXT_ERROR;
+        } else if (ret != NJS_REGEX_NOMATCH) {
+            return NJS_ERROR;
         }
     }
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t
-njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_ret_t               ret;
@@ -891,11 +891,11 @@ njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_regexp_utf8_t       type;
     const njs_value_t       *value;
     njs_regexp_pattern_t    *pattern;
-    nxt_regex_match_data_t  *match_data;
+    njs_regex_match_data_t  *match_data;
 
     if (!njs_is_regexp(njs_arg(args, nargs, 0))) {
         njs_type_error(vm, "\"this\" argument is not a regexp");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     value = njs_arg(args, nargs, 1);
@@ -923,15 +923,15 @@ njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         pattern = regexp->pattern;
 
-        if (nxt_regex_is_valid(&pattern->regex[type])) {
+        if (njs_regex_is_valid(&pattern->regex[type])) {
             string.start += regexp->last_index;
             string.size -= regexp->last_index;
 
-            match_data = nxt_regex_match_data(&pattern->regex[type],
+            match_data = njs_regex_match_data(&pattern->regex[type],
                                               vm->regex_context);
-            if (nxt_slow_path(match_data == NULL)) {
+            if (njs_slow_path(match_data == NULL)) {
                 njs_memory_error(vm);
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
             ret = njs_regexp_match(vm, &pattern->regex[type], string.start,
@@ -941,10 +941,10 @@ njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
                                               match_data);
             }
 
-            if (nxt_slow_path(ret != NXT_REGEX_NOMATCH)) {
-                nxt_regex_match_data_free(match_data, vm->regex_context);
+            if (njs_slow_path(ret != NJS_REGEX_NOMATCH)) {
+                njs_regex_match_data_free(match_data, vm->regex_context);
 
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
         }
     }
@@ -952,36 +952,36 @@ njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     regexp->last_index = 0;
     vm->retval = njs_value_null;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8,
-    u_char *string, nxt_regex_match_data_t *match_data)
+    u_char *string, njs_regex_match_data_t *match_data)
 {
     int                 *captures;
     u_char              *start;
     int32_t             size, length;
     njs_ret_t           ret;
-    nxt_uint_t          i, n;
+    njs_uint_t          i, n;
     njs_array_t         *array;
     njs_value_t         name;
     njs_object_t        *groups;
     njs_object_prop_t   *prop;
     njs_regexp_group_t  *group;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     static const njs_value_t  string_index = njs_string("index");
     static const njs_value_t  string_input = njs_string("input");
     static const njs_value_t  string_groups = njs_string("groups");
 
     array = njs_array_alloc(vm, regexp->pattern->ncaptures, 0);
-    if (nxt_slow_path(array == NULL)) {
+    if (njs_slow_path(array == NULL)) {
         goto fail;
     }
 
-    captures = nxt_regex_captures(match_data);
+    captures = njs_regex_captures(match_data);
 
     for (i = 0; i < regexp->pattern->ncaptures; i++) {
         n = 2 * i;
@@ -994,7 +994,7 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8,
 
             ret = njs_regexp_string_create(vm, &array->start[i], start, size,
                                            length);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 goto fail;
             }
 
@@ -1004,7 +1004,7 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8,
     }
 
     prop = njs_object_prop_alloc(vm, &string_index, &njs_value_undefined, 1);
-    if (nxt_slow_path(prop == NULL)) {
+    if (njs_slow_path(prop == NULL)) {
         goto fail;
     }
 
@@ -1017,48 +1017,48 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8,
     }
 
     lhq.key_hash = NJS_INDEX_HASH;
-    lhq.key = nxt_string_value("index");
+    lhq.key = njs_str_value("index");
     lhq.replace = 0;
     lhq.value = prop;
     lhq.pool = vm->mem_pool;
     lhq.proto = &njs_object_hash_proto;
 
-    ret = nxt_lvlhsh_insert(&array->object.hash, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&array->object.hash, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         goto insert_fail;
     }
 
     prop = njs_object_prop_alloc(vm, &string_input, &regexp->string, 1);
-    if (nxt_slow_path(prop == NULL)) {
+    if (njs_slow_path(prop == NULL)) {
         goto fail;
     }
 
     lhq.key_hash = NJS_INPUT_HASH;
-    lhq.key = nxt_string_value("input");
+    lhq.key = njs_str_value("input");
     lhq.value = prop;
 
-    ret = nxt_lvlhsh_insert(&array->object.hash, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&array->object.hash, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         goto insert_fail;
     }
 
     prop = njs_object_prop_alloc(vm, &string_groups, &njs_value_undefined, 1);
-    if (nxt_slow_path(prop == NULL)) {
+    if (njs_slow_path(prop == NULL)) {
         goto fail;
     }
 
     lhq.key_hash = NJS_GROUPS_HASH;
-    lhq.key = nxt_string_value("groups");
+    lhq.key = njs_str_value("groups");
     lhq.value = prop;
 
-    ret = nxt_lvlhsh_insert(&array->object.hash, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&array->object.hash, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         goto insert_fail;
     }
 
     if (regexp->pattern->ngroups != 0) {
         groups = njs_object_alloc(vm);
-        if (nxt_slow_path(groups == NULL)) {
+        if (njs_slow_path(groups == NULL)) {
             goto fail;
         }
 
@@ -1071,13 +1071,13 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8,
 
             ret = njs_string_set(vm, &name, group->name.start,
                                  group->name.length);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 goto fail;
             }
 
             prop = njs_object_prop_alloc(vm, &name,
                                          &array->start[group->capture], 1);
-            if (nxt_slow_path(prop == NULL)) {
+            if (njs_slow_path(prop == NULL)) {
                 goto fail;
             }
 
@@ -1085,8 +1085,8 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8,
             lhq.key = group->name;
             lhq.value = prop;
 
-            ret = nxt_lvlhsh_insert(&groups->hash, &lhq);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            ret = njs_lvlhsh_insert(&groups->hash, &lhq);
+            if (njs_slow_path(ret != NJS_OK)) {
                 goto insert_fail;
             }
 
@@ -1097,7 +1097,7 @@ njs_regexp_exec_result(njs_vm_t *vm, njs_regexp_t *regexp, njs_utf8_t utf8,
 
     njs_set_array(&vm->retval, array);
 
-    ret = NXT_OK;
+    ret = NJS_OK;
     goto done;
 
 insert_fail:
@@ -1106,11 +1106,11 @@ insert_fail:
 
 fail:
 
-    ret = NXT_ERROR;
+    ret = NJS_ERROR;
 
 done:
 
-    nxt_regex_match_data_free(match_data, vm->regex_context);
+    njs_regex_match_data_free(match_data, vm->regex_context);
 
     return ret;
 }
@@ -1154,9 +1154,9 @@ static const njs_object_prop_t  njs_regexp_constructor_properties[] =
 
 
 const njs_object_init_t  njs_regexp_constructor_init = {
-    nxt_string("RegExp"),
+    njs_str("RegExp"),
     njs_regexp_constructor_properties,
-    nxt_nitems(njs_regexp_constructor_properties),
+    njs_nitems(njs_regexp_constructor_properties),
 };
 
 
@@ -1233,7 +1233,7 @@ static const njs_object_prop_t  njs_regexp_prototype_properties[] =
 
 
 const njs_object_init_t  njs_regexp_prototype_init = {
-    nxt_string("RegExp"),
+    njs_str("RegExp"),
     njs_regexp_prototype_properties,
-    nxt_nitems(njs_regexp_prototype_properties),
+    njs_nitems(njs_regexp_prototype_properties),
 };
similarity index 80%
rename from njs/njs_regexp.h
rename to src/njs_regexp.h
index 42ed42639d483d3b743c6e4096d4a79681d462c7..22cde6a94c197da2b6ebf0d515c1eece643a8aa9 100644 (file)
@@ -18,18 +18,18 @@ typedef enum {
 
 njs_ret_t njs_regexp_init(njs_vm_t *vm);
 njs_ret_t njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
-nxt_int_t njs_regexp_create(njs_vm_t *vm, njs_value_t *value, u_char *start,
+    njs_uint_t nargs, njs_index_t unused);
+njs_int_t njs_regexp_create(njs_vm_t *vm, njs_value_t *value, u_char *start,
     size_t length, njs_regexp_flags_t flags);
 njs_token_t njs_regexp_literal(njs_vm_t *vm, njs_parser_t *parser,
     njs_value_t *value);
 njs_regexp_pattern_t *njs_regexp_pattern_create(njs_vm_t *vm,
     u_char *string, size_t length, njs_regexp_flags_t flags);
-nxt_int_t njs_regexp_match(njs_vm_t *vm, nxt_regex_t *regex,
-    const u_char *subject, size_t len, nxt_regex_match_data_t *match_data);
+njs_int_t njs_regexp_match(njs_vm_t *vm, njs_regex_t *regex,
+    const u_char *subject, size_t len, njs_regex_match_data_t *match_data);
 njs_regexp_t *njs_regexp_alloc(njs_vm_t *vm, njs_regexp_pattern_t *pattern);
 njs_ret_t njs_regexp_prototype_exec(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 njs_ret_t njs_regexp_to_string(njs_vm_t *vm, njs_value_t *retval,
     const njs_value_t *regexp);
similarity index 93%
rename from njs/njs_regexp_pattern.h
rename to src/njs_regexp_pattern.h
index 9d160e11e8b946acb846c025d5c6a85234d44fa0..12228df15555f432d08c91e766dd62a947d9f820 100644 (file)
@@ -7,8 +7,8 @@
 #ifndef _NJS_REGEXP_PATTERN_H_INCLUDED_
 #define _NJS_REGEXP_PATTERN_H_INCLUDED_
 
-#include <nxt_pcre.h>
-#include <nxt_regex.h>
+#include <njs_pcre.h>
+#include <njs_regex.h>
 
 
 typedef enum {
@@ -21,7 +21,7 @@ typedef struct njs_regexp_group_s  njs_regexp_group_t;
 
 
 struct njs_regexp_pattern_s {
-    nxt_regex_t           regex[2];
+    njs_regex_t           regex[2];
 
     /*
      * A pattern source is used by RegExp.toString() method and
similarity index 92%
rename from nxt/nxt_sha1.c
rename to src/njs_sha1.c
index 500b47ef684171504baf741a8dc009947fb99f15..79abb60308a2ef4fd3717252b2e5d2322410d45d 100644 (file)
@@ -7,20 +7,20 @@
  */
 
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_sha1.h>
-#include <nxt_string.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_sha1.h>
+#include <njs_str.h>
 #include <string.h>
 
 
-static const u_char *nxt_sha1_body(nxt_sha1_t *ctx, const u_char *data,
+static const u_char *njs_sha1_body(njs_sha1_t *ctx, const u_char *data,
     size_t size);
 
 
 void
-nxt_sha1_init(nxt_sha1_t *ctx)
+njs_sha1_init(njs_sha1_t *ctx)
 {
     ctx->a = 0x67452301;
     ctx->b = 0xefcdab89;
@@ -33,7 +33,7 @@ nxt_sha1_init(nxt_sha1_t *ctx)
 
 
 void
-nxt_sha1_update(nxt_sha1_t *ctx, const void *data, size_t size)
+njs_sha1_update(njs_sha1_t *ctx, const void *data, size_t size)
 {
     size_t  used, free;
 
@@ -51,11 +51,11 @@ nxt_sha1_update(nxt_sha1_t *ctx, const void *data, size_t size)
         memcpy(&ctx->buffer[used], data, free);
         data = (u_char *) data + free;
         size -= free;
-        (void) nxt_sha1_body(ctx, ctx->buffer, 64);
+        (void) njs_sha1_body(ctx, ctx->buffer, 64);
     }
 
     if (size >= 64) {
-        data = nxt_sha1_body(ctx, data, size & ~(size_t) 0x3f);
+        data = njs_sha1_body(ctx, data, size & ~(size_t) 0x3f);
         size &= 0x3f;
     }
 
@@ -64,7 +64,7 @@ nxt_sha1_update(nxt_sha1_t *ctx, const void *data, size_t size)
 
 
 void
-nxt_sha1_final(u_char result[20], nxt_sha1_t *ctx)
+njs_sha1_final(u_char result[20], njs_sha1_t *ctx)
 {
     size_t  used, free;
 
@@ -75,13 +75,13 @@ nxt_sha1_final(u_char result[20], nxt_sha1_t *ctx)
     free = 64 - used;
 
     if (free < 8) {
-        nxt_memzero(&ctx->buffer[used], free);
-        (void) nxt_sha1_body(ctx, ctx->buffer, 64);
+        njs_memzero(&ctx->buffer[used], free);
+        (void) njs_sha1_body(ctx, ctx->buffer, 64);
         used = 0;
         free = 64;
     }
 
-    nxt_memzero(&ctx->buffer[used], free - 8);
+    njs_memzero(&ctx->buffer[used], free - 8);
 
     ctx->bytes <<= 3;
     ctx->buffer[56] = (u_char) (ctx->bytes >> 56);
@@ -93,7 +93,7 @@ nxt_sha1_final(u_char result[20], nxt_sha1_t *ctx)
     ctx->buffer[62] = (u_char) (ctx->bytes >> 8);
     ctx->buffer[63] = (u_char)  ctx->bytes;
 
-    (void) nxt_sha1_body(ctx, ctx->buffer, 64);
+    (void) njs_sha1_body(ctx, ctx->buffer, 64);
 
     result[0]  = (u_char) (ctx->a >> 24);
     result[1]  = (u_char) (ctx->a >> 16);
@@ -116,7 +116,7 @@ nxt_sha1_final(u_char result[20], nxt_sha1_t *ctx)
     result[18] = (u_char) (ctx->e >> 8);
     result[19] = (u_char)  ctx->e;
 
-    nxt_explicit_memzero(ctx, sizeof(*ctx));
+    njs_explicit_memzero(ctx, sizeof(*ctx));
 }
 
 
@@ -157,12 +157,12 @@ nxt_sha1_final(u_char result[20], nxt_sha1_t *ctx)
  */
 
 static const u_char *
-nxt_sha1_body(nxt_sha1_t *ctx, const u_char *data, size_t size)
+njs_sha1_body(njs_sha1_t *ctx, const u_char *data, size_t size)
 {
     uint32_t       a, b, c, d, e, temp;
     uint32_t       saved_a, saved_b, saved_c, saved_d, saved_e;
     uint32_t       words[80];
-    nxt_uint_t     i;
+    njs_uint_t     i;
     const u_char  *p;
 
     p = data;
diff --git a/src/njs_sha1.h b/src/njs_sha1.h
new file mode 100644 (file)
index 0000000..1bbd94e
--- /dev/null
@@ -0,0 +1,24 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+
+#ifndef _NJS_SHA1_H_INCLUDED_
+#define _NJS_SHA1_H_INCLUDED_
+
+
+typedef struct {
+    uint64_t  bytes;
+    uint32_t  a, b, c, d, e;
+    u_char    buffer[64];
+} njs_sha1_t;
+
+
+NJS_EXPORT void njs_sha1_init(njs_sha1_t *ctx);
+NJS_EXPORT void njs_sha1_update(njs_sha1_t *ctx, const void *data, size_t size);
+NJS_EXPORT void njs_sha1_final(u_char result[20], njs_sha1_t *ctx);
+
+
+#endif /* _NJS_SHA1_H_INCLUDED_ */
similarity index 92%
rename from nxt/nxt_sha2.c
rename to src/njs_sha2.c
index 5824395252c8d2533b3492e1c70d6cc626d2561b..7b1bf93dd9e5fde87a8bd8e6775ec45fcf5cd54f 100644 (file)
@@ -7,20 +7,20 @@
  */
 
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_sha2.h>
-#include <nxt_string.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_sha2.h>
+#include <njs_str.h>
 #include <string.h>
 
 
-static const u_char *nxt_sha2_body(nxt_sha2_t *ctx, const u_char *data,
+static const u_char *njs_sha2_body(njs_sha2_t *ctx, const u_char *data,
     size_t size);
 
 
 void
-nxt_sha2_init(nxt_sha2_t *ctx)
+njs_sha2_init(njs_sha2_t *ctx)
 {
     ctx->a = 0x6a09e667;
     ctx->b = 0xbb67ae85;
@@ -36,7 +36,7 @@ nxt_sha2_init(nxt_sha2_t *ctx)
 
 
 void
-nxt_sha2_update(nxt_sha2_t *ctx, const void *data, size_t size)
+njs_sha2_update(njs_sha2_t *ctx, const void *data, size_t size)
 {
     size_t  used, free;
 
@@ -54,11 +54,11 @@ nxt_sha2_update(nxt_sha2_t *ctx, const void *data, size_t size)
         memcpy(&ctx->buffer[used], data, free);
         data = (u_char *) data + free;
         size -= free;
-        (void) nxt_sha2_body(ctx, ctx->buffer, 64);
+        (void) njs_sha2_body(ctx, ctx->buffer, 64);
     }
 
     if (size >= 64) {
-        data = nxt_sha2_body(ctx, data, size & ~(size_t) 0x3f);
+        data = njs_sha2_body(ctx, data, size & ~(size_t) 0x3f);
         size &= 0x3f;
     }
 
@@ -67,7 +67,7 @@ nxt_sha2_update(nxt_sha2_t *ctx, const void *data, size_t size)
 
 
 void
-nxt_sha2_final(u_char result[32], nxt_sha2_t *ctx)
+njs_sha2_final(u_char result[32], njs_sha2_t *ctx)
 {
     size_t  used, free;
 
@@ -78,13 +78,13 @@ nxt_sha2_final(u_char result[32], nxt_sha2_t *ctx)
     free = 64 - used;
 
     if (free < 8) {
-        nxt_memzero(&ctx->buffer[used], free);
-        (void) nxt_sha2_body(ctx, ctx->buffer, 64);
+        njs_memzero(&ctx->buffer[used], free);
+        (void) njs_sha2_body(ctx, ctx->buffer, 64);
         used = 0;
         free = 64;
     }
 
-    nxt_memzero(&ctx->buffer[used], free - 8);
+    njs_memzero(&ctx->buffer[used], free - 8);
 
     ctx->bytes <<= 3;
     ctx->buffer[56] = (u_char) (ctx->bytes >> 56);
@@ -96,7 +96,7 @@ nxt_sha2_final(u_char result[32], nxt_sha2_t *ctx)
     ctx->buffer[62] = (u_char) (ctx->bytes >> 8);
     ctx->buffer[63] = (u_char)  ctx->bytes;
 
-    (void) nxt_sha2_body(ctx, ctx->buffer, 64);
+    (void) njs_sha2_body(ctx, ctx->buffer, 64);
 
     result[0]  = (u_char) (ctx->a >> 24);
     result[1]  = (u_char) (ctx->a >> 16);
@@ -131,7 +131,7 @@ nxt_sha2_final(u_char result[32], nxt_sha2_t *ctx)
     result[30] = (u_char) (ctx->h >> 8);
     result[31] = (u_char)  ctx->h;
 
-    nxt_explicit_memzero(ctx, sizeof(*ctx));
+    njs_explicit_memzero(ctx, sizeof(*ctx));
 }
 
 
@@ -177,13 +177,13 @@ nxt_sha2_final(u_char result[32], nxt_sha2_t *ctx)
  */
 
 static const u_char *
-nxt_sha2_body(nxt_sha2_t *ctx, const u_char *data, size_t size)
+njs_sha2_body(njs_sha2_t *ctx, const u_char *data, size_t size)
 {
     uint32_t       a, b, c, d, e, f, g, h, s0, s1, temp1, temp2;
     uint32_t       saved_a, saved_b, saved_c, saved_d, saved_e, saved_f,
                    saved_g, saved_h;
     uint32_t       words[64];
-    nxt_uint_t     i;
+    njs_uint_t     i;
     const u_char  *p;
 
     p = data;
diff --git a/src/njs_sha2.h b/src/njs_sha2.h
new file mode 100644 (file)
index 0000000..5a82a8d
--- /dev/null
@@ -0,0 +1,24 @@
+
+/*
+ * Copyright (C) Dmitry Volyntsev
+ * Copyright (C) NGINX, Inc.
+ */
+
+
+#ifndef _NJS_SHA2_H_INCLUDED_
+#define _NJS_SHA2_H_INCLUDED_
+
+
+typedef struct {
+    uint64_t  bytes;
+    uint32_t  a, b, c, d, e, f, g, h;
+    u_char    buffer[64];
+} njs_sha2_t;
+
+
+NJS_EXPORT void njs_sha2_init(njs_sha2_t *ctx);
+NJS_EXPORT void njs_sha2_update(njs_sha2_t *ctx, const void *data, size_t size);
+NJS_EXPORT void njs_sha2_final(u_char result[32], njs_sha2_t *ctx);
+
+
+#endif /* _NJS_SHA2_H_INCLUDED_ */
similarity index 69%
rename from njs/njs_shell.c
rename to src/njs_shell.c
index 21063e49592d6cb34f43fbc8dd915c8dace74665..6284757fc0391b5c011b5e2437a321fd34a90720 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_builtin.h>
 #include <time.h>
 #include <errno.h>
 #include <locale.h>
 
 #include <stdio.h>
-#if (NXT_HAVE_EDITLINE)
+#if (NJS_HAVE_EDITLINE)
 #include <editline/readline.h>
-#elif (NXT_HAVE_EDIT_READLINE)
+#elif (NJS_HAVE_EDIT_READLINE)
 #include <edit/readline/readline.h>
 #else
 #include <readline/readline.h>
-#if (NXT_HAVE_GNU_READLINE)
+#if (NJS_HAVE_GNU_READLINE)
 #include <readline/history.h>
 #endif
 #endif
@@ -47,9 +47,9 @@ typedef struct {
 typedef struct {
     size_t                  index;
     size_t                  length;
-    nxt_array_t             *completions;
-    nxt_array_t             *suffix_completions;
-    nxt_lvlhsh_each_t       lhe;
+    njs_arr_t               *completions;
+    njs_arr_t               *suffix_completions;
+    njs_lvlhsh_each_t       lhe;
 
     enum {
        NJS_COMPLETION_VAR = 0,
@@ -61,15 +61,15 @@ typedef struct {
 
 typedef struct {
     njs_vm_event_t          vm_event;
-    nxt_queue_link_t        link;
+    njs_queue_link_t        link;
 } njs_ev_t;
 
 
 typedef struct {
     njs_vm_t                *vm;
 
-    nxt_lvlhsh_t            events;  /* njs_ev_t * */
-    nxt_queue_t             posted_events;
+    njs_lvlhsh_t            events;  /* njs_ev_t * */
+    njs_queue_t             posted_events;
 
     uint64_t                time;
 
@@ -77,43 +77,43 @@ typedef struct {
 } njs_console_t;
 
 
-static nxt_int_t njs_get_options(njs_opts_t *opts, int argc, char **argv);
-static nxt_int_t njs_console_init(njs_vm_t *vm, njs_console_t *console);
-static nxt_int_t njs_externals_init(njs_vm_t *vm, njs_console_t *console);
-static nxt_int_t njs_interactive_shell(njs_opts_t *opts,
+static njs_int_t njs_get_options(njs_opts_t *opts, int argc, char **argv);
+static njs_int_t njs_console_init(njs_vm_t *vm, njs_console_t *console);
+static njs_int_t njs_externals_init(njs_vm_t *vm, njs_console_t *console);
+static njs_int_t njs_interactive_shell(njs_opts_t *opts,
     njs_vm_opt_t *vm_options);
 static njs_vm_t *njs_create_vm(njs_opts_t *opts, njs_vm_opt_t *vm_options);
-static nxt_int_t njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options);
-static nxt_int_t njs_process_script(njs_console_t *console, njs_opts_t *opts,
-    const nxt_str_t *script);
-static nxt_int_t njs_editline_init(void);
+static njs_int_t njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options);
+static njs_int_t njs_process_script(njs_console_t *console, njs_opts_t *opts,
+    const njs_str_t *script);
+static njs_int_t njs_editline_init(void);
 static char **njs_completion_handler(const char *text, int start, int end);
 static char *njs_completion_generator(const char *text, int state);
 
 static njs_ret_t njs_ext_console_log(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_ext_console_dump(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_ext_console_help(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_ext_console_time(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 static njs_host_event_t njs_console_set_timer(njs_external_ptr_t external,
     uint64_t delay, njs_vm_event_t vm_event);
 static void njs_console_clear_timer(njs_external_ptr_t external,
     njs_host_event_t event);
 
-static nxt_int_t lvlhsh_key_test(nxt_lvlhsh_query_t *lhq, void *data);
+static njs_int_t lvlhsh_key_test(njs_lvlhsh_query_t *lhq, void *data);
 static void *lvlhsh_pool_alloc(void *pool, size_t size);
 static void lvlhsh_pool_free(void *pool, void *p, size_t size);
 
 
 static njs_external_t  njs_ext_console[] = {
 
-    { nxt_string("log"),
+    { njs_str("log"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -125,7 +125,7 @@ static njs_external_t  njs_ext_console[] = {
       njs_ext_console_log,
       0 },
 
-    { nxt_string("dump"),
+    { njs_str("dump"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -137,7 +137,7 @@ static njs_external_t  njs_ext_console[] = {
       njs_ext_console_dump,
       0 },
 
-    { nxt_string("help"),
+    { njs_str("help"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -149,7 +149,7 @@ static njs_external_t  njs_ext_console[] = {
       njs_ext_console_help,
       0 },
 
-    { nxt_string("time"),
+    { njs_str("time"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -161,7 +161,7 @@ static njs_external_t  njs_ext_console[] = {
       njs_ext_console_time,
       0 },
 
-    { nxt_string("timeEnd"),
+    { njs_str("timeEnd"),
       NJS_EXTERN_METHOD,
       NULL,
       0,
@@ -176,10 +176,10 @@ static njs_external_t  njs_ext_console[] = {
 
 static njs_external_t  njs_externals[] = {
 
-    { nxt_string("console"),
+    { njs_str("console"),
       NJS_EXTERN_OBJECT,
       njs_ext_console,
-      nxt_nitems(njs_ext_console),
+      njs_nitems(njs_ext_console),
       NULL,
       NULL,
       NULL,
@@ -190,8 +190,8 @@ static njs_external_t  njs_externals[] = {
 };
 
 
-static const nxt_lvlhsh_proto_t  lvlhsh_proto  nxt_aligned(64) = {
-    NXT_LVLHSH_LARGE_SLAB,
+static const njs_lvlhsh_proto_t  lvlhsh_proto  njs_aligned(64) = {
+    NJS_LVLHSH_LARGE_SLAB,
     lvlhsh_key_test,
     lvlhsh_pool_alloc,
     lvlhsh_pool_free,
@@ -212,48 +212,48 @@ main(int argc, char **argv)
 {
     char          path[MAXPATHLEN], *p;
     njs_vm_t      *vm;
-    nxt_int_t     ret;
+    njs_int_t     ret;
     njs_opts_t    opts;
-    nxt_str_t     command;
+    njs_str_t     command;
     njs_vm_opt_t  vm_options;
 
-    nxt_memzero(&opts, sizeof(njs_opts_t));
+    njs_memzero(&opts, sizeof(njs_opts_t));
     opts.interactive = 1;
 
     ret = njs_get_options(&opts, argc, argv);
-    if (ret != NXT_OK) {
-        ret = (ret == NXT_DONE) ? NXT_OK : NXT_ERROR;
+    if (ret != NJS_OK) {
+        ret = (ret == NJS_DONE) ? NJS_OK : NJS_ERROR;
         goto done;
     }
 
     if (opts.version != 0) {
-        nxt_printf("%s\n", NJS_VERSION);
-        ret = NXT_OK;
+        njs_printf("%s\n", NJS_VERSION);
+        ret = NJS_OK;
         goto done;
     }
 
-    nxt_memzero(&vm_options, sizeof(njs_vm_opt_t));
+    njs_memzero(&vm_options, sizeof(njs_vm_opt_t));
 
     if (opts.file == NULL) {
         p = getcwd(path, sizeof(path));
         if (p == NULL) {
-            nxt_error("getcwd() failed:%s\n", strerror(errno));
-            ret = NXT_ERROR;
+            njs_stderror("getcwd() failed:%s\n", strerror(errno));
+            ret = NJS_ERROR;
             goto done;
         }
 
         if (opts.command == NULL) {
-            memcpy(path + nxt_strlen(path), "/shell", sizeof("/shell"));
+            memcpy(path + njs_strlen(path), "/shell", sizeof("/shell"));
 
         } else {
-            memcpy(path + nxt_strlen(path), "/string", sizeof("/string"));
+            memcpy(path + njs_strlen(path), "/string", sizeof("/string"));
         }
 
         opts.file = path;
     }
 
     vm_options.file.start = (u_char *) opts.file;
-    vm_options.file.length = nxt_strlen(opts.file);
+    vm_options.file.length = njs_strlen(opts.file);
 
     vm_options.init = !opts.interactive;
     vm_options.accumulative = opts.interactive;
@@ -274,7 +274,7 @@ main(int argc, char **argv)
         vm = njs_create_vm(&opts, &vm_options);
         if (vm != NULL) {
             command.start = (u_char *) opts.command;
-            command.length = nxt_strlen(opts.command);
+            command.length = njs_strlen(opts.command);
             ret = njs_process_script(vm_options.external, &opts, &command);
         }
 
@@ -288,15 +288,15 @@ done:
         free(opts.paths);
     }
 
-    return (ret == NXT_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
+    return (ret == NJS_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_get_options(njs_opts_t *opts, int argc, char** argv)
 {
     char     *p, **paths;
-    nxt_int_t  i, ret;
+    njs_int_t  i, ret;
 
     static const char  help[] =
         "Interactive njs shell.\n"
@@ -311,7 +311,7 @@ njs_get_options(njs_opts_t *opts, int argc, char** argv)
         "  -v                print njs version and exit.\n"
         "  <filename> | -    run code from a file or stdin.\n";
 
-    ret = NXT_DONE;
+    ret = NJS_DONE;
 
     for (i = 1; i < argc; i++) {
 
@@ -328,7 +328,7 @@ njs_get_options(njs_opts_t *opts, int argc, char** argv)
         switch (*p) {
         case '?':
         case 'h':
-            (void) write(STDOUT_FILENO, help, nxt_length(help));
+            (void) write(STDOUT_FILENO, help, njs_length(help));
             return ret;
 
         case 'c':
@@ -339,8 +339,8 @@ njs_get_options(njs_opts_t *opts, int argc, char** argv)
                 break;
             }
 
-            nxt_error("option \"-c\" requires argument\n");
-            return NXT_ERROR;
+            njs_stderror("option \"-c\" requires argument\n");
+            return NJS_ERROR;
 
         case 'd':
             opts->disassemble = 1;
@@ -351,8 +351,8 @@ njs_get_options(njs_opts_t *opts, int argc, char** argv)
                 opts->n_paths++;
                 paths = realloc(opts->paths, opts->n_paths * sizeof(char *));
                 if (paths == NULL) {
-                    nxt_error("failed to add path\n");
-                    return NXT_ERROR;
+                    njs_stderror("failed to add path\n");
+                    return NJS_ERROR;
                 }
 
                 opts->paths = paths;
@@ -360,8 +360,8 @@ njs_get_options(njs_opts_t *opts, int argc, char** argv)
                 break;
             }
 
-            nxt_error("option \"-p\" requires directory name\n");
-            return NXT_ERROR;
+            njs_stderror("option \"-p\" requires directory name\n");
+            return NJS_ERROR;
 
         case 'q':
             opts->quiet = 1;
@@ -377,112 +377,112 @@ njs_get_options(njs_opts_t *opts, int argc, char** argv)
                     opts->module = 1;
 
                 } else if (strcmp(argv[i], "script") != 0) {
-                    nxt_error("option \"-t\" unexpected source type: %s\n",
-                              argv[i]);
-                    return NXT_ERROR;
+                    njs_stderror("option \"-t\" unexpected source type: %s\n",
+                                 argv[i]);
+                    return NJS_ERROR;
                 }
 
                 break;
             }
 
-            nxt_error("option \"-t\" requires source type\n");
-            return NXT_ERROR;
+            njs_stderror("option \"-t\" requires source type\n");
+            return NJS_ERROR;
         case 'v':
         case 'V':
             opts->version = 1;
             break;
 
         default:
-            nxt_error("Unknown argument: \"%s\" "
-                      "try \"%s -h\" for available options\n", argv[i],
-                      argv[0]);
-            return NXT_ERROR;
+            njs_stderror("Unknown argument: \"%s\" "
+                         "try \"%s -h\" for available options\n", argv[i],
+                         argv[0]);
+            return NJS_ERROR;
         }
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_console_init(njs_vm_t *vm, njs_console_t *console)
 {
     console->vm = vm;
 
-    nxt_lvlhsh_init(&console->events);
-    nxt_queue_init(&console->posted_events);
+    njs_lvlhsh_init(&console->events);
+    njs_queue_init(&console->posted_events);
 
     console->time = UINT64_MAX;
 
     console->completion.completions = njs_vm_completions(vm, NULL);
     if (console->completion.completions == NULL) {
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_externals_init(njs_vm_t *vm, njs_console_t *console)
 {
-    nxt_uint_t          ret;
+    njs_uint_t          ret;
     njs_value_t         *value;
     const njs_extern_t  *proto;
 
-    static const nxt_str_t name = nxt_string("console");
+    static const njs_str_t name = njs_str("console");
 
     proto = njs_vm_external_prototype(vm, &njs_externals[0]);
     if (proto == NULL) {
-        nxt_error("failed to add console proto\n");
-        return NXT_ERROR;
+        njs_stderror("failed to add console proto\n");
+        return NJS_ERROR;
     }
 
-    value = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_opaque_value_t));
+    value = njs_mp_zalloc(vm->mem_pool, sizeof(njs_opaque_value_t));
     if (value == NULL) {
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     ret = njs_vm_external_create(vm, value, proto, console);
-    if (ret != NXT_OK) {
-        return NXT_ERROR;
+    if (ret != NJS_OK) {
+        return NJS_ERROR;
     }
 
     ret = njs_vm_external_bind(vm, &name, value);
-    if (ret != NXT_OK) {
-        return NXT_ERROR;
+    if (ret != NJS_OK) {
+        return NJS_ERROR;
     }
 
     ret = njs_console_init(vm, console);
-    if (ret != NXT_OK) {
-        return NXT_ERROR;
+    if (ret != NJS_OK) {
+        return NJS_ERROR;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_interactive_shell(njs_opts_t *opts, njs_vm_opt_t *vm_options)
 {
     njs_vm_t   *vm;
-    nxt_str_t  line;
+    njs_str_t  line;
 
-    if (njs_editline_init() != NXT_OK) {
-        nxt_error("failed to init completions\n");
-        return NXT_ERROR;
+    if (njs_editline_init() != NJS_OK) {
+        njs_stderror("failed to init completions\n");
+        return NJS_ERROR;
     }
 
     vm = njs_create_vm(opts, vm_options);
     if (vm == NULL) {
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     if (!opts->quiet) {
-        nxt_printf("interactive njs %s\n\n", NJS_VERSION);
+        njs_printf("interactive njs %s\n\n", NJS_VERSION);
 
-        nxt_printf("v.<Tab> -> the properties and prototype methods of v.\n");
-        nxt_printf("type console.help() for more information\n\n");
+        njs_printf("v.<Tab> -> the properties and prototype methods of v.\n");
+        njs_printf("type console.help() for more information\n\n");
     }
 
     for ( ;; ) {
@@ -491,7 +491,7 @@ njs_interactive_shell(njs_opts_t *opts, njs_vm_opt_t *vm_options)
             break;
         }
 
-        line.length = nxt_strlen(line.start);
+        line.length = njs_strlen(line.start);
         if (line.length == 0) {
             continue;
         }
@@ -504,11 +504,11 @@ njs_interactive_shell(njs_opts_t *opts, njs_vm_opt_t *vm_options)
         free(line.start);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options)
 {
     int          fd;
@@ -517,8 +517,8 @@ njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options)
     size_t       size;
     ssize_t      n;
     njs_vm_t     *vm;
-    nxt_int_t    ret;
-    nxt_str_t    source, script;
+    njs_int_t    ret;
+    njs_str_t    source, script;
     struct stat  sb;
 
     file = opts->file;
@@ -529,16 +529,16 @@ njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options)
     } else {
         fd = open(file, O_RDONLY);
         if (fd == -1) {
-            nxt_error("failed to open file: '%s' (%s)\n",
-                      file, strerror(errno));
-            return NXT_ERROR;
+            njs_stderror("failed to open file: '%s' (%s)\n",
+                         file, strerror(errno));
+            return NJS_ERROR;
         }
     }
 
     if (fstat(fd, &sb) == -1) {
-        nxt_error("fstat(%d) failed while reading '%s' (%s)\n",
-                  fd, file, strerror(errno));
-        ret = NXT_ERROR;
+        njs_stderror("fstat(%d) failed while reading '%s' (%s)\n",
+                     fd, file, strerror(errno));
+        ret = NJS_ERROR;
         goto close_fd;
     }
 
@@ -551,8 +551,8 @@ njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options)
     source.length = 0;
     source.start = realloc(NULL, size);
     if (source.start == NULL) {
-        nxt_error("alloc failed while reading '%s'\n", file);
-        ret = NXT_ERROR;
+        njs_stderror("alloc failed while reading '%s'\n", file);
+        ret = NJS_ERROR;
         goto done;
     }
 
@@ -567,9 +567,9 @@ njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options)
         }
 
         if (n < 0) {
-            nxt_error("failed to read file: '%s' (%s)\n",
+            njs_stderror("failed to read file: '%s' (%s)\n",
                       file, strerror(errno));
-            ret = NXT_ERROR;
+            ret = NJS_ERROR;
             goto done;
         }
 
@@ -578,8 +578,8 @@ njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options)
 
             start = realloc(source.start, size);
             if (start == NULL) {
-                nxt_error("alloc failed while reading '%s'\n", file);
-                ret = NXT_ERROR;
+                njs_stderror("alloc failed while reading '%s'\n", file);
+                ret = NJS_ERROR;
                 goto done;
             }
 
@@ -597,7 +597,7 @@ njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options)
 
     vm = njs_create_vm(opts, vm_options);
     if (vm == NULL) {
-        ret = NXT_ERROR;
+        ret = NJS_ERROR;
         goto done;
     }
 
@@ -606,7 +606,7 @@ njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options)
     /* shebang */
 
     if (script.length > 2 && memcmp(script.start, "#!", 2) == 0) {
-        p = nxt_strlchr(script.start, script.start + script.length, '\n');
+        p = njs_strlchr(script.start, script.start + script.length, '\n');
 
         if (p != NULL) {
             script.length -= (p + 1 - script.start);
@@ -618,12 +618,12 @@ njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options)
     }
 
     ret = njs_process_script(vm_options->external, opts, &script);
-    if (ret != NXT_OK) {
-        ret = NXT_ERROR;
+    if (ret != NJS_OK) {
+        ret = NJS_ERROR;
         goto done;
     }
 
-    ret = NXT_OK;
+    ret = NJS_OK;
 
 done:
 
@@ -646,28 +646,28 @@ njs_create_vm(njs_opts_t *opts, njs_vm_opt_t *vm_options)
 {
     u_char      *p, *start;
     njs_vm_t    *vm;
-    nxt_int_t   ret;
-    nxt_str_t   path;
-    nxt_uint_t  i;
+    njs_int_t   ret;
+    njs_str_t   path;
+    njs_uint_t  i;
 
     vm = njs_vm_create(vm_options);
     if (vm == NULL) {
-        nxt_error("failed to create vm\n");
+        njs_stderror("failed to create vm\n");
         return NULL;
     }
 
-    if (njs_externals_init(vm, vm_options->external) != NXT_OK) {
-        nxt_error("failed to add external protos\n");
+    if (njs_externals_init(vm, vm_options->external) != NJS_OK) {
+        njs_stderror("failed to add external protos\n");
         return NULL;
     }
 
     for (i = 0; i < opts->n_paths; i++) {
         path.start = (u_char *) opts->paths[i];
-        path.length = nxt_strlen(opts->paths[i]);
+        path.length = njs_strlen(opts->paths[i]);
 
         ret = njs_vm_add_path(vm, &path);
-        if (ret != NXT_OK) {
-            nxt_error("failed to add path\n");
+        if (ret != NJS_OK) {
+            njs_stderror("failed to add path\n");
             return NULL;
         }
     }
@@ -678,14 +678,14 @@ njs_create_vm(njs_opts_t *opts, njs_vm_opt_t *vm_options)
     }
 
     for ( ;; ) {
-        p = nxt_strchr(start, ':');
+        p = njs_strchr(start, ':');
 
         path.start = start;
-        path.length = (p != NULL) ? (size_t) (p - start) : nxt_strlen(start);
+        path.length = (p != NULL) ? (size_t) (p - start) : njs_strlen(start);
 
         ret = njs_vm_add_path(vm, &path);
-        if (ret != NXT_OK) {
-            nxt_error("failed to add path\n");
+        if (ret != NJS_OK) {
+            njs_stderror("failed to add path\n");
             return NULL;
         }
 
@@ -703,69 +703,69 @@ njs_create_vm(njs_opts_t *opts, njs_vm_opt_t *vm_options)
 static void
 njs_output(njs_vm_t *vm, njs_opts_t *opts, njs_ret_t ret)
 {
-    nxt_str_t  out;
+    njs_str_t  out;
 
-    if (njs_vm_retval_dump(vm, &out, 1) != NXT_OK) {
-        out = nxt_string_value("failed to get retval from VM");
+    if (njs_vm_retval_dump(vm, &out, 1) != NJS_OK) {
+        out = njs_str_value("failed to get retval from VM");
         ret = NJS_ERROR;
     }
 
     if (ret != NJS_OK) {
-        nxt_error("%V\n", &out);
+        njs_stderror("%V\n", &out);
 
     } else if (opts->interactive) {
-        nxt_print(out.start, out.length);
-        nxt_printf("\n");
+        njs_print(out.start, out.length);
+        njs_printf("\n");
     }
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_process_events(njs_console_t *console, njs_opts_t *opts)
 {
     njs_ev_t          *ev;
-    nxt_queue_t       *events;
-    nxt_queue_link_t  *link;
+    njs_queue_t       *events;
+    njs_queue_link_t  *link;
 
     events = &console->posted_events;
 
     for ( ;; ) {
-        link = nxt_queue_first(events);
+        link = njs_queue_first(events);
 
-        if (link == nxt_queue_tail(events)) {
+        if (link == njs_queue_tail(events)) {
             break;
         }
 
-        ev = nxt_queue_link_data(link, njs_ev_t, link);
+        ev = njs_queue_link_data(link, njs_ev_t, link);
 
-        nxt_queue_remove(&ev->link);
+        njs_queue_remove(&ev->link);
         ev->link.prev = NULL;
         ev->link.next = NULL;
 
         njs_vm_post_event(console->vm, ev->vm_event, NULL, 0);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_process_script(njs_console_t *console, njs_opts_t *opts,
-    const nxt_str_t *script)
+    const njs_str_t *script)
 {
     u_char     *start;
     njs_vm_t   *vm;
-    nxt_int_t  ret;
+    njs_int_t  ret;
 
     vm = console->vm;
     start = script->start;
 
     ret = njs_vm_compile(vm, &start, start + script->length);
 
-    if (ret == NXT_OK) {
+    if (ret == NJS_OK) {
         if (opts->disassemble) {
             njs_disassembler(vm);
-            nxt_printf("\n");
+            njs_printf("\n");
         }
 
         ret = njs_vm_start(vm);
@@ -779,8 +779,8 @@ njs_process_script(njs_console_t *console, njs_opts_t *opts,
         }
 
         ret = njs_process_events(console, opts);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            nxt_error("njs_process_events() failed\n");
+        if (njs_slow_path(ret != NJS_OK)) {
+            njs_stderror("njs_process_events() failed\n");
             ret = NJS_ERROR;
             break;
         }
@@ -788,7 +788,7 @@ njs_process_script(njs_console_t *console, njs_opts_t *opts,
         if (njs_vm_waiting(vm) && !njs_vm_posted(vm)) {
             /*TODO: async events. */
 
-            nxt_error("njs_process_script(): async events unsupported\n");
+            njs_stderror("njs_process_script(): async events unsupported\n");
             ret = NJS_ERROR;
             break;
         }
@@ -804,7 +804,7 @@ njs_process_script(njs_console_t *console, njs_opts_t *opts,
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_editline_init(void)
 {
     rl_completion_append_character = '\0';
@@ -813,7 +813,7 @@ njs_editline_init(void)
 
     setlocale(LC_ALL, "");
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -829,7 +829,7 @@ njs_completion_handler(const char *text, int start, int end)
 /* editline frees the buffer every time. */
 #define njs_editline(s) strndup((char *) (s)->start, (s)->length)
 
-#define njs_completion(c, i) &(((nxt_str_t *) (c)->start)[i])
+#define njs_completion(c, i) &(((njs_str_t *) (c)->start)[i])
 
 #define njs_next_phase(c)                                                   \
     (c)->index = 0;                                                         \
@@ -841,7 +841,7 @@ njs_completion_generator(const char *text, int state)
 {
     char              *completion;
     size_t            len;
-    nxt_str_t         expression, *suffix;
+    njs_str_t         expression, *suffix;
     const char        *p;
     njs_vm_t          *vm;
     njs_variable_t    *var;
@@ -853,10 +853,10 @@ njs_completion_generator(const char *text, int state)
     if (state == 0) {
         cmpl->phase = 0;
         cmpl->index = 0;
-        cmpl->length = nxt_strlen(text);
+        cmpl->length = njs_strlen(text);
         cmpl->suffix_completions = NULL;
 
-        nxt_lvlhsh_each_init(&cmpl->lhe, &njs_variables_hash_proto);
+        njs_lvlhsh_each_init(&cmpl->lhe, &njs_variables_hash_proto);
     }
 
 next:
@@ -868,7 +868,7 @@ next:
         }
 
         for ( ;; ) {
-            var = nxt_lvlhsh_each(&vm->parser->scope->variables,
+            var = njs_lvlhsh_each(&vm->parser->scope->variables,
                                   &cmpl->lhe);
 
             if (var == NULL) {
@@ -879,7 +879,7 @@ next:
                 continue;
             }
 
-            if (nxt_strncmp(text, var->name.start, cmpl->length) == 0) {
+            if (njs_strncmp(text, var->name.start, cmpl->length) == 0) {
                 return njs_editline(&var->name);
             }
         }
@@ -929,8 +929,8 @@ next:
 
             suffix = njs_completion(cmpl->suffix_completions, cmpl->index++);
 
-            if (len != 0 && nxt_strncmp(suffix->start, p,
-                                        nxt_min(len, suffix->length)) != 0)
+            if (len != 0 && njs_strncmp(suffix->start, p,
+                                        njs_min(len, suffix->length)) != 0)
             {
                 continue;
             }
@@ -941,7 +941,7 @@ next:
                 return NULL;
             }
 
-            nxt_sprintf((u_char *) completion, (u_char *) completion + len,
+            njs_sprintf((u_char *) completion, (u_char *) completion + len,
                         "%*s%V%Z", p - text, text, suffix);
             return completion;
         }
@@ -963,7 +963,7 @@ next:
                 continue;
             }
 
-            if (nxt_strncmp(text, suffix->start, cmpl->length) == 0) {
+            if (njs_strncmp(text, suffix->start, cmpl->length) == 0) {
                 return njs_editline(suffix);
             }
         }
@@ -974,11 +974,11 @@ next:
 
 
 static njs_ret_t
-njs_ext_console_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_ext_console_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_str_t   msg;
-    nxt_uint_t  n;
+    njs_str_t   msg;
+    njs_uint_t  n;
 
     n = 1;
 
@@ -989,14 +989,14 @@ njs_ext_console_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             return NJS_ERROR;
         }
 
-        nxt_printf("%s", (n != 1) ? " " : "");
-        nxt_print(msg.start, msg.length);
+        njs_printf("%s", (n != 1) ? " " : "");
+        njs_print(msg.start, msg.length);
 
         n++;
     }
 
     if (nargs > 1) {
-        nxt_printf("\n");
+        njs_printf("\n");
     }
 
     vm->retval = njs_value_undefined;
@@ -1006,11 +1006,11 @@ njs_ext_console_log(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_ext_console_dump(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_ext_console_dump(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_str_t   msg;
-    nxt_uint_t  n;
+    njs_str_t   msg;
+    njs_uint_t  n;
 
     n = 1;
 
@@ -1021,14 +1021,14 @@ njs_ext_console_dump(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             return NJS_ERROR;
         }
 
-        nxt_printf("%s", (n != 1) ? " " : "");
-        nxt_print(msg.start, msg.length);
+        njs_printf("%s", (n != 1) ? " " : "");
+        njs_print(msg.start, msg.length);
 
         n++;
     }
 
     if (nargs > 1) {
-        nxt_printf("\n");
+        njs_printf("\n");
     }
 
     vm->retval = njs_value_undefined;
@@ -1038,29 +1038,29 @@ njs_ext_console_dump(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_ext_console_help(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_ext_console_help(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     const njs_object_init_t  *obj, **objpp;
 
-    nxt_printf("VM built-in objects:\n");
+    njs_printf("VM built-in objects:\n");
 
     for (objpp = njs_constructor_init; *objpp != NULL; objpp++) {
         obj = *objpp;
 
-        nxt_printf("  %V\n", &obj->name);
+        njs_printf("  %V\n", &obj->name);
     }
 
     for (objpp = njs_object_init; *objpp != NULL; objpp++) {
         obj = *objpp;
 
-        nxt_printf("  %V\n", &obj->name);
+        njs_printf("  %V\n", &obj->name);
     }
 
-    nxt_printf("\nEmbedded objects:\n");
-    nxt_printf("  console\n");
+    njs_printf("\nEmbedded objects:\n");
+    njs_printf("  console\n");
 
-    nxt_printf("\n");
+    njs_printf("\n");
 
     vm->retval = njs_value_undefined;
 
@@ -1069,7 +1069,7 @@ njs_ext_console_help(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_console_t  *console;
@@ -1080,11 +1080,11 @@ njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     console = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(console == NULL)) {
+    if (njs_slow_path(console == NULL)) {
         return NJS_ERROR;
     }
 
-    console->time = nxt_time();
+    console->time = njs_time();
 
     vm->retval = njs_value_undefined;
 
@@ -1093,13 +1093,13 @@ njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     uint64_t       ns, ms;
     njs_console_t  *console;
 
-    ns = nxt_time();
+    ns = njs_time();
 
     if (!njs_value_is_undefined(njs_arg(args, nargs, 1))) {
         njs_vm_error(vm, "labels not implemented");
@@ -1107,23 +1107,23 @@ njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     console = njs_vm_external(vm, njs_arg(args, nargs, 0));
-    if (nxt_slow_path(console == NULL)) {
+    if (njs_slow_path(console == NULL)) {
         return NJS_ERROR;
     }
 
-    if (nxt_fast_path(console->time != UINT64_MAX)) {
+    if (njs_fast_path(console->time != UINT64_MAX)) {
 
         ns = ns - console->time;
 
         ms = ns / 1000000;
         ns = ns % 1000000;
 
-        nxt_printf("default: %uL.%06uLms\n", ms, ns);
+        njs_printf("default: %uL.%06uLms\n", ms, ns);
 
         console->time = UINT64_MAX;
 
     } else {
-        nxt_printf("Timer \"default\" doesn’t exist.\n");
+        njs_printf("Timer \"default\" doesn’t exist.\n");
     }
 
     vm->retval = njs_value_undefined;
@@ -1138,20 +1138,20 @@ njs_console_set_timer(njs_external_ptr_t external, uint64_t delay,
 {
     njs_ev_t            *ev;
     njs_vm_t            *vm;
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_console_t       *console;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     if (delay != 0) {
-        nxt_error("njs_console_set_timer(): async timers unsupported\n");
+        njs_stderror("njs_console_set_timer(): async timers unsupported\n");
         return NULL;
     }
 
     console = external;
     vm = console->vm;
 
-    ev = nxt_mp_alloc(vm->mem_pool, sizeof(njs_ev_t));
-    if (nxt_slow_path(ev == NULL)) {
+    ev = njs_mp_alloc(vm->mem_pool, sizeof(njs_ev_t));
+    if (njs_slow_path(ev == NULL)) {
         return NULL;
     }
 
@@ -1159,19 +1159,19 @@ njs_console_set_timer(njs_external_ptr_t external, uint64_t delay,
 
     lhq.key.start = (u_char *) &ev->vm_event;
     lhq.key.length = sizeof(njs_vm_event_t);
-    lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+    lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
 
     lhq.replace = 0;
     lhq.value = ev;
     lhq.proto = &lvlhsh_proto;
     lhq.pool = vm->mem_pool;
 
-    ret = nxt_lvlhsh_insert(&console->events, &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_insert(&console->events, &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
 
-    nxt_queue_insert_tail(&console->posted_events, &ev->link);
+    njs_queue_insert_tail(&console->posted_events, &ev->link);
 
     return (njs_host_event_t) ev;
 }
@@ -1182,9 +1182,9 @@ njs_console_clear_timer(njs_external_ptr_t external, njs_host_event_t event)
 {
     njs_vm_t            *vm;
     njs_ev_t            *ev;
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_console_t       *console;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     ev = event;
     console = external;
@@ -1192,48 +1192,48 @@ njs_console_clear_timer(njs_external_ptr_t external, njs_host_event_t event)
 
     lhq.key.start = (u_char *) &ev->vm_event;
     lhq.key.length = sizeof(njs_vm_event_t);
-    lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+    lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
 
     lhq.proto = &lvlhsh_proto;
     lhq.pool = vm->mem_pool;
 
     if (ev->link.prev != NULL) {
-        nxt_queue_remove(&ev->link);
+        njs_queue_remove(&ev->link);
     }
 
-    ret = nxt_lvlhsh_delete(&console->events, &lhq);
-    if (ret != NXT_OK) {
-        nxt_error("nxt_lvlhsh_delete() failed\n");
+    ret = njs_lvlhsh_delete(&console->events, &lhq);
+    if (ret != NJS_OK) {
+        njs_stderror("njs_lvlhsh_delete() failed\n");
     }
 
-    nxt_mp_free(vm->mem_pool, ev);
+    njs_mp_free(vm->mem_pool, ev);
 }
 
 
-static nxt_int_t
-lvlhsh_key_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+lvlhsh_key_test(njs_lvlhsh_query_t *lhq, void *data)
 {
     njs_ev_t  *ev;
 
     ev = data;
 
     if (memcmp(&ev->vm_event, lhq->key.start, sizeof(njs_vm_event_t)) == 0) {
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
 static void *
 lvlhsh_pool_alloc(void *pool, size_t size)
 {
-    return nxt_mp_align(pool, size, size);
+    return njs_mp_align(pool, size, size);
 }
 
 
 static void
 lvlhsh_pool_free(void *pool, void *p, size_t size)
 {
-    nxt_mp_free(pool, p);
+    njs_mp_free(pool, p);
 }
similarity index 79%
rename from nxt/nxt_sprintf.c
rename to src/njs_sprintf.c
index 442e55943e527effbcb81a411dd2aa2a21550242..7ac863d2601a35f8810ce97e214502b9b876f272 100644 (file)
@@ -4,12 +4,12 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_stub.h>
-#include <nxt_string.h>
-#include <nxt_sprintf.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_stub.h>
+#include <njs_str.h>
+#include <njs_sprintf.h>
 
 #include <math.h>
 #include <float.h>
 /*
  * Supported formats:
  *
- *    %[0][width][x][X]O        nxt_off_t
- *    %[0][width]T              nxt_time_t
+ *    %[0][width][x][X]O        njs_off_t
+ *    %[0][width]T              njs_time_t
  *    %[0][width][u][x|X]z      ssize_t/size_t
  *    %[0][width][u][x|X]d      int/u_int
  *    %[0][width][u][x|X]l      long
- *    %[0][width|m][u][x|X]i    nxt_int_t/nxt_uint_t
+ *    %[0][width|m][u][x|X]i    njs_int_t/njs_uint_t
  *    %[0][width][u][x|X]D      int32_t/uint32_t
  *    %[0][width][u][x|X]L      int64_t/uint64_t
  *    %[0][width][.width]f      double, max valid number fits to %18.15f
@@ -35,8 +35,8 @@
  *    %*s                       length and string
  *
  *    %p                        void *
- *    %b                        nxt_bool_t
- *    %V                        nxt_str_t *
+ *    %b                        njs_bool_t
+ *    %V                        njs_str_t *
  *    %Z                        '\0'
  *    %n                        '\n'
  *    %c                        char
 
 
 u_char *
-nxt_sprintf(u_char *buf, u_char *end, const char *fmt, ...)
+njs_sprintf(u_char *buf, u_char *end, const char *fmt, ...)
 {
     u_char   *p;
     va_list  args;
 
     va_start(args, fmt);
-    p = nxt_vsprintf(buf, end, fmt, args);
+    p = njs_vsprintf(buf, end, fmt, args);
     va_end(args);
 
     return p;
@@ -65,9 +65,9 @@ nxt_sprintf(u_char *buf, u_char *end, const char *fmt, ...)
 
 
 /*
- * nxt_sprintf_t is used:
- *    to pass several parameters of nxt_integer() via single pointer
- *    and to store little used variables of nxt_vsprintf().
+ * njs_sprintf_t is used:
+ *    to pass several parameters of njs_integer() via single pointer
+ *    and to store little used variables of njs_vsprintf().
  */
 
 typedef struct {
@@ -77,19 +77,19 @@ typedef struct {
    int32_t       frac_width;
    uint8_t       max_width;
    u_char        padding;
-} nxt_sprintf_t;
+} njs_sprintf_t;
 
 
-static u_char *nxt_integer(nxt_sprintf_t *spf, u_char *buf, uint64_t ui64);
-static u_char *nxt_number(nxt_sprintf_t *spf, u_char *buf, double n);
+static u_char *njs_integer(njs_sprintf_t *spf, u_char *buf, uint64_t ui64);
+static u_char *njs_number(njs_sprintf_t *spf, u_char *buf, double n);
 
 
 /* A right way of "f == 0.0". */
-#define  nxt_double_is_zero(f)  (fabs(f) <= FLT_EPSILON)
+#define  njs_double_is_zero(f)  (fabs(f) <= FLT_EPSILON)
 
 
 u_char *
-nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
+njs_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
 {
     u_char         *p;
     int            d;
@@ -97,10 +97,10 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
     size_t         length;
     int64_t        i64;
     uint64_t       ui64, frac;
-    nxt_str_t      *v;
-    nxt_uint_t     scale, n;
-    nxt_bool_t     sign;
-    nxt_sprintf_t  spf;
+    njs_str_t      *v;
+    njs_uint_t     scale, n;
+    njs_bool_t     sign;
+    njs_sprintf_t  spf;
 
     static const u_char  hexadecimal[16] = "0123456789abcdef";
     static const u_char  HEXADECIMAL[16] = "0123456789ABCDEF";
@@ -129,9 +129,9 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
 
         case 'V':
             fmt++;
-            v = va_arg(args, nxt_str_t *);
+            v = va_arg(args, njs_str_t *);
 
-            if (nxt_fast_path(v != NULL)) {
+            if (njs_fast_path(v != NULL)) {
                 length = v->length;
                 p = v->start;
                 goto copy;
@@ -142,7 +142,7 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
         case 's':
             p = va_arg(args, u_char *);
 
-            if (nxt_fast_path(p != NULL)) {
+            if (njs_fast_path(p != NULL)) {
                 while (*p != '\0' && buf < end) {
                     *buf++ = *p++;
                 }
@@ -160,7 +160,7 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
                 fmt++;
                 p = va_arg(args, u_char *);
 
-                if (nxt_fast_path(p != NULL)) {
+                if (njs_fast_path(p != NULL)) {
                     goto copy;
                 }
             }
@@ -233,12 +233,12 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
         switch (*fmt) {
 
         case 'O':
-            i64 = (int64_t) va_arg(args, nxt_off_t);
+            i64 = (int64_t) va_arg(args, njs_off_t);
             sign = 1;
             goto number;
 
         case 'T':
-            i64 = (int64_t) va_arg(args, nxt_time_t);
+            i64 = (int64_t) va_arg(args, njs_time_t);
             sign = 1;
             goto number;
 
@@ -252,13 +252,13 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
 
         case 'i':
             if (sign) {
-                i64 = (int64_t) va_arg(args, nxt_int_t);
+                i64 = (int64_t) va_arg(args, njs_int_t);
             } else {
-                ui64 = (uint64_t) va_arg(args, nxt_uint_t);
+                ui64 = (uint64_t) va_arg(args, njs_uint_t);
             }
 
             if (spf.max_width != 0) {
-                spf.width = NXT_INT_T_LEN;
+                spf.width = NJS_INT_T_LEN;
             }
 
             goto number;
@@ -296,7 +296,7 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
             goto number;
 
         case 'b':
-            ui64 = (uint64_t) va_arg(args, nxt_bool_t);
+            ui64 = (uint64_t) va_arg(args, njs_bool_t);
             sign = 0;
             goto number;
 
@@ -310,15 +310,15 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
                 f = -f;
             }
 
-            if (nxt_slow_path(isnan(f))) {
+            if (njs_slow_path(isnan(f))) {
                 p = (u_char *) nan;
-                length = nxt_length(nan);
+                length = njs_length(nan);
 
                 goto copy;
 
-            } else if (nxt_slow_path(isinf(f))) {
+            } else if (njs_slow_path(isinf(f))) {
                 p = (u_char *) infinity;
-                length = nxt_length(infinity);
+                length = njs_length(infinity);
 
                 goto copy;
             }
@@ -341,7 +341,7 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
                 }
             }
 
-            buf = nxt_number(&spf, buf, i);
+            buf = njs_number(&spf, buf, i);
 
             if (spf.frac_width > 0) {
 
@@ -351,16 +351,16 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
                     spf.hex = NULL;
                     spf.padding = '0';
                     spf.width = spf.frac_width;
-                    buf = nxt_integer(&spf, buf, frac);
+                    buf = njs_integer(&spf, buf, frac);
                 }
 
             } else if (spf.frac_width < 0) {
                 f = modf(f, &i);
 
-                if (!nxt_double_is_zero(f) && buf < end) {
+                if (!njs_double_is_zero(f) && buf < end) {
                     *buf++ = '.';
 
-                    while (!nxt_double_is_zero(f) && buf < end) {
+                    while (!njs_double_is_zero(f) && buf < end) {
                         f *= 10;
                         f = modf(f, &i);
                         *buf++ = (u_char) i + '0';
@@ -375,7 +375,7 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
             sign = 0;
             spf.hex = HEXADECIMAL;
             /*
-             * spf.width = NXT_PTR_SIZE * 2;
+             * spf.width = NJS_PTR_SIZE * 2;
              * spf.padding = '0';
              */
             goto number;
@@ -419,14 +419,14 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
             }
         }
 
-        buf = nxt_integer(&spf, buf, ui64);
+        buf = njs_integer(&spf, buf, ui64);
 
         fmt++;
         continue;
 
     copy:
 
-        buf = nxt_cpymem(buf, p, nxt_min((size_t) (end - buf), length));
+        buf = njs_cpymem(buf, p, njs_min((size_t) (end - buf), length));
         continue;
     }
 
@@ -435,17 +435,17 @@ nxt_vsprintf(u_char *buf, u_char *end, const char *fmt, va_list args)
 
 
 static u_char *
-nxt_integer(nxt_sprintf_t *spf, u_char *buf, uint64_t ui64)
+njs_integer(njs_sprintf_t *spf, u_char *buf, uint64_t ui64)
 {
     u_char  *p, *end;
     size_t  length;
-    u_char  temp[NXT_INT64_T_LEN];
+    u_char  temp[NJS_INT64_T_LEN];
 
-    p = temp + NXT_INT64_T_LEN;
+    p = temp + NJS_INT64_T_LEN;
 
     if (spf->hex == NULL) {
 
-#if (NXT_32BIT)
+#if (NJS_32BIT)
 
         for ( ;; ) {
             u_char    *start;
@@ -502,7 +502,7 @@ nxt_integer(nxt_sprintf_t *spf, u_char *buf, uint64_t ui64)
             ui64 /= 1000000000;
         }
 
-#else  /* NXT_64BIT */
+#else  /* NJS_64BIT */
 
         do {
             *(--p) = (u_char) (ui64 % 10 + '0');
@@ -523,9 +523,9 @@ nxt_integer(nxt_sprintf_t *spf, u_char *buf, uint64_t ui64)
 
     if (spf->width != 0) {
 
-        length = (temp + NXT_INT64_T_LEN) - p;
+        length = (temp + NJS_INT64_T_LEN) - p;
         end = buf + (spf->width - length);
-        end = nxt_min(end, spf->end);
+        end = njs_min(end, spf->end);
 
         while (buf < end) {
             *buf++ = spf->padding;
@@ -534,9 +534,9 @@ nxt_integer(nxt_sprintf_t *spf, u_char *buf, uint64_t ui64)
 
     /* Number copying. */
 
-    length = (temp + NXT_INT64_T_LEN) - p;
+    length = (temp + NJS_INT64_T_LEN) - p;
     end = buf + length;
-    end = nxt_min(end, spf->end);
+    end = njs_min(end, spf->end);
 
     while (buf < end) {
         *buf++ = *p++;
@@ -547,25 +547,25 @@ nxt_integer(nxt_sprintf_t *spf, u_char *buf, uint64_t ui64)
 
 
 static u_char *
-nxt_number(nxt_sprintf_t *spf, u_char *buf, double n)
+njs_number(njs_sprintf_t *spf, u_char *buf, double n)
 {
     u_char  *p, *end;
     size_t  length;
-    u_char  temp[NXT_DOUBLE_LEN];
+    u_char  temp[NJS_DOUBLE_LEN];
 
-    p = temp + NXT_DOUBLE_LEN;
+    p = temp + NJS_DOUBLE_LEN;
 
     do {
         *(--p) = (u_char) (fmod(n, 10) + '0');
         n = trunc(n / 10);
-    } while (!nxt_double_is_zero(n));
+    } while (!njs_double_is_zero(n));
 
     /* Zero or space padding. */
 
     if (spf->width != 0) {
-        length = (temp + NXT_DOUBLE_LEN) - p;
+        length = (temp + NJS_DOUBLE_LEN) - p;
         end = buf + (spf->width - length);
-        end = nxt_min(end, spf->end);
+        end = njs_min(end, spf->end);
 
         while (buf < end) {
             *buf++ = spf->padding;
@@ -574,10 +574,10 @@ nxt_number(nxt_sprintf_t *spf, u_char *buf, double n)
 
     /* Number copying. */
 
-    length = (temp + NXT_DOUBLE_LEN) - p;
+    length = (temp + NJS_DOUBLE_LEN) - p;
 
     end = buf + length;
-    end = nxt_min(end, spf->end);
+    end = njs_min(end, spf->end);
 
     while (buf < end) {
         *buf++ = *p++;
@@ -587,22 +587,22 @@ nxt_number(nxt_sprintf_t *spf, u_char *buf, double n)
 }
 
 
-NXT_EXPORT
-int nxt_dprint(int fd, u_char *buf, size_t size)
+NJS_EXPORT
+int njs_dprint(int fd, u_char *buf, size_t size)
 {
     return write(fd, buf, size);
 }
 
 
 int
-nxt_dprintf(int fd, const char *fmt, ...)
+njs_dprintf(int fd, const char *fmt, ...)
 {
     size_t   size;
     u_char   text[2048], *p;
     va_list  args;
 
     va_start(args, fmt);
-    p = nxt_vsprintf(text, text + sizeof(text), fmt, args);
+    p = njs_vsprintf(text, text + sizeof(text), fmt, args);
     va_end(args);
 
     size = p - text;
diff --git a/src/njs_sprintf.h b/src/njs_sprintf.h
new file mode 100644 (file)
index 0000000..7a44a32
--- /dev/null
@@ -0,0 +1,27 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_SPRINTF_H_INCLUDED_
+#define _NJS_SPRINTF_H_INCLUDED_
+
+
+NJS_EXPORT u_char *njs_sprintf(u_char *buf, u_char *end, const char *fmt, ...);
+NJS_EXPORT u_char *njs_vsprintf(u_char *buf, u_char *end, const char *fmt,
+    va_list args);
+
+NJS_EXPORT int njs_dprint(int fd, u_char *buf, size_t size);
+NJS_EXPORT int njs_dprintf(int fd, const char *fmt, ...);
+
+#define njs_print(buf, size)                                                 \
+    njs_dprint(STDOUT_FILENO, (u_char *) buf, size)
+
+#define njs_printf(fmt, ...)                                                 \
+    njs_dprintf(STDOUT_FILENO, fmt, ##__VA_ARGS__)
+
+#define njs_stderror(fmt, ...)                                               \
+    njs_dprintf(STDERR_FILENO, fmt, ##__VA_ARGS__)
+
+#endif /* _NJS_SPRINTF_H_INCLUDED_ */
similarity index 63%
rename from nxt/nxt_string.h
rename to src/njs_str.h
index d7c92024841353051d21987696fbac92fdf8b764..5bc013dede101d5a6d09ef8a4b0b7e7fdc110074 100644 (file)
@@ -4,45 +4,45 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#ifndef _NXT_STRING_H_INCLUDED_
-#define _NXT_STRING_H_INCLUDED_
+#ifndef _NJS_STR_H_INCLUDED_
+#define _NJS_STR_H_INCLUDED_
 
 
 typedef struct {
     size_t  length;
     u_char  *start;
-} nxt_str_t;
+} njs_str_t;
 
 
 /*
  * C99 allows to assign struct as compound literal with struct name cast only.
  * SunC however issues error on the cast in struct static initialization:
  *   non-constant initializer: op "NAME"
- * So a separate nxt_string_value() macro is intended to use in assignment.
+ * So a separate njs_str_value() macro is intended to use in assignment.
  */
 
-#define nxt_length(s)        (sizeof(s) - 1)
-#define nxt_string(s)        { nxt_length(s), (u_char *) s }
-#define nxt_null_string      { 0, NULL }
-#define nxt_string_value(s)  (nxt_str_t) nxt_string(s)
+#define njs_length(s)        (sizeof(s) - 1)
+#define njs_str(s)           { njs_length(s), (u_char *) s }
+#define njs_null_str         { 0, NULL }
+#define njs_str_value(s)     (njs_str_t) njs_str(s)
 
 
-nxt_inline u_char
-nxt_lower_case(u_char c)
+njs_inline u_char
+njs_lower_case(u_char c)
 {
     return (u_char) ((c >= 'A' && c <= 'Z') ? c | 0x20 : c);
 }
 
 
-nxt_inline u_char
-nxt_upper_case(u_char c)
+njs_inline u_char
+njs_upper_case(u_char c)
 {
     return (u_char) ((c >= 'a' && c <= 'z') ? c & 0xDF : c);
 }
 
 
-nxt_inline nxt_bool_t
-nxt_is_whitespace(u_char c)
+njs_inline njs_bool_t
+njs_is_whitespace(u_char c)
 {
     switch (c) {
     case 0x09:  /* <TAB>  */
@@ -60,8 +60,8 @@ nxt_is_whitespace(u_char c)
 }
 
 
-nxt_inline u_char *
-nxt_strlchr(u_char *p, u_char *last, u_char c)
+njs_inline u_char *
+njs_strlchr(u_char *p, u_char *last, u_char c)
 {
     while (p < last) {
 
@@ -77,46 +77,46 @@ nxt_strlchr(u_char *p, u_char *last, u_char c)
 
 
 #define                                                                       \
-nxt_strlen(s)                                                                 \
+njs_strlen(s)                                                                 \
     strlen((char *) s)
 
 
 #define                                                                       \
-nxt_cpymem(dst, src, n)                                                       \
+njs_cpymem(dst, src, n)                                                       \
     (((u_char *) memcpy(dst, src, n)) + (n))
 
 
 #define                                                                       \
-nxt_strncmp(s1, s2, n)                                                        \
+njs_strncmp(s1, s2, n)                                                        \
     strncmp((char *) s1, (char *) s2, n)
 
 
 #define                                                                       \
-nxt_strchr(s1, c)                                                             \
+njs_strchr(s1, c)                                                             \
     (u_char *) strchr((const char *) s1, (int) c)
 
 
 #define                                                                       \
-nxt_memset(buf, c, length)                                                    \
+njs_memset(buf, c, length)                                                    \
     (void) memset(buf, c, length)
 
 
 #define                                                                       \
-nxt_memzero(buf, length)                                                      \
+njs_memzero(buf, length)                                                      \
     (void) memset(buf, 0, length)
 
 
-#if (NXT_HAVE_EXPLICIT_BZERO && !NXT_HAVE_MEMORY_SANITIZER)
+#if (NJS_HAVE_EXPLICIT_BZERO && !NJS_HAVE_MEMORY_SANITIZER)
 #define                                                                       \
-nxt_explicit_memzero(buf, length)                                             \
+njs_explicit_memzero(buf, length)                                             \
     explicit_bzero(buf, length)
-#elif (NXT_HAVE_EXPLICIT_MEMSET)
+#elif (NJS_HAVE_EXPLICIT_MEMSET)
 #define                                                                       \
-nxt_explicit_memzero(buf, length)                                             \
+njs_explicit_memzero(buf, length)                                             \
     (void) explicit_memset(buf, 0, length)
 #else
-nxt_inline void
-nxt_explicit_memzero(void *buf, size_t length)
+njs_inline void
+njs_explicit_memzero(void *buf, size_t length)
 {
     volatile u_char  *p = (volatile u_char *) buf;
 
@@ -129,9 +129,9 @@ nxt_explicit_memzero(void *buf, size_t length)
 
 
 #define                                                                       \
-nxt_strstr_eq(s1, s2)                                                         \
+njs_strstr_eq(s1, s2)                                                         \
     (((s1)->length == (s2)->length)                                           \
      && (memcmp((s1)->start, (s2)->start, (s1)->length) == 0))
 
 
-#endif /* _NXT_STRING_H_INCLUDED_ */
+#endif /* _NJS_STR_H_INCLUDED_ */
similarity index 86%
rename from njs/njs_string.c
rename to src/njs_string.c
index 218d39fa74adeac28f715a2a25d321bfcb269b7c..5cc11d1dfc883d2c148ba8dff2fb9843abfa1ebb 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_regexp.h>
 #include <njs_regexp_pattern.h>
 #include <string.h>
@@ -36,46 +36,46 @@ typedef struct {
 typedef struct {
     njs_value_t                retval;
 
-    nxt_array_t                parts;
+    njs_arr_t                  parts;
     njs_string_replace_part_t  array[3];
     njs_string_replace_part_t  *part;
 
-    nxt_array_t                *substitutions;
+    njs_arr_t                  *substitutions;
     njs_function_t             *function;
 
-    nxt_regex_match_data_t     *match_data;
+    njs_regex_match_data_t     *match_data;
 
-    nxt_bool_t                 empty;
+    njs_bool_t                 empty;
 
     njs_utf8_t                 utf8:8;
     njs_regexp_utf8_t          type:8;
 } njs_string_replace_t;
 
 
-static void njs_encode_base64_core(nxt_str_t *dst, const nxt_str_t *src,
-    const u_char *basis, nxt_uint_t padding);
+static void njs_encode_base64_core(njs_str_t *dst, const njs_str_t *src,
+    const u_char *basis, njs_uint_t padding);
 static njs_ret_t njs_decode_base64_core(njs_vm_t *vm,
-    njs_value_t *value, const nxt_str_t *src, const u_char *basis);
+    njs_value_t *value, const njs_str_t *src, const u_char *basis);
 static void njs_string_slice_prop(njs_string_prop_t *string,
-    njs_slice_prop_t *slice, njs_value_t *args, nxt_uint_t nargs);
+    njs_slice_prop_t *slice, njs_value_t *args, njs_uint_t nargs);
 static void njs_string_slice_args(njs_slice_prop_t *slice, njs_value_t *args,
-    nxt_uint_t nargs);
+    njs_uint_t nargs);
 static njs_ret_t njs_string_from_char_code(njs_vm_t *vm,
-    njs_value_t *args, nxt_uint_t nargs, njs_index_t unused);
+    njs_value_t *args, njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_string_from_code_point(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_string_bytes_from(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_string_bytes_from_array(njs_vm_t *vm,
     const njs_value_t *value);
 static njs_ret_t njs_string_bytes_from_string(njs_vm_t *vm,
-    const njs_value_t *args, nxt_uint_t nargs);
+    const njs_value_t *args, njs_uint_t nargs);
 static njs_ret_t njs_string_starts_or_ends_with(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, nxt_bool_t starts);
+    njs_uint_t nargs, njs_bool_t starts);
 static njs_ret_t njs_string_trim(njs_vm_t *vm, njs_value_t *value,
-    nxt_uint_t mode);
+    njs_uint_t mode);
 static njs_ret_t njs_string_prototype_pad(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, nxt_bool_t pad_start);
+    njs_uint_t nargs, njs_bool_t pad_start);
 static njs_ret_t njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args,
     njs_regexp_pattern_t *pattern);
 static njs_ret_t njs_string_split_part_add(njs_vm_t *vm, njs_array_t *array,
@@ -83,7 +83,7 @@ static njs_ret_t njs_string_split_part_add(njs_vm_t *vm, njs_array_t *array,
 static njs_ret_t njs_string_replace_regexp(njs_vm_t *vm, njs_value_t *args,
     njs_string_replace_t *r);
 static njs_ret_t njs_string_replace_regexp_function(njs_vm_t *vm,
-    njs_value_t *args, njs_string_replace_t *r, int *captures, nxt_uint_t n);
+    njs_value_t *args, njs_string_replace_t *r, int *captures, njs_uint_t n);
 static njs_ret_t njs_string_replace_regexp_join(njs_vm_t *vm,
     njs_string_replace_t *r);
 static njs_ret_t njs_string_replace_search(njs_vm_t *vm, njs_value_t *args,
@@ -92,7 +92,7 @@ static njs_ret_t njs_string_replace_search_function(njs_vm_t *vm,
     njs_value_t *args, njs_string_replace_t *r);
 static njs_ret_t njs_string_replace_parse(njs_vm_t *vm,
     njs_string_replace_t *r, u_char *p, u_char *end, size_t size,
-    nxt_uint_t ncaptures);
+    njs_uint_t ncaptures);
 static njs_ret_t njs_string_replace_substitute(njs_vm_t *vm,
     njs_string_replace_t *r, int *captures);
 static njs_ret_t njs_string_replace_join(njs_vm_t *vm, njs_string_replace_t *r);
@@ -128,7 +128,7 @@ njs_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,
 
         while (size != 0) {
             /* The maximum size is just 14 bytes. */
-            nxt_pragma_loop_disable_vectorization;
+            njs_pragma_loop_disable_vectorization;
 
             *dst++ = *src++;
             size--;
@@ -144,10 +144,10 @@ njs_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,
         value->long_string.external = 0xff;
         value->long_string.size = size;
 
-        string = nxt_mp_alloc(vm->mem_pool, sizeof(njs_string_t));
-        if (nxt_slow_path(string == NULL)) {
+        string = njs_mp_alloc(vm->mem_pool, sizeof(njs_string_t));
+        if (njs_slow_path(string == NULL)) {
             njs_memory_error(vm);
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         value->long_string.data = string;
@@ -157,7 +157,7 @@ njs_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,
         string->retain = 1;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -169,12 +169,12 @@ njs_string_new(njs_vm_t *vm, njs_value_t *value, const u_char *start,
 
     p = njs_string_alloc(vm, value, size, length);
 
-    if (nxt_fast_path(p != NULL)) {
+    if (njs_fast_path(p != NULL)) {
         memcpy(p, start, size);
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -185,7 +185,7 @@ njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint64_t size,
     uint32_t      total, map_offset, *map;
     njs_string_t  *string;
 
-    if (nxt_slow_path(size > NJS_STRING_MAX_LENGTH)) {
+    if (njs_slow_path(size > NJS_STRING_MAX_LENGTH)) {
         njs_range_error(vm, "invalid string length");
         return NULL;
     }
@@ -218,9 +218,9 @@ njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint64_t size,
         total = size;
     }
 
-    string = nxt_mp_alloc(vm->mem_pool, sizeof(njs_string_t) + total);
+    string = njs_mp_alloc(vm->mem_pool, sizeof(njs_string_t) + total);
 
-    if (nxt_fast_path(string != NULL)) {
+    if (njs_fast_path(string != NULL)) {
         value->long_string.data = string;
 
         string->start = (u_char *) string + sizeof(njs_string_t);
@@ -257,7 +257,7 @@ njs_string_truncate(njs_value_t *value, uint32_t size)
 
             while (size != 0) {
                 /* The maximum size is just 14 bytes. */
-                nxt_pragma_loop_disable_vectorization;
+                njs_pragma_loop_disable_vectorization;
 
                 *dst++ = *src++;
                 size--;
@@ -271,11 +271,11 @@ njs_string_truncate(njs_value_t *value, uint32_t size)
 
 
 njs_ret_t
-njs_string_hex(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
+njs_string_hex(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
 {
     u_char        *p, c;
     size_t        len;
-    nxt_uint_t    i;
+    njs_uint_t    i;
     const u_char  *start;
 
     static const u_char  hex[16] = "0123456789abcdef";
@@ -285,22 +285,22 @@ njs_string_hex(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
 
     p = njs_string_alloc(vm, value, len * 2, len * 2);
 
-    if (nxt_fast_path(p != NULL)) {
+    if (njs_fast_path(p != NULL)) {
         for (i = 0; i < len; i++) {
             c = start[i];
             *p++ = hex[c >> 4];
             *p++ = hex[c & 0x0f];
         }
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 static void
-njs_encode_base64(nxt_str_t *dst, const nxt_str_t *src)
+njs_encode_base64(njs_str_t *dst, const njs_str_t *src)
 {
     static u_char   basis64[] =
         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -310,7 +310,7 @@ njs_encode_base64(nxt_str_t *dst, const nxt_str_t *src)
 
 
 static void
-njs_encode_base64url(nxt_str_t *dst, const nxt_str_t *src)
+njs_encode_base64url(njs_str_t *dst, const njs_str_t *src)
 {
     static u_char   basis64[] =
         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
@@ -320,8 +320,8 @@ njs_encode_base64url(nxt_str_t *dst, const nxt_str_t *src)
 
 
 static void
-njs_encode_base64_core(nxt_str_t *dst, const nxt_str_t *src,
-    const u_char *basis, nxt_bool_t padding)
+njs_encode_base64_core(njs_str_t *dst, const njs_str_t *src,
+    const u_char *basis, njs_bool_t padding)
 {
    u_char  *d, *s, c0, c1, c2;
    size_t  len;
@@ -373,37 +373,37 @@ njs_encode_base64_core(nxt_str_t *dst, const nxt_str_t *src,
 
 
 njs_ret_t
-njs_string_base64(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
+njs_string_base64(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
 {
-    nxt_str_t  dst;
+    njs_str_t  dst;
 
-    if (nxt_slow_path(src->length == 0)) {
+    if (njs_slow_path(src->length == 0)) {
         vm->retval = njs_string_empty;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     dst.length = njs_base64_encoded_length(src->length);
 
     dst.start = njs_string_alloc(vm, &vm->retval, dst.length, dst.length);
-    if (nxt_slow_path(dst.start == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(dst.start == NULL)) {
+        return NJS_ERROR;
     }
 
     njs_encode_base64(&dst, src);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t
-njs_string_base64url(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
+njs_string_base64url(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
 {
     size_t     padding;
-    nxt_str_t  dst;
+    njs_str_t  dst;
 
-    if (nxt_slow_path(src->length == 0)) {
+    if (njs_slow_path(src->length == 0)) {
         vm->retval = njs_string_empty;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     padding = src->length % 3;
@@ -416,13 +416,13 @@ njs_string_base64url(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
     dst.length = njs_base64_encoded_length(src->length) - padding;
 
     dst.start = njs_string_alloc(vm, &vm->retval, dst.length, dst.length);
-    if (nxt_slow_path(dst.start == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(dst.start == NULL)) {
+        return NJS_ERROR;
     }
 
     njs_encode_base64url(&dst, src);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -455,9 +455,9 @@ njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string, njs_value_t *value)
         length = value->short_string.length;
 
         if (length == 0 && length != size) {
-            length = nxt_utf8_length(value->short_string.start, size);
+            length = njs_utf8_length(value->short_string.start, size);
 
-            if (nxt_slow_path(length < 0)) {
+            if (njs_slow_path(length < 0)) {
                 /* Invalid UTF-8 string. */
                 return length;
             }
@@ -471,10 +471,10 @@ njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string, njs_value_t *value)
         length = value->long_string.data->length;
 
         if (length == 0 && length != size) {
-            length = nxt_utf8_length(string->start, size);
+            length = njs_utf8_length(string->start, size);
 
             if (length != size) {
-                if (nxt_slow_path(length < 0)) {
+                if (njs_slow_path(length < 0)) {
                     /* Invalid UTF-8 string. */
                     return length;
                 }
@@ -487,10 +487,10 @@ njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string, njs_value_t *value)
                     map_offset = njs_string_map_offset(size);
                     new_size = map_offset + njs_string_map_size(length);
 
-                    start = nxt_mp_alloc(vm->mem_pool, new_size);
-                    if (nxt_slow_path(start == NULL)) {
+                    start = njs_mp_alloc(vm->mem_pool, new_size);
+                    if (njs_slow_path(start == NULL)) {
                         njs_memory_error(vm);
-                        return NXT_ERROR;
+                        return NJS_ERROR;
                     }
 
                     memcpy(start, string->start, size);
@@ -539,7 +539,7 @@ njs_string_prop(njs_string_prop_t *string, const njs_value_t *value)
 
 
 njs_ret_t
-njs_string_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_object_t       *object;
@@ -554,8 +554,8 @@ njs_string_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (vm->top_frame->ctor) {
         object = njs_object_value_alloc(vm, value, value->type);
-        if (nxt_slow_path(object == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(object == NULL)) {
+            return NJS_ERROR;
         }
 
         njs_set_type_object(&vm->retval, object, NJS_OBJECT_STRING);
@@ -564,7 +564,7 @@ njs_string_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         vm->retval = *value;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -624,9 +624,9 @@ static const njs_object_prop_t  njs_string_constructor_properties[] =
 
 
 const njs_object_init_t  njs_string_constructor_init = {
-    nxt_string("String"),
+    njs_str("String"),
     njs_string_constructor_properties,
-    nxt_nitems(njs_string_constructor_properties),
+    njs_nitems(njs_string_constructor_properties),
 };
 
 
@@ -645,11 +645,11 @@ njs_string_instance_length(njs_vm_t *vm, njs_value_t *value,
      */
     length = 0;
 
-    if (nxt_slow_path(njs_is_object(value))) {
+    if (njs_slow_path(njs_is_object(value))) {
         proto = njs_object(value);
 
         do {
-            if (nxt_fast_path(proto->type == NJS_OBJECT_STRING)) {
+            if (njs_fast_path(proto->type == NJS_OBJECT_STRING)) {
                 break;
             }
 
@@ -678,11 +678,11 @@ njs_string_instance_length(njs_vm_t *vm, njs_value_t *value,
 
     njs_release(vm, value);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-nxt_bool_t
+njs_bool_t
 njs_string_eq(const njs_value_t *v1, const njs_value_t *v2)
 {
     size_t        size, length1, length2;
@@ -735,11 +735,11 @@ njs_string_eq(const njs_value_t *v1, const njs_value_t *v2)
 }
 
 
-nxt_int_t
+njs_int_t
 njs_string_cmp(const njs_value_t *v1, const njs_value_t *v2)
 {
     size_t        size, size1, size2;
-    nxt_int_t     ret;
+    njs_int_t     ret;
     const u_char  *start1, *start2;
 
     size1 = v1->short_string.size;
@@ -762,7 +762,7 @@ njs_string_cmp(const njs_value_t *v1, const njs_value_t *v2)
         start2 = v2->long_string.data->start;
     }
 
-    size = nxt_min(size1, size2);
+    size = njs_min(size1, size2);
 
     ret = memcmp(start1, start2, size);
 
@@ -775,7 +775,7 @@ njs_string_cmp(const njs_value_t *v1, const njs_value_t *v2)
 
 
 static njs_ret_t
-njs_string_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_value_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_value_t  *value;
@@ -790,13 +790,13 @@ njs_string_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         } else {
             njs_type_error(vm, "unexpected value type:%s",
                            njs_type_string(value->type));
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
     vm->retval = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -809,15 +809,15 @@ njs_string_prototype_value_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 static njs_ret_t
 njs_string_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
-    nxt_int_t          ret;
-    nxt_str_t          enc, str;
+    njs_int_t          ret;
+    njs_str_t          enc, str;
     njs_value_t        value;
     njs_string_prop_t  string;
 
     ret = njs_string_prototype_value_of(vm, args, nargs, unused);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -825,7 +825,7 @@ njs_string_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
         return NJS_OK;
     }
 
-    if (nxt_slow_path(!njs_is_string(&args[1]))) {
+    if (njs_slow_path(!njs_is_string(&args[1]))) {
         njs_type_error(vm, "encoding must be a string");
         return NJS_ERROR;
     }
@@ -834,7 +834,7 @@ njs_string_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
 
     (void) njs_string_prop(&string, &value);
 
-    if (nxt_slow_path(string.length != 0)) {
+    if (njs_slow_path(string.length != 0)) {
         njs_type_error(vm, "argument must be a byte string");
         return NJS_ERROR;
     }
@@ -866,24 +866,24 @@ njs_string_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
  */
 
 njs_ret_t
-njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char             *p, *start;
     uint64_t           size, length, mask;
     njs_ret_t          ret;
-    nxt_uint_t         i;
+    njs_uint_t         i;
     njs_string_prop_t  string;
 
     if (njs_is_null_or_undefined(&args[0])) {
         njs_type_error(vm, "\"this\" argument is null or undefined");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     for (i = 0; i < nargs; i++) {
         if (!njs_is_string(&args[i])) {
             ret = njs_value_to_string(vm, &args[i], &args[i]);
-            if (ret != NXT_OK) {
+            if (ret != NJS_OK) {
                 return ret;
             }
         }
@@ -891,7 +891,7 @@ njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     if (nargs == 1) {
         njs_string_copy(&vm->retval, &args[0]);
-        return NXT_OK;
+        return NJS_OK;
     }
 
     size = 0;
@@ -912,8 +912,8 @@ njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     length &= mask;
 
     start = njs_string_alloc(vm, &vm->retval, size, length);
-    if (nxt_slow_path(start == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(start == NULL)) {
+        return NJS_ERROR;
     }
 
     p = start;
@@ -925,7 +925,7 @@ njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         p += string.size;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -936,7 +936,7 @@ njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 static njs_ret_t
 njs_string_prototype_from_utf8(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     ssize_t            length;
     njs_slice_prop_t   slice;
@@ -951,7 +951,7 @@ njs_string_prototype_from_utf8(njs_vm_t *vm, njs_value_t *args,
 
     string.start += slice.start;
 
-    length = nxt_utf8_length(string.start, slice.length);
+    length = njs_utf8_length(string.start, slice.length);
 
     if (length >= 0) {
         return njs_string_new(vm, &vm->retval, string.start, slice.length,
@@ -960,7 +960,7 @@ njs_string_prototype_from_utf8(njs_vm_t *vm, njs_value_t *args,
 
     vm->retval = njs_value_null;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -970,7 +970,7 @@ njs_string_prototype_from_utf8(njs_vm_t *vm, njs_value_t *args,
  */
 
 static njs_ret_t
-njs_string_prototype_to_utf8(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_to_utf8(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_slice_prop_t   slice;
@@ -994,7 +994,7 @@ njs_string_prototype_to_utf8(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 static njs_ret_t
 njs_string_prototype_from_bytes(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     u_char             *p, *s, *start, *end;
     size_t             size;
@@ -1018,7 +1018,7 @@ njs_string_prototype_from_bytes(njs_vm_t *vm, njs_value_t *args,
 
     start = njs_string_alloc(vm, &vm->retval, size, slice.length);
 
-    if (nxt_fast_path(start != NULL)) {
+    if (njs_fast_path(start != NULL)) {
 
         if (size == slice.length) {
             memcpy(start, string.start, size);
@@ -1028,14 +1028,14 @@ njs_string_prototype_from_bytes(njs_vm_t *vm, njs_value_t *args,
             end = string.start + slice.length;
 
             for (p = string.start; p < end; p++) {
-                s = nxt_utf8_encode(s, *p);
+                s = njs_utf8_encode(s, *p);
             }
         }
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -1047,7 +1047,7 @@ njs_string_prototype_from_bytes(njs_vm_t *vm, njs_value_t *args,
  */
 
 static njs_ret_t
-njs_string_prototype_to_bytes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_to_bytes(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char             *p;
@@ -1066,7 +1066,7 @@ njs_string_prototype_to_bytes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     p = njs_string_alloc(vm, &vm->retval, slice.length, 0);
 
-    if (nxt_fast_path(p != NULL)) {
+    if (njs_fast_path(p != NULL)) {
 
         if (string.length != string.size) {
             /* UTF-8 string. */
@@ -1077,13 +1077,13 @@ njs_string_prototype_to_bytes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             length = slice.length;
 
             while (length != 0 && s < end) {
-                byte = nxt_utf8_decode(&s, end);
+                byte = njs_utf8_decode(&s, end);
 
-                if (nxt_slow_path(byte > 0xFF)) {
+                if (njs_slow_path(byte > 0xFF)) {
                     njs_release(vm, &vm->retval);
                     vm->retval = njs_value_null;
 
-                    return NXT_OK;
+                    return NJS_OK;
                 }
 
                 *p++ = (u_char) byte;
@@ -1095,10 +1095,10 @@ njs_string_prototype_to_bytes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             memcpy(p, string.start + slice.start, slice.length);
         }
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -1108,7 +1108,7 @@ njs_string_prototype_to_bytes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
  */
 
 static njs_ret_t
-njs_string_prototype_slice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_slice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     njs_slice_prop_t   slice;
@@ -1127,7 +1127,7 @@ njs_string_prototype_slice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 static njs_ret_t
 njs_string_prototype_substring(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     ssize_t            start, end, length;
     njs_slice_prop_t   slice;
@@ -1182,7 +1182,7 @@ njs_string_prototype_substring(njs_vm_t *vm, njs_value_t *args,
  */
 
 static njs_ret_t
-njs_string_prototype_substr(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_substr(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     ssize_t            start, length, n;
@@ -1233,7 +1233,7 @@ njs_string_prototype_substr(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 static njs_ret_t
-njs_string_prototype_char_at(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_char_at(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     ssize_t            start, length;
@@ -1259,7 +1259,7 @@ njs_string_prototype_char_at(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 static void
 njs_string_slice_prop(njs_string_prop_t *string, njs_slice_prop_t *slice,
-    njs_value_t *args, nxt_uint_t nargs)
+    njs_value_t *args, njs_uint_t nargs)
 {
     slice->string_length = njs_string_prop(string, &args[0]);
 
@@ -1269,7 +1269,7 @@ njs_string_slice_prop(njs_string_prop_t *string, njs_slice_prop_t *slice,
 
 static void
 njs_string_slice_args(njs_slice_prop_t *slice, njs_value_t *args,
-    nxt_uint_t nargs)
+    njs_uint_t nargs)
 {
     ssize_t            start, end, length;
     const njs_value_t  *value;
@@ -1354,7 +1354,7 @@ njs_string_slice_string_prop(njs_string_prop_t *dst,
             n = length;
 
             while (n != 0 && p < end) {
-                p = nxt_utf8_next(p, end);
+                p = njs_utf8_next(p, end);
                 n--;
             }
 
@@ -1381,19 +1381,19 @@ njs_string_slice(njs_vm_t *vm, njs_value_t *dst,
 
     njs_string_slice_string_prop(&prop, string, slice);
 
-    if (nxt_fast_path(prop.size != 0)) {
+    if (njs_fast_path(prop.size != 0)) {
         return njs_string_new(vm, dst, prop.start, prop.size, prop.length);
     }
 
     *dst = njs_string_empty;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_string_prototype_char_code_at(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double             num;
     ssize_t            index, length;
@@ -1405,7 +1405,7 @@ njs_string_prototype_char_code_at(njs_vm_t *vm, njs_value_t *args,
 
     index = njs_primitive_value_to_integer(njs_arg(args, nargs, 1));
 
-    if (nxt_slow_path(index < 0 || index >= length)) {
+    if (njs_slow_path(index < 0 || index >= length)) {
         num = NAN;
         goto done;
     }
@@ -1418,7 +1418,7 @@ njs_string_prototype_char_code_at(njs_vm_t *vm, njs_value_t *args,
         /* UTF-8 string. */
         end = string.start + string.size;
         start = njs_string_offset(string.start, end, index);
-        code = nxt_utf8_decode(&start, end);
+        code = njs_utf8_decode(&start, end);
     }
 
     num = code;
@@ -1427,7 +1427,7 @@ done:
 
     njs_set_number(&vm->retval, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -1441,7 +1441,7 @@ done:
  */
 
 static njs_ret_t
-njs_string_bytes_from(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_bytes_from(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     const njs_value_t  *value;
@@ -1477,14 +1477,14 @@ njs_string_bytes_from_array(njs_vm_t *vm, const njs_value_t *value)
     for (i = 0; i < length; i++) {
         if (!njs_is_numeric(&array->start[i])) {
             ret = njs_value_to_numeric(vm, &array->start[i], &array->start[i]);
-            if (ret != NXT_OK) {
+            if (ret != NJS_OK) {
                 return ret;
             }
         }
     }
 
     p = njs_string_alloc(vm, &vm->retval, length, 0);
-    if (nxt_slow_path(p == NULL)) {
+    if (njs_slow_path(p == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1502,14 +1502,14 @@ njs_string_bytes_from_array(njs_vm_t *vm, const njs_value_t *value)
 
 static njs_ret_t
 njs_string_bytes_from_string(njs_vm_t *vm, const njs_value_t *args,
-    nxt_uint_t nargs)
+    njs_uint_t nargs)
 {
-    nxt_str_t          enc, str;
+    njs_str_t          enc, str;
     const njs_value_t  *enc_val;
 
     enc_val = njs_arg(args, nargs, 2);
 
-    if (nxt_slow_path(nargs > 1 && !njs_is_string(enc_val))) {
+    if (njs_slow_path(nargs > 1 && !njs_is_string(enc_val))) {
         njs_type_error(vm, "encoding must be a string");
         return NJS_ERROR;
     }
@@ -1534,24 +1534,24 @@ njs_string_bytes_from_string(njs_vm_t *vm, const njs_value_t *args,
 
 
 njs_ret_t
-njs_string_decode_hex(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
+njs_string_decode_hex(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
 {
     u_char        *p, *dst;
     size_t        len;
-    nxt_int_t     c;
-    nxt_uint_t    i, n;
+    njs_int_t     c;
+    njs_uint_t    i, n;
     const u_char  *start;
 
     len = src->length;
     start = src->start;
 
-    if (nxt_slow_path(len == 0)) {
+    if (njs_slow_path(len == 0)) {
         vm->retval = njs_string_empty;
         return NJS_OK;
     }
 
     dst = njs_string_alloc(vm, value, len / 2, 0);
-    if (nxt_slow_path(dst == NULL)) {
+    if (njs_slow_path(dst == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1560,7 +1560,7 @@ njs_string_decode_hex(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
 
     for (i = 0; i < len; i++) {
         c = njs_char_to_hex(start[i]);
-        if (nxt_slow_path(c < 0)) {
+        if (njs_slow_path(c < 0)) {
             break;
         }
 
@@ -1572,7 +1572,7 @@ njs_string_decode_hex(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
         }
     }
 
-    if (nxt_slow_path((size_t) (p - dst) != (len / 2))) {
+    if (njs_slow_path((size_t) (p - dst) != (len / 2))) {
         njs_string_truncate(value, p - dst);
     }
 
@@ -1581,7 +1581,7 @@ njs_string_decode_hex(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
 
 
 njs_ret_t
-njs_string_decode_base64(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
+njs_string_decode_base64(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
 {
     static u_char   basis64[] = {
         77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
@@ -1609,7 +1609,7 @@ njs_string_decode_base64(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src)
 
 njs_ret_t
 njs_string_decode_base64url(njs_vm_t *vm, njs_value_t *value,
-    const nxt_str_t *src)
+    const njs_str_t *src)
 {
     static u_char   basis64[] = {
         77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
@@ -1636,13 +1636,13 @@ njs_string_decode_base64url(njs_vm_t *vm, njs_value_t *value,
 
 
 static njs_ret_t
-njs_decode_base64_core(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src,
+njs_decode_base64_core(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src,
     const u_char *basis)
 {
     size_t  len, dst_len;
     u_char  *d, *s, *dst;
 
-    if (nxt_slow_path(src->length == 0)) {
+    if (njs_slow_path(src->length == 0)) {
         vm->retval = njs_string_empty;
         return NJS_OK;
     }
@@ -1665,7 +1665,7 @@ njs_decode_base64_core(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src,
     dst_len = njs_base64_decoded_length(len);
 
     dst = njs_string_alloc(vm, value, dst_len, 0);
-    if (nxt_slow_path(dst == NULL)) {
+    if (njs_slow_path(dst == NULL)) {
         return NJS_ERROR;
     }
 
@@ -1689,28 +1689,28 @@ njs_decode_base64_core(njs_vm_t *vm, njs_value_t *value, const nxt_str_t *src,
         *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);
     }
 
-    if (nxt_slow_path((size_t) (d - dst) != dst_len)) {
+    if (njs_slow_path((size_t) (d - dst) != dst_len)) {
         njs_string_truncate(value, d - dst);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_string_from_char_code(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     u_char      *p;
     size_t      size;
     uint16_t    code;
     njs_ret_t   ret;
-    nxt_uint_t  i;
+    njs_uint_t  i;
 
     for (i = 1; i < nargs; i++) {
         if (!njs_is_numeric(&args[i])) {
             ret = njs_value_to_numeric(vm, &args[i], &args[i]);
-            if (ret != NXT_OK) {
+            if (ret != NJS_OK) {
                 return ret;
             }
         }
@@ -1720,25 +1720,25 @@ njs_string_from_char_code(njs_vm_t *vm, njs_value_t *args,
 
     for (i = 1; i < nargs; i++) {
         code = njs_number_to_uint16(njs_number(&args[i]));
-        size += nxt_utf8_size_uint16(code);
+        size += njs_utf8_size_uint16(code);
     }
 
     p = njs_string_alloc(vm, &vm->retval, size, nargs - 1);
-    if (nxt_slow_path(p == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(p == NULL)) {
+        return NJS_ERROR;
     }
 
     for (i = 1; i < nargs; i++) {
         code = njs_number_to_uint16(njs_number(&args[i]));
-        p = nxt_utf8_encode(p, code);
+        p = njs_utf8_encode(p, code);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_string_from_code_point(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_from_code_point(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char      *p;
@@ -1746,12 +1746,12 @@ njs_string_from_code_point(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     size_t      size;
     int32_t     code;
     njs_ret_t   ret;
-    nxt_uint_t  i;
+    njs_uint_t  i;
 
     for (i = 1; i < nargs; i++) {
         if (!njs_is_numeric(&args[i])) {
             ret = njs_value_to_numeric(vm, &args[i], &args[i]);
-            if (ret != NXT_OK) {
+            if (ret != NJS_OK) {
                 return ret;
             }
         }
@@ -1771,30 +1771,30 @@ njs_string_from_code_point(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             goto range_error;
         }
 
-        size += nxt_utf8_size(code);
+        size += njs_utf8_size(code);
     }
 
     p = njs_string_alloc(vm, &vm->retval, size, nargs - 1);
-    if (nxt_slow_path(p == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(p == NULL)) {
+        return NJS_ERROR;
     }
 
     for (i = 1; i < nargs; i++) {
-        p = nxt_utf8_encode(p, njs_number(&args[i]));
+        p = njs_utf8_encode(p, njs_number(&args[i]));
     }
 
-    return NXT_OK;
+    return NJS_OK;
 
 range_error:
 
     njs_range_error(vm, NULL);
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 static njs_ret_t
-njs_string_prototype_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_index_of(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     ssize_t            index, length, search_length;
@@ -1843,7 +1843,7 @@ njs_string_prototype_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
                     }
 
                     index++;
-                    p = nxt_utf8_next(p, end);
+                    p = njs_utf8_next(p, end);
                 }
             }
 
@@ -1859,13 +1859,13 @@ done:
 
     njs_set_number(&vm->retval, index);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     double             pos;
     ssize_t            index, start, length, search_length;
@@ -1903,7 +1903,7 @@ njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
     }
 
     if (search_length == 0) {
-        index = nxt_min(index, length);
+        index = njs_min(index, length);
         goto done;
     }
 
@@ -1941,7 +1941,7 @@ njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
 
         while (p > end) {
             index--;
-            p = nxt_utf8_prev(p);
+            p = njs_utf8_prev(p);
         }
 
         for ( ;; ) {
@@ -1955,7 +1955,7 @@ njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
                 break;
             }
 
-            p = nxt_utf8_prev(p);
+            p = njs_utf8_prev(p);
         }
     }
 
@@ -1963,12 +1963,12 @@ done:
 
     njs_set_number(&vm->retval, index);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_string_prototype_includes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_includes(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     ssize_t            index, length, search_length;
@@ -2027,13 +2027,13 @@ done:
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_string_prototype_starts_with(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_string_starts_or_ends_with(vm, args, nargs, 1);
 }
@@ -2041,7 +2041,7 @@ njs_string_prototype_starts_with(njs_vm_t *vm, njs_value_t *args,
 
 static njs_ret_t
 njs_string_prototype_ends_with(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_string_starts_or_ends_with(vm, args, nargs, 0);
 }
@@ -2049,7 +2049,7 @@ njs_string_prototype_ends_with(njs_vm_t *vm, njs_value_t *args,
 
 static njs_ret_t
 njs_string_starts_or_ends_with(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, nxt_bool_t starts)
+    njs_uint_t nargs, njs_bool_t starts)
 {
     ssize_t            index, length, search_length;
     const u_char       *p, *end;
@@ -2116,7 +2116,7 @@ done:
 
     vm->retval = *retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -2128,7 +2128,7 @@ const u_char *
 njs_string_offset(const u_char *start, const u_char *end, size_t index)
 {
     uint32_t    *map;
-    nxt_uint_t  skip;
+    njs_uint_t  skip;
 
     if (index >= NJS_STRING_MAP_STRIDE) {
         map = njs_string_map_start(end);
@@ -2141,7 +2141,7 @@ njs_string_offset(const u_char *start, const u_char *end, size_t index)
     }
 
     for (skip = index % NJS_STRING_MAP_STRIDE; skip != 0; skip--) {
-        start = nxt_utf8_next(start, end);
+        start = njs_utf8_next(start, end);
     }
 
     return start;
@@ -2188,7 +2188,7 @@ njs_string_index(njs_string_prop_t *string, uint32_t offset)
 
     while (p < start) {
         index++;
-        p = nxt_utf8_next(p, end);
+        p = njs_utf8_next(p, end);
     }
 
     return index;
@@ -2200,7 +2200,7 @@ njs_string_offset_map_init(const u_char *start, size_t size)
 {
     size_t        offset;
     uint32_t      *map;
-    nxt_uint_t    n;
+    njs_uint_t    n;
     const u_char  *p, *end;
 
     end = start + size;
@@ -2216,7 +2216,7 @@ njs_string_offset_map_init(const u_char *start, size_t size)
         }
 
         /* The UTF-8 string should be valid since its length is known. */
-        p = nxt_utf8_next(p, end);
+        p = njs_utf8_next(p, end);
 
         offset--;
 
@@ -2232,7 +2232,7 @@ njs_string_offset_map_init(const u_char *start, size_t size)
 
 static njs_ret_t
 njs_string_prototype_to_lower_case(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     size_t             size, length;
     u_char             *p;
@@ -2246,15 +2246,15 @@ njs_string_prototype_to_lower_case(njs_vm_t *vm, njs_value_t *args,
         /* Byte or ASCII string. */
 
         p = njs_string_alloc(vm, &vm->retval, string.size, string.length);
-        if (nxt_slow_path(p == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(p == NULL)) {
+            return NJS_ERROR;
         }
 
         s = string.start;
         size = string.size;
 
         while (size != 0) {
-            *p++ = nxt_lower_case(*s++);
+            *p++ = njs_lower_case(*s++);
             size--;
         }
 
@@ -2267,27 +2267,27 @@ njs_string_prototype_to_lower_case(njs_vm_t *vm, njs_value_t *args,
         size = 0;
 
         while (length != 0) {
-            code = nxt_utf8_lower_case(&s, end);
-            size += nxt_utf8_size(code);
+            code = njs_utf8_lower_case(&s, end);
+            size += njs_utf8_size(code);
             length--;
         }
 
         p = njs_string_alloc(vm, &vm->retval, size, string.length);
-        if (nxt_slow_path(p == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(p == NULL)) {
+            return NJS_ERROR;
         }
 
         s = string.start;
         length = string.length;
 
         while (length != 0) {
-            code = nxt_utf8_lower_case(&s, end);
-            p = nxt_utf8_encode(p, code);
+            code = njs_utf8_lower_case(&s, end);
+            p = njs_utf8_encode(p, code);
             length--;
         }
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -2299,7 +2299,7 @@ njs_string_prototype_to_lower_case(njs_vm_t *vm, njs_value_t *args,
 
 static njs_ret_t
 njs_string_prototype_to_upper_case(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     size_t             size, length;
     u_char             *p;
@@ -2313,15 +2313,15 @@ njs_string_prototype_to_upper_case(njs_vm_t *vm, njs_value_t *args,
         /* Byte or ASCII string. */
 
         p = njs_string_alloc(vm, &vm->retval, string.size, string.length);
-        if (nxt_slow_path(p == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(p == NULL)) {
+            return NJS_ERROR;
         }
 
         s = string.start;
         size = string.size;
 
         while (size != 0) {
-            *p++ = nxt_upper_case(*s++);
+            *p++ = njs_upper_case(*s++);
             size--;
         }
 
@@ -2334,32 +2334,32 @@ njs_string_prototype_to_upper_case(njs_vm_t *vm, njs_value_t *args,
         size = 0;
 
         while (length != 0) {
-            code = nxt_utf8_upper_case(&s, end);
-            size += nxt_utf8_size(code);
+            code = njs_utf8_upper_case(&s, end);
+            size += njs_utf8_size(code);
             length--;
         }
 
         p = njs_string_alloc(vm, &vm->retval, size, string.length);
-        if (nxt_slow_path(p == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(p == NULL)) {
+            return NJS_ERROR;
         }
 
         s = string.start;
         length = string.length;
 
         while (length != 0) {
-            code = nxt_utf8_upper_case(&s, end);
-            p = nxt_utf8_encode(p, code);
+            code = njs_utf8_upper_case(&s, end);
+            p = njs_utf8_encode(p, code);
             length--;
         }
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_string_prototype_trim(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_trim(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return njs_string_trim(vm, &args[0], NJS_TRIM_START|NJS_TRIM_END);
@@ -2368,7 +2368,7 @@ njs_string_prototype_trim(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 static njs_ret_t
 njs_string_prototype_trim_start(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_string_trim(vm, &args[0], NJS_TRIM_START);
 }
@@ -2376,14 +2376,14 @@ njs_string_prototype_trim_start(njs_vm_t *vm, njs_value_t *args,
 
 static njs_ret_t
 njs_string_prototype_trim_end(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_string_trim(vm, &args[0], NJS_TRIM_END);
 }
 
 
 static njs_ret_t
-njs_string_trim(njs_vm_t *vm, njs_value_t *value, nxt_uint_t mode)
+njs_string_trim(njs_vm_t *vm, njs_value_t *value, njs_uint_t mode)
 {
     uint32_t           u, trim, length;
     const u_char       *p, *prev, *start, *end;
@@ -2405,7 +2405,7 @@ njs_string_trim(njs_vm_t *vm, njs_value_t *value, nxt_uint_t mode)
                     goto empty;
                 }
 
-                if (nxt_is_whitespace(*start)) {
+                if (njs_is_whitespace(*start)) {
                     start++;
                     trim++;
                     continue;
@@ -2423,7 +2423,7 @@ njs_string_trim(njs_vm_t *vm, njs_value_t *value, nxt_uint_t mode)
 
                 end--;
 
-                if (nxt_is_whitespace(*end)) {
+                if (njs_is_whitespace(*end)) {
                     trim++;
                     continue;
                 }
@@ -2443,9 +2443,9 @@ njs_string_trim(njs_vm_t *vm, njs_value_t *value, nxt_uint_t mode)
                 }
 
                 p = start;
-                u = nxt_utf8_decode(&start, end);
+                u = njs_utf8_decode(&start, end);
 
-                if (nxt_utf8_is_whitespace(u)) {
+                if (njs_utf8_is_whitespace(u)) {
                     trim++;
                     continue;
                 }
@@ -2463,11 +2463,11 @@ njs_string_trim(njs_vm_t *vm, njs_value_t *value, nxt_uint_t mode)
                     goto empty;
                 }
 
-                prev = nxt_utf8_prev(prev);
+                prev = njs_utf8_prev(prev);
                 p = prev;
-                u = nxt_utf8_decode(&p, end);
+                u = njs_utf8_decode(&p, end);
 
-                if (nxt_utf8_is_whitespace(u)) {
+                if (njs_utf8_is_whitespace(u)) {
                     trim++;
                     continue;
                 }
@@ -2482,7 +2482,7 @@ njs_string_trim(njs_vm_t *vm, njs_value_t *value, nxt_uint_t mode)
         /* GC: retain. */
         vm->retval = *value;
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     length = (string.length != 0) ? string.length - trim : 0;
@@ -2493,12 +2493,12 @@ empty:
 
     vm->retval = njs_string_empty;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
-njs_string_prototype_repeat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_repeat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char             *p, *start;
@@ -2513,22 +2513,22 @@ njs_string_prototype_repeat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     max = (string.size > 1) ? NJS_STRING_MAX_LENGTH / string.size
                             : NJS_STRING_MAX_LENGTH;
 
-    if (nxt_slow_path(n < 0 || n >= max)) {
+    if (njs_slow_path(n < 0 || n >= max)) {
         njs_range_error(vm, NULL);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     if (string.size == 0) {
         vm->retval = njs_string_empty;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     size = string.size * n;
     length = string.length * n;
 
     start = njs_string_alloc(vm, &vm->retval, size, length);
-    if (nxt_slow_path(start == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(start == NULL)) {
+        return NJS_ERROR;
     }
 
     p = start;
@@ -2539,13 +2539,13 @@ njs_string_prototype_repeat(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         n--;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_string_prototype_pad_start(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_string_prototype_pad(vm, args, nargs, 1);
 }
@@ -2553,15 +2553,15 @@ njs_string_prototype_pad_start(njs_vm_t *vm, njs_value_t *args,
 
 static njs_ret_t
 njs_string_prototype_pad_end(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     return njs_string_prototype_pad(vm, args, nargs, 0);
 }
 
 
 static njs_ret_t
-njs_string_prototype_pad(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
-    nxt_bool_t pad_start)
+njs_string_prototype_pad(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+    njs_bool_t pad_start)
 {
     u_char             *p, *start;
     size_t             padding, trunc, new_size;
@@ -2581,7 +2581,7 @@ njs_string_prototype_pad(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         return NJS_OK;
     }
 
-    if (nxt_slow_path(new_length >= NJS_STRING_MAX_LENGTH)) {
+    if (njs_slow_path(new_length >= NJS_STRING_MAX_LENGTH)) {
         njs_range_error(vm, NULL);
         return NJS_ERROR;
     }
@@ -2619,7 +2619,7 @@ njs_string_prototype_pad(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     new_size = string.size + padding;
 
     start = njs_string_alloc(vm, &vm->retval, new_size, new_length);
-    if (nxt_slow_path(start == NULL)) {
+    if (njs_slow_path(start == NULL)) {
         return NJS_ERROR;
     }
 
@@ -2635,7 +2635,7 @@ njs_string_prototype_pad(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     memcpy(start, string.start, string.size);
 
     if (pad_string.size == 1) {
-        nxt_memset(p, pad_string.start[0], padding);
+        njs_memset(p, pad_string.start[0], padding);
 
     } else {
         while (n != 0) {
@@ -2656,12 +2656,12 @@ njs_string_prototype_pad(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
  */
 
 static njs_ret_t
-njs_string_prototype_search(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_search(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     int                   ret, *captures;
-    nxt_int_t             index;
-    nxt_uint_t            n;
+    njs_int_t             index;
+    njs_uint_t            n;
     njs_string_prop_t     string;
     njs_regexp_pattern_t  *pattern;
 
@@ -2681,8 +2681,8 @@ njs_string_prototype_search(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             if (string.size != 0) {
                 pattern = njs_regexp_pattern_create(vm, string.start,
                                                     string.size, 0);
-                if (nxt_slow_path(pattern == NULL)) {
-                    return NXT_ERROR;
+                if (njs_slow_path(pattern == NULL)) {
+                    return NJS_ERROR;
                 }
 
                 break;
@@ -2701,15 +2701,15 @@ njs_string_prototype_search(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
         n = (string.length != 0);
 
-        if (nxt_regex_is_valid(&pattern->regex[n])) {
+        if (njs_regex_is_valid(&pattern->regex[n])) {
             ret = njs_regexp_match(vm, &pattern->regex[n], string.start,
                                    string.size, vm->single_match_data);
             if (ret >= 0) {
-                captures = nxt_regex_captures(vm->single_match_data);
+                captures = njs_regex_captures(vm->single_match_data);
                 index = njs_string_index(&string, captures[0]);
 
-            } else if (ret != NXT_REGEX_NOMATCH) {
-                return NXT_ERROR;
+            } else if (ret != NJS_REGEX_NOMATCH) {
+                return NJS_ERROR;
             }
         }
     }
@@ -2718,7 +2718,7 @@ done:
 
     njs_set_number(&vm->retval, index);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -2727,10 +2727,10 @@ done:
  */
 
 static njs_ret_t
-njs_string_prototype_match(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_match(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    nxt_str_t             string;
+    njs_str_t             string;
     njs_ret_t             ret;
     njs_value_t           arguments[2];
     njs_regexp_pattern_t  *pattern;
@@ -2767,7 +2767,7 @@ njs_string_prototype_match(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     ret = njs_regexp_create(vm, &arguments[0], string.start, string.length, 0);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -2807,11 +2807,11 @@ njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args,
         }
     }
 
-    if (nxt_regex_is_valid(&pattern->regex[type])) {
+    if (njs_regex_is_valid(&pattern->regex[type])) {
 
         array = njs_array_alloc(vm, 0, NJS_ARRAY_SPARE);
-        if (nxt_slow_path(array == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(array == NULL)) {
+            return NJS_ERROR;
         }
 
         p = string.start;
@@ -2821,26 +2821,26 @@ njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args,
             ret = njs_regexp_match(vm, &pattern->regex[type], p, string.size,
                                    vm->single_match_data);
             if (ret < 0) {
-                if (nxt_fast_path(ret == NXT_REGEX_NOMATCH)) {
+                if (njs_fast_path(ret == NJS_REGEX_NOMATCH)) {
                     break;
                 }
 
                 njs_internal_error(vm, "njs_regexp_match() failed");
 
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
             ret = njs_array_expand(vm, array, 0, 1);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
-            captures = nxt_regex_captures(vm->single_match_data);
+            captures = njs_regex_captures(vm->single_match_data);
             start = p + captures[0];
 
             if (captures[1] == 0) {
                 if (start < end) {
-                    p = (utf8 != NJS_STRING_BYTE) ? nxt_utf8_next(start, end)
+                    p = (utf8 != NJS_STRING_BYTE) ? njs_utf8_next(start, end)
                                                   : start + 1;
                     string.size = end - p;
 
@@ -2862,7 +2862,7 @@ njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args,
 
             ret = njs_string_new(vm, &array->start[array->length],
                                  start, size, length);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -2873,7 +2873,7 @@ njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args,
         njs_set_array(&vm->retval, array);
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -2882,7 +2882,7 @@ njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args,
  */
 
 static njs_ret_t
-njs_string_prototype_split(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_split(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     int                   ret, *captures;
@@ -2896,8 +2896,8 @@ njs_string_prototype_split(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_regexp_pattern_t  *pattern;
 
     array = njs_array_alloc(vm, 0, NJS_ARRAY_SPARE);
-    if (nxt_slow_path(array == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(array == NULL)) {
+        return NJS_ERROR;
     }
 
     if (nargs > 1) {
@@ -2959,7 +2959,7 @@ found:
 
                 /* Empty split string. */
                 if (p == next) {
-                    p = (utf8 != NJS_STRING_BYTE) ? nxt_utf8_next(p, end)
+                    p = (utf8 != NJS_STRING_BYTE) ? njs_utf8_next(p, end)
                                                   : p + 1;
                     next = p;
                 }
@@ -2967,7 +2967,7 @@ found:
                 size = p - start;
 
                 ret = njs_string_split_part_add(vm, array, utf8, start, size);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
 
@@ -2981,7 +2981,7 @@ found:
         case NJS_REGEXP:
             pattern = njs_regexp_pattern(&args[1]);
 
-            if (!nxt_regex_is_valid(&pattern->regex[type])) {
+            if (!njs_regex_is_valid(&pattern->regex[type])) {
                 goto single;
             }
 
@@ -2992,22 +2992,22 @@ found:
                 ret = njs_regexp_match(vm, &pattern->regex[type], start,
                                        end - start, vm->single_match_data);
                 if (ret >= 0) {
-                    captures = nxt_regex_captures(vm->single_match_data);
+                    captures = njs_regex_captures(vm->single_match_data);
 
                     p = start + captures[0];
                     next = start + captures[1];
 
-                } else if (ret == NXT_REGEX_NOMATCH) {
+                } else if (ret == NJS_REGEX_NOMATCH) {
                     p = (u_char *) end;
                     next = (u_char *) end + 1;
 
                 } else {
-                    return NXT_ERROR;
+                    return NJS_ERROR;
                 }
 
                 /* Empty split regexp. */
                 if (p == next) {
-                    p = (utf8 != NJS_STRING_BYTE) ? nxt_utf8_next(p, end)
+                    p = (utf8 != NJS_STRING_BYTE) ? njs_utf8_next(p, end)
                                                   : p + 1;
                     next = p;
                 }
@@ -3015,7 +3015,7 @@ found:
                 size = p - start;
 
                 ret = njs_string_split_part_add(vm, array, utf8, start, size);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
 
@@ -3042,7 +3042,7 @@ done:
 
     njs_set_array(&vm->retval, array);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -3063,13 +3063,13 @@ njs_string_split_part_add(njs_vm_t *vm, njs_array_t *array, njs_utf8_t utf8,
  */
 
 static njs_ret_t
-njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char                *p, *start, *end;
     njs_ret_t             ret;
-    nxt_uint_t            ncaptures;
-    nxt_regex_t           *regex;
+    njs_uint_t            ncaptures;
+    njs_regex_t           *regex;
     njs_string_prop_t     string;
     njs_string_replace_t  *r, string_replace;
 
@@ -3100,11 +3100,11 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     if (njs_is_regexp(&args[1])) {
         regex = &njs_regexp_pattern(&args[1])->regex[r->type];
 
-        if (!nxt_regex_is_valid(regex)) {
+        if (!njs_regex_is_valid(regex)) {
             goto original;
         }
 
-        ncaptures = nxt_regex_ncaptures(regex);
+        ncaptures = njs_regex_ncaptures(regex);
 
     } else {
         regex = NULL;
@@ -3112,9 +3112,9 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     /* This cannot fail. */
-    r->part = nxt_array_init(&r->parts, &r->array,
-                             3, sizeof(njs_string_replace_part_t),
-                             &njs_array_mem_proto, vm->mem_pool);
+    r->part = njs_arr_init(&r->parts, &r->array,
+                           3, sizeof(njs_string_replace_part_t),
+                           &njs_array_mem_proto, vm->mem_pool);
 
     r->substitutions = NULL;
     r->function = NULL;
@@ -3139,7 +3139,7 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             if (*p == '$') {
                 ret = njs_string_replace_parse(vm, r, p, end, p - start,
                                                ncaptures);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
 
@@ -3159,9 +3159,9 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_set_invalid(&r->part[0].value);
 
     if (regex != NULL) {
-        r->match_data = nxt_regex_match_data(regex, vm->regex_context);
-        if (nxt_slow_path(r->match_data == NULL)) {
-            return NXT_ERROR;
+        r->match_data = njs_regex_match_data(regex, vm->regex_context);
+        if (njs_slow_path(r->match_data == NULL)) {
+            return NJS_ERROR;
         }
 
         return njs_string_replace_regexp(vm, args, r);
@@ -3173,7 +3173,7 @@ original:
 
     njs_string_copy(&vm->retval, &args[0]);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -3199,18 +3199,18 @@ njs_string_replace_regexp(njs_vm_t *vm, njs_value_t *args,
                                r->match_data);
 
         if (ret < 0) {
-            if (nxt_slow_path(ret != NXT_REGEX_NOMATCH)) {
-                return NXT_ERROR;
+            if (njs_slow_path(ret != NJS_REGEX_NOMATCH)) {
+                return NJS_ERROR;
             }
 
             break;
         }
 
-        captures = nxt_regex_captures(r->match_data);
+        captures = njs_regex_captures(r->match_data);
 
         if (r->substitutions != NULL) {
             ret = njs_string_replace_substitute(vm, r, captures);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -3222,16 +3222,16 @@ njs_string_replace_regexp(njs_vm_t *vm, njs_value_t *args,
         }
 
         if (r->part != r->parts.start) {
-            r->part = nxt_array_add(&r->parts, &njs_array_mem_proto,
-                                    vm->mem_pool);
-            if (nxt_slow_path(r->part == NULL)) {
-                return NXT_ERROR;
+            r->part = njs_arr_add(&r->parts, &njs_array_mem_proto,
+                                  vm->mem_pool);
+            if (njs_slow_path(r->part == NULL)) {
+                return NJS_ERROR;
             }
 
-            r->part = nxt_array_add(&r->parts, &njs_array_mem_proto,
-                                    vm->mem_pool);
-            if (nxt_slow_path(r->part == NULL)) {
-                return NXT_ERROR;
+            r->part = njs_arr_add(&r->parts, &njs_array_mem_proto,
+                                  vm->mem_pool);
+            if (njs_slow_path(r->part == NULL)) {
+                return NJS_ERROR;
             }
 
             r->part -= 2;
@@ -3245,7 +3245,7 @@ njs_string_replace_regexp(njs_vm_t *vm, njs_value_t *args,
 
             if (start < end) {
                 p = (r->utf8 != NJS_STRING_BYTE)
-                    ? (u_char *) nxt_utf8_next(start, end) : start + 1;
+                    ? (u_char *) njs_utf8_next(start, end) : start + 1;
 
                 r->part[1].start = start;
                 r->part[1].size = p - start;
@@ -3295,32 +3295,32 @@ njs_string_replace_regexp(njs_vm_t *vm, njs_value_t *args,
         return njs_string_replace_regexp_join(vm, r);
     }
 
-    nxt_regex_match_data_free(r->match_data, vm->regex_context);
+    njs_regex_match_data_free(r->match_data, vm->regex_context);
 
-    nxt_array_destroy(&r->parts, &njs_array_mem_proto, vm->mem_pool);
+    njs_arr_destroy(&r->parts, &njs_array_mem_proto, vm->mem_pool);
 
     njs_string_copy(&vm->retval, &args[0]);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 static njs_ret_t
 njs_string_replace_regexp_function(njs_vm_t *vm, njs_value_t *args,
-    njs_string_replace_t *r, int *captures, nxt_uint_t n)
+    njs_string_replace_t *r, int *captures, njs_uint_t n)
 {
     u_char             *start;
     size_t             size, length;
     njs_ret_t          ret;
-    nxt_uint_t         i, k;
+    njs_uint_t         i, k;
     njs_value_t        *arguments;
     njs_string_prop_t  string;
 
     njs_set_invalid(&r->retval);
 
-    arguments = nxt_mp_alloc(vm->mem_pool, (n + 3) * sizeof(njs_value_t));
-    if (nxt_slow_path(arguments == NULL)) {
-        return NXT_ERROR;
+    arguments = njs_mp_alloc(vm->mem_pool, (n + 3) * sizeof(njs_value_t));
+    if (njs_slow_path(arguments == NULL)) {
+        return NJS_ERROR;
     }
 
     arguments[0] = njs_value_undefined;
@@ -3335,8 +3335,8 @@ njs_string_replace_regexp_function(njs_vm_t *vm, njs_value_t *args,
         length = njs_string_calc_length(r->utf8, start, size);
 
         ret = njs_string_new(vm, &arguments[i], start, size, length);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
     }
 
@@ -3353,15 +3353,15 @@ njs_string_replace_regexp_function(njs_vm_t *vm, njs_value_t *args,
     ret = njs_string_new(vm, &arguments[n + 2], string.start, string.size,
                          length);
 
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     r->part[0].size = captures[0];
 
     ret = njs_function_apply(vm, r->function, arguments, n + 3, &r->retval);
 
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -3383,19 +3383,19 @@ njs_string_replace_regexp_function(njs_vm_t *vm, njs_value_t *args,
         return njs_string_replace_regexp_join(vm, r);
     }
 
-    nxt_regex_match_data_free(r->match_data, vm->regex_context);
+    njs_regex_match_data_free(r->match_data, vm->regex_context);
 
     njs_internal_error(vm, "unexpected retval type:%s",
                        njs_type_string(r->retval.type));
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 static njs_ret_t
 njs_string_replace_regexp_join(njs_vm_t *vm, njs_string_replace_t *r)
 {
-    nxt_regex_match_data_free(r->match_data, vm->regex_context);
+    njs_regex_match_data_free(r->match_data, vm->regex_context);
 
     return njs_string_replace_join(vm, r);
 }
@@ -3409,7 +3409,7 @@ njs_string_replace_search(njs_vm_t *vm, njs_value_t *args,
     u_char     *p, *end;
     size_t     size;
     njs_ret_t  ret;
-    nxt_str_t  search;
+    njs_str_t  search;
 
     njs_string_get(&args[1], &search);
 
@@ -3424,7 +3424,7 @@ njs_string_replace_search(njs_vm_t *vm, njs_value_t *args,
                 captures[1] = captures[0] + search.length;
 
                 ret = njs_string_replace_substitute(vm, r, captures);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
 
@@ -3447,13 +3447,13 @@ njs_string_replace_search(njs_vm_t *vm, njs_value_t *args,
             p++;
 
         } else {
-            p = (u_char *) nxt_utf8_next(p, end);
+            p = (u_char *) njs_utf8_next(p, end);
         }
     }
 
     njs_string_copy(&vm->retval, &args[0]);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -3480,23 +3480,23 @@ njs_string_replace_search_function(njs_vm_t *vm, njs_value_t *args,
 
     ret = njs_function_apply(vm, r->function, arguments, 4, &r->retval);
 
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
     if (!njs_is_primitive(&r->retval)) {
         ret = njs_value_to_string(vm, &r->retval, &r->retval);
-        if (ret != NXT_OK) {
+        if (ret != NJS_OK) {
             return ret;
         }
     }
 
     ret = njs_primitive_value_to_string(vm, &string, &r->retval);
-    if (nxt_slow_path(ret != NJS_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         njs_type_error(vm, "cannot convert primitive value to string: %s",
                        njs_type_string(r->retval.type));
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     njs_string_replacement_copy(&r->part[1], &string);
@@ -3507,17 +3507,17 @@ njs_string_replace_search_function(njs_vm_t *vm, njs_value_t *args,
 
 static njs_ret_t
 njs_string_replace_parse(njs_vm_t *vm, njs_string_replace_t *r, u_char *p,
-    u_char *end, size_t size, nxt_uint_t ncaptures)
+    u_char *end, size_t size, njs_uint_t ncaptures)
 {
     u_char              c;
     uint32_t            type;
     njs_string_subst_t  *s;
 
-    r->substitutions = nxt_array_create(4, sizeof(njs_string_subst_t),
-                                     &njs_array_mem_proto, vm->mem_pool);
+    r->substitutions = njs_arr_create(4, sizeof(njs_string_subst_t),
+                                      &njs_array_mem_proto, vm->mem_pool);
 
-    if (nxt_slow_path(r->substitutions == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(r->substitutions == NULL)) {
+        return NJS_ERROR;
     }
 
     s = NULL;
@@ -3529,9 +3529,9 @@ njs_string_replace_parse(njs_vm_t *vm, njs_string_replace_t *r, u_char *p,
 copy:
 
     if (s == NULL) {
-        s = nxt_array_add(r->substitutions, &njs_array_mem_proto, vm->mem_pool);
-        if (nxt_slow_path(s == NULL)) {
-            return NXT_ERROR;
+        s = njs_arr_add(r->substitutions, &njs_array_mem_proto, vm->mem_pool);
+        if (njs_slow_path(s == NULL)) {
+            return NJS_ERROR;
         }
 
         s->type = NJS_SUBST_COPY;
@@ -3593,16 +3593,16 @@ skip:
             goto copy;
         }
 
-        s = nxt_array_add(r->substitutions, &njs_array_mem_proto, vm->mem_pool);
-        if (nxt_slow_path(s == NULL)) {
-            return NXT_ERROR;
+        s = njs_arr_add(r->substitutions, &njs_array_mem_proto, vm->mem_pool);
+        if (njs_slow_path(s == NULL)) {
+            return NJS_ERROR;
         }
 
         s->type = type;
         s = NULL;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -3621,10 +3621,10 @@ njs_string_replace_substitute(njs_vm_t *vm, njs_string_replace_t *r,
     last = r->substitutions->items;
     end = r->part[0].start + r->part[0].size;
 
-    part = nxt_array_add_multiple(&r->parts, &njs_array_mem_proto, vm->mem_pool,
-                                  last + 1);
-    if (nxt_slow_path(part == NULL)) {
-        return NXT_ERROR;
+    part = njs_arr_add_multiple(&r->parts, &njs_array_mem_proto, vm->mem_pool,
+                                last + 1);
+    if (njs_slow_path(part == NULL)) {
+        return NJS_ERROR;
     }
 
     r->part = &part[-1];
@@ -3636,7 +3636,7 @@ njs_string_replace_substitute(njs_vm_t *vm, njs_string_replace_t *r,
         /* Empty match. */
 
         if (r->part[0].start < end) {
-            captures[1] = nxt_utf8_next(r->part[0].start, end)
+            captures[1] = njs_utf8_next(r->part[0].start, end)
                           - r->part[0].start;
             part[last].start = r->part[0].start + captures[1];
 
@@ -3709,7 +3709,7 @@ njs_string_replace_substitute(njs_vm_t *vm, njs_string_replace_t *r,
 
                 if (part->start < end) {
                     part->start = r->part[0].start + *capture;
-                    part->size = nxt_utf8_next(part->start, end) - part->start;
+                    part->size = njs_utf8_next(part->start, end) - part->start;
 
                 } else {
                     part->size = 0;
@@ -3732,7 +3732,7 @@ njs_string_replace_substitute(njs_vm_t *vm, njs_string_replace_t *r,
         part->start = r->part[0].start + *capture;
 
         if (part->start < end) {
-            part->size = nxt_utf8_next(part->start, end) - part->start;
+            part->size = njs_utf8_next(part->start, end) - part->start;
 
         } else {
             part->size = 0;
@@ -3744,7 +3744,7 @@ njs_string_replace_substitute(njs_vm_t *vm, njs_string_replace_t *r,
 
     r->part = part;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -3754,7 +3754,7 @@ njs_string_replace_join(njs_vm_t *vm, njs_string_replace_t *r)
     u_char                     *p, *string;
     size_t                     size, length, mask;
     ssize_t                    len;
-    nxt_uint_t                 i, n;
+    njs_uint_t                 i, n;
     njs_string_replace_part_t  *part;
 
     size = 0;
@@ -3775,7 +3775,7 @@ njs_string_replace_join(njs_vm_t *vm, njs_string_replace_t *r)
             part[i].start = part[i].value.short_string.start;
         }
 
-        len = nxt_utf8_length(part[i].start, part[i].size);
+        len = njs_utf8_length(part[i].start, part[i].size);
 
         if (len >= 0) {
             length += len;
@@ -3788,8 +3788,8 @@ njs_string_replace_join(njs_vm_t *vm, njs_string_replace_t *r)
     length &= mask;
 
     string = njs_string_alloc(vm, &vm->retval, size, length);
-    if (nxt_slow_path(string == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(string == NULL)) {
+        return NJS_ERROR;
     }
 
     p = string;
@@ -3801,9 +3801,9 @@ njs_string_replace_join(njs_vm_t *vm, njs_string_replace_t *r)
         /* GC: release valid values. */
     }
 
-    nxt_array_destroy(&r->parts, &njs_array_mem_proto, vm->mem_pool);
+    njs_arr_destroy(&r->parts, &njs_array_mem_proto, vm->mem_pool);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -3858,24 +3858,24 @@ njs_primitive_value_to_string(njs_vm_t *vm, njs_value_t *dst,
         break;
 
     default:
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     *dst = *value;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 double
-njs_string_to_number(const njs_value_t *value, nxt_bool_t parse_float)
+njs_string_to_number(const njs_value_t *value, njs_bool_t parse_float)
 {
     double        num;
     size_t        size;
-    nxt_bool_t    minus;
+    njs_bool_t    minus;
     const u_char  *p, *start, *end;
 
-    const size_t  infinity = nxt_length("Infinity");
+    const size_t  infinity = njs_length("Infinity");
 
     size = value->short_string.size;
 
@@ -4010,13 +4010,13 @@ njs_string_to_c_string(njs_vm_t *vm, njs_value_t *value)
         size = value->long_string.size;
     }
 
-    data = nxt_mp_alloc(vm->mem_pool, size + 1);
-    if (nxt_slow_path(data == NULL)) {
+    data = njs_mp_alloc(vm->mem_pool, size + 1);
+    if (njs_slow_path(data == NULL)) {
         njs_memory_error(vm);
         return NULL;
     }
 
-    p = nxt_cpymem(data, start, size);
+    p = njs_cpymem(data, start, size);
     *p++ = '\0';
 
     return data;
@@ -4325,9 +4325,9 @@ static const njs_object_prop_t  njs_string_prototype_properties[] =
 
 
 const njs_object_init_t  njs_string_prototype_init = {
-    nxt_string("String"),
+    njs_str("String"),
     njs_string_prototype_properties,
-    nxt_nitems(njs_string_prototype_properties),
+    njs_nitems(njs_string_prototype_properties),
 };
 
 
@@ -4342,9 +4342,9 @@ const njs_object_prop_t  njs_string_instance_properties[] =
 
 
 const njs_object_init_t  njs_string_instance_init = {
-    nxt_string("String instance"),
+    njs_str("String instance"),
     njs_string_instance_properties,
-    nxt_nitems(njs_string_instance_properties),
+    njs_nitems(njs_string_instance_properties),
 };
 
 
@@ -4353,7 +4353,7 @@ const njs_object_init_t  njs_string_instance_init = {
  */
 
 njs_ret_t
-njs_string_encode_uri(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_encode_uri(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     static const uint32_t  escape[] = {
@@ -4380,7 +4380,7 @@ njs_string_encode_uri(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = njs_string_undefined;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -4390,7 +4390,7 @@ njs_string_encode_uri(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 njs_ret_t
 njs_string_encode_uri_component(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     static const uint32_t  escape[] = {
         0xffffffff,  /* 1111 1111 1111 1111  1111 1111 1111 1111 */
@@ -4416,7 +4416,7 @@ njs_string_encode_uri_component(njs_vm_t *vm, njs_value_t *args,
 
     vm->retval = njs_string_undefined;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -4425,10 +4425,10 @@ njs_string_encode(njs_vm_t *vm, njs_value_t *value, const uint32_t *escape)
 {
     u_char               byte, *src, *dst;
     size_t               n, size;
-    nxt_str_t            string;
+    njs_str_t            string;
     static const u_char  hex[16] = "0123456789ABCDEF";
 
-    nxt_prefetch(escape);
+    njs_prefetch(escape);
 
     njs_string_get(value, &string);
 
@@ -4446,14 +4446,14 @@ njs_string_encode(njs_vm_t *vm, njs_value_t *value, const uint32_t *escape)
     if (n == 0) {
         /* GC: retain src. */
         vm->retval = *value;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     size = string.length + n;
 
     dst = njs_string_alloc(vm, &vm->retval, size, size);
-    if (nxt_slow_path(dst == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(dst == NULL)) {
+        return NJS_ERROR;
     }
 
     size = string.length;
@@ -4475,7 +4475,7 @@ njs_string_encode(njs_vm_t *vm, njs_value_t *value, const uint32_t *escape)
 
     } while (size != 0);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -4484,7 +4484,7 @@ njs_string_encode(njs_vm_t *vm, njs_value_t *value, const uint32_t *escape)
  */
 
 njs_ret_t
-njs_string_decode_uri(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_string_decode_uri(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     static const uint32_t  reserve[] = {
@@ -4511,7 +4511,7 @@ njs_string_decode_uri(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     vm->retval = njs_string_undefined;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -4521,7 +4521,7 @@ njs_string_decode_uri(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 njs_ret_t
 njs_string_decode_uri_component(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused)
+    njs_uint_t nargs, njs_index_t unused)
 {
     static const uint32_t  reserve[] = {
         0x00000000,  /* 0000 0000 0000 0000  0000 0000 0000 0000 */
@@ -4547,7 +4547,7 @@ njs_string_decode_uri_component(njs_vm_t *vm, njs_value_t *args,
 
     vm->retval = njs_string_undefined;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -4558,11 +4558,11 @@ njs_string_decode(njs_vm_t *vm, njs_value_t *value, const uint32_t *reserve)
     u_char               byte, *start, *src, *dst;
     size_t               n;
     ssize_t              size, length;
-    nxt_str_t            string;
-    nxt_bool_t           utf8;
+    njs_str_t            string;
+    njs_bool_t           utf8;
 
     static const int8_t  hex[256]
-        nxt_aligned(32) =
+        njs_aligned(32) =
     {
         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -4582,8 +4582,8 @@ njs_string_decode(njs_vm_t *vm, njs_value_t *value, const uint32_t *reserve)
         -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     };
 
-    nxt_prefetch(&hex['0']);
-    nxt_prefetch(reserve);
+    njs_prefetch(&hex['0']);
+    njs_prefetch(reserve);
 
     njs_string_get(value, &string);
 
@@ -4621,14 +4621,14 @@ njs_string_decode(njs_vm_t *vm, njs_value_t *value, const uint32_t *reserve)
     if (n == 0) {
         /* GC: retain src. */
         vm->retval = *value;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     n = string.length - n;
 
     start = njs_string_alloc(vm, &vm->retval, n, n);
-    if (nxt_slow_path(start == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(start == NULL)) {
+        return NJS_ERROR;
     }
 
     utf8 = 0;
@@ -4661,7 +4661,7 @@ njs_string_decode(njs_vm_t *vm, njs_value_t *value, const uint32_t *reserve)
     } while (size != 0);
 
     if (utf8) {
-        length = nxt_utf8_length(start, n);
+        length = njs_utf8_length(start, n);
 
         if (length < 0) {
             length = 0;
@@ -4675,18 +4675,18 @@ njs_string_decode(njs_vm_t *vm, njs_value_t *value, const uint32_t *reserve)
         }
     }
 
-    return NXT_OK;
+    return NJS_OK;
 
 uri_error:
 
     njs_uri_error(vm, NULL);
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
-static nxt_int_t
-njs_values_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+njs_values_hash_test(njs_lvlhsh_query_t *lhq, void *data)
 {
     u_char       *start;
     njs_value_t  *value;
@@ -4705,17 +4705,17 @@ njs_values_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
     }
 
     if (memcmp(lhq->key.start, start, lhq->key.length) == 0) {
-        return NXT_OK;
+        return NJS_OK;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
-static const nxt_lvlhsh_proto_t  njs_values_hash_proto
-    nxt_aligned(64) =
+static const njs_lvlhsh_proto_t  njs_values_hash_proto
+    njs_aligned(64) =
 {
-    NXT_LVLHSH_DEFAULT,
+    NJS_LVLHSH_DEFAULT,
     njs_values_hash_test,
     njs_lvlhsh_alloc,
     njs_lvlhsh_free,
@@ -4728,16 +4728,16 @@ static const nxt_lvlhsh_proto_t  njs_values_hash_proto
  */
 
 njs_index_t
-njs_value_index(njs_vm_t *vm, const njs_value_t *src, nxt_uint_t runtime)
+njs_value_index(njs_vm_t *vm, const njs_value_t *src, njs_uint_t runtime)
 {
     u_char              *start;
     uint32_t            value_size, size, length;
-    nxt_int_t           ret;
-    nxt_bool_t          long_string;
+    njs_int_t           ret;
+    njs_bool_t          long_string;
     njs_value_t         *value;
     njs_string_t        *string;
-    nxt_lvlhsh_t        *values_hash;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_t        *values_hash;
+    njs_lvlhsh_query_t  lhq;
 
     long_string = src->type == NJS_STRING
                   && src->short_string.size == NJS_STRING_LONG;
@@ -4751,15 +4751,15 @@ njs_value_index(njs_vm_t *vm, const njs_value_t *src, nxt_uint_t runtime)
         start = (u_char *) src;
     }
 
-    lhq.key_hash = nxt_djb_hash(start, size);
+    lhq.key_hash = njs_djb_hash(start, size);
     lhq.key.length = size;
     lhq.key.start = start;
     lhq.proto = &njs_values_hash_proto;
 
-    if (nxt_lvlhsh_find(&vm->shared->values_hash, &lhq) == NXT_OK) {
+    if (njs_lvlhsh_find(&vm->shared->values_hash, &lhq) == NJS_OK) {
         value = lhq.value;
 
-    } else if (runtime && nxt_lvlhsh_find(&vm->values_hash, &lhq) == NXT_OK) {
+    } else if (runtime && njs_lvlhsh_find(&vm->values_hash, &lhq) == NJS_OK) {
         value = lhq.value;
 
     } else {
@@ -4777,9 +4777,9 @@ njs_value_index(njs_vm_t *vm, const njs_value_t *src, nxt_uint_t runtime)
             }
         }
 
-        value = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
+        value = njs_mp_align(vm->mem_pool, sizeof(njs_value_t),
                              value_size + size);
-        if (nxt_slow_path(value == NULL)) {
+        if (njs_slow_path(value == NULL)) {
             return NJS_INDEX_NONE;
         }
 
@@ -4802,9 +4802,9 @@ njs_value_index(njs_vm_t *vm, const njs_value_t *src, nxt_uint_t runtime)
 
         values_hash = runtime ? &vm->values_hash : &vm->shared->values_hash;
 
-        ret = nxt_lvlhsh_insert(values_hash, &lhq);
+        ret = njs_lvlhsh_insert(values_hash, &lhq);
 
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NJS_INDEX_NONE;
         }
     }
@@ -4843,9 +4843,9 @@ static const njs_object_prop_t  njs_to_string_function_properties[] =
 
 
 const njs_object_init_t  njs_to_string_function_init = {
-    nxt_string("toString"),
+    njs_str("toString"),
     njs_to_string_function_properties,
-    nxt_nitems(njs_to_string_function_properties),
+    njs_nitems(njs_to_string_function_properties),
 };
 
 
@@ -4870,9 +4870,9 @@ static const njs_object_prop_t  njs_encode_uri_function_properties[] =
 
 
 const njs_object_init_t  njs_encode_uri_function_init = {
-    nxt_string("encodeURI"),
+    njs_str("encodeURI"),
     njs_encode_uri_function_properties,
-    nxt_nitems(njs_encode_uri_function_properties),
+    njs_nitems(njs_encode_uri_function_properties),
 };
 
 
@@ -4897,9 +4897,9 @@ static const njs_object_prop_t  njs_encode_uri_component_function_properties[] =
 
 
 const njs_object_init_t  njs_encode_uri_component_function_init = {
-    nxt_string("encodeURIComponent"),
+    njs_str("encodeURIComponent"),
     njs_encode_uri_component_function_properties,
-    nxt_nitems(njs_encode_uri_component_function_properties),
+    njs_nitems(njs_encode_uri_component_function_properties),
 };
 
 
@@ -4924,9 +4924,9 @@ static const njs_object_prop_t  njs_decode_uri_function_properties[] =
 
 
 const njs_object_init_t  njs_decode_uri_function_init = {
-    nxt_string("decodeURI"),
+    njs_str("decodeURI"),
     njs_decode_uri_function_properties,
-    nxt_nitems(njs_decode_uri_function_properties),
+    njs_nitems(njs_decode_uri_function_properties),
 };
 
 
@@ -4951,7 +4951,7 @@ static const njs_object_prop_t  njs_decode_uri_component_function_properties[] =
 
 
 const njs_object_init_t  njs_decode_uri_component_function_init = {
-    nxt_string("decodeURIComponent"),
+    njs_str("decodeURIComponent"),
     njs_decode_uri_component_function_properties,
-    nxt_nitems(njs_decode_uri_component_function_properties),
+    njs_nitems(njs_decode_uri_component_function_properties),
 };
similarity index 90%
rename from njs/njs_string.h
rename to src/njs_string.h
index 135e8a3b22bbfb376f12c864d65b17028effdc33..e5525502883e6780916bb4141b5ad61c3cd2c6fd 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef _NJS_STRING_H_INCLUDED_
 #define _NJS_STRING_H_INCLUDED_
 
-#include <nxt_utf8.h>
+#include <njs_utf8.h>
 
 /*
  * nJSVM supports two string variants:
  */
 #define NJS_STRING_MAP_STRIDE  32
 
-#define njs_string_map_offset(size)  nxt_align_size((size), sizeof(uint32_t))
+#define njs_string_map_offset(size)  njs_align_size((size), sizeof(uint32_t))
 
 #define njs_string_map_start(p)                                               \
-    ((uint32_t *) nxt_align_ptr((p), sizeof(uint32_t)))
+    ((uint32_t *) njs_align_ptr((p), sizeof(uint32_t)))
 
 #define njs_string_map_size(length)                                           \
     (((length - 1) / NJS_STRING_MAP_STRIDE) * sizeof(uint32_t))
@@ -103,7 +103,7 @@ typedef enum {
 } njs_utf8_t;
 
 
-nxt_inline uint32_t
+njs_inline uint32_t
 njs_string_calc_length(njs_utf8_t utf8, const u_char *start, size_t size)
 {
     ssize_t  length;
@@ -118,14 +118,14 @@ njs_string_calc_length(njs_utf8_t utf8, const u_char *start, size_t size)
 
     case NJS_STRING_UTF8:
     default:
-        length = nxt_utf8_length(start, size);
+        length = njs_utf8_length(start, size);
 
         return (length >= 0) ? length : 0;
     }
 }
 
 
-nxt_inline uint32_t
+njs_inline uint32_t
 njs_string_length(njs_value_t *string)
 {
     uint32_t  length, size;
@@ -150,25 +150,25 @@ u_char *njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint64_t size,
 njs_ret_t njs_string_new(njs_vm_t *vm, njs_value_t *value, const u_char *start,
     uint32_t size, uint32_t length);
 njs_ret_t njs_string_hex(njs_vm_t *vm, njs_value_t *value,
-    const nxt_str_t *src);
+    const njs_str_t *src);
 njs_ret_t njs_string_base64(njs_vm_t *vm, njs_value_t *value,
-    const nxt_str_t *src);
+    const njs_str_t *src);
 njs_ret_t njs_string_base64url(njs_vm_t *vm, njs_value_t *value,
-    const nxt_str_t *src);
+    const njs_str_t *src);
 njs_ret_t njs_string_decode_hex(njs_vm_t *vm, njs_value_t *value,
-    const nxt_str_t *src);
+    const njs_str_t *src);
 njs_ret_t njs_string_decode_base64(njs_vm_t *vm, njs_value_t *value,
-    const nxt_str_t *src);
+    const njs_str_t *src);
 njs_ret_t njs_string_decode_base64url(njs_vm_t *vm, njs_value_t *value,
-    const nxt_str_t *src);
+    const njs_str_t *src);
 void njs_string_truncate(njs_value_t *value, uint32_t size);
 void njs_string_copy(njs_value_t *dst, njs_value_t *src);
 njs_ret_t njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string,
     njs_value_t *value);
 size_t njs_string_prop(njs_string_prop_t *string, const njs_value_t *value);
 njs_ret_t njs_string_constructor(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
-nxt_int_t njs_string_cmp(const njs_value_t *val1, const njs_value_t *val2);
+    njs_uint_t nargs, njs_index_t unused);
+njs_int_t njs_string_cmp(const njs_value_t *val1, const njs_value_t *val2);
 void njs_string_slice_string_prop(njs_string_prop_t *dst,
     const njs_string_prop_t *string, const njs_slice_prop_t *slice);
 njs_ret_t njs_string_slice(njs_vm_t *vm, njs_value_t *dst,
@@ -180,19 +180,19 @@ void njs_string_offset_map_init(const u_char *start, size_t size);
 double njs_string_to_index(const njs_value_t *value);
 const u_char *njs_string_to_c_string(njs_vm_t *vm, njs_value_t *value);
 njs_ret_t njs_string_encode_uri(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_string_encode_uri_component(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_string_decode_uri(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_string_decode_uri_component(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 njs_index_t njs_value_index(njs_vm_t *vm, const njs_value_t *src,
-    nxt_uint_t runtime);
+    njs_uint_t runtime);
 
 njs_ret_t njs_string_prototype_concat(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 
 extern const njs_object_init_t  njs_string_constructor_init;
similarity index 63%
rename from nxt/nxt_strtod.c
rename to src/njs_strtod.c
index e1da6ccea2d8bb4cec6018c91182487f38489794..9fd8cbf11304b4913a4ec54261bee156f8da458a 100644 (file)
@@ -7,11 +7,11 @@
  * that can be found in the LICENSE file.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_diyfp.h>
-#include <nxt_strtod.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_diyfp.h>
+#include <njs_strtod.h>
 
 /*
  * Max double: 1.7976931348623157 x 10^308
  * will be read as non-zero (equal to the min non-zero double).
  */
 
-#define NXT_DECIMAL_POWER_MAX           309
-#define NXT_DECIMAL_POWER_MIN           (-324)
+#define NJS_DECIMAL_POWER_MAX           309
+#define NJS_DECIMAL_POWER_MIN           (-324)
 
-#define NXT_UINT64_MAX                  nxt_uint64(0xFFFFFFFF, 0xFFFFFFFF)
-#define NXT_UINT64_DECIMAL_DIGITS_MAX   19
+#define NJS_UINT64_MAX                  njs_uint64(0xFFFFFFFF, 0xFFFFFFFF)
+#define NJS_UINT64_DECIMAL_DIGITS_MAX   19
 
 
 /*
@@ -36,8 +36,8 @@
  * Since 2^64 = 18446744073709551616 it would still be possible read another
  * digit if it was less or equal than 6, but this would complicate the code.
  */
-nxt_inline uint64_t
-nxt_read_uint64(const u_char *start, size_t length, size_t *ndigits)
+njs_inline uint64_t
+njs_read_uint64(const u_char *start, size_t length, size_t *ndigits)
 {
     u_char        d;
     uint64_t      value;
@@ -48,7 +48,7 @@ nxt_read_uint64(const u_char *start, size_t length, size_t *ndigits)
     p = start;
     e = p + length;
 
-    while (p < e && value <= (NXT_UINT64_MAX / 10 - 1)) {
+    while (p < e && value <= (NJS_UINT64_MAX / 10 - 1)) {
         d = *p++ - '0';
         value = 10 * value + d;
     }
@@ -60,18 +60,18 @@ nxt_read_uint64(const u_char *start, size_t length, size_t *ndigits)
 
 
 /*
- * Reads a nxt_diyfp_t from the buffer.
- * The returned nxt_diyfp_t is not necessarily normalized.
- * If remaining is zero then the returned nxt_diyfp_t is accurate.
+ * Reads a njs_diyfp_t from the buffer.
+ * The returned njs_diyfp_t is not necessarily normalized.
+ * If remaining is zero then the returned njs_diyfp_t is accurate.
  * Otherwise it has been rounded and has error of at most 1/2 ulp.
  */
-static nxt_diyfp_t
-nxt_diyfp_read(const u_char *start, size_t length, int *remaining)
+static njs_diyfp_t
+njs_diyfp_read(const u_char *start, size_t length, int *remaining)
 {
     size_t    read;
     uint64_t  significand;
 
-    significand = nxt_read_uint64(start, length, &read);
+    significand = njs_read_uint64(start, length, &read);
 
     /* Round the significand. */
 
@@ -83,35 +83,35 @@ nxt_diyfp_read(const u_char *start, size_t length, int *remaining)
 
     *remaining = length - read;
 
-    return nxt_diyfp(significand, 0);
+    return njs_diyfp(significand, 0);
 }
 
 
 /*
- * Returns 10^exp as an exact nxt_diyfp_t.
- * The given exp must be in the range [1; NXT_DECIMAL_EXPONENT_DIST[.
+ * Returns 10^exp as an exact njs_diyfp_t.
+ * The given exp must be in the range [1; NJS_DECIMAL_EXPONENT_DIST[.
  */
-nxt_inline nxt_diyfp_t
-nxt_adjust_pow10(int exp)
+njs_inline njs_diyfp_t
+njs_adjust_pow10(int exp)
 {
     switch (exp) {
     case 1:
-        return nxt_diyfp(nxt_uint64(0xa0000000, 00000000), -60);
+        return njs_diyfp(njs_uint64(0xa0000000, 00000000), -60);
     case 2:
-        return nxt_diyfp(nxt_uint64(0xc8000000, 00000000), -57);
+        return njs_diyfp(njs_uint64(0xc8000000, 00000000), -57);
     case 3:
-        return nxt_diyfp(nxt_uint64(0xfa000000, 00000000), -54);
+        return njs_diyfp(njs_uint64(0xfa000000, 00000000), -54);
     case 4:
-        return nxt_diyfp(nxt_uint64(0x9c400000, 00000000), -50);
+        return njs_diyfp(njs_uint64(0x9c400000, 00000000), -50);
     case 5:
-        return nxt_diyfp(nxt_uint64(0xc3500000, 00000000), -47);
+        return njs_diyfp(njs_uint64(0xc3500000, 00000000), -47);
     case 6:
-        return nxt_diyfp(nxt_uint64(0xf4240000, 00000000), -44);
+        return njs_diyfp(njs_uint64(0xf4240000, 00000000), -44);
     case 7:
-        return nxt_diyfp(nxt_uint64(0x98968000, 00000000), -40);
+        return njs_diyfp(njs_uint64(0x98968000, 00000000), -40);
     default:
-        nxt_unreachable();
-        return nxt_diyfp(0, 0);
+        njs_unreachable();
+        return njs_diyfp(0, 0);
     }
 }
 
@@ -121,41 +121,41 @@ nxt_adjust_pow10(int exp)
  * If v = f*2^e with 2^p-1 <= f <= 2^p then p+e is v's order of magnitude.
  * This function returns the number of significant binary digits v will have
  * once its encoded into a double. In almost all cases this is equal to
- * NXT_SIGNIFICAND_SIZE. The only exception are denormals. They start with
+ * NJS_SIGNIFICAND_SIZE. The only exception are denormals. They start with
  * leading zeroes and their effective significand-size is hence smaller.
  */
-nxt_inline int
-nxt_diyfp_sgnd_size(int order)
+njs_inline int
+njs_diyfp_sgnd_size(int order)
 {
-    if (order >= (NXT_DBL_EXPONENT_DENORMAL + NXT_SIGNIFICAND_SIZE)) {
-        return NXT_SIGNIFICAND_SIZE;
+    if (order >= (NJS_DBL_EXPONENT_DENORMAL + NJS_SIGNIFICAND_SIZE)) {
+        return NJS_SIGNIFICAND_SIZE;
     }
 
-    if (order <= NXT_DBL_EXPONENT_DENORMAL) {
+    if (order <= NJS_DBL_EXPONENT_DENORMAL) {
         return 0;
     }
 
-    return order - NXT_DBL_EXPONENT_DENORMAL;
+    return order - NJS_DBL_EXPONENT_DENORMAL;
 }
 
 
-#define NXT_DENOM_LOG   3
-#define NXT_DENOM       (1 << NXT_DENOM_LOG)
+#define NJS_DENOM_LOG   3
+#define NJS_DENOM       (1 << NJS_DENOM_LOG)
 
 /*
  * Returns either the correct double or the double that is just below
  * the correct double.
  */
 static double
-nxt_diyfp_strtod(const u_char *start, size_t length, int exp)
+njs_diyfp_strtod(const u_char *start, size_t length, int exp)
 {
     int          magnitude, prec_digits;
     int          remaining, dec_exp, adj_exp, orig_e, shift;
     int64_t      error;
     uint64_t     prec_bits, half_way;
-    nxt_diyfp_t  value, pow, adj_pow, rounded;
+    njs_diyfp_t  value, pow, adj_pow, rounded;
 
-    value = nxt_diyfp_read(start, length, &remaining);
+    value = njs_diyfp_read(start, length, &remaining);
 
     exp += remaining;
 
@@ -166,47 +166,47 @@ nxt_diyfp_strtod(const u_char *start, size_t length, int exp)
      * Using a common denominator to avoid dealing with fractions.
      */
 
-    error = (remaining == 0 ? 0 : NXT_DENOM / 2);
+    error = (remaining == 0 ? 0 : NJS_DENOM / 2);
 
     orig_e = value.exp;
-    value = nxt_diyfp_normalize(value);
+    value = njs_diyfp_normalize(value);
     error <<= orig_e - value.exp;
 
-    if (exp < NXT_DECIMAL_EXPONENT_MIN) {
+    if (exp < NJS_DECIMAL_EXPONENT_MIN) {
         return 0.0;
     }
 
-    pow = nxt_cached_power_dec(exp, &dec_exp);
+    pow = njs_cached_power_dec(exp, &dec_exp);
 
     if (dec_exp != exp) {
 
         adj_exp = exp - dec_exp;
-        adj_pow = nxt_adjust_pow10(exp - dec_exp);
-        value = nxt_diyfp_mul(value, adj_pow);
+        adj_pow = njs_adjust_pow10(exp - dec_exp);
+        value = njs_diyfp_mul(value, adj_pow);
 
-        if (NXT_UINT64_DECIMAL_DIGITS_MAX - (int) length < adj_exp) {
+        if (NJS_UINT64_DECIMAL_DIGITS_MAX - (int) length < adj_exp) {
             /*
              * The adjustment power is exact. There is hence only
              * an error of 0.5.
              */
-            error += NXT_DENOM / 2;
+            error += NJS_DENOM / 2;
         }
     }
 
-    value = nxt_diyfp_mul(value, pow);
+    value = njs_diyfp_mul(value, pow);
 
     /*
      * The error introduced by a multiplication of a * b equals
      *  error_a + error_b + error_a * error_b / 2^64 + 0.5
      *  Substituting a with 'value' and b with 'pow':
      *  error_b = 0.5  (all cached powers have an error of less than 0.5 ulp),
-     *  error_ab = 0 or 1 / NXT_DENOM > error_a * error_b / 2^64.
+     *  error_ab = 0 or 1 / NJS_DENOM > error_a * error_b / 2^64.
      */
 
-    error += NXT_DENOM + (error != 0 ? 1 : 0);
+    error += NJS_DENOM + (error != 0 ? 1 : 0);
 
     orig_e = value.exp;
-    value = nxt_diyfp_normalize(value);
+    value = njs_diyfp_normalize(value);
     error <<= orig_e - value.exp;
 
     /*
@@ -214,45 +214,45 @@ nxt_diyfp_strtod(const u_char *start, size_t length, int exp)
      * or substracted.
      */
 
-    magnitude = NXT_DIYFP_SIGNIFICAND_SIZE + value.exp;
-    prec_digits = NXT_DIYFP_SIGNIFICAND_SIZE - nxt_diyfp_sgnd_size(magnitude);
+    magnitude = NJS_DIYFP_SIGNIFICAND_SIZE + value.exp;
+    prec_digits = NJS_DIYFP_SIGNIFICAND_SIZE - njs_diyfp_sgnd_size(magnitude);
 
-    if (prec_digits + NXT_DENOM_LOG >= NXT_DIYFP_SIGNIFICAND_SIZE) {
+    if (prec_digits + NJS_DENOM_LOG >= NJS_DIYFP_SIGNIFICAND_SIZE) {
         /*
          * This can only happen for very small denormals. In this case the
          * half-way multiplied by the denominator exceeds the range of uint64.
          * Simply shift everything to the right.
          */
-        shift = prec_digits + NXT_DENOM_LOG - NXT_DIYFP_SIGNIFICAND_SIZE + 1;
+        shift = prec_digits + NJS_DENOM_LOG - NJS_DIYFP_SIGNIFICAND_SIZE + 1;
 
-        value = nxt_diyfp_shift_right(value, shift);
+        value = njs_diyfp_shift_right(value, shift);
 
         /*
-         * Add 1 for the lost precision of error, and NXT_DENOM
+         * Add 1 for the lost precision of error, and NJS_DENOM
          * for the lost precision of value.significand.
          */
-        error = (error >> shift) + 1 + NXT_DENOM;
+        error = (error >> shift) + 1 + NJS_DENOM;
         prec_digits -= shift;
     }
 
     prec_bits = value.significand & (((uint64_t) 1 << prec_digits) - 1);
-    prec_bits *= NXT_DENOM;
+    prec_bits *= NJS_DENOM;
 
     half_way = (uint64_t) 1 << (prec_digits - 1);
-    half_way *= NXT_DENOM;
+    half_way *= NJS_DENOM;
 
-    rounded = nxt_diyfp_shift_right(value, prec_digits);
+    rounded = njs_diyfp_shift_right(value, prec_digits);
 
     if (prec_bits >= half_way + error) {
         rounded.significand++;
     }
 
-    return nxt_diyfp2d(rounded);
+    return njs_diyfp2d(rounded);
 }
 
 
 static double
-nxt_strtod_internal(const u_char *start, size_t length, int exp)
+njs_strtod_internal(const u_char *start, size_t length, int exp)
 {
     size_t        left, right;
     const u_char  *p, *e, *b;
@@ -296,24 +296,24 @@ nxt_strtod_internal(const u_char *start, size_t length, int exp)
 
     exp += (int) (left - right);
 
-    if (exp + (int) length - 1 >= NXT_DECIMAL_POWER_MAX) {
+    if (exp + (int) length - 1 >= NJS_DECIMAL_POWER_MAX) {
         return INFINITY;
     }
 
-    if (exp + (int) length <= NXT_DECIMAL_POWER_MIN) {
+    if (exp + (int) length <= NJS_DECIMAL_POWER_MIN) {
         return 0.0;
     }
 
-    return nxt_diyfp_strtod(start, length, exp);
+    return njs_diyfp_strtod(start, length, exp);
 }
 
 
 double
-nxt_strtod(const u_char **start, const u_char *end)
+njs_strtod(const u_char **start, const u_char *end)
 {
     int           exponent, exp, insignf;
     u_char        c, *pos;
-    nxt_bool_t    minus;
+    njs_bool_t    minus;
     const u_char  *e, *p, *last;
     u_char        data[128];
 
@@ -327,7 +327,7 @@ nxt_strtod(const u_char **start, const u_char *end)
         /* Values less than '0' become >= 208. */
         c = *p - '0';
 
-        if (nxt_slow_path(c > 9)) {
+        if (njs_slow_path(c > 9)) {
             break;
         }
 
@@ -346,7 +346,7 @@ nxt_strtod(const u_char **start, const u_char *end)
             /* Values less than '0' become >= 208. */
             c = *p - '0';
 
-            if (nxt_slow_path(c > 9)) {
+            if (njs_slow_path(c > 9)) {
                 break;
             }
 
@@ -378,14 +378,14 @@ nxt_strtod(const u_char **start, const u_char *end)
         /* Values less than '0' become >= 208. */
         c = *e - '0';
 
-        if (nxt_fast_path(c <= 9)) {
+        if (njs_fast_path(c <= 9)) {
             exp = c;
 
             for (p = e + 1; p < end; p++) {
                 /* Values less than '0' become >= 208. */
                 c = *p - '0';
 
-                if (nxt_slow_path(c > 9)) {
+                if (njs_slow_path(c > 9)) {
                     break;
                 }
 
@@ -400,5 +400,5 @@ nxt_strtod(const u_char **start, const u_char *end)
 
     exponent += insignf;
 
-    return nxt_strtod_internal(data, pos - data, exponent);
+    return njs_strtod_internal(data, pos - data, exponent);
 }
diff --git a/src/njs_strtod.h b/src/njs_strtod.h
new file mode 100644 (file)
index 0000000..42e3e65
--- /dev/null
@@ -0,0 +1,12 @@
+
+/*
+ * Copyright (C) Dmitry Volyntsev
+ * Copyright (C) Nginx, Inc.
+ */
+
+#ifndef _NJS_STRTOD_H_INCLUDED_
+#define _NJS_STRTOD_H_INCLUDED_
+
+NJS_EXPORT double njs_strtod(const u_char **start, const u_char *end);
+
+#endif /* _NJS_STRTOD_H_INCLUDED_ */
diff --git a/src/njs_stub.h b/src/njs_stub.h
new file mode 100644 (file)
index 0000000..f114ab6
--- /dev/null
@@ -0,0 +1,45 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_STUB_H_INCLUDED_
+#define _NJS_STUB_H_INCLUDED_
+
+
+#define njs_max(val1, val2)                                                   \
+    ((val1 < val2) ? (val2) : (val1))
+
+#define njs_min(val1, val2)                                                   \
+    ((val1 < val2) ? (val1) : (val2))
+
+
+#define NJS_OK             0
+#define NJS_ERROR          (-1)
+#define NJS_AGAIN          (-2)
+#define NJS_DECLINED       (-3)
+#define NJS_DONE           (-4)
+
+
+typedef struct {
+    void           *(*alloc)(void *mem, size_t size);
+    void           *(*zalloc)(void *mem, size_t size);
+    void           *(*align)(void *mem, size_t alignment, size_t size);
+    void           *(*zalign)(void *mem, size_t alignment, size_t size);
+    void           (*free)(void *mem, void *p);
+    void           (*alert)(void *trace, const char *fmt, ...);
+    void njs_cdecl  (*trace)(void *trace, const char *fmt, ...);
+} njs_mem_proto_t;
+
+
+#define njs_thread_log_alert(...)
+#define njs_thread_log_error(...)
+#define njs_log_error(...)
+#define njs_thread_log_debug(...)
+
+#include <unistd.h>
+#define njs_pagesize()      getpagesize()
+
+
+#endif /* _NJS_STUB_H_INCLUDED_ */
similarity index 72%
rename from nxt/nxt_time.c
rename to src/njs_time.c
index 635d791b8016b1cc39033f5f61b0f014b58ebf49..cdca7e895120dc613271bd0b8dac381e79c070d4 100644 (file)
@@ -4,18 +4,18 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_time.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_time.h>
 
 #include <time.h>
 #include <sys/time.h>
 
 uint64_t
-nxt_time(void)
+njs_time(void)
 {
-#if (NXT_HAVE_CLOCK_MONOTONIC)
+#if (NJS_HAVE_CLOCK_MONOTONIC)
     struct timespec ts;
 
     clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/src/njs_time.h b/src/njs_time.h
new file mode 100644 (file)
index 0000000..d375120
--- /dev/null
@@ -0,0 +1,27 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_TIME_H_INCLUDED_
+#define _NJS_TIME_H_INCLUDED_
+
+
+#if (NJS_HAVE_TM_GMTOFF)
+
+#define njs_timezone(tm)                                                      \
+    ((tm)->tm_gmtoff)
+
+#elif (NJS_HAVE_ALTZONE)
+
+#define njs_timezone(tm)                                                      \
+    (-(((tm)->tm_isdst > 0) ? altzone : timezone))
+
+#endif
+
+
+uint64_t njs_time(void);
+
+
+#endif /* _NJS_TIME_H_INCLUDED_ */
similarity index 67%
rename from njs/njs_time.c
rename to src/njs_timer.c
index 8459844641a8df47ec36c278578adfc0e5e8b80a..60b37d02ae0ac74a9a949c9906b358b81638364b 100644 (file)
@@ -4,32 +4,32 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
-#include <njs_time.h>
+#include <njs_main.h>
+#include <njs_timer.h>
 #include <string.h>
 
 
 static njs_ret_t
-njs_set_timer(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
-    njs_index_t unused, nxt_bool_t immediate)
+njs_set_timer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+    njs_index_t unused, njs_bool_t immediate)
 {
-    nxt_uint_t     n;
+    njs_uint_t     n;
     uint64_t       delay;
     njs_event_t   *event;
     njs_vm_ops_t  *ops;
 
-    if (nxt_slow_path(nargs < 2)) {
+    if (njs_slow_path(nargs < 2)) {
         njs_type_error(vm, "too few arguments");
         return NJS_ERROR;
     }
 
-    if (nxt_slow_path(!njs_is_function(&args[1]))) {
+    if (njs_slow_path(!njs_is_function(&args[1]))) {
         njs_type_error(vm, "first arg must be a function");
         return NJS_ERROR;
     }
 
     ops = vm->options.ops;
-    if (nxt_slow_path(ops == NULL)) {
+    if (njs_slow_path(ops == NULL)) {
         njs_internal_error(vm, "not supported by host environment");
         return NJS_ERROR;
     }
@@ -40,8 +40,8 @@ njs_set_timer(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         delay = njs_number(&args[2]);
     }
 
-    event = nxt_mp_alloc(vm->mem_pool, sizeof(njs_event_t));
-    if (nxt_slow_path(event == NULL)) {
+    event = njs_mp_alloc(vm->mem_pool, sizeof(njs_event_t));
+    if (njs_slow_path(event == NULL)) {
         goto memory_error;
     }
 
@@ -54,9 +54,9 @@ njs_set_timer(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     event->posted = 0;
 
     if (event->nargs != 0) {
-        event->args = nxt_mp_alloc(vm->mem_pool,
+        event->args = njs_mp_alloc(vm->mem_pool,
                                    sizeof(njs_value_t) * event->nargs);
-        if (nxt_slow_path(event->args == NULL)) {
+        if (njs_slow_path(event->args == NULL)) {
             goto memory_error;
         }
 
@@ -64,7 +64,7 @@ njs_set_timer(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     }
 
     event->host_event = ops->set_timer(vm->external, delay, event);
-    if (nxt_slow_path(event->host_event == NULL)) {
+    if (njs_slow_path(event->host_event == NULL)) {
         njs_internal_error(vm, "set_timer() failed");
         return NJS_ERROR;
     }
@@ -80,7 +80,7 @@ memory_error:
 
 
 njs_ret_t
-njs_set_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_set_timeout(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return njs_set_timer(vm, args, nargs, unused, 0);
@@ -88,7 +88,7 @@ njs_set_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 njs_ret_t
-njs_set_immediate(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_set_immediate(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     return njs_set_timer(vm, args, nargs, unused, 1);
@@ -96,30 +96,30 @@ njs_set_immediate(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 njs_ret_t
-njs_clear_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_clear_timeout(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
     u_char              buf[16], *p;
     njs_ret_t           ret;
     njs_event_t         *event;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    if (nxt_fast_path(nargs < 2) || !njs_is_number(&args[1])) {
+    if (njs_fast_path(nargs < 2) || !njs_is_number(&args[1])) {
         vm->retval = njs_value_undefined;
         return NJS_OK;
     }
 
-    p = nxt_sprintf(buf, buf + nxt_length(buf), "%uD",
+    p = njs_sprintf(buf, buf + njs_length(buf), "%uD",
                     (unsigned) njs_number(&args[1]));
 
     lhq.key.start = buf;
     lhq.key.length = p - buf;
-    lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+    lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
     lhq.proto = &njs_event_hash_proto;
     lhq.pool = vm->mem_pool;
 
-    ret = nxt_lvlhsh_find(&vm->events_hash, &lhq);
-    if (ret == NXT_OK) {
+    ret = njs_lvlhsh_find(&vm->events_hash, &lhq);
+    if (ret == NJS_OK) {
         event = lhq.value;
         njs_del_event(vm, event, NJS_EVENT_RELEASE | NJS_EVENT_DELETE);
     }
@@ -131,20 +131,20 @@ njs_clear_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
 
 const njs_object_init_t  njs_set_timeout_function_init = {
-    nxt_string("setTimeout"),
+    njs_str("setTimeout"),
     NULL,
     0,
 };
 
 const njs_object_init_t  njs_set_immediate_function_init = {
-    nxt_string("setImmediate"),
+    njs_str("setImmediate"),
     NULL,
     0,
 };
 
 
 const njs_object_init_t  njs_clear_timeout_function_init = {
-    nxt_string("clearTimeout"),
+    njs_str("clearTimeout"),
     NULL,
     0,
 };
similarity index 65%
rename from njs/njs_time.h
rename to src/njs_timer.h
index 868719e4f32388ae6a73abaa5822ea9d3bdb2075..e8c7e9afe9920c7bf3fbb447bf8c8ed30a50be9b 100644 (file)
@@ -4,20 +4,20 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#ifndef _NJS_TIMEOUT_H_INCLUDED_
-#define _NJS_TIMEOUT_H_INCLUDED_
+#ifndef _NJS_TIMER_H_INCLUDED_
+#define _NJS_TIMER_H_INCLUDED_
 
 
 njs_ret_t njs_set_timeout(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_set_immediate(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_clear_timeout(njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t unused);
+    njs_uint_t nargs, njs_index_t unused);
 
 
 extern const njs_object_init_t  njs_set_timeout_function_init;
 extern const njs_object_init_t  njs_set_immediate_function_init;
 extern const njs_object_init_t  njs_clear_timeout_function_init;
 
-#endif /* _NJS_TIMEOUT_H_INCLUDED_ */
+#endif /* _NJS_TIMER_H_INCLUDED_ */
similarity index 58%
rename from nxt/nxt_trace.c
rename to src/njs_trace.c
index 362853105c515e6ef420791c912028b44b6cb24b..9b8c19cc8060fa34a20ed11eff55c3631acf04bc 100644 (file)
@@ -4,22 +4,22 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_malloc.h>
-#include <nxt_sprintf.h>
-#include <nxt_trace.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_malloc.h>
+#include <njs_sprintf.h>
+#include <njs_trace.h>
 
 
 static u_char *
-nxt_last_handler(nxt_trace_t *trace, nxt_trace_data_t *td, u_char *start)
+njs_last_handler(njs_trace_t *trace, njs_trace_data_t *td, u_char *start)
 {
     u_char   *p;
     ssize_t  size;
 
     size = td->end - start;
-    p = nxt_vsprintf(start, start + size, td->fmt, td->args);
+    p = njs_vsprintf(start, start + size, td->fmt, td->args);
 
     if (p - start < size) {
         start = p;
@@ -30,11 +30,11 @@ nxt_last_handler(nxt_trace_t *trace, nxt_trace_data_t *td, u_char *start)
 
 
 void
-nxt_trace_handler(nxt_trace_t *trace, uint32_t level, const char *fmt, ...)
+njs_trace_handler(njs_trace_t *trace, uint32_t level, const char *fmt, ...)
 {
     u_char            *start;
-    nxt_trace_t       last;
-    nxt_trace_data_t  td;
+    njs_trace_t       last;
+    njs_trace_data_t  td;
 
     td.level = level;
     td.fmt = fmt;
@@ -44,7 +44,7 @@ nxt_trace_handler(nxt_trace_t *trace, uint32_t level, const char *fmt, ...)
     start = alloca(trace->size);
     td.end = start + trace->size;
 
-    last.handler = nxt_last_handler;
+    last.handler = njs_last_handler;
     trace->next = &last;
 
     while (trace->prev != NULL) {
similarity index 51%
rename from nxt/nxt_trace.h
rename to src/njs_trace.h
index 26019785942fca216e289c7f5f3986d2b08c8850..ed32c1a3523d7f13bf2632847bfe78cb2a1a639e 100644 (file)
@@ -4,17 +4,17 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#ifndef _NXT_TRACE_H_INCLUDED_
-#define _NXT_TRACE_H_INCLUDED_
+#ifndef _NJS_TRACE_H_INCLUDED_
+#define _NJS_TRACE_H_INCLUDED_
 
 
 typedef enum {
-    NXT_LEVEL_CRIT = 0,
-    NXT_LEVEL_ERROR,
-    NXT_LEVEL_WARN,
-    NXT_LEVEL_INFO,
-    NXT_LEVEL_TRACE,
-} nxt_trace_level_t;
+    NJS_LEVEL_CRIT = 0,
+    NJS_LEVEL_ERROR,
+    NJS_LEVEL_WARN,
+    NJS_LEVEL_INFO,
+    NJS_LEVEL_TRACE,
+} njs_trace_level_t;
 
 
 typedef struct {
@@ -22,47 +22,47 @@ typedef struct {
     u_char               *end;
     const char           *fmt;
     va_list              args;
-} nxt_trace_data_t;
+} njs_trace_data_t;
 
 
-typedef struct nxt_trace_s  nxt_trace_t;
+typedef struct njs_trace_s  njs_trace_t;
 
-typedef u_char *(*nxt_trace_handler_t)(nxt_trace_t *trace, nxt_trace_data_t *td,
+typedef u_char *(*njs_trace_handler_t)(njs_trace_t *trace, njs_trace_data_t *td,
     u_char *start);
 
-struct nxt_trace_s {
+struct njs_trace_s {
     uint32_t             level;
     uint32_t             size;
-    nxt_trace_handler_t  handler;
+    njs_trace_handler_t  handler;
     void                 *data;
-    nxt_trace_t          *prev;
-    nxt_trace_t          *next;
+    njs_trace_t          *prev;
+    njs_trace_t          *next;
 };
 
 
-#define nxt_alert(_trace, _level, ...)                                        \
+#define njs_alert(_trace, _level, ...)                                        \
     do {                                                                      \
-        nxt_trace_t  *_trace_ = _trace;                                       \
+        njs_trace_t  *_trace_ = _trace;                                       \
         uint32_t     _level_ = _level;                                        \
                                                                               \
-        if (nxt_slow_path(_trace_->level >= _level_)) {                       \
-            nxt_trace_handler(_trace_, _level_, __VA_ARGS__);                 \
+        if (njs_slow_path(_trace_->level >= _level_)) {                       \
+            njs_trace_handler(_trace_, _level_, __VA_ARGS__);                 \
         }                                                                     \
     } while (0)
 
 
-#define nxt_trace(_trace, ...)                                                \
+#define njs_trace(_trace, ...)                                                \
     do {                                                                      \
-        nxt_trace_t  *_trace_ = _trace;                                       \
+        njs_trace_t  *_trace_ = _trace;                                       \
                                                                               \
-        if (nxt_slow_path(_trace_->level == NXT_LEVEL_TRACE)) {               \
-            nxt_trace_handler(_trace_, NXT_LEVEL_TRACE, __VA_ARGS__);         \
+        if (njs_slow_path(_trace_->level == NJS_LEVEL_TRACE)) {               \
+            njs_trace_handler(_trace_, NJS_LEVEL_TRACE, __VA_ARGS__);         \
         }                                                                     \
     } while (0)
 
 
-NXT_EXPORT void nxt_trace_handler(nxt_trace_t *trace, uint32_t level,
+NJS_EXPORT void njs_trace_handler(njs_trace_t *trace, uint32_t level,
     const char *fmt, ...);
 
 
-#endif /* _NXT_TRACE_H_INCLUDED_ */
+#endif /* _NJS_TRACE_H_INCLUDED_ */
diff --git a/src/njs_types.h b/src/njs_types.h
new file mode 100644 (file)
index 0000000..d0fd4bc
--- /dev/null
@@ -0,0 +1,122 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_TYPES_H_INCLUDED_
+#define _NJS_TYPES_H_INCLUDED_
+
+
+/*
+ * off_t is 32 bit on Linux, Solaris and HP-UX by default.
+ * Must be before <sys/types.h>.
+ */
+#define _FILE_OFFSET_BITS  64
+
+/* u_char, u_int, int8_t, int32_t, int64_t, size_t, off_t. */
+#include <sys/types.h>
+#include <inttypes.h>
+
+
+#if (__LP64__)
+#define NJS_64BIT       1
+#define NJS_PTR_SIZE    8
+#else
+#define NJS_64BIT       0
+#define NJS_PTR_SIZE    4
+#endif
+
+
+/*
+ * njs_int_t corresponds to the most efficient integer type, an architecture
+ * word.  It is usually the long type, however on Win64 the long is int32_t,
+ * so pointer size suits better.  njs_int_t must be no less than int32_t.
+ */
+
+#if (__amd64__)
+/*
+ * AMD64 64-bit multiplication and division operations are slower and 64-bit
+ * instructions are longer.
+ */
+#define NJS_INT_T_SIZE  4
+typedef int             njs_int_t;
+typedef u_int           njs_uint_t;
+
+#else
+#define NJS_INT_T_SIZE  NJS_PTR_SIZE
+typedef intptr_t        njs_int_t;
+typedef uintptr_t       njs_uint_t;
+#endif
+
+
+#if (NJS_HAVE_UNSIGNED_INT128)
+typedef unsigned __int128 njs_uint128_t;
+#endif
+
+
+#if (NJS_INT_T_SIZE == 8)
+#define NJS_INT_T_LEN        NJS_INT64_T_LEN
+#define NJS_INT_T_HEXLEN     NJS_INT64_T_HEXLEN
+#define NJS_INT_T_MAX        NJS_INT64_T_MAX
+
+#else
+#define NJS_INT_T_LEN        NJS_INT32_T_LEN
+#define NJS_INT_T_HEXLEN     NJS_INT32_T_HEXLEN
+#define NJS_INT_T_MAX        NJS_INT32_T_MAX
+#endif
+
+
+typedef njs_uint_t      njs_bool_t;
+typedef int             njs_err_t;
+
+
+/*
+ * njs_off_t corresponds to OS's off_t, a file offset type.  Although Linux,
+ * Solaris, and HP-UX define both off_t and off64_t, setting _FILE_OFFSET_BITS
+ * to 64 defines off_t as off64_t.
+ */
+#if (NJS_WINDOWS)
+/* Windows defines off_t as a 32-bit "long". */
+typedef __int64        njs_off_t;
+
+#else
+typedef off_t          njs_off_t;
+#endif
+
+
+/*
+ * njs_time_t corresponds to OS's time_t, time in seconds.  njs_time_t is
+ * a signed integer.  OS's time_t may be an integer or real-floating type,
+ * though it is usually a signed 32-bit or 64-bit integer depending on
+ * platform bits length.  There are however exceptions, e.g., time_t is:
+ *   32-bit on 64-bit NetBSD prior to 6.0 version;
+ *   64-bit on 32-bit NetBSD 6.0;
+ *   32-bit on 64-bit OpenBSD;
+ *   64-bit in Linux x32 ABI;
+ *   64-bit in 32-bit Visual Studio C++ 2005.
+ *
+ * Besides, QNX defines time_t as uint32_t.
+ */
+#if (NJS_QNX)
+/* Y2038 fix: "typedef int64_t  njs_time_t". */
+typedef int32_t        njs_time_t;
+
+#else
+/* Y2038, if time_t is 32-bit integer. */
+typedef time_t         njs_time_t;
+#endif
+
+
+typedef pid_t          njs_pid_t;
+
+
+#define NJS_INT32_T_LEN      njs_length("-2147483648")
+#define NJS_INT64_T_LEN      njs_length("-9223372036854775808")
+
+#define NJS_DOUBLE_LEN       (1 + DBL_MAX_10_EXP)
+
+#define NJS_MAX_ERROR_STR    2048
+
+
+#endif /* _NJS_TYPES_H_INCLUDED_ */
similarity index 92%
rename from nxt/nxt_unicode_lower_case.h
rename to src/njs_unicode_lower_case.h
index d5b5cdbe13e88e6dbc0d172308b176318cf149a8..de6b8f072dac0abba53b2667733c59446b8b9a0d 100644 (file)
@@ -4,13 +4,13 @@
  * 20330 bytes on 32-bit platforms, 24242 bytes on 64-bit platforms.
  */
 
-#define NXT_UNICODE_MAX_LOWER_CASE  0x1e921
+#define NJS_UNICODE_MAX_LOWER_CASE  0x1e921
 
-#define NXT_UNICODE_BLOCK_SIZE      128
+#define NJS_UNICODE_BLOCK_SIZE      128
 
 
-static const uint32_t  nxt_unicode_lower_case_block_000[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_000[128]
+    njs_aligned(64) =
 {
     0x00000, 0x00001, 0x00002, 0x00003, 0x00004, 0x00005, 0x00006, 0x00007,
     0x00008, 0x00009, 0x0000a, 0x0000b, 0x0000c, 0x0000d, 0x0000e, 0x0000f,
@@ -31,8 +31,8 @@ static const uint32_t  nxt_unicode_lower_case_block_000[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_001[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_001[128]
+    njs_aligned(64) =
 {
     0x00080, 0x00081, 0x00082, 0x00083, 0x00084, 0x00085, 0x00086, 0x00087,
     0x00088, 0x00089, 0x0008a, 0x0008b, 0x0008c, 0x0008d, 0x0008e, 0x0008f,
@@ -53,8 +53,8 @@ static const uint32_t  nxt_unicode_lower_case_block_001[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_002[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_002[128]
+    njs_aligned(64) =
 {
     0x00101, 0x00101, 0x00103, 0x00103, 0x00105, 0x00105, 0x00107, 0x00107,
     0x00109, 0x00109, 0x0010b, 0x0010b, 0x0010d, 0x0010d, 0x0010f, 0x0010f,
@@ -75,8 +75,8 @@ static const uint32_t  nxt_unicode_lower_case_block_002[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_003[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_003[128]
+    njs_aligned(64) =
 {
     0x00180, 0x00253, 0x00183, 0x00183, 0x00185, 0x00185, 0x00254, 0x00188,
     0x00188, 0x00256, 0x00257, 0x0018c, 0x0018c, 0x0018d, 0x001dd, 0x00259,
@@ -97,8 +97,8 @@ static const uint32_t  nxt_unicode_lower_case_block_003[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_004[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_004[128]
+    njs_aligned(64) =
 {
     0x00201, 0x00201, 0x00203, 0x00203, 0x00205, 0x00205, 0x00207, 0x00207,
     0x00209, 0x00209, 0x0020b, 0x0020b, 0x0020d, 0x0020d, 0x0020f, 0x0020f,
@@ -119,8 +119,8 @@ static const uint32_t  nxt_unicode_lower_case_block_004[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_006[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_006[128]
+    njs_aligned(64) =
 {
     0x00300, 0x00301, 0x00302, 0x00303, 0x00304, 0x00305, 0x00306, 0x00307,
     0x00308, 0x00309, 0x0030a, 0x0030b, 0x0030c, 0x0030d, 0x0030e, 0x0030f,
@@ -141,8 +141,8 @@ static const uint32_t  nxt_unicode_lower_case_block_006[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_007[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_007[128]
+    njs_aligned(64) =
 {
     0x00380, 0x00381, 0x00382, 0x00383, 0x00384, 0x00385, 0x003ac, 0x00387,
     0x003ad, 0x003ae, 0x003af, 0x0038b, 0x003cc, 0x0038d, 0x003cd, 0x003ce,
@@ -163,8 +163,8 @@ static const uint32_t  nxt_unicode_lower_case_block_007[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_008[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_008[128]
+    njs_aligned(64) =
 {
     0x00450, 0x00451, 0x00452, 0x00453, 0x00454, 0x00455, 0x00456, 0x00457,
     0x00458, 0x00459, 0x0045a, 0x0045b, 0x0045c, 0x0045d, 0x0045e, 0x0045f,
@@ -185,8 +185,8 @@ static const uint32_t  nxt_unicode_lower_case_block_008[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_009[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_009[128]
+    njs_aligned(64) =
 {
     0x00481, 0x00481, 0x00482, 0x00483, 0x00484, 0x00485, 0x00486, 0x00487,
     0x00488, 0x00489, 0x0048b, 0x0048b, 0x0048d, 0x0048d, 0x0048f, 0x0048f,
@@ -207,8 +207,8 @@ static const uint32_t  nxt_unicode_lower_case_block_009[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_00a[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_00a[128]
+    njs_aligned(64) =
 {
     0x00501, 0x00501, 0x00503, 0x00503, 0x00505, 0x00505, 0x00507, 0x00507,
     0x00509, 0x00509, 0x0050b, 0x0050b, 0x0050d, 0x0050d, 0x0050f, 0x0050f,
@@ -229,8 +229,8 @@ static const uint32_t  nxt_unicode_lower_case_block_00a[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_021[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_021[128]
+    njs_aligned(64) =
 {
     0x01080, 0x01081, 0x01082, 0x01083, 0x01084, 0x01085, 0x01086, 0x01087,
     0x01088, 0x01089, 0x0108a, 0x0108b, 0x0108c, 0x0108d, 0x0108e, 0x0108f,
@@ -251,8 +251,8 @@ static const uint32_t  nxt_unicode_lower_case_block_021[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_027[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_027[128]
+    njs_aligned(64) =
 {
     0x01380, 0x01381, 0x01382, 0x01383, 0x01384, 0x01385, 0x01386, 0x01387,
     0x01388, 0x01389, 0x0138a, 0x0138b, 0x0138c, 0x0138d, 0x0138e, 0x0138f,
@@ -273,8 +273,8 @@ static const uint32_t  nxt_unicode_lower_case_block_027[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_039[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_039[128]
+    njs_aligned(64) =
 {
     0x01c80, 0x01c81, 0x01c82, 0x01c83, 0x01c84, 0x01c85, 0x01c86, 0x01c87,
     0x01c88, 0x01c89, 0x01c8a, 0x01c8b, 0x01c8c, 0x01c8d, 0x01c8e, 0x01c8f,
@@ -295,8 +295,8 @@ static const uint32_t  nxt_unicode_lower_case_block_039[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_03c[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_03c[128]
+    njs_aligned(64) =
 {
     0x01e01, 0x01e01, 0x01e03, 0x01e03, 0x01e05, 0x01e05, 0x01e07, 0x01e07,
     0x01e09, 0x01e09, 0x01e0b, 0x01e0b, 0x01e0d, 0x01e0d, 0x01e0f, 0x01e0f,
@@ -317,8 +317,8 @@ static const uint32_t  nxt_unicode_lower_case_block_03c[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_03d[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_03d[128]
+    njs_aligned(64) =
 {
     0x01e81, 0x01e81, 0x01e83, 0x01e83, 0x01e85, 0x01e85, 0x01e87, 0x01e87,
     0x01e89, 0x01e89, 0x01e8b, 0x01e8b, 0x01e8d, 0x01e8d, 0x01e8f, 0x01e8f,
@@ -339,8 +339,8 @@ static const uint32_t  nxt_unicode_lower_case_block_03d[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_03e[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_03e[128]
+    njs_aligned(64) =
 {
     0x01f00, 0x01f01, 0x01f02, 0x01f03, 0x01f04, 0x01f05, 0x01f06, 0x01f07,
     0x01f00, 0x01f01, 0x01f02, 0x01f03, 0x01f04, 0x01f05, 0x01f06, 0x01f07,
@@ -361,8 +361,8 @@ static const uint32_t  nxt_unicode_lower_case_block_03e[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_03f[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_03f[128]
+    njs_aligned(64) =
 {
     0x01f80, 0x01f81, 0x01f82, 0x01f83, 0x01f84, 0x01f85, 0x01f86, 0x01f87,
     0x01f80, 0x01f81, 0x01f82, 0x01f83, 0x01f84, 0x01f85, 0x01f86, 0x01f87,
@@ -383,8 +383,8 @@ static const uint32_t  nxt_unicode_lower_case_block_03f[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_042[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_042[128]
+    njs_aligned(64) =
 {
     0x02100, 0x02101, 0x02102, 0x02103, 0x02104, 0x02105, 0x02106, 0x02107,
     0x02108, 0x02109, 0x0210a, 0x0210b, 0x0210c, 0x0210d, 0x0210e, 0x0210f,
@@ -405,8 +405,8 @@ static const uint32_t  nxt_unicode_lower_case_block_042[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_043[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_043[128]
+    njs_aligned(64) =
 {
     0x02180, 0x02181, 0x02182, 0x02184, 0x02184, 0x02185, 0x02186, 0x02187,
     0x02188, 0x02189, 0x0218a, 0x0218b, 0x0218c, 0x0218d, 0x0218e, 0x0218f,
@@ -427,8 +427,8 @@ static const uint32_t  nxt_unicode_lower_case_block_043[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_049[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_049[128]
+    njs_aligned(64) =
 {
     0x02480, 0x02481, 0x02482, 0x02483, 0x02484, 0x02485, 0x02486, 0x02487,
     0x02488, 0x02489, 0x0248a, 0x0248b, 0x0248c, 0x0248d, 0x0248e, 0x0248f,
@@ -449,8 +449,8 @@ static const uint32_t  nxt_unicode_lower_case_block_049[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_058[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_058[128]
+    njs_aligned(64) =
 {
     0x02c30, 0x02c31, 0x02c32, 0x02c33, 0x02c34, 0x02c35, 0x02c36, 0x02c37,
     0x02c38, 0x02c39, 0x02c3a, 0x02c3b, 0x02c3c, 0x02c3d, 0x02c3e, 0x02c3f,
@@ -471,8 +471,8 @@ static const uint32_t  nxt_unicode_lower_case_block_058[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_059[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_059[128]
+    njs_aligned(64) =
 {
     0x02c81, 0x02c81, 0x02c83, 0x02c83, 0x02c85, 0x02c85, 0x02c87, 0x02c87,
     0x02c89, 0x02c89, 0x02c8b, 0x02c8b, 0x02c8d, 0x02c8d, 0x02c8f, 0x02c8f,
@@ -493,8 +493,8 @@ static const uint32_t  nxt_unicode_lower_case_block_059[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_14c[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_14c[128]
+    njs_aligned(64) =
 {
     0x0a600, 0x0a601, 0x0a602, 0x0a603, 0x0a604, 0x0a605, 0x0a606, 0x0a607,
     0x0a608, 0x0a609, 0x0a60a, 0x0a60b, 0x0a60c, 0x0a60d, 0x0a60e, 0x0a60f,
@@ -515,8 +515,8 @@ static const uint32_t  nxt_unicode_lower_case_block_14c[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_14d[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_14d[128]
+    njs_aligned(64) =
 {
     0x0a681, 0x0a681, 0x0a683, 0x0a683, 0x0a685, 0x0a685, 0x0a687, 0x0a687,
     0x0a689, 0x0a689, 0x0a68b, 0x0a68b, 0x0a68d, 0x0a68d, 0x0a68f, 0x0a68f,
@@ -537,8 +537,8 @@ static const uint32_t  nxt_unicode_lower_case_block_14d[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_14e[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_14e[128]
+    njs_aligned(64) =
 {
     0x0a700, 0x0a701, 0x0a702, 0x0a703, 0x0a704, 0x0a705, 0x0a706, 0x0a707,
     0x0a708, 0x0a709, 0x0a70a, 0x0a70b, 0x0a70c, 0x0a70d, 0x0a70e, 0x0a70f,
@@ -559,8 +559,8 @@ static const uint32_t  nxt_unicode_lower_case_block_14e[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_14f[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_14f[128]
+    njs_aligned(64) =
 {
     0x0a781, 0x0a781, 0x0a783, 0x0a783, 0x0a785, 0x0a785, 0x0a787, 0x0a787,
     0x0a788, 0x0a789, 0x0a78a, 0x0a78c, 0x0a78c, 0x00265, 0x0a78e, 0x0a78f,
@@ -581,8 +581,8 @@ static const uint32_t  nxt_unicode_lower_case_block_14f[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_1fe[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_1fe[128]
+    njs_aligned(64) =
 {
     0x0ff00, 0x0ff01, 0x0ff02, 0x0ff03, 0x0ff04, 0x0ff05, 0x0ff06, 0x0ff07,
     0x0ff08, 0x0ff09, 0x0ff0a, 0x0ff0b, 0x0ff0c, 0x0ff0d, 0x0ff0e, 0x0ff0f,
@@ -603,8 +603,8 @@ static const uint32_t  nxt_unicode_lower_case_block_1fe[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_208[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_208[128]
+    njs_aligned(64) =
 {
     0x10428, 0x10429, 0x1042a, 0x1042b, 0x1042c, 0x1042d, 0x1042e, 0x1042f,
     0x10430, 0x10431, 0x10432, 0x10433, 0x10434, 0x10435, 0x10436, 0x10437,
@@ -625,8 +625,8 @@ static const uint32_t  nxt_unicode_lower_case_block_208[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_209[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_209[128]
+    njs_aligned(64) =
 {
     0x10480, 0x10481, 0x10482, 0x10483, 0x10484, 0x10485, 0x10486, 0x10487,
     0x10488, 0x10489, 0x1048a, 0x1048b, 0x1048c, 0x1048d, 0x1048e, 0x1048f,
@@ -647,8 +647,8 @@ static const uint32_t  nxt_unicode_lower_case_block_209[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_219[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_219[128]
+    njs_aligned(64) =
 {
     0x10cc0, 0x10cc1, 0x10cc2, 0x10cc3, 0x10cc4, 0x10cc5, 0x10cc6, 0x10cc7,
     0x10cc8, 0x10cc9, 0x10cca, 0x10ccb, 0x10ccc, 0x10ccd, 0x10cce, 0x10ccf,
@@ -669,8 +669,8 @@ static const uint32_t  nxt_unicode_lower_case_block_219[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_231[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_231[128]
+    njs_aligned(64) =
 {
     0x11880, 0x11881, 0x11882, 0x11883, 0x11884, 0x11885, 0x11886, 0x11887,
     0x11888, 0x11889, 0x1188a, 0x1188b, 0x1188c, 0x1188d, 0x1188e, 0x1188f,
@@ -691,8 +691,8 @@ static const uint32_t  nxt_unicode_lower_case_block_231[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_2dc[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_2dc[128]
+    njs_aligned(64) =
 {
     0x16e00, 0x16e01, 0x16e02, 0x16e03, 0x16e04, 0x16e05, 0x16e06, 0x16e07,
     0x16e08, 0x16e09, 0x16e0a, 0x16e0b, 0x16e0c, 0x16e0d, 0x16e0e, 0x16e0f,
@@ -713,8 +713,8 @@ static const uint32_t  nxt_unicode_lower_case_block_2dc[128]
 };
 
 
-static const uint32_t  nxt_unicode_lower_case_block_3d2[34]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_lower_case_block_3d2[34]
+    njs_aligned(64) =
 {
     0x1e922, 0x1e923, 0x1e924, 0x1e925, 0x1e926, 0x1e927, 0x1e928, 0x1e929,
     0x1e92a, 0x1e92b, 0x1e92c, 0x1e92d, 0x1e92e, 0x1e92f, 0x1e930, 0x1e931,
@@ -724,20 +724,20 @@ static const uint32_t  nxt_unicode_lower_case_block_3d2[34]
 };
 
 
-static const uint32_t  *nxt_unicode_lower_case_blocks[]
-    nxt_aligned(64) =
+static const uint32_t  *njs_unicode_lower_case_blocks[]
+    njs_aligned(64) =
 {
-    nxt_unicode_lower_case_block_000,
-    nxt_unicode_lower_case_block_001,
-    nxt_unicode_lower_case_block_002,
-    nxt_unicode_lower_case_block_003,
-    nxt_unicode_lower_case_block_004,
+    njs_unicode_lower_case_block_000,
+    njs_unicode_lower_case_block_001,
+    njs_unicode_lower_case_block_002,
+    njs_unicode_lower_case_block_003,
+    njs_unicode_lower_case_block_004,
     NULL,
-    nxt_unicode_lower_case_block_006,
-    nxt_unicode_lower_case_block_007,
-    nxt_unicode_lower_case_block_008,
-    nxt_unicode_lower_case_block_009,
-    nxt_unicode_lower_case_block_00a,
+    njs_unicode_lower_case_block_006,
+    njs_unicode_lower_case_block_007,
+    njs_unicode_lower_case_block_008,
+    njs_unicode_lower_case_block_009,
+    njs_unicode_lower_case_block_00a,
     NULL,
     NULL,
     NULL,
@@ -760,13 +760,13 @@ static const uint32_t  *nxt_unicode_lower_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_021,
+    njs_unicode_lower_case_block_021,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_027,
+    njs_unicode_lower_case_block_027,
     NULL,
     NULL,
     NULL,
@@ -784,23 +784,23 @@ static const uint32_t  *nxt_unicode_lower_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_039,
+    njs_unicode_lower_case_block_039,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_03c,
-    nxt_unicode_lower_case_block_03d,
-    nxt_unicode_lower_case_block_03e,
-    nxt_unicode_lower_case_block_03f,
+    njs_unicode_lower_case_block_03c,
+    njs_unicode_lower_case_block_03d,
+    njs_unicode_lower_case_block_03e,
+    njs_unicode_lower_case_block_03f,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_042,
-    nxt_unicode_lower_case_block_043,
+    njs_unicode_lower_case_block_042,
+    njs_unicode_lower_case_block_043,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_049,
+    njs_unicode_lower_case_block_049,
     NULL,
     NULL,
     NULL,
@@ -815,8 +815,8 @@ static const uint32_t  *nxt_unicode_lower_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_058,
-    nxt_unicode_lower_case_block_059,
+    njs_unicode_lower_case_block_058,
+    njs_unicode_lower_case_block_059,
     NULL,
     NULL,
     NULL,
@@ -1059,10 +1059,10 @@ static const uint32_t  *nxt_unicode_lower_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_14c,
-    nxt_unicode_lower_case_block_14d,
-    nxt_unicode_lower_case_block_14e,
-    nxt_unicode_lower_case_block_14f,
+    njs_unicode_lower_case_block_14c,
+    njs_unicode_lower_case_block_14d,
+    njs_unicode_lower_case_block_14e,
+    njs_unicode_lower_case_block_14f,
     NULL,
     NULL,
     NULL,
@@ -1237,7 +1237,7 @@ static const uint32_t  *nxt_unicode_lower_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_1fe,
+    njs_unicode_lower_case_block_1fe,
     NULL,
     NULL,
     NULL,
@@ -1247,8 +1247,8 @@ static const uint32_t  *nxt_unicode_lower_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_208,
-    nxt_unicode_lower_case_block_209,
+    njs_unicode_lower_case_block_208,
+    njs_unicode_lower_case_block_209,
     NULL,
     NULL,
     NULL,
@@ -1264,7 +1264,7 @@ static const uint32_t  *nxt_unicode_lower_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_219,
+    njs_unicode_lower_case_block_219,
     NULL,
     NULL,
     NULL,
@@ -1288,7 +1288,7 @@ static const uint32_t  *nxt_unicode_lower_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_231,
+    njs_unicode_lower_case_block_231,
     NULL,
     NULL,
     NULL,
@@ -1459,7 +1459,7 @@ static const uint32_t  *nxt_unicode_lower_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_2dc,
+    njs_unicode_lower_case_block_2dc,
     NULL,
     NULL,
     NULL,
@@ -1705,5 +1705,5 @@ static const uint32_t  *nxt_unicode_lower_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_lower_case_block_3d2,
+    njs_unicode_lower_case_block_3d2,
 };
similarity index 83%
rename from nxt/nxt_unicode_lower_case.pl
rename to src/njs_unicode_lower_case.pl
index 78f86858a30506075efb149c67cd5043b2150c4a..51272e31f6e00f12ac5efc20829773cc6e1ed157 100755 (executable)
@@ -48,16 +48,16 @@ printf("\n/*\n" .
        ($blocks - 1) * BLOCK_SIZE * 4 + $last_block_size + $max_block * 4,
        ($blocks - 1) * BLOCK_SIZE * 4 + $last_block_size + $max_block * 8);
 
-printf("#define NXT_UNICODE_MAX_LOWER_CASE  0x%05x\n\n", $max_lower_case);
-printf("#define NXT_UNICODE_BLOCK_SIZE      %d\n\n\n", BLOCK_SIZE);
+printf("#define NJS_UNICODE_MAX_LOWER_CASE  0x%05x\n\n", $max_lower_case);
+printf("#define NJS_UNICODE_BLOCK_SIZE      %d\n\n\n", BLOCK_SIZE);
 
 
 for my $block (sort { $a <=> $b } keys %blocks) {
     my $block_size = ($block != $max_block) ? BLOCK_SIZE : $last_block_size;
 
     print "static const uint32_t  ";
-    printf("nxt_unicode_lower_case_block_%03x[%d]\n" .
-           "    nxt_aligned(64) =\n" .
+    printf("njs_unicode_lower_case_block_%03x[%d]\n" .
+           "    njs_aligned(64) =\n" .
            "{",
            $block, $block_size);
 
@@ -79,13 +79,13 @@ for my $block (sort { $a <=> $b } keys %blocks) {
 }
 
 
-print "static const uint32_t  *nxt_unicode_lower_case_blocks[]\n" .
-      "    nxt_aligned(64) =\n" .
+print "static const uint32_t  *njs_unicode_lower_case_blocks[]\n" .
+      "    njs_aligned(64) =\n" .
       "{\n";
 
 for my $block (0 .. $max_block) {
     if (exists($blocks{$block})) {
-        printf("    nxt_unicode_lower_case_block_%03x,\n", $block);
+        printf("    njs_unicode_lower_case_block_%03x,\n", $block);
 
     } else {
         print  "    NULL,\n";
similarity index 92%
rename from nxt/nxt_unicode_upper_case.h
rename to src/njs_unicode_upper_case.h
index c0d977c680ea0fc8669317b7df0ae5bae8ef5bad..ea3b29502ef1243903d7409f3d77234bc47848d8 100644 (file)
@@ -4,13 +4,13 @@
  * 23948 bytes on 32-bit platforms, 27860 bytes on 64-bit platforms.
  */
 
-#define NXT_UNICODE_MAX_UPPER_CASE  0x1e943
+#define NJS_UNICODE_MAX_UPPER_CASE  0x1e943
 
-#define NXT_UNICODE_BLOCK_SIZE      128
+#define NJS_UNICODE_BLOCK_SIZE      128
 
 
-static const uint32_t  nxt_unicode_upper_case_block_000[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_000[128]
+    njs_aligned(64) =
 {
     0x00000, 0x00001, 0x00002, 0x00003, 0x00004, 0x00005, 0x00006, 0x00007,
     0x00008, 0x00009, 0x0000a, 0x0000b, 0x0000c, 0x0000d, 0x0000e, 0x0000f,
@@ -31,8 +31,8 @@ static const uint32_t  nxt_unicode_upper_case_block_000[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_001[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_001[128]
+    njs_aligned(64) =
 {
     0x00080, 0x00081, 0x00082, 0x00083, 0x00084, 0x00085, 0x00086, 0x00087,
     0x00088, 0x00089, 0x0008a, 0x0008b, 0x0008c, 0x0008d, 0x0008e, 0x0008f,
@@ -53,8 +53,8 @@ static const uint32_t  nxt_unicode_upper_case_block_001[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_002[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_002[128]
+    njs_aligned(64) =
 {
     0x00100, 0x00100, 0x00102, 0x00102, 0x00104, 0x00104, 0x00106, 0x00106,
     0x00108, 0x00108, 0x0010a, 0x0010a, 0x0010c, 0x0010c, 0x0010e, 0x0010e,
@@ -75,8 +75,8 @@ static const uint32_t  nxt_unicode_upper_case_block_002[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_003[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_003[128]
+    njs_aligned(64) =
 {
     0x00243, 0x00181, 0x00182, 0x00182, 0x00184, 0x00184, 0x00186, 0x00187,
     0x00187, 0x00189, 0x0018a, 0x0018b, 0x0018b, 0x0018d, 0x0018e, 0x0018f,
@@ -97,8 +97,8 @@ static const uint32_t  nxt_unicode_upper_case_block_003[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_004[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_004[128]
+    njs_aligned(64) =
 {
     0x00200, 0x00200, 0x00202, 0x00202, 0x00204, 0x00204, 0x00206, 0x00206,
     0x00208, 0x00208, 0x0020a, 0x0020a, 0x0020c, 0x0020c, 0x0020e, 0x0020e,
@@ -119,8 +119,8 @@ static const uint32_t  nxt_unicode_upper_case_block_004[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_005[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_005[128]
+    njs_aligned(64) =
 {
     0x001a6, 0x00281, 0x0a7c5, 0x001a9, 0x00284, 0x00285, 0x00286, 0x0a7b1,
     0x001ae, 0x00244, 0x001b1, 0x001b2, 0x00245, 0x0028d, 0x0028e, 0x0028f,
@@ -141,8 +141,8 @@ static const uint32_t  nxt_unicode_upper_case_block_005[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_006[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_006[128]
+    njs_aligned(64) =
 {
     0x00300, 0x00301, 0x00302, 0x00303, 0x00304, 0x00305, 0x00306, 0x00307,
     0x00308, 0x00309, 0x0030a, 0x0030b, 0x0030c, 0x0030d, 0x0030e, 0x0030f,
@@ -163,8 +163,8 @@ static const uint32_t  nxt_unicode_upper_case_block_006[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_007[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_007[128]
+    njs_aligned(64) =
 {
     0x00380, 0x00381, 0x00382, 0x00383, 0x00384, 0x00385, 0x00386, 0x00387,
     0x00388, 0x00389, 0x0038a, 0x0038b, 0x0038c, 0x0038d, 0x0038e, 0x0038f,
@@ -185,8 +185,8 @@ static const uint32_t  nxt_unicode_upper_case_block_007[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_008[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_008[128]
+    njs_aligned(64) =
 {
     0x00400, 0x00401, 0x00402, 0x00403, 0x00404, 0x00405, 0x00406, 0x00407,
     0x00408, 0x00409, 0x0040a, 0x0040b, 0x0040c, 0x0040d, 0x0040e, 0x0040f,
@@ -207,8 +207,8 @@ static const uint32_t  nxt_unicode_upper_case_block_008[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_009[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_009[128]
+    njs_aligned(64) =
 {
     0x00480, 0x00480, 0x00482, 0x00483, 0x00484, 0x00485, 0x00486, 0x00487,
     0x00488, 0x00489, 0x0048a, 0x0048a, 0x0048c, 0x0048c, 0x0048e, 0x0048e,
@@ -229,8 +229,8 @@ static const uint32_t  nxt_unicode_upper_case_block_009[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_00a[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_00a[128]
+    njs_aligned(64) =
 {
     0x00500, 0x00500, 0x00502, 0x00502, 0x00504, 0x00504, 0x00506, 0x00506,
     0x00508, 0x00508, 0x0050a, 0x0050a, 0x0050c, 0x0050c, 0x0050e, 0x0050e,
@@ -251,8 +251,8 @@ static const uint32_t  nxt_unicode_upper_case_block_00a[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_00b[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_00b[128]
+    njs_aligned(64) =
 {
     0x00550, 0x00551, 0x00552, 0x00553, 0x00554, 0x00555, 0x00556, 0x00587,
     0x00588, 0x00589, 0x0058a, 0x0058b, 0x0058c, 0x0058d, 0x0058e, 0x0058f,
@@ -273,8 +273,8 @@ static const uint32_t  nxt_unicode_upper_case_block_00b[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_021[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_021[128]
+    njs_aligned(64) =
 {
     0x01080, 0x01081, 0x01082, 0x01083, 0x01084, 0x01085, 0x01086, 0x01087,
     0x01088, 0x01089, 0x0108a, 0x0108b, 0x0108c, 0x0108d, 0x0108e, 0x0108f,
@@ -295,8 +295,8 @@ static const uint32_t  nxt_unicode_upper_case_block_021[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_027[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_027[128]
+    njs_aligned(64) =
 {
     0x01380, 0x01381, 0x01382, 0x01383, 0x01384, 0x01385, 0x01386, 0x01387,
     0x01388, 0x01389, 0x0138a, 0x0138b, 0x0138c, 0x0138d, 0x0138e, 0x0138f,
@@ -317,8 +317,8 @@ static const uint32_t  nxt_unicode_upper_case_block_027[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_039[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_039[128]
+    njs_aligned(64) =
 {
     0x00412, 0x00414, 0x0041e, 0x00421, 0x00422, 0x00422, 0x0042a, 0x00462,
     0x0a64a, 0x01c89, 0x01c8a, 0x01c8b, 0x01c8c, 0x01c8d, 0x01c8e, 0x01c8f,
@@ -339,8 +339,8 @@ static const uint32_t  nxt_unicode_upper_case_block_039[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_03a[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_03a[128]
+    njs_aligned(64) =
 {
     0x01d00, 0x01d01, 0x01d02, 0x01d03, 0x01d04, 0x01d05, 0x01d06, 0x01d07,
     0x01d08, 0x01d09, 0x01d0a, 0x01d0b, 0x01d0c, 0x01d0d, 0x01d0e, 0x01d0f,
@@ -361,8 +361,8 @@ static const uint32_t  nxt_unicode_upper_case_block_03a[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_03b[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_03b[128]
+    njs_aligned(64) =
 {
     0x01d80, 0x01d81, 0x01d82, 0x01d83, 0x01d84, 0x01d85, 0x01d86, 0x01d87,
     0x01d88, 0x01d89, 0x01d8a, 0x01d8b, 0x01d8c, 0x01d8d, 0x0a7c6, 0x01d8f,
@@ -383,8 +383,8 @@ static const uint32_t  nxt_unicode_upper_case_block_03b[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_03c[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_03c[128]
+    njs_aligned(64) =
 {
     0x01e00, 0x01e00, 0x01e02, 0x01e02, 0x01e04, 0x01e04, 0x01e06, 0x01e06,
     0x01e08, 0x01e08, 0x01e0a, 0x01e0a, 0x01e0c, 0x01e0c, 0x01e0e, 0x01e0e,
@@ -405,8 +405,8 @@ static const uint32_t  nxt_unicode_upper_case_block_03c[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_03d[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_03d[128]
+    njs_aligned(64) =
 {
     0x01e80, 0x01e80, 0x01e82, 0x01e82, 0x01e84, 0x01e84, 0x01e86, 0x01e86,
     0x01e88, 0x01e88, 0x01e8a, 0x01e8a, 0x01e8c, 0x01e8c, 0x01e8e, 0x01e8e,
@@ -427,8 +427,8 @@ static const uint32_t  nxt_unicode_upper_case_block_03d[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_03e[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_03e[128]
+    njs_aligned(64) =
 {
     0x01f08, 0x01f09, 0x01f0a, 0x01f0b, 0x01f0c, 0x01f0d, 0x01f0e, 0x01f0f,
     0x01f08, 0x01f09, 0x01f0a, 0x01f0b, 0x01f0c, 0x01f0d, 0x01f0e, 0x01f0f,
@@ -449,8 +449,8 @@ static const uint32_t  nxt_unicode_upper_case_block_03e[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_03f[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_03f[128]
+    njs_aligned(64) =
 {
     0x01f88, 0x01f89, 0x01f8a, 0x01f8b, 0x01f8c, 0x01f8d, 0x01f8e, 0x01f8f,
     0x01f88, 0x01f89, 0x01f8a, 0x01f8b, 0x01f8c, 0x01f8d, 0x01f8e, 0x01f8f,
@@ -471,8 +471,8 @@ static const uint32_t  nxt_unicode_upper_case_block_03f[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_042[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_042[128]
+    njs_aligned(64) =
 {
     0x02100, 0x02101, 0x02102, 0x02103, 0x02104, 0x02105, 0x02106, 0x02107,
     0x02108, 0x02109, 0x0210a, 0x0210b, 0x0210c, 0x0210d, 0x0210e, 0x0210f,
@@ -493,8 +493,8 @@ static const uint32_t  nxt_unicode_upper_case_block_042[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_043[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_043[128]
+    njs_aligned(64) =
 {
     0x02180, 0x02181, 0x02182, 0x02183, 0x02183, 0x02185, 0x02186, 0x02187,
     0x02188, 0x02189, 0x0218a, 0x0218b, 0x0218c, 0x0218d, 0x0218e, 0x0218f,
@@ -515,8 +515,8 @@ static const uint32_t  nxt_unicode_upper_case_block_043[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_049[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_049[128]
+    njs_aligned(64) =
 {
     0x02480, 0x02481, 0x02482, 0x02483, 0x02484, 0x02485, 0x02486, 0x02487,
     0x02488, 0x02489, 0x0248a, 0x0248b, 0x0248c, 0x0248d, 0x0248e, 0x0248f,
@@ -537,8 +537,8 @@ static const uint32_t  nxt_unicode_upper_case_block_049[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_058[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_058[128]
+    njs_aligned(64) =
 {
     0x02c00, 0x02c01, 0x02c02, 0x02c03, 0x02c04, 0x02c05, 0x02c06, 0x02c07,
     0x02c08, 0x02c09, 0x02c0a, 0x02c0b, 0x02c0c, 0x02c0d, 0x02c0e, 0x02c0f,
@@ -559,8 +559,8 @@ static const uint32_t  nxt_unicode_upper_case_block_058[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_059[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_059[128]
+    njs_aligned(64) =
 {
     0x02c80, 0x02c80, 0x02c82, 0x02c82, 0x02c84, 0x02c84, 0x02c86, 0x02c86,
     0x02c88, 0x02c88, 0x02c8a, 0x02c8a, 0x02c8c, 0x02c8c, 0x02c8e, 0x02c8e,
@@ -581,8 +581,8 @@ static const uint32_t  nxt_unicode_upper_case_block_059[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_05a[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_05a[128]
+    njs_aligned(64) =
 {
     0x010a0, 0x010a1, 0x010a2, 0x010a3, 0x010a4, 0x010a5, 0x010a6, 0x010a7,
     0x010a8, 0x010a9, 0x010aa, 0x010ab, 0x010ac, 0x010ad, 0x010ae, 0x010af,
@@ -603,8 +603,8 @@ static const uint32_t  nxt_unicode_upper_case_block_05a[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_14c[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_14c[128]
+    njs_aligned(64) =
 {
     0x0a600, 0x0a601, 0x0a602, 0x0a603, 0x0a604, 0x0a605, 0x0a606, 0x0a607,
     0x0a608, 0x0a609, 0x0a60a, 0x0a60b, 0x0a60c, 0x0a60d, 0x0a60e, 0x0a60f,
@@ -625,8 +625,8 @@ static const uint32_t  nxt_unicode_upper_case_block_14c[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_14d[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_14d[128]
+    njs_aligned(64) =
 {
     0x0a680, 0x0a680, 0x0a682, 0x0a682, 0x0a684, 0x0a684, 0x0a686, 0x0a686,
     0x0a688, 0x0a688, 0x0a68a, 0x0a68a, 0x0a68c, 0x0a68c, 0x0a68e, 0x0a68e,
@@ -647,8 +647,8 @@ static const uint32_t  nxt_unicode_upper_case_block_14d[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_14e[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_14e[128]
+    njs_aligned(64) =
 {
     0x0a700, 0x0a701, 0x0a702, 0x0a703, 0x0a704, 0x0a705, 0x0a706, 0x0a707,
     0x0a708, 0x0a709, 0x0a70a, 0x0a70b, 0x0a70c, 0x0a70d, 0x0a70e, 0x0a70f,
@@ -669,8 +669,8 @@ static const uint32_t  nxt_unicode_upper_case_block_14e[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_14f[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_14f[128]
+    njs_aligned(64) =
 {
     0x0a780, 0x0a780, 0x0a782, 0x0a782, 0x0a784, 0x0a784, 0x0a786, 0x0a786,
     0x0a788, 0x0a789, 0x0a78a, 0x0a78b, 0x0a78b, 0x0a78d, 0x0a78e, 0x0a78f,
@@ -691,8 +691,8 @@ static const uint32_t  nxt_unicode_upper_case_block_14f[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_156[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_156[128]
+    njs_aligned(64) =
 {
     0x0ab00, 0x0ab01, 0x0ab02, 0x0ab03, 0x0ab04, 0x0ab05, 0x0ab06, 0x0ab07,
     0x0ab08, 0x0ab09, 0x0ab0a, 0x0ab0b, 0x0ab0c, 0x0ab0d, 0x0ab0e, 0x0ab0f,
@@ -713,8 +713,8 @@ static const uint32_t  nxt_unicode_upper_case_block_156[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_157[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_157[128]
+    njs_aligned(64) =
 {
     0x013b0, 0x013b1, 0x013b2, 0x013b3, 0x013b4, 0x013b5, 0x013b6, 0x013b7,
     0x013b8, 0x013b9, 0x013ba, 0x013bb, 0x013bc, 0x013bd, 0x013be, 0x013bf,
@@ -735,8 +735,8 @@ static const uint32_t  nxt_unicode_upper_case_block_157[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_1fe[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_1fe[128]
+    njs_aligned(64) =
 {
     0x0ff00, 0x0ff01, 0x0ff02, 0x0ff03, 0x0ff04, 0x0ff05, 0x0ff06, 0x0ff07,
     0x0ff08, 0x0ff09, 0x0ff0a, 0x0ff0b, 0x0ff0c, 0x0ff0d, 0x0ff0e, 0x0ff0f,
@@ -757,8 +757,8 @@ static const uint32_t  nxt_unicode_upper_case_block_1fe[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_208[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_208[128]
+    njs_aligned(64) =
 {
     0x10400, 0x10401, 0x10402, 0x10403, 0x10404, 0x10405, 0x10406, 0x10407,
     0x10408, 0x10409, 0x1040a, 0x1040b, 0x1040c, 0x1040d, 0x1040e, 0x1040f,
@@ -779,8 +779,8 @@ static const uint32_t  nxt_unicode_upper_case_block_208[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_209[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_209[128]
+    njs_aligned(64) =
 {
     0x10480, 0x10481, 0x10482, 0x10483, 0x10484, 0x10485, 0x10486, 0x10487,
     0x10488, 0x10489, 0x1048a, 0x1048b, 0x1048c, 0x1048d, 0x1048e, 0x1048f,
@@ -801,8 +801,8 @@ static const uint32_t  nxt_unicode_upper_case_block_209[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_219[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_219[128]
+    njs_aligned(64) =
 {
     0x10c80, 0x10c81, 0x10c82, 0x10c83, 0x10c84, 0x10c85, 0x10c86, 0x10c87,
     0x10c88, 0x10c89, 0x10c8a, 0x10c8b, 0x10c8c, 0x10c8d, 0x10c8e, 0x10c8f,
@@ -823,8 +823,8 @@ static const uint32_t  nxt_unicode_upper_case_block_219[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_231[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_231[128]
+    njs_aligned(64) =
 {
     0x11880, 0x11881, 0x11882, 0x11883, 0x11884, 0x11885, 0x11886, 0x11887,
     0x11888, 0x11889, 0x1188a, 0x1188b, 0x1188c, 0x1188d, 0x1188e, 0x1188f,
@@ -845,8 +845,8 @@ static const uint32_t  nxt_unicode_upper_case_block_231[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_2dc[128]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_2dc[128]
+    njs_aligned(64) =
 {
     0x16e00, 0x16e01, 0x16e02, 0x16e03, 0x16e04, 0x16e05, 0x16e06, 0x16e07,
     0x16e08, 0x16e09, 0x16e0a, 0x16e0b, 0x16e0c, 0x16e0d, 0x16e0e, 0x16e0f,
@@ -867,8 +867,8 @@ static const uint32_t  nxt_unicode_upper_case_block_2dc[128]
 };
 
 
-static const uint32_t  nxt_unicode_upper_case_block_3d2[68]
-    nxt_aligned(64) =
+static const uint32_t  njs_unicode_upper_case_block_3d2[68]
+    njs_aligned(64) =
 {
     0x1e900, 0x1e901, 0x1e902, 0x1e903, 0x1e904, 0x1e905, 0x1e906, 0x1e907,
     0x1e908, 0x1e909, 0x1e90a, 0x1e90b, 0x1e90c, 0x1e90d, 0x1e90e, 0x1e90f,
@@ -882,21 +882,21 @@ static const uint32_t  nxt_unicode_upper_case_block_3d2[68]
 };
 
 
-static const uint32_t  *nxt_unicode_upper_case_blocks[]
-    nxt_aligned(64) =
+static const uint32_t  *njs_unicode_upper_case_blocks[]
+    njs_aligned(64) =
 {
-    nxt_unicode_upper_case_block_000,
-    nxt_unicode_upper_case_block_001,
-    nxt_unicode_upper_case_block_002,
-    nxt_unicode_upper_case_block_003,
-    nxt_unicode_upper_case_block_004,
-    nxt_unicode_upper_case_block_005,
-    nxt_unicode_upper_case_block_006,
-    nxt_unicode_upper_case_block_007,
-    nxt_unicode_upper_case_block_008,
-    nxt_unicode_upper_case_block_009,
-    nxt_unicode_upper_case_block_00a,
-    nxt_unicode_upper_case_block_00b,
+    njs_unicode_upper_case_block_000,
+    njs_unicode_upper_case_block_001,
+    njs_unicode_upper_case_block_002,
+    njs_unicode_upper_case_block_003,
+    njs_unicode_upper_case_block_004,
+    njs_unicode_upper_case_block_005,
+    njs_unicode_upper_case_block_006,
+    njs_unicode_upper_case_block_007,
+    njs_unicode_upper_case_block_008,
+    njs_unicode_upper_case_block_009,
+    njs_unicode_upper_case_block_00a,
+    njs_unicode_upper_case_block_00b,
     NULL,
     NULL,
     NULL,
@@ -918,13 +918,13 @@ static const uint32_t  *nxt_unicode_upper_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_021,
+    njs_unicode_upper_case_block_021,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_027,
+    njs_unicode_upper_case_block_027,
     NULL,
     NULL,
     NULL,
@@ -942,23 +942,23 @@ static const uint32_t  *nxt_unicode_upper_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_039,
-    nxt_unicode_upper_case_block_03a,
-    nxt_unicode_upper_case_block_03b,
-    nxt_unicode_upper_case_block_03c,
-    nxt_unicode_upper_case_block_03d,
-    nxt_unicode_upper_case_block_03e,
-    nxt_unicode_upper_case_block_03f,
+    njs_unicode_upper_case_block_039,
+    njs_unicode_upper_case_block_03a,
+    njs_unicode_upper_case_block_03b,
+    njs_unicode_upper_case_block_03c,
+    njs_unicode_upper_case_block_03d,
+    njs_unicode_upper_case_block_03e,
+    njs_unicode_upper_case_block_03f,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_042,
-    nxt_unicode_upper_case_block_043,
+    njs_unicode_upper_case_block_042,
+    njs_unicode_upper_case_block_043,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_049,
+    njs_unicode_upper_case_block_049,
     NULL,
     NULL,
     NULL,
@@ -973,9 +973,9 @@ static const uint32_t  *nxt_unicode_upper_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_058,
-    nxt_unicode_upper_case_block_059,
-    nxt_unicode_upper_case_block_05a,
+    njs_unicode_upper_case_block_058,
+    njs_unicode_upper_case_block_059,
+    njs_unicode_upper_case_block_05a,
     NULL,
     NULL,
     NULL,
@@ -1217,18 +1217,18 @@ static const uint32_t  *nxt_unicode_upper_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_14c,
-    nxt_unicode_upper_case_block_14d,
-    nxt_unicode_upper_case_block_14e,
-    nxt_unicode_upper_case_block_14f,
+    njs_unicode_upper_case_block_14c,
+    njs_unicode_upper_case_block_14d,
+    njs_unicode_upper_case_block_14e,
+    njs_unicode_upper_case_block_14f,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_156,
-    nxt_unicode_upper_case_block_157,
+    njs_unicode_upper_case_block_156,
+    njs_unicode_upper_case_block_157,
     NULL,
     NULL,
     NULL,
@@ -1395,7 +1395,7 @@ static const uint32_t  *nxt_unicode_upper_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_1fe,
+    njs_unicode_upper_case_block_1fe,
     NULL,
     NULL,
     NULL,
@@ -1405,8 +1405,8 @@ static const uint32_t  *nxt_unicode_upper_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_208,
-    nxt_unicode_upper_case_block_209,
+    njs_unicode_upper_case_block_208,
+    njs_unicode_upper_case_block_209,
     NULL,
     NULL,
     NULL,
@@ -1422,7 +1422,7 @@ static const uint32_t  *nxt_unicode_upper_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_219,
+    njs_unicode_upper_case_block_219,
     NULL,
     NULL,
     NULL,
@@ -1446,7 +1446,7 @@ static const uint32_t  *nxt_unicode_upper_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_231,
+    njs_unicode_upper_case_block_231,
     NULL,
     NULL,
     NULL,
@@ -1617,7 +1617,7 @@ static const uint32_t  *nxt_unicode_upper_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_2dc,
+    njs_unicode_upper_case_block_2dc,
     NULL,
     NULL,
     NULL,
@@ -1863,5 +1863,5 @@ static const uint32_t  *nxt_unicode_upper_case_blocks[]
     NULL,
     NULL,
     NULL,
-    nxt_unicode_upper_case_block_3d2,
+    njs_unicode_upper_case_block_3d2,
 };
similarity index 83%
rename from nxt/nxt_unicode_upper_case.pl
rename to src/njs_unicode_upper_case.pl
index 05d2260a1057051163a4cb46e56423b02cc08957..faa290cd0f31a26a17ae18aa98614ce1037db845 100755 (executable)
@@ -48,16 +48,16 @@ printf("\n/*\n" .
        ($blocks - 1) * BLOCK_SIZE * 4 + $last_block_size + $max_block * 4,
        ($blocks - 1) * BLOCK_SIZE * 4 + $last_block_size + $max_block * 8);
 
-printf("#define NXT_UNICODE_MAX_UPPER_CASE  0x%05x\n\n", $max_upper_case);
-printf("#define NXT_UNICODE_BLOCK_SIZE      %d\n\n\n", BLOCK_SIZE);
+printf("#define NJS_UNICODE_MAX_UPPER_CASE  0x%05x\n\n", $max_upper_case);
+printf("#define NJS_UNICODE_BLOCK_SIZE      %d\n\n\n", BLOCK_SIZE);
 
 
 for my $block (sort { $a <=> $b } keys %blocks) {
     my $block_size = ($block != $max_block) ? BLOCK_SIZE : $last_block_size;
 
     print "static const uint32_t  ";
-    printf("nxt_unicode_upper_case_block_%03x[%d]\n" .
-           "    nxt_aligned(64) =\n" .
+    printf("njs_unicode_upper_case_block_%03x[%d]\n" .
+           "    njs_aligned(64) =\n" .
            "{",
            $block, $block_size);
 
@@ -79,13 +79,13 @@ for my $block (sort { $a <=> $b } keys %blocks) {
 }
 
 
-print "static const uint32_t  *nxt_unicode_upper_case_blocks[]\n" .
-      "    nxt_aligned(64) =\n" .
+print "static const uint32_t  *njs_unicode_upper_case_blocks[]\n" .
+      "    njs_aligned(64) =\n" .
       "{\n";
 
 for my $block (0 .. $max_block) {
     if (exists($blocks{$block})) {
-        printf("    nxt_unicode_upper_case_block_%03x,\n", $block);
+        printf("    njs_unicode_upper_case_block_%03x,\n", $block);
 
     } else {
         print  "    NULL,\n";
similarity index 60%
rename from nxt/nxt_unix.h
rename to src/njs_unix.h
index bf45fd15297b7a545b3ee540d0a2f1b4cdda2bd7..10bdbacddc8461040c988beb860964f81d961557 100644 (file)
@@ -5,10 +5,10 @@
  */
 
 
-#ifndef _NXT_UNIX_H_INCLUDED_
-#define _NXT_UNIX_H_INCLUDED_
+#ifndef _NJS_UNIX_H_INCLUDED_
+#define _NJS_UNIX_H_INCLUDED_
 
-#if (NXT_LINUX)
+#if (NJS_LINUX)
 
 #ifdef _FORTIFY_SOURCE
 /*
@@ -18,6 +18,6 @@
 #undef _FORTIFY_SOURCE
 #endif
 
-#endif /* NXT_LINUX */
+#endif /* NJS_LINUX */
 
-#endif /* _NXT_UNIX_H_INCLUDED_ */
+#endif /* _NJS_UNIX_H_INCLUDED_ */
similarity index 67%
rename from nxt/nxt_utf8.c
rename to src/njs_utf8.c
index 8bf90b45421f699bc0f5b89be15261851a8bce83..bb697fe3f9033275b7f2300030b78b1a673783da 100644 (file)
@@ -4,29 +4,29 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_utf8.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_utf8.h>
 
 /*
- * The nxt_unicode_lower_case.h and nxt_unicode_upper_case.h files are
+ * The njs_unicode_lower_case.h and njs_unicode_upper_case.h files are
  * files auto-generated from the UnicodeData.txt file version 12.1.0 (May 2019)
  * provided by Unicode, Inc.:
  *
- *   ./nxt_unicode_lower_case.pl UnicodeData.txt
- *   ./nxt_unicode_upper_case.pl UnicodeData.txt
+ *   ./njs_unicode_lower_case.pl UnicodeData.txt
+ *   ./njs_unicode_upper_case.pl UnicodeData.txt
  *
  * Only common and simple case foldings are supported.  Full case foldings
  * are not supported.  Combined characters are also not supported.
  */
 
-#include <nxt_unicode_lower_case.h>
-#include <nxt_unicode_upper_case.h>
+#include <njs_unicode_lower_case.h>
+#include <njs_unicode_upper_case.h>
 
 
 u_char *
-nxt_utf8_encode(u_char *p, uint32_t u)
+njs_utf8_encode(u_char *p, uint32_t u)
 {
     if (u < 0x80) {
         *p++ = (u_char) (u & 0xFF);
@@ -59,13 +59,13 @@ nxt_utf8_encode(u_char *p, uint32_t u)
 
 
 /*
- * nxt_utf8_decode() decodes UTF-8 sequences and returns a valid
+ * njs_utf8_decode() decodes UTF-8 sequences and returns a valid
  * character 0x00 - 0x10FFFF, or 0xFFFFFFFF for invalid or overlong
  * UTF-8 sequence.
  */
 
 uint32_t
-nxt_utf8_decode(const u_char **start, const u_char *end)
+njs_utf8_decode(const u_char **start, const u_char *end)
 {
     uint32_t  u;
 
@@ -76,18 +76,18 @@ nxt_utf8_decode(const u_char **start, const u_char *end)
         return u;
     }
 
-    return nxt_utf8_decode2(start, end);
+    return njs_utf8_decode2(start, end);
 }
 
 
 /*
- * nxt_utf8_decode2() decodes two and more bytes UTF-8 sequences only
+ * njs_utf8_decode2() decodes two and more bytes UTF-8 sequences only
  * and returns a valid character 0x80 - 0x10FFFF, OR 0xFFFFFFFF for
  * invalid or overlong UTF-8 sequence.
  */
 
 uint32_t
-nxt_utf8_decode2(const u_char **start, const u_char *end)
+njs_utf8_decode2(const u_char **start, const u_char *end)
 {
     u_char        c;
     size_t        n;
@@ -101,7 +101,7 @@ nxt_utf8_decode2(const u_char **start, const u_char *end)
 
         if (u >= 0xF0) {
 
-            if (nxt_slow_path(u > 0xF4)) {
+            if (njs_slow_path(u > 0xF4)) {
                 /*
                  * The maximum valid Unicode character is 0x10FFFF
                  * which is encoded as 0xF4 0x8F 0xBF 0xBF.
@@ -134,7 +134,7 @@ nxt_utf8_decode2(const u_char **start, const u_char *end)
 
     p++;
 
-    if (nxt_fast_path(p + n <= end)) {
+    if (njs_fast_path(p + n <= end)) {
 
         do {
             c = *p++;
@@ -144,7 +144,7 @@ nxt_utf8_decode2(const u_char **start, const u_char *end)
              */
             c = c - 0x80;
 
-            if (nxt_slow_path(c > 0x3F)) {
+            if (njs_slow_path(c > 0x3F)) {
                 return 0xFFFFFFFF;
             }
 
@@ -164,7 +164,7 @@ nxt_utf8_decode2(const u_char **start, const u_char *end)
 
 
 uint32_t
-nxt_utf8_safe_decode(const u_char **start, const u_char *end)
+njs_utf8_safe_decode(const u_char **start, const u_char *end)
 {
     uint32_t  u;
 
@@ -175,12 +175,12 @@ nxt_utf8_safe_decode(const u_char **start, const u_char *end)
         return u;
     }
 
-    return nxt_utf8_safe_decode2(start, end);
+    return njs_utf8_safe_decode2(start, end);
 }
 
 
 uint32_t
-nxt_utf8_safe_decode2(const u_char **start, const u_char *end)
+njs_utf8_safe_decode2(const u_char **start, const u_char *end)
 {
     u_char        c;
     size_t        n;
@@ -194,7 +194,7 @@ nxt_utf8_safe_decode2(const u_char **start, const u_char *end)
 
         if (u >= 0xF0) {
 
-            if (nxt_slow_path(u > 0xF4)) {
+            if (njs_slow_path(u > 0xF4)) {
                 /*
                  * The maximum valid Unicode character is 0x10FFFF
                  * which is encoded as 0xF4 0x8F 0xBF 0xBF.
@@ -235,9 +235,9 @@ nxt_utf8_safe_decode2(const u_char **start, const u_char *end)
          */
         c = c - 0x80;
 
-        if (nxt_slow_path(c > 0x3F)) {
+        if (njs_slow_path(c > 0x3F)) {
             *start = --p;
-            return NXT_UTF8_REPLACEMENT;
+            return NJS_UTF8_REPLACEMENT;
         }
 
         u = (u << 6) | c;
@@ -250,24 +250,24 @@ nxt_utf8_safe_decode2(const u_char **start, const u_char *end)
         return u;
     }
 
-    return NXT_UTF8_REPLACEMENT;
+    return NJS_UTF8_REPLACEMENT;
 
 fail_one:
 
     (*start)++;
 
-    return NXT_UTF8_REPLACEMENT;
+    return NJS_UTF8_REPLACEMENT;
 }
 
 
 /*
- * nxt_utf8_casecmp() tests only up to the minimum of given lengths, but
- * requires lengths of both strings because otherwise nxt_utf8_decode2()
+ * njs_utf8_casecmp() tests only up to the minimum of given lengths, but
+ * requires lengths of both strings because otherwise njs_utf8_decode2()
  * may fail due to incomplete sequence.
  */
 
-nxt_int_t
-nxt_utf8_casecmp(const u_char *start1, const u_char *start2, size_t len1,
+njs_int_t
+njs_utf8_casecmp(const u_char *start1, const u_char *start2, size_t len1,
     size_t len2)
 {
     int32_t       n;
@@ -279,18 +279,18 @@ nxt_utf8_casecmp(const u_char *start1, const u_char *start2, size_t len1,
 
     while (start1 < end1 && start2 < end2) {
 
-        u1 = nxt_utf8_lower_case(&start1, end1);
+        u1 = njs_utf8_lower_case(&start1, end1);
 
-        u2 = nxt_utf8_lower_case(&start2, end2);
+        u2 = njs_utf8_lower_case(&start2, end2);
 
-        if (nxt_slow_path((u1 | u2) == 0xFFFFFFFF)) {
-            return NXT_UTF8_SORT_INVALID;
+        if (njs_slow_path((u1 | u2) == 0xFFFFFFFF)) {
+            return NJS_UTF8_SORT_INVALID;
         }
 
         n = u1 - u2;
 
         if (n != 0) {
-            return (nxt_int_t) n;
+            return (njs_int_t) n;
         }
     }
 
@@ -299,26 +299,26 @@ nxt_utf8_casecmp(const u_char *start1, const u_char *start2, size_t len1,
 
 
 uint32_t
-nxt_utf8_lower_case(const u_char **start, const u_char *end)
+njs_utf8_lower_case(const u_char **start, const u_char *end)
 {
     uint32_t        u;
     const uint32_t  *block;
 
     u = (uint32_t) **start;
 
-    if (nxt_fast_path(u < 0x80)) {
+    if (njs_fast_path(u < 0x80)) {
         (*start)++;
 
-        return nxt_unicode_lower_case_block_000[u];
+        return njs_unicode_lower_case_block_000[u];
     }
 
-    u = nxt_utf8_decode2(start, end);
+    u = njs_utf8_decode2(start, end);
 
-    if (u <= NXT_UNICODE_MAX_LOWER_CASE) {
-        block = nxt_unicode_lower_case_blocks[u / NXT_UNICODE_BLOCK_SIZE];
+    if (u <= NJS_UNICODE_MAX_LOWER_CASE) {
+        block = njs_unicode_lower_case_blocks[u / NJS_UNICODE_BLOCK_SIZE];
 
         if (block != NULL) {
-            return block[u % NXT_UNICODE_BLOCK_SIZE];
+            return block[u % NJS_UNICODE_BLOCK_SIZE];
         }
     }
 
@@ -327,26 +327,26 @@ nxt_utf8_lower_case(const u_char **start, const u_char *end)
 
 
 uint32_t
-nxt_utf8_upper_case(const u_char **start, const u_char *end)
+njs_utf8_upper_case(const u_char **start, const u_char *end)
 {
     uint32_t        u;
     const uint32_t  *block;
 
     u = (uint32_t) **start;
 
-    if (nxt_fast_path(u < 0x80)) {
+    if (njs_fast_path(u < 0x80)) {
         (*start)++;
 
-        return nxt_unicode_upper_case_block_000[u];
+        return njs_unicode_upper_case_block_000[u];
     }
 
-    u = nxt_utf8_decode2(start, end);
+    u = njs_utf8_decode2(start, end);
 
-    if (u <= NXT_UNICODE_MAX_UPPER_CASE) {
-        block = nxt_unicode_upper_case_blocks[u / NXT_UNICODE_BLOCK_SIZE];
+    if (u <= NJS_UNICODE_MAX_UPPER_CASE) {
+        block = njs_unicode_upper_case_blocks[u / NJS_UNICODE_BLOCK_SIZE];
 
         if (block != NULL) {
-            return block[u % NXT_UNICODE_BLOCK_SIZE];
+            return block[u % NJS_UNICODE_BLOCK_SIZE];
         }
     }
 
@@ -355,7 +355,7 @@ nxt_utf8_upper_case(const u_char **start, const u_char *end)
 
 
 ssize_t
-nxt_utf8_length(const u_char *p, size_t len)
+njs_utf8_length(const u_char *p, size_t len)
 {
     ssize_t       length;
     const u_char  *end;
@@ -365,7 +365,7 @@ nxt_utf8_length(const u_char *p, size_t len)
     end = p + len;
 
     while (p < end) {
-        if (nxt_slow_path(nxt_utf8_decode(&p, end) == 0xffffffff)) {
+        if (njs_slow_path(njs_utf8_decode(&p, end) == 0xffffffff)) {
             return -1;
         }
 
@@ -377,7 +377,7 @@ nxt_utf8_length(const u_char *p, size_t len)
 
 
 ssize_t
-nxt_utf8_safe_length(const u_char *p, size_t len, ssize_t *out_size)
+njs_utf8_safe_length(const u_char *p, size_t len, ssize_t *out_size)
 {
     ssize_t       size, length;
     uint32_t      codepoint;
@@ -389,9 +389,9 @@ nxt_utf8_safe_length(const u_char *p, size_t len, ssize_t *out_size)
     end = p + len;
 
     while (p < end) {
-        codepoint = nxt_utf8_safe_decode(&p, end);
+        codepoint = njs_utf8_safe_decode(&p, end);
 
-        size += nxt_utf8_size(codepoint);
+        size += njs_utf8_size(codepoint);
 
         length++;
     }
@@ -404,15 +404,15 @@ nxt_utf8_safe_length(const u_char *p, size_t len, ssize_t *out_size)
 }
 
 
-nxt_bool_t
-nxt_utf8_is_valid(const u_char *p, size_t len)
+njs_bool_t
+njs_utf8_is_valid(const u_char *p, size_t len)
 {
     const u_char  *end;
 
     end = p + len;
 
     while (p < end) {
-        if (nxt_slow_path(nxt_utf8_decode(&p, end) == 0xffffffff)) {
+        if (njs_slow_path(njs_utf8_decode(&p, end) == 0xffffffff)) {
             return 0;
         }
     }
similarity index 61%
rename from nxt/nxt_utf8.h
rename to src/njs_utf8.h
index db1a865e9be8268a5112a05f54f82b4c1db638a5..303a0b921ea8d3fd23d7025e2b0071caf9114d92 100644 (file)
@@ -4,8 +4,8 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#ifndef _NXT_UTF8_H_INCLUDED_
-#define _NXT_UTF8_H_INCLUDED_
+#ifndef _NJS_UTF8_H_INCLUDED_
+#define _NJS_UTF8_H_INCLUDED_
 
 
 /*
  * difference between Unicode characters is lesser 0x0010FFFF and
  * 0x0EEE0EEE can be used as value to indicate UTF-8 encoding error.
  */
-#define NXT_UTF8_SORT_INVALID  0x0EEE0EEE
+#define NJS_UTF8_SORT_INVALID  0x0EEE0EEE
 
-#define NXT_UTF8_REPLACEMENT   0xFFFD
+#define NJS_UTF8_REPLACEMENT   0xFFFD
 
 
-NXT_EXPORT u_char *nxt_utf8_encode(u_char *p, uint32_t u);
-NXT_EXPORT uint32_t nxt_utf8_decode(const u_char **start, const u_char *end);
-NXT_EXPORT uint32_t nxt_utf8_decode2(const u_char **start, const u_char *end);
-NXT_EXPORT uint32_t nxt_utf8_safe_decode(const u_char **start,
+NJS_EXPORT u_char *njs_utf8_encode(u_char *p, uint32_t u);
+NJS_EXPORT uint32_t njs_utf8_decode(const u_char **start, const u_char *end);
+NJS_EXPORT uint32_t njs_utf8_decode2(const u_char **start, const u_char *end);
+NJS_EXPORT uint32_t njs_utf8_safe_decode(const u_char **start,
     const u_char *end);
-NXT_EXPORT uint32_t nxt_utf8_safe_decode2(const u_char **start,
+NJS_EXPORT uint32_t njs_utf8_safe_decode2(const u_char **start,
     const u_char *end);
-NXT_EXPORT nxt_int_t nxt_utf8_casecmp(const u_char *start1,
+NJS_EXPORT njs_int_t njs_utf8_casecmp(const u_char *start1,
     const u_char *start2, size_t len1, size_t len2);
-NXT_EXPORT uint32_t nxt_utf8_lower_case(const u_char **start,
+NJS_EXPORT uint32_t njs_utf8_lower_case(const u_char **start,
     const u_char *end);
-NXT_EXPORT uint32_t nxt_utf8_upper_case(const u_char **start,
+NJS_EXPORT uint32_t njs_utf8_upper_case(const u_char **start,
     const u_char *end);
-NXT_EXPORT ssize_t nxt_utf8_length(const u_char *p, size_t len);
-NXT_EXPORT ssize_t nxt_utf8_safe_length(const u_char *p, size_t len,
+NJS_EXPORT ssize_t njs_utf8_length(const u_char *p, size_t len);
+NJS_EXPORT ssize_t njs_utf8_safe_length(const u_char *p, size_t len,
     ssize_t *out_size);
-NXT_EXPORT nxt_bool_t nxt_utf8_is_valid(const u_char *p, size_t len);
+NJS_EXPORT njs_bool_t njs_utf8_is_valid(const u_char *p, size_t len);
 
 
 /*
- * nxt_utf8_next() and nxt_utf8_prev() expect a valid UTF-8 string.
+ * njs_utf8_next() and njs_utf8_prev() expect a valid UTF-8 string.
  *
  * The leading UTF-8 byte is either 0xxxxxxx or 11xxxxxx.
  * The continuation UTF-8 bytes are 10xxxxxx.
  */
 
-nxt_inline const u_char *
-nxt_utf8_next(const u_char *p, const u_char *end)
+njs_inline const u_char *
+njs_utf8_next(const u_char *p, const u_char *end)
 {
     u_char  c;
 
@@ -69,8 +69,8 @@ nxt_utf8_next(const u_char *p, const u_char *end)
 }
 
 
-nxt_inline const u_char *
-nxt_utf8_prev(const u_char *p)
+njs_inline const u_char *
+njs_utf8_prev(const u_char *p)
 {
    u_char  c;
 
@@ -84,8 +84,8 @@ nxt_utf8_prev(const u_char *p)
 }
 
 
-nxt_inline u_char *
-nxt_utf8_copy(u_char *dst, const u_char **src, const u_char *end)
+njs_inline u_char *
+njs_utf8_copy(u_char *dst, const u_char **src, const u_char *end)
 {
     u_char        c;
     const u_char  *p;
@@ -114,16 +114,16 @@ nxt_utf8_copy(u_char *dst, const u_char **src, const u_char *end)
 }
 
 
-#define nxt_utf8_size(u)                                                      \
+#define njs_utf8_size(u)                                                      \
     ((u < 0x80) ? 1 : ((u < 0x0800) ? 2 : ((u < 0x10000) ? 3 : 4)))
 
 
-#define nxt_utf8_size_uint16(u)                                               \
+#define njs_utf8_size_uint16(u)                                               \
     ((u < 0x80) ? 1 : ((u < 0x0800) ? 2 : 3))
 
 
-nxt_inline nxt_bool_t
-nxt_utf8_is_whitespace(uint32_t c)
+njs_inline njs_bool_t
+njs_utf8_is_whitespace(uint32_t c)
 {
     switch (c) {
     case 0x0009:  /* <TAB>  */
@@ -159,4 +159,4 @@ nxt_utf8_is_whitespace(uint32_t c)
 }
 
 
-#endif /* _NXT_UTF8_H_INCLUDED_ */
+#endif /* _NJS_UTF8_H_INCLUDED_ */
similarity index 92%
rename from njs/njs_value.c
rename to src/njs_value.c
index 0d2203a1cbc82c6ea0b9561615332050a16b5b8a..11f3ef539ed6b09ef99c1be74ee29c6003080cc8 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 
 
@@ -49,7 +49,7 @@ njs_value_retain(njs_value_t *value)
         if (value->long_string.external != 0xff) {
             string = value->long_string.data;
 
-            nxt_thread_log_debug("retain:%uxD \"%*s\"", string->retain,
+            njs_thread_log_debug("retain:%uxD \"%*s\"", string->retain,
                                  value->long_string.size, string->start);
 
             if (string->retain != 0xffff) {
@@ -70,7 +70,7 @@ njs_value_release(njs_vm_t *vm, njs_value_t *value)
         if (value->long_string.external != 0xff) {
             string = value->long_string.data;
 
-            nxt_thread_log_debug("release:%uxD \"%*s\"", string->retain,
+            njs_thread_log_debug("release:%uxD \"%*s\"", string->retain,
                                  value->long_string.size, string->start);
 
             if (string->retain != 0xffff) {
@@ -81,11 +81,11 @@ njs_value_release(njs_vm_t *vm, njs_value_t *value)
                     if ((u_char *) string + sizeof(njs_string_t)
                         != string->start)
                     {
-                        nxt_memcache_pool_free(vm->mem_pool,
+                        njs_memcache_pool_free(vm->mem_pool,
                                                string->start);
                     }
 
-                    nxt_memcache_pool_free(vm->mem_pool, string);
+                    njs_memcache_pool_free(vm->mem_pool, string);
                 }
 #endif
             }
@@ -102,35 +102,35 @@ njs_value_release(njs_vm_t *vm, njs_value_t *value)
 
 njs_ret_t
 njs_value_to_primitive(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value,
-       nxt_uint_t hint)
+       njs_uint_t hint)
 {
     njs_ret_t           ret;
-    nxt_uint_t          tries;
+    njs_uint_t          tries;
     njs_value_t         retval;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     static const uint32_t  hashes[] = {
         NJS_VALUE_OF_HASH,
         NJS_TO_STRING_HASH,
     };
 
-    static const nxt_str_t  names[] = {
-        nxt_string("valueOf"),
-        nxt_string("toString"),
+    static const njs_str_t  names[] = {
+        njs_str("valueOf"),
+        njs_str("toString"),
     };
 
 
     if (njs_is_primitive(value)) {
         /* GC */
         *dst = *value;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     tries = 0;
 
     for ( ;; ) {
-        ret = NXT_ERROR;
+        ret = NJS_ERROR;
 
         if (njs_is_object(value) && tries < 2) {
             hint ^= tries++;
@@ -148,7 +148,7 @@ njs_value_to_primitive(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value,
             ret = njs_function_apply(vm, njs_function(&prop->value), value, 1,
                                      &retval);
 
-            if (nxt_fast_path(ret == NXT_OK)) {
+            if (njs_fast_path(ret == NJS_OK)) {
                 if (njs_is_primitive(&retval)) {
                     break;
                  }
@@ -157,7 +157,7 @@ njs_value_to_primitive(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value,
                 continue;
              }
 
-            /* NXT_ERROR */
+            /* NJS_ERROR */
 
             return ret;
          }
@@ -169,13 +169,13 @@ njs_value_to_primitive(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value,
 
     *dst = retval;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_array_t *
 njs_value_enumerate(njs_vm_t *vm, const njs_value_t *value,
-    njs_object_enum_t kind, nxt_bool_t all)
+    njs_object_enum_t kind, njs_bool_t all)
 {
     njs_object_value_t  obj_val;
 
@@ -196,7 +196,7 @@ njs_value_enumerate(njs_vm_t *vm, const njs_value_t *value,
 
 njs_array_t *
 njs_value_own_enumerate(njs_vm_t *vm, const njs_value_t *value,
-    njs_object_enum_t kind, nxt_bool_t all)
+    njs_object_enum_t kind, njs_bool_t all)
 {
     njs_object_value_t  obj_val;
 
@@ -387,42 +387,42 @@ njs_value_function(const njs_value_t *value)
 }
 
 
-nxt_int_t
+njs_int_t
 njs_value_is_null(const njs_value_t *value)
 {
     return njs_is_null(value);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_value_is_undefined(const njs_value_t *value)
 {
     return njs_is_undefined(value);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_value_is_null_or_undefined(const njs_value_t *value)
 {
     return njs_is_null_or_undefined(value);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_value_is_boolean(const njs_value_t *value)
 {
     return njs_is_boolean(value);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_value_is_number(const njs_value_t *value)
 {
     return njs_is_number(value);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_value_is_valid_number(const njs_value_t *value)
 {
     return njs_is_number(value)
@@ -431,21 +431,21 @@ njs_value_is_valid_number(const njs_value_t *value)
 }
 
 
-nxt_int_t
+njs_int_t
 njs_value_is_string(const njs_value_t *value)
 {
     return njs_is_string(value);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_value_is_object(const njs_value_t *value)
 {
     return njs_is_object(value);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_value_is_function(const njs_value_t *value)
 {
     return njs_is_function(value);
similarity index 94%
rename from njs/njs_value.h
rename to src/njs_value.h
index cb5e1864425e248dff2a5f35b07741d7bfbe4d93..36f02c66588a171bd5b65fe0337761ea3379d058 100644 (file)
@@ -8,12 +8,12 @@
 #define _NJS_VALUE_H_INCLUDED_
 
 
-#include <nxt_trace.h>
-#include <nxt_queue.h>
-#include <nxt_regex.h>
-#include <nxt_random.h>
-#include <nxt_djb_hash.h>
-#include <nxt_mp.h>
+#include <njs_trace.h>
+#include <njs_queue.h>
+#include <njs_regex.h>
+#include <njs_random.h>
+#include <njs_djb_hash.h>
+#include <njs_mp.h>
 
 #include <math.h>
 
@@ -93,14 +93,14 @@ typedef enum {
  * non-null otherwise.
  *
  * njs_prop_handler_t is expected to return:
- *   NXT_OK - handler executed successfully;
- *   NXT_ERROR - some error, vm->retval contains appropriate exception;
- *   NXT_DECLINED - handler was applied to inappropriate object.
+ *   NJS_OK - handler executed successfully;
+ *   NJS_ERROR - some error, vm->retval contains appropriate exception;
+ *   NJS_DECLINED - handler was applied to inappropriate object.
  */
 typedef njs_ret_t (*njs_prop_handler_t) (njs_vm_t *vm, njs_value_t *value,
     njs_value_t *setval, njs_value_t *retval);
 typedef njs_ret_t (*njs_function_native_t) (njs_vm_t *vm, njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t retval);
+    njs_uint_t nargs, njs_index_t retval);
 
 
 typedef struct njs_string_s           njs_string_t;
@@ -114,7 +114,7 @@ typedef struct njs_date_s             njs_date_t;
 typedef struct njs_property_next_s    njs_property_next_t;
 typedef struct njs_object_init_s      njs_object_init_t;
 
-#if (!NXT_HAVE_GCC_ATTRIBUTE_ALIGNED)
+#if (!NJS_HAVE_GCC_ATTRIBUTE_ALIGNED)
 #error "aligned attribute is required"
 #endif
 
@@ -203,10 +203,10 @@ union njs_value_s {
 
 struct njs_object_s {
     /* A private hash of njs_object_prop_t. */
-    nxt_lvlhsh_t                      hash;
+    njs_lvlhsh_t                      hash;
 
     /* A shared hash of njs_object_prop_t. */
-    nxt_lvlhsh_t                      shared_hash;
+    njs_lvlhsh_t                      shared_hash;
 
     /* An object __proto__. */
     njs_object_t                      *__proto__;
@@ -265,7 +265,7 @@ struct njs_function_s {
     } u;
 
     njs_value_t                       *bound;
-#if (NXT_SUNC)
+#if (NJS_SUNC)
     njs_closure_t                     *closures[1];
 #else
     njs_closure_t                     *closures[];
@@ -320,8 +320,8 @@ typedef enum {
 #define njs_string(s) {                                                       \
     .short_string = {                                                         \
         .type = NJS_STRING,                                                   \
-        .size = nxt_length(s),                                                \
-        .length = nxt_length(s),                                              \
+        .size = njs_length(s),                                                \
+        .length = njs_length(s),                                              \
         .start = s,                                                           \
     }                                                                         \
 }
@@ -333,10 +333,10 @@ typedef enum {
     .long_string = {                                                          \
         .type = NJS_STRING,                                                   \
         .truth = (NJS_STRING_LONG << 4) | NJS_STRING_LONG,                    \
-        .size = nxt_length(s),                                                \
+        .size = njs_length(s),                                                \
         .data = & (njs_string_t) {                                            \
             .start = (u_char *) s,                                            \
-            .length = nxt_length(s),                                          \
+            .length = njs_length(s),                                          \
         }                                                                     \
     }                                                                         \
 }
@@ -599,7 +599,7 @@ extern const njs_value_t  njs_string_function;
 extern const njs_value_t  njs_string_memory_error;
 
 
-nxt_inline void
+njs_inline void
 njs_set_boolean(njs_value_t *value, unsigned yn)
 {
     const njs_value_t  *retval;
@@ -611,7 +611,7 @@ njs_set_boolean(njs_value_t *value, unsigned yn)
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_number(njs_value_t *value, double num)
 {
     value->data.u.number = num;
@@ -620,7 +620,7 @@ njs_set_number(njs_value_t *value, double num)
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_int32(njs_value_t *value, int32_t num)
 {
     value->data.u.number = num;
@@ -629,7 +629,7 @@ njs_set_int32(njs_value_t *value, int32_t num)
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_uint32(njs_value_t *value, uint32_t num)
 {
     value->data.u.number = num;
@@ -638,7 +638,7 @@ njs_set_uint32(njs_value_t *value, uint32_t num)
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_data(njs_value_t *value, void *data)
 {
     value->data.u.data = data;
@@ -647,7 +647,7 @@ njs_set_data(njs_value_t *value, void *data)
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_object(njs_value_t *value, njs_object_t *object)
 {
     value->data.u.object = object;
@@ -656,9 +656,9 @@ njs_set_object(njs_value_t *value, njs_object_t *object)
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_type_object(njs_value_t *value, njs_object_t *object,
-    nxt_uint_t type)
+    njs_uint_t type)
 {
     value->data.u.object = object;
     value->type = type;
@@ -666,7 +666,7 @@ njs_set_type_object(njs_value_t *value, njs_object_t *object,
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_array(njs_value_t *value, njs_array_t *array)
 {
     value->data.u.array = array;
@@ -675,7 +675,7 @@ njs_set_array(njs_value_t *value, njs_array_t *array)
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_function(njs_value_t *value, njs_function_t *function)
 {
     value->data.u.function = function;
@@ -684,7 +684,7 @@ njs_set_function(njs_value_t *value, njs_function_t *function)
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_date(njs_value_t *value, njs_date_t *date)
 {
     value->data.u.date = date;
@@ -693,7 +693,7 @@ njs_set_date(njs_value_t *value, njs_date_t *date)
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_regexp(njs_value_t *value, njs_regexp_t *regexp)
 {
     value->data.u.regexp = regexp;
@@ -702,7 +702,7 @@ njs_set_regexp(njs_value_t *value, njs_regexp_t *regexp)
 }
 
 
-nxt_inline void
+njs_inline void
 njs_set_object_value(njs_value_t *value, njs_object_value_t *object_value)
 {
     value->data.u.object_value = object_value;
@@ -743,38 +743,38 @@ njs_set_object_value(njs_value_t *value, njs_object_value_t *object_value)
 void njs_value_retain(njs_value_t *value);
 void njs_value_release(njs_vm_t *vm, njs_value_t *value);
 njs_ret_t njs_value_to_primitive(njs_vm_t *vm, njs_value_t *dst,
-    njs_value_t *value, nxt_uint_t hint);
+    njs_value_t *value, njs_uint_t hint);
 njs_array_t *njs_value_enumerate(njs_vm_t *vm, const njs_value_t *value,
-    njs_object_enum_t kind, nxt_bool_t all);
+    njs_object_enum_t kind, njs_bool_t all);
 njs_array_t *njs_value_own_enumerate(njs_vm_t *vm, const njs_value_t *value,
-    njs_object_enum_t kind, nxt_bool_t all);
+    njs_object_enum_t kind, njs_bool_t all);
 const char *njs_type_string(njs_value_type_t type);
 const char *njs_arg_type_string(uint8_t arg);
 
 njs_ret_t njs_primitive_value_to_string(njs_vm_t *vm, njs_value_t *dst,
     const njs_value_t *src);
-double njs_string_to_number(const njs_value_t *value, nxt_bool_t parse_float);
+double njs_string_to_number(const njs_value_t *value, njs_bool_t parse_float);
 
-nxt_bool_t njs_string_eq(const njs_value_t *v1, const njs_value_t *v2);
+njs_bool_t njs_string_eq(const njs_value_t *v1, const njs_value_t *v2);
 
 
-nxt_inline njs_ret_t
+njs_inline njs_ret_t
 njs_value_to_numeric(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value)
 {
     double       num;
     njs_ret_t    ret;
     njs_value_t  primitive;
 
-    if (nxt_slow_path(!njs_is_primitive(value))) {
+    if (njs_slow_path(!njs_is_primitive(value))) {
         ret = njs_value_to_primitive(vm, &primitive, value, 0);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
         value = &primitive;
     }
 
-    if (nxt_slow_path(!njs_is_numeric(value))) {
+    if (njs_slow_path(!njs_is_numeric(value))) {
         num = NAN;
 
         if (njs_is_string(value)) {
@@ -787,19 +787,19 @@ njs_value_to_numeric(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value)
 
     njs_set_number(dst, num);
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-nxt_inline njs_ret_t
+njs_inline njs_ret_t
 njs_value_to_string(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value)
 {
     njs_ret_t    ret;
     njs_value_t  primitive;
 
-    if (nxt_slow_path(!njs_is_primitive(value))) {
+    if (njs_slow_path(!njs_is_primitive(value))) {
         ret = njs_value_to_primitive(vm, &primitive, value, 1);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
@@ -810,7 +810,7 @@ njs_value_to_string(njs_vm_t *vm, njs_value_t *dst, njs_value_t *value)
 }
 
 
-nxt_inline nxt_bool_t
+njs_inline njs_bool_t
 njs_values_strict_equal(const njs_value_t *val1, const njs_value_t *val2)
 {
     if (val1->type != val2->type) {
similarity index 68%
rename from njs/njs_variable.c
rename to src/njs_variable.c
index 0ed753ac9879f90b76446c2ec988d68cbf13f88a..a5ab01eeed731a8d15010c9331ce884921cefdf3 100644 (file)
@@ -5,38 +5,38 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <string.h>
 
 
 static njs_variable_t *njs_variable_scope_add(njs_vm_t *vm,
-    njs_parser_scope_t *scope, nxt_lvlhsh_query_t *lhq,
+    njs_parser_scope_t *scope, njs_lvlhsh_query_t *lhq,
     njs_variable_type_t type);
 static njs_ret_t njs_variable_reference_resolve(njs_vm_t *vm,
     njs_variable_reference_t *vr, njs_parser_scope_t *node_scope);
-static njs_variable_t *njs_variable_alloc(njs_vm_t *vm, nxt_str_t *name,
+static njs_variable_t *njs_variable_alloc(njs_vm_t *vm, njs_str_t *name,
     njs_variable_type_t type);
 
 
-static nxt_int_t
-njs_variables_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+njs_variables_hash_test(njs_lvlhsh_query_t *lhq, void *data)
 {
     njs_variable_t  *var;
 
     var = data;
 
-    if (nxt_strstr_eq(&lhq->key, &var->name)) {
-        return NXT_OK;
+    if (njs_strstr_eq(&lhq->key, &var->name)) {
+        return NJS_OK;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
-const nxt_lvlhsh_proto_t  njs_variables_hash_proto
-    nxt_aligned(64) =
+const njs_lvlhsh_proto_t  njs_variables_hash_proto
+    njs_aligned(64) =
 {
-    NXT_LVLHSH_DEFAULT,
+    NJS_LVLHSH_DEFAULT,
     njs_variables_hash_test,
     njs_lvlhsh_alloc,
     njs_lvlhsh_free,
@@ -44,18 +44,18 @@ const nxt_lvlhsh_proto_t  njs_variables_hash_proto
 
 
 njs_variable_t *
-njs_variable_add(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
+njs_variable_add(njs_vm_t *vm, njs_parser_scope_t *scope, njs_str_t *name,
     uint32_t hash, njs_variable_type_t type)
 {
     njs_variable_t      *var;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     lhq.key_hash = hash;
     lhq.key = *name;
     lhq.proto = &njs_variables_hash_proto;
 
     var = njs_variable_scope_add(vm, scope, &lhq, type);
-    if (nxt_slow_path(var == NULL)) {
+    if (njs_slow_path(var == NULL)) {
         return NULL;
     }
 
@@ -65,7 +65,7 @@ njs_variable_add(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
             scope = scope->parent;
 
             var = njs_variable_scope_add(vm, scope, &lhq, type);
-            if (nxt_slow_path(var == NULL)) {
+            if (njs_slow_path(var == NULL)) {
                 return NULL;
             }
 
@@ -82,12 +82,12 @@ njs_variable_add(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
 
 static njs_variable_t *
 njs_variable_scope_add(njs_vm_t *vm, njs_parser_scope_t *scope,
-    nxt_lvlhsh_query_t *lhq, njs_variable_type_t type)
+    njs_lvlhsh_query_t *lhq, njs_variable_type_t type)
 {
-    nxt_int_t       ret;
+    njs_int_t       ret;
     njs_variable_t  *var;
 
-    if (nxt_lvlhsh_find(&scope->variables, lhq) == NXT_OK) {
+    if (njs_lvlhsh_find(&scope->variables, lhq) == NJS_OK) {
         var = lhq->value;
 
         if (scope->module || scope->type == NJS_SCOPE_BLOCK) {
@@ -114,7 +114,7 @@ njs_variable_scope_add(njs_vm_t *vm, njs_parser_scope_t *scope,
     }
 
     var = njs_variable_alloc(vm, &lhq->key, type);
-    if (nxt_slow_path(var == NULL)) {
+    if (njs_slow_path(var == NULL)) {
         return NULL;
     }
 
@@ -122,14 +122,14 @@ njs_variable_scope_add(njs_vm_t *vm, njs_parser_scope_t *scope,
     lhq->value = var;
     lhq->pool = vm->mem_pool;
 
-    ret = nxt_lvlhsh_insert(&scope->variables, lhq);
+    ret = njs_lvlhsh_insert(&scope->variables, lhq);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return var;
     }
 
-    nxt_mp_free(vm->mem_pool, var->name.start);
-    nxt_mp_free(vm->mem_pool, var);
+    njs_mp_free(vm->mem_pool, var->name.start);
+    njs_mp_free(vm->mem_pool, var);
 
     njs_type_error(vm, "lvlhsh insert failed");
 
@@ -145,23 +145,23 @@ fail:
 
 
 njs_variable_t *
-njs_label_add(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
+njs_label_add(njs_vm_t *vm, njs_parser_scope_t *scope, njs_str_t *name,
     uint32_t hash)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_variable_t      *label;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     lhq.key_hash = hash;
     lhq.key = *name;
     lhq.proto = &njs_variables_hash_proto;
 
-    if (nxt_lvlhsh_find(&scope->labels, &lhq) == NXT_OK) {
+    if (njs_lvlhsh_find(&scope->labels, &lhq) == NJS_OK) {
         return lhq.value;
     }
 
     label = njs_variable_alloc(vm, &lhq.key, NJS_VARIABLE_CONST);
-    if (nxt_slow_path(label == NULL)) {
+    if (njs_slow_path(label == NULL)) {
         return label;
     }
 
@@ -169,14 +169,14 @@ njs_label_add(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
     lhq.value = label;
     lhq.pool = vm->mem_pool;
 
-    ret = nxt_lvlhsh_insert(&scope->labels, &lhq);
+    ret = njs_lvlhsh_insert(&scope->labels, &lhq);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return label;
     }
 
-    nxt_mp_free(vm->mem_pool, label->name.start);
-    nxt_mp_free(vm->mem_pool, label);
+    njs_mp_free(vm->mem_pool, label->name.start);
+    njs_mp_free(vm->mem_pool, label);
 
     njs_internal_error(vm, "lvlhsh insert failed");
 
@@ -185,24 +185,24 @@ njs_label_add(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
 
 
 njs_ret_t
-njs_label_remove(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
+njs_label_remove(njs_vm_t *vm, njs_parser_scope_t *scope, njs_str_t *name,
     uint32_t hash)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_variable_t      *label;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     lhq.key_hash = hash;
     lhq.key = *name;
     lhq.proto = &njs_variables_hash_proto;
     lhq.pool = vm->mem_pool;
 
-    ret = nxt_lvlhsh_delete(&scope->labels, &lhq);
+    ret = njs_lvlhsh_delete(&scope->labels, &lhq);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         label = lhq.value;
-        nxt_mp_free(vm->mem_pool, label->name.start);
-        nxt_mp_free(vm->mem_pool, label);
+        njs_mp_free(vm->mem_pool, label->name.start);
+        njs_mp_free(vm->mem_pool, label);
 
     } else {
         njs_internal_error(vm, "lvlhsh delete failed");
@@ -212,25 +212,25 @@ njs_label_remove(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
 }
 
 
-static nxt_int_t
-njs_reference_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+njs_reference_hash_test(njs_lvlhsh_query_t *lhq, void *data)
 {
     njs_parser_node_t  *node;
 
     node = data;
 
-    if (nxt_strstr_eq(&lhq->key, &node->u.reference.name)) {
-        return NXT_OK;
+    if (njs_strstr_eq(&lhq->key, &node->u.reference.name)) {
+        return NJS_OK;
     }
 
-    return NXT_DECLINED;
+    return NJS_DECLINED;
 }
 
 
-const nxt_lvlhsh_proto_t  njs_references_hash_proto
-    nxt_aligned(64) =
+const njs_lvlhsh_proto_t  njs_references_hash_proto
+    njs_aligned(64) =
 {
-    NXT_LVLHSH_DEFAULT,
+    NJS_LVLHSH_DEFAULT,
     njs_reference_hash_test,
     njs_lvlhsh_alloc,
     njs_lvlhsh_free,
@@ -239,18 +239,18 @@ const nxt_lvlhsh_proto_t  njs_references_hash_proto
 
 njs_ret_t
 njs_variable_reference(njs_vm_t *vm, njs_parser_scope_t *scope,
-    njs_parser_node_t *node, nxt_str_t *name, uint32_t hash,
+    njs_parser_node_t *node, njs_str_t *name, uint32_t hash,
     njs_reference_type_t type)
 {
     njs_ret_t                 ret;
-    nxt_lvlhsh_query_t        lhq;
+    njs_lvlhsh_query_t        lhq;
     njs_variable_reference_t  *vr;
 
     vr = &node->u.reference;
 
     ret = njs_name_copy(vm, &vr->name, name);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         vr->hash = hash;
         vr->type = type;
 
@@ -261,10 +261,10 @@ njs_variable_reference(njs_vm_t *vm, njs_parser_scope_t *scope,
         lhq.value = node;
         lhq.pool = vm->mem_pool;
 
-        ret = nxt_lvlhsh_insert(&scope->references, &lhq);
+        ret = njs_lvlhsh_insert(&scope->references, &lhq);
 
-        if (nxt_fast_path(ret != NXT_ERROR)) {
-            ret = NXT_OK;
+        if (njs_fast_path(ret != NJS_ERROR)) {
+            ret = NJS_OK;
         }
     }
 
@@ -274,32 +274,32 @@ njs_variable_reference(njs_vm_t *vm, njs_parser_scope_t *scope,
 
 static njs_ret_t
 njs_variables_scope_resolve(njs_vm_t *vm, njs_parser_scope_t *scope,
-    nxt_bool_t closure)
+    njs_bool_t closure)
 {
     njs_ret_t                 ret;
-    nxt_queue_t               *nested;
-    nxt_queue_link_t          *lnk;
+    njs_queue_t               *nested;
+    njs_queue_link_t          *lnk;
     njs_parser_node_t         *node;
-    nxt_lvlhsh_each_t         lhe;
+    njs_lvlhsh_each_t         lhe;
     njs_variable_reference_t  *vr;
 
     nested = &scope->nested;
 
-    for (lnk = nxt_queue_first(nested);
-         lnk != nxt_queue_tail(nested);
-         lnk = nxt_queue_next(lnk))
+    for (lnk = njs_queue_first(nested);
+         lnk != njs_queue_tail(nested);
+         lnk = njs_queue_next(lnk))
     {
-        scope = nxt_queue_link_data(lnk, njs_parser_scope_t, link);
+        scope = njs_queue_link_data(lnk, njs_parser_scope_t, link);
 
         ret = njs_variables_scope_resolve(vm, scope, closure);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
-        nxt_lvlhsh_each_init(&lhe, &njs_variables_hash_proto);
+        njs_lvlhsh_each_init(&lhe, &njs_variables_hash_proto);
 
         for ( ;; ) {
-            node = nxt_lvlhsh_each(&scope->references, &lhe);
+            node = njs_lvlhsh_each(&scope->references, &lhe);
 
             if (node == NULL) {
                 break;
@@ -309,7 +309,7 @@ njs_variables_scope_resolve(njs_vm_t *vm, njs_parser_scope_t *scope,
 
             if (closure) {
                 ret = njs_variable_reference_resolve(vm, vr, node->scope);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     continue;
                 }
 
@@ -322,7 +322,7 @@ njs_variables_scope_resolve(njs_vm_t *vm, njs_parser_scope_t *scope,
         }
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -338,23 +338,23 @@ njs_variables_scope_reference(njs_vm_t *vm, njs_parser_scope_t *scope)
      */
 
     ret = njs_variables_scope_resolve(vm, scope, 1);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     ret = njs_variables_scope_resolve(vm, scope, 0);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_index_t
 njs_variable_typeof(njs_vm_t *vm, njs_parser_node_t *node)
 {
-    nxt_int_t                 ret;
+    njs_int_t                 ret;
     njs_variable_reference_t  *vr;
 
     if (node->index != NJS_INDEX_NONE) {
@@ -365,7 +365,7 @@ njs_variable_typeof(njs_vm_t *vm, njs_parser_node_t *node)
 
     ret = njs_variable_reference_resolve(vm, vr, node->scope);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return vr->variable->index;
     }
 
@@ -384,7 +384,7 @@ njs_variable_index(njs_vm_t *vm, njs_parser_node_t *node)
 
     var = njs_variable_resolve(vm, node);
 
-    if (nxt_fast_path(var != NULL)) {
+    if (njs_fast_path(var != NULL)) {
         return var->index;
     }
 
@@ -395,8 +395,8 @@ njs_variable_index(njs_vm_t *vm, njs_parser_node_t *node)
 njs_variable_t *
 njs_variable_resolve(njs_vm_t *vm, njs_parser_node_t *node)
 {
-    nxt_int_t                 ret;
-    nxt_uint_t                scope_index;
+    njs_int_t                 ret;
+    njs_uint_t                scope_index;
     njs_index_t               index;
     njs_variable_t            *var;
     njs_variable_reference_t  *vr;
@@ -405,7 +405,7 @@ njs_variable_resolve(njs_vm_t *vm, njs_parser_node_t *node)
 
     ret = njs_variable_reference_resolve(vm, vr, node->scope);
 
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         node->u.reference.not_defined = 1;
         return NULL;
     }
@@ -439,7 +439,7 @@ njs_variable_resolve(njs_vm_t *vm, njs_parser_node_t *node)
 
     index = njs_scope_next_index(vm, vr->scope, scope_index, &var->value);
 
-    if (nxt_slow_path(index == NJS_INDEX_ERROR)) {
+    if (njs_slow_path(index == NJS_INDEX_ERROR)) {
         return NULL;
     }
 
@@ -451,17 +451,17 @@ njs_variable_resolve(njs_vm_t *vm, njs_parser_node_t *node)
 
 
 njs_variable_t *
-njs_label_find(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
+njs_label_find(njs_vm_t *vm, njs_parser_scope_t *scope, njs_str_t *name,
     uint32_t hash)
 {
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     lhq.key_hash = hash;
     lhq.key = *name;
     lhq.proto = &njs_variables_hash_proto;
 
     for ( ;; ) {
-        if (nxt_lvlhsh_find(&scope->labels, &lhq) == NXT_OK) {
+        if (njs_lvlhsh_find(&scope->labels, &lhq) == NJS_OK) {
             return lhq.value;
         }
 
@@ -478,7 +478,7 @@ static njs_ret_t
 njs_variable_reference_resolve(njs_vm_t *vm, njs_variable_reference_t *vr,
     njs_parser_scope_t *node_scope)
 {
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
     njs_parser_scope_t  *scope, *previous;
 
     lhq.key_hash = vr->hash;
@@ -489,7 +489,7 @@ njs_variable_reference_resolve(njs_vm_t *vm, njs_variable_reference_t *vr,
     previous = NULL;
 
     for ( ;; ) {
-        if (nxt_lvlhsh_find(&scope->variables, &lhq) == NXT_OK) {
+        if (njs_lvlhsh_find(&scope->variables, &lhq) == NJS_OK) {
             vr->variable = lhq.value;
 
             if (scope->type == NJS_SCOPE_BLOCK
@@ -522,14 +522,14 @@ njs_variable_reference_resolve(njs_vm_t *vm, njs_variable_reference_t *vr,
                 vr->scope_index = NJS_SCOPE_INDEX_CLOSURE;
             }
 
-            return NXT_OK;
+            return NJS_OK;
         }
 
         if (scope->parent == NULL) {
             /* A global scope. */
             vr->scope = scope;
 
-            return NXT_DECLINED;
+            return NJS_DECLINED;
         }
 
         previous = scope;
@@ -540,11 +540,11 @@ njs_variable_reference_resolve(njs_vm_t *vm, njs_variable_reference_t *vr,
 
 njs_index_t
 njs_scope_next_index(njs_vm_t *vm, njs_parser_scope_t *scope,
-    nxt_uint_t scope_index, const njs_value_t *default_value)
+    njs_uint_t scope_index, const njs_value_t *default_value)
 {
+    njs_arr_t    *values;
     njs_index_t  index;
     njs_value_t  *value;
-    nxt_array_t  *values;
 
     if (njs_scope_accumulative(vm, scope)) {
         /*
@@ -552,9 +552,9 @@ njs_scope_next_index(njs_vm_t *vm, njs_parser_scope_t *scope,
          * global variables should be allocated in absolute scope
          * to share them among consecutive VM invocations.
          */
-        value = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
+        value = njs_mp_align(vm->mem_pool, sizeof(njs_value_t),
                              sizeof(njs_value_t));
-        if (nxt_slow_path(value == NULL)) {
+        if (njs_slow_path(value == NULL)) {
             return NJS_INDEX_ERROR;
         }
 
@@ -564,17 +564,17 @@ njs_scope_next_index(njs_vm_t *vm, njs_parser_scope_t *scope,
         values = scope->values[scope_index];
 
         if (values == NULL) {
-            values = nxt_array_create(4, sizeof(njs_value_t),
-                                      &njs_array_mem_proto, vm->mem_pool);
-            if (nxt_slow_path(values == NULL)) {
+            values = njs_arr_create(4, sizeof(njs_value_t),
+                                    &njs_array_mem_proto, vm->mem_pool);
+            if (njs_slow_path(values == NULL)) {
                 return NJS_INDEX_ERROR;
             }
 
             scope->values[scope_index] = values;
         }
 
-        value = nxt_array_add(values, &njs_array_mem_proto, vm->mem_pool);
-        if (nxt_slow_path(value == NULL)) {
+        value = njs_arr_add(values, &njs_array_mem_proto, vm->mem_pool);
+        if (njs_slow_path(value == NULL)) {
             return NJS_INDEX_ERROR;
         }
 
@@ -589,13 +589,13 @@ njs_scope_next_index(njs_vm_t *vm, njs_parser_scope_t *scope,
 
 
 static njs_variable_t *
-njs_variable_alloc(njs_vm_t *vm, nxt_str_t *name, njs_variable_type_t type)
+njs_variable_alloc(njs_vm_t *vm, njs_str_t *name, njs_variable_type_t type)
 {
     njs_ret_t       ret;
     njs_variable_t  *var;
 
-    var = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_variable_t));
-    if (nxt_slow_path(var == NULL)) {
+    var = njs_mp_zalloc(vm->mem_pool, sizeof(njs_variable_t));
+    if (njs_slow_path(var == NULL)) {
         njs_memory_error(vm);
         return NULL;
     }
@@ -604,11 +604,11 @@ njs_variable_alloc(njs_vm_t *vm, nxt_str_t *name, njs_variable_type_t type)
 
     ret = njs_name_copy(vm, &var->name, name);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return var;
     }
 
-    nxt_mp_free(vm->mem_pool, var);
+    njs_mp_free(vm->mem_pool, var);
 
     njs_memory_error(vm);
 
@@ -617,40 +617,40 @@ njs_variable_alloc(njs_vm_t *vm, nxt_str_t *name, njs_variable_type_t type)
 
 
 njs_ret_t
-njs_name_copy(njs_vm_t *vm, nxt_str_t *dst, nxt_str_t *src)
+njs_name_copy(njs_vm_t *vm, njs_str_t *dst, njs_str_t *src)
 {
     dst->length = src->length;
 
-    dst->start = nxt_mp_alloc(vm->mem_pool, src->length);
+    dst->start = njs_mp_alloc(vm->mem_pool, src->length);
 
-    if (nxt_fast_path(dst->start != NULL)) {
+    if (njs_fast_path(dst->start != NULL)) {
         (void) memcpy(dst->start, src->start, src->length);
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     njs_memory_error(vm);
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 const njs_value_t *
-njs_vm_value(njs_vm_t *vm, const nxt_str_t *name)
+njs_vm_value(njs_vm_t *vm, const njs_str_t *name)
 {
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    lhq.key_hash = nxt_djb_hash(name->start, name->length);
+    lhq.key_hash = njs_djb_hash(name->start, name->length);
     lhq.key = *name;
     lhq.proto = &njs_variables_hash_proto;
 
-    if (nxt_lvlhsh_find(&vm->variables_hash, &lhq) == NXT_OK) {
+    if (njs_lvlhsh_find(&vm->variables_hash, &lhq) == NJS_OK) {
         return njs_vmcode_operand(vm, ((njs_variable_t *) lhq.value)->index);
     }
 
     lhq.proto = &njs_extern_value_hash_proto;
 
-    if (nxt_lvlhsh_find(&vm->externals_hash, &lhq) == NXT_OK) {
+    if (njs_lvlhsh_find(&vm->externals_hash, &lhq) == NJS_OK) {
         return &((njs_extern_value_t *) lhq.value)->value;
     }
 
@@ -659,7 +659,7 @@ njs_vm_value(njs_vm_t *vm, const nxt_str_t *name)
 
 
 njs_function_t *
-njs_vm_function(njs_vm_t *vm, const nxt_str_t *name)
+njs_vm_function(njs_vm_t *vm, const njs_str_t *name)
 {
     const njs_value_t  *value;
 
similarity index 74%
rename from njs/njs_variable.h
rename to src/njs_variable.h
index f5fc9db034aade4e373841faed7e45a2e26560bb..6af6f72d6b2b0740b4bf723bfaf532a8a1047614 100644 (file)
@@ -19,7 +19,7 @@ typedef enum {
 
 
 typedef struct {
-    nxt_str_t             name;
+    njs_str_t             name;
 
     njs_variable_type_t   type:8;    /* 3 bits */
     uint8_t               argument;
@@ -46,32 +46,32 @@ typedef enum {
 typedef struct {
     njs_reference_type_t  type;
     uint32_t              hash;
-    nxt_str_t             name;
+    njs_str_t             name;
     njs_variable_t        *variable;
     njs_parser_scope_t    *scope;
-    nxt_uint_t            scope_index;  /* NJS_SCOPE_INDEX_... */
-    nxt_bool_t            not_defined;
+    njs_uint_t            scope_index;  /* NJS_SCOPE_INDEX_... */
+    njs_bool_t            not_defined;
 } njs_variable_reference_t;
 
 
 njs_variable_t *njs_variable_add(njs_vm_t *vm, njs_parser_scope_t *scope,
-    nxt_str_t *name, uint32_t hash, njs_variable_type_t type);
+    njs_str_t *name, uint32_t hash, njs_variable_type_t type);
 njs_variable_t * njs_label_add(njs_vm_t *vm, njs_parser_scope_t *scope,
-    nxt_str_t *name, uint32_t hash);
+    njs_str_t *name, uint32_t hash);
 njs_variable_t *njs_label_find(njs_vm_t *vm, njs_parser_scope_t *scope,
-    nxt_str_t *name, uint32_t hash);
+    njs_str_t *name, uint32_t hash);
 njs_ret_t njs_label_remove(njs_vm_t *vm, njs_parser_scope_t *scope,
-    nxt_str_t *name, uint32_t hash);
+    njs_str_t *name, uint32_t hash);
 njs_ret_t njs_variable_reference(njs_vm_t *vm, njs_parser_scope_t *scope,
-    njs_parser_node_t *node, nxt_str_t *name, uint32_t hash,
+    njs_parser_node_t *node, njs_str_t *name, uint32_t hash,
     njs_reference_type_t type);
 njs_ret_t njs_variables_scope_reference(njs_vm_t *vm,
     njs_parser_scope_t *scope);
 njs_index_t njs_scope_next_index(njs_vm_t *vm, njs_parser_scope_t *scope,
-    nxt_uint_t scope_index, const njs_value_t *default_value);
-njs_ret_t njs_name_copy(njs_vm_t *vm, nxt_str_t *dst, nxt_str_t *src);
+    njs_uint_t scope_index, const njs_value_t *default_value);
+njs_ret_t njs_name_copy(njs_vm_t *vm, njs_str_t *dst, njs_str_t *src);
 
-extern const nxt_lvlhsh_proto_t  njs_variables_hash_proto;
+extern const njs_lvlhsh_proto_t  njs_variables_hash_proto;
 
 
 #endif /* _NJS_VARIABLE_H_INCLUDED_ */
similarity index 66%
rename from njs/njs_vm.c
rename to src/njs_vm.c
index 2955114233b37776c6609e9286db2bc2a70d6630..ea3edab7f07f8f5872cc5f07090876a4be0ea8e6 100644 (file)
@@ -4,26 +4,26 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_regexp.h>
 #include <string.h>
 
 
-static nxt_int_t njs_vm_init(njs_vm_t *vm);
-static nxt_int_t njs_vm_handle_events(njs_vm_t *vm);
+static njs_int_t njs_vm_init(njs_vm_t *vm);
+static njs_int_t njs_vm_handle_events(njs_vm_t *vm);
 
 
-const nxt_str_t  njs_entry_main =           nxt_string("main");
-const nxt_str_t  njs_entry_module =         nxt_string("module");
-const nxt_str_t  njs_entry_native =         nxt_string("native");
-const nxt_str_t  njs_entry_unknown =        nxt_string("unknown");
-const nxt_str_t  njs_entry_anonymous =      nxt_string("anonymous");
+const njs_str_t  njs_entry_main =           njs_str("main");
+const njs_str_t  njs_entry_module =         njs_str("module");
+const njs_str_t  njs_entry_native =         njs_str("native");
+const njs_str_t  njs_entry_unknown =        njs_str("unknown");
+const njs_str_t  njs_entry_anonymous =      njs_str("anonymous");
 
 
 static void *
 njs_alloc(void *mem, size_t size)
 {
-    return nxt_malloc(size);
+    return njs_malloc(size);
 }
 
 
@@ -32,10 +32,10 @@ njs_zalloc(void *mem, size_t size)
 {
     void  *p;
 
-    p = nxt_malloc(size);
+    p = njs_malloc(size);
 
     if (p != NULL) {
-        nxt_memzero(p, size);
+        njs_memzero(p, size);
     }
 
     return p;
@@ -45,23 +45,23 @@ njs_zalloc(void *mem, size_t size)
 static void *
 njs_align(void *mem, size_t alignment, size_t size)
 {
-    return nxt_memalign(alignment, size);
+    return njs_memalign(alignment, size);
 }
 
 
 static void
-njs_free(void *mem, void *p)
+njs_free2(void *mem, void *p)
 {
-    nxt_free(p);
+    njs_free(p);
 }
 
 
-const nxt_mem_proto_t  njs_vm_mp_proto = {
+const njs_mem_proto_t  njs_vm_mp_proto = {
     njs_alloc,
     njs_zalloc,
     njs_align,
     NULL,
-    njs_free,
+    njs_free2,
     NULL,
     NULL,
 };
@@ -70,18 +70,18 @@ const nxt_mem_proto_t  njs_vm_mp_proto = {
 static void *
 njs_array_mem_alloc(void *mem, size_t size)
 {
-    return nxt_mp_alloc(mem, size);
+    return njs_mp_alloc(mem, size);
 }
 
 
 static void
 njs_array_mem_free(void *mem, void *p)
 {
-    nxt_mp_free(mem, p);
+    njs_mp_free(mem, p);
 }
 
 
-const nxt_mem_proto_t  njs_array_mem_proto = {
+const njs_mem_proto_t  njs_array_mem_proto = {
     njs_array_mem_alloc,
     NULL,
     NULL,
@@ -95,25 +95,25 @@ const nxt_mem_proto_t  njs_array_mem_proto = {
 njs_vm_t *
 njs_vm_create(njs_vm_opt_t *options)
 {
-    nxt_mp_t              *mp;
+    njs_mp_t              *mp;
     njs_vm_t              *vm;
-    nxt_int_t             ret;
-    nxt_array_t           *debug;
+    njs_int_t             ret;
+    njs_arr_t             *debug;
     njs_regexp_pattern_t  *pattern;
 
-    mp = nxt_mp_create(&njs_vm_mp_proto, NULL, NULL, 2 * nxt_pagesize(),
+    mp = njs_mp_create(&njs_vm_mp_proto, NULL, NULL, 2 * njs_pagesize(),
                        128, 512, 16);
-    if (nxt_slow_path(mp == NULL)) {
+    if (njs_slow_path(mp == NULL)) {
         return NULL;
     }
 
-    vm = nxt_mp_zalign(mp, sizeof(njs_value_t), sizeof(njs_vm_t));
+    vm = njs_mp_zalign(mp, sizeof(njs_value_t), sizeof(njs_vm_t));
 
-    if (nxt_fast_path(vm != NULL)) {
+    if (njs_fast_path(vm != NULL)) {
         vm->mem_pool = mp;
 
         ret = njs_regexp_init(vm);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return NULL;
         }
 
@@ -123,61 +123,61 @@ njs_vm_create(njs_vm_opt_t *options)
             vm->shared = options->shared;
 
         } else {
-            vm->shared = nxt_mp_zalloc(mp, sizeof(njs_vm_shared_t));
-            if (nxt_slow_path(vm->shared == NULL)) {
+            vm->shared = njs_mp_zalloc(mp, sizeof(njs_vm_shared_t));
+            if (njs_slow_path(vm->shared == NULL)) {
                 return NULL;
             }
 
             options->shared = vm->shared;
 
-            nxt_lvlhsh_init(&vm->shared->keywords_hash);
+            njs_lvlhsh_init(&vm->shared->keywords_hash);
 
             ret = njs_lexer_keywords_init(mp, &vm->shared->keywords_hash);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return NULL;
             }
 
-            nxt_lvlhsh_init(&vm->shared->values_hash);
+            njs_lvlhsh_init(&vm->shared->values_hash);
 
             pattern = njs_regexp_pattern_create(vm, (u_char *) "(?:)",
-                                                nxt_length("(?:)"), 0);
-            if (nxt_slow_path(pattern == NULL)) {
+                                                njs_length("(?:)"), 0);
+            if (njs_slow_path(pattern == NULL)) {
                 return NULL;
             }
 
             vm->shared->empty_regexp_pattern = pattern;
 
-            nxt_lvlhsh_init(&vm->modules_hash);
+            njs_lvlhsh_init(&vm->modules_hash);
 
             ret = njs_builtin_objects_create(vm);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return NULL;
             }
         }
 
-        nxt_lvlhsh_init(&vm->values_hash);
+        njs_lvlhsh_init(&vm->values_hash);
 
         vm->external = options->external;
 
-        vm->external_objects = nxt_array_create(4, sizeof(void *),
-                                                &njs_array_mem_proto,
-                                                vm->mem_pool);
-        if (nxt_slow_path(vm->external_objects == NULL)) {
+        vm->external_objects = njs_arr_create(4, sizeof(void *),
+                                              &njs_array_mem_proto,
+                                              vm->mem_pool);
+        if (njs_slow_path(vm->external_objects == NULL)) {
             return NULL;
         }
 
-        nxt_lvlhsh_init(&vm->externals_hash);
-        nxt_lvlhsh_init(&vm->external_prototypes_hash);
+        njs_lvlhsh_init(&vm->externals_hash);
+        njs_lvlhsh_init(&vm->external_prototypes_hash);
 
-        vm->trace.level = NXT_LEVEL_TRACE;
+        vm->trace.level = NJS_LEVEL_TRACE;
         vm->trace.size = 2048;
         vm->trace.handler = njs_parser_trace_handler;
         vm->trace.data = vm;
 
         if (options->backtrace) {
-            debug = nxt_array_create(4, sizeof(njs_function_debug_t),
-                                     &njs_array_mem_proto, vm->mem_pool);
-            if (nxt_slow_path(debug == NULL)) {
+            debug = njs_arr_create(4, sizeof(njs_function_debug_t),
+                                   &njs_array_mem_proto, vm->mem_pool);
+            if (njs_slow_path(debug == NULL)) {
                 return NULL;
             }
 
@@ -186,7 +186,7 @@ njs_vm_create(njs_vm_opt_t *options)
 
         if (options->accumulative) {
             ret = njs_vm_init(vm);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return NULL;
             }
         }
@@ -200,13 +200,13 @@ void
 njs_vm_destroy(njs_vm_t *vm)
 {
     njs_event_t        *event;
-    nxt_lvlhsh_each_t  lhe;
+    njs_lvlhsh_each_t  lhe;
 
     if (njs_waiting_events(vm)) {
-        nxt_lvlhsh_each_init(&lhe, &njs_event_hash_proto);
+        njs_lvlhsh_each_init(&lhe, &njs_event_hash_proto);
 
         for ( ;; ) {
-            event = nxt_lvlhsh_each(&vm->events_hash, &lhe);
+            event = njs_lvlhsh_each(&vm->events_hash, &lhe);
 
             if (event == NULL) {
                 break;
@@ -216,14 +216,14 @@ njs_vm_destroy(njs_vm_t *vm)
         }
     }
 
-    nxt_mp_destroy(vm->mem_pool);
+    njs_mp_destroy(vm->mem_pool);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_lexer_t         lexer;
     njs_parser_t        *parser, *prev;
     njs_generator_t     generator;
@@ -237,8 +237,8 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
         njs_module_reset(vm);
     }
 
-    parser = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_parser_t));
-    if (nxt_slow_path(parser == NULL)) {
+    parser = njs_mp_zalloc(vm->mem_pool, sizeof(njs_parser_t));
+    if (njs_slow_path(parser == NULL)) {
         return NJS_ERROR;
     }
 
@@ -246,20 +246,20 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
     vm->parser = parser;
 
     ret = njs_lexer_init(vm, &lexer, &vm->options.file, *start, end);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
     parser->lexer = &lexer;
 
     if (vm->backtrace != NULL) {
-        nxt_array_reset(vm->backtrace);
+        njs_arr_reset(vm->backtrace);
     }
 
     vm->retval = njs_value_undefined;
 
     ret = njs_parser(vm, parser, prev);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         goto fail;
     }
 
@@ -268,7 +268,7 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
     scope = parser->scope;
 
     ret = njs_variables_scope_reference(vm, scope);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         goto fail;
     }
 
@@ -280,10 +280,10 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
      */
     vm->codes = NULL;
 
-    nxt_memzero(&generator, sizeof(njs_generator_t));
+    njs_memzero(&generator, sizeof(njs_generator_t));
 
     ret = njs_generate_scope(vm, &generator, scope, &njs_entry_main);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         goto fail;
     }
 
@@ -295,7 +295,7 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
 
     if (vm->options.init) {
         ret = njs_vm_init(vm);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
     }
@@ -306,34 +306,34 @@ fail:
 
     vm->parser = prev;
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 njs_vm_t *
 njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external)
 {
-    nxt_mp_t     *nmp;
-    njs_vm_t     *nvm;
-    uint32_t     items;
-    nxt_int_t    ret;
-    nxt_array_t  *externals;
+    njs_mp_t   *nmp;
+    njs_vm_t   *nvm;
+    uint32_t   items;
+    njs_int_t  ret;
+    njs_arr_t  *externals;
 
-    nxt_thread_log_debug("CLONE:");
+    njs_thread_log_debug("CLONE:");
 
     if (vm->options.accumulative) {
         return NULL;
     }
 
-    nmp = nxt_mp_create(&njs_vm_mp_proto, NULL, NULL, 2 * nxt_pagesize(),
+    nmp = njs_mp_create(&njs_vm_mp_proto, NULL, NULL, 2 * njs_pagesize(),
                         128, 512, 16);
-    if (nxt_slow_path(nmp == NULL)) {
+    if (njs_slow_path(nmp == NULL)) {
         return NULL;
     }
 
-    nvm = nxt_mp_zalign(nmp, sizeof(njs_value_t), sizeof(njs_vm_t));
+    nvm = njs_mp_zalign(nmp, sizeof(njs_value_t), sizeof(njs_vm_t));
 
-    if (nxt_fast_path(nvm != NULL)) {
+    if (njs_fast_path(nvm != NULL)) {
         nvm->mem_pool = nmp;
 
         nvm->shared = vm->shared;
@@ -351,10 +351,10 @@ njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external)
         nvm->external_prototypes_hash = vm->external_prototypes_hash;
 
         items = vm->external_objects->items;
-        externals = nxt_array_create(items + 4, sizeof(void *),
-                                     &njs_array_mem_proto, nvm->mem_pool);
+        externals = njs_arr_create(items + 4, sizeof(void *),
+                                   &njs_array_mem_proto, nvm->mem_pool);
 
-        if (nxt_slow_path(externals == NULL)) {
+        if (njs_slow_path(externals == NULL)) {
             return NULL;
         }
 
@@ -378,7 +378,7 @@ njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external)
         nvm->debug = vm->debug;
 
         ret = njs_vm_init(nvm);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             goto fail;
         }
 
@@ -387,32 +387,32 @@ njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external)
 
 fail:
 
-    nxt_mp_destroy(nmp);
+    njs_mp_destroy(nmp);
 
     return NULL;
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_vm_init(njs_vm_t *vm)
 {
     size_t       size, scope_size;
     u_char       *values;
-    nxt_int_t    ret;
+    njs_int_t    ret;
+    njs_arr_t    *backtrace;
     njs_frame_t  *frame;
-    nxt_array_t  *backtrace;
 
     scope_size = vm->scope_size + NJS_INDEX_GLOBAL_OFFSET;
 
     size = NJS_GLOBAL_FRAME_SIZE + scope_size + NJS_FRAME_SPARE_SIZE;
-    size = nxt_align_size(size, NJS_FRAME_SPARE_SIZE);
+    size = njs_align_size(size, NJS_FRAME_SPARE_SIZE);
 
-    frame = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t), size);
-    if (nxt_slow_path(frame == NULL)) {
-        return NXT_ERROR;
+    frame = njs_mp_align(vm->mem_pool, sizeof(njs_value_t), size);
+    if (njs_slow_path(frame == NULL)) {
+        return NJS_ERROR;
     }
 
-    nxt_memzero(frame, NJS_GLOBAL_FRAME_SIZE);
+    njs_memzero(frame, NJS_GLOBAL_FRAME_SIZE);
 
     vm->top_frame = &frame->native;
     vm->active_frame = frame;
@@ -429,23 +429,23 @@ njs_vm_init(njs_vm_t *vm)
            vm->scope_size);
 
     ret = njs_regexp_init(vm);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
     ret = njs_builtin_objects_clone(vm);
-    if (nxt_slow_path(ret != NXT_OK)) {
-        return NXT_ERROR;
+    if (njs_slow_path(ret != NJS_OK)) {
+        return NJS_ERROR;
     }
 
-    nxt_lvlhsh_init(&vm->events_hash);
-    nxt_queue_init(&vm->posted_events);
+    njs_lvlhsh_init(&vm->events_hash);
+    njs_queue_init(&vm->posted_events);
 
     if (vm->debug != NULL) {
-        backtrace = nxt_array_create(4, sizeof(njs_backtrace_entry_t),
-                                     &njs_array_mem_proto, vm->mem_pool);
-        if (nxt_slow_path(backtrace == NULL)) {
-            return NXT_ERROR;
+        backtrace = njs_arr_create(4, sizeof(njs_backtrace_entry_t),
+                                   &njs_array_mem_proto, vm->mem_pool);
+        if (njs_slow_path(backtrace == NULL)) {
+            return NJS_ERROR;
         }
 
         vm->backtrace = backtrace;
@@ -455,21 +455,21 @@ njs_vm_init(njs_vm_t *vm)
         vm->retval = njs_value_undefined;
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-nxt_int_t
+njs_int_t
 njs_vm_call(njs_vm_t *vm, njs_function_t *function, const njs_value_t *args,
-    nxt_uint_t nargs)
+    njs_uint_t nargs)
 {
     return njs_vm_invoke(vm, function, args, nargs, (njs_index_t) &vm->retval);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_vm_invoke(njs_vm_t *vm, njs_function_t *function, const njs_value_t *args,
-    nxt_uint_t nargs, njs_index_t retval)
+    njs_uint_t nargs, njs_index_t retval)
 {
     njs_ret_t    ret;
     njs_value_t  *this;
@@ -478,7 +478,7 @@ njs_vm_invoke(njs_vm_t *vm, njs_function_t *function, const njs_value_t *args,
 
     ret = njs_function_frame(vm, function, this, (njs_value_t *) args, nargs,
                              0);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -490,7 +490,7 @@ void
 njs_vm_scopes_restore(njs_vm_t *vm, njs_frame_t *frame,
     njs_native_frame_t *previous)
 {
-    nxt_uint_t      n, nesting;
+    njs_uint_t      n, nesting;
     njs_value_t     *args;
     njs_function_t  *function;
 
@@ -539,13 +539,13 @@ njs_vm_scopes_restore(njs_vm_t *vm, njs_frame_t *frame,
 
 
 njs_vm_event_t
-njs_vm_add_event(njs_vm_t *vm, njs_function_t *function, nxt_uint_t once,
+njs_vm_add_event(njs_vm_t *vm, njs_function_t *function, njs_uint_t once,
     njs_host_event_t host_ev, njs_event_destructor_t destructor)
 {
     njs_event_t  *event;
 
-    event = nxt_mp_alloc(vm->mem_pool, sizeof(njs_event_t));
-    if (nxt_slow_path(event == NULL)) {
+    event = njs_mp_alloc(vm->mem_pool, sizeof(njs_event_t));
+    if (njs_slow_path(event == NULL)) {
         return NULL;
     }
 
@@ -576,23 +576,23 @@ njs_vm_del_event(njs_vm_t *vm, njs_vm_event_t vm_event)
 }
 
 
-nxt_int_t
+njs_int_t
 njs_vm_waiting(njs_vm_t *vm)
 {
     return njs_waiting_events(vm);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_vm_posted(njs_vm_t *vm)
 {
     return njs_posted_events(vm);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event,
-    const njs_value_t *args, nxt_uint_t nargs)
+    const njs_value_t *args, njs_uint_t nargs)
 {
     njs_event_t  *event;
 
@@ -600,8 +600,8 @@ njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event,
 
     if (nargs != 0 && !event->posted) {
         event->nargs = nargs;
-        event->args = nxt_mp_alloc(vm->mem_pool, sizeof(njs_value_t) * nargs);
-        if (nxt_slow_path(event->args == NULL)) {
+        event->args = njs_mp_alloc(vm->mem_pool, sizeof(njs_value_t) * nargs);
+        if (njs_slow_path(event->args == NULL)) {
             return NJS_ERROR;
         }
 
@@ -610,31 +610,31 @@ njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event,
 
     if (!event->posted) {
         event->posted = 1;
-        nxt_queue_insert_tail(&vm->posted_events, &event->link);
+        njs_queue_insert_tail(&vm->posted_events, &event->link);
     }
 
     return NJS_OK;
 }
 
 
-nxt_int_t
+njs_int_t
 njs_vm_run(njs_vm_t *vm)
 {
-    if (nxt_slow_path(vm->backtrace != NULL)) {
-        nxt_array_reset(vm->backtrace);
+    if (njs_slow_path(vm->backtrace != NULL)) {
+        njs_arr_reset(vm->backtrace);
     }
 
     return njs_vm_handle_events(vm);
 }
 
 
-nxt_int_t
+njs_int_t
 njs_vm_start(njs_vm_t *vm)
 {
     njs_ret_t  ret;
 
     ret = njs_module_load(vm);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
@@ -642,31 +642,31 @@ njs_vm_start(njs_vm_t *vm)
 }
 
 
-static nxt_int_t
+static njs_int_t
 njs_vm_handle_events(njs_vm_t *vm)
 {
-    nxt_int_t         ret;
+    njs_int_t         ret;
     njs_event_t       *ev;
-    nxt_queue_t       *events;
-    nxt_queue_link_t  *link;
+    njs_queue_t       *events;
+    njs_queue_link_t  *link;
 
     events = &vm->posted_events;
 
     for ( ;; ) {
-        link = nxt_queue_first(events);
+        link = njs_queue_first(events);
 
-        if (link == nxt_queue_tail(events)) {
+        if (link == njs_queue_tail(events)) {
             break;
         }
 
-        ev = nxt_queue_link_data(link, njs_event_t, link);
+        ev = njs_queue_link_data(link, njs_event_t, link);
 
         if (ev->once) {
             njs_del_event(vm, ev, NJS_EVENT_RELEASE | NJS_EVENT_DELETE);
 
         } else {
             ev->posted = 0;
-            nxt_queue_remove(&ev->link);
+            njs_queue_remove(&ev->link);
         }
 
         ret = njs_vm_call(vm, ev->function, ev->args, ev->nargs);
@@ -680,27 +680,27 @@ njs_vm_handle_events(njs_vm_t *vm)
 }
 
 
-nxt_int_t
-njs_vm_add_path(njs_vm_t *vm, const nxt_str_t *path)
+njs_int_t
+njs_vm_add_path(njs_vm_t *vm, const njs_str_t *path)
 {
-    nxt_str_t  *item;
+    njs_str_t  *item;
 
     if (vm->paths == NULL) {
-        vm->paths = nxt_array_create(4, sizeof(nxt_str_t),
-                                     &njs_array_mem_proto, vm->mem_pool);
-        if (nxt_slow_path(vm->paths == NULL)) {
-            return NXT_ERROR;
+        vm->paths = njs_arr_create(4, sizeof(njs_str_t),
+                                   &njs_array_mem_proto, vm->mem_pool);
+        if (njs_slow_path(vm->paths == NULL)) {
+            return NJS_ERROR;
         }
     }
 
-    item = nxt_array_add(vm->paths, &njs_array_mem_proto, vm->mem_pool);
-    if (nxt_slow_path(item == NULL)) {
-        return NXT_ERROR;
+    item = njs_arr_add(vm->paths, &njs_array_mem_proto, vm->mem_pool);
+    if (njs_slow_path(item == NULL)) {
+        return NJS_ERROR;
     }
 
     *item = *path;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
@@ -733,17 +733,17 @@ njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value, uint32_t size)
 }
 
 
-nxt_noinline void
+njs_noinline void
 njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value, const char *fmt, ...)
 {
     va_list  args;
-    u_char   buf[NXT_MAX_ERROR_STR], *p;
+    u_char   buf[NJS_MAX_ERROR_STR], *p;
 
     p = buf;
 
     if (fmt != NULL) {
         va_start(args, fmt);
-        p = nxt_vsprintf(buf, buf + sizeof(buf), fmt, args);
+        p = njs_vsprintf(buf, buf + sizeof(buf), fmt, args);
         va_end(args);
     }
 
@@ -751,17 +751,17 @@ njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value, const char *fmt, ...)
 }
 
 
-nxt_noinline void
+njs_noinline void
 njs_vm_memory_error(njs_vm_t *vm)
 {
     njs_memory_error_set(vm, &vm->retval);
 }
 
 
-nxt_array_t *
+njs_arr_t *
 njs_vm_backtrace(njs_vm_t *vm)
 {
-    if (vm->backtrace != NULL && !nxt_array_is_empty(vm->backtrace)) {
+    if (vm->backtrace != NULL && !njs_arr_is_empty(vm->backtrace)) {
         return vm->backtrace;
     }
 
@@ -770,12 +770,12 @@ njs_vm_backtrace(njs_vm_t *vm)
 
 
 static njs_ret_t
-njs_vm_backtrace_dump(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
+njs_vm_backtrace_dump(njs_vm_t *vm, njs_str_t *dst, const njs_value_t *src)
 {
     u_char                 *p, *start, *end;
     size_t                 len, count;
-    nxt_uint_t             i;
-    nxt_array_t            *backtrace;
+    njs_uint_t             i;
+    njs_arr_t              *backtrace;
     njs_backtrace_entry_t  *be, *prev;
 
     backtrace = njs_vm_backtrace(vm);
@@ -796,18 +796,18 @@ njs_vm_backtrace_dump(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
         } else {
 
             if (count != 0) {
-                len += nxt_length("      repeats  times\n")
-                       + NXT_INT_T_LEN;
+                len += njs_length("      repeats  times\n")
+                       + NJS_INT_T_LEN;
                 count = 0;
             }
 
-            len += be->name.length + nxt_length("    at  ()\n");
+            len += be->name.length + njs_length("    at  ()\n");
 
             if (be->line != 0) {
-                len += be->file.length + NXT_INT_T_LEN + 1;
+                len += be->file.length + NJS_INT_T_LEN + 1;
 
             } else {
-                len += nxt_length("native");
+                len += njs_length("native");
             }
         }
 
@@ -815,16 +815,16 @@ njs_vm_backtrace_dump(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
         be++;
     }
 
-    p = nxt_mp_alloc(vm->mem_pool, len);
+    p = njs_mp_alloc(vm->mem_pool, len);
     if (p == NULL) {
         njs_memory_error(vm);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     start = p;
     end = start + len;
 
-    p = nxt_cpymem(p, dst->start, dst->length);
+    p = njs_cpymem(p, dst->start, dst->length);
     *p++ = '\n';
 
     count = 0;
@@ -840,19 +840,19 @@ njs_vm_backtrace_dump(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
 
         } else {
             if (count != 0) {
-                p = nxt_sprintf(p, end, "      repeats %uz times\n",
+                p = njs_sprintf(p, end, "      repeats %uz times\n",
                                 count);
                 count = 0;
             }
 
-            p = nxt_sprintf(p, end, "    at %V ", &be->name);
+            p = njs_sprintf(p, end, "    at %V ", &be->name);
 
             if (be->line != 0) {
-                p = nxt_sprintf(p, end, "(%V:%uD)\n", &be->file,
+                p = njs_sprintf(p, end, "(%V:%uD)\n", &be->file,
                                 be->line);
 
             } else {
-                p = nxt_sprintf(p, end, "(native)\n");
+                p = njs_sprintf(p, end, "(native)\n");
             }
         }
 
@@ -863,22 +863,22 @@ njs_vm_backtrace_dump(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
     dst->start = start;
     dst->length = p - dst->start;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 njs_ret_t
-njs_vm_value_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
+njs_vm_value_string(njs_vm_t *vm, njs_str_t *dst, const njs_value_t *src)
 {
     njs_ret_t   ret;
-    nxt_uint_t  exception;
+    njs_uint_t  exception;
 
-    if (nxt_slow_path(src->type == NJS_NUMBER
+    if (njs_slow_path(src->type == NJS_NUMBER
                       && njs_number(src) == 0
                       && signbit(njs_number(src))))
     {
         njs_string_get(&njs_string_minus_zero, dst);
-        return NXT_OK;
+        return NJS_OK;
     }
 
     exception = 1;
@@ -887,16 +887,16 @@ again:
 
     ret = njs_vm_value_to_string(vm, dst, src);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
 
         if (njs_vm_backtrace(vm) != NULL) {
             ret = njs_vm_backtrace_dump(vm, dst, src);
-            if (nxt_slow_path(ret != NXT_OK)) {
-                return NXT_ERROR;
+            if (njs_slow_path(ret != NJS_OK)) {
+                return NJS_ERROR;
             }
         }
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     if (exception) {
@@ -911,12 +911,12 @@ again:
     dst->length = 0;
     dst->start = NULL;
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 njs_ret_t
-njs_vm_retval_string(njs_vm_t *vm, nxt_str_t *dst)
+njs_vm_retval_string(njs_vm_t *vm, njs_str_t *dst)
 {
     if (vm->top_frame == NULL) {
         /* An exception was thrown during compilation. */
@@ -929,7 +929,7 @@ njs_vm_retval_string(njs_vm_t *vm, nxt_str_t *dst)
 
 
 njs_ret_t
-njs_vm_retval_dump(njs_vm_t *vm, nxt_str_t *dst, nxt_uint_t indent)
+njs_vm_retval_dump(njs_vm_t *vm, njs_str_t *dst, njs_uint_t indent)
 {
     if (vm->top_frame == NULL) {
         /* An exception was thrown during compilation. */
@@ -945,15 +945,15 @@ njs_ret_t
 njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval, ...)
 {
     va_list             args;
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_ret_t           rc;
     njs_value_t         *name, *value;
     njs_object_t        *object;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     object = njs_object_alloc(vm);
-    if (nxt_slow_path(object == NULL)) {
+    if (njs_slow_path(object == NULL)) {
         return NJS_ERROR;
     }
 
@@ -973,7 +973,7 @@ njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval, ...)
             goto done;
         }
 
-        if (nxt_slow_path(!njs_is_string(name))) {
+        if (njs_slow_path(!njs_is_string(name))) {
             njs_type_error(vm, "prop name is not a string");
             goto done;
         }
@@ -983,17 +983,17 @@ njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval, ...)
         lhq.proto = &njs_object_hash_proto;
 
         njs_string_get(name, &lhq.key);
-        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
 
         prop = njs_object_prop_alloc(vm, name, value, 1);
-        if (nxt_slow_path(prop == NULL)) {
+        if (njs_slow_path(prop == NULL)) {
             goto done;
         }
 
         lhq.value = prop;
 
-        ret = nxt_lvlhsh_insert(&object->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&object->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, NULL);
             goto done;
         }
@@ -1012,22 +1012,22 @@ done:
 
 
 njs_value_t *
-njs_vm_object_prop(njs_vm_t *vm, const njs_value_t *value, const nxt_str_t *key)
+njs_vm_object_prop(njs_vm_t *vm, const njs_value_t *value, const njs_str_t *key)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
-    if (nxt_slow_path(!njs_is_object(value))) {
+    if (njs_slow_path(!njs_is_object(value))) {
         return NULL;
     }
 
     lhq.key = *key;
-    lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+    lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
     lhq.proto = &njs_object_hash_proto;
 
-    ret = nxt_lvlhsh_find(njs_object_hash(value), &lhq);
-    if (nxt_slow_path(ret != NXT_OK)) {
+    ret = njs_lvlhsh_find(njs_object_hash(value), &lhq);
+    if (njs_slow_path(ret != NJS_OK)) {
         return NULL;
     }
 
@@ -1038,22 +1038,22 @@ njs_vm_object_prop(njs_vm_t *vm, const njs_value_t *value, const nxt_str_t *key)
 
 
 njs_ret_t
-njs_vm_value_to_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
+njs_vm_value_to_string(njs_vm_t *vm, njs_str_t *dst, const njs_value_t *src)
 {
     u_char       *start;
     size_t       size;
     njs_ret_t    ret;
     njs_value_t  value;
 
-    if (nxt_slow_path(src == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(src == NULL)) {
+        return NJS_ERROR;
     }
 
-    if (nxt_slow_path(src->type == NJS_OBJECT_INTERNAL_ERROR)) {
+    if (njs_slow_path(src->type == NJS_OBJECT_INTERNAL_ERROR)) {
         /* MemoryError is a nonextensible internal error. */
         if (!njs_object(src)->extensible) {
             njs_string_get(&njs_string_memory_error, dst);
-            return NXT_OK;
+            return NJS_OK;
         }
     }
 
@@ -1061,14 +1061,14 @@ njs_vm_value_to_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
 
     ret = njs_value_to_string(vm, &value, &value);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         size = value.short_string.size;
 
         if (size != NJS_STRING_LONG) {
-            start = nxt_mp_alloc(vm->mem_pool, size);
-            if (nxt_slow_path(start == NULL)) {
+            start = njs_mp_alloc(vm->mem_pool, size);
+            if (njs_slow_path(start == NULL)) {
                 njs_memory_error(vm);
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
             memcpy(start, value.short_string.start, size);
@@ -1086,8 +1086,8 @@ njs_vm_value_to_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src)
 }
 
 
-nxt_int_t
-njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval,
+njs_int_t
+njs_vm_value_string_copy(njs_vm_t *vm, njs_str_t *retval,
     const njs_value_t *value, uintptr_t *next)
 {
     uintptr_t    n;
@@ -1097,7 +1097,7 @@ njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval,
 
     case NJS_STRING:
         if (*next != 0) {
-            return NXT_DECLINED;
+            return NJS_DECLINED;
         }
 
         *next = 1;
@@ -1110,7 +1110,7 @@ njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval,
             n = (*next)++;
 
             if (n == array->length) {
-                return NXT_DECLINED;
+                return NJS_DECLINED;
             }
 
             value = &array->start[n];
@@ -1120,7 +1120,7 @@ njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval,
         break;
 
     default:
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     return njs_vm_value_to_string(vm, retval, value);
@@ -1130,8 +1130,8 @@ njs_vm_value_string_copy(njs_vm_t *vm, nxt_str_t *retval,
 njs_ret_t
 njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame)
 {
-    nxt_int_t              ret;
-    nxt_uint_t             i;
+    njs_int_t              ret;
+    njs_uint_t             i;
     njs_function_t         *function;
     njs_native_frame_t     *native_frame;
     njs_function_debug_t   *debug_entry;
@@ -1141,33 +1141,33 @@ njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame)
     native_frame = &frame->native;
     function = native_frame->function;
 
-    be = nxt_array_add(vm->backtrace, &njs_array_mem_proto, vm->mem_pool);
-    if (nxt_slow_path(be == NULL)) {
-        return NXT_ERROR;
+    be = njs_arr_add(vm->backtrace, &njs_array_mem_proto, vm->mem_pool);
+    if (njs_slow_path(be == NULL)) {
+        return NJS_ERROR;
     }
 
     be->line = 0;
 
     if (function == NULL) {
         be->name = njs_entry_main;
-        return NXT_OK;
+        return NJS_OK;
     }
 
     if (function->native) {
         ret = njs_builtin_match_native_function(vm, function, &be->name);
-        if (ret == NXT_OK) {
-            return NXT_OK;
+        if (ret == NJS_OK) {
+            return NJS_OK;
         }
 
         ret = njs_external_match_native_function(vm, function->u.native,
                                                  &be->name);
-        if (ret == NXT_OK) {
-            return NXT_OK;
+        if (ret == NJS_OK) {
+            return NJS_OK;
         }
 
         be->name = njs_entry_native;
 
-        return NXT_OK;
+        return NJS_OK;
     }
 
     lambda = function->u.lambda;
@@ -1185,25 +1185,25 @@ njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame)
             be->file = debug_entry[i].file;
             be->line = debug_entry[i].line;
 
-            return NXT_OK;
+            return NJS_OK;
         }
     }
 
     be->name = njs_entry_unknown;
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
 void *
 njs_lvlhsh_alloc(void *data, size_t size)
 {
-    return nxt_mp_align(data, size, size);
+    return njs_mp_align(data, size, size);
 }
 
 
 void
 njs_lvlhsh_free(void *data, void *p, size_t size)
 {
-    nxt_mp_free(data, p);
+    njs_mp_free(data, p);
 }
similarity index 83%
rename from njs/njs_vm.h
rename to src/njs_vm.h
index 8e11bedb83fc3ee647ec82523adb265c16cfda9b..80fdc7b07f4ba2fe8347715d7c00e32ff9d56d85 100644 (file)
@@ -29,8 +29,8 @@ typedef struct njs_generator_s        njs_generator_t;
 
 
 typedef struct {
-    nxt_str_t                         name;
-    nxt_str_t                         file;
+    njs_str_t                         name;
+    njs_str_t                         file;
     uint32_t                          line;
 } njs_backtrace_entry_t;
 
@@ -219,8 +219,8 @@ enum njs_function_e {
 
 typedef struct {
     uint32_t                  line;
-    nxt_str_t                 file;
-    nxt_str_t                 name;
+    njs_str_t                 file;
+    njs_str_t                 name;
     njs_function_lambda_t     *lambda;
 } njs_function_debug_t;
 
@@ -229,9 +229,9 @@ struct njs_vm_s {
     /* njs_vm_t must be aligned to njs_value_t due to scratch value. */
     njs_value_t              retval;
 
-    nxt_uint_t               count;
+    njs_uint_t               count;
 
-    nxt_array_t              *paths;
+    njs_arr_t                *paths;
 
     u_char                   *start;
 
@@ -242,20 +242,20 @@ struct njs_vm_s {
     njs_native_frame_t       *top_frame;
     njs_frame_t              *active_frame;
 
-    nxt_array_t              *external_objects; /* of njs_external_ptr_t */
+    njs_arr_t                *external_objects; /* of njs_external_ptr_t */
 
-    nxt_lvlhsh_t             externals_hash;
-    nxt_lvlhsh_t             external_prototypes_hash;
+    njs_lvlhsh_t             externals_hash;
+    njs_lvlhsh_t             external_prototypes_hash;
 
-    nxt_lvlhsh_t             variables_hash;
-    nxt_lvlhsh_t             values_hash;
+    njs_lvlhsh_t             variables_hash;
+    njs_lvlhsh_t             values_hash;
 
-    nxt_array_t              *modules;
-    nxt_lvlhsh_t             modules_hash;
+    njs_arr_t                *modules;
+    njs_lvlhsh_t             modules_hash;
 
     uint32_t                 event_id;
-    nxt_lvlhsh_t             events_hash;
-    nxt_queue_t              posted_events;
+    njs_lvlhsh_t             events_hash;
+    njs_queue_t              posted_events;
 
     njs_vm_opt_t             options;
 
@@ -267,7 +267,7 @@ struct njs_vm_s {
     njs_object_prototype_t   prototypes[NJS_PROTOTYPE_MAX];
     njs_function_t           constructors[NJS_CONSTRUCTOR_MAX];
 
-    nxt_mp_t                 *mem_pool;
+    njs_mp_t                 *mem_pool;
 
     njs_value_t              *global_scope;
     size_t                   scope_size;
@@ -276,8 +276,8 @@ struct njs_vm_s {
     njs_vm_shared_t          *shared;
     njs_parser_t             *parser;
 
-    nxt_regex_context_t      *regex_context;
-    nxt_regex_match_data_t   *single_match_data;
+    njs_regex_context_t      *regex_context;
+    njs_regex_match_data_t   *single_match_data;
 
     /*
      * MemoryError is statically allocated immutable Error object
@@ -287,13 +287,13 @@ struct njs_vm_s {
 
     njs_object_t             string_object;
 
-    nxt_array_t              *codes;  /* of njs_vm_code_t */
+    njs_arr_t                *codes;  /* of njs_vm_code_t */
 
-    nxt_trace_t              trace;
-    nxt_random_t             random;
+    njs_trace_t              trace;
+    njs_random_t             random;
 
-    nxt_array_t              *debug;
-    nxt_array_t              *backtrace;
+    njs_arr_t                *debug;
+    njs_arr_t                *backtrace;
 
     /*
      * njs_property_query() uses it to store reference to a temporary
@@ -307,21 +307,21 @@ struct njs_vm_s {
 typedef struct {
     u_char                   *start;
     u_char                   *end;
-    nxt_str_t                file;
-    nxt_str_t                name;
+    njs_str_t                file;
+    njs_str_t                name;
 } njs_vm_code_t;
 
 
 struct njs_vm_shared_s {
-    nxt_lvlhsh_t             keywords_hash;
-    nxt_lvlhsh_t             values_hash;
-    nxt_lvlhsh_t             array_instance_hash;
-    nxt_lvlhsh_t             string_instance_hash;
-    nxt_lvlhsh_t             function_instance_hash;
-    nxt_lvlhsh_t             arrow_instance_hash;
-    nxt_lvlhsh_t             arguments_object_instance_hash;
+    njs_lvlhsh_t             keywords_hash;
+    njs_lvlhsh_t             values_hash;
+    njs_lvlhsh_t             array_instance_hash;
+    njs_lvlhsh_t             string_instance_hash;
+    njs_lvlhsh_t             function_instance_hash;
+    njs_lvlhsh_t             arrow_instance_hash;
+    njs_lvlhsh_t             arguments_object_instance_hash;
 
-    nxt_lvlhsh_t             env_hash;
+    njs_lvlhsh_t             env_hash;
 
     njs_object_t             string_object;
     njs_object_t             objects[NJS_OBJECT_MAX];
@@ -342,25 +342,25 @@ void njs_vm_scopes_restore(njs_vm_t *vm, njs_frame_t *frame,
     njs_native_frame_t *previous);
 njs_ret_t njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_frame_t *frame);
 
-nxt_int_t njs_builtin_objects_create(njs_vm_t *vm);
-nxt_int_t njs_builtin_objects_clone(njs_vm_t *vm);
-nxt_int_t njs_builtin_match_native_function(njs_vm_t *vm,
-    njs_function_t *function, nxt_str_t *name);
+njs_int_t njs_builtin_objects_create(njs_vm_t *vm);
+njs_int_t njs_builtin_objects_clone(njs_vm_t *vm);
+njs_int_t njs_builtin_match_native_function(njs_vm_t *vm,
+    njs_function_t *function, njs_str_t *name);
 
-nxt_array_t *njs_vm_backtrace(njs_vm_t *vm);
+njs_arr_t *njs_vm_backtrace(njs_vm_t *vm);
 
 void *njs_lvlhsh_alloc(void *data, size_t size);
 void njs_lvlhsh_free(void *data, void *p, size_t size);
 
 
-extern const nxt_str_t    njs_entry_main;
-extern const nxt_str_t    njs_entry_module;
-extern const nxt_str_t    njs_entry_native;
-extern const nxt_str_t    njs_entry_unknown;
-extern const nxt_str_t    njs_entry_anonymous;
+extern const njs_str_t    njs_entry_main;
+extern const njs_str_t    njs_entry_module;
+extern const njs_str_t    njs_entry_native;
+extern const njs_str_t    njs_entry_unknown;
+extern const njs_str_t    njs_entry_anonymous;
 
-extern const nxt_mem_proto_t     njs_array_mem_proto;
-extern const nxt_lvlhsh_proto_t  njs_object_hash_proto;
+extern const njs_mem_proto_t     njs_array_mem_proto;
+extern const njs_lvlhsh_proto_t  njs_object_hash_proto;
 
 
 #endif /* _NJS_VM_H_INCLUDED_ */
similarity index 89%
rename from njs/njs_vmcode.c
rename to src/njs_vmcode.c
index 4093c2665c582fa914dae5ef9f58c0431cc24331..2985822aa4daa43d44999dbbcb23c2d2ebb45a9a 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <njs_core.h>
+#include <njs_main.h>
 #include <njs_regexp.h>
 #include <string.h>
 
@@ -69,7 +69,7 @@ static njs_ret_t njs_values_equal(njs_vm_t *vm, njs_value_t *val1,
 static njs_ret_t njs_primitive_values_compare(njs_vm_t *vm, njs_value_t *val1,
     njs_value_t *val2);
 static njs_ret_t njs_function_frame_create(njs_vm_t *vm, njs_value_t *value,
-    const njs_value_t *this, uintptr_t nargs, nxt_bool_t ctor);
+    const njs_value_t *this, uintptr_t nargs, njs_bool_t ctor);
 static njs_object_t *njs_function_new_object(njs_vm_t *vm, njs_value_t *value);
 
 /*
@@ -78,7 +78,7 @@ static njs_object_t *njs_function_new_object(njs_vm_t *vm, njs_value_t *value);
  * values is passed as arguments although they are not always used.
  */
 
-nxt_int_t
+njs_int_t
 njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc)
 {
     u_char                       *catch;
@@ -86,8 +86,8 @@ njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc)
     int32_t                      i32;
     uint32_t                     u32;
     njs_ret_t                    ret;
-    nxt_uint_t                   hint;
-    nxt_bool_t                   valid, lambda_call;
+    njs_uint_t                   hint;
+    njs_bool_t                   valid, lambda_call;
     njs_value_t                  *retval, *value1, *value2, *src, *s1, *s2;
     njs_value_t                  numeric1, numeric2, primitive1, primitive2,
                                  dst;
@@ -105,9 +105,9 @@ njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc)
     njs_vmcode_try_return_t      *try_return;
     njs_vmcode_function_frame_t  *function_frame;
 
-    if (nxt_slow_path(vm->count > 128)) {
+    if (njs_slow_path(vm->count > 128)) {
         njs_range_error(vm, "Maximum call stack size exceeded");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     vm->count++;
@@ -173,7 +173,7 @@ next:
                 retval = njs_vmcode_operand(vm, get->value);
 
                 ret = njs_value_property(vm, value1, value2, retval);
-                if (nxt_slow_path(ret == NXT_ERROR)) {
+                if (njs_slow_path(ret == NJS_ERROR)) {
                     goto error;
                 }
 
@@ -186,9 +186,9 @@ next:
             case NJS_VMCODE_POST_INCREMENT:
             case NJS_VMCODE_DECREMENT:
             case NJS_VMCODE_POST_DECREMENT:
-                if (nxt_slow_path(!njs_is_numeric(value2))) {
+                if (njs_slow_path(!njs_is_numeric(value2))) {
                     ret = njs_value_to_numeric(vm, &numeric1, value2);
-                    if (nxt_slow_path(ret != NXT_OK)) {
+                    if (njs_slow_path(ret != NJS_OK)) {
                         goto error;
                     }
 
@@ -230,20 +230,20 @@ next:
             case NJS_VMCODE_LESS_OR_EQUAL:
             case NJS_VMCODE_GREATER_OR_EQUAL:
             case NJS_VMCODE_ADDITION:
-                if (nxt_slow_path(!njs_is_primitive(value1))) {
+                if (njs_slow_path(!njs_is_primitive(value1))) {
                     hint = (op == NJS_VMCODE_ADDITION) && njs_is_date(value1);
                     ret = njs_value_to_primitive(vm, &primitive1, value1, hint);
-                    if (ret != NXT_OK) {
+                    if (ret != NJS_OK) {
                         goto error;
                     }
 
                     value1 = &primitive1;
                 }
 
-                if (nxt_slow_path(!njs_is_primitive(value2))) {
+                if (njs_slow_path(!njs_is_primitive(value2))) {
                     hint = (op == NJS_VMCODE_ADDITION) && njs_is_date(value2);
                     ret = njs_value_to_primitive(vm, &primitive2, value2, hint);
-                    if (ret != NXT_OK) {
+                    if (ret != NJS_OK) {
                         goto error;
                     }
 
@@ -253,7 +253,7 @@ next:
                 retval = njs_vmcode_operand(vm, vmcode->operand1);
 
                 if (op == NJS_VMCODE_ADDITION) {
-                    if (nxt_fast_path(njs_is_numeric(value1)
+                    if (njs_fast_path(njs_is_numeric(value1)
                                       && njs_is_numeric(value2)))
                     {
                         njs_set_number(retval, njs_number(value1)
@@ -274,12 +274,12 @@ next:
                     }
 
                     ret = njs_primitive_value_to_string(vm, &dst, src);
-                    if (nxt_slow_path(ret != NXT_OK)) {
+                    if (njs_slow_path(ret != NJS_OK)) {
                         goto error;
                     }
 
                     ret = njs_string_concat(vm, s1, s2);
-                    if (nxt_slow_path(ret == NXT_ERROR)) {
+                    if (njs_slow_path(ret == NJS_ERROR)) {
                         goto error;
                     }
 
@@ -313,7 +313,7 @@ next:
             case NJS_VMCODE_EQUAL:
             case NJS_VMCODE_NOT_EQUAL:
                 ret = njs_values_equal(vm, value1, value2);
-                if (nxt_slow_path(ret < 0)) {
+                if (njs_slow_path(ret < 0)) {
                     goto error;
                 }
 
@@ -336,18 +336,18 @@ next:
             case NJS_VMCODE_LEFT_SHIFT:
             case NJS_VMCODE_RIGHT_SHIFT:
             case NJS_VMCODE_UNSIGNED_RIGHT_SHIFT:
-                if (nxt_slow_path(!njs_is_numeric(value1))) {
+                if (njs_slow_path(!njs_is_numeric(value1))) {
                     ret = njs_value_to_numeric(vm, &numeric1, value1);
-                    if (ret != NXT_OK) {
+                    if (ret != NJS_OK) {
                         goto error;
                     }
 
                     value1 = &numeric1;
                 }
 
-                if (nxt_slow_path(!njs_is_numeric(value2))) {
+                if (njs_slow_path(!njs_is_numeric(value2))) {
                     ret = njs_value_to_numeric(vm, &numeric2, value2);
-                    if (ret != NXT_OK) {
+                    if (ret != NJS_OK) {
                         goto error;
                     }
 
@@ -376,7 +376,7 @@ next:
                      *  1. If exponent is NaN, the result should be NaN;
                      *  2. The result of +/-1 ** +/-Infinity should be NaN.
                      */
-                    valid = nxt_expect(1, fabs(num) != 1
+                    valid = njs_expect(1, fabs(num) != 1
                                           || (!isnan(exponent)
                                               && !isinf(exponent)));
 
@@ -497,9 +497,9 @@ next:
             case NJS_VMCODE_UNARY_PLUS:
             case NJS_VMCODE_UNARY_NEGATION:
             case NJS_VMCODE_BITWISE_NOT:
-                if (nxt_slow_path(!njs_is_numeric(value1))) {
+                if (njs_slow_path(!njs_is_numeric(value1))) {
                     ret = njs_value_to_numeric(vm, &numeric1, value1);
-                    if (ret != NXT_OK) {
+                    if (ret != NJS_OK) {
                         goto error;
                     }
 
@@ -574,7 +574,7 @@ next:
                 goto error;
             }
 
-            if (nxt_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
+            if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
                 break;
             }
 
@@ -600,7 +600,7 @@ next:
                 retval = njs_vmcode_operand(vm, set->value);
 
                 ret = njs_value_property_set(vm, value1, value2, retval);
-                if (nxt_slow_path(ret == NXT_ERROR)) {
+                if (njs_slow_path(ret == NJS_ERROR)) {
                     goto error;
                 }
 
@@ -633,7 +633,7 @@ next:
                 set = (njs_vmcode_prop_set_t *) pc;
                 retval = njs_vmcode_operand(vm, set->value);
                 ret = njs_vmcode_property_init(vm, value1, value2, retval);
-                if (nxt_slow_path(ret == NXT_ERROR)) {
+                if (njs_slow_path(ret == NJS_ERROR)) {
                     goto error;
                 }
 
@@ -684,7 +684,7 @@ next:
                                                 (uintptr_t) value2,
                                                 function_frame->ctor);
 
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     goto error;
                 }
 
@@ -693,7 +693,7 @@ next:
 
             case NJS_VMCODE_METHOD_FRAME:
                 ret = njs_vmcode_method_frame(vm, value1, value2, pc);
-                if (nxt_slow_path(ret == NXT_ERROR)) {
+                if (njs_slow_path(ret == NJS_ERROR)) {
                     goto error;
                 }
 
@@ -701,7 +701,7 @@ next:
 
             case NJS_VMCODE_FUNCTION_CALL:
                 ret = njs_function_frame_invoke(vm, (njs_index_t) value2);
-                if (nxt_slow_path(ret == NXT_ERROR)) {
+                if (njs_slow_path(ret == NJS_ERROR)) {
                     goto error;
                 }
 
@@ -724,7 +724,7 @@ next:
                 }
 
                 ret = njs_vmcode_property_next(vm, value1, value2, pc);
-                if (nxt_slow_path(ret == NXT_ERROR)) {
+                if (njs_slow_path(ret == NJS_ERROR)) {
                     goto error;
                 }
 
@@ -742,7 +742,7 @@ next:
 
             case NJS_VMCODE_ARGUMENTS:
                 ret = njs_vmcode_arguments(vm, pc);
-                if (nxt_slow_path(ret == NXT_ERROR)) {
+                if (njs_slow_path(ret == NJS_ERROR)) {
                     goto error;
                 }
 
@@ -750,7 +750,7 @@ next:
 
             case NJS_VMCODE_TRY_START:
                 ret = njs_vmcode_try_start(vm, value1, value2, pc);
-                if (nxt_slow_path(ret == NXT_ERROR)) {
+                if (njs_slow_path(ret == NJS_ERROR)) {
                     goto error;
                 }
 
@@ -821,7 +821,7 @@ next:
 
 error:
 
-    ret = NXT_ERROR;
+    ret = NJS_ERROR;
 
     for ( ;; ) {
         frame = (njs_frame_t *) vm->top_frame;
@@ -832,14 +832,14 @@ error:
             pc = catch;
 
             if (vm->debug != NULL) {
-                nxt_array_reset(vm->backtrace);
+                njs_arr_reset(vm->backtrace);
             }
 
             goto next;
         }
 
         if (vm->debug != NULL
-            && njs_vm_add_backtrace_entry(vm, frame) != NXT_OK)
+            && njs_vm_add_backtrace_entry(vm, frame) != NJS_OK)
         {
             break;
         }
@@ -855,7 +855,7 @@ error:
 
         if (frame->native.size != 0) {
             vm->stack_size -= frame->native.size;
-            nxt_mp_free(vm->mem_pool, frame);
+            njs_mp_free(vm->mem_pool, frame);
         }
 
         if (lambda_call) {
@@ -878,13 +878,13 @@ njs_vmcode_object(njs_vm_t *vm)
 
     object = njs_object_alloc(vm);
 
-    if (nxt_fast_path(object != NULL)) {
+    if (njs_fast_path(object != NULL)) {
         njs_set_object(&vm->retval, object);
 
         return sizeof(njs_vmcode_object_t);
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -900,7 +900,7 @@ njs_vmcode_array(njs_vm_t *vm, u_char *pc)
 
     array = njs_array_alloc(vm, code->length, NJS_ARRAY_SPARE);
 
-    if (nxt_fast_path(array != NULL)) {
+    if (njs_fast_path(array != NULL)) {
 
         if (code->ctor) {
             /* Array of the form [,,,], [1,,]. */
@@ -923,7 +923,7 @@ njs_vmcode_array(njs_vm_t *vm, u_char *pc)
         return sizeof(njs_vmcode_array_t);
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -938,8 +938,8 @@ njs_vmcode_function(njs_vm_t *vm, u_char *pc)
     lambda = code->lambda;
 
     function = njs_function_alloc(vm, lambda, vm->active_frame->closures, 0);
-    if (nxt_slow_path(function == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(function == NULL)) {
+        return NJS_ERROR;
     }
 
     njs_set_function(&vm->retval, function);
@@ -951,7 +951,7 @@ njs_vmcode_function(njs_vm_t *vm, u_char *pc)
 static njs_ret_t
 njs_vmcode_arguments(njs_vm_t *vm, u_char *pc)
 {
-    nxt_int_t               ret;
+    njs_int_t               ret;
     njs_frame_t             *frame;
     njs_value_t             *value;
     njs_vmcode_arguments_t  *code;
@@ -960,8 +960,8 @@ njs_vmcode_arguments(njs_vm_t *vm, u_char *pc)
 
     if (frame->native.arguments_object == NULL) {
         ret = njs_function_arguments_object_init(vm, &frame->native);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
     }
 
@@ -984,13 +984,13 @@ njs_vmcode_regexp(njs_vm_t *vm, u_char *pc)
 
     regexp = njs_regexp_alloc(vm, code->pattern);
 
-    if (nxt_fast_path(regexp != NULL)) {
+    if (njs_fast_path(regexp != NULL)) {
         njs_set_regexp(&vm->retval, regexp);
 
         return sizeof(njs_vmcode_regexp_t);
     }
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
@@ -998,7 +998,7 @@ static njs_ret_t
 njs_vmcode_template_literal(njs_vm_t *vm, njs_value_t *invld1,
     njs_value_t *retval)
 {
-    nxt_int_t    ret;
+    njs_int_t    ret;
     njs_array_t  *array;
     njs_value_t  *value;
 
@@ -1016,12 +1016,12 @@ njs_vmcode_template_literal(njs_vm_t *vm, njs_value_t *invld1,
         ret = njs_function_frame(vm, (njs_function_t *) &concat,
                                  (njs_value_t *) &njs_string_empty,
                                  array->start, array->length, 0);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
 
         ret = njs_function_frame_invoke(vm, (njs_index_t) retval);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
     }
@@ -1040,16 +1040,16 @@ njs_vmcode_object_copy(njs_vm_t *vm, njs_value_t *value, njs_value_t *invld)
 
     case NJS_OBJECT:
         object = njs_object_value_copy(vm, value);
-        if (nxt_slow_path(object == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(object == NULL)) {
+            return NJS_ERROR;
         }
 
         break;
 
     case NJS_FUNCTION:
         function = njs_function_value_copy(vm, value);
-        if (nxt_slow_path(function == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(function == NULL)) {
+            return NJS_ERROR;
         }
 
         break;
@@ -1076,15 +1076,15 @@ njs_vmcode_property_init(njs_vm_t *vm, njs_value_t *object,
     njs_value_t         *value, name;
     njs_object_t        *obj;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     switch (object->type) {
     case NJS_ARRAY:
         index = njs_value_to_index(property);
-        if (nxt_slow_path(index == NJS_ARRAY_INVALID_INDEX)) {
+        if (njs_slow_path(index == NJS_ARRAY_INVALID_INDEX)) {
             njs_internal_error(vm,
                                "invalid index while property initialization");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         array = object->data.u.array;
@@ -1093,7 +1093,7 @@ njs_vmcode_property_init(njs_vm_t *vm, njs_value_t *object,
             size = index - array->length;
 
             ret = njs_array_expand(vm, array, 0, size + 1);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -1115,25 +1115,25 @@ njs_vmcode_property_init(njs_vm_t *vm, njs_value_t *object,
 
     case NJS_OBJECT:
         ret = njs_value_to_string(vm, &name, property);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         njs_string_get(&name, &lhq.key);
-        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
         lhq.proto = &njs_object_hash_proto;
         lhq.pool = vm->mem_pool;
 
         obj = njs_object(object);
 
-        ret = nxt_lvlhsh_find(&obj->__proto__->shared_hash, &lhq);
-        if (ret == NXT_OK) {
+        ret = njs_lvlhsh_find(&obj->__proto__->shared_hash, &lhq);
+        if (ret == NJS_OK) {
             prop = lhq.value;
 
             if (prop->type == NJS_PROPERTY_HANDLER) {
                 ret = prop->value.data.u.prop_handler(vm, object, init,
                                                       &vm->retval);
-                if (nxt_slow_path(ret != NXT_OK)) {
+                if (njs_slow_path(ret != NJS_OK)) {
                     return ret;
                 }
 
@@ -1142,17 +1142,17 @@ njs_vmcode_property_init(njs_vm_t *vm, njs_value_t *object,
         }
 
         prop = njs_object_prop_alloc(vm, &name, init, 1);
-        if (nxt_slow_path(prop == NULL)) {
-            return NXT_ERROR;
+        if (njs_slow_path(prop == NULL)) {
+            return NJS_ERROR;
         }
 
         lhq.value = prop;
         lhq.replace = 1;
 
-        ret = nxt_lvlhsh_insert(&obj->hash, &lhq);
-        if (nxt_slow_path(ret != NXT_OK)) {
+        ret = njs_lvlhsh_insert(&obj->hash, &lhq);
+        if (njs_slow_path(ret != NJS_OK)) {
             njs_internal_error(vm, "lvlhsh insert/replace failed");
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         break;
@@ -1162,7 +1162,7 @@ njs_vmcode_property_init(njs_vm_t *vm, njs_value_t *object,
                            "while property initialization",
                            njs_type_string(object->type));
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     return sizeof(njs_vmcode_prop_set_t);
@@ -1185,7 +1185,7 @@ njs_vmcode_property_in(njs_vm_t *vm, njs_value_t *object, njs_value_t *property)
 
     switch (ret) {
 
-    case NXT_OK:
+    case NJS_OK:
         prop = pq.lhq.value;
 
         if (!njs_is_valid(&prop->value)) {
@@ -1195,16 +1195,16 @@ njs_vmcode_property_in(njs_vm_t *vm, njs_value_t *object, njs_value_t *property)
         retval = &njs_value_true;
         break;
 
-    case NXT_DECLINED:
+    case NJS_DECLINED:
         if (!njs_is_object(object) && !njs_is_external(object)) {
             njs_type_error(vm, "property in on a primitive value");
 
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         break;
 
-    case NXT_ERROR:
+    case NJS_ERROR:
     default:
 
         return ret;
@@ -1230,21 +1230,21 @@ njs_vmcode_property_delete(njs_vm_t *vm, njs_value_t *object,
 
     switch (ret) {
 
-    case NXT_OK:
+    case NJS_OK:
         prop = pq.lhq.value;
 
-        if (nxt_slow_path(!prop->configurable)) {
+        if (njs_slow_path(!prop->configurable)) {
             njs_type_error(vm, "Cannot delete property \"%V\" of %s",
                            &pq.lhq.key, njs_type_string(object->type));
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
-        if (nxt_slow_path(pq.shared)) {
-            whipeout = nxt_mp_align(vm->mem_pool, sizeof(njs_value_t),
+        if (njs_slow_path(pq.shared)) {
+            whipeout = njs_mp_align(vm->mem_pool, sizeof(njs_value_t),
                                     sizeof(njs_object_prop_t));
-            if (nxt_slow_path(whipeout == NULL)) {
+            if (njs_slow_path(whipeout == NULL)) {
                 njs_memory_error(vm);
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
             njs_set_invalid(&whipeout->value);
@@ -1255,10 +1255,10 @@ njs_vmcode_property_delete(njs_vm_t *vm, njs_value_t *object,
             pq.lhq.value = whipeout;
             pq.lhq.pool = vm->mem_pool;
 
-            ret = nxt_lvlhsh_insert(&pq.prototype->hash, &pq.lhq);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            ret = njs_lvlhsh_insert(&pq.prototype->hash, &pq.lhq);
+            if (njs_slow_path(ret != NJS_OK)) {
                 njs_internal_error(vm, "lvlhsh insert failed");
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
             break;
@@ -1275,7 +1275,7 @@ njs_vmcode_property_delete(njs_vm_t *vm, njs_value_t *object,
 
         case NJS_PROPERTY_HANDLER:
             ret = prop->value.data.u.prop_handler(vm, object, NULL, NULL);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -1286,7 +1286,7 @@ njs_vmcode_property_delete(njs_vm_t *vm, njs_value_t *object,
                                "while deleting",
                                njs_prop_type_string(prop->type));
 
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         /* GC: release value. */
@@ -1295,10 +1295,10 @@ njs_vmcode_property_delete(njs_vm_t *vm, njs_value_t *object,
 
         break;
 
-    case NXT_DECLINED:
+    case NJS_DECLINED:
         break;
 
-    case NXT_ERROR:
+    case NJS_ERROR:
     default:
 
         return ret;
@@ -1329,7 +1329,7 @@ njs_vmcode_property_foreach(njs_vm_t *vm, njs_value_t *object,
             obj = njs_extern_object(vm, object);
 
             ret = ext_proto->foreach(vm, obj, &vm->retval);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
         }
@@ -1337,17 +1337,17 @@ njs_vmcode_property_foreach(njs_vm_t *vm, njs_value_t *object,
         goto done;
     }
 
-    next = nxt_mp_alloc(vm->mem_pool, sizeof(njs_property_next_t));
-    if (nxt_slow_path(next == NULL)) {
+    next = njs_mp_alloc(vm->mem_pool, sizeof(njs_property_next_t));
+    if (njs_slow_path(next == NULL)) {
         njs_memory_error(vm);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     next->index = 0;
     next->array = njs_value_enumerate(vm, object, NJS_ENUM_KEYS, 0);
-    if (nxt_slow_path(next->array == NULL)) {
+    if (njs_slow_path(next->array == NULL)) {
         njs_memory_error(vm);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     vm->retval.data.u.next = next;
@@ -1382,11 +1382,11 @@ njs_vmcode_property_next(njs_vm_t *vm, njs_value_t *object, njs_value_t *value,
 
             ret = ext_proto->next(vm, retval, obj, value);
 
-            if (ret == NXT_OK) {
+            if (ret == NJS_OK) {
                 return code->offset;
             }
 
-            if (nxt_slow_path(ret == NXT_ERROR)) {
+            if (njs_slow_path(ret == NJS_ERROR)) {
                 return ret;
             }
 
@@ -1404,7 +1404,7 @@ njs_vmcode_property_next(njs_vm_t *vm, njs_value_t *object, njs_value_t *value,
         return code->offset;
     }
 
-    nxt_mp_free(vm->mem_pool, next);
+    njs_mp_free(vm->mem_pool, next);
 
     return sizeof(njs_vmcode_prop_next_t);
 }
@@ -1414,7 +1414,7 @@ static njs_ret_t
 njs_vmcode_instance_of(njs_vm_t *vm, njs_value_t *object,
     njs_value_t *constructor)
 {
-    nxt_int_t          ret;
+    njs_int_t          ret;
     njs_value_t        value;
     njs_object_t       *prototype, *proto;
     const njs_value_t  *retval;
@@ -1423,7 +1423,7 @@ njs_vmcode_instance_of(njs_vm_t *vm, njs_value_t *object,
 
     if (!njs_is_function(constructor)) {
         njs_type_error(vm, "right argument is not a function");
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     retval = &njs_value_false;
@@ -1432,15 +1432,15 @@ njs_vmcode_instance_of(njs_vm_t *vm, njs_value_t *object,
         value = njs_value_undefined;
         ret = njs_value_property(vm, constructor, &prototype_string, &value);
 
-        if (nxt_slow_path(ret == NXT_ERROR)) {
+        if (njs_slow_path(ret == NJS_ERROR)) {
             return ret;
         }
 
-        if (nxt_fast_path(ret == NXT_OK)) {
+        if (njs_fast_path(ret == NJS_OK)) {
 
-            if (nxt_slow_path(!njs_is_object(&value))) {
+            if (njs_slow_path(!njs_is_object(&value))) {
                 njs_internal_error(vm, "prototype is not an object");
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
             prototype = njs_object(&value);
@@ -1539,8 +1539,8 @@ njs_string_concat(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 
     start = njs_string_alloc(vm, &vm->retval, size, length);
 
-    if (nxt_slow_path(start == NULL)) {
-        return NXT_ERROR;
+    if (njs_slow_path(start == NULL)) {
+        return NJS_ERROR;
     }
 
     (void) memcpy(start, string1.start, string1.size);
@@ -1554,7 +1554,7 @@ static njs_ret_t
 njs_values_equal(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 {
     njs_ret_t    ret;
-    nxt_bool_t   nv1, nv2;
+    njs_bool_t   nv1, nv2;
     njs_value_t  primitive;
     njs_value_t  *hv, *lv;
 
@@ -1606,7 +1606,7 @@ again:
     /* "hv" is an object and "lv" is either a string or a numeric. */
 
     ret = njs_value_to_primitive(vm, &primitive, hv, 0);
-    if (ret != NXT_OK) {
+    if (ret != NJS_OK) {
         return ret;
     }
 
@@ -1630,10 +1630,10 @@ njs_primitive_values_compare(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 {
     double   num1, num2;
 
-    if (nxt_fast_path(njs_is_numeric(val1))) {
+    if (njs_fast_path(njs_is_numeric(val1))) {
         num1 = njs_number(val1);
 
-        if (nxt_fast_path(njs_is_numeric(val2))) {
+        if (njs_fast_path(njs_is_numeric(val2))) {
             num2 = njs_number(val2);
 
         } else {
@@ -1660,13 +1660,13 @@ njs_primitive_values_compare(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 
 static njs_ret_t
 njs_function_frame_create(njs_vm_t *vm, njs_value_t *value,
-    const njs_value_t *this, uintptr_t nargs, nxt_bool_t ctor)
+    const njs_value_t *this, uintptr_t nargs, njs_bool_t ctor)
 {
     njs_value_t     val;
     njs_object_t    *object;
     njs_function_t  *function;
 
-    if (nxt_fast_path(njs_is_function(value))) {
+    if (njs_fast_path(njs_is_function(value))) {
 
         function = njs_function(value);
 
@@ -1674,13 +1674,13 @@ njs_function_frame_create(njs_vm_t *vm, njs_value_t *value,
             if (!function->ctor) {
                 njs_type_error(vm, "%s is not a constructor",
                                njs_type_string(value->type));
-                return NXT_ERROR;
+                return NJS_ERROR;
             }
 
             if (!function->native) {
                 object = njs_function_new_object(vm, value);
-                if (nxt_slow_path(object == NULL)) {
-                    return NXT_ERROR;
+                if (njs_slow_path(object == NULL)) {
+                    return NJS_ERROR;
                 }
 
                 njs_set_object(&val, object);
@@ -1693,32 +1693,32 @@ njs_function_frame_create(njs_vm_t *vm, njs_value_t *value,
 
     njs_type_error(vm, "%s is not a function", njs_type_string(value->type));
 
-    return NXT_ERROR;
+    return NJS_ERROR;
 }
 
 
 static njs_object_t *
 njs_function_new_object(njs_vm_t *vm, njs_value_t *value)
 {
-    nxt_int_t           ret;
+    njs_int_t           ret;
     njs_value_t         *proto;
     njs_object_t        *object;
     njs_function_t      *function;
     njs_object_prop_t   *prop;
-    nxt_lvlhsh_query_t  lhq;
+    njs_lvlhsh_query_t  lhq;
 
     object = njs_object_alloc(vm);
 
-    if (nxt_fast_path(object != NULL)) {
+    if (njs_fast_path(object != NULL)) {
 
         lhq.key_hash = NJS_PROTOTYPE_HASH;
-        lhq.key = nxt_string_value("prototype");
+        lhq.key = njs_str_value("prototype");
         lhq.proto = &njs_object_hash_proto;
         function = njs_function(value);
 
-        ret = nxt_lvlhsh_find(&function->object.hash, &lhq);
+        ret = njs_lvlhsh_find(&function->object.hash, &lhq);
 
-        if (ret == NXT_OK) {
+        if (ret == NJS_OK) {
             prop = lhq.value;
             proto = &prop->value;
 
@@ -1726,7 +1726,7 @@ njs_function_new_object(njs_vm_t *vm, njs_value_t *value)
             proto = njs_function_property_prototype_create(vm, value);
         }
 
-        if (nxt_fast_path(proto != NULL)) {
+        if (njs_fast_path(proto != NULL)) {
             object->__proto__ = njs_object(proto);
             return object;
         }
@@ -1741,7 +1741,7 @@ njs_vmcode_method_frame(njs_vm_t *vm, njs_value_t *object, njs_value_t *name,
     u_char *pc)
 {
     njs_ret_t                  ret;
-    nxt_str_t                  string;
+    njs_str_t                  string;
     njs_value_t                *value;
     njs_object_prop_t          *prop;
     njs_property_query_t       pq;
@@ -1756,7 +1756,7 @@ njs_vmcode_method_frame(njs_vm_t *vm, njs_value_t *object, njs_value_t *name,
 
     switch (ret) {
 
-    case NXT_OK:
+    case NJS_OK:
         prop = pq.lhq.value;
 
         switch (prop->type) {
@@ -1769,7 +1769,7 @@ njs_vmcode_method_frame(njs_vm_t *vm, njs_value_t *object, njs_value_t *name,
             prop = &pq.scratch;
             ret = prop->value.data.u.prop_handler(vm, object, NULL,
                                                   &prop->value);
-            if (nxt_slow_path(ret != NXT_OK)) {
+            if (njs_slow_path(ret != NJS_OK)) {
                 return ret;
             }
 
@@ -1780,17 +1780,17 @@ njs_vmcode_method_frame(njs_vm_t *vm, njs_value_t *object, njs_value_t *name,
                                "while getting method",
                                njs_prop_type_string(prop->type));
 
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         value = &prop->value;
 
         break;
 
-    case NXT_DECLINED:
+    case NJS_DECLINED:
         break;
 
-    case NXT_ERROR:
+    case NJS_ERROR:
     default:
 
         return ret;
@@ -1798,20 +1798,20 @@ njs_vmcode_method_frame(njs_vm_t *vm, njs_value_t *object, njs_value_t *name,
 
     if (value == NULL || !njs_is_function(value)) {
         ret = njs_value_to_string(vm, name, name);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NXT_ERROR;
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
         }
 
         njs_string_get(name, &string);
         njs_type_error(vm, "(intermediate value)[\"%V\"] is not a function",
                        &string);
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     ret = njs_function_frame_create(vm, value, object, method->nargs,
                                     method->ctor);
 
-    if (nxt_fast_path(ret == NXT_OK)) {
+    if (njs_fast_path(ret == NJS_OK)) {
         return sizeof(njs_vmcode_method_frame_t);
     }
 
@@ -1873,10 +1873,10 @@ njs_vmcode_try_start(njs_vm_t *vm, njs_value_t *exception_value,
     njs_vmcode_try_start_t  *try_start;
 
     if (vm->top_frame->exception.catch != NULL) {
-        e = nxt_mp_alloc(vm->mem_pool, sizeof(njs_exception_t));
-        if (nxt_slow_path(e == NULL)) {
+        e = njs_mp_alloc(vm->mem_pool, sizeof(njs_exception_t));
+        if (njs_slow_path(e == NULL)) {
             njs_memory_error(vm);
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
 
         *e = vm->top_frame->exception;
@@ -1947,7 +1947,7 @@ njs_vmcode_try_end(njs_vm_t *vm, njs_value_t *invld, njs_value_t *offset)
 
     } else {
         vm->top_frame->exception = *e;
-        nxt_mp_free(vm->mem_pool, e);
+        njs_mp_free(vm->mem_pool, e);
     }
 
     return (njs_ret_t) offset;
@@ -1974,7 +1974,7 @@ njs_vmcode_finally(njs_vm_t *vm, njs_value_t *invld, njs_value_t *retval,
     if (njs_is_valid(exception_value)) {
         vm->retval = *exception_value;
 
-        return NXT_ERROR;
+        return NJS_ERROR;
     }
 
     finally = (njs_vmcode_finally_t *) pc;
@@ -2004,7 +2004,7 @@ njs_vmcode_finally(njs_vm_t *vm, njs_value_t *invld, njs_value_t *retval,
 static void
 njs_vmcode_reference_error(njs_vm_t *vm, u_char *pc)
 {
-    nxt_str_t                     *file;
+    njs_str_t                     *file;
     njs_vmcode_reference_error_t  *ref_err;
 
     ref_err = (njs_vmcode_reference_error_t *) pc;
similarity index 97%
rename from njs/njs_vmcode.h
rename to src/njs_vmcode.h
index 10124cc5a9b511664deedb540154139126fe631a..ff08a32a77d292fc8b886fbf6aecbd90cdc443e8 100644 (file)
@@ -12,9 +12,9 @@
  * Negative return values handled by nJSVM interpreter as special events.
  * The values must be in range from -1 to -11, because -12 is minimal jump
  * offset on 32-bit platforms.
- *    0  (NJS_OK/NXT_OK)      :  njs_vmcode_stop() has stopped execution,
- *                               execution successfully finished
- *    -1 (NJS_ERROR/NXT_ERROR):  error or exception;
+ *    0  (NJS_OK)   :  njs_vmcode_stop() has stopped execution,
+ *                          execution successfully finished
+ *    -1 (NJS_ERROR):  error or exception;
  *    -2 .. -11:                 not used.
  */
 
@@ -371,13 +371,13 @@ typedef struct {
 
 typedef struct {
     njs_vmcode_t               code;
-    nxt_str_t                  name;
-    nxt_str_t                  file;
+    njs_str_t                  name;
+    njs_str_t                  file;
     uint32_t                   token_line;
 } njs_vmcode_reference_error_t;
 
 
-nxt_int_t njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc);
+njs_int_t njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc);
 
 
 #endif /* _NJS_VMCODE_H_INCLUDED_ */
diff --git a/src/test/lvlhsh_unit_test.c b/src/test/lvlhsh_unit_test.c
new file mode 100644 (file)
index 0000000..2a94d0d
--- /dev/null
@@ -0,0 +1,276 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_sprintf.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_malloc.h>
+#include <njs_lvlhsh.h>
+#include <njs_murmur_hash.h>
+#include <njs_mp.h>
+#include <string.h>
+
+
+static njs_int_t
+lvlhsh_unit_test_key_test(njs_lvlhsh_query_t *lhq, void *data)
+{
+    if (*(uintptr_t *) lhq->key.start == (uintptr_t) data) {
+        return NJS_OK;
+    }
+
+    return NJS_DECLINED;
+}
+
+
+static void *
+lvlhsh_unit_test_pool_alloc(void *pool, size_t size)
+{
+    return njs_mp_align(pool, size, size);
+}
+
+
+static void
+lvlhsh_unit_test_pool_free(void *pool, void *p, size_t size)
+{
+    njs_mp_free(pool, p);
+}
+
+
+static const njs_lvlhsh_proto_t  lvlhsh_proto  njs_aligned(64) = {
+    NJS_LVLHSH_LARGE_SLAB,
+    lvlhsh_unit_test_key_test,
+    lvlhsh_unit_test_pool_alloc,
+    lvlhsh_unit_test_pool_free,
+};
+
+
+static njs_int_t
+lvlhsh_unit_test_add(njs_lvlhsh_t *lh, const njs_lvlhsh_proto_t *proto,
+    void *pool, uintptr_t key)
+{
+    njs_lvlhsh_query_t  lhq;
+
+    lhq.key_hash = key;
+    lhq.replace = 0;
+    lhq.key.length = sizeof(uintptr_t);
+    lhq.key.start = (u_char *) &key;
+    lhq.value = (void *) key;
+    lhq.proto = proto;
+    lhq.pool = pool;
+
+    switch (njs_lvlhsh_insert(lh, &lhq)) {
+
+    case NJS_OK:
+        return NJS_OK;
+
+    case NJS_DECLINED:
+        njs_printf("lvlhsh unit test failed: key %08Xl is already in hash\n",
+                   (long) key);
+        /* Fall through. */
+
+    default:
+        return NJS_ERROR;
+    }
+}
+
+
+static njs_int_t
+lvlhsh_unit_test_get(njs_lvlhsh_t *lh, const njs_lvlhsh_proto_t *proto,
+    uintptr_t key)
+{
+    njs_lvlhsh_query_t  lhq;
+
+    lhq.key_hash = key;
+    lhq.key.length = sizeof(uintptr_t);
+    lhq.key.start = (u_char *) &key;
+    lhq.proto = proto;
+
+    if (njs_lvlhsh_find(lh, &lhq) == NJS_OK) {
+
+        if (key == (uintptr_t) lhq.value) {
+            return NJS_OK;
+        }
+    }
+
+    njs_printf("lvlhsh unit test failed: key %08Xl not found in hash\n",
+               (long) key);
+
+    return NJS_ERROR;
+}
+
+
+static njs_int_t
+lvlhsh_unit_test_delete(njs_lvlhsh_t *lh, const njs_lvlhsh_proto_t *proto,
+    void *pool, uintptr_t key)
+{
+    njs_int_t           ret;
+    njs_lvlhsh_query_t  lhq;
+
+    lhq.key_hash = key;
+    lhq.key.length = sizeof(uintptr_t);
+    lhq.key.start = (u_char *) &key;
+    lhq.proto = proto;
+    lhq.pool = pool;
+
+    ret = njs_lvlhsh_delete(lh, &lhq);
+
+    if (ret != NJS_OK) {
+        njs_printf("lvlhsh unit test failed: key %08lX not found in hash\n",
+               (long) key);
+    }
+
+    return ret;
+}
+
+
+static void *
+lvlhsh_malloc(void *mem, size_t size)
+{
+    return njs_malloc(size);
+}
+
+
+static void *
+lvlhsh_zalloc(void *mem, size_t size)
+{
+    void  *p;
+
+    p = njs_malloc(size);
+
+    if (p != NULL) {
+        njs_memzero(p, size);
+    }
+
+    return p;
+}
+
+
+static void *
+lvlhsh_align(void *mem, size_t alignment, size_t size)
+{
+    return njs_memalign(alignment, size);
+}
+
+
+static void
+lvlhsh_free(void *mem, void *p)
+{
+    njs_free(p);
+}
+
+
+static void
+lvlhsh_alert(void *mem, const char *fmt, ...)
+{
+    u_char   buf[1024], *p;
+    va_list  args;
+
+    va_start(args, fmt);
+    p = njs_sprintf(buf, buf + sizeof(buf), fmt, args);
+    va_end(args);
+
+    (void) njs_stderror("alert: \"%*s\"\n", p - buf, buf);
+}
+
+
+static const njs_mem_proto_t  lvl_mp_proto = {
+    lvlhsh_malloc,
+    lvlhsh_zalloc,
+    lvlhsh_align,
+    NULL,
+    lvlhsh_free,
+    lvlhsh_alert,
+    NULL,
+};
+
+
+static njs_int_t
+lvlhsh_unit_test(njs_uint_t n)
+{
+    njs_mp_t           *pool;
+    uint32_t           key;
+    njs_uint_t         i;
+    njs_lvlhsh_t       lh;
+    njs_lvlhsh_each_t  lhe;
+
+    const size_t       min_chunk_size = 32;
+    const size_t       page_size = 1024;
+    const size_t       page_alignment = 128;
+    const size_t       cluster_size = 4096;
+
+    pool = njs_mp_create(&lvl_mp_proto, NULL, NULL, cluster_size,
+                         page_alignment, page_size, min_chunk_size);
+    if (pool == NULL) {
+        return NJS_ERROR;
+    }
+
+    njs_printf("lvlhsh unit test started: %l items\n", (long) n);
+
+    njs_memzero(&lh, sizeof(njs_lvlhsh_t));
+
+    key = 0;
+    for (i = 0; i < n; i++) {
+        key = njs_murmur_hash2(&key, sizeof(uint32_t));
+
+        if (lvlhsh_unit_test_add(&lh, &lvlhsh_proto, pool, key) != NJS_OK) {
+            njs_printf("lvlhsh add unit test failed at %l\n", (long) i);
+            return NJS_ERROR;
+        }
+    }
+
+    key = 0;
+    for (i = 0; i < n; i++) {
+        key = njs_murmur_hash2(&key, sizeof(uint32_t));
+
+        if (lvlhsh_unit_test_get(&lh, &lvlhsh_proto, key) != NJS_OK) {
+            return NJS_ERROR;
+        }
+    }
+
+    njs_lvlhsh_each_init(&lhe, &lvlhsh_proto);
+
+    for (i = 0; i < n + 1; i++) {
+        if (njs_lvlhsh_each(&lh, &lhe) == NULL) {
+            break;
+        }
+    }
+
+    if (i != n) {
+        njs_printf("lvlhsh each unit test failed at %l of %l\n",
+                   (long) i, (long) n);
+        return NJS_ERROR;
+    }
+
+    key = 0;
+    for (i = 0; i < n; i++) {
+        key = njs_murmur_hash2(&key, sizeof(uint32_t));
+
+        if (lvlhsh_unit_test_delete(&lh, &lvlhsh_proto, pool, key) != NJS_OK) {
+            return NJS_ERROR;
+        }
+    }
+
+    if (!njs_mp_is_empty(pool)) {
+        njs_printf("mem cache pool is not empty\n");
+        return NJS_ERROR;
+    }
+
+    njs_mp_destroy(pool);
+
+    njs_printf("lvlhsh unit test passed\n");
+
+    return NJS_OK;
+}
+
+
+int
+main(void)
+{
+     return lvlhsh_unit_test(1000 * 1000);
+}
similarity index 70%
rename from njs/test/njs_benchmark.c
rename to src/test/njs_benchmark.c
index 649a08f48a176055e5e09e28572f7185b4b44096..4dccfa27868d20b0de92ad455334816965df2acc 100644 (file)
@@ -7,42 +7,42 @@
 #include <njs.h>
 #include <string.h>
 #include <stdlib.h>
-#include <nxt_sprintf.h>
+#include <njs_sprintf.h>
 #include <sys/resource.h>
 #include <time.h>
 
 
-static nxt_int_t
-njs_unit_test_benchmark(nxt_str_t *script, nxt_str_t *result, const char *msg,
-    nxt_uint_t n)
+static njs_int_t
+njs_unit_test_benchmark(njs_str_t *script, njs_str_t *result, const char *msg,
+    njs_uint_t n)
 {
     u_char         *start;
     njs_vm_t       *vm, *nvm;
     uint64_t       us;
-    nxt_int_t      ret, rc;
-    nxt_str_t      s;
-    nxt_uint_t     i;
-    nxt_bool_t     success;
+    njs_int_t      ret, rc;
+    njs_str_t      s;
+    njs_uint_t     i;
+    njs_bool_t     success;
     njs_vm_opt_t   options;
     struct rusage  usage;
 
-    nxt_memzero(&options, sizeof(njs_vm_opt_t));
+    njs_memzero(&options, sizeof(njs_vm_opt_t));
 
     vm = NULL;
     nvm = NULL;
-    rc = NXT_ERROR;
+    rc = NJS_ERROR;
 
     vm = njs_vm_create(&options);
     if (vm == NULL) {
-        nxt_printf("njs_vm_create() failed\n");
+        njs_printf("njs_vm_create() failed\n");
         goto done;
     }
 
     start = script->start;
 
     ret = njs_vm_compile(vm, &start, start + script->length);
-    if (ret != NXT_OK) {
-        nxt_printf("njs_vm_compile() failed\n");
+    if (ret != NJS_OK) {
+        njs_printf("njs_vm_compile() failed\n");
         goto done;
     }
 
@@ -50,21 +50,21 @@ njs_unit_test_benchmark(nxt_str_t *script, nxt_str_t *result, const char *msg,
 
         nvm = njs_vm_clone(vm, NULL);
         if (nvm == NULL) {
-            nxt_printf("njs_vm_clone() failed\n");
+            njs_printf("njs_vm_clone() failed\n");
             goto done;
         }
 
         (void) njs_vm_start(nvm);
 
-        if (njs_vm_retval_string(nvm, &s) != NXT_OK) {
-            nxt_printf("njs_vm_retval_string() failed\n");
+        if (njs_vm_retval_string(nvm, &s) != NJS_OK) {
+            njs_printf("njs_vm_retval_string() failed\n");
             goto done;
         }
 
-        success = nxt_strstr_eq(result, &s);
+        success = njs_strstr_eq(result, &s);
 
         if (!success) {
-            nxt_printf("failed: \"%V\" vs \"%V\"\n", result, &s);
+            njs_printf("failed: \"%V\" vs \"%V\"\n", result, &s);
             goto done;
         }
 
@@ -78,14 +78,14 @@ njs_unit_test_benchmark(nxt_str_t *script, nxt_str_t *result, const char *msg,
          + usage.ru_stime.tv_sec * 1000000 + usage.ru_stime.tv_usec;
 
     if (n == 1) {
-        nxt_printf("%s: %.3fs\n", msg, (double) us / 1000000);
+        njs_printf("%s: %.3fs\n", msg, (double) us / 1000000);
 
     } else {
-        nxt_printf("%s: %.3fµs, %d times/s\n",
+        njs_printf("%s: %.3fµs, %d times/s\n",
                    msg, (double) us / n, (int) ((uint64_t) n * 1000000 / us));
     }
 
-    rc = NXT_OK;
+    rc = NJS_OK;
 
 done:
 
@@ -101,13 +101,13 @@ done:
 }
 
 
-int nxt_cdecl
+int njs_cdecl
 main(int argc, char **argv)
 {
-    static nxt_str_t  script = nxt_string("null");
-    static nxt_str_t  result = nxt_string("null");
+    static njs_str_t  script = njs_str("null");
+    static njs_str_t  result = njs_str("null");
 
-    static nxt_str_t  fibo_number = nxt_string(
+    static njs_str_t  fibo_number = njs_str(
         "function fibo(n) {"
         "    if (n > 1)"
         "        return fibo(n - 1) + fibo(n - 2);"
@@ -115,7 +115,7 @@ main(int argc, char **argv)
         "}"
         "fibo(32)");
 
-    static nxt_str_t  fibo_ascii = nxt_string(
+    static njs_str_t  fibo_ascii = njs_str(
         "function fibo(n) {"
         "    if (n > 1)"
         "        return fibo(n - 1) + fibo(n - 2);"
@@ -123,7 +123,7 @@ main(int argc, char **argv)
         "}"
         "fibo(32).length");
 
-    static nxt_str_t  fibo_bytes = nxt_string(
+    static njs_str_t  fibo_bytes = njs_str(
         "var a = '\\x80'.toBytes();"
         "function fibo(n) {"
         "    if (n > 1)"
@@ -132,7 +132,7 @@ main(int argc, char **argv)
         "}"
         "fibo(32).length");
 
-    static nxt_str_t  fibo_utf8 = nxt_string(
+    static njs_str_t  fibo_utf8 = njs_str(
         "function fibo(n) {"
         "    if (n > 1)"
         "        return fibo(n - 1) + fibo(n - 2);"
@@ -140,7 +140,7 @@ main(int argc, char **argv)
         "}"
         "fibo(32).length");
 
-    static nxt_str_t  fibo_result = nxt_string("3524578");
+    static njs_str_t  fibo_result = njs_str("3524578");
 
 
     if (argc > 1) {
@@ -168,6 +168,6 @@ main(int argc, char **argv)
         }
     }
 
-    nxt_printf("unknown agrument\n");
+    njs_printf("unknown agrument\n");
     return EXIT_FAILURE;
 }
similarity index 52%
rename from njs/test/njs_interactive_test.c
rename to src/test/njs_interactive_test.c
index 185825e4d91a3e5081674e8796d1b0bacce38719..b4321a0b14ba442740cf3accea488dcb4be65945 100644 (file)
@@ -6,14 +6,14 @@
 
 #include <njs.h>
 #include <string.h>
-#include <nxt_sprintf.h>
+#include <njs_sprintf.h>
 #include <sys/resource.h>
 #include <time.h>
 
 
 typedef struct {
-    nxt_str_t  script;
-    nxt_str_t  ret;
+    njs_str_t  script;
+    njs_str_t  ret;
 } njs_interactive_test_t;
 
 
@@ -22,267 +22,267 @@ typedef struct {
 
 static njs_interactive_test_t  njs_test[] =
 {
-    { nxt_string("var a = 3" ENTER
+    { njs_str("var a = 3" ENTER
                  "a * 2" ENTER),
-      nxt_string("6") },
+      njs_str("6") },
 
-    { nxt_string("var a = \"aa\\naa\"" ENTER
+    { njs_str("var a = \"aa\\naa\"" ENTER
                  "a" ENTER),
-      nxt_string("aa\naa") },
+      njs_str("aa\naa") },
 
-    { nxt_string("var a = 3" ENTER
+    { njs_str("var a = 3" ENTER
                  "var a = 'str'" ENTER
                  "a" ENTER),
-      nxt_string("str") },
+      njs_str("str") },
 
-    { nxt_string("var a = 2" ENTER
+    { njs_str("var a = 2" ENTER
                  "a *= 2" ENTER
                  "a *= 2" ENTER
                  "a *= 2" ENTER),
-      nxt_string("16") },
+      njs_str("16") },
 
-    { nxt_string("var a = 2" ENTER
+    { njs_str("var a = 2" ENTER
                  "var b = 3" ENTER
                  "a * b" ENTER),
-      nxt_string("6") },
+      njs_str("6") },
 
-    { nxt_string("var a = 2; var b = 3;" ENTER
+    { njs_str("var a = 2; var b = 3;" ENTER
                  "a * b" ENTER),
-      nxt_string("6") },
+      njs_str("6") },
 
-    { nxt_string("function sq(f) { return f() * f() }" ENTER
+    { njs_str("function sq(f) { return f() * f() }" ENTER
                  "sq(function () { return 3 })" ENTER),
-      nxt_string("9") },
+      njs_str("9") },
 
     /* Temporary indexes */
 
-    { nxt_string("var a = [1,2,3], i; for (i in a) {Object.seal({});}" ENTER),
-      nxt_string("undefined") },
+    { njs_str("var a = [1,2,3], i; for (i in a) {Object.seal({});}" ENTER),
+      njs_str("undefined") },
 
-    { nxt_string("var i; for (i in [1,2,3]) {Object.seal({});}" ENTER),
-      nxt_string("undefined") },
+    { njs_str("var i; for (i in [1,2,3]) {Object.seal({});}" ENTER),
+      njs_str("undefined") },
 
-    { nxt_string("var a = 'A'; switch (a) {"
+    { njs_str("var a = 'A'; switch (a) {"
                  "case 0: a += '0';"
                  "case 1: a += '1';"
                  "}; a" ENTER),
-      nxt_string("A") },
+      njs_str("A") },
 
-    { nxt_string("var a = 0; try { a = 5 }"
+    { njs_str("var a = 0; try { a = 5 }"
                  "catch (e) { a = 9 } finally { a++ } a" ENTER),
-      nxt_string("6") },
+      njs_str("6") },
 
-    { nxt_string("/abc/i.test('ABC')" ENTER),
-      nxt_string("true") },
+    { njs_str("/abc/i.test('ABC')" ENTER),
+      njs_str("true") },
 
     /* Error handling */
 
-    { nxt_string("var a = ;" ENTER
+    { njs_str("var a = ;" ENTER
                  "2 + 2" ENTER),
-      nxt_string("4") },
+      njs_str("4") },
 
-    { nxt_string("function f() { return b;" ENTER),
-      nxt_string("SyntaxError: Unexpected end of input in 1") },
+    { njs_str("function f() { return b;" ENTER),
+      njs_str("SyntaxError: Unexpected end of input in 1") },
 
-    { nxt_string("function f() { return b;" ENTER
+    { njs_str("function f() { return b;" ENTER
                  "2 + 2" ENTER),
-      nxt_string("4") },
+      njs_str("4") },
 
-    { nxt_string("function f() { return function() { return 1" ENTER
+    { njs_str("function f() { return function() { return 1" ENTER
                  "2 + 2" ENTER),
-      nxt_string("4") },
+      njs_str("4") },
 
-    { nxt_string("function f() { return b;}" ENTER
+    { njs_str("function f() { return b;}" ENTER
                  "2 + 2" ENTER),
-      nxt_string("4") },
+      njs_str("4") },
 
-    { nxt_string("function f(o) { return o.a.a;}; f{{}}" ENTER
+    { njs_str("function f(o) { return o.a.a;}; f{{}}" ENTER
                  "2 + 2" ENTER),
-      nxt_string("4") },
+      njs_str("4") },
 
-    { nxt_string("function ff(o) {return o.a.a}" ENTER
+    { njs_str("function ff(o) {return o.a.a}" ENTER
                  "function f(o) {try {return ff(o)} "
                                  "finally {return 1}}" ENTER
                  "f({})" ENTER),
-      nxt_string("1") },
+      njs_str("1") },
 
-    { nxt_string("arguments" ENTER
+    { njs_str("arguments" ENTER
                  "function(){}()" ENTER),
-      nxt_string("SyntaxError: Unexpected token \"(\" in 1") },
+      njs_str("SyntaxError: Unexpected token \"(\" in 1") },
 
     /* Backtraces */
 
-    { nxt_string("function ff(o) {return o.a.a}" ENTER
+    { njs_str("function ff(o) {return o.a.a}" ENTER
                  "function f(o) {return ff(o)}" ENTER
                  "f({})" ENTER),
-      nxt_string("TypeError: cannot get property \"a\" of undefined\n"
+      njs_str("TypeError: cannot get property \"a\" of undefined\n"
                  "    at ff (:1)\n"
                  "    at f (:1)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("function ff(o) {return o.a.a}" ENTER
+    { njs_str("function ff(o) {return o.a.a}" ENTER
                  "function f(o) {try {return ff(o)} "
                                  "finally {return o.a.a}}" ENTER
                  "f({})" ENTER),
-      nxt_string("TypeError: cannot get property \"a\" of undefined\n"
+      njs_str("TypeError: cannot get property \"a\" of undefined\n"
                  "    at f (:1)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("function f(ff, o) {return ff(o)}" ENTER
+    { njs_str("function f(ff, o) {return ff(o)}" ENTER
                  "f(function (o) {return o.a.a}, {})" ENTER),
-      nxt_string("TypeError: cannot get property \"a\" of undefined\n"
+      njs_str("TypeError: cannot get property \"a\" of undefined\n"
                  "    at anonymous (:1)\n"
                  "    at f (:1)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("'str'.replace(/t/g,"
+    { njs_str("'str'.replace(/t/g,"
                  "              function(m) {return m.a.a})" ENTER),
-      nxt_string("TypeError: cannot get property \"a\" of undefined\n"
+      njs_str("TypeError: cannot get property \"a\" of undefined\n"
                  "    at anonymous (:1)\n"
                  "    at String.prototype.replace (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("function f(o) {return Object.keys(o)}" ENTER
+    { njs_str("function f(o) {return Object.keys(o)}" ENTER
                  "f()" ENTER),
-      nxt_string("TypeError: cannot convert undefined to object\n"
+      njs_str("TypeError: cannot convert undefined to object\n"
                  "    at Object.keys (native)\n"
                  "    at f (:1)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("''.repeat(-1)" ENTER),
-      nxt_string("RangeError\n"
+    { njs_str("''.repeat(-1)" ENTER),
+      njs_str("RangeError\n"
                  "    at String.prototype.repeat (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("Math.log({}.a.a)" ENTER),
-      nxt_string("TypeError: cannot get property \"a\" of undefined\n"
+    { njs_str("Math.log({}.a.a)" ENTER),
+      njs_str("TypeError: cannot get property \"a\" of undefined\n"
                  "    at Math.log (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("eval()" ENTER),
-      nxt_string("InternalError: Not implemented\n"
+    { njs_str("eval()" ENTER),
+      njs_str("InternalError: Not implemented\n"
                  "    at eval (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("require()" ENTER),
-      nxt_string("TypeError: missing path\n"
+    { njs_str("require()" ENTER),
+      njs_str("TypeError: missing path\n"
                  "    at require (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("setTimeout()" ENTER),
-      nxt_string("TypeError: too few arguments\n"
+    { njs_str("setTimeout()" ENTER),
+      njs_str("TypeError: too few arguments\n"
                  "    at setTimeout (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("require('crypto').createHash('sha')" ENTER),
-      nxt_string("TypeError: not supported algorithm: \"sha\"\n"
+    { njs_str("require('crypto').createHash('sha')" ENTER),
+      njs_str("TypeError: not supported algorithm: \"sha\"\n"
                  "    at crypto.createHash (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("var h = require('crypto').createHash('sha1')" ENTER
+    { njs_str("var h = require('crypto').createHash('sha1')" ENTER
                  "h.update([])" ENTER),
-      nxt_string("TypeError: data must be a string\n"
+      njs_str("TypeError: data must be a string\n"
                  "    at Hash.prototype.update (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("require('crypto').createHmac('sha1', [])" ENTER),
-      nxt_string("TypeError: key must be a string\n"
+    { njs_str("require('crypto').createHmac('sha1', [])" ENTER),
+      njs_str("TypeError: key must be a string\n"
                  "    at crypto.createHmac (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("var h = require('crypto').createHmac('sha1', 'secret')" ENTER
+    { njs_str("var h = require('crypto').createHmac('sha1', 'secret')" ENTER
                  "h.update([])" ENTER),
-      nxt_string("TypeError: data must be a string\n"
+      njs_str("TypeError: data must be a string\n"
                  "    at Hmac.prototype.update (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("function f(o) {function f_in(o) {return o.a.a};"
+    { njs_str("function f(o) {function f_in(o) {return o.a.a};"
                  "               return f_in(o)}; f({})" ENTER),
-      nxt_string("TypeError: cannot get property \"a\" of undefined\n"
+      njs_str("TypeError: cannot get property \"a\" of undefined\n"
                  "    at f_in (:1)\n"
                  "    at f (:1)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("function f(o) {var ff = function (o) {return o.a.a};"
+    { njs_str("function f(o) {var ff = function (o) {return o.a.a};"
                  "               return ff(o)}; f({})" ENTER),
-      nxt_string("TypeError: cannot get property \"a\" of undefined\n"
+      njs_str("TypeError: cannot get property \"a\" of undefined\n"
                  "    at anonymous (:1)\n"
                  "    at f (:1)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("var fs = require('fs'); fs.readFile()" ENTER),
-      nxt_string("TypeError: too few arguments\n"
+    { njs_str("var fs = require('fs'); fs.readFile()" ENTER),
+      njs_str("TypeError: too few arguments\n"
                  "    at fs.readFile (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("parseInt({ toString: function() { return [1] } })" ENTER),
-      nxt_string("TypeError: Cannot convert object to primitive value\n"
+    { njs_str("parseInt({ toString: function() { return [1] } })" ENTER),
+      njs_str("TypeError: Cannot convert object to primitive value\n"
                  "    at parseInt (native)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("function f(n) { if (n == 0) { throw 'a'; } return f(n-1); }; f(2)" ENTER),
-      nxt_string("a\n"
+    { njs_str("function f(n) { if (n == 0) { throw 'a'; } return f(n-1); }; f(2)" ENTER),
+      njs_str("a\n"
                  "    at f (:1)\n"
                  "      repeats 2 times\n"
                  "    at main (native)\n") },
 
     /* Exception in njs_vm_retval_string() */
 
-    { nxt_string("var o = { toString: function() { return [1] } }" ENTER
+    { njs_str("var o = { toString: function() { return [1] } }" ENTER
                  "o" ENTER),
-      nxt_string("TypeError: Cannot convert object to primitive value") },
+      njs_str("TypeError: Cannot convert object to primitive value") },
 
     /* line numbers */
 
-    { nxt_string("/**/(function(){throw Error();})()" ENTER),
-      nxt_string("Error\n"
+    { njs_str("/**/(function(){throw Error();})()" ENTER),
+      njs_str("Error\n"
                  "    at anonymous (:1)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("/***/(function(){throw Error();})()" ENTER),
-      nxt_string("Error\n"
+    { njs_str("/***/(function(){throw Error();})()" ENTER),
+      njs_str("Error\n"
                  "    at anonymous (:1)\n"
                  "    at main (native)\n") },
 
-    { nxt_string("/*\n**/(function(){throw Error();})()" ENTER),
-      nxt_string("Error\n"
+    { njs_str("/*\n**/(function(){throw Error();})()" ENTER),
+      njs_str("Error\n"
                  "    at anonymous (:2)\n"
                  "    at main (native)\n") },
 
 };
 
 
-static nxt_int_t
-njs_interactive_test(nxt_bool_t verbose)
+static njs_int_t
+njs_interactive_test(njs_bool_t verbose)
 {
     u_char                  *start, *last, *end;
     njs_vm_t                *vm;
-    nxt_int_t               ret;
-    nxt_str_t               s;
-    nxt_uint_t              i;
-    nxt_bool_t              success;
+    njs_int_t               ret;
+    njs_str_t               s;
+    njs_uint_t              i;
+    njs_bool_t              success;
     njs_vm_opt_t            options;
     njs_interactive_test_t  *test;
 
     vm = NULL;
-    ret = NXT_ERROR;
+    ret = NJS_ERROR;
 
-    for (i = 0; i < nxt_nitems(njs_test); i++) {
+    for (i = 0; i < njs_nitems(njs_test); i++) {
 
         test = &njs_test[i];
 
         if (verbose) {
-            nxt_printf("\"%V\"\n", &test->script);
+            njs_printf("\"%V\"\n", &test->script);
         }
 
-        nxt_memzero(&options, sizeof(njs_vm_opt_t));
+        njs_memzero(&options, sizeof(njs_vm_opt_t));
 
         options.accumulative = 1;
         options.backtrace = 1;
 
         vm = njs_vm_create(&options);
         if (vm == NULL) {
-            nxt_printf("njs_vm_create() failed\n");
+            njs_printf("njs_vm_create() failed\n");
             goto done;
         }
 
@@ -291,7 +291,7 @@ njs_interactive_test(nxt_bool_t verbose)
         end = NULL;
 
         for ( ;; ) {
-            start = (end != NULL) ? end + nxt_length(ENTER) : start;
+            start = (end != NULL) ? end + njs_length(ENTER) : start;
             if (start >= last) {
                 break;
             }
@@ -299,32 +299,32 @@ njs_interactive_test(nxt_bool_t verbose)
             end = (u_char *) strstr((char *) start, ENTER);
 
             ret = njs_vm_compile(vm, &start, end);
-            if (ret == NXT_OK) {
+            if (ret == NJS_OK) {
                 ret = njs_vm_start(vm);
             }
         }
 
-        if (njs_vm_retval_string(vm, &s) != NXT_OK) {
-            nxt_printf("njs_vm_retval_string() failed\n");
+        if (njs_vm_retval_string(vm, &s) != NJS_OK) {
+            njs_printf("njs_vm_retval_string() failed\n");
             goto done;
         }
 
-        success = nxt_strstr_eq(&test->ret, &s);
+        success = njs_strstr_eq(&test->ret, &s);
         if (success) {
             njs_vm_destroy(vm);
             vm = NULL;
             continue;
         }
 
-        nxt_printf("njs_interactive(\"%V\") failed: \"%V\" vs \"%V\"\n",
+        njs_printf("njs_interactive(\"%V\") failed: \"%V\" vs \"%V\"\n",
                    &test->script, &test->ret, &s);
 
         goto done;
     }
 
-    ret = NXT_OK;
+    ret = NJS_OK;
 
-    nxt_printf("njs interactive tests passed\n");
+    njs_printf("njs interactive tests passed\n");
 
 done:
 
@@ -336,10 +336,10 @@ done:
 }
 
 
-int nxt_cdecl
+int njs_cdecl
 main(int argc, char **argv)
 {
-    nxt_bool_t  verbose;
+    njs_bool_t  verbose;
 
     verbose = 0;
 
diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c
new file mode 100644 (file)
index 0000000..6914b71
--- /dev/null
@@ -0,0 +1,14690 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+
+#include <njs_main.h>
+#include <njs_lvlhsh.h>
+#include <njs_djb_hash.h>
+#include <njs_pcre.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/resource.h>
+#include <time.h>
+
+
+typedef struct {
+    njs_str_t  script;
+    njs_str_t  ret;
+} njs_unit_test_t;
+
+
+static njs_unit_test_t  njs_test[] =
+{
+    { njs_str("@"),
+      njs_str("SyntaxError: Unexpected token \"@\" in 1") },
+
+    { njs_str("}"),
+      njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+    { njs_str("1}"),
+      njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+    { njs_str("/***/1/*\n**/"),
+      njs_str("1") },
+
+    /* Variable declarations. */
+
+    { njs_str("var x"),
+      njs_str("undefined") },
+
+    { njs_str("var x;"),
+      njs_str("undefined") },
+
+    { njs_str("var x;;"),
+      njs_str("undefined") },
+
+    { njs_str("var x = 0"),
+      njs_str("undefined") },
+
+    { njs_str("var x = 0;"),
+      njs_str("undefined") },
+
+    { njs_str("var x = 0;;"),
+      njs_str("undefined") },
+
+    { njs_str("var; a"),
+      njs_str("SyntaxError: Unexpected token \";\" in 1") },
+
+    { njs_str("var + a"),
+      njs_str("SyntaxError: Unexpected token \"+\" in 1") },
+
+    { njs_str("//\r\n; var + a"),
+      njs_str("SyntaxError: Unexpected token \"+\" in 2") },
+
+    { njs_str("/*\n*/; var + a"),
+      njs_str("SyntaxError: Unexpected token \"+\" in 2") },
+
+    { njs_str("var \n a \n = 1; a"),
+      njs_str("1") },
+
+    { njs_str("var \n a, \n b; b"),
+      njs_str("undefined") },
+
+    { njs_str("var a = 1; var b; a"),
+      njs_str("1") },
+
+    { njs_str("a = 1;for(;a;a--)var a; a"),
+      njs_str("0") },
+
+    { njs_str("if(1)if(0){0?0:0}else\nvar a\nelse\nvar b"),
+      njs_str("undefined") },
+
+    { njs_str("var a = 1; var a; a"),
+      njs_str("1") },
+
+    { njs_str("(function (x) {if (x) { var a = 3; return a} else { var a = 4; return a}})(1)"),
+      njs_str("3") },
+
+    { njs_str("(function (x) {if (x) { var a = 3; return a} else { var a = 4; return a}})(0)"),
+      njs_str("4") },
+
+    { njs_str("function f(){return 2}; var f; f()"),
+      njs_str("2") },
+
+    { njs_str("function f(){return 2}; var f = 1; f()"),
+      njs_str("TypeError: number is not a function") },
+
+    { njs_str("function f(){return 1}; function f(){return 2}; f()"),
+      njs_str("2") },
+
+    { njs_str("var f = 1; function f() {}; f"),
+      njs_str("1") },
+
+#if 0 /* TODO */
+    { njs_str("var a; Object.getOwnPropertyDescriptor(this, 'a').value"),
+      njs_str("undefined") },
+
+    { njs_str("this.a = 1; a"),
+      njs_str("1") },
+#endif
+
+    { njs_str("f() = 1"),
+      njs_str("ReferenceError: Invalid left-hand side in assignment in 1") },
+
+    { njs_str("f.a() = 1"),
+      njs_str("ReferenceError: Invalid left-hand side in assignment in 1") },
+
+    { njs_str("++f()"),
+      njs_str("ReferenceError: Invalid left-hand side in prefix operation in 1") },
+
+    { njs_str("f()++"),
+      njs_str("ReferenceError: Invalid left-hand side in postfix operation in 1") },
+
+    /* Numbers. */
+
+    { njs_str("0"),
+      njs_str("0") },
+
+    { njs_str("-0"),
+      njs_str("-0") },
+
+    { njs_str(".0"),
+      njs_str("0") },
+
+    { njs_str("0.1"),
+      njs_str("0.1") },
+
+    { njs_str(".9"),
+      njs_str("0.9") },
+
+    { njs_str("-.01"),
+      njs_str("-0.01") },
+
+    { njs_str("0.000001"),
+      njs_str("0.000001") },
+
+    { njs_str("0.00000123456"),
+      njs_str("0.00000123456") },
+
+    { njs_str("0.0000001"),
+      njs_str("1e-7") },
+
+    { njs_str("1.1000000"),
+      njs_str("1.1") },
+
+    { njs_str("99999999999999999999"),
+      njs_str("100000000000000000000") },
+
+    { njs_str("99999999999999999999.111"),
+      njs_str("100000000000000000000") },
+
+    { njs_str("999999999999999999999"),
+      njs_str("1e+21") },
+
+    { njs_str("9223372036854775808"),
+      njs_str("9223372036854776000") },
+
+    { njs_str("18446744073709551616"),
+      njs_str("18446744073709552000") },
+
+    { njs_str("1.7976931348623157E+308"),
+      njs_str("1.7976931348623157e+308") },
+
+    { njs_str("+1"),
+      njs_str("1") },
+
+    { njs_str("+1\n"),
+      njs_str("1") },
+
+    { njs_str("."),
+      njs_str("SyntaxError: Unexpected token \".\" in 1") },
+
+    /* Octal Numbers. */
+
+    { njs_str("0o0"),
+      njs_str("0") },
+
+    { njs_str("0O10"),
+      njs_str("8") },
+
+    { njs_str("0o011"),
+      njs_str("9") },
+
+    { njs_str("-0O777"),
+      njs_str("-511") },
+
+    { njs_str("0o"),
+      njs_str("SyntaxError: Unexpected token \"0o\" in 1") },
+
+    { njs_str("0O778"),
+      njs_str("SyntaxError: Unexpected token \"0O778\" in 1") },
+
+    /* Legacy Octal Numbers are deprecated. */
+
+    { njs_str("00"),
+      njs_str("SyntaxError: Unexpected token \"00\" in 1") },
+
+    { njs_str("08"),
+      njs_str("SyntaxError: Unexpected token \"08\" in 1") },
+
+    { njs_str("09"),
+      njs_str("SyntaxError: Unexpected token \"09\" in 1") },
+
+    { njs_str("0011"),
+      njs_str("SyntaxError: Unexpected token \"00\" in 1") },
+
+    /* Binary Numbers. */
+
+    { njs_str("0b0"),
+      njs_str("0") },
+
+    { njs_str("0B10"),
+      njs_str("2") },
+
+    { njs_str("0b0101"),
+      njs_str("5") },
+
+    { njs_str("-0B11111111"),
+      njs_str("-255") },
+
+    { njs_str("0b"),
+      njs_str("SyntaxError: Unexpected token \"0b\" in 1") },
+
+    { njs_str("0B12"),
+      njs_str("SyntaxError: Unexpected token \"0B12\" in 1") },
+
+    /* Hex Numbers. */
+
+    { njs_str("0x0"),
+      njs_str("0") },
+
+    { njs_str("-0x1"),
+      njs_str("-1") },
+
+    { njs_str("0xffFF"),
+      njs_str("65535") },
+
+    { njs_str("0X0000BEEF"),
+      njs_str("48879") },
+
+    { njs_str("0x"),
+      njs_str("SyntaxError: Unexpected token \"0x\" in 1") },
+
+    { njs_str("0xffff."),
+      njs_str("SyntaxError: Unexpected token \"\" in 1") },
+
+    { njs_str("0x12g"),
+      njs_str("SyntaxError: Unexpected token \"g\" in 1") },
+
+    { njs_str(""),
+      njs_str("undefined") },
+
+    { njs_str("\n"),
+      njs_str("undefined") },
+
+    { njs_str(";"),
+      njs_str("undefined") },
+
+    { njs_str("\n +1"),
+      njs_str("1") },
+
+    /* Scientific notation. */
+
+    { njs_str("0e0"),
+      njs_str("0") },
+
+    { njs_str("0.0e0"),
+      njs_str("0") },
+
+    { njs_str("1e0"),
+      njs_str("1") },
+
+    { njs_str("1e1"),
+      njs_str("10") },
+
+    { njs_str("1.e01"),
+      njs_str("10") },
+
+    { njs_str("5.7e1"),
+      njs_str("57") },
+
+    { njs_str("5.7e-1"),
+      njs_str("0.57") },
+
+    { njs_str("-5.7e-1"),
+      njs_str("-0.57") },
+
+    { njs_str("1.1e-01"),
+      njs_str("0.11") },
+
+    { njs_str("5.7e-2"),
+      njs_str("0.057") },
+
+    { njs_str("1.1e+01"),
+      njs_str("11") },
+
+    { njs_str("-.01e-01"),
+      njs_str("-0.001") },
+
+    { njs_str("1e9"),
+      njs_str("1000000000") },
+
+    { njs_str("1.0e308"),
+      njs_str("1e+308") },
+
+    { njs_str("0e309"),
+      njs_str("0") },
+
+    { njs_str("0e-309"),
+      njs_str("0") },
+
+    { njs_str("1e309"),
+      njs_str("Infinity") },
+
+    { njs_str("-1e309"),
+      njs_str("-Infinity") },
+
+    { njs_str("1e"),
+      njs_str("SyntaxError: Unexpected token \"e\" in 1") },
+
+    { njs_str("1.e"),
+      njs_str("SyntaxError: Unexpected token \"e\" in 1") },
+
+    { njs_str("1e+"),
+      njs_str("SyntaxError: Unexpected token \"e\" in 1") },
+
+    { njs_str("1.e-"),
+      njs_str("SyntaxError: Unexpected token \"e\" in 1") },
+
+    { njs_str("1eZ"),
+      njs_str("SyntaxError: Unexpected token \"eZ\" in 1") },
+
+    { njs_str(".e1"),
+      njs_str("SyntaxError: Unexpected token \".\" in 1") },
+
+    { njs_str("Number.prototype.X = function(){return 123;};"
+                 "(1).X()"),
+      njs_str("123") },
+
+    /* Indexes. */
+
+    { njs_str("var a = []; a[-1] = 2; a[-1] == a['-1']"),
+      njs_str("true") },
+
+    { njs_str("var a = []; a[Infinity] = 2; a[Infinity] == a['Infinity']"),
+      njs_str("true") },
+
+    { njs_str("var a = []; a[NaN] = 2; a[NaN] == a['NaN']"),
+      njs_str("true") },
+
+    /* Number.toString(radix) method. */
+
+    { njs_str("0..toString(2)"),
+      njs_str("0") },
+
+    { njs_str("240..toString(2)"),
+      njs_str("11110000") },
+
+    { njs_str("Math.pow(-2, 1023).toString(2).length"),
+      njs_str("1025") },
+
+    { njs_str("8.0625.toString(2)"),
+      njs_str("1000.0001") },
+
+    { njs_str("(1/3).toString(2)"),
+      njs_str("0.010101010101010101010101010101010101010101010101010101") },
+
+    { njs_str("9999..toString(3)"),
+      njs_str("111201100") },
+
+    { njs_str("-9999..toString(3)"),
+      njs_str("-111201100") },
+
+    { njs_str("81985529216486895..toString(16)"),
+      njs_str("123456789abcdf0") },
+
+    { njs_str("0xffff.toString(16)"),
+      njs_str("ffff") },
+
+    { njs_str("30520..toString(36)"),
+      njs_str("njs") },
+
+    { njs_str("Infinity.toString()"),
+      njs_str("Infinity") },
+
+    { njs_str("Infinity.toString(2)"),
+      njs_str("Infinity") },
+
+    { njs_str("Infinity.toString(10)"),
+      njs_str("Infinity") },
+
+    { njs_str("Infinity.toString(NaN)"),
+      njs_str("RangeError") },
+
+    { njs_str("Infinity.toString({})"),
+      njs_str("RangeError") },
+
+    { njs_str("Infinity.toString(Infinity)"),
+      njs_str("RangeError") },
+
+    { njs_str("NaN.toString()"),
+      njs_str("NaN") },
+
+    { njs_str("NaN.toString(2)"),
+      njs_str("NaN") },
+
+    { njs_str("NaN.toString(10)"),
+      njs_str("NaN") },
+
+    { njs_str("NaN.toString(Infinity)"),
+      njs_str("RangeError") },
+
+    { njs_str("NaN.toString({})"),
+      njs_str("RangeError") },
+
+    { njs_str("NaN.toString(NaN)"),
+      njs_str("RangeError") },
+
+    /* An object "valueOf/toString" methods. */
+
+    { njs_str("var a = { valueOf: function() { return 1 } };    +a"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } };  +a"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: 2,"
+                 "          toString: function() { return '1' } }; +a"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } }; ''+a"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return [] },"
+                 "          toString: function() { return '1' } }; +a"),
+      njs_str("1") },
+
+    { njs_str("var a = { toString: function() { return 'a' } };"
+                 "var b = { toString: function() { return a+'b' } }; '0'+b"),
+      njs_str("0ab") },
+
+    { njs_str("({valueOf:()=>'4'}) / ({valueOf:()=>2})"),
+      njs_str("2") },
+
+    { njs_str("({valueOf:()=>{throw 'x'}}) / ({valueOf:()=>{throw 'y'}});"
+                 "var e; try { x/y } catch(ex) {e = ex}; ex"),
+      njs_str("x") },
+
+    { njs_str("({valueOf:()=>{ try {throw 'x'} catch (ex) {return 6} } }) / 2"),
+      njs_str("3") },
+
+    { njs_str("({valueOf:()=>2}) / ({valueOf:()=>{throw 'y'}});"
+                 "var e; try { x/y } catch(ex) {e = ex}; ex"),
+      njs_str("y") },
+
+    { njs_str("({valueOf:()=>'4'}) % ({valueOf:()=>3})"),
+      njs_str("1") },
+
+    { njs_str("({valueOf:()=>9}) >>> ({valueOf:()=>2})"),
+      njs_str("2") },
+
+    { njs_str("({valueOf:()=>0x1f}) & ({valueOf:()=>0xf})"),
+      njs_str("15") },
+
+    { njs_str("({valueOf:()=>0x1f}) ^ ({valueOf:()=>0xf})"),
+      njs_str("16") },
+
+    { njs_str("({valueOf:()=>0xf}) == ({valueOf:()=>0xf})"),
+      njs_str("false") },
+
+    { njs_str("var e; try {({valueOf: String.prototype.valueOf}) == 1} "
+                 "catch (ex) { e = ex}; e"),
+      njs_str("TypeError: unexpected value type:object") },
+
+    { njs_str("({valueOf:()=>0xf}) == 0xf"),
+      njs_str("true") },
+
+    { njs_str("0xf == ({valueOf:()=>0xf})"),
+      njs_str("true") },
+
+    { njs_str("({valueOf:()=>'0xf'}) == 0xf"),
+      njs_str("true") },
+
+    { njs_str("0xf == ({valueOf:()=>'0xf'})"),
+      njs_str("true") },
+
+    { njs_str("({valueOf:()=>0xf}) == '0xf'"),
+      njs_str("true") },
+
+    { njs_str("'0xf' == ({valueOf:()=>0xf})"),
+      njs_str("true") },
+    /**/
+
+    { njs_str("1 + undefined"),
+      njs_str("NaN") },
+
+    { njs_str("1 + ''"),
+      njs_str("1") },
+
+    { njs_str("0xA + ''"),
+      njs_str("10") },
+
+    { njs_str("undefined + undefined"),
+      njs_str("NaN") },
+
+    { njs_str("1.2 + 5.7"),
+      njs_str("6.9") },
+
+    { njs_str("0xf + 1"),
+      njs_str("16") },
+
+    { njs_str("1 + 1 + '2' + 1 + 1"),
+      njs_str("2211") },
+
+    { njs_str("'gg' + -0"),
+      njs_str("gg0") },
+
+    { njs_str("1.2 - '5.7'"),
+      njs_str("-4.5") },
+
+    { njs_str("1.2 + -'5.7'"),
+      njs_str("-4.5") },
+
+    { njs_str("1.2 - '-5.7'"),
+      njs_str("6.9") },
+
+    { njs_str("5 - ' \t 12  \t'"),
+      njs_str("-7") },
+
+    { njs_str("5 - '12zz'"),
+      njs_str("NaN") },
+
+    { njs_str("5 - '0x2'"),
+      njs_str("3") },
+
+    { njs_str("5 - '-0x2'"),
+      njs_str("7") },
+
+    { njs_str("5 - '\t 0x2 \t'"),
+      njs_str("3") },
+
+    { njs_str("5 - '0x2 z'"),
+      njs_str("NaN") },
+
+    { njs_str("12 - '5.7e1'"),
+      njs_str("-45") },
+
+    { njs_str("12 - '5.e1'"),
+      njs_str("-38") },
+
+    { njs_str("12 - '5.7e+01'"),
+      njs_str("-45") },
+
+    { njs_str("12 - '5.7e-01'"),
+      njs_str("11.43") },
+
+    { njs_str("12 - ' 5.7e1 '"),
+      njs_str("-45") },
+
+    { njs_str("12 - '5.7e'"),
+      njs_str("NaN") },
+
+    { njs_str("12 - '5.7e+'"),
+      njs_str("NaN") },
+
+    { njs_str("12 - '5.7e-'"),
+      njs_str("NaN") },
+
+    { njs_str("12 - ' 5.7e1 z'"),
+      njs_str("NaN") },
+
+    { njs_str("5 - '0x'"),
+      njs_str("NaN") },
+
+    { njs_str("1 + +'3'"),
+      njs_str("4") },
+
+    { njs_str("1 - undefined"),
+      njs_str("NaN") },
+
+    { njs_str("1 - ''"),
+      njs_str("1") },
+
+    { njs_str("undefined - undefined"),
+      njs_str("NaN") },
+
+    /* String.toString() method. */
+
+    { njs_str("'A'.toString()"),
+      njs_str("A") },
+
+    { njs_str("'A'.toString('hex')"),
+      njs_str("TypeError: argument must be a byte string") },
+
+    { njs_str("'A'.toBytes().toString('latin1')"),
+      njs_str("TypeError: Unknown encoding: \"latin1\"") },
+
+    { njs_str("'ABCD'.toBytes().toString('hex')"),
+      njs_str("41424344") },
+
+    { njs_str("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('hex')"),
+      njs_str("00aabbff") },
+
+    { njs_str("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('base64')"),
+      njs_str("AKq7/w==") },
+
+    { njs_str("'ABCD'.toBytes().toString('base64')"),
+      njs_str("QUJDRA==") },
+
+    { njs_str("'ABC'.toBytes().toString('base64')"),
+      njs_str("QUJD") },
+
+    { njs_str("'AB'.toBytes().toString('base64')"),
+      njs_str("QUI=") },
+
+    { njs_str("'A'.toBytes().toString('base64')"),
+      njs_str("QQ==") },
+
+    { njs_str("''.toBytes().toString('base64')"),
+      njs_str("") },
+
+    { njs_str("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('base64url')"),
+      njs_str("AKq7_w") },
+
+    { njs_str("'ABCD'.toBytes().toString('base64url')"),
+      njs_str("QUJDRA") },
+
+    { njs_str("'ABC'.toBytes().toString('base64url')"),
+      njs_str("QUJD") },
+
+    { njs_str("'AB'.toBytes().toString('base64url')"),
+      njs_str("QUI") },
+
+    { njs_str("'A'.toBytes().toString('base64url')"),
+      njs_str("QQ") },
+
+    { njs_str("''.toBytes().toString('base64url')"),
+      njs_str("") },
+
+    /* Assignment. */
+
+    { njs_str("var a, b = (a = [2]) * (3 * 4); a +' '+ b"),
+      njs_str("2 24") },
+
+    { njs_str("var a = 1; var b = a += 1; b"),
+      njs_str("2") },
+
+    { njs_str("var a = 1; var b = a -= 1; b"),
+      njs_str("0") },
+
+    { njs_str("var a = 1; var b = a <<= 1; b"),
+      njs_str("2") },
+
+    /* 3 address operation and side effect. */
+
+    { njs_str("var a = 1; function f(x) { a = x; return 2 }; a+f(5)+' '+a"),
+      njs_str("3 5") },
+
+    { njs_str("var a = 1; function f(x) { a = x; return 2 }; a += f(5)"),
+      njs_str("3") },
+
+    { njs_str("var x; x in (x = 1, [1, 2, 3])"),
+      njs_str("false") },
+
+    /* Exponentiation. */
+
+    { njs_str("2 ** 3 ** 2"),
+      njs_str("512") },
+
+    { njs_str("2 ** (3 ** 2)"),
+      njs_str("512") },
+
+    { njs_str("(2 ** 3) ** 2"),
+      njs_str("64") },
+
+    { njs_str("3 ** 2 - 9"),
+      njs_str("0") },
+
+    { njs_str("-9 + 3 ** 2"),
+      njs_str("0") },
+
+    { njs_str("-3 ** 2"),
+      njs_str("SyntaxError: Either left-hand side or entire exponentiation "
+                 "must be parenthesized in 1") },
+
+    { njs_str("-(3) ** 2"),
+      njs_str("SyntaxError: Either left-hand side or entire exponentiation "
+                 "must be parenthesized in 1") },
+
+    { njs_str("-(3 ** 2)"),
+      njs_str("-9") },
+
+    { njs_str("(-3) ** 2"),
+      njs_str("9") },
+
+    { njs_str("1 ** NaN"),
+      njs_str("NaN") },
+
+    { njs_str("'a' ** -0"),
+      njs_str("1") },
+
+    { njs_str("1.1 ** Infinity"),
+      njs_str("Infinity") },
+
+    { njs_str("(-1.1) ** -Infinity"),
+      njs_str("0") },
+
+    { njs_str("(-1) ** Infinity"),
+      njs_str("NaN") },
+
+    { njs_str("1 ** -Infinity"),
+      njs_str("NaN") },
+
+    { njs_str("(-0.9) ** Infinity"),
+      njs_str("0") },
+
+    { njs_str("0.9 ** -Infinity"),
+      njs_str("Infinity") },
+
+    { njs_str("'Infinity' ** 0.1"),
+      njs_str("Infinity") },
+
+    { njs_str("Infinity ** '-0.1'"),
+      njs_str("0") },
+
+    { njs_str("(-Infinity) ** 3"),
+      njs_str("-Infinity") },
+
+    { njs_str("'-Infinity' ** '3.1'"),
+      njs_str("Infinity") },
+
+    { njs_str("(-Infinity) ** '-3'"),
+      njs_str("-0") },
+
+    { njs_str("'-Infinity' ** -2"),
+      njs_str("0") },
+
+    { njs_str("'0' ** 0.1"),
+      njs_str("0") },
+
+#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
+    { njs_str("0 ** '-0.1'"),
+      njs_str("Infinity") },
+#endif
+
+    { njs_str("(-0) ** 3"),
+      njs_str("-0") },
+
+    { njs_str("'-0' ** '3.1'"),
+      njs_str("0") },
+
+    { njs_str("(-0) ** '-3'"),
+      njs_str("-Infinity") },
+
+#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
+    { njs_str("'-0' ** -2"),
+      njs_str("Infinity") },
+#endif
+
+    { njs_str("(-3) ** 0.1"),
+      njs_str("NaN") },
+
+    { njs_str("var a = 0.1; a **= -2"),
+      njs_str("99.99999999999999") },
+
+    { njs_str("var a = 1; a **= NaN"),
+      njs_str("NaN") },
+
+    { njs_str("var a = 'a'; a **= -0"),
+      njs_str("1") },
+
+    { njs_str("var a = 1.1; a **= Infinity"),
+      njs_str("Infinity") },
+
+    { njs_str("var a = -1.1; a **= -Infinity"),
+      njs_str("0") },
+
+    { njs_str("var a = -1; a **= Infinity"),
+      njs_str("NaN") },
+
+    { njs_str("var a = 1; a **= -Infinity"),
+      njs_str("NaN") },
+
+    { njs_str("var a = -0.9; a **= Infinity"),
+      njs_str("0") },
+
+    { njs_str("var a = 0.9; a **= -Infinity"),
+      njs_str("Infinity") },
+
+    { njs_str("var a = 'Infinity'; a **= 0.1"),
+      njs_str("Infinity") },
+
+    { njs_str("var a = Infinity; a **= '-0.1'"),
+      njs_str("0") },
+
+    { njs_str("var a = -Infinity; a **= 3"),
+      njs_str("-Infinity") },
+
+    { njs_str("var a = '-Infinity'; a **= '3.1'"),
+      njs_str("Infinity") },
+
+    { njs_str("var a = -Infinity; a **= '-3'"),
+      njs_str("-0") },
+
+    { njs_str("var a = '-Infinity'; a **= -2"),
+      njs_str("0") },
+
+    { njs_str("var a = '0'; a **= 0.1"),
+      njs_str("0") },
+
+#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
+    { njs_str("var a = 0; a **= '-0.1'"),
+      njs_str("Infinity") },
+#endif
+
+    { njs_str("var a = -0; a **= 3"),
+      njs_str("-0") },
+
+    { njs_str("var a = '-0'; a **= '3.1'"),
+      njs_str("0") },
+
+    { njs_str("var a = -0; a **= '-3'"),
+      njs_str("-Infinity") },
+
+#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
+    { njs_str("var a = '-0'; a **= -2"),
+      njs_str("Infinity") },
+#endif
+
+    { njs_str("var a = -3; a **= 0.1"),
+      njs_str("NaN") },
+
+    /**/
+
+    { njs_str("12 | 6"),
+      njs_str("14") },
+
+    { njs_str("12 | 'abc'"),
+      njs_str("12") },
+
+    { njs_str("-1 | 0"),
+      njs_str("-1") },
+
+    { njs_str("-2147483648 | 0"),
+      njs_str("-2147483648") },
+
+    { njs_str("1024.9 | 0"),
+      njs_str("1024") },
+
+    { njs_str("-1024.9 | 0"),
+      njs_str("-1024") },
+
+    { njs_str("9007199254740991 | 0"),
+      njs_str("-1") },
+
+    { njs_str("9007199254740992 | 0"),
+      njs_str("0") },
+
+    { njs_str("9007199254740993 | 0"),
+      njs_str("0") },
+
+#if 0
+    { njs_str("9223372036854775808 | 0"),
+      njs_str("0") },
+#endif
+
+    { njs_str("9223372036854777856 | 0"),
+      njs_str("2048") },
+
+    { njs_str("-9223372036854777856 | 0"),
+      njs_str("-2048") },
+
+    { njs_str("NaN | 0"),
+      njs_str("0") },
+
+    { njs_str("-NaN | 0"),
+      njs_str("0") },
+
+    { njs_str("Infinity | 0"),
+      njs_str("0") },
+
+    { njs_str("-Infinity | 0"),
+      njs_str("0") },
+
+    { njs_str("+0 | 0"),
+      njs_str("0") },
+
+    { njs_str("-0 | 0"),
+      njs_str("0") },
+
+    { njs_str("32.5 << 2.4"),
+      njs_str("128") },
+
+    { njs_str("32.5 << 'abc'"),
+      njs_str("32") },
+
+    { njs_str("'abc' << 2"),
+      njs_str("0") },
+
+    { njs_str("-1 << 0"),
+      njs_str("-1") },
+
+    { njs_str("-1 << -1"),
+      njs_str("-2147483648") },
+
+    { njs_str("-2147483648 << 0"),
+      njs_str("-2147483648") },
+
+#if 0
+    { njs_str("9223372036854775808 << 0"),
+      njs_str("0") },
+#endif
+
+    { njs_str("9223372036854777856 << 0"),
+      njs_str("2048") },
+
+    { njs_str("-9223372036854777856 << 0"),
+      njs_str("-2048") },
+
+    { njs_str("NaN << 0"),
+      njs_str("0") },
+
+    { njs_str("32.5 >> 2.4"),
+      njs_str("8") },
+
+    { njs_str("-1 >> 30"),
+      njs_str("-1") },
+
+    { njs_str("'abc' >> 2"),
+      njs_str("0") },
+
+    { njs_str("-1 >> 0"),
+      njs_str("-1") },
+
+    { njs_str("-1 >> -1"),
+      njs_str("-1") },
+
+    { njs_str("-2147483648 >> 0"),
+      njs_str("-2147483648") },
+
+    { njs_str("-2147483648 >> -1"),
+      njs_str("-1") },
+
+#if 0
+    { njs_str("9223372036854775808 >> 0"),
+      njs_str("0") },
+#endif
+
+    { njs_str("9223372036854777856 >> 0"),
+      njs_str("2048") },
+
+    { njs_str("-9223372036854777856 >> 0"),
+      njs_str("-2048") },
+
+    { njs_str("NaN >> 0"),
+      njs_str("0") },
+
+    { njs_str("-1 >>> 30"),
+      njs_str("3") },
+
+    { njs_str("NaN >>> 1"),
+      njs_str("0") },
+
+#if 0
+    { njs_str("9223372036854775808 >>> 1"),
+      njs_str("0") },
+#endif
+
+    { njs_str("-1 >>> 0"),
+      njs_str("4294967295") },
+
+    { njs_str("-1 >>> -1"),
+      njs_str("1") },
+
+    { njs_str("-2147483648 >>> 0"),
+      njs_str("2147483648") },
+
+    { njs_str("-2147483648 >>> -1"),
+      njs_str("1") },
+
+#if 0
+    { njs_str("9223372036854775808 >>> 0"),
+      njs_str("0") },
+#endif
+
+    { njs_str("9223372036854777856 >>> 0"),
+      njs_str("2048") },
+
+    { njs_str("-9223372036854777856 >>> 0"),
+      njs_str("4294965248") },
+
+    { njs_str("NaN >>> 0"),
+      njs_str("0") },
+
+    { njs_str("!2"),
+      njs_str("false") },
+
+    /**/
+
+    { njs_str("var a = { valueOf: function() { return 1 } };   ~a"),
+      njs_str("-2") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } }; ~a"),
+      njs_str("-2") },
+
+    /**/
+
+    { njs_str("1 || 2"),
+      njs_str("1") },
+
+    { njs_str("var a = 1; 1 || (a = 2); a"),
+      njs_str("1") },
+
+    { njs_str("var x; x = 0 || x; x"),
+      njs_str("undefined") },
+
+    { njs_str("var x; x = 1 && x; x"),
+      njs_str("undefined") },
+
+    { njs_str("1 || 2 || 3"),
+      njs_str("1") },
+
+    { njs_str("1 || (2 + 2) || 3"),
+      njs_str("1") },
+
+    { njs_str("1 && 2"),
+      njs_str("2") },
+
+    { njs_str("1 && 2 && 3"),
+      njs_str("3") },
+
+    { njs_str("var a = 1; 0 && (a = 2); a"),
+      njs_str("1") },
+
+    { njs_str("false && true || true"),
+      njs_str("true") },
+
+    { njs_str("false && (true || true)"),
+      njs_str("false") },
+
+    { njs_str("var a = true; a = -~!a"),
+      njs_str("1") },
+
+    { njs_str("12 & 6"),
+      njs_str("4") },
+
+    { njs_str("-1 & 65536"),
+      njs_str("65536") },
+
+    { njs_str("-2147483648 & 65536"),
+      njs_str("0") },
+
+#if 0
+    { njs_str("9223372036854775808 & 65536"),
+      njs_str("0") },
+#endif
+
+    { njs_str("NaN & 65536"),
+      njs_str("0") },
+
+    { njs_str("12 ^ 6"),
+      njs_str("10") },
+
+    { njs_str("-1 ^ 65536"),
+      njs_str("-65537") },
+
+    { njs_str("-2147483648 ^ 65536"),
+      njs_str("-2147418112") },
+
+#if 0
+    { njs_str("9223372036854775808 ^ 65536"),
+      njs_str("65536") },
+#endif
+
+    { njs_str("NaN ^ 65536"),
+      njs_str("65536") },
+
+    { njs_str("var x = '1'; +x + 2"),
+      njs_str("3") },
+
+    /* Weird things. */
+
+    { njs_str("'3' -+-+-+ '1' + '1' / '3' * '6' + '2'"),
+      njs_str("42") },
+
+    { njs_str("((+!![])+(+!![])+(+!![])+(+!![])+[])+((+!![])+(+!![])+[])"),
+      njs_str("42") },
+
+    { njs_str("1+[[]+[]]-[]+[[]-[]]-1"),
+      njs_str("9") },
+
+    { njs_str("[[]+[]]-[]+[[]-[]]"),
+      njs_str("00") },
+
+    { njs_str("!--[][1]"),
+      njs_str("true") },
+
+    { njs_str("[].concat[1,2,3]"),
+      njs_str("undefined") },
+
+    /**/
+
+    { njs_str("'true' == true"),
+      njs_str("false") },
+
+    { njs_str("null == false"),
+      njs_str("false") },
+
+    { njs_str("0 == null"),
+      njs_str("false") },
+
+    { njs_str("!null"),
+      njs_str("true") },
+
+    { njs_str("0 === -0"),
+      njs_str("true") },
+
+    { njs_str("1/-0"),
+      njs_str("-Infinity") },
+
+    { njs_str("1/0 === 1/-0"),
+      njs_str("false") },
+
+    { njs_str("1 == true"),
+      njs_str("true") },
+
+    { njs_str("NaN === NaN"),
+      njs_str("false") },
+
+    { njs_str("NaN !== NaN"),
+      njs_str("true") },
+
+    { njs_str("NaN == NaN"),
+      njs_str("false") },
+
+    { njs_str("NaN != NaN"),
+      njs_str("true") },
+
+    { njs_str("NaN == false"),
+      njs_str("false") },
+
+    { njs_str("Infinity == Infinity"),
+      njs_str("true") },
+
+    { njs_str("-Infinity == -Infinity"),
+      njs_str("true") },
+
+    { njs_str("-Infinity < Infinity"),
+      njs_str("true") },
+
+    { njs_str("Infinity - Infinity"),
+      njs_str("NaN") },
+
+    { njs_str("Infinity - -Infinity"),
+      njs_str("Infinity") },
+
+    { njs_str("undefined == 0"),
+      njs_str("false") },
+
+    { njs_str("undefined == null"),
+      njs_str("true") },
+
+    { njs_str("'1' == 1"),
+      njs_str("true") },
+
+    { njs_str("'1a' == '1'"),
+      njs_str("false") },
+
+    { njs_str("'abc' == 'abc'"),
+      njs_str("true") },
+
+    { njs_str("'abc' < 'abcde'"),
+      njs_str("true") },
+
+    { njs_str("0 == ''"),
+      njs_str("true") },
+
+    { njs_str("0 == ' '"),
+      njs_str("true") },
+
+    { njs_str("0 == '  '"),
+      njs_str("true") },
+
+    { njs_str("0 == '0'"),
+      njs_str("true") },
+
+    { njs_str("0 == ' 0 '"),
+      njs_str("true") },
+
+    { njs_str("0 == '000'"),
+      njs_str("true") },
+
+    { njs_str("'0' == ''"),
+      njs_str("false") },
+
+    { njs_str("1 < 2"),
+      njs_str("true") },
+
+    { njs_str("NaN < NaN"),
+      njs_str("false") },
+
+    { njs_str("NaN > NaN"),
+      njs_str("false") },
+
+    { njs_str("undefined < 1"),
+      njs_str("false") },
+
+    { njs_str("[] == false"),
+      njs_str("true") },
+
+    { njs_str("[0] == false"),
+      njs_str("true") },
+
+    { njs_str("[0,0] == false"),
+      njs_str("false") },
+
+    { njs_str("({}) == false"),
+      njs_str("false") },
+
+    { njs_str("new Number(1) == new String('1')"),
+      njs_str("false") },
+
+    { njs_str("var a = Object; a == Object"),
+      njs_str("true") },
+
+    { njs_str("'1' == new Number(1)"),
+      njs_str("true") },
+
+    { njs_str("new String('abc') == 'abc'"),
+      njs_str("true") },
+
+    { njs_str("false == new String('0')"),
+      njs_str("true") },
+
+    { njs_str("var a = { valueOf: function() { return 5 } };   a == 5"),
+      njs_str("true") },
+
+    { njs_str("var a = { valueOf: function() { return '5' } }; a == 5"),
+      njs_str("true") },
+
+    { njs_str("var a = { valueOf: function() { return '5' } }; a == '5'"),
+      njs_str("true") },
+
+    { njs_str("var a = { valueOf: function() { return 5 } }; a == '5'"),
+      njs_str("true") },
+
+    { njs_str("var a = { toString: function() { return true } }; '1' == a"),
+      njs_str("true") },
+
+    { njs_str("var a = { valueOf: function() { return 'b' },"
+                 "          toString: function() { return 'a' } }; a == 'a'"),
+      njs_str("false") },
+
+    /* Comparisions. */
+
+    { njs_str("1 < 2"),
+      njs_str("true") },
+
+    { njs_str("1 < 1"),
+      njs_str("false") },
+
+    { njs_str("1 <= 1"),
+      njs_str("true") },
+
+    { njs_str("1 <= 2"),
+      njs_str("true") },
+
+    { njs_str("2 > 1"),
+      njs_str("true") },
+
+    { njs_str("1 > 2"),
+      njs_str("false") },
+
+    { njs_str("1 > 1"),
+      njs_str("false") },
+
+    { njs_str("1 >= 1"),
+      njs_str("true") },
+
+    { njs_str("2 >= 1"),
+      njs_str("true") },
+
+    { njs_str("1 >= 2"),
+      njs_str("false") },
+
+    /**/
+
+    { njs_str("null === null"),
+      njs_str("true") },
+
+    { njs_str("null !== null"),
+      njs_str("false") },
+
+    { njs_str("null == null"),
+      njs_str("true") },
+
+    { njs_str("null != null"),
+      njs_str("false") },
+
+    { njs_str("null < null"),
+      njs_str("false") },
+
+    { njs_str("null > null"),
+      njs_str("false") },
+
+    { njs_str("null <= null"),
+      njs_str("true") },
+
+    { njs_str("null >= null"),
+      njs_str("true") },
+
+    /**/
+
+    { njs_str("null === undefined"),
+      njs_str("false") },
+
+    { njs_str("null !== undefined"),
+      njs_str("true") },
+
+    { njs_str("null == undefined"),
+      njs_str("true") },
+
+    { njs_str("null != undefined"),
+      njs_str("false") },
+
+    { njs_str("null < undefined"),
+      njs_str("false") },
+
+    { njs_str("null > undefined"),
+      njs_str("false") },
+
+    { njs_str("null <= undefined"),
+      njs_str("false") },
+
+    { njs_str("null >= undefined"),
+      njs_str("false") },
+
+    /**/
+
+    { njs_str("null === false"),
+      njs_str("false") },
+
+    { njs_str("null !== false"),
+      njs_str("true") },
+
+    { njs_str("null == false"),
+      njs_str("false") },
+
+    { njs_str("null != false"),
+      njs_str("true") },
+
+    { njs_str("null < false"),
+      njs_str("false") },
+
+    { njs_str("null > false"),
+      njs_str("false") },
+
+    { njs_str("null <= false"),
+      njs_str("true") },
+
+    { njs_str("null >= false"),
+      njs_str("true") },
+
+    /**/
+
+    { njs_str("null === true"),
+      njs_str("false") },
+
+    { njs_str("null !== true"),
+      njs_str("true") },
+
+    { njs_str("null == true"),
+      njs_str("false") },
+
+    { njs_str("null != true"),
+      njs_str("true") },
+
+    { njs_str("null < true"),
+      njs_str("true") },
+
+    { njs_str("null > true"),
+      njs_str("false") },
+
+    { njs_str("null <= true"),
+      njs_str("true") },
+
+    { njs_str("null >= true"),
+      njs_str("false") },
+
+    /**/
+
+    { njs_str("Infinity === Infinity"),
+      njs_str("true") },
+
+    { njs_str("Infinity !== Infinity"),
+      njs_str("false") },
+
+    { njs_str("Infinity == Infinity"),
+      njs_str("true") },
+
+    { njs_str("Infinity != Infinity"),
+      njs_str("false") },
+
+    { njs_str("Infinity < Infinity"),
+      njs_str("false") },
+
+    { njs_str("Infinity > Infinity"),
+      njs_str("false") },
+
+    { njs_str("Infinity <= Infinity"),
+      njs_str("true") },
+
+    { njs_str("Infinity >= Infinity"),
+      njs_str("true") },
+
+    /**/
+
+    { njs_str("-Infinity === Infinity"),
+      njs_str("false") },
+
+    { njs_str("-Infinity !== Infinity"),
+      njs_str("true") },
+
+    { njs_str("-Infinity == Infinity"),
+      njs_str("false") },
+
+    { njs_str("-Infinity != Infinity"),
+      njs_str("true") },
+
+    { njs_str("-Infinity < Infinity"),
+      njs_str("true") },
+
+    { njs_str("-Infinity > Infinity"),
+      njs_str("false") },
+
+    { njs_str("-Infinity <= Infinity"),
+      njs_str("true") },
+
+    { njs_str("-Infinity >= Infinity"),
+      njs_str("false") },
+
+    /**/
+
+    { njs_str("NaN === NaN"),
+      njs_str("false") },
+
+    { njs_str("NaN !== NaN"),
+      njs_str("true") },
+
+    { njs_str("NaN == NaN"),
+      njs_str("false") },
+
+    { njs_str("NaN != NaN"),
+      njs_str("true") },
+
+    { njs_str("NaN < NaN"),
+      njs_str("false") },
+
+    { njs_str("NaN > NaN"),
+      njs_str("false") },
+
+    { njs_str("NaN >= NaN"),
+      njs_str("false") },
+
+    { njs_str("NaN <= NaN"),
+      njs_str("false") },
+
+    /**/
+
+    { njs_str("null < 0"),
+      njs_str("false") },
+
+    { njs_str("null < 1"),
+      njs_str("true") },
+
+    { njs_str("null < NaN"),
+      njs_str("false") },
+
+    { njs_str("null < -Infinity"),
+      njs_str("false") },
+
+    { njs_str("null < Infinity"),
+      njs_str("true") },
+
+    { njs_str("null < 'null'"),
+      njs_str("false") },
+
+    { njs_str("null < '1'"),
+      njs_str("true") },
+
+    { njs_str("null < [1]"),
+      njs_str("true") },
+
+    { njs_str("null < ({})"),
+      njs_str("false") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };     null < a"),
+      njs_str("true") },
+
+    { njs_str("var a = { valueOf: function() { return 'null' } };null < a"),
+      njs_str("false") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } };   null < a"),
+      njs_str("true") },
+
+    { njs_str("1 < {valueOf: ()=>{throw 'x'}}"),
+      njs_str("x") },
+
+    { njs_str("({valueOf: ()=>{throw 'x'}}) <= ({valueOf:()=>{throw 'y'}})"),
+      njs_str("x") },
+
+    { njs_str("({valueOf:()=>{throw 'x'}}) > ({valueOf:()=>{throw 'y'}})"),
+      njs_str("x") },
+
+    /**/
+
+    { njs_str("undefined == undefined"),
+      njs_str("true") },
+
+    { njs_str("undefined != undefined"),
+      njs_str("false") },
+
+    { njs_str("undefined === undefined"),
+      njs_str("true") },
+
+    { njs_str("undefined !== undefined"),
+      njs_str("false") },
+
+    { njs_str("undefined < undefined"),
+      njs_str("false") },
+
+    { njs_str("undefined < null"),
+      njs_str("false") },
+
+    { njs_str("undefined < false"),
+      njs_str("false") },
+
+    { njs_str("undefined < true"),
+      njs_str("false") },
+
+    { njs_str("undefined < 0"),
+      njs_str("false") },
+
+    { njs_str("undefined < 1"),
+      njs_str("false") },
+
+    { njs_str("undefined < NaN"),
+      njs_str("false") },
+
+    { njs_str("undefined < -Infinity"),
+      njs_str("false") },
+
+    { njs_str("undefined < Infinity"),
+      njs_str("false") },
+
+    { njs_str("undefined < 'undefined'"),
+      njs_str("false") },
+
+    { njs_str("undefined < '1'"),
+      njs_str("false") },
+
+    { njs_str("undefined < [1]"),
+      njs_str("false") },
+
+    { njs_str("undefined < ({})"),
+      njs_str("false") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } }; undefined < a"),
+      njs_str("false") },
+
+    { njs_str("var a = { valueOf: function() { return 'undefined' } };"
+                 "undefined < a"),
+      njs_str("false") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } };"
+                 "undefined < a"),
+      njs_str("false") },
+
+    /**/
+
+    { njs_str("false < 1"),
+      njs_str("true") },
+
+    { njs_str("true < 1"),
+      njs_str("false") },
+
+    { njs_str("-1 < 1"),
+      njs_str("true") },
+
+    { njs_str("-1 < '1'"),
+      njs_str("true") },
+
+    { njs_str("NaN < NaN"),
+      njs_str("false") },
+
+    { njs_str("-Infinity < Infinity"),
+      njs_str("true") },
+
+    { njs_str("Infinity < -Infinity"),
+      njs_str("false") },
+
+    { njs_str("1 < 'abc'"),
+      njs_str("false") },
+
+    /**/
+
+    { njs_str("[] === []"),
+      njs_str("false") },
+
+    { njs_str("[] !== []"),
+      njs_str("true") },
+
+    { njs_str("[] == []"),
+      njs_str("false") },
+
+    { njs_str("[] != []"),
+      njs_str("true") },
+
+    { njs_str("[] < []"),
+      njs_str("false") },
+
+    { njs_str("[] > []"),
+      njs_str("false") },
+
+    { njs_str("[] >= []"),
+      njs_str("true") },
+
+    { njs_str("[] <= []"),
+      njs_str("true") },
+
+    /**/
+
+    { njs_str("({}) === ({})"),
+      njs_str("false") },
+
+    { njs_str("({}) !== ({})"),
+      njs_str("true") },
+
+    { njs_str("({}) == ({})"),
+      njs_str("false") },
+
+    { njs_str("({}) != ({})"),
+      njs_str("true") },
+
+    { njs_str("({}) > ({})"),
+      njs_str("false") },
+
+    { njs_str("({}) <= ({})"),
+      njs_str("true") },
+
+    { njs_str("({}) >= ({})"),
+      njs_str("true") },
+
+    /**/
+
+    { njs_str("[0] == ({})"),
+      njs_str("false") },
+
+    { njs_str("[0] != ({})"),
+      njs_str("true") },
+
+    { njs_str("[0] <= ({})"),
+      njs_str("true") },
+
+    { njs_str("[0] >= ({})"),
+      njs_str("false") },
+
+    /**/
+    { njs_str("new String('1') > new Number(1)"),
+      njs_str("false") },
+
+    { njs_str("new Boolean(true) > '1'"),
+      njs_str("false") },
+
+    { njs_str("'0' >= new Number(1)"),
+      njs_str("false") },
+
+    { njs_str("'1' >= new Number(1)"),
+      njs_str("true") },
+
+    { njs_str("new String('1') < new Number(1)"),
+      njs_str("false") },
+
+    { njs_str("new Boolean(true) < '1'"),
+      njs_str("false") },
+
+    { njs_str("new String('1') <= new Number(1)"),
+      njs_str("true") },
+
+    { njs_str("new Boolean(true) <= '1'"),
+      njs_str("true") },
+
+    { njs_str("'-1' < {valueOf: function() {return -2}}"),
+      njs_str("false") },
+
+    { njs_str("new 0[isNaN]"),
+      njs_str("TypeError: (intermediate value)[\"[object Function]\"] is not a function") },
+
+    { njs_str("new 0[undefined]"),
+      njs_str("TypeError: (intermediate value)[\"undefined\"] is not a function") },
+
+    /**/
+
+    { njs_str("var a; a = 1 ? 2 : 3"),
+      njs_str("2") },
+
+    { njs_str("var a; a = 1 ? 2 : 3 ? 4 : 5"),
+      njs_str("2") },
+
+    { njs_str("var a; a = 0 ? 2 : 3 ? 4 : 5"),
+      njs_str("4") },
+
+    { njs_str("0 ? 2 ? 3 : 4 : 5"),
+      njs_str("5") },
+
+    { njs_str("1 ? 2 ? 3 : 4 : 5"),
+      njs_str("3") },
+
+    { njs_str("1 ? 0 ? 3 : 4 : 5"),
+      njs_str("4") },
+
+    { njs_str("(1 ? 0 : 3) ? 4 : 5"),
+      njs_str("5") },
+
+    { njs_str("var a; a = (1 + 2) ? 2 ? 3 + 4 : 5 : 6"),
+      njs_str("7") },
+
+    { njs_str("var a; a = (1 ? 2 : 3) + 4"),
+      njs_str("6") },
+
+    { njs_str("var a, b; a = 1 ? b = 2 + 4 : b = 3"),
+      njs_str("6") },
+
+    { njs_str("var a; a = 1 ? [1,2] : []"),
+      njs_str("1,2") },
+
+    /**/
+
+    { njs_str("var a = { valueOf: function() { return 1 } };   +a"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } }; +a"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };   -a"),
+      njs_str("-1") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } }; -a"),
+      njs_str("-1") },
+
+    /* Increment. */
+
+    { njs_str("var a = 1;   ++a"),
+      njs_str("2") },
+
+    { njs_str("var a = '1'; ++a"),
+      njs_str("2") },
+
+    { njs_str("var a = [1]; ++a"),
+      njs_str("2") },
+
+    { njs_str("var a = {};  ++a"),
+      njs_str("NaN") },
+
+    { njs_str("var a = [1,2,3]; var b = 1; b = ++a[b]; b + ' '+ a"),
+      njs_str("3 1,3,3") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };"
+                 "++a +' '+ a +' '+ typeof a"),
+      njs_str("2 2 number") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } };"
+                 "++a +' '+ a +' '+ typeof a"),
+      njs_str("2 2 number") },
+
+    { njs_str("var a = { valueOf: function() { return [1] } };"
+                 "++a +' '+ a +' '+ typeof a"),
+      njs_str("NaN NaN number") },
+
+    { njs_str("var a = { valueOf: function() { return {} } };"
+                 "++a +' '+ a +' '+ typeof a"),
+      njs_str("NaN NaN number") },
+
+    /**/
+
+    { njs_str("var a = 1;   a = ++a"),
+      njs_str("2") },
+
+    { njs_str("var a = '1'; a = ++a"),
+      njs_str("2") },
+
+    { njs_str("var a = [1]; a = ++a"),
+      njs_str("2") },
+
+    { njs_str("var a = {};  a = ++a"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };   a = ++a"),
+      njs_str("2") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } }; a = ++a"),
+      njs_str("2") },
+
+    { njs_str("var a = { valueOf: function() { return [1] } }; a = ++a"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } };  a = ++a"),
+      njs_str("NaN") },
+
+    /**/
+
+    { njs_str("var a = 1;   var b = ++a; a +' '+ b"),
+      njs_str("2 2") },
+
+    { njs_str("var a = '1'; var b = ++a; a +' '+ b"),
+      njs_str("2 2") },
+
+    { njs_str("var a = [1]; var b = ++a; a +' '+ b"),
+      njs_str("2 2") },
+
+    { njs_str("var a = {};  var b = ++a; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };"
+                 "var b = ++a; a +' '+ b"),
+      njs_str("2 2") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } };"
+                 "var b = ++a; a +' '+ b"),
+      njs_str("2 2") },
+
+    { njs_str("var a = { valueOf: function() { return [1] } };"
+                 "var b = ++a; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } };"
+                 "var b = ++a; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    /* Post increment. */
+
+    { njs_str("var a = 1;   a++"),
+      njs_str("1") },
+
+    { njs_str("var a = '1'; a++"),
+      njs_str("1") },
+
+    { njs_str("var a = [1]; a++"),
+      njs_str("1") },
+
+    { njs_str("var a = {};  a++"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };   a++"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } }; a++"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return [1] } }; a++"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } };  a++"),
+      njs_str("NaN") },
+
+    /**/
+
+    { njs_str("var a = 1;   a = a++"),
+      njs_str("1") },
+
+    { njs_str("var a = '1'; a = a++"),
+      njs_str("1") },
+
+    { njs_str("var a = [1]; a = a++"),
+      njs_str("1") },
+
+    { njs_str("var a = {};  a = a++"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };   a = a++"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } }; a = a++"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return [1] } }; a = a++"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } };  a = a++"),
+      njs_str("NaN") },
+
+    /**/
+
+    { njs_str("var a = 1;   var b = a++; a +' '+ b"),
+      njs_str("2 1") },
+
+    { njs_str("var a = '1'; var b = a++; a +' '+ b"),
+      njs_str("2 1") },
+
+    { njs_str("var a = [1]; var b = a++; a +' '+ b"),
+      njs_str("2 1") },
+
+    { njs_str("var a = {};  var b = a++; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };"
+                 "var b = a++; a +' '+ b"),
+      njs_str("2 1") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } };"
+                 "var b = a++; a +' '+ b"),
+      njs_str("2 1") },
+
+    { njs_str("var a = { valueOf: function() { return [1] } };"
+                 "var b = a++; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } };"
+                 "var b = a++; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    /* Decrement. */
+
+    { njs_str("var a = 1;   --a"),
+      njs_str("0") },
+
+    { njs_str("var a = '1'; --a"),
+      njs_str("0") },
+
+    { njs_str("var a = [1]; --a"),
+      njs_str("0") },
+
+    { njs_str("var a = {};  --a"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1} };   --a"),
+      njs_str("0") },
+
+    { njs_str("var a = { valueOf: function() { return '1'} }; --a"),
+      njs_str("0") },
+
+    { njs_str("var a = { valueOf: function() { return [1]} }; --a"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } }; --a"),
+      njs_str("NaN") },
+
+    /**/
+
+    { njs_str("var a = 1;   a = --a"),
+      njs_str("0") },
+
+    { njs_str("var a = '1'; a = --a"),
+      njs_str("0") },
+
+    { njs_str("var a = [1]; a = --a"),
+      njs_str("0") },
+
+    { njs_str("var a = {};  a = --a"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1} };   a = --a"),
+      njs_str("0") },
+
+    { njs_str("var a = { valueOf: function() { return '1'} }; a = --a"),
+      njs_str("0") },
+
+    { njs_str("var a = { valueOf: function() { return [1]} }; a = --a"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } }; a = --a"),
+      njs_str("NaN") },
+
+    /**/
+
+    { njs_str("var a = 1;   var b = --a; a +' '+ b"),
+      njs_str("0 0") },
+
+    { njs_str("var a = '1'; var b = --a; a +' '+ b"),
+      njs_str("0 0") },
+
+    { njs_str("var a = [1]; var b = --a; a +' '+ b"),
+      njs_str("0 0") },
+
+    { njs_str("var a = {};  var b = --a; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };"
+                 "var b = --a; a +' '+ b"),
+      njs_str("0 0") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } };"
+                 "var b = --a; a +' '+ b"),
+      njs_str("0 0") },
+
+    { njs_str("var a = { valueOf: function() { return [1] } };"
+                 "var b = --a; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } };"
+                 "var b = --a; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    /* Post decrement. */
+
+    { njs_str("var a = 1;   a--"),
+      njs_str("1") },
+
+    { njs_str("var a = '1'; a--"),
+      njs_str("1") },
+
+    { njs_str("var a = [1]; a--"),
+      njs_str("1") },
+
+    { njs_str("var a = {};  a--"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };   a--"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } }; a--"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return [1] } }; a--"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } };  a--"),
+      njs_str("NaN") },
+
+    /**/
+
+    { njs_str("var a = 1;   a = a--"),
+      njs_str("1") },
+
+    { njs_str("var a = '1'; a = a--"),
+      njs_str("1") },
+
+    { njs_str("var a = [1]; a = a--"),
+      njs_str("1") },
+
+    { njs_str("var a = {};  a = a--"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };   a = a--"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } }; a = a--"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return [1] } }; a = a--"),
+      njs_str("NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } };  a = a--"),
+      njs_str("NaN") },
+
+    /**/
+
+    { njs_str("var a = 1;   var b = a--; a +' '+ b"),
+      njs_str("0 1") },
+
+    { njs_str("var a = '1'; var b = a--; a +' '+ b"),
+      njs_str("0 1") },
+
+    { njs_str("var a = [1]; var b = a--; a +' '+ b"),
+      njs_str("0 1") },
+
+    { njs_str("var a = {};  var b = a--; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };"
+                 "var b = a--; a +' '+ b"),
+      njs_str("0 1") },
+
+    { njs_str("var a = { valueOf: function() { return '1' } };"
+                 "var b = a--; a +' '+ b"),
+      njs_str("0 1") },
+
+    { njs_str("var a = { valueOf: function() { return [1] } };"
+                 "var b = a--; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    { njs_str("var a = { valueOf: function() { return {} } };"
+                 "var b = a--; a +' '+ b"),
+      njs_str("NaN NaN") },
+
+    /**/
+
+    { njs_str("var a, b; a = 2; b = ++a + ++a; a + ' ' + b"),
+      njs_str("4 7") },
+
+    { njs_str("var a, b; a = 2; b = a++ + a++; a + ' ' + b"),
+      njs_str("4 5") },
+
+    { njs_str("var a, b; a = b = 7; a +' '+ b"),
+      njs_str("7 7") },
+
+    { njs_str("var a, b, c; a = b = c = 5; a +' '+ b +' '+ c"),
+      njs_str("5 5 5") },
+
+    { njs_str("var a, b, c; a = b = (c = 5) + 2; a +' '+ b +' '+ c"),
+      njs_str("7 7 5") },
+
+    { njs_str("1, 2 + 5, 3"),
+      njs_str("3") },
+
+    { njs_str("var a, b; a = 1 /* YES */\n b = a + 2 \n \n + 1 \n + 3"),
+      njs_str("7") },
+
+    { njs_str("var a, b; a = 1 // YES \n b = a + 2 \n \n + 1 \n + 3"),
+      njs_str("7") },
+
+    { njs_str("var a; a = 0; ++ \n a"),
+      njs_str("1") },
+
+    { njs_str("var a; a = 0\n ++a"),
+      njs_str("1") },
+
+    { njs_str("a = 0; a \n ++"),
+      njs_str("SyntaxError: Unexpected end of input in 2") },
+
+    { njs_str("a = 0; a \n --"),
+      njs_str("SyntaxError: Unexpected end of input in 2") },
+
+    { njs_str("var a = 0; a \n + 1"),
+      njs_str("1") },
+
+    { njs_str("var a = 0; a \n +\n 1"),
+      njs_str("1") },
+
+    { njs_str("var a; a = 1 ? 2 \n : 3"),
+      njs_str("2") },
+
+    { njs_str("var a, b, c;"
+                 "a = 0 / 0; b = 1 / 0; c = -1 / 0; a +' '+ b +' '+ c"),
+      njs_str("NaN Infinity -Infinity") },
+
+    { njs_str("var a, b; a = (b = 7) + 5; var c; a +' '+ b +' '+ c"),
+      njs_str("12 7 undefined") },
+
+    { njs_str("var a, b = 1, c; a +' '+ b +' '+ c"),
+      njs_str("undefined 1 undefined") },
+
+    { njs_str("var a = 1, b = a + 1; a +' '+ b"),
+      njs_str("1 2") },
+
+    { njs_str("var a; a = a = 1"),
+      njs_str("1") },
+
+    { njs_str("var a = 1, \n b; a +' '+ b"),
+      njs_str("1 undefined") },
+
+    { njs_str("var a; a = b + 1; var b; a +' '+ b"),
+      njs_str("NaN undefined") },
+
+    { njs_str("var a += 1"),
+      njs_str("SyntaxError: Unexpected token \"+=\" in 1") },
+
+    { njs_str("var a = a + 1"),
+      njs_str("undefined") },
+
+    { njs_str("var a; a = b + 1; var b = 1; a +' '+ b"),
+      njs_str("NaN 1") },
+
+    { njs_str("var a; (a) = 1"),
+      njs_str("1") },
+
+    { njs_str("a"),
+      njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+    { njs_str("\na"),
+      njs_str("ReferenceError: \"a\" is not defined in 2") },
+
+    { njs_str("\n\na"),
+      njs_str("ReferenceError: \"a\" is not defined in 3") },
+
+    { njs_str("a + a"),
+      njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+    { njs_str("a = b + 1"),
+      njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+    { njs_str("a = a + 1"),
+      njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+    { njs_str("a += 1"),
+      njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+    { njs_str("a += 1; var a = 2"),
+      njs_str("undefined") },
+
+    { njs_str("var a = 1"),
+      njs_str("undefined") },
+
+    { njs_str("var a = 1; a = (a = 2) + a"),
+      njs_str("4") },
+
+    { njs_str("var a = 1; a = a + (a = 2)"),
+      njs_str("3") },
+
+    { njs_str("var a = 1; a += (a = 2)"),
+      njs_str("3") },
+
+    { njs_str("var a = b = 1; var b; a +' '+ b"),
+      njs_str("1 1") },
+
+    { njs_str("var a \n if (!a) a = 3; a"),
+      njs_str("3") },
+
+    /* automatic semicolon insertion. */
+
+    { njs_str("(a\n--"),
+      njs_str("SyntaxError: Unexpected token \"--\" in 2") },
+
+    { njs_str("(a\n++"),
+      njs_str("SyntaxError: Unexpected token \"++\" in 2") },
+
+    { njs_str("var x = 0, y = 2; x\n--\ny; [x,y]"),
+      njs_str("0,1") },
+
+    /* if. */
+
+    { njs_str("if (0);"),
+      njs_str("undefined") },
+
+    { njs_str("if (0) {}"),
+      njs_str("undefined") },
+
+    { njs_str("if (0);else;"),
+      njs_str("undefined") },
+
+    { njs_str("var a = 1; if (true); else a = 2; a"),
+      njs_str("1") },
+
+    { njs_str("var a = 1; if (false); else a = 2; a"),
+      njs_str("2") },
+
+    { njs_str("var a = 1; if (true) a = 2; else a = 3; a"),
+      njs_str("2") },
+
+    { njs_str("var a = 3; if (true) if (false); else a = 2; a"),
+      njs_str("2") },
+
+    { njs_str("var a = 3; if (true) if (false); else; a = 2; a"),
+      njs_str("2") },
+
+    { njs_str("var a = [3], b; if (1==1||2==2) { b = '1'+'2'+a[0] }; b"),
+      njs_str("123") },
+
+    { njs_str("(function(){ if(true) return 1 else return 0; })()"),
+      njs_str("SyntaxError: Unexpected token \"else\" in 1") },
+
+    { njs_str("(function(){ if(true) return 1; else return 0; })()"),
+      njs_str("1") },
+
+    { njs_str("(function(){ if(true) return 1;; else return 0; })()"),
+      njs_str("SyntaxError: Unexpected token \"else\" in 1") },
+
+    { njs_str("(function(){ if(true) return 1\n else return 0; })()"),
+      njs_str("1") },
+
+    { njs_str("(function(){ if(true) return 1\n;\n else return 0; })()"),
+      njs_str("1") },
+
+    { njs_str("function f(n) {if (n) throw 'foo' else return 1}; f(0)"),
+      njs_str("SyntaxError: Unexpected token \"else\" in 1") },
+
+    { njs_str("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(0)"),
+      njs_str("1") },
+
+    { njs_str("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(1)"),
+      njs_str("foo") },
+
+    { njs_str("function f(n) {if (n == 1) throw 'foo'\nelse if (n == 2) return 1}; f(2)"),
+      njs_str("1") },
+
+    { njs_str("(function(){ for (var p in [1] ){ if (1) break else return 0; }})()"),
+      njs_str("SyntaxError: Unexpected token \"else\" in 1") },
+
+    { njs_str("(function(){ for (var p in [1] ){ if (1) break\n else return 0; }})()"),
+      njs_str("undefined") },
+
+    { njs_str("(function(){ for (var p in [1] ){ if (1) break; else return 0; }})()"),
+      njs_str("undefined") },
+
+    { njs_str("(function(){ for (var p in [1] ){ if (1) continue else return 0; }})()"),
+      njs_str("SyntaxError: Unexpected token \"else\" in 1") },
+
+    { njs_str("(function(){ for (var p in [1] ){ if (1) continue\n else return 0; }})()"),
+      njs_str("undefined") },
+
+    { njs_str("(function(){ for (var p in [1] ){ if (1) continue; else return 0; }})()"),
+      njs_str("undefined") },
+
+    { njs_str("(function(x){ if\n(x) return -1; else return 0; })(0)"),
+      njs_str("0") },
+
+    { njs_str("(function(x){ if\n(\nx) return -1; else return 0; })(0)"),
+      njs_str("0") },
+
+    { njs_str("(function(x){ if\n(\nx)\nreturn -1; else return 0; })(0)"),
+      njs_str("0") },
+
+    { njs_str("(function(x){ if\n(\nx)\nreturn -1\n else return 0; })(0)"),
+      njs_str("0") },
+
+    { njs_str("(function(x){ if\n(\nx)\nreturn -1\n else\nreturn 0; })(0)"),
+      njs_str("0") },
+
+    /* do while. */
+
+    { njs_str("do { break } if (false)"),
+      njs_str("SyntaxError: Unexpected token \"if\" in 1") },
+
+    /* for in. */
+
+    { njs_str("for (null in undefined);"),
+      njs_str("ReferenceError: Invalid left-hand side \"null\" in for-in statement in 1") },
+
+    { njs_str("for (var a, b in []);"),
+      njs_str("SyntaxError: Unexpected token \"in\" in 1") },
+
+    { njs_str("var s = ''; for (var p in [1,2]) {s += p}; s"),
+      njs_str("01") },
+
+    { njs_str("var s; for (var p in [1]) {s = typeof(p)}; s"),
+      njs_str("string") },
+
+    { njs_str("var s = ''; for (var p in {a:1, b:2}) {s += p}; s"),
+      njs_str("ab") },
+
+    { njs_str("var s = '';"
+                 "var o = Object.defineProperty({}, 'x', {value:1});"
+                 "Object.defineProperty(o, 'y', {value:2, enumerable:true});"
+                 "for (var p in o) {s += p}; s"),
+      njs_str("y") },
+
+    { njs_str("var o = {a:1, b:2}; var arr = []; "
+                 "for (var a in o) {arr.push(a)}; arr"),
+      njs_str("a,b") },
+
+    { njs_str("var o = {a:1, b:2}; var arr = []; delete o.a; "
+                 "for (var a in o) {arr.push(a)}; arr"),
+      njs_str("b") },
+
+    /* switch. */
+
+    { njs_str("switch"),
+      njs_str("SyntaxError: Unexpected end of input in 1") },
+
+    { njs_str("switch (1);"),
+      njs_str("SyntaxError: Unexpected token \";\" in 1") },
+
+    { njs_str("switch (1) { do { } while (1) }"),
+      njs_str("SyntaxError: Unexpected token \"do\" in 1") },
+
+    { njs_str("switch (1) {}"),
+      njs_str("undefined") },
+
+    { njs_str("switch (1) {default:}"),
+      njs_str("undefined") },
+
+    { njs_str("switch (1) {case 0:}"),
+      njs_str("undefined") },
+
+    { njs_str("switch (1) {default:;}"),
+      njs_str("undefined") },
+
+    { njs_str("switch (1) {default:; default:}"),
+      njs_str("SyntaxError: More than one default clause in switch statement in 1") },
+
+    { njs_str("switch (1) {case 0:;}"),
+      njs_str("undefined") },
+
+    { njs_str("var a = 'A'; switch (a) {"
+                 "case 0: a += '0';"
+                 "case 1: a += '1';"
+                 "}; a"),
+      njs_str("A") },
+
+    { njs_str("var a = 'A'; switch (0) {"
+                 "case 0: a += '0';"
+                 "case 1: a += '1';"
+                 "}; a"),
+      njs_str("A01") },
+
+    { njs_str("var a = 'A'; switch (0) {"
+                 "case 0: a += '0'; break;"
+                 "case 1: a += '1';"
+                 "}; a"),
+      njs_str("A0") },
+
+    { njs_str("var a = 'A'; switch (1) {"
+                 "case 0: a += '0';"
+                 "case 1: a += '1';"
+                 "}; a"),
+      njs_str("A1") },
+
+    { njs_str("var a = 'A'; switch (2) {"
+                 "case 0: a += '0';"
+                 "case 1: a += '1';"
+                 "default: a += 'D';"
+                 "}; a"),
+      njs_str("AD") },
+
+    { njs_str("var a = 'A'; switch (2) {"
+                 "case 0: a += '0';"
+                 "default: a += 'D';"
+                 "case 1: a += '1';"
+                 "}; a"),
+      njs_str("AD1") },
+
+    { njs_str("var a = 'A'; function f(x) { a += x; return 0 }"
+                 "switch (a) {"
+                 "case f(1):"
+                 "default:"
+                 "case f(2): a += 'D';"
+                 "case f(3): a += 'T';"
+                 "} a"),
+      njs_str("A123DT") },
+
+    { njs_str("var t; "
+                 "switch ($r3.uri) {"
+                 "case 'abc': "
+                 "  t='A'; "
+                 "  break; "
+                 "default: "
+                 "  t='F'; "
+                 "}; t"),
+      njs_str("A") },
+
+    /* continue. */
+
+    { njs_str("continue"),
+      njs_str("SyntaxError: Illegal continue statement in 1") },
+
+    { njs_str("\n{\ncontinue;\n}"),
+      njs_str("SyntaxError: Illegal continue statement in 3") },
+
+    { njs_str("do continue while (false)"),
+      njs_str("SyntaxError: Unexpected token \"while\" in 1") },
+
+    { njs_str("do continue; while (false)"),
+      njs_str("undefined") },
+
+    { njs_str("do { continue } while (false)"),
+      njs_str("undefined") },
+
+    { njs_str("var i = 0; do if (i++ > 9) continue; while (i < 100); i"),
+      njs_str("100") },
+
+    { njs_str("while (false) continue"),
+      njs_str("undefined") },
+
+    { njs_str("while (false) continue;"),
+      njs_str("undefined") },
+
+    { njs_str("while (false) { continue }"),
+      njs_str("undefined") },
+
+    { njs_str("var i = 0; while (i < 100) if (i++ > 9) continue; i"),
+      njs_str("100") },
+
+    { njs_str("for ( ;null; ) continue"),
+      njs_str("undefined") },
+
+    { njs_str("for ( ;null; ) continue;"),
+      njs_str("undefined") },
+
+    { njs_str("for ( ;null; ) { continue }"),
+      njs_str("undefined") },
+
+    { njs_str("var i; for (i = 0; i < 100; i++) if (i > 9) continue; i"),
+      njs_str("100") },
+
+    { njs_str("var a = [], i; for (i in a) continue"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [], i; for (i in a) continue;"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [], i; for (i in a) { continue }"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [1,2,3,4,5]; var s = 0, i;"
+                 "for (i in a) { if (a[i] > 4) continue; else s += a[i] } s"),
+      njs_str("10") },
+
+    { njs_str("var a = [1,2,3,4,5]; var s = 0, i;"
+                 "for (i in a) { if (a[i] > 4) continue; s += a[i] } s"),
+      njs_str("10") },
+
+    { njs_str("var a; for (a = 1; a; a--) switch (a) { case 0: continue }"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [1,2,3], i; for (i in a) {Object.seal({})}"),
+      njs_str("undefined") },
+
+    { njs_str("var i; for (i in [1,2,3]) {Object.seal({});}"),
+      njs_str("undefined") },
+
+    /* break. */
+
+    { njs_str("break"),
+      njs_str("SyntaxError: Illegal break statement in 1") },
+
+    { njs_str("{break}"),
+      njs_str("SyntaxError: Illegal break statement in 1") },
+
+    { njs_str("\nbreak"),
+      njs_str("SyntaxError: Illegal break statement in 2") },
+
+    { njs_str("do break while (true)"),
+      njs_str("SyntaxError: Unexpected token \"while\" in 1") },
+
+    { njs_str("do break; while (true)"),
+      njs_str("undefined") },
+
+    { njs_str("do { break } while (true)"),
+      njs_str("undefined") },
+
+    { njs_str("var i = 0; do if (i++ > 9) break; while (i < 100); i"),
+      njs_str("11") },
+
+    { njs_str("while (true) break"),
+      njs_str("undefined") },
+
+    { njs_str("while (true) break;"),
+      njs_str("undefined") },
+
+    { njs_str("while (true) { break }"),
+      njs_str("undefined") },
+
+    { njs_str("var i = 0; while (i < 100) if (i++ > 9) break; i"),
+      njs_str("11") },
+
+    { njs_str("for ( ;; ) break"),
+      njs_str("undefined") },
+
+    { njs_str("for ( ;; ) break;"),
+      njs_str("undefined") },
+
+    { njs_str("for ( ;; ) { break }"),
+      njs_str("undefined") },
+
+    { njs_str("var i; for (i = 0; i < 100; i++) if (i > 9) break; i"),
+      njs_str("10") },
+
+    { njs_str("var a = [], i; for (i in a) break"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [], i; for (i in a) break;"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [], i; for (i in a) { break }"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [1,2,3,4,5]; var s = 0, i;"
+                 "for (i in a) { if (a[i] > 4) break; else s += a[i] } s"),
+      njs_str("10") },
+
+    { njs_str("var a = [1,2,3,4,5]; var s = 0, i;"
+                 "for (i in a) { if (a[i] > 4) break; s += a[i] } s"),
+      njs_str("10") },
+
+    { njs_str("var a = [1,2,3,4,5]; var s = 0, i;"
+                 "for (i in a) if (a[i] > 4) break; s += a[i]; s"),
+      njs_str("5") },
+
+    /* Labels. */
+
+    { njs_str("var n = 0; a:{n++}; a:{n++}; n"),
+      njs_str("2") },
+
+    { njs_str("a: throw 'a'"),
+      njs_str("a") },
+
+    { njs_str("a\n:\n1"),
+      njs_str("1") },
+
+    { njs_str("a\n\n:1"),
+      njs_str("1") },
+
+    { njs_str("a:\n\n1"),
+      njs_str("1") },
+
+    { njs_str("a:\n\n"),
+      njs_str("SyntaxError: Unexpected end of input in 3") },
+
+    { njs_str("a : var n = 0; b :++n"),
+      njs_str("1") },
+
+    { njs_str("a:{a:1}"),
+      njs_str("SyntaxError: Label \"a\" has already been declared in 1") },
+
+    { njs_str("for (var i in [1]) {break b}"),
+      njs_str("SyntaxError: Undefined label \"b\" in 1") },
+
+    { njs_str("for (var i in [1]) {continue b}"),
+      njs_str("SyntaxError: Undefined label \"b\" in 1") },
+
+    { njs_str("a:{break b}"),
+      njs_str("SyntaxError: Undefined label \"b\" in 1") },
+
+    { njs_str("a:{continue b}"),
+      njs_str("SyntaxError: Undefined label \"b\" in 1") },
+
+#if 0 /* TODO */
+    { njs_str("a:{1; break a}"),
+      njs_str("1") },
+#endif
+
+    { njs_str("var a = 0; a:{a++}; a"),
+      njs_str("1") },
+
+    { njs_str("var a = 0; a:{break a; a++}; a"),
+      njs_str("0") },
+
+    { njs_str("var r = 0; "
+                 "out: for (var i in [1,2,3]) { if (i == 2) {break out;}; r++}; r"),
+      njs_str("2") },
+
+    { njs_str("var r = 0; "
+                 "out: for (var i = 0; i < 5; i++) { if (i == 2) {break out;}; r++}; r"),
+      njs_str("2") },
+
+    { njs_str("var l1 = 0, l2 = 0; "
+                 "out: "
+                 "for (var i in [1,2,3]) { "
+                 "  for (var j in [1,2,3]) { "
+                 "    if (i == 1 && j == 1) {break;}"
+                 "    l2++;"
+                 "  }"
+                 "  l1++;"
+                 "}; [l1, l2]"),
+      njs_str("3,7") },
+
+    { njs_str("var l1 = 0, l2 = 0; "
+                 "out: "
+                 "for (var i in [1,2,3]) { "
+                 "  for (var j in [1,2,3]) { "
+                 "    if (i == 1 && j == 1) {break out;}"
+                 "    l2++;"
+                 "  }"
+                 "  l1++;"
+                 "}; [l1, l2]"),
+      njs_str("1,4") },
+
+    { njs_str("var l1 = 0, l2 = 0; "
+                 "out: "
+                 "for (var i in [1,2,3]) { "
+                 "  for (var j in [1,2,3]) { "
+                 "    if (i == 1 && j == 1) {continue out;}"
+                 "    l2++;"
+                 "  }"
+                 "  l1++;"
+                 "}; [l1, l2]"),
+      njs_str("2,7") },
+
+    { njs_str("var l1 = 0, l2 = 0; "
+                 "out: "
+                 "for (var i in [1,2,3]) { "
+                 "  l1++;"
+                 "  switch (i) { "
+                 "    case '1':"
+                 "      break out;"
+                 "    default:"
+                 "  }"
+                 "  l2++;"
+                 "}; [l1, l2]"),
+      njs_str("2,1") },
+
+    { njs_str("var l1 = 0, l2 = 0; "
+                 "out: "
+                 "for (var i in [1,2,3]) { "
+                 "  l1++;"
+                 "  switch (i) { "
+                 "    case '1':"
+                 "      continue out;"
+                 "    default:"
+                 "  }"
+                 "  l2++;"
+                 "}; [l1, l2]"),
+      njs_str("3,2") },
+
+    { njs_str("var l1 = 0, l2 = 0, i = 0, j; "
+                 "out: "
+                 "while (i < 3) { "
+                 "  j = 0;"
+                 "  while (j < 3) { "
+                 "    if (i == 1 && j == 1) {break out;}"
+                 "    l2++;"
+                 "    j++;"
+                 "  }"
+                 "  l1++;"
+                 "  i++;"
+                 "}; [l1, l2]"),
+      njs_str("1,4") },
+
+    { njs_str("var l1 = 0, l2 = 0, i = 0, j; "
+                 "out: "
+                 "while (i < 3) { "
+                 "  j = 0;"
+                 "  while (j < 3) { "
+                 "    if (i == 1 && j == 1) {i++; continue out;}"
+                 "    l2++;"
+                 "    j++;"
+                 "  }"
+                 "  l1++;"
+                 "  i++;"
+                 "}; [l1, l2]"),
+      njs_str("2,7") },
+
+    { njs_str("var l1 = 0, l2 = 0, i = 0, j; "
+                 "out: "
+                 "do { "
+                 "  j = 0;"
+                 "  do { "
+                 "    if (i == 1 && j == 1) {break out;}"
+                 "    l2++;"
+                 "    j++;"
+                 "  } while (j < 3)"
+                 "  l1++;"
+                 "  i++;"
+                 "} while (i < 3); [l1, l2]"),
+      njs_str("1,4") },
+
+    { njs_str("var l1 = 0, l2 = 0, i = 0, j; "
+                 "out: "
+                 "do { "
+                 "  j = 0;"
+                 "  do { "
+                 "    if (i == 1 && j == 1) {i++; continue out;}"
+                 "    l2++;"
+                 "    j++;"
+                 "  } while (j < 3)"
+                 "  l1++;"
+                 "  i++;"
+                 "} while (i < 3); [l1, l2]"),
+      njs_str("2,7") },
+
+    { njs_str("out1: while (1) { out2: while (1) { "
+                 "  try { break out1; break out2; } catch (e) {}"
+                 "}}"),
+      njs_str("InternalError: break/return instructions with different labels "
+                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+    { njs_str("out1: while (1) { out2: while (1) { "
+                 "  try { } catch (e) {break out1; break out2;} finally {}"
+                 "}}"),
+      njs_str("InternalError: break/return instructions with different labels "
+                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+    { njs_str("out1: while (1) { out2: while (1) { "
+                 "  try { break out1; } catch (e) {break out2;} finally {}"
+                 "}}"),
+      njs_str("InternalError: try break/return instructions with different labels "
+                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+    { njs_str("out1: while (1) { out2: while (1) { "
+                 "  try { break out1; break out2; } finally {}"
+                 "}}"),
+      njs_str("InternalError: break/return instructions with different labels "
+                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+    { njs_str("out1: while (1) { out2: while (1) { "
+                 "  try { continue out1; continue out2; } catch (e) {}"
+                 "}}"),
+      njs_str("InternalError: continue instructions with different labels "
+                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+    { njs_str("out1: while (1) { out2: while (1) { "
+                 "  try { continue out1; } catch (e) {continue out2;} finally {}"
+                 "}}"),
+      njs_str("InternalError: try continue instructions with different labels "
+                 "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+    { njs_str("function f() {"
+                 "  a:{ try { try { return 'a'; } catch (e) {break a;} finally {} } "
+                 "      catch (e) {} finally {}; }"
+                 "}"),
+      njs_str("InternalError: try break/return instructions with different labels "
+                 "(\"@return\" vs \"a\") from try-catch block are not supported") },
+
+    { njs_str("a:{ try { try { continue a; } catch (e) {} finally {} } "
+                 "    catch (e) {} finally {}; "
+                 "}"),
+      njs_str("SyntaxError: Illegal continue statement in 1") },
+
+    { njs_str("var i = 0, j = 0, r = 0;"
+                 "out1: while (i < 3) "
+                 "{ "
+                 "  i++;"
+                 "  out2: while (j < 3) { "
+                 "      j++; try { break out1; } catch (e) {} finally {r++}"
+                 "  }"
+                 "}; [i, j, r]"),
+      njs_str("1,1,1") },
+
+    { njs_str("var i = 0, j = 0, r = 0;"
+                 "out1: while (i < 3) "
+                 "{ "
+                 "  i++;"
+                 "  out2: while (j < 3) { "
+                 "      j++; try { continue out1; } catch (e) {} finally {r++}"
+                 "  }"
+                 "}; [i, j, r]"),
+      njs_str("3,3,3") },
+
+    { njs_str("var c=0,fin=0;"
+                 "try {"
+                 " while (c < 2) {"
+                 "    try { c += 1; throw 'e';}"
+                 "    finally { fin = 1; break;}"
+                 "    fin = -1;"
+                 "    c += 2;"
+                 " }"
+                 "} catch(e) {c = 10;}; [c, fin]"),
+      njs_str("1,1") },
+
+    /* jumping out of a nested try-catch block. */
+
+    { njs_str("var r = 0; "
+                 "function f () { try { try {return 'a';} finally { r++; }} "
+                 "                finally { r++; } }; "
+                 "[f(), r]"),
+      njs_str("a,2") },
+
+    { njs_str("function f(n) { "
+                 "  var r1 = 0, r2 = 0, r3 = 0;"
+                 "  a:{ try { try { "
+                 "              if (n == 0) { break a; } "
+                 "              if (n == 1) { throw 'a'; } "
+                 "            } "
+                 "            catch (e) { break a; } finally { r1++; } } "
+                 "      catch (e) {} "
+                 "      finally { r2++; } "
+                 "      r3++;  "
+                 "  }; "
+                 "return [r1, r2, r3]"
+                 "}; njs.dump([f(0), f(1), f(3)])"),
+      njs_str("[[1,1,0],[1,1,0],[1,1,1]]") },
+
+    /**/
+
+    { njs_str("var i; for (i = 0; i < 10; i++) { i += 1 } i"),
+      njs_str("10") },
+
+    /* Factorial. */
+
+    { njs_str("var n = 5, f = 1; while (n--) f *= n + 1; f"),
+      njs_str("120") },
+
+    { njs_str("var n = 5, f = 1; while (n) { f *= n; n-- } f"),
+      njs_str("120") },
+
+    /* Fibonacci. */
+
+    { njs_str("var n = 50, x, i, j, k;"
+                 "for(i=0,j=1,k=0; k<n; i=j,j=x,k++ ){ x=i+j } x"),
+      njs_str("20365011074") },
+
+    { njs_str("3 + 'abc' + 'def' + null + true + false + undefined"),
+      njs_str("3abcdefnulltruefalseundefined") },
+
+    { njs_str("var a = 0; do a++; while (a < 5) if (a == 5) a = 7.33 \n"
+                 "else a = 8; while (a < 10) a++; a"),
+      njs_str("10.33") },
+
+    /* typeof. */
+
+    { njs_str("typeof null"),
+      njs_str("object") },
+
+    { njs_str("typeof undefined"),
+      njs_str("undefined") },
+
+    { njs_str("typeof false"),
+      njs_str("boolean") },
+
+    { njs_str("typeof true"),
+      njs_str("boolean") },
+
+    { njs_str("typeof 0"),
+      njs_str("number") },
+
+    { njs_str("typeof -1"),
+      njs_str("number") },
+
+    { njs_str("typeof Infinity"),
+      njs_str("number") },
+
+    { njs_str("typeof NaN"),
+      njs_str("number") },
+
+    { njs_str("typeof 'a'"),
+      njs_str("string") },
+
+    { njs_str("typeof {}"),
+      njs_str("object") },
+
+    { njs_str("typeof Object()"),
+      njs_str("object") },
+
+    { njs_str("typeof []"),
+      njs_str("object") },
+
+    { njs_str("typeof function(){}"),
+      njs_str("function") },
+
+    { njs_str("typeof Object"),
+      njs_str("function") },
+
+    { njs_str("typeof /./i"),
+      njs_str("object") },
+
+    { njs_str("typeof Date.prototype"),
+      njs_str("object") },
+
+    { njs_str("typeof a"),
+      njs_str("undefined") },
+
+    { njs_str("typeof a; var a"),
+      njs_str("undefined") },
+
+    { njs_str("typeof a; var a; a"),
+      njs_str("undefined") },
+
+    { njs_str("var a = 5; typeof a"),
+      njs_str("number") },
+
+    { njs_str("function f() { return typeof a } ; f()"),
+      njs_str("undefined") },
+
+    { njs_str("typeof a; a"),
+      njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+    { njs_str("typeof a; a = 1"),
+      njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+    /**/
+
+    { njs_str("void 0"),
+      njs_str("undefined") },
+
+    { njs_str("null = 1"),
+      njs_str("ReferenceError: Invalid left-hand side in assignment in 1") },
+
+    { njs_str("undefined = 1"),
+      njs_str("ReferenceError: Invalid left-hand side in assignment in 1") },
+
+    { njs_str("null++"),
+      njs_str("ReferenceError: Invalid left-hand side in postfix operation in 1") },
+
+    { njs_str("++null"),
+      njs_str("ReferenceError: Invalid left-hand side in prefix operation in 1") },
+
+    { njs_str("var a, b; b = a; a = 1; a +' '+ b"),
+      njs_str("1 undefined") },
+
+    { njs_str("a = 1"),
+      njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+    { njs_str("var a; a = 1; a"),
+      njs_str("1") },
+
+    { njs_str("var a = {}; typeof a +' '+ a"),
+      njs_str("object [object Object]") },
+
+    { njs_str("var a = {}; a.b"),
+      njs_str("undefined") },
+
+    { njs_str("var a = {}; a.b = 1 + 2; a.b"),
+      njs_str("3") },
+
+    { njs_str("var a = {}; a['b']"),
+      njs_str("undefined") },
+
+    { njs_str("var a = {}; a.b.c"),
+      njs_str("TypeError: cannot get property \"c\" of undefined") },
+
+    { njs_str("'a'[0]"),
+      njs_str("a") },
+
+    { njs_str("'a'[undefined]"),
+      njs_str("undefined") },
+
+    { njs_str("'a'[null]"),
+      njs_str("undefined") },
+
+    { njs_str("'a'[false]"),
+      njs_str("undefined") },
+
+    { njs_str("'a'.b = 1"),
+      njs_str("TypeError: property set on primitive string type") },
+
+    { njs_str("'a'[2] = 1"),
+      njs_str("TypeError: property set on primitive string type") },
+
+    { njs_str("var a = {}; a.b = 1; a.b"),
+      njs_str("1") },
+
+    { njs_str("var a = {}; a.b = 1; a.b += 2"),
+      njs_str("3") },
+
+    { njs_str("var a = {}; a.b = 1; a.b += a.b"),
+      njs_str("2") },
+
+    { njs_str("var a = {}; a.b = 1; var x = {}; x.b = 3; a.b += (x.b = 2)"),
+      njs_str("3") },
+
+    { njs_str("var a = {}; a.b = 1; a.b += (a.b = 2)"),
+      njs_str("3") },
+
+    { njs_str("var a = {}; a.b += 1"),
+      njs_str("NaN") },
+
+    { njs_str("var a = 1; var b = 2; a = b += 1"),
+      njs_str("3") },
+
+    { njs_str("var a = 1; var b = { x:2 }; a = b.x += 1"),
+      njs_str("3") },
+
+    { njs_str("var a = 1; var b = { x:2 }; a = b.x += (a = 1)"),
+      njs_str("3") },
+
+    { njs_str("var a = undefined; a.b++; a.b"),
+      njs_str("TypeError: cannot get property \"b\" of undefined") },
+
+    { njs_str("var a = null; a.b++; a.b"),
+      njs_str("TypeError: cannot get property \"b\" of undefined") },
+
+    { njs_str("var a = true; a.b++; a.b"),
+      njs_str("TypeError: property set on primitive boolean type") },
+
+    { njs_str("var a = 1; a.b++; a.b"),
+      njs_str("TypeError: property set on primitive number type") },
+
+    { njs_str("var n = 1, o = { p: n += 1 }; o.p"),
+      njs_str("2") },
+
+    { njs_str("var a = {}; a.b = {}; a.b.c = 1; a.b['c']"),
+      njs_str("1") },
+
+    { njs_str("var a = {}; a.b = {}; a.b.c = 1; a['b']['c']"),
+      njs_str("1") },
+
+    { njs_str("var a = {}; a.b = {}; var c = 'd'; a.b.d = 1; a['b'][c]"),
+      njs_str("1") },
+
+    { njs_str("var a = {}; a.b = 1; var c = a.b++; a.b +' '+ c"),
+      njs_str("2 1") },
+
+    { njs_str("var a = 2; a.b = 1; var c = a.b++; a +' '+ a.b +' '+ c"),
+      njs_str("TypeError: property set on primitive number type") },
+
+    { njs_str("var x = { a: 1 }; x.a"),
+      njs_str("1") },
+
+    { njs_str("var a = { x:1 }; var b = { y:2 }; a.x = b.y; a.x"),
+      njs_str("2") },
+
+    { njs_str("var a = { x:1 }; var b = { y:2 }; var c; c = a.x = b.y"),
+      njs_str("2") },
+
+    { njs_str("var a = { x:1 }; var b = { y:2 }; var c = a.x = b.y; c"),
+      njs_str("2") },
+
+    { njs_str("var a = { x:1 }; var b = { y:2 }; a.x = b.y"),
+      njs_str("2") },
+
+    { njs_str("var a = { x:1 }; var b = a.x = 1 + 2; a.x +' '+ b"),
+      njs_str("3 3") },
+
+    { njs_str("var a = { x:1 }; var b = { y:2 }; var c = {};"
+                 "c.x = a.x = b.y; c.x"),
+      njs_str("2") },
+
+    { njs_str("var y = 2, x = { a:1, b: y + 5, c:3 };"
+                 "x.a +' '+ x.b +' '+ x.c"),
+      njs_str("1 7 3") },
+
+    { njs_str("var x = { a: 1, b: { a:2, c:5 } };"
+                 "x.a +' '+ x.b.a +' '+ x.b.c"),
+      njs_str("1 2 5") },
+
+    { njs_str("var y = 5, x = { a:y }; x.a"),
+      njs_str("5") },
+
+    { njs_str("var x = { a: 1; b: 2 }"),
+      njs_str("SyntaxError: Unexpected token \";\" in 1") },
+
+    { njs_str("var x = { a: 1, b: x.a }"),
+      njs_str("TypeError: cannot get property \"a\" of undefined") },
+
+    { njs_str("var a = { b: 2 }; a.b += 1"),
+      njs_str("3") },
+
+    { njs_str("var o = {a:1}, c = o; o.a = o = {b:5};"
+                 "o.a +' '+ o.b +' '+ c.a.b"),
+      njs_str("undefined 5 5") },
+
+    { njs_str("var y = { a: 2 }, x = { a: 1, b: y.a }; x.a +' '+ x.b"),
+      njs_str("1 2") },
+
+    { njs_str("var y = { a: 1 }, x = { a: y.a++, b: y.a++ }\n"
+                 "x.a +' '+ x.b +' '+ y.a"),
+      njs_str("1 2 3") },
+
+    { njs_str("var a='', o = {a:1, b:2}, p;"
+                 "for (p in o) { a += p +':'+ o[p] +',' } a"),
+      njs_str("a:1,b:2,") },
+
+    { njs_str("var x = { a: 1 }, b = delete x.a; x.a +' '+ b"),
+      njs_str("undefined true") },
+
+    /* Object shorthand property. */
+
+    { njs_str("var a = 1; njs.dump({a})"),
+      njs_str("{a:1}") },
+
+    { njs_str("var a = 1, b; njs.dump({a,b})"),
+      njs_str("{a:1,b:undefined}") },
+
+    { njs_str("var a = 1, b = 2; ({a,b,c})"),
+      njs_str("ReferenceError: \"c\" is not defined in 1") },
+
+    { njs_str("var a = 1, b = 2; njs.dump({a,b,c:3})"),
+      njs_str("{a:1,b:2,c:3}") },
+
+    { njs_str("var b = 2, c = 3; njs.dump({a:1,b,c})"),
+      njs_str("{a:1,b:2,c:3}") },
+
+    { njs_str("({1})"),
+      njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+    { njs_str("({default})"),
+      njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+    { njs_str("({var})"),
+      njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+    { njs_str("({this})"),
+        njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+    { njs_str("typeof ({Number}).Number"),
+      njs_str("function") },
+
+    { njs_str("typeof ({eval}).eval"),
+      njs_str("function") },
+
+    { njs_str("typeof ({Math}).Math.sin"),
+      njs_str("function") },
+
+    { njs_str("delete null"),
+      njs_str("true") },
+
+    { njs_str("var a; delete a"),
+      njs_str("SyntaxError: Delete of an unqualified identifier in 1") },
+
+    { njs_str("delete undefined"),
+      njs_str("SyntaxError: Delete of an unqualified identifier in 1") },
+
+    /* Object shorthand methods. */
+
+    { njs_str("var o = {m(){}}; new o.m();"),
+      njs_str("TypeError: function is not a constructor") },
+
+    { njs_str("var o = {sum(a, b){return a + b;}}; o.sum(1, 2)"),
+      njs_str("3") },
+
+    /* Object computed property. */
+
+    { njs_str("var o = { [0]: 1, [-0]: 2 }; o[0];"),
+      njs_str("2") },
+
+    { njs_str("var k = 'abc'.split('');var o = {[k[0]]: 'baz'}; o.a"),
+      njs_str("baz") },
+
+    { njs_str("var k = {}; var o = {[k]() {return 'baz'}}; o[k]()"),
+      njs_str("baz") },
+
+    { njs_str("njs.dump({[{toString(){return 'xx'}}]:1})"),
+      njs_str("{xx:1}") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'toString', {value:()=>'xx'});"
+                 "njs.dump({[o]:1})"),
+      njs_str("{xx:1}") },
+
+    { njs_str("({[{toString(){return {}}}]:1})"),
+      njs_str("TypeError: Cannot convert object to primitive value") },
+
+    { njs_str("var o = { [new Number(12345)]: 1000 }; o[12345]"),
+      njs_str("1000") },
+
+    /* ES5FIX: "SyntaxError". */
+
+    { njs_str("delete NaN"),
+      njs_str("true") },
+
+    /* ES5FIX: "SyntaxError". */
+
+    { njs_str("delete Infinity"),
+      njs_str("true") },
+
+    { njs_str("delete -Infinity"),
+      njs_str("true") },
+
+    { njs_str("delete (1/0)"),
+      njs_str("true") },
+
+    { njs_str("delete 1"),
+      njs_str("true") },
+
+    { njs_str("var a = []; delete a[1]"),
+      njs_str("true") },
+
+    { njs_str("var o = {}; [delete o.m, delete o.m]"),
+      njs_str("true,true") },
+
+    { njs_str("[delete Array.nonexistent, delete Array.Array]"),
+      njs_str("true,true") },
+
+    { njs_str("var a; delete (a = 1); a"),
+      njs_str("1") },
+
+    { njs_str("delete a"),
+      njs_str("SyntaxError: Delete of an unqualified identifier in 1") },
+
+    { njs_str("var a = 1; delete a"),
+      njs_str("SyntaxError: Delete of an unqualified identifier in 1") },
+
+    { njs_str("function f(){} delete f"),
+      njs_str("SyntaxError: Delete of an unqualified identifier in 1") },
+
+    { njs_str("var a = { x:1 }; ('x' in a) +' '+ (1 in a)"),
+      njs_str("true false") },
+
+    { njs_str("delete --[][1]"),
+      njs_str("true") },
+
+    { njs_str("var a = [1,2]; delete a.length"),
+      njs_str("TypeError: Cannot delete property \"length\" of array") },
+
+    { njs_str("var a = [1,2,3]; a.x = 10;  delete a[1]"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.create({a:1}); o.a = 2; delete o.a; o.a"),
+      njs_str("1") },
+
+    { njs_str("delete Array.name"),
+      njs_str("true") },
+
+    { njs_str("delete Math.max"),
+      njs_str("true") },
+
+    { njs_str("delete Math.max.length"),
+      njs_str("true") },
+
+    { njs_str("function f(a,b) {} "
+                 "[f.length, delete f.length, f.length, delete f.length]"),
+      njs_str("2,true,0,true") },
+
+    { njs_str("njs.dump({break:1,3:2,'a':4,\"b\":2,true:1,null:0})"),
+      njs_str("{break:1,3:2,a:4,b:2,true:1,null:0}") },
+
+    { njs_str("var o1 = {a:1,b:2}, o2 = {c:3}; o1.a + o2.c"),
+      njs_str("4") },
+
+    { njs_str("({[]:1})"),
+      njs_str("SyntaxError: Unexpected token \"]\" in 1") },
+
+    { njs_str("({'AB\\ncd':1})['AB\\ncd']"),
+      njs_str("1") },
+
+    /* Inheritance. */
+
+    { njs_str("function Foo() {this.bar = 10;}; Foo.prototype.bar = 42; "
+                 "var v = new Foo(); delete v.bar; v.bar"),
+      njs_str("42") },
+
+    { njs_str("function Cl(x,y) {this.x = x; this.y = y}; "
+                 "var c = new Cl('a', 'b'); Cl.prototype.z = 1; c.z"),
+      njs_str("1") },
+
+    /**/
+
+    { njs_str("delete Math.E"),
+      njs_str("TypeError: Cannot delete property \"E\" of object") },
+
+    { njs_str("Math.E = 1"),
+      njs_str("TypeError: Cannot assign to read-only property \"E\" of object") },
+
+    { njs_str("var o = { 'a': 1, 'b': 2 }; var i; "
+                 "for (i in o) { delete o.a; delete o.b; }; njs.dump(o)"),
+      njs_str("{}") },
+
+    { njs_str("var o  = {}; Object.defineProperty(o, 'a', {value:1, configurable:1}); "
+                 "delete o.a; o.a=2; o.a"),
+      njs_str("2") },
+
+    { njs_str("var a = {}; 1 in a"),
+      njs_str("false") },
+
+    { njs_str("'a' in {a:1}"),
+      njs_str("true") },
+
+    { njs_str("'a' in Object.create({a:1})"),
+      njs_str("true") },
+
+    { njs_str("var a = 1; 1 in a"),
+      njs_str("TypeError: property in on a primitive value") },
+
+    { njs_str("var a = true; 1 in a"),
+      njs_str("TypeError: property in on a primitive value") },
+
+    { njs_str("var n = { toString: function() { return 'a' } };"
+                 "var o = { a: 5 }; o[n]"),
+      njs_str("5") },
+
+    { njs_str("var n = { valueOf: function() { return 'a' } };"
+                 "var o = { a: 5, '[object Object]': 7 }; o[n]"),
+      njs_str("7") },
+
+    { njs_str("var o = {}; o.new = 'OK'; o.new"),
+      njs_str("OK") },
+
+    { njs_str("var o = { new: 'OK'}; o.new"),
+      njs_str("OK") },
+
+    /* Arrays */
+
+    /* Empty array to primitive. */
+
+    { njs_str("3 + []"),
+      njs_str("3") },
+
+    { njs_str("3 * []"),
+      njs_str("0") },
+
+    /* Single element array to primitive. */
+
+    { njs_str("3 + [5]"),
+      njs_str("35") },
+
+    { njs_str("3 * [5]"),
+      njs_str("15") },
+
+    /* Array to primitive. */
+
+    { njs_str("3 + [5,7]"),
+      njs_str("35,7") },
+
+    { njs_str("3 * [5,7]"),
+      njs_str("NaN") },
+
+    { njs_str("var a = [ 1, 2, 3 ]; a[0] + a[1] + a[2]"),
+      njs_str("6") },
+
+    { njs_str("var a = [ 1, 2, 3 ]; a[-1] = 4; a + a[-1]"),
+      njs_str("1,2,34") },
+
+    { njs_str("var a = [ 1, 2, 3 ]; a[4294967295] = 4; a + a[4294967295]"),
+      njs_str("1,2,34") },
+
+    { njs_str("var a = [ 1, 2, 3 ]; a[4294967296] = 4; a + a[4294967296]"),
+      njs_str("1,2,34") },
+
+    { njs_str("delete[]['4e9']"),
+      njs_str("true") },
+
+    { njs_str("var n = 1, a = [ n += 1 ]; a"),
+      njs_str("2") },
+
+    { njs_str("var a = [ 1, 2; 3 ]; a[0] + a[1] + a[2]"),
+      njs_str("SyntaxError: Unexpected token \";\" in 1") },
+
+    { njs_str("var a = [ 1, 2, 3 ]; a[0] +' '+ a[1] +' '+ a[2] +' '+ a[3]"),
+      njs_str("1 2 3 undefined") },
+
+    { njs_str("var a = [ 5, 6, 7 ]; a['1']"),
+      njs_str("6") },
+
+    { njs_str("var a = [ 5, 6, 7 ]; a['01']"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [ 5, 6, 7 ]; a[0x1]"),
+      njs_str("6") },
+
+    { njs_str("var a = [ 5, 6, 7 ]; a['0x1']"),
+      njs_str("undefined") },
+
+    { njs_str("[] - 2"),
+      njs_str("-2") },
+
+    { njs_str("[1] - 2"),
+      njs_str("-1") },
+
+    { njs_str("[[1]] - 2"),
+      njs_str("-1") },
+
+    { njs_str("[[[1]]] - 2"),
+      njs_str("-1") },
+
+    { njs_str("var a = []; a - 2"),
+      njs_str("-2") },
+
+    { njs_str("var a = [1]; a - 2"),
+      njs_str("-1") },
+
+    { njs_str("var a = []; a[0] = 1; a - 2"),
+      njs_str("-1") },
+
+    { njs_str("[] + 2 + 3"),
+      njs_str("23") },
+
+    { njs_str("[1] + 2 + 3"),
+      njs_str("123") },
+
+    { njs_str("var a = []; a + 2 + 3"),
+      njs_str("23") },
+
+    { njs_str("var a = [1]; a + 2 + 3"),
+      njs_str("123") },
+
+    { njs_str("var a = [1,2], i = 0; a[i++] += a[0] = 5 + i;"
+                 "a[0] +' '+ a[1]"),
+      njs_str("7 2") },
+
+    { njs_str("var a = []; a[0] = 1; a + 2 + 3"),
+      njs_str("123") },
+
+    { njs_str("var a = []; a['0'] = 1; a + 2 + 3"),
+      njs_str("123") },
+
+    { njs_str("var a = []; a[2] = 1; a[2]"),
+      njs_str("1") },
+
+    { njs_str("var a = [1, 2]; 1 in a"),
+      njs_str("true") },
+
+    { njs_str("var a = [1, 2]; 2 in a"),
+      njs_str("false") },
+
+    { njs_str("var a = [1, 2]; delete a[0]; 0 in a"),
+      njs_str("false") },
+
+    { njs_str("var a = [ function(a) {return a + 1} ]; a[0](5)"),
+      njs_str("6") },
+
+    { njs_str("var s = '', a = [5,1,2], i;"
+                 "a[null] = null;"
+                 "a[undefined] = 'defined';"
+                 "a[false] = false;"
+                 "a[true] = true;"
+                 "a[-0] = 0;"
+                 "a[Infinity] = Infinity;"
+                 "a[-Infinity] = -Infinity;"
+                 "a[NaN] = NaN;"
+                 "a[-NaN] = -NaN;"
+                 "for (i in a) { s += i +':'+ a[i] +',' } s"),
+      njs_str("0:0,1:1,2:2,null:null,undefined:defined,false:false,"
+                 "true:true,Infinity:Infinity,-Infinity:-Infinity,NaN:NaN,") },
+
+    { njs_str("--[][3e9]"),
+      njs_str("MemoryError") },
+
+    { njs_str("[].length"),
+      njs_str("0") },
+
+    { njs_str("[1,2].length"),
+      njs_str("2") },
+
+    { njs_str("var a = [1,2]; a.length"),
+      njs_str("2") },
+
+    { njs_str("[\n1]"),
+      njs_str("1") },
+
+    { njs_str("\n[\n1\n]"),
+      njs_str("1") },
+
+    { njs_str("\n[\n1\n,\n2]\n[\n0]"),
+      njs_str("1") },
+
+    { njs_str("Object.create([1,2]).length"),
+      njs_str("2") },
+
+    { njs_str("Object.create(['α','β'])[1]"),
+      njs_str("β") },
+
+    { njs_str("Object.create(['α','β'])[false]"),
+      njs_str("undefined") },
+
+    { njs_str("var a = ['abc']; var o = Object.create(a); o[0] = 32;"
+                 "[a,o[0]]"),
+      njs_str("abc,32") },
+
+    /* Array.length setter */
+
+    { njs_str("[].length = {}"),
+      njs_str("RangeError: Invalid array length") },
+
+    { njs_str("[].length = 2**32 - 1"),
+      njs_str("MemoryError") },
+
+    { njs_str("[].length = 3e9"),
+      njs_str("MemoryError") },
+
+    { njs_str("Object.defineProperty([], 'length',{value: 2**32 - 1})"),
+      njs_str("MemoryError") },
+
+    { njs_str("[].length = 2**32"),
+      njs_str("RangeError: Invalid array length") },
+
+    { njs_str("[].length = 2**32 + 1"),
+      njs_str("RangeError: Invalid array length") },
+
+    { njs_str("[].length = -1"),
+      njs_str("RangeError: Invalid array length") },
+
+    { njs_str("var a = [1];"
+                 "typeof (a.length = '') == 'string' && a.length == 0"),
+      njs_str("true") },
+
+    { njs_str("var a = [1]; "
+                 "typeof (a.length = Object(2)) == 'object' && a.length == 2"),
+      njs_str("true") },
+
+    { njs_str("var a = [1]; "
+                 "typeof (a.length = Object('2')) == 'object'"),
+      njs_str("true") },
+
+    { njs_str("var a = [1]; "
+                 "a.length = { valueOf: () => 2 }; a.length == 2"),
+      njs_str("true") },
+
+    { njs_str("var a = [1]; "
+                 "a.length = { toString: () => '2' }; a.length == 2"),
+      njs_str("true") },
+
+    { njs_str("var a = []; a.length = 0; JSON.stringify(a)"),
+      njs_str("[]") },
+
+    { njs_str("var a = []; a.length = 1; JSON.stringify(a)"),
+      njs_str("[null]") },
+
+    { njs_str("var a = [1]; a.length = 1; JSON.stringify(a)"),
+      njs_str("[1]") },
+
+    { njs_str("var a = [1]; a.length = 2; JSON.stringify(a)"),
+      njs_str("[1,null]") },
+
+    { njs_str("var a = [1]; a.length = 4; a.length = 0; JSON.stringify(a)"),
+      njs_str("[]") },
+
+    { njs_str("var a = [1,2,3]; a.length = 2; JSON.stringify(a)"),
+      njs_str("[1,2]") },
+
+    { njs_str("var a = [1,2,3]; a.length = 3; a"),
+      njs_str("1,2,3") },
+
+    { njs_str("var a = [1,2,3]; a.length = 16; a"),
+      njs_str("1,2,3,,,,,,,,,,,,,") },
+
+    { njs_str("var a = [1,2,3]; a.join()"),
+      njs_str("1,2,3") },
+
+    { njs_str("var a = [1,2,3]; a.join(':')"),
+      njs_str("1:2:3") },
+
+    { njs_str("var a = []; a[5] = 5; a.join()"),
+      njs_str(",,,,,5") },
+
+    { njs_str("var a = [,null,undefined,false,true,0,1]; a.join()"),
+      njs_str(",,,false,true,0,1") },
+
+    { njs_str("var o = { toString: function() { return null } };"
+                 "[o].join()"),
+      njs_str("null") },
+
+    { njs_str("var o = { toString: function() { return undefined } };"
+                 "[o].join()"),
+      njs_str("undefined") },
+
+    { njs_str("var a = []; a[5] = 5; a"),
+      njs_str(",,,,,5") },
+
+    { njs_str("var a = []; a.concat([])"),
+      njs_str("") },
+
+    { njs_str("var s = { toString: function() { return 'S' } };"
+                 "var v = { toString: 8, valueOf: function() { return 'V' } };"
+                 "var o = [9]; o.join = function() { return 'O' };"
+                 "var a = [1,2,3,[4,5,6],s,v,o]; a.join('')"),
+      njs_str("1234,5,6SVO") },
+
+    { njs_str("var s = { toString: function() { return 'S' } };"
+                 "var v = { toString: 8, valueOf: function() { return 'V' } };"
+                 "var o = [9]; o.join = function() { return 'O' };"
+                 "var a = [1,2,3,[4,5,6],s,v,o]; a"),
+      njs_str("1,2,3,4,5,6,S,V,O") },
+
+    /* Array.toString(). */
+
+    { njs_str("var a = [1,2,3]; a.join = 'NO';"
+                 "Object.prototype.toString = function () { return 'A' }; a"),
+      njs_str("[object Array]") },
+
+    { njs_str("Array.prototype.toString.call(1)"),
+      njs_str("[object Number]") },
+
+    { njs_str("Array.prototype.toString.call('abc')"),
+      njs_str("[object String]") },
+
+    /* Empty array elements. */
+
+    { njs_str("[,,]"),
+      njs_str(",") },
+
+    { njs_str("[,,,]"),
+      njs_str(",,") },
+
+    { njs_str("[1,2,]"),
+      njs_str("1,2") },
+
+    { njs_str("[1,2,,3]"),
+      njs_str("1,2,,3") },
+
+    { njs_str("[,,].length"),
+      njs_str("2") },
+
+    { njs_str("[,,,].length"),
+      njs_str("3") },
+
+    { njs_str("[1,2,,3].length"),
+      njs_str("4") },
+
+    /**/
+
+    { njs_str("var n = { toString: function() { return 1 } };   [1,2][n]"),
+      njs_str("2") },
+
+    { njs_str("var n = { toString: function() { return '1' } }; [1,2][n]"),
+      njs_str("2") },
+
+    { njs_str("var n = { toString: function() { return 1 },"
+                          " valueOf:  function() { return 0 } };   [1,2][n]"),
+      njs_str("2") },
+
+    { njs_str("var n = { toString: function() { return 1.5 } };"
+                 "var a = [1,2]; a[1.5] = 5; a[n]"),
+      njs_str("5") },
+
+    { njs_str("var n = { toString: function() { return 1.5 } };"
+                 "var a = [1,2]; a[n] = 5; a[1.5]"),
+      njs_str("5") },
+
+    { njs_str("var n = { toString: function() { return '1.5' } };"
+                 "var a = [1,2]; a[1.5] = 5; a[n]"),
+      njs_str("5") },
+
+    { njs_str("var n = { toString: function() { return '1.5' } };"
+                 "var a = [1,2]; a[n] = 5; a[1.5]"),
+      njs_str("5") },
+
+    { njs_str("var n = { toString: function() { return 1.5 } };"
+                 "var a = [1,2]; a[1.5] = 5; n in a"),
+      njs_str("true") },
+
+    { njs_str("var n = { toString: function() { return '1.5' } };"
+                 "var a = [1,2]; a[1.5] = 5; '' + (n in a) + (delete a[n])"),
+      njs_str("truetrue") },
+
+    /**/
+
+    { njs_str("Array.isArray()"),
+      njs_str("false") },
+
+    { njs_str("Array.isArray(1)"),
+      njs_str("false") },
+
+    { njs_str("Array.isArray(1) ? 'true' : 'false'"),
+      njs_str("false") },
+
+    { njs_str("Array.isArray([])"),
+      njs_str("true") },
+
+    { njs_str("Array.isArray([]) ? 'true' : 'false'"),
+      njs_str("true") },
+
+    { njs_str("Array.of()"),
+      njs_str("") },
+
+    { njs_str("Array.of(1,2,3)"),
+      njs_str("1,2,3") },
+
+    { njs_str("Array.of(undefined,1)"),
+      njs_str(",1") },
+
+    { njs_str("Array.of(NaN,-1,{})"),
+      njs_str("NaN,-1,[object Object]") },
+
+    { njs_str("var a = [1,2,3]; a.concat(4, [5, 6, 7], 8)"),
+      njs_str("1,2,3,4,5,6,7,8") },
+
+    { njs_str("var a = []; a[100] = a.length; a[100] +' '+ a.length"),
+      njs_str("0 101") },
+
+    { njs_str("var a = [1,2]; a[100] = 100; a[100] +' '+ a.length"),
+      njs_str("100 101") },
+
+    { njs_str("Array.prototype.slice(1)"),
+      njs_str("") },
+
+    { njs_str("Array.prototype.slice(1,2)"),
+      njs_str("") },
+
+    { njs_str("Array.prototype.slice.call(undefined)"),
+      njs_str("TypeError: cannot convert undefined to object") },
+
+    { njs_str("Array.prototype.slice.call(1)"),
+      njs_str("") },
+
+    { njs_str("Array.prototype.slice.call(false)"),
+      njs_str("") },
+
+    { njs_str("Array.prototype.slice.call({'0':'a', '1':'b', length:1})"),
+      njs_str("a") },
+
+    { njs_str("Array.prototype.slice.call({'0':'a', '1':'b', length:2})"),
+      njs_str("a,b") },
+
+    { njs_str("Array.prototype.slice.call({'0':'a', '1':'b', length:4})"),
+      njs_str("a,b,,") },
+
+    { njs_str("Array.prototype.slice.call({'0':'a', '1':'b', length:2}, 1)"),
+      njs_str("b") },
+
+    { njs_str("Array.prototype.slice.call({'0':'a', '1':'b', length:2}, 1, 2)"),
+      njs_str("b") },
+
+    { njs_str("Array.prototype.slice.call({length:'2'})"),
+      njs_str(",") },
+
+    { njs_str("njs.dump(Array.prototype.slice.call({length: 3, 1: undefined }))"),
+      njs_str("[<empty>,undefined,<empty>]") },
+
+    { njs_str("Array.prototype.slice.call({length:new Number(3)})"),
+      njs_str(",,") },
+
+    { njs_str("Array.prototype.slice.call({length: { valueOf: function() { return 2; } }})"),
+      njs_str(",") },
+
+    { njs_str("Array.prototype.slice.call({ length: Object.create(null) })"),
+      njs_str("TypeError: Cannot convert object to primitive value") },
+
+    { njs_str("Array.prototype.slice.call({length:-1})"),
+      njs_str("") },
+
+    { njs_str("Array.prototype.slice.call('αβZγ')"),
+      njs_str("α,β,Z,γ") },
+
+    { njs_str("Array.prototype.slice.call(String.bytesFrom(Array(16).fill(0x9d)))[0].charCodeAt(0)"),
+      njs_str("157") },
+
+    { njs_str("Array.prototype.slice.call('αβZγ', 1)"),
+      njs_str("β,Z,γ") },
+
+    { njs_str("Array.prototype.slice.call('αβZγ', 2)"),
+      njs_str("Z,γ") },
+
+    { njs_str("Array.prototype.slice.call('αβZγ', 3)"),
+      njs_str("γ") },
+
+    { njs_str("Array.prototype.slice.call('αβZγ', 4)"),
+      njs_str("") },
+
+    { njs_str("Array.prototype.slice.call('αβZγ', 0, 1)"),
+      njs_str("α") },
+
+    { njs_str("Array.prototype.slice.call('αβZγ', 1, 2)"),
+      njs_str("β") },
+
+    { njs_str("Array.prototype.slice.call('αβZγ').length"),
+      njs_str("4") },
+
+    { njs_str("Array.prototype.slice.call('αβZγ')[1].length"),
+      njs_str("1") },
+
+    { njs_str("Array.prototype.slice.call(new String('αβZγ'))"),
+      njs_str("α,β,Z,γ") },
+
+    { njs_str("1..__proto__.length = '2';"
+                 "Array.prototype.slice.call(1, 0, 2)"),
+      njs_str(",") },
+
+    { njs_str("Array.prototype.pop()"),
+      njs_str("undefined") },
+
+    { njs_str("Array.prototype.shift()"),
+      njs_str("undefined") },
+
+    { njs_str("[0,1].slice()"),
+      njs_str("0,1") },
+
+    { njs_str("[0,1].slice(undefined)"),
+      njs_str("0,1") },
+
+    { njs_str("[0,1].slice(undefined, undefined)"),
+      njs_str("0,1") },
+
+    { njs_str("[0,1,2,3,4].slice(1,4)"),
+      njs_str("1,2,3") },
+
+    { njs_str("[0,1,2,3,4].slice(6,7)"),
+      njs_str("") },
+
+    { njs_str("var a = [1,2,3,4,5], b = a.slice(3);"
+                 "b[0] +' '+ b[1] +' '+ b[2]"),
+      njs_str("4 5 undefined") },
+
+    { njs_str("var a = [1,2]; a.pop() +' '+ a.length +' '+ a"),
+      njs_str("2 1 1") },
+
+    { njs_str("var a = [1,2], len = a.push(3); len +' '+ a.pop() +' '+ a"),
+      njs_str("3 3 1,2") },
+
+    { njs_str("var a = [1,2], len = a.push(3,4,5);"
+                 "len +' '+ a.pop() +' '+ a"),
+      njs_str("5 5 1,2,3,4") },
+
+    { njs_str("var a = [1,2,3]; a.shift() +' '+ a[0] +' '+ a.length"),
+      njs_str("1 2 2") },
+
+    { njs_str("var a = [1,2], len = a.unshift(3);"
+                 "len +' '+ a +' '+ a.shift()"),
+      njs_str("3 3,1,2 3") },
+
+    { njs_str("var a = [1,2], len = a.unshift(3,4,5);"
+                 "len +' '+ a +' '+ a.shift()"),
+      njs_str("5 3,4,5,1,2 3") },
+
+    { njs_str("var a=[0], n = 64; while(--n) {a.push(n); a.shift()}; a"),
+      njs_str("1") },
+
+    { njs_str("var a = []; a.splice()"),
+      njs_str("") },
+
+    { njs_str("[].splice(0,5,0)"),
+      njs_str("") },
+
+    { njs_str("[1,2,3,4,5].splice(-2,3,0)"),
+      njs_str("4,5") },
+
+    { njs_str("[].__proto__.splice(0,1,0)"),
+      njs_str("") },
+
+    { njs_str("var a = [];"
+                 "a.splice(9,0,1,2).join(':') + '|' + a"),
+      njs_str("|1,2") },
+
+    { njs_str("var a = [0,1,2,3,4,5,6,7];"
+                 "a.splice(3).join(':') + '|' + a"),
+      njs_str("3:4:5:6:7|0,1,2") },
+
+    { njs_str("var a = [0,1,2,3,4,5,6,7];"
+                 "a.splice(3, 2).join(':') + '|' + a"),
+      njs_str("3:4|0,1,2,5,6,7") },
+
+    { njs_str("var a = [0,1,2,3,4,5,6,7];"
+                 "a.splice(3, 2, 8, 9, 10, 11 ).join(':') + '|' + a"),
+      njs_str("3:4|0,1,2,8,9,10,11,5,6,7") },
+
+    { njs_str("var a = []; a.reverse()"),
+      njs_str("") },
+
+    { njs_str("var a = [1]; a.reverse()"),
+      njs_str("1") },
+
+    { njs_str("var a = [1,2]; a.reverse()"),
+      njs_str("2,1") },
+
+    { njs_str("var a = [1,2,3]; a.reverse()"),
+      njs_str("3,2,1") },
+
+    { njs_str("var a = [1,2,3,4]; a.reverse()"),
+      njs_str("4,3,2,1") },
+
+    { njs_str("var a = [1,2,3,4]; a.indexOf()"),
+      njs_str("-1") },
+
+    { njs_str("var a = [1,2,3,4]; a.indexOf(5)"),
+      njs_str("-1") },
+
+    { njs_str("var a = [1,2,3,4]; a.indexOf(4, 3)"),
+      njs_str("3") },
+
+    { njs_str("var a = [1,2,3,4]; a.indexOf(4, 4)"),
+      njs_str("-1") },
+
+    { njs_str("var a = [1,2,3,4,3,4]; a.indexOf(3, '2')"),
+      njs_str("2") },
+
+    { njs_str("var a = [1,2,3,4,3,4]; a.indexOf(4, -1)"),
+      njs_str("5") },
+
+    { njs_str("var a = [1,2,3,4,3,4]; a.indexOf(3, -10)"),
+      njs_str("2") },
+
+    { njs_str("[].indexOf.bind(0)(0, 0)"),
+      njs_str("-1") },
+
+    { njs_str("[].lastIndexOf(1, -1)"),
+      njs_str("-1") },
+
+    { njs_str("[undefined].lastIndexOf()"),
+      njs_str("0") },
+
+    { njs_str("[undefined].lastIndexOf(undefined)"),
+      njs_str("0") },
+
+    { njs_str("var a = [1,2,3,4]; a.lastIndexOf()"),
+      njs_str("-1") },
+
+    { njs_str("var a = [1,2,3,4]; a.lastIndexOf(5)"),
+      njs_str("-1") },
+
+    { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(1, 0)"),
+      njs_str("0") },
+
+    { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, '2')"),
+      njs_str("2") },
+
+    { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(1, 6)"),
+      njs_str("0") },
+
+    { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(2, 6)"),
+      njs_str("1") },
+
+    { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(4, -1)"),
+      njs_str("5") },
+
+    { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(4, -6)"),
+      njs_str("-1") },
+
+    { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, -10)"),
+      njs_str("-1") },
+
+    { njs_str("[1,2,1].lastIndexOf(2,undefined)"),
+      njs_str("-1") },
+
+    { njs_str("[1,2,1].lastIndexOf(1,undefined)"),
+      njs_str("0") },
+
+    { njs_str("[1,2,1].lastIndexOf(1)"),
+      njs_str("2") },
+
+    { njs_str("[1,2,3,4].includes()"),
+      njs_str("false") },
+
+    { njs_str("[1,2,3,4].includes(5)"),
+      njs_str("false") },
+
+    { njs_str("[1,2,3,4].includes(4, 3)"),
+      njs_str("true") },
+
+    { njs_str("[1,2,3,4].includes(4, 4)"),
+      njs_str("false") },
+
+    { njs_str("[1,2,3,4,3,4].includes(3, '2')"),
+      njs_str("true") },
+
+    { njs_str("[1,2,3,4,3,4].includes(4, -1)"),
+      njs_str("true") },
+
+    { njs_str("[1,2,3,4,3,4].includes(3, -10)"),
+      njs_str("true") },
+
+    { njs_str("[1,2,3,NaN,3,4].includes(NaN)"),
+      njs_str("true") },
+
+    { njs_str("[1,2,3,4,5].includes(NaN)"),
+      njs_str("false") },
+
+    { njs_str("[].includes.bind(0)(0, 0)"),
+      njs_str("false") },
+
+    { njs_str("var a = []; var s = { sum: 0 };"
+                 "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
+      njs_str("0") },
+
+    { njs_str("var a = new Array(3); var s = { sum: 0 };"
+                 "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
+      njs_str("0") },
+
+    { njs_str("var a = [,,,]; var s = { sum: 0 };"
+                 "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
+      njs_str("0") },
+
+    { njs_str("var a = [1,2,3]; var s = { sum: 0 };"
+                 "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
+      njs_str("6") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.forEach(function(v, i, a) { a[i+3] = a.length }); a"),
+      njs_str("1,2,3,3,4,5") },
+
+    { njs_str("function f() { var c; [1].forEach(function(v) { c })}; f()"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [1,2,3]; var s = { sum: 0 };"
+                 "[].forEach.call(a, function(v, i, a) { this.sum += v }, s);"
+                 "s.sum"),
+      njs_str("6") },
+
+    { njs_str("var a = [1,2,3]; var s = { sum: 0 };"
+                 "[].forEach.apply(a,"
+                                  "[ function(v, i, a) { this.sum += v }, s ]);"
+                 "s.sum"),
+      njs_str("6") },
+
+    { njs_str("var a = []; var c = 0;"
+                 "a.forEach(function(v, i, a) { c++ }); c"),
+      njs_str("0") },
+
+    { njs_str("var a = [,,,,]; var c = 0;"
+                 "a.forEach(function(v, i, a) { c++ }); c"),
+      njs_str("0") },
+
+    { njs_str("var a = [];"
+                 "a.some(function(v, i, a) { return v > 1 })"),
+      njs_str("false") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.some(function(v, i, a) { return v > 1 })"),
+      njs_str("true") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.some(function(v, i, a) { return v > 2 })"),
+      njs_str("true") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.some(function(v, i, a) { return v > 3 })"),
+      njs_str("false") },
+
+    { njs_str("var a = [];"
+                 "a.every(function(v, i, a) { return v > 1 })"),
+      njs_str("true") },
+
+    { njs_str("var a = [3,2,1];"
+                 "a.every(function(v, i, a) { return v > 3 })"),
+      njs_str("false") },
+
+    { njs_str("var a = [3,2,1];"
+                 "a.every(function(v, i, a) { return v > 2 })"),
+      njs_str("false") },
+
+    { njs_str("var a = [3,2,1];"
+                 "a.every(function(v, i, a) { return v > 0 })"),
+      njs_str("true") },
+
+    { njs_str("[].fill(1);"),
+      njs_str("") },
+
+    { njs_str("[1,2,3].fill(5);"),
+      njs_str("5,5,5") },
+
+    { njs_str("[1,2,3].fill(5, 0);"),
+      njs_str("5,5,5") },
+
+    { njs_str("[1,2,3].fill(5, 1);"),
+      njs_str("1,5,5") },
+
+    { njs_str("[1,2,3].fill(5, 4);"),
+      njs_str("1,2,3") },
+
+    { njs_str("[1,2,3].fill(5, -2);"),
+      njs_str("1,5,5") },
+
+    { njs_str("[1,2,3].fill(5, -3);"),
+      njs_str("5,5,5") },
+
+    { njs_str("[1,2,3].fill(5, -4);"),
+      njs_str("5,5,5") },
+
+    { njs_str("[1,2,3].fill(5, 1, 0);"),
+      njs_str("1,2,3") },
+
+    { njs_str("[1,2,3].fill(5, 1, 1);"),
+      njs_str("1,2,3") },
+
+    { njs_str("[1,2,3].fill(5, 1, 2);"),
+      njs_str("1,5,3") },
+
+    { njs_str("[1,2,3].fill(5, 1, 3);"),
+      njs_str("1,5,5") },
+
+    { njs_str("[1,2,3].fill(5, 1, 4);"),
+      njs_str("1,5,5") },
+
+    { njs_str("[1,2,3].fill(5, 1, -1);"),
+      njs_str("1,5,3") },
+
+    { njs_str("[1,2,3].fill(5, 1, -3);"),
+      njs_str("1,2,3") },
+
+    { njs_str("[1,2,3].fill(5, 1, -4);"),
+      njs_str("1,2,3") },
+
+    { njs_str("[1,2,3].fill(\"a\", 1, 2);"),
+      njs_str("1,a,3") },
+
+    { njs_str("[1,2,3].fill({a:\"b\"}, 1, 2);"),
+      njs_str("1,[object Object],3") },
+
+    { njs_str("Array(3).fill().reduce(function(a, x)"
+                                 "{ return a + (x === undefined); }, 0)"),
+      njs_str("3") },
+
+    { njs_str("var a = Array.prototype.fill.apply("
+                 "Object({length: 40}), [\"a\", 1, 20]); Object.values(a)"),
+      njs_str("a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,40,a,a,a,a") },
+
+    { njs_str("var a = Array.prototype.fill.apply({length: "
+                 "{ valueOf: function() { return 40 }}}, [\"a\", 1, 20]);"
+                 "Object.values(a)"),
+      njs_str("a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,[object Object],a,a,a,a") },
+
+    { njs_str("[NaN, false, ''].map("
+                 "(x) => Array.prototype.fill.call(x)"
+                 ").every((x) => typeof x == 'object')"),
+      njs_str("true") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'length', {get:()=>2}); "
+                 "Array.prototype.slice.call(Array.prototype.fill.call(o, 1))"),
+      njs_str("1,1") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'length', {get:()=> {throw TypeError('Boom')}}); "
+                 "Array.prototype.fill.call(o, 1)"),
+      njs_str("TypeError: Boom") },
+
+    { njs_str("var o = Object({length: 3});"
+                 "Object.defineProperty(o, '0', {set: ()=>{throw TypeError('Boom')}});"
+                 "Array.prototype.fill.call(o, 1)"),
+      njs_str("TypeError: Boom") },
+
+    { njs_str("var o = Object({length: 3});"
+                 "Object.defineProperty(o, '0', {set: function(v){this.a = 2 * v}});"
+                 "Array.prototype.fill.call(o, 2).a"),
+      njs_str("4") },
+
+    { njs_str("var o = Object({length: 3});"
+                 "Object.defineProperty(o, '0', {set: function(v){this[0] = 2 * v}});"
+                 "Array.prototype.fill.call(o, 2)"),
+      njs_str("RangeError: Maximum call stack size exceeded") },
+
+    { njs_str("var a = [];"
+                 "a.filter(function(v, i, a) { return v > 1 })"),
+      njs_str("") },
+
+    { njs_str("var a = [1,2,3,-1,5];"
+                 "a.filter(function(v, i, a) { return v > 1 })"),
+      njs_str("2,3,5") },
+
+    { njs_str("var a = [1,2,3,4,5,6,7,8];"
+                 "a.filter(function(v, i, a) { a.pop(); return v > 1 })"),
+      njs_str("2,3,4") },
+
+    { njs_str("var a = [1,2,3,4,5,6,7,8];"
+                 "a.filter(function(v, i, a) { a.shift(); return v > 1 })"),
+      njs_str("3,5,7") },
+
+    { njs_str("var a = [1,2,3,4,5,6,7];"
+                 "a.filter(function(v, i, a) { a.pop(); return v > 1 })"),
+      njs_str("2,3,4") },
+
+    { njs_str("var a = [1,2,3,4,5,6,7];"
+                 "a.filter(function(v, i, a) { a.shift(); return v > 1 })"),
+      njs_str("3,5,7") },
+
+    { njs_str("var a = [1,2,3,4,5,6,7];"
+                 "a.filter(function(v, i, a) { a[i] = v + 1; return true })"),
+      njs_str("1,2,3,4,5,6,7") },
+
+    { njs_str("var a = [1,2,3,4,5,6,7];"
+                 "a.filter(function(v, i, a) { a[i+1] = v+10; return true })"),
+      njs_str("1,11,21,31,41,51,61") },
+
+    { njs_str("var a = [];"
+                 "a.find(function(v, i, a) { return v > 1 })"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [,NaN,0,-1];"
+                 "a.find(function(v, i, a) { return v > 1 })"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [,NaN,0,-1,2];"
+                 "a.find(function(v, i, a) { return v > 1 })"),
+      njs_str("2") },
+
+    { njs_str("var a = [1,2,3,-1,5];"
+                 "a.find(function(v, i, a) { return v > 1 })"),
+      njs_str("2") },
+
+    { njs_str("var a = [,1,,-1,5];"
+                 "a.find(function(v, i, a) { return v > 1 })"),
+      njs_str("5") },
+
+    { njs_str("var a = [,1,,-1,5,6];"
+                 "a.find(function(v, i, a) { return v > 1 })"),
+      njs_str("5") },
+
+    { njs_str("[].find(function(v) { return (v === undefined) })"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [,3];"
+                 "a.find(function(v) { return (v === 3 || v === undefined) })"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [1,,3];"
+                 "a.find(function(v) { return (v === 3 || v === undefined) })"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [1,2,3,4,5,6];"
+                 "a.find(function(v, i, a) { a.shift(); return v == 3 })"),
+      njs_str("3") },
+
+    { njs_str("var a = [1,2,3,4,5,6];"
+                 "a.find(function(v, i, a) { a.shift(); return v == 4 })"),
+      njs_str("undefined") },
+
+    { njs_str("var a = [];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+      njs_str("-1") },
+
+    { njs_str("var a = [,NaN,0,-1];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+      njs_str("-1") },
+
+    { njs_str("var a = [,NaN,0,-1,2];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+     njs_str("4") },
+
+    { njs_str("var a = [1,2,3,-1,5];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+      njs_str("1") },
+
+    { njs_str("var a = [,1,,-1,5];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+      njs_str("4") },
+
+    { njs_str("var a = [,1,,-1,5,6];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+      njs_str("4") },
+
+    { njs_str("[].findIndex(function(v) { return (v === undefined) })"),
+      njs_str("-1") },
+
+    { njs_str("[,].findIndex(function(v) { return (v === undefined) })"),
+      njs_str("0") },
+
+    { njs_str("[1,2,,3].findIndex(function(el){return el === undefined})"),
+      njs_str("2") },
+
+    { njs_str("[,2,,3].findIndex(function(el){return el === undefined})"),
+      njs_str("0") },
+
+    { njs_str("var a = [1,2,3,4,5,6];"
+                 "a.findIndex(function(v, i, a) { a.shift(); return v == 3 })"),
+      njs_str("1") },
+
+    { njs_str("var a = [1,2,3,4,5,6];"
+                 "a.findIndex(function(v, i, a) { a.shift(); return v == 4 })"),
+      njs_str("-1") },
+
+    { njs_str("var a = [];"
+                 "a.map(function(v, i, a) { return v + 1 })"),
+      njs_str("") },
+
+    { njs_str("var a = [,,,];"
+                 "a.map(function(v, i, a) { return v + 1 })"),
+      njs_str(",,") },
+
+    { njs_str("var a = [,,,1];"
+                 "a.map(function(v, i, a) { return v + 1 })"),
+      njs_str(",,,2") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.map(function(v, i, a) { return v + 1 })"),
+      njs_str("2,3,4") },
+
+    { njs_str("var a = [1,2,3,4,5,6];"
+                 "a.map(function(v, i, a) { a.pop(); return v + 1 })"),
+      njs_str("2,3,4,,,") },
+
+    { njs_str("var a = [1,2,3,4,5,6];"
+                 "a.map(function(v, i, a) { a.shift(); return v + 1 })"),
+      njs_str("2,4,6,,,") },
+
+    { njs_str("var a = [];"
+                 "a.reduce(function(p, v, i, a) { return p + v })"),
+      njs_str("TypeError: invalid index") },
+
+    { njs_str("var a = [];"
+                 "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
+      njs_str("10") },
+
+    { njs_str("var a = [,,];"
+                 "a.reduce(function(p, v, i, a) { return p + v })"),
+      njs_str("TypeError: invalid index") },
+
+    { njs_str("var a = [,,];"
+                 "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
+      njs_str("10") },
+
+    { njs_str("var a = [1];"
+                 "a.reduce(function(p, v, i, a) { return p + v })"),
+      njs_str("1") },
+
+    { njs_str("var a = [1];"
+                 "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
+      njs_str("11") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.reduce(function(p, v, i, a) { return p + v })"),
+      njs_str("6") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
+      njs_str("16") },
+
+    { njs_str("[[0, 1], [2, 3], [4, 5]].reduce(function(a, b)"
+                 "                         { return a.concat(b) }, [])"),
+      njs_str("0,1,2,3,4,5") },
+
+    { njs_str("var a = [];"
+                 "a.reduceRight(function(p, v, i, a) { return p + v })"),
+      njs_str("TypeError: invalid index") },
+
+    { njs_str("var a = [];"
+                 "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
+      njs_str("10") },
+
+    { njs_str("var a = [,,];"
+                 "a.reduceRight(function(p, v, i, a) { return p + v })"),
+      njs_str("TypeError: invalid index") },
+
+    { njs_str("var a = [,,];"
+                 "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
+      njs_str("10") },
+
+    { njs_str("var a = [1];"
+                 "a.reduceRight(function(p, v, i, a) { return p + v })"),
+      njs_str("1") },
+
+    { njs_str("var a = [1];"
+                 "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
+      njs_str("11") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.reduceRight(function(p, v, i, a) { return p + v })"),
+      njs_str("6") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
+      njs_str("16") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.reduceRight(function(p, v, i, a)"
+                 "              { a.shift(); return p + v })"),
+      njs_str("7") },
+
+    { njs_str("var a = [1,2,3];"
+                 "a.reduceRight(function(p, v, i, a)"
+                 "              { a.shift(); return p + v }, 10)"),
+      njs_str("19") },
+
+    { njs_str("var a = ['1','2','3','4','5','6']; a.sort()"),
+      njs_str("1,2,3,4,5,6") },
+
+    { njs_str("var o = { toString: function() { return 5 } };"
+                 "var a = [6,o,4,3,2,1]; a.sort()"),
+      njs_str("1,2,3,4,5,6") },
+
+    { njs_str("var a = [1,2,3,4,5,6];"
+                 "a.sort(function(x, y) { return x - y })"),
+      njs_str("1,2,3,4,5,6") },
+
+    { njs_str("var a = [6,5,4,3,2,1];"
+                 "a.sort(function(x, y) { return x - y })"),
+      njs_str("1,2,3,4,5,6") },
+
+    { njs_str("var a = [2,2,2,1,1,1];"
+                 "a.sort(function(x, y) { return x - y })"),
+      njs_str("1,1,1,2,2,2") },
+
+    { njs_str("var a = [,,,2,2,2,1,1,1];"
+                 "a.sort(function(x, y) { return x - y })"),
+      njs_str("1,1,1,2,2,2,,,") },
+
+    { njs_str("var a = [,,,,];"
+                 "a.sort(function(x, y) { return x - y })"),
+      njs_str(",,,") },
+
+    { njs_str("var a = [1,,];"
+                 "a.sort(function(x, y) { return x - y })"),
+      njs_str("1,") },
+
+    /* Template literal. */
+
+    { njs_str("`"),
+      njs_str("SyntaxError: Unterminated template literal in 1") },
+
+    { njs_str("`$"),
+      njs_str("SyntaxError: Unterminated template literal in 1") },
+
+    { njs_str("`${"),
+      njs_str("SyntaxError: Unexpected end of input in 1") },
+
+    { njs_str("`${a"),
+      njs_str("SyntaxError: Missing \"}\" in template expression in 1") },
+
+    { njs_str("`${}"),
+      njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+    { njs_str("`${a}"),
+      njs_str("SyntaxError: Unterminated template literal in 1") },
+
+    { njs_str("`${a}bc"),
+      njs_str("SyntaxError: Unterminated template literal in 1") },
+
+    { njs_str("`\\"),
+      njs_str("SyntaxError: Unterminated template literal in 1") },
+
+    { njs_str("`\\${a}bc"),
+      njs_str("SyntaxError: Unterminated template literal in 1") },
+
+    { njs_str("`text1\ntext2`;"),
+      njs_str("text1\ntext2") },
+
+    { njs_str("var o = 1; `o = \\`${o}\\``"),
+      njs_str("o = `1`") },
+
+    { njs_str("`\\unicode`"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\unicode\" in 1") },
+
+    { njs_str("var a = 5; var b = 10;"
+                 "`Fifteen is ${a + b} and \nnot ${2 * a + b}.`;"),
+      njs_str("Fifteen is 15 and \nnot 20.") },
+
+    { njs_str("var s = `1undefined`; s;"),
+      njs_str("1undefined") },
+
+    { njs_str("var s = '0'; s = `x${s += '1'}`;"),
+      njs_str("x01") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+                 "var something = 'test'; var one = 1; var two = 2;"
+                 "`[${d.toISOString()}] the message contents ${something} ${one + two}`"),
+      njs_str("[2011-06-24T18:45:12.625Z] the message contents test 3") },
+
+    { njs_str("function isLargeScreen() { return false; }"
+                 "var item = { isCollapsed: true };"
+                 "`header ${ isLargeScreen() ? '' : `icon-${item.isCollapsed ? 'expander' : 'collapser'}` }`;"),
+      njs_str("header icon-expander") },
+
+    { njs_str("function foo(strings, person, age) { return `${strings[0]}${strings[1]}${person}${age}` };"
+                 "var person = 'Mike'; var age = 21;"
+                 "foo`That ${person} is a ${age}`;"),
+      njs_str("That  is a Mike21") },
+
+    /* Strings. */
+
+    { njs_str("var a = '0123456789' + '012345';"
+                 "var b = 'abcdefghij' + 'klmnop';"
+                 "    a = b"),
+      njs_str("abcdefghijklmnop") },
+
+    { njs_str("String.prototype.my = function f() {return 7}; 'a'.my()"),
+      njs_str("7") },
+
+    { njs_str("'a'.my"),
+      njs_str("undefined") },
+
+    { njs_str("var a = '123'\n[2].toString();a"),
+      njs_str("3") },
+
+    { njs_str("'\xE5\x96\x9C\xE3\x81\xB6'"),
+      njs_str("喜ぶ") },
+
+    /* Broken UTF-8 literals.*/
+
+    { njs_str("'\x96\xE5\x9C\xE3\x81\xB6'"),
+      njs_str("��ぶ") },
+
+    { njs_str("'\x96\xE5\x9C'"),
+      njs_str("��") },
+
+    { njs_str("'\x96\xE5'"),
+      njs_str("��") },
+
+    { njs_str("'\x96'"),
+      njs_str("�") },
+
+    { njs_str("'\xF3'"),
+      njs_str("�") },
+
+    { njs_str("'\xF3\xFF'"),
+      njs_str("��") },
+
+    { njs_str("'\x96\x96\xE5\x9C\xE3\x81\xB6'"),
+      njs_str("���ぶ") },
+
+    { njs_str("'\x9C\x96\xE5\xE3\x81\xB6'"),
+      njs_str("���ぶ") },
+
+    { njs_str("'\xE5\x9C\xE3\x81\xB6'"),
+      njs_str("�ぶ") },
+
+    { njs_str("'\xEF\xBF\xBD\xE3\x81\xB6'"),
+      njs_str("�ぶ") },
+
+    { njs_str("'\xE5\xF6\x9C\xE3\x81\xB6'"),
+      njs_str("���ぶ") },
+
+    { njs_str("var a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xF3'; "
+                 "[a.length, a[33], a[34]]"),
+      njs_str("35,a,�") },
+
+    /* Escape strings. */
+
+    { njs_str("'\\a \\' \\\" \\\\ \\0 \\b \\f \\n \\r \\t \\v'"),
+      njs_str("a ' \" \\ \0 \b \f \n \r \t \v") },
+
+    { njs_str("'\\\n'"),
+      njs_str("") },
+
+    { njs_str("'\\\r'"),
+      njs_str("") },
+
+    { njs_str("'\\\r\n'"),
+      njs_str("") },
+
+    { njs_str("'a\\\nb'"),
+      njs_str("ab") },
+
+    { njs_str("'a\\\rb'"),
+      njs_str("ab") },
+
+    { njs_str("'a\\\r\nb'"),
+      njs_str("ab") },
+
+    { njs_str("'a\\\n\rb'"),
+      njs_str("SyntaxError: Unterminated string \"'a\\\n\r\" in 1") },
+
+    { njs_str("'a\\\nb\nc'"),
+      njs_str("SyntaxError: Unterminated string \"'a\\\nb\n\" in 1") },
+
+    { njs_str("'abcde"),
+      njs_str("SyntaxError: Unterminated string \"'abcde\" in 1") },
+
+    { njs_str("'\\"),
+      njs_str("SyntaxError: Unterminated string \"'\\\" in 1") },
+
+    { njs_str("'\\\r\n"),
+      njs_str("SyntaxError: Unterminated string \"'\\\r\n\" in 1") },
+
+    { njs_str("'\\'"),
+      njs_str("SyntaxError: Unterminated string \"'\\'\" in 1") },
+
+    { njs_str("'a\n"),
+      njs_str("SyntaxError: Unterminated string \"'a\n\" in 1") },
+
+    { njs_str("'a\r"),
+      njs_str("SyntaxError: Unterminated string \"'a\r\" in 1") },
+
+    { njs_str("\"a\n"),
+      njs_str("SyntaxError: Unterminated string \"\"a\n\" in 1") },
+
+    { njs_str("'\\u03B1'"),
+      njs_str("α") },
+
+    { njs_str("'\\u'"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
+
+    { njs_str("'\\uzzzz'"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\uzzzz\" in 1") },
+
+    { njs_str("'\\u03B'"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\u03B\" in 1") },
+
+    { njs_str("'\\u03BG'"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\u03BG\" in 1") },
+
+    { njs_str("'\\u03B '"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\u03B \" in 1") },
+
+    { njs_str("'\\u{61}\\u{3B1}\\u{20AC}'"),
+      njs_str("aα€") },
+
+    { njs_str("'\\u'"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
+
+    { njs_str("'\\u{'"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\u{\" in 1") },
+
+    { njs_str("'\\u{}'"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\u{}\" in 1") },
+
+    { njs_str("'\\u{1234567}'"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\u{1234567}\" in 1") },
+
+    { njs_str("'\\u{a00000}'"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\u{a00000}\" in 1") },
+
+    { njs_str("'\\x61'"),
+      njs_str("a") },
+
+    { njs_str("''.length"),
+      njs_str("0") },
+
+    { njs_str("'abc'.length"),
+      njs_str("3") },
+
+    { njs_str("'привет\\n'.length"),
+      njs_str("7") },
+
+    { njs_str("'привет\\n\\u{61}\\u{3B1}\\u{20AC}'.length"),
+      njs_str("10") },
+
+    { njs_str("'\\ud83d\\udc4d'"),
+      njs_str("\xf0\x9f\x91\x8d") },
+
+    { njs_str("'\\ud83d\\udc4d'.length"),
+      njs_str("1") },
+
+    { njs_str("'\\ud83d abc \\udc4d'"),
+      njs_str("� abc �") },
+
+    { njs_str("'\\ud83d'"),
+      njs_str("�") },
+
+    { njs_str("'\\ud83d\\uabcd'"),
+      njs_str("�ꯍ") },
+
+    { njs_str("'\\u{d800}\\u{dB00}'"),
+      njs_str("��") },
+
+    { njs_str("'\\u{d800}\\u{d7ff}'"),
+      njs_str("�퟿") },
+
+    { njs_str("'\\u{d800}['"),
+      njs_str("�[") },
+
+    { njs_str("'\\u{D800}\\u{'"),
+      njs_str("SyntaxError: Invalid Unicode code point \"\\u{D800}\\u{\" in 1") },
+
+    { njs_str("'α' !== '\\α'"),
+      njs_str("false") },
+
+    { njs_str("'r' !== '\\r'"),
+      njs_str("true") },
+
+    /* Broken UTF-8 literals.*/
+
+    { njs_str("'\\a\x96\xE5\x9C\xE3\x81\xB6'"),
+      njs_str("a��ぶ") },
+
+    { njs_str("'\x96\\a\xE5\x9C'"),
+      njs_str("�a�") },
+
+    { njs_str("'\x96\xE5\\a'"),
+      njs_str("��a") },
+
+    { njs_str("'\\a\x96\\a'"),
+      njs_str("a�a") },
+
+    { njs_str("'\xF3\\a'"),
+      njs_str("�a") },
+
+    { njs_str("'\xF3\\a\xFF'"),
+      njs_str("�a�") },
+
+    { njs_str("'\\a\x96\x96\xE5\x9C\xE3\x81\xB6'"),
+      njs_str("a���ぶ") },
+
+    { njs_str("'\\a\x9C\x96\xE5\xE3\x81\xB6'"),
+      njs_str("a���ぶ") },
+
+    { njs_str("'\\a\xE5\x9C\xE3\x81\xB6'"),
+      njs_str("a�ぶ") },
+
+    { njs_str("'\\a\xEF\xBF\xBD\xE3\x81\xB6'"),
+      njs_str("a�ぶ") },
+
+    { njs_str("'\\a\xE5\xF6\x9C\xE3\x81\xB6'"),
+      njs_str("a���ぶ") },
+
+    { njs_str("var a = '\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xF3'; "
+                 "[a.length, a[34], a[35]]"),
+      njs_str("36,a,�") },
+
+    { njs_str("''.hasOwnProperty('length')"),
+      njs_str("true") },
+
+    { njs_str("'abc'.hasOwnProperty('length')"),
+      njs_str("true") },
+
+    { njs_str("(new String('abc')).hasOwnProperty('length')"),
+      njs_str("true") },
+
+    { njs_str("'abc'.toUTF8().length"),
+      njs_str("3") },
+
+    { njs_str("'абв'.length"),
+      njs_str("3") },
+
+    { njs_str("'абв'.toUTF8().length"),
+      njs_str("6") },
+
+    { njs_str("'αβγ'.length"),
+      njs_str("3") },
+
+    { njs_str("'αβγ'.toUTF8().length"),
+      njs_str("6") },
+
+    { njs_str("'絵文字'.length"),
+      njs_str("3") },
+
+    { njs_str("'絵文字'.toUTF8().length"),
+      njs_str("9") },
+
+    { njs_str("'えもじ'.length"),
+      njs_str("3") },
+
+    { njs_str("'えもじ'.toUTF8().length"),
+      njs_str("9") },
+
+    { njs_str("'囲碁織'.length"),
+      njs_str("3") },
+
+    { njs_str("'囲碁織'.toUTF8().length"),
+      njs_str("9") },
+
+    { njs_str("var a = 'abc'; a.length"),
+      njs_str("3") },
+
+    { njs_str("var a = 'abc'; a['length']"),
+      njs_str("3") },
+
+    { njs_str("var a = 'абв'; a.length"),
+      njs_str("3") },
+
+    { njs_str("var a = 'abc' + 'абв'; a.length"),
+      njs_str("6") },
+
+    { njs_str("var a = 'abc' + 1 + 'абв'; a +' '+ a.length"),
+      njs_str("abc1абв 7") },
+
+    { njs_str("var a = 1; a.length"),
+      njs_str("undefined") },
+
+    { njs_str("var a = 'abc'; a.concat('абв', 123)"),
+      njs_str("abcабв123") },
+
+    { njs_str("''.concat.call(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)"),
+      njs_str("0123456789") },
+
+    { njs_str("''.concat.apply(0, [1, 2, 3, 4, 5, 6, 7, 8, 9])"),
+      njs_str("0123456789") },
+
+    { njs_str("var f = ''.concat.bind(0, 1, 2, 3, 4); f(5, 6, 7, 8, 9)"),
+      njs_str("0123456789") },
+
+    { njs_str("var f = ''.concat.bind(0, 1, 2, 3, 4); f(Math.sqrt(25))"),
+      njs_str("012345") },
+
+    { njs_str("var f = String.prototype.concat.bind(0, 1); f(2)"),
+      njs_str("012") },
+
+    { njs_str("var f = Function.prototype.call.bind"
+                 "                            (String.prototype.concat, 0, 1);"
+                 "f(2)"),
+      njs_str("012") },
+
+    { njs_str("var f = String.prototype.concat.bind(0, 1);"
+                 "var o = { toString: f }; o"),
+      njs_str("01") },
+
+    { njs_str("''.concat.bind(0, 1, 2, 3, 4).call(5, 6, 7, 8, 9)"),
+      njs_str("012346789") },
+
+    { njs_str("''.concat.bind(0, 1, 2, 3, 4).apply(5,[6, 7, 8, 9])"),
+      njs_str("012346789") },
+
+    { njs_str("var f = Array.prototype.join.bind([0, 1, 2]); f()"),
+      njs_str("0,1,2") },
+
+    { njs_str("var f = Array.prototype.join.bind([0, 1, 2]);"
+                 "var o = { toString: f }; o"),
+      njs_str("0,1,2") },
+
+    { njs_str("var f = Array.prototype.join.bind([0, 1, 2]); f('.')"),
+      njs_str("0.1.2") },
+
+    { njs_str("var f = Array.prototype.join.bind([0, 1, 2], '.');"
+                 "var o = { toString: f }; o"),
+      njs_str("0.1.2") },
+
+    { njs_str("var f = Array.prototype.toString.bind([0, 1, 2]); f()"),
+      njs_str("0,1,2") },
+
+    { njs_str("var f = Array.prototype.toString.bind([0, 1, 2]);"
+                 "var o = { toString: f }; o"),
+      njs_str("0,1,2") },
+
+    { njs_str("var s = { toString: function() { return '123' } };"
+                 "var a = 'abc'; a.concat('абв', s)"),
+      njs_str("abcабв123") },
+
+    { njs_str("'\\u00CE\\u00B1'.toBytes() == 'α'"),
+      njs_str("true") },
+
+    { njs_str("'\\u00CE\\u00B1'.toBytes() === 'α'"),
+      njs_str("true") },
+
+    { njs_str("var b = '\\u00C2\\u00B6'.toBytes(), u = b.fromUTF8();"
+                 "b.length +' '+ b +' '+ u.length +' '+ u"),
+      njs_str("2 ¶ 1 ¶") },
+
+    { njs_str("'α'.toBytes()"),
+      njs_str("null") },
+
+    { njs_str("'α'.toUTF8()[0]"),
+      njs_str("\xCE") },
+
+    { njs_str("var r = /^\\x80$/; r.source + r.source.length"),
+      njs_str("^\\x80$6") },
+
+    { njs_str("var r = /^\\\\x80$/; r.source + r.source.length"),
+      njs_str("^\\\\x80$7") },
+
+    { njs_str("/^\\x80$/.test('\\x80'.toBytes())"),
+      njs_str("true") },
+
+    { njs_str("/^\\xC2\\x80$/.test('\\x80'.toUTF8())"),
+      njs_str("true") },
+
+    { njs_str("'α'.toUTF8().toBytes()"),
+      njs_str("α") },
+
+    { njs_str("var a = 'a'.toBytes() + 'α'; a + a.length"),
+      njs_str("aα3") },
+
+    { njs_str("var a = 'µ§±®'.toBytes(); a"),
+      njs_str("\xB5\xA7\xB1\xAE") },
+
+    { njs_str("var a = 'µ§±®'.toBytes(2); a"),
+      njs_str("\xB1\xAE") },
+
+    { njs_str("var a = 'µ§±®'.toBytes(1,3); a"),
+      njs_str("\xA7\xB1") },
+
+    { njs_str("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes()"),
+      njs_str("µ§±®") },
+
+    { njs_str("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(2)"),
+      njs_str("±®") },
+
+    { njs_str("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(1, 3)"),
+      njs_str("§±") },
+
+    { njs_str("'A'.repeat(8).toBytes() === 'A'.repeat(8)"),
+      njs_str("true") },
+
+    { njs_str("'A'.repeat(16).toBytes() === 'A'.repeat(16)"),
+      njs_str("true") },
+
+    { njs_str("'A'.repeat(38).toBytes(-5) === 'AAAAA'"),
+      njs_str("true") },
+
+    { njs_str("('α' + 'A'.repeat(32)).toBytes()"),
+      njs_str("null") },
+
+    { njs_str("('α' + 'A'.repeat(32)).toBytes(1) === 'A'.repeat(32)"),
+      njs_str("true") },
+
+    { njs_str("('α' + 'A'.repeat(40)).toBytes(-3,-1)"),
+      njs_str("AA") },
+
+    { njs_str("var s = 'x'.repeat(2**10).repeat(2**14);"
+                 "var a = Array(200).fill(s);"
+                 "String.prototype.concat.apply(s, a.slice(1))"),
+      njs_str("RangeError: invalid string length") },
+
+    { njs_str("var a = 'abcdefgh'; a.substr(3, 15)"),
+      njs_str("defgh") },
+
+    { njs_str("'abcdefgh'.substr(3, 15)"),
+      njs_str("defgh") },
+
+    { njs_str("'abcdefghijklmno'.substr(3, 4)"),
+      njs_str("defg") },
+
+    { njs_str("'abcdefghijklmno'.substr(-3, 2)"),
+      njs_str("mn") },
+
+    { njs_str("'abcdefgh'.substr(100, 120)"),
+      njs_str("") },
+
+    { njs_str("('abc' + 'defgh').substr(1, 4)"),
+      njs_str("bcde") },
+
+    { njs_str("'abcdefghijklmno'.substring(3, 5)"),
+      njs_str("de") },
+
+    { njs_str("'abcdefgh'.substring(3)"),
+      njs_str("defgh") },
+
+    { njs_str("'abcdefgh'.substring(5, 3)"),
+      njs_str("de") },
+
+    { njs_str("'abcdefgh'.substring(100, 120)"),
+      njs_str("") },
+
+    { njs_str("'α'.repeat(32).substring(32)"),
+      njs_str("") },
+
+    { njs_str("'α'.repeat(32).substring(32,32)"),
+      njs_str("") },
+
+    { njs_str("'abcdefghijklmno'.slice(NaN, 5)"),
+      njs_str("abcde") },
+
+    { njs_str("'abcdefghijklmno'.slice(NaN, Infinity)"),
+      njs_str("abcdefghijklmno") },
+
+    { njs_str("'abcdefghijklmno'.slice(-Infinity, Infinity)"),
+      njs_str("abcdefghijklmno") },
+
+    { njs_str("'abcdefghijklmno'.slice('0', '5')"),
+      njs_str("abcde") },
+
+    { njs_str("'abcdefghijklmno'.slice(3, 5)"),
+      njs_str("de") },
+
+    { njs_str("'abcdefgh'.slice(3)"),
+      njs_str("defgh") },
+
+    { njs_str("'abcdefgh'.slice(undefined, undefined)"),
+      njs_str("abcdefgh") },
+
+    { njs_str("'abcdefgh'.slice(undefined)"),
+      njs_str("abcdefgh") },
+
+    { njs_str("'abcdefgh'.slice(undefined, 1)"),
+      njs_str("a") },
+
+    { njs_str("'abcdefgh'.slice(3, undefined)"),
+      njs_str("defgh") },
+
+    { njs_str("'abcde'.slice(50)"),
+      njs_str("") },
+
+    { njs_str("'abcde'.slice(1, 50)"),
+      njs_str("bcde") },
+
+    { njs_str("'abcdefgh'.slice(3, -2)"),
+      njs_str("def") },
+
+    { njs_str("'abcdefgh'.slice(5, 3)"),
+      njs_str("") },
+
+    { njs_str("'abcdefgh'.slice(100, 120)"),
+      njs_str("") },
+
+    { njs_str("String.prototype.substring(1, 5)"),
+      njs_str("") },
+
+    { njs_str("String.prototype.substr.call({toString:()=>{throw new Error('Oops')}})"),
+      njs_str("Error: Oops") },
+
+    { njs_str("String.prototype.slice(1, 5)"),
+      njs_str("") },
+
+    { njs_str("String.prototype.toBytes(1, 5)"),
+      njs_str("") },
+
+    { njs_str("'abc'.charAt(1 + 1)"),
+      njs_str("c") },
+
+    { njs_str("'abc'.charAt(3)"),
+      njs_str("") },
+
+    { njs_str("'abc'.charAt(undefined)"),
+      njs_str("a") },
+
+    { njs_str("'abc'.charAt(null)"),
+      njs_str("a") },
+
+    { njs_str("'abc'.charAt(false)"),
+      njs_str("a") },
+
+    { njs_str("'abc'.charAt(true)"),
+      njs_str("b") },
+
+    { njs_str("'abc'.charAt(NaN)"),
+      njs_str("a") },
+
+    { njs_str("'abc'.charAt(Infinity)"),
+      njs_str("") },
+
+    { njs_str("'abc'.charAt(-Infinity)"),
+      njs_str("") },
+
+    { njs_str("var o = { valueOf: function() {return 2} };"
+                 "'abc'.charAt(o)"),
+      njs_str("c") },
+
+    { njs_str("var o = { toString: function() {return '2'} };"
+                 "'abc'.charAt(o)"),
+      njs_str("c") },
+
+    { njs_str("'abc'.charCodeAt(1 + 1)"),
+      njs_str("99") },
+
+    { njs_str("'abc'.charCodeAt(3)"),
+      njs_str("NaN") },
+
+    { njs_str("'abc'.charCodeAt(undefined)"),
+      njs_str("97") },
+
+    { njs_str("var a = 'abcdef'; a.3"),
+      njs_str("SyntaxError: Unexpected token \".3\" in 1") },
+
+    { njs_str("'abcdef'[3]"),
+      njs_str("d") },
+
+    { njs_str("'abcdef'[0]"),
+      njs_str("a") },
+
+    { njs_str("'abcdef'[-1]"),
+      njs_str("undefined") },
+
+    { njs_str("'abcdef'[NaN]"),
+      njs_str("undefined") },
+
+    { njs_str("'abcdef'[3.5]"),
+      njs_str("undefined") },
+
+    { njs_str("'abcdef'[8]"),
+      njs_str("undefined") },
+
+    { njs_str("'abcdef'['1']"),
+      njs_str("b") },
+
+    { njs_str("'abcdef'[' 1']"),
+      njs_str("undefined") },
+
+    { njs_str("'abcdef'['1 ']"),
+      njs_str("undefined") },
+
+    { njs_str("'abcdef'['']"),
+      njs_str("undefined") },
+
+    { njs_str("'abcdef'['-']"),
+      njs_str("undefined") },
+
+    { njs_str("'abcdef'['-1']"),
+      njs_str("undefined") },
+
+    { njs_str("'abcdef'['01']"),
+      njs_str("undefined") },
+
+    { njs_str("'abcdef'['0x01']"),
+      njs_str("undefined") },
+
+    { njs_str("var a = 'abcdef', b = 1 + 2; a[b]"),
+      njs_str("d") },
+
+    /**/
+
+    { njs_str("'abc'.toString()"),
+      njs_str("abc") },
+
+    { njs_str("''.toString.call('abc')"),
+      njs_str("abc") },
+
+    { njs_str("String.prototype.toString.call('abc')"),
+      njs_str("abc") },
+
+    { njs_str("String.prototype.toString.call(new String('abc'))"),
+      njs_str("abc") },
+
+    { njs_str("String.prototype.toString.call(1)"),
+      njs_str("TypeError: unexpected value type:number") },
+
+    { njs_str("'abc'.valueOf()"),
+      njs_str("abc") },
+
+    /**/
+
+    { njs_str("var n = { toString: function() { return 1 } };   '12'[n]"),
+      njs_str("2") },
+
+    { njs_str("var n = { toString: function() { return '1' } }; '12'[n]"),
+      njs_str("2") },
+
+    { njs_str("var n = { toString: function() { return 1 },"
+                          " valueOf:  function() { return 0 } };   '12'[n]"),
+      njs_str("2") },
+
+    /* Externals. */
+
+    { njs_str("typeof $r"),
+      njs_str("external") },
+
+    { njs_str("var a = $r.uri, s = a.fromUTF8(); s.length +' '+ s"),
+      njs_str("3 АБВ") },
+
+    { njs_str("var a = $r.uri, b = $r2.uri, c = $r3.uri; a+b+c"),
+      njs_str("АБВαβγabc") },
+
+    { njs_str("var a = $r.uri; $r.uri = $r2.uri; $r2.uri = a; $r2.uri+$r.uri"),
+      njs_str("АБВαβγ") },
+
+    { njs_str("var a = $r.uri, s = a.fromUTF8(2); s.length +' '+ s"),
+      njs_str("2 БВ") },
+
+    { njs_str("var a = $r.uri, s = a.fromUTF8(2, 4); s.length +' '+ s"),
+      njs_str("1 Б") },
+
+    { njs_str("var a = $r.uri; a +' '+ a.length +' '+ a"),
+      njs_str("АБВ 6 АБВ") },
+
+    { njs_str("$r.uri = 'αβγ'; var a = $r.uri; a.length +' '+ a"),
+      njs_str("6 αβγ") },
+
+    { njs_str("$r.uri.length +' '+ $r.uri"),
+      njs_str("6 АБВ") },
+
+    { njs_str("$r.uri = $r.uri.substr(2); $r.uri.length +' '+ $r.uri"),
+      njs_str("4 БВ") },
+
+    { njs_str("'' + $r.props.a + $r2.props.a + $r.props.a"),
+      njs_str("121") },
+
+    { njs_str("var p1 = $r.props, p2 = $r2.props; '' + p2.a + p1.a"),
+      njs_str("21") },
+
+    { njs_str("var p1 = $r.props, p2 = $r2.props; '' + p1.a + p2.a"),
+      njs_str("12") },
+
+    { njs_str("var p = $r3.props; p.a = 1"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of external") },
+    { njs_str("var p = $r3.props; delete p.a"),
+      njs_str("TypeError: Cannot delete property \"a\" of external") },
+
+    { njs_str("$r.vars.p + $r2.vars.q + $r3.vars.k"),
+      njs_str("pvalqvalkval") },
+
+    { njs_str("$r.vars.unset"),
+      njs_str("undefined") },
+
+    { njs_str("var v = $r3.vars; v.k"),
+      njs_str("kval") },
+
+    { njs_str("var v = $r3.vars; v.unset = 1; v.unset"),
+      njs_str("1") },
+
+    { njs_str("$r.vars.unset = 'a'; $r2.vars.unset = 'b';"
+                 "$r.vars.unset + $r2.vars.unset"),
+      njs_str("ab") },
+
+    { njs_str("$r.vars.unset = 1; $r2.vars.unset = 2;"
+                 "$r.vars.unset + $r2.vars.unset"),
+      njs_str("12") },
+
+    { njs_str("$r3.vars.p = 'a'; $r3.vars.p2 = 'b';"
+                 "$r3.vars.p + $r3.vars.p2"),
+      njs_str("ab") },
+
+    { njs_str("$r3.vars.p = 'a'; delete $r3.vars.p; $r3.vars.p"),
+      njs_str("undefined") },
+
+    { njs_str("$r3.vars.p = 'a'; delete $r3.vars.p; $r3.vars.p = 'b'; $r3.vars.p"),
+      njs_str("b") },
+
+    { njs_str("$r3.vars.error = 1"),
+      njs_str("Error: cannot set \"error\" prop") },
+
+    { njs_str("delete $r3.vars.error"),
+      njs_str("Error: cannot delete \"error\" prop") },
+
+    { njs_str("delete $r3.vars.e"),
+      njs_str("true") },
+
+    { njs_str("$r3.consts.k"),
+      njs_str("kval") },
+
+    { njs_str("$r3.consts.k = 1"),
+      njs_str("TypeError: Cannot assign to read-only property \"k\" of external") },
+
+    { njs_str("delete $r3.consts.k"),
+      njs_str("TypeError: Cannot delete property \"k\" of external") },
+
+    { njs_str("delete $r3.vars.p; $r3.vars.p"),
+      njs_str("undefined") },
+
+    { njs_str("var a = $r.host; a +' '+ a.length +' '+ a"),
+      njs_str("АБВГДЕЁЖЗИЙ 22 АБВГДЕЁЖЗИЙ") },
+
+    { njs_str("var a = $r.host; a.substr(2, 2)"),
+      njs_str("Б") },
+
+    { njs_str("var a = $r.header['User-Agent']; a +' '+ a.length +' '+ a"),
+      njs_str("User-Agent|АБВ 17 User-Agent|АБВ") },
+
+    { njs_str("var a='', p;"
+                 "for (p in $r.header) { a += p +':'+ $r.header[p] +',' }"
+                 "a"),
+      njs_str("01:01|АБВ,02:02|АБВ,03:03|АБВ,") },
+
+    { njs_str("$r.some_method('YES')"),
+      njs_str("АБВ") },
+
+    { njs_str("$r.create('XXX').uri"),
+      njs_str("XXX") },
+
+    { njs_str("var sr = $r.create('XXX'); sr.uri = 'YYY'; sr.uri"),
+      njs_str("YYY") },
+
+    { njs_str("var sr = $r.create('XXX'), sr2 = $r.create('YYY');"
+                 "sr.uri = 'ZZZ'; "
+                 "sr.uri + sr2.uri"),
+      njs_str("ZZZYYY") },
+
+    { njs_str("var sr = $r.create('XXX'); sr.vars.p = 'a'; sr.vars.p"),
+      njs_str("a") },
+
+    { njs_str("var p; for (p in $r.some_method);"),
+      njs_str("undefined") },
+
+    { njs_str("'uri' in $r"),
+      njs_str("true") },
+
+    { njs_str("'one' in $r"),
+      njs_str("false") },
+
+    { njs_str("'a' in $r.props"),
+      njs_str("true") },
+
+    { njs_str("delete $r.uri"),
+      njs_str("TypeError: Cannot delete property \"uri\" of external") },
+
+    { njs_str("delete $r.one"),
+      njs_str("TypeError: Cannot delete property \"one\" of external") },
+
+    { njs_str("$r.some_method.call($r, 'YES')"),
+      njs_str("АБВ") },
+
+    { njs_str("var f = $r.some_method.bind($r); f('YES')"),
+      njs_str("АБВ") },
+
+    { njs_str("function f(fn, arg) {return fn(arg);}; f($r.some_method.bind($r), 'YES')"),
+      njs_str("АБВ") },
+
+    { njs_str("$r.some_method.apply($r, ['YES'])"),
+      njs_str("АБВ") },
+
+    { njs_str("$r.some_method.call([], 'YES')"),
+      njs_str("TypeError: external value is expected") },
+
+    { njs_str("$r.nonexistent"),
+      njs_str("undefined") },
+
+    { njs_str("$r.error = 'OK'"),
+      njs_str("TypeError: Cannot assign to read-only property \"error\" of external") },
+
+    { njs_str("var a = { toString: function() { return 1 } }; a"),
+      njs_str("1") },
+
+    { njs_str("var a = { valueOf: function() { return 1 } };  a"),
+      njs_str("[object Object]") },
+
+    { njs_str("var a = { toString: 2,"
+                 "          valueOf: function() { return 1 } };  a"),
+      njs_str("1") },
+
+    { njs_str("var a = { toString: function() { return [] },"
+                 "          valueOf: function() { return 1 } };  a"),
+      njs_str("1") },
+
+    { njs_str("var a = { toString: function() { return [] },"
+                 "          valueOf: function() { return 1 } };"
+                 "var o = {}; o[a] = 'test'"),
+      njs_str("test") },
+
+    { njs_str("({})[{}] = 'test'"),
+      njs_str("test") },
+
+    { njs_str("var o = {b:$r.props.b}; o.b"),
+      njs_str("42") },
+
+    { njs_str("$r2.uri == 'αβγ' && $r2.uri === 'αβγ'"),
+      njs_str("true") },
+
+    /**/
+
+    { njs_str("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(5)"),
+      njs_str("1077") },
+
+    { njs_str("'12345абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(35)"),
+      njs_str("1101") },
+
+    { njs_str("'12345абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.substring(35)"),
+      njs_str("эюя") },
+
+    { njs_str("'abcdef'.substr(-5, 4).substring(3, 1).charAt(1)"),
+      njs_str("d") },
+
+    { njs_str("'abcdef'.substr(2, 4).charAt(2)"),
+      njs_str("e") },
+
+    { njs_str("var a = 'abcdef'.substr(2, 4).charAt(2).length; a"),
+      njs_str("1") },
+
+    { njs_str("var a = 'abcdef'.substr(2, 4).charAt(2) + '1234'; a"),
+      njs_str("e1234") },
+
+    { njs_str("var a = ('abcdef'.substr(2, 5 * 2 - 6).charAt(2) + '1234')"
+                 "         .length; a"),
+      njs_str("5") },
+
+    { njs_str("String.fromCharCode('_').charCodeAt(0)"),
+      njs_str("0") },
+
+    { njs_str("String.fromCodePoint('_')"),
+      njs_str("RangeError") },
+
+    { njs_str("String.fromCharCode(65.14)"),
+      njs_str("A") },
+
+    { njs_str("String.fromCodePoint(3.14)"),
+      njs_str("RangeError") },
+
+    { njs_str("String.fromCharCode(65.14 + 65536)"),
+      njs_str("A") },
+
+    { njs_str("String.fromCodePoint(65 + 65536)"),
+      njs_str("𐁁") },
+
+    { njs_str("String.fromCharCode(2**53 + 10)"),
+      njs_str("\n") },
+
+    { njs_str("String.fromCodePoint(1114111 + 1)"),
+      njs_str("RangeError") },
+
+    { njs_str("String.fromCharCode(65, 90) + String.fromCodePoint(65, 90)"),
+      njs_str("AZAZ") },
+
+    { njs_str("String.fromCharCode(945, 946, 947) + String.fromCodePoint(945, 946, 947)"),
+      njs_str("αβγαβγ") },
+
+    { njs_str("(function() {"
+                 "    var n;"
+                 "    for (n = 0; n <= 65536; n++) {"
+                 "        if (String.fromCharCode(n).charCodeAt(0) !== n)"
+                 "            return n;"
+                 "    }"
+                 "    return -1"
+                 "})()"),
+      njs_str("65536") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* very long test under MSAN */
+    { njs_str("(function() {"
+                 "    var n;"
+                 "    for (n = 0; n <= 1114111; n++) {"
+                 "        if (String.fromCodePoint(n).codePointAt(0) !== n)"
+                 "            return n;"
+                 "    }"
+                 "    return -1"
+                 "})()"),
+      njs_str("-1") },
+#endif
+
+    { njs_str("var a = 'abcdef'; function f(a) {"
+                 "return a.slice(a.indexOf('cd')) } f(a)"),
+      njs_str("cdef") },
+
+    { njs_str("var a = 'abcdef'; a.slice(a.indexOf('cd'))"),
+      njs_str("cdef") },
+
+    { njs_str("'abcdef'.indexOf('de', 2)"),
+      njs_str("3") },
+
+    { njs_str("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.indexOf('лмно', 10)"),
+      njs_str("12") },
+
+    { njs_str("'abcdef'.indexOf('a', 10)"),
+      njs_str("-1") },
+
+    { njs_str("'abcdef'.indexOf('q', 0)"),
+      njs_str("-1") },
+
+    { njs_str("'abcdef'.indexOf('', 10)"),
+      njs_str("6") },
+
+    { njs_str("'abcdef'.indexOf('', 3)"),
+      njs_str("3") },
+
+    { njs_str("'12345'.indexOf()"),
+      njs_str("-1") },
+
+    { njs_str("''.indexOf('')"),
+      njs_str("0") },
+
+    { njs_str("'12345'.indexOf(45, '0')"),
+      njs_str("3") },
+
+    { njs_str("'12'.indexOf('12345')"),
+      njs_str("-1") },
+
+    { njs_str("''.indexOf.call(12345, 45, '0')"),
+      njs_str("3") },
+
+    { njs_str("'abc'.lastIndexOf('abcdef')"),
+      njs_str("-1") },
+
+    { njs_str("'abc abc abc abc'.lastIndexOf('abc')"),
+      njs_str("12") },
+
+    { njs_str("'abc abc abc abc'.lastIndexOf('abc', 11)"),
+      njs_str("8") },
+
+    { njs_str("'abc abc abc abc'.lastIndexOf('abc', 0)"),
+      njs_str("0") },
+
+    { njs_str("'abc abc abc abc'.lastIndexOf('', 0)"),
+      njs_str("0") },
+
+    { njs_str("'abc abc abc abc'.lastIndexOf('', 5)"),
+      njs_str("5") },
+
+    { njs_str("'abc abc абвгд abc'.lastIndexOf('абвгд')"),
+      njs_str("8") },
+
+    { njs_str("'abc abc абвгд abc'.lastIndexOf('абвгд', undefined)"),
+      njs_str("8") },
+
+    { njs_str("'abc abc абвгд abc'.lastIndexOf('абвгд', NaN)"),
+      njs_str("8") },
+
+    { njs_str("'abc abc абвгд abc'.lastIndexOf('абвгд', {})"),
+      njs_str("8") },
+
+    { njs_str("String.prototype.lastIndexOf.call({toString:()=>'abc abc абвгд abc'}, 'абвгд')"),
+      njs_str("8") },
+
+    { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд')"),
+      njs_str("8") },
+
+    { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд', 11)"),
+      njs_str("8") },
+
+    { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд', 12)"),
+      njs_str("8") },
+
+    { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд', 13)"),
+      njs_str("8") },
+
+    { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд', 14)"),
+      njs_str("8") },
+
+    { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд', 15)"),
+      njs_str("8") },
+
+    { njs_str("'abc abc абвгдежз'.lastIndexOf('')"),
+      njs_str("16") },
+
+    { njs_str("'abc abc абвгдежз'.lastIndexOf('', 12)"),
+      njs_str("12") },
+
+    { njs_str("''.lastIndexOf('')"),
+      njs_str("0") },
+
+    { njs_str("''.lastIndexOf()"),
+      njs_str("-1") },
+
+    { njs_str("''.lastIndexOf(undefined)"),
+      njs_str("-1") },
+
+    { njs_str("'β'.repeat(32).lastIndexOf('β')"),
+      njs_str("31") },
+
+    { njs_str("'β'.repeat(32).lastIndexOf``"),
+      njs_str("32") },
+
+    { njs_str("JSON.stringify(Array(24).fill(true).map((v,i) => 'abc abc ab abc абвгдежзab'.lastIndexOf('abc', i)))"
+                 "== JSON.stringify([].concat(Array(4).fill(0), Array(7).fill(4), Array(13).fill(11)))"),
+      njs_str("true") },
+
+    { njs_str("''.includes('')"),
+      njs_str("true") },
+
+    { njs_str("'12345'.includes()"),
+      njs_str("false") },
+
+    { njs_str("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.includes('лмно', 10)"),
+      njs_str("true") },
+
+    { njs_str("'абв абв абвгдежз'.includes('абвгд', 7)"),
+      njs_str("true") },
+
+    { njs_str("'абв абв абвгдежз'.includes('абвгд', 8)"),
+      njs_str("true") },
+
+    { njs_str("'абв абв абвгдежз'.includes('абвгд', 9)"),
+      njs_str("false") },
+
+    { njs_str("''.startsWith('')"),
+      njs_str("true") },
+
+    { njs_str("'12345'.startsWith()"),
+      njs_str("false") },
+
+    { njs_str("'abc'.startsWith('abc')"),
+      njs_str("true") },
+
+    { njs_str("'abc'.startsWith('abc', 1)"),
+      njs_str("false") },
+
+    { njs_str("'abc'.startsWith('abc', -1)"),
+      njs_str("true") },
+
+    { njs_str("'абв абв абвгдежз'.startsWith('абвгд', 8)"),
+      njs_str("true") },
+
+    { njs_str("'абв абв абвгдежз'.startsWith('абвгд', 9)"),
+      njs_str("false") },
+
+    { njs_str("''.endsWith('')"),
+      njs_str("true") },
+
+    { njs_str("'12345'.endsWith()"),
+      njs_str("false") },
+
+    { njs_str("'abc'.endsWith('abc')"),
+      njs_str("true") },
+
+    { njs_str("'abc'.endsWith('abc', 4)"),
+      njs_str("true") },
+
+    { njs_str("'abc'.endsWith('abc', 1)"),
+      njs_str("false") },
+
+    { njs_str("'abc'.endsWith('abc', -1)"),
+      njs_str("true") },
+
+    { njs_str("'абв абв абвгдежз'.endsWith('абвгд', 13)"),
+      njs_str("true") },
+
+    { njs_str("'абв абв абвгдежз'.endsWith('абвгд', 14)"),
+      njs_str("false") },
+
+    { njs_str("'\x00АБВГДЕЁЖЗ'.toLowerCase().length"),
+      njs_str("10") },
+
+    { njs_str("'ΑΒΓ'.toLowerCase()"),
+      njs_str("αβγ") },
+
+    { njs_str("'АБВ'.toLowerCase()"),
+      njs_str("абв") },
+
+    { njs_str("'Ȿ'.repeat(256).toLowerCase() === 'ȿ'.repeat(256)"),
+      njs_str("true") },
+
+    { njs_str("'abc'.toUpperCase()"),
+      njs_str("ABC") },
+
+    { njs_str("'αβγ'.toUpperCase()"),
+      njs_str("ΑΒΓ") },
+
+    { njs_str("'ȿ'.repeat(256).toUpperCase() === 'Ȿ'.repeat(256)"),
+      njs_str("true") },
+
+    { njs_str("'\x00абвгдеёжз'.toUpperCase().length"),
+      njs_str("10") },
+
+    { njs_str("['ȿ', 'Ȿ', 'ȿ'.toUpperCase(), 'Ȿ'.toLowerCase()].map((v)=>v.toUTF8().length)"),
+      njs_str("2,3,3,2") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* very long tests under MSAN */
+    { njs_str("var a = [], code;"
+                 "for (code = 0; code <= 1114111; code++) {"
+                 "    var s = String.fromCodePoint(code);"
+                 "    var n = s.toUpperCase();"
+                 "    if (s != n && s != n.toLowerCase())"
+                 "        a.push(code);"
+                 "} a"),
+      njs_str("181,305,383,453,456,459,498,837,962,976,977,981,982,1008,1009,1013,7296,7297,7298,7299,7300,7301,7302,7303,7304,7835,8126") },
+
+    { njs_str("var a = [], code;"
+                 "for (code = 0; code <= 1114111; code++) {"
+                 "    var s = String.fromCodePoint(code);"
+                 "    var n = s.toLowerCase();"
+                 "    if (s != n && s != n.toUpperCase())"
+                 "        a.push(code);"
+                 "} a"),
+      njs_str("304,453,456,459,498,1012,7838,8486,8490,8491") },
+#endif
+
+    { njs_str("'abc'.trimStart().trim().trimEnd()"),
+      njs_str("abc") },
+
+    { njs_str("''.trim()"),
+      njs_str("") },
+
+    { njs_str("'    '.trim()"),
+      njs_str("") },
+
+    { njs_str("'abc  '.trimEnd()"),
+      njs_str("abc") },
+
+    { njs_str("'   abc'.trimStart()"),
+      njs_str("abc") },
+
+    { njs_str("'   abc  '.trim()"),
+      njs_str("abc") },
+
+    { njs_str("'абв  '.trimEnd()"),
+      njs_str("абв") },
+
+    { njs_str("'   абв'.trimStart()"),
+      njs_str("абв") },
+
+    { njs_str("'   абв  '.trimStart().trimEnd()"),
+      njs_str("абв") },
+
+    { njs_str("'\\u2029abc\\uFEFF\\u2028'.trim()"),
+      njs_str("abc") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* very long test under MSAN */
+    { njs_str("var a = [], code;"
+                 "for (code = 0; code <= 1114111; code++) {"
+                 "    var ws = String.fromCodePoint(code);"
+                 "    if ((ws + '-' + ws).trim() === '-')"
+                 "        a.push(code);"
+                 "} a"),
+      njs_str("9,10,11,12,13,32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288,65279") },
+#endif
+
+    { njs_str("'abcdefgh'.search()"),
+      njs_str("0") },
+
+    { njs_str("'abcdefgh'.search('')"),
+      njs_str("0") },
+
+    { njs_str("'abcdefgh'.search(undefined)"),
+      njs_str("0") },
+
+    { njs_str("'abcdefgh'.search(/def/)"),
+      njs_str("3") },
+
+    { njs_str("'abcdefgh'.search('def')"),
+      njs_str("3") },
+
+    { njs_str("'123456'.search('45')"),
+      njs_str("3") },
+
+    { njs_str("'123456'.search(45)"),
+      njs_str("3") },
+
+    { njs_str("'123456'.search(String(45))"),
+      njs_str("3") },
+
+    { njs_str("'123456'.search(Number('45'))"),
+      njs_str("3") },
+
+    { njs_str("var r = { toString: function() { return '45' } };"
+                 "'123456'.search(r)"),
+      njs_str("3") },
+
+    { njs_str("var r = { toString: function() { return 45 } };"
+                 "'123456'.search(r)"),
+      njs_str("3") },
+
+    { njs_str("var r = { toString: function() { return /45/ } };"
+                 "'123456'.search(r)"),
+      njs_str("TypeError: Cannot convert object to primitive value") },
+
+    { njs_str("var r = { toString: function() { return /34/ },"
+                 "          valueOf:  function() { return 45 } };"
+                 "'123456'.search(r)"),
+      njs_str("3") },
+
+    { njs_str("'abcdefgh'.replace()"),
+      njs_str("abcdefgh") },
+
+    { njs_str("'abcdefgh'.replace('d')"),
+      njs_str("abcundefinedefgh") },
+
+    { njs_str("'abcdefgh'.replace('d', undefined)"),
+      njs_str("abcundefinedefgh") },
+
+    { njs_str("'a'.repeat(16).replace('a'.repeat(17)) === 'a'.repeat(16)"),
+      njs_str("true") },
+
+    { njs_str("'abcdefgh'.replace('d', null)"),
+      njs_str("abcnullefgh") },
+
+    { njs_str("'abcdefgh'.replace('d', 1)"),
+      njs_str("abc1efgh") },
+
+    { njs_str("'abcdefghdijklm'.replace('d', 'X')"),
+      njs_str("abcXefghdijklm") },
+
+    { njs_str("'абвгдежгийклм'.replace('г', 'Г')"),
+      njs_str("абвГдежгийклм") },
+
+    { njs_str("'abcdefghdijklm'.replace('d',"
+                 "   function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
+      njs_str("abc|abcdefghdijklm|3|d|efghdijklm") },
+
+    { njs_str("'abcdefgh'.replace('', 'X')"),
+      njs_str("Xabcdefgh") },
+
+    { njs_str("'abcdefghdijklm'.replace(/d/, 'X')"),
+      njs_str("abcXefghdijklm") },
+
+    { njs_str("'abcdefghdijklm'.replace(/d/,"
+                 "   function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
+      njs_str("abc|abcdefghdijklm|3|d|efghdijklm") },
+
+    { njs_str("'abcdefghdijklm'.replace(/(d)/,"
+                 "   function(m, p, o, s)"
+                       "{ return '|'+s+'|'+o+'|'+m+'|'+p+'|' })"),
+      njs_str("abc|abcdefghdijklm|3|d|d|efghdijklm") },
+
+    { njs_str("'abcdefghdijklm'.replace(/x/, 'X')"),
+      njs_str("abcdefghdijklm") },
+
+    { njs_str("'abcdefghdijklm'.replace(/x/,"
+                 "   function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
+      njs_str("abcdefghdijklm") },
+
+    { njs_str("'абвгдежгийклм'.replace(/г/, 'Г')"),
+      njs_str("абвГдежгийклм") },
+
+    { njs_str("'abcdefghdijklm'.replace(/d/g, 'X')"),
+      njs_str("abcXefghXijklm") },
+
+    { njs_str("'абвгдежгийклм'.replace(/г/g, 'Г')"),
+      njs_str("абвГдежГийклм") },
+
+    { njs_str("'abc12345#$*%'.replace(/([^\\d]*)(\\d*)([^\\w]*)/,"
+                 "   function(match, p1, p2, p3) {"
+                 "     return [p1, p2, p3].join('-')})"),
+      njs_str("abc-12345-#$*%") },
+
+    { njs_str("'ABCDEFGHDIJKLM'.replace(/[A-Z]/g,"
+                 "   function(match) { return '-' + match.toLowerCase() })"),
+      njs_str("-a-b-c-d-e-f-g-h-d-i-j-k-l-m") },
+
+    { njs_str("'abcdbe'.replace(/(b)/g, '$')"),
+      njs_str("a$cd$e") },
+
+    { njs_str("'abcdbe'.replace(/(b)/g, '$2$23')"),
+      njs_str("a$2$23cd$2$23e") },
+
+    { njs_str("'abcdbe'.replace(/(b)/g, '$2$23X$$Y')"),
+      njs_str("a$2$23X$Ycd$2$23X$Ye") },
+
+    { njs_str("'abcdbe'.replace('b', '|$`X$\\'|')"),
+      njs_str("a|aXcdbe|cdbe") },
+
+    { njs_str("'abcdbe'.replace(/b/, '|$`X$\\'|')"),
+      njs_str("a|aXcdbe|cdbe") },
+
+    { njs_str("'abcdbefbgh'.replace(/b/g, '|$`X$\\'|')"),
+      njs_str("a|aXcdbefbgh|cd|abcdXefbgh|ef|abcdbefXgh|gh") },
+
+    { njs_str("'abc12345#$*%'.replace(/([^\\d]*)(\\d*)([^\\w]*)/,"
+                 "                       '$1-$2-$3')"),
+      njs_str("abc-12345-#$*%") },
+
+    { njs_str("'$1,$2'.replace(/(\\$(\\d))/g, '$$1-$1$2')"),
+      njs_str("$1-$11,$1-$22") },
+
+    { njs_str("('β' + 'α'.repeat(33)+'β').replace(/(α+)(β+)/, function(m, p1) { return p1[32]; })"),
+      njs_str("βα") },
+
+    { njs_str("'abc'.replace(/(h*)(z*)(g*)/g, '$1nn$2zz$3')"),
+      njs_str("nnzzannzzbnnzzcnnzz") },
+
+    { njs_str("'abc'.replace(/(h*)(z*)/g, '$1nn$2zz$3yy')"),
+      njs_str("nnzz$3yyannzz$3yybnnzz$3yycnnzz$3yy") },
+
+    { njs_str("'ъ'.replace(/(h*)/g, '$1ЮЙ')"),
+      njs_str("ЮЙъЮЙ") },
+
+    { njs_str("'ъg'.replace(/(h*)/g, '$1ЮЙ')"),
+      njs_str("ЮЙъЮЙgЮЙ") },
+
+    { njs_str("'ъg'.replace(/(ъ*)/g, '$1ЮЙ')"),
+      njs_str("ъЮЙЮЙgЮЙ") },
+
+    { njs_str("'ъg'.replace(/(h*)/g, 'fg$1ЮЙ')"),
+      njs_str("fgЮЙъfgЮЙgfgЮЙ") },
+
+    { njs_str("'юgёfя'.replace(/(gё)/g, 'n$1i')"),
+      njs_str("юngёifя") },
+
+    { njs_str("'aabbccaa'.replace(/a*/g, '')"),
+      njs_str("bbcc") },
+
+    { njs_str("'aabbccaab'.replace(/z*/g, '')"),
+      njs_str("aabbccaab") },
+
+    { njs_str("'αβγ'.replace(/z*/g, '|')"),
+      njs_str("|α|β|γ|") },
+
+    { njs_str("''.replace(/a*/g, '')"),
+      njs_str("") },
+
+    { njs_str("'12345'.replace(3, () => 0)"),
+      njs_str("12045") },
+
+    { njs_str("'123'.replace(3, function() { return {toString: ()=>({})}; })"),
+      njs_str("TypeError: Cannot convert object to primitive value") },
+
+    { njs_str("'12345'.replace(3, () => ({toString: () => 'aaaa'}))"),
+      njs_str("12aaaa45") },
+
+    { njs_str("'abc'.replace(/(z*)/g, function v0() {return '124'})"),
+      njs_str("124a124b124c124") },
+
+    { njs_str("'abc'.replace(/(a*)/g, function v0() {return '124'})"),
+      njs_str("124124b124c124") },
+
+    { njs_str("'abc'.replace(/b/g, '$0')"),
+      njs_str("a$0c") },
+
+    { njs_str("typeof String.bytesFrom(Array(15).fill(0xE3)).replace(/^/g, 1)"),
+      njs_str("string") },
+
+#if 0 /* FIXME: PCRE limitation */
+    { njs_str("'abc'.replace(/^/g, '|$&|')"),
+      njs_str("||abc") },
+#endif
+
+    { njs_str("'abc'.replace(/b/g, '|$&|')"),
+      njs_str("a|b|c") },
+
+    { njs_str("'ABC'.replace(/((A)B)/g, '($1|$&|$2)')"),
+      njs_str("(AB|AB|A)C") },
+
+    { njs_str("/]/"),
+      njs_str("/\\]/") },
+
+    { njs_str("RegExp(']')"),
+      njs_str("/\\]/") },
+
+    { njs_str("RegExp('[\\\\\\\\]]')"),
+      njs_str("/[\\\\]\\]/") },
+
+    { njs_str("/[\\\\]]/"),
+      njs_str("/[\\\\]\\]/") },
+
+    { njs_str("/\\]/"),
+      njs_str("/\\]/") },
+
+    { njs_str("RegExp('\\]')"),
+      njs_str("/\\]/") },
+
+    { njs_str("/ab]cd/"),
+      njs_str("/ab\\]cd/") },
+
+    { njs_str("/ab]/"),
+      njs_str("/ab\\]/") },
+
+    { njs_str("/]cd/"),
+      njs_str("/\\]cd/") },
+
+    { njs_str("RegExp('\\\\0').source[1]"),
+      njs_str("0") },
+
+    { njs_str("']'.match(/]/)"),
+      njs_str("]") },
+
+    { njs_str("'ab]cd'.match(/]/)"),
+      njs_str("]") },
+
+    { njs_str("'ab]'.match(/]/)"),
+      njs_str("]") },
+
+    { njs_str("']cd'.match(/]/)"),
+      njs_str("]") },
+
+    { njs_str("'ab]cd'.match(/\\]/)"),
+      njs_str("]") },
+
+    { njs_str("'abc'.match(/a*/g)"),
+      njs_str("a,,,") },
+
+    { njs_str("'abc'.match(/z*/g)"),
+      njs_str(",,,") },
+
+    { njs_str("'abc'.match(/.?/g)"),
+      njs_str("a,b,c,") },
+
+    { njs_str("''.match(/a*/g)"),
+      njs_str("") },
+
+    { njs_str("''.match(/.?/g)"),
+      njs_str("") },
+
+    { njs_str("'абв'.match(/я?/g)"),
+      njs_str(",,,") },
+
+    { njs_str("'αβγ'.match(/z*/g)"),
+      njs_str(",,,") },
+
+    { njs_str("'囲碁織'.match(/z*/g)"),
+      njs_str(",,,") },
+
+    { njs_str("'𝟘𝟙𝟚𝟛'.match(/z*/g)"),
+      njs_str(",,,,") },
+
+    { njs_str("'abcdefgh'.match()"),
+      njs_str("") },
+
+    { njs_str("'abcdefgh'.match('')"),
+      njs_str("") },
+
+    { njs_str("'abcdefgh'.match(undefined)"),
+      njs_str("") },
+
+    { njs_str("'abcdefgh'.match(/def/)"),
+      njs_str("def") },
+
+    { njs_str("'abcdefgh'.match('def')"),
+      njs_str("def") },
+
+    { njs_str("'123456'.match('45')"),
+      njs_str("45") },
+
+    { njs_str("'123456'.match(45)"),
+      njs_str("45") },
+
+    { njs_str("'123456'.match(String(45))"),
+      njs_str("45") },
+
+    { njs_str("'123456'.match(Number('45'))"),
+      njs_str("45") },
+
+    { njs_str("var r = { toString: function() { return '45' } };"
+                 "'123456'.match(r)"),
+      njs_str("45") },
+
+    { njs_str("var r = { toString: function() { return 45 } };"
+                 "'123456'.match(r)"),
+      njs_str("45") },
+
+    { njs_str("var r = { toString: function() { return /45/ } };"
+                 "'123456'.match(r)"),
+      njs_str("TypeError: Cannot convert object to primitive value") },
+
+    { njs_str("var r = { toString: function() { return /34/ },"
+                 "          valueOf:  function() { return 45 } };"
+                 "'123456'.match(r)"),
+      njs_str("45") },
+
+    { njs_str("''.match(/^$/)"),
+      njs_str("") },
+
+    { njs_str("''.match(/^$/g)"),
+      njs_str("") },
+
+    { njs_str("'abcdefgh'.match(/def/)"),
+      njs_str("def") },
+
+    { njs_str("'abc abc abc'.match('abc')"),
+      njs_str("abc") },
+
+    { njs_str("'abc abc abc'.match(/abc/)"),
+      njs_str("abc") },
+
+    { njs_str("'abc abc abc'.match(/abc/g)"),
+      njs_str("abc,abc,abc") },
+
+    { njs_str("'abc ABC aBc'.match(/abc/ig)"),
+      njs_str("abc,ABC,aBc") },
+
+    { njs_str("var a = 'α'.match(/α/g)[0] + 'α';"
+                 "a +' '+ a.length"),
+      njs_str("αα 2") },
+
+    { njs_str("('β' + 'α'.repeat(33) +'β').match(/α+/g)[0][32]"),
+      njs_str("α") },
+
+    { njs_str("var a = '\\u00CE\\u00B1'.toBytes().match(/α/g)[0] + 'α';"
+                 "a +' '+ a.length"),
+      njs_str("αα 4") },
+
+    { njs_str("typeof String.bytesFrom(Array(15).fill(0xE3)).match(/^/g)"),
+      njs_str("object") },
+
+    { njs_str("'abc'.split()"),
+      njs_str("abc") },
+
+    { njs_str("'abc'.split(undefined)"),
+      njs_str("abc") },
+
+    { njs_str("''.split('').length"),
+      njs_str("1") },
+
+    { njs_str("'abc'.split('')"),
+      njs_str("a,b,c") },
+
+    { njs_str("'αβγ'.split('')"),
+      njs_str("α,β,γ") },
+
+    { njs_str("'囲碁織'.split('')"),
+      njs_str("囲,碁,織") },
+
+    { njs_str("'𝟘𝟙𝟚𝟛'.split('')"),
+      njs_str("𝟘,𝟙,𝟚,𝟛") },
+
+    { njs_str("'囲α碁α織'.split('α')"),
+      njs_str("囲,碁,織") },
+
+    { njs_str("'a'.repeat(16).split('a'.repeat(15))"),
+      njs_str(",a") },
+
+    { njs_str("('α'+'β'.repeat(33)).repeat(2).split('α')[1][32]"),
+      njs_str("β") },
+
+    { njs_str("'abc'.split('abc')"),
+      njs_str(",") },
+
+    { njs_str("'a bc def'.split(' ')"),
+      njs_str("a,bc,def") },
+
+    { njs_str("'a bc  def'.split(' ')"),
+      njs_str("a,bc,,def") },
+
+    { njs_str("'a bc  def'.split(' ', 3)"),
+      njs_str("a,bc,") },
+
+    { njs_str("'abc'.split('abc')"),
+      njs_str(",") },
+
+    { njs_str("'ab'.split('123')"),
+      njs_str("ab") },
+
+    { njs_str("''.split(/0/).length"),
+      njs_str("1") },
+
+    { njs_str("'abc'.split(/(?:)/)"),
+      njs_str("a,b,c") },
+
+    { njs_str("'a bc def'.split(/ /)"),
+      njs_str("a,bc,def") },
+
+    { njs_str("'a bc  def'.split(/ /)"),
+      njs_str("a,bc,,def") },
+
+    { njs_str("'abc'.split(/abc/)"),
+      njs_str(",") },
+
+    { njs_str("'0123456789'.split('').reverse().join('')"),
+      njs_str("9876543210") },
+
+    { njs_str("'abc'.repeat(3)"),
+      njs_str("abcabcabc") },
+
+    { njs_str("'абв'.repeat(3)"),
+      njs_str("абвабвабв") },
+
+    { njs_str("''.repeat(3)"),
+      njs_str("") },
+
+    { njs_str("'abc'.repeat(0)"),
+      njs_str("") },
+
+    { njs_str("'abc'.repeat(NaN)"),
+      njs_str("") },
+
+    { njs_str("'abc'.repeat(Infinity)"),
+      njs_str("RangeError") },
+
+    { njs_str("'abc'.repeat(-1)"),
+      njs_str("RangeError") },
+
+    { njs_str("''.repeat(-1)"),
+      njs_str("RangeError") },
+
+    { njs_str("'a'.repeat(2147483647)"),
+      njs_str("RangeError") },
+
+    { njs_str("'a'.repeat(2147483648)"),
+      njs_str("RangeError") },
+
+    { njs_str("'a'.repeat(Infinity)"),
+      njs_str("RangeError") },
+
+    { njs_str("'a'.repeat(NaN)"),
+      njs_str("") },
+
+    { njs_str("''.repeat(2147483646)"),
+      njs_str("") },
+
+    /* ES6: "". */
+    { njs_str("''.repeat(2147483647)"),
+      njs_str("RangeError") },
+
+    { njs_str("''.repeat(2147483648)"),
+      njs_str("RangeError") },
+
+    { njs_str("''.repeat(Infinity)"),
+      njs_str("RangeError") },
+
+    { njs_str("''.repeat(NaN)"),
+      njs_str("") },
+
+    { njs_str("'abc'.padStart(7)"),
+      njs_str("    abc") },
+
+    { njs_str("'абв'.padStart(7)"),
+      njs_str("    абв") },
+
+    { njs_str("'abc'.padStart(3)"),
+      njs_str("abc") },
+
+    { njs_str("'абв'.padStart(0)"),
+      njs_str("абв") },
+
+    { njs_str("'abc'.padStart(NaN)"),
+      njs_str("abc") },
+
+    { njs_str("'abc'.padStart(2147483647)"),
+      njs_str("RangeError") },
+
+    { njs_str("'abc'.padStart(2147483646, '')"),
+      njs_str("abc") },
+
+    { njs_str("''.padStart(0, '')"),
+      njs_str("") },
+
+    { njs_str("'1'.padStart(5, 0)"),
+      njs_str("00001") },
+
+    { njs_str("''.padStart(1, 'я')"),
+      njs_str("я") },
+
+    { njs_str("'abc'.padStart(6, NaN)"),
+      njs_str("NaNabc") },
+
+    { njs_str("'abc'.padStart(11, 123)"),
+      njs_str("12312312abc") },
+
+    { njs_str("'abc'.padStart(6, 12345)"),
+      njs_str("123abc") },
+
+    { njs_str("'абв'.padStart(6, 'эюя')"),
+      njs_str("эюяабв") },
+
+    { njs_str("'абв'.padStart(4, 'эюя')"),
+      njs_str("эабв") },
+
+    { njs_str("'абв'.padStart(7, 'эюя')"),
+      njs_str("эюяэабв") },
+
+    { njs_str("'абв'.padStart(10, 'эю')"),
+      njs_str("эюэюэюэабв") },
+
+    { njs_str("'1234'.padEnd(4)"),
+      njs_str("1234") },
+
+    { njs_str("'1234'.padEnd(-1)"),
+      njs_str("1234") },
+
+    { njs_str("'я'.padEnd(1)"),
+      njs_str("я") },
+
+    { njs_str("'1234'.padEnd(5)"),
+      njs_str("1234 ") },
+
+    { njs_str("'я'.padEnd(6)"),
+      njs_str("я     ") },
+
+    { njs_str("'я'.padEnd(2147483647)"),
+      njs_str("RangeError") },
+
+    { njs_str("'я'.padEnd(2147483646, '')"),
+      njs_str("я") },
+
+    { njs_str("''.padEnd(0, '')"),
+      njs_str("") },
+
+    { njs_str("'эю'.padEnd(3, 'я')"),
+      njs_str("эюя") },
+
+    { njs_str("''.padEnd(1, 0)"),
+      njs_str("0") },
+
+    { njs_str("'1234'.padEnd(8, 'abcd')"),
+      njs_str("1234abcd") },
+
+    { njs_str("'1234'.padEnd(10, 'abcd')"),
+      njs_str("1234abcdab") },
+
+    { njs_str("'1234'.padEnd(7, 'abcd')"),
+      njs_str("1234abc") },
+
+    { njs_str("'абв'.padEnd(5, 'ГД')"),
+      njs_str("абвГД") },
+
+    { njs_str("'абв'.padEnd(4, 'ГДУ')"),
+      njs_str("абвГ") },
+
+    { njs_str("'абвг'.padEnd(10, 'ДЕЖЗ')"),
+      njs_str("абвгДЕЖЗДЕ") },
+
+    { njs_str("String.bytesFrom({})"),
+      njs_str("TypeError: value must be a string or array") },
+
+    { njs_str("String.bytesFrom([1, 2, 0.23, '5', 'A']).toString('hex')"),
+      njs_str("0102000500") },
+
+    { njs_str("String.bytesFrom([NaN, Infinity]).toString('hex')"),
+      njs_str("0000") },
+
+    { njs_str("String.bytesFrom('', 'hex')"),
+      njs_str("") },
+
+    { njs_str("String.bytesFrom('00aabbcc', 'hex').toString('hex')"),
+      njs_str("00aabbcc") },
+
+    { njs_str("String.bytesFrom('deadBEEF##', 'hex').toString('hex')"),
+      njs_str("deadbeef") },
+
+    { njs_str("String.bytesFrom('aa0', 'hex').toString('hex')"),
+      njs_str("aa") },
+
+    { njs_str("String.bytesFrom('', 'base64')"),
+      njs_str("") },
+
+    { njs_str("String.bytesFrom('#', 'base64')"),
+      njs_str("") },
+
+    { njs_str("String.bytesFrom('QQ==', 'base64')"),
+      njs_str("A") },
+
+    { njs_str("String.bytesFrom('QQ', 'base64')"),
+      njs_str("A") },
+
+    { njs_str("String.bytesFrom('QUI=', 'base64')"),
+      njs_str("AB") },
+
+    { njs_str("String.bytesFrom('QUI', 'base64')"),
+      njs_str("AB") },
+
+    { njs_str("String.bytesFrom('QUJD', 'base64')"),
+      njs_str("ABC") },
+
+    { njs_str("String.bytesFrom('QUJDRA==', 'base64')"),
+      njs_str("ABCD") },
+
+    { njs_str("String.bytesFrom('', 'base64url')"),
+      njs_str("") },
+
+    { njs_str("String.bytesFrom('QQ', 'base64url')"),
+      njs_str("A") },
+
+    { njs_str("String.bytesFrom('QUI', 'base64url')"),
+      njs_str("AB") },
+
+    { njs_str("String.bytesFrom('QUJD', 'base64url')"),
+      njs_str("ABC") },
+
+    { njs_str("String.bytesFrom('QUJDRA', 'base64url')"),
+      njs_str("ABCD") },
+
+    { njs_str("String.bytesFrom('QUJDRA#', 'base64url')"),
+      njs_str("ABCD") },
+
+    { njs_str("encodeURI.name"),
+      njs_str("encodeURI")},
+
+    { njs_str("encodeURI.length"),
+      njs_str("1")},
+
+    { njs_str("encodeURI()"),
+      njs_str("undefined")},
+
+    { njs_str("encodeURI('012абв')"),
+      njs_str("012%D0%B0%D0%B1%D0%B2")},
+
+    { njs_str("encodeURI('~}|{`_^]\\\\[@?>=<;:/.-,+*)(\\\'&%$#\"! ')"),
+      njs_str("~%7D%7C%7B%60_%5E%5D%5C%5B@?%3E=%3C;:/.-,+*)('&%25$#%22!%20")},
+
+    { njs_str("encodeURIComponent.name"),
+      njs_str("encodeURIComponent")},
+
+    { njs_str("encodeURIComponent.length"),
+      njs_str("1")},
+
+    { njs_str("encodeURIComponent('~}|{`_^]\\\\[@?>=<;:/.-,+*)(\\\'&%$#\"! ')"),
+      njs_str("~%7D%7C%7B%60_%5E%5D%5C%5B%40%3F%3E%3D%3C%3B%3A%2F.-%2C%2B*)('%26%25%24%23%22!%20")},
+
+    { njs_str("decodeURI.name"),
+      njs_str("decodeURI")},
+
+    { njs_str("decodeURI.length"),
+      njs_str("1")},
+
+    { njs_str("decodeURI()"),
+      njs_str("undefined")},
+
+    { njs_str("decodeURI('%QQ')"),
+      njs_str("URIError")},
+
+    { njs_str("decodeURI('%')"),
+      njs_str("URIError")},
+
+    { njs_str("decodeURI('%0')"),
+      njs_str("URIError")},
+
+    { njs_str("decodeURI('%00')"),
+      njs_str("\0")},
+
+    { njs_str("decodeURI('%3012%D0%B0%D0%B1%D0%B2')"),
+      njs_str("012абв")},
+
+    { njs_str("decodeURI('%7e%7d%7c%7b%60%5f%5e%5d%5c%5b%40%3f%3e%3d%3c%3b%3a%2f%2e%2c%2b%2a%29%28%27%26%25%24%23%22%21%20')"),
+      njs_str("~}|{`_^]\\[%40%3f>%3d<%3b%3a%2f.%2c%2b*)('%26%%24%23\"! ")},
+
+    { njs_str("decodeURIComponent.name"),
+      njs_str("decodeURIComponent")},
+
+    { njs_str("decodeURIComponent.length"),
+      njs_str("1")},
+
+    { njs_str("decodeURIComponent('%7e%7d%7c%7b%60%5f%5e%5d%5c%5b%40%3f%3e%3d%3c%3b%3a%2f%2e%2c%2b%2a%29%28%27%26%25%24%23%22%21%20')"),
+      njs_str("~}|{`_^]\\[@?>=<;:/.,+*)('&%$#\"! ")},
+
+    { njs_str("decodeURI('%41%42%43').length"),
+      njs_str("3")},
+
+    { njs_str("decodeURI('%D0%B0%D0%B1%D0%B2').length"),
+      njs_str("3")},
+
+    { njs_str("decodeURI('%80%81%82').length"),
+      njs_str("3")},
+
+    /* Functions. */
+
+    { njs_str("return"),
+      njs_str("SyntaxError: Illegal return statement in 1") },
+
+    { njs_str("{return}"),
+      njs_str("SyntaxError: Illegal return statement in 1") },
+
+    { njs_str("\n{\nreturn;\n}"),
+      njs_str("SyntaxError: Illegal return statement in 3") },
+
+    { njs_str("if (1) function f(){}"),
+      njs_str("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+    { njs_str("if (1) { function f(){}}"),
+      njs_str("undefined") },
+
+    { njs_str("while (1) function f() { }"),
+      njs_str("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+    { njs_str("while (1) { break; function f(){}}"),
+      njs_str("undefined") },
+
+    { njs_str("for (;;) function f() { }"),
+      njs_str("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+    { njs_str("for (;;) { break; function f(){}}"),
+      njs_str("undefined") },
+
+    { njs_str("do function f() { } while (0)"),
+      njs_str("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+    { njs_str("function f() { return 1; } { function f() { return 2; } } f()"),
+      njs_str("1") },
+
+    { njs_str("function f() { return 1; } { function f() { return 2; } { function f() { return 3; } }} f()"),
+      njs_str("1") },
+
+    { njs_str("{function f() {} {} f() }"),
+      njs_str("undefined") },
+
+    { njs_str("{ var f; function f() {} }"),
+      njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+    { njs_str("{ function f() {} var f; }"),
+      njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+    { njs_str("{ function f() {} { var f }}"),
+      njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+    { njs_str("function f() { return f() } f()"),
+      njs_str("RangeError: Maximum call stack size exceeded") },
+
+    { njs_str("function () { } f()"),
+      njs_str("SyntaxError: Unexpected token \"(\" in 1") },
+
+    { njs_str("function f() { }"),
+      njs_str("undefined") },
+
+    { njs_str("function f() { }; f.length"),
+      njs_str("0") },
+
+    { njs_str("function f() { }; f.length = 1"),
+      njs_str("TypeError: Cannot assign to read-only property \"length\" of function") },
+
+    { njs_str("function f(...rest) { }; f.length"),
+      njs_str("0") },
+
+    { njs_str("function f(...rest) { }; var binded = f.bind(this, [1,2]);"
+                 "binded.length"),
+      njs_str("0") },
+
+    { njs_str("function f(a,a) { };"),
+      njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+    { njs_str("function f(a,b,a) { };"),
+      njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+    { njs_str("function f(a, ...a) { };"),
+      njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+    { njs_str("(function(a,a) { })"),
+      njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+    { njs_str("(function(a,...a) { })"),
+      njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+    { njs_str("(function f(a,a) { })"),
+      njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+    { njs_str("(function f(a,...a) { })"),
+      njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+    { njs_str("function f(a,b) { }; f.length"),
+      njs_str("2") },
+
+    { njs_str("function f(a,...rest) { }; f.length"),
+      njs_str("1") },
+
+    { njs_str("function f(a,b) { }; var ff = f.bind(f, 1); ff.length"),
+      njs_str("1") },
+
+    { njs_str("Object((new Date(0)).toJSON())+0"),
+      njs_str("1970-01-01T00:00:00.000Z0") },
+
+    { njs_str("Object((new Array(0)).toString())+0"),
+      njs_str("0") },
+
+    { njs_str("JSON.parse.length"),
+      njs_str("2") },
+
+    { njs_str("JSON.parse.bind(JSON, '[]').length"),
+      njs_str("1") },
+
+    { njs_str("var o = {}; o.hasOwnProperty.length"),
+      njs_str("1") },
+
+    { njs_str("var x; function f() { }"),
+      njs_str("undefined") },
+
+    { njs_str("function f() { } f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f() { ; } f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f() { ;; } f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f() { return } f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f() { return; } f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f() { return;; } f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f() { return 1 } f()"),
+      njs_str("1") },
+
+    { njs_str("function f() { return 1; } f()"),
+      njs_str("1") },
+
+    { njs_str("function f() { return 1;; } f()"),
+      njs_str("1") },
+
+    { njs_str("function f() { return 1\n 2 } f()"),
+      njs_str("1") },
+
+    { njs_str("function f() { return 1\n 2 } f()"),
+      njs_str("1") },
+
+    { njs_str("(function f() { return 2.toString(); })()"),
+      njs_str("SyntaxError: Unexpected token \"toString\" in 1") },
+
+    { njs_str("(function f() { return 2..toString(); })()"),
+      njs_str("2") },
+
+    { njs_str("function f(a) { if (a) return 'OK' } f(1)+f(0)"),
+      njs_str("OKundefined") },
+
+    { njs_str("function f(a) { if (a) return 'OK'; } f(1)+f(0)"),
+      njs_str("OKundefined") },
+
+    { njs_str("function f(a) { if (a) return 'OK';; } f(1)+f(0)"),
+      njs_str("OKundefined") },
+
+    { njs_str("var a = 1; a()"),
+      njs_str("TypeError: number is not a function") },
+
+    { njs_str("var o = {a:1}; o.a()"),
+      njs_str("TypeError: (intermediate value)[\"a\"] is not a function") },
+
+    { njs_str("(function(){})()"),
+      njs_str("undefined") },
+
+    { njs_str("var q = 1; function x(a, b, c) { q = a } x(5); q"),
+      njs_str("5") },
+
+    { njs_str("function x(a) { while (a < 2) a++; return a + 1 } x(1) "),
+      njs_str("3") },
+
+    { njs_str("(function(){(function(){(function(){(function(){"
+                    "(function(){(function(){(function(){})})})})})})})"),
+      njs_str("SyntaxError: The maximum function nesting level is \"5\" in 1") },
+
+    { njs_str("Function.prototype.toString = function () {return 'X'};"
+                 "eval"),
+      njs_str("X") },
+
+    { njs_str("var o = {f:function(x){ return x**2}}; o.f\n(2)"),
+      njs_str("4") },
+
+    { njs_str("var o = {f:function(x){ return x**2}}; o\n.f\n(2)"),
+      njs_str("4") },
+
+    { njs_str("var o = {f:function(x){ return x**2}}; o\n.\nf\n(2)"),
+      njs_str("4") },
+
+    { njs_str("function f(x){ return x**2}; [f(2)\n, f\n(2),\nf\n(\n2),\nf\n(\n2\n)]"),
+      njs_str("4,4,4,4") },
+
+    { njs_str("function f (x){ return x**2}; f\n(2)"),
+      njs_str("4") },
+
+    { njs_str("function f (x){ return x**2}; f\n(\n2)"),
+      njs_str("4") },
+
+    { njs_str("function f (x){ return x**2}; f\n(\n2\n)"),
+      njs_str("4") },
+
+    { njs_str("function f (x){ return x**2}; f\n(2\n)"),
+      njs_str("4") },
+
+    { njs_str("function f (x){ return x**2}; f(2\n)"),
+      njs_str("4") },
+
+    { njs_str("var fn = Function.prototype.call; fn.call(() => 1)"),
+      njs_str("1") },
+
+    { njs_str("var fn = Function.prototype.call; fn.call(fn, () => 1)"),
+      njs_str("1") },
+
+    { njs_str("var fn = Function.prototype.call; fn.call(fn, fn, () => 1)"),
+      njs_str("1") },
+
+    { njs_str("eval.call.call(Number)"),
+      njs_str("0") },
+
+    { njs_str("URIError.apply.apply(RegExp)"),
+      njs_str("/(?:)/") },
+
+    { njs_str("[0].some(function(){return Array.call.bind(isNaN)}())"),
+      njs_str("false") },
+
+    /* Recursive factorial. */
+
+    { njs_str("function f(a) {"
+                 "    if (a > 1)"
+                 "        return a * f(a - 1)\n"
+                 "    return 1"
+                 "}"
+                 "f(10)"),
+      njs_str("3628800") },
+
+    /* Recursive factorial. */
+
+    { njs_str("function f(a) { return (a > 1) ? a * f(a - 1) : 1 } f(10)"),
+      njs_str("3628800") },
+
+    { njs_str("var g = function f(a) { return (a > 1) ? a * f(a - 1) : 1 };"
+                 "g(10)"),
+      njs_str("3628800") },
+
+    { njs_str("(function f(a) { return (a > 1) ? a * f(a - 1) : 1 })(10)"),
+      njs_str("3628800") },
+
+    /* Nested functions and closures. */
+
+    { njs_str("function f() { var x = 4; "
+                 "function g() { return x }; return g(); } f()"),
+      njs_str("4") },
+
+    { njs_str("function f(a) { function g(b) { return a + b } return g }"
+                 "var k = f('a'); k('b')"),
+      njs_str("ab") },
+
+    { njs_str("function f(a) { return function(b) { return a + b } }"
+                 "var k = f('a'); k('b')"),
+      njs_str("ab") },
+
+    { njs_str("function f(a) { return function(b) { return a + b } }"
+                 "var k = f('a'), m = f('b'); k('c') + m('d')"),
+      njs_str("acbd") },
+
+    { njs_str("function f(a) { return "
+                 "function(b) { return function(c) { return a + b + c } } }"
+                 "var g = f('a'), k = g('b'), m = g('c'); k('d') + m('e')"),
+      njs_str("abdace") },
+
+    { njs_str("function f(a) {"
+                 "function g() { return a }; return g; }"
+                 "var y = f(4); y()"),
+      njs_str("4") },
+
+    { njs_str("function f() { var x = 4; "
+                 "return function() { return x } }"
+                 "var y = f(); y()"),
+      njs_str("4") },
+
+    { njs_str("function f() { var x = 4;"
+                 "function g() { if (1) { return 2 + x; } }; return g }"
+                 "var y = f(); y()"),
+      njs_str("6") },
+
+    { njs_str("var x; var y = 4;"
+                 "function f() { function h() { x = 3; return y; } }"),
+      njs_str("undefined") },
+
+    { njs_str("function f() {"
+                 "    var a = 'a';"
+                 "    if (0) { a = 'b' };"
+                 "    function f2() { return a };"
+                 "    return f2"
+                 "};"
+                 "f()()"),
+      njs_str("a") },
+
+    { njs_str("function f() {"
+                 "    var a = 'a'; "
+                 "    if (0) { if (0) {a = 'b'} };"
+                 "    function f2() { return a };"
+                 "    return f2"
+                 "};"
+                 "f()()"),
+      njs_str("a") },
+
+    { njs_str("function f() { var a = f2(); }"),
+      njs_str("undefined") },
+
+    { njs_str("function f() { var a = f2(); } f();"),
+      njs_str("ReferenceError: \"f2\" is not defined in 1") },
+
+    { njs_str("typeof Buffer !== 'undefined' ? Buffer : function Buffer(){}"),
+      njs_str("[object Function]") },
+
+    { njs_str("1 == 2 ? func() : '123'"),
+      njs_str("123") },
+
+    { njs_str("1 == 1 ? func() : '123'"),
+      njs_str("ReferenceError: \"func\" is not defined in 1") },
+
+    { njs_str("function f(){ if (1 == 1) { 1 == 2 ? some_var : '123' } }; f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f(){ if (1 == 1) { 1 == 1 ? some_var : '123' } }; f()"),
+      njs_str("ReferenceError: \"some_var\" is not defined in 1") },
+
+    { njs_str("function f(){ if (1 == 1) { 1 == 2 ? some_func() : '123' } }; f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f(){ if (1 == 1) { 1 == 1 ? some_func() : '123' } }; f()"),
+      njs_str("ReferenceError: \"some_func\" is not defined in 1") },
+
+    { njs_str("(function(){ function f() {return f}; return f()})()"),
+      njs_str("[object Function]") },
+
+    { njs_str("function  f() {}; f.toString = ()=> 'F'; ({'F':1})[f]"),
+      njs_str("1") },
+
+    { njs_str("var a = ''; "
+                 "function f(list) {"
+                 "    function add(v) {a+=v};"
+                 "    list.forEach(function(v) {add(v)});"
+                 "};"
+                 "f(['a', 'b', 'c']); a"),
+      njs_str("abc") },
+
+    { njs_str("var l = [];"
+                 "var f = function() { "
+                 "    function f2() { l.push(f); l.push(f2); }; "
+                 "    l.push(f); l.push(f2); "
+                 "    f2(); "
+                 "}; "
+                 "f(); "
+                 "l.every(function(v) {return typeof v == 'function'})"),
+      njs_str("true") },
+
+    { njs_str("var l = [];"
+                 "function baz() {"
+                 "  function foo(v) {"
+                 "     function bar() { foo(0); }"
+                 "     l.push(v);"
+                 "     if (v === 1) { bar(); }"
+                 "  }"
+                 "  foo(1);"
+                 "}; baz(); l"),
+      njs_str("1,0") },
+
+    { njs_str("var gen = (function(){  "
+                 "           var s = 0; "
+                 "           return { inc: function() {s++}, "
+                 "                    s: function() {return s} };});"
+                 "var o1 = gen(); var o2 = gen();"
+                 "[o1.s(),o2.s(),o1.inc(),o1.s(),o2.s(),o2.inc(),o1.s(),o2.s()]"),
+      njs_str("0,0,,1,0,,1,1") },
+
+    /* Recursive fibonacci. */
+
+    { njs_str("function fibo(n) {"
+                 "    if (n > 1)"
+                 "        return fibo(n-1) + fibo(n-2)\n"
+                 "     return 1"
+                 "}"
+                 "fibo(10)"),
+      njs_str("89") },
+
+    { njs_str("function fibo(n) {"
+                 "    if (n > 1)"
+                 "        return fibo(n-1) + fibo(n-2)\n"
+                 "     return '.'"
+                 "}"
+                 "fibo(10).length"),
+      njs_str("89") },
+
+    { njs_str("function fibo(n) {"
+                 "    if (n > 1)"
+                 "        return fibo(n-1) + fibo(n-2)\n"
+                 "     return 1"
+                 "}"
+                 "fibo('10')"),
+      njs_str("89") },
+
+    { njs_str("function add(a, b) { return a + b }"
+                 "function mul(a, b) { return a * b }"
+                 "function f(a, b) {"
+                 "    return a + mul(add(1, 2), add(2, 3)) + b"
+                 "}"
+                 "f(30, 70)"),
+      njs_str("115") },
+
+    { njs_str("function a(x, y) { return x + y }"
+                 "function b(x, y) { return x * y }"
+                 "a(3, b(4, 5))"),
+      njs_str("23") },
+
+    { njs_str("function x(n) { return n }; x('12'.substr(1))"),
+      njs_str("2") },
+
+    { njs_str("function f(a) { a *= 2 } f(10)"),
+      njs_str("undefined") },
+
+    { njs_str("function f() { return 5 } f()"),
+      njs_str("5") },
+
+    { njs_str("function g(x) { return x + 1 }"
+                 "function f(x) { return x } f(g)(2)"),
+      njs_str("3") },
+
+    { njs_str("function f() { return 5 } f(1)"),
+      njs_str("5") },
+
+    { njs_str("function f() {} f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f() {;} f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f(){return} f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f(){return;} f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f(){return\n1} f()"),
+      njs_str("undefined") },
+
+    { njs_str("function f(a) { return a + 1 } var b = f(2); b"),
+      njs_str("3") },
+
+    { njs_str("var f = function(a) { a *= 2; return a }; f(10)"),
+      njs_str("20") },
+
+    { njs_str("var f = function b(a) { a *= 2; return a }; f(10)"),
+      njs_str("20") },
+
+    { njs_str("var f = function b(a) { a *= 2; return a }; b(10)"),
+      njs_str("ReferenceError: \"b\" is not defined in 1") },
+
+    { njs_str("var f; f = function(a) { a *= 2; return a }; f(10)"),
+      njs_str("20") },
+
+    { njs_str("var f; f = function b(a) { a *= 2; return a }; f(10)"),
+      njs_str("20") },
+
+    { njs_str("var a, f = a = function(a) { a *= 2; return a }; f(10)"),
+      njs_str("20") },
+
+    { njs_str("var a, f = a = function(a) { a *= 2; return a }; a(10)"),
+      njs_str("20") },
+
+    { njs_str("var f = function b(a) { a *= 2; return a } = 5"),
+      njs_str("ReferenceError: Invalid left-hand side in assignment in 1") },
+
+    { njs_str("function a() { return { x:2} }; var b = a(); b.x"),
+      njs_str("2") },
+
+    { njs_str("var a = {}; function f(a) { return a + 1 } a.b = f(2); a.b"),
+      njs_str("3") },
+
+    { njs_str("(function(x) { return x + 1 })(2)"),
+      njs_str("3") },
+
+    { njs_str("(function(x) { return x + 1 }(2))"),
+      njs_str("3") },
+
+    { njs_str("var a = function() { return 1 }(); a"),
+      njs_str("1") },
+
+    { njs_str("var a = (function() { return 1 })(); a"),
+      njs_str("1") },
+
+    { njs_str("var a = (function(a) { return a + 1 })(2); a"),
+      njs_str("3") },
+
+    { njs_str("var a = (function(a) { return a + 1 }(2)); a"),
+      njs_str("3") },
+
+    { njs_str("var a = +function(a) { return a + 1 }(2); a"),
+      njs_str("3") },
+
+    { njs_str("var a = -function(a) { return a + 1 }(2); a"),
+      njs_str("-3") },
+
+    { njs_str("var a = !function(a) { return a + 1 }(2); a"),
+      njs_str("false") },
+
+    { njs_str("var a = ~function(a) { return a + 1 }(2); a"),
+      njs_str("-4") },
+
+    { njs_str("var a = void function(a) { return a + 1 }(2); a"),
+      njs_str("undefined") },
+
+    { njs_str("var a = true && function(a) { return a + 1 }(2); a"),
+      njs_str("3") },
+
+    { njs_str("var a; a = 0, function(a) { return a + 1 }(2); a"),
+      njs_str("0") },
+
+    { njs_str("var a = (0, function(a) { return a + 1 }(2)); a"),
+      njs_str("3") },
+
+    { njs_str("var a = 0, function(a) { return a + 1 }(2); a"),
+      njs_str("SyntaxError: Unexpected token \"function\" in 1") },
+
+    { njs_str("var a = (0, function(a) { return a + 1 }(2)); a"),
+      njs_str("3") },
+
+    { njs_str("var a = +function f(a) { return a + 1 }(2);"
+                 "var b = f(5); a"),
+      njs_str("ReferenceError: \"f\" is not defined in 1") },
+
+    { njs_str("var o = { f: function(a) { return a * 2 } }; o.f(5)"),
+      njs_str("10") },
+
+    { njs_str("var o = {}; o.f = function(a) { return a * 2 }; o.f(5)"),
+      njs_str("10") },
+
+    { njs_str("var o = { x: 1, f: function() { return this.x } }; o.f()"),
+      njs_str("1") },
+
+    { njs_str("var o = { x: 1, f: function(a) { return this.x += a } };"
+                 "o.f(5) +' '+ o.x"),
+      njs_str("6 6") },
+
+    { njs_str("var f = function(a) { return 3 }; f.call()"),
+      njs_str("3") },
+
+    { njs_str("var f = function(a) { return this }; f.call(5)"),
+      njs_str("5") },
+
+    { njs_str("var f = function(a, b) { return this + a }; f.call(5, 1)"),
+      njs_str("6") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "f.call(5, 1, 2)"),
+      njs_str("8") },
+
+    { njs_str("var f = function(a) { return 3 }; f.apply()"),
+      njs_str("3") },
+
+    { njs_str("var f = function(a) { return this }; f.apply(5)"),
+      njs_str("5") },
+
+    { njs_str("var f = function(a) { return this + a }; f.apply(5, 1)"),
+      njs_str("TypeError: second argument is not an array-like object") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "f.apply(5, [1, 2])"),
+      njs_str("8") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "f.apply(5, [1, 2], 3)"),
+      njs_str("8") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "f.apply(5, {'length':2, '0':1, '1':2})"),
+      njs_str("8") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "f.apply(5, {'length':2, '0':1, '1':2, '2':3})"),
+      njs_str("8") },
+
+    { njs_str("var f = function(a, b, c) { return this + a + b + c};"
+                 "f.apply(\"a\", {'length':2, '0':1, '1':2, '2':3})"),
+      njs_str("a12undefined") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "f.apply(5, {'length':3, '0':1, '1':2, '2':3})"),
+      njs_str("8") },
+
+    { njs_str("var f = function(a) { return this + a };"
+                 "f.apply(5, {'nolength':3, '0':1, '1':2})"),
+      njs_str("NaN") },
+
+    { njs_str("var f = function(a) { return this };"
+                 "f.apply(5, {'nolength':3, '0':1, '1':2})"),
+      njs_str("5") },
+
+    { njs_str("var f = function(a, b, c) { return this + a + b + c };"
+                 "f.apply(\"a\", {'length':3, '0':1, '1':2})"),
+      njs_str("a12undefined") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "f.apply(\"a\", {'length':2, '0':undefined, '1':null})"),
+      njs_str("aundefinednull") },
+
+    { njs_str("var f = function() { return this };"
+                 "f.apply(123, {})"),
+      njs_str("123") },
+
+    { njs_str("String.prototype.concat.apply('a', "
+                 "{length:2, 0:{toString:function() {return 'b'}}, 1:'c'})"),
+      njs_str("abc") },
+
+#if 0
+    /* TODO: non-primitive length values are not supported yet. */
+    { njs_str("String.prototype.concat.apply('a',"
+                 "{length:{valueOf:function() {return 2}},  0:'b', 1:'c'})"),
+      njs_str("abc") },
+#else
+    { njs_str("String.prototype.concat.apply('a',"
+                 "{length:{valueOf:function() {return 2}},  0:'b', 1:'c'})"),
+      njs_str("TypeError: non-primitive length values are not supported") },
+#endif
+
+    { njs_str("var a = function() { return 1 } + ''; a"),
+      njs_str("[object Function]") },
+
+    { njs_str("''.concat.call()"),
+      njs_str("TypeError: \"this\" argument is null or undefined") },
+
+    { njs_str("''.concat.call('a', 'b', 'c')"),
+      njs_str("abc") },
+
+    { njs_str("''.concat.call('a')"),
+      njs_str("a") },
+
+    { njs_str("''.concat.call('a', [ 'b', 'c' ])"),
+      njs_str("ab,c") },
+
+    { njs_str("''.concat.call('a', [ 'b', 'c' ], 'd')"),
+      njs_str("ab,cd") },
+
+    { njs_str("''.concat.apply()"),
+      njs_str("TypeError: \"this\" argument is null or undefined") },
+
+    { njs_str("''.concat.apply('a')"),
+      njs_str("a") },
+
+    { njs_str("''.concat.apply('a', 'b')"),
+      njs_str("TypeError: second argument is not an array-like object") },
+
+    { njs_str("''.concat.apply('a', [ 'b', 'c' ])"),
+      njs_str("abc") },
+
+    { njs_str("''.concat.apply('a', [ 'b', 'c' ], 'd')"),
+      njs_str("abc") },
+
+    { njs_str("[].join.call([1,2,3])"),
+      njs_str("1,2,3") },
+
+    { njs_str("[].join.call([1,2,3], ':')"),
+      njs_str("1:2:3") },
+
+    { njs_str("[].join.call([1,2,3], 55)"),
+      njs_str("1552553") },
+
+    { njs_str("[].join.call()"),
+      njs_str("TypeError: cannot convert undefined to object") },
+
+    { njs_str("[].slice.call()"),
+      njs_str("TypeError: cannot convert undefined to object") },
+
+    { njs_str("function f(a) {} ; var a = f; var b = f; a === b"),
+      njs_str("true") },
+
+    { njs_str("function f() {} ; f.toString()"),
+      njs_str("[object Function]") },
+
+    { njs_str("function f() {}; f"),
+      njs_str("[object Function]") },
+
+    { njs_str("function f() {}; f = f + 1; f"),
+      njs_str("[object Function]1") },
+
+    { njs_str("function a() { return 1 }"
+                 "function b() { return a }"
+                 "function c() { return b }"
+                 "c()()()"),
+      njs_str("1") },
+
+#if 0
+    { njs_str("function f() {}; f += 1; f"),
+      njs_str("[object Function]1") },
+#endif
+
+    { njs_str("function f() {}; function g() { return f }; g()"),
+      njs_str("[object Function]") },
+
+    { njs_str("function f(a) { return this+a }; var a = f; a.call('0', 1)"),
+      njs_str("01") },
+
+    { njs_str("function f(a) { return this+a }; f.call('0', 1)"),
+      njs_str("01") },
+
+    { njs_str("function f(a) { return this+a };"
+                 "function g(f, a, b) { return f.call(a, b) }; g(f, '0', 1)"),
+      njs_str("01") },
+
+    { njs_str("function f(a) { return this+a };"
+                 "var o = { g: function (f, a, b) { return f.call(a, b) } };"
+                 "o.g(f, '0', 1)"),
+      njs_str("01") },
+
+    { njs_str("var concat = ''.concat; concat(1,2,3)"),
+      njs_str("TypeError: \"this\" argument is null or undefined") },
+
+    { njs_str("var concat = ''.concat; concat.call(1,2,3)"),
+      njs_str("123") },
+
+    { njs_str("var concat = ''.concat; concat.yes = 'OK';"
+                 "concat.call(1,2,3, concat.yes)"),
+      njs_str("123OK") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1'); b('2', '3')"),
+      njs_str("123") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1', '2'); b('3')"),
+      njs_str("123") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1', 2, '3'); b()"),
+      njs_str("123") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1'); b.call('0', '2', '3')"),
+      njs_str("123") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1', '2'); b.call('0', '3')"),
+      njs_str("123") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1', '2', '3'); b.call('0')"),
+      njs_str("123") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1', '2', '3'); b.call()"),
+      njs_str("123") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1'); b.apply('0', ['2', '3'])"),
+      njs_str("123") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1', '2'); b.apply('0', ['3'])"),
+      njs_str("123") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1', '2', '3'); b.apply('0')"),
+      njs_str("123") },
+
+    { njs_str("var f = function(a, b) { return this + a + b };"
+                 "var b = f.bind('1', '2', '3'); b.apply()"),
+      njs_str("123") },
+
+    { njs_str("function f(a, b) { return this + a + b }"
+                 "var b = f.bind('1', '2', '3'); b.apply()"),
+      njs_str("123") },
+
+    { njs_str("function f() { var a; return (function() { a = 1; return a; }).bind()() } f()"),
+      njs_str("1") },
+
+    { njs_str("function f() { var a; function baz() { a = 1; return a; } return baz.bind()(); } f()"),
+      njs_str("1") },
+
+    { njs_str("(function(){ var a = 1; return (function() { return a; })})().bind()()"),
+      njs_str("1") },
+
+    { njs_str("function f() { var a = 1; function baz() { return a; } return baz; } f().bind()()"),
+      njs_str("1") },
+
+    { njs_str("function f() { var t = 1; function baz() { return t; } return baz; }"
+                 "f().bind()();"),
+      njs_str("1") },
+
+    { njs_str("(function(a) { var s = typeof g, q = g; var g = 1; s += typeof g; function g(b) { return a + b }; return q; })(1)(2)"),
+      njs_str("3")},
+
+    { njs_str("(function(a) { var g = f; var f = 1; function f() { return a; } return g; })(42)()"),
+      njs_str("42") },
+
+    { njs_str("function f(a, b) { return a + b }"
+                 "f(3,4) === f.bind()(3,4)"),
+      njs_str("true") },
+
+    { njs_str("var obj = {prop:'abc'}; "
+                 "var func = function(x) { "
+                 "    return this === obj && x === 1 && arguments[0] === 1 "
+                 "           && arguments.length === 1 && this.prop === 'abc';"
+                 "};"
+                 "Function.prototype.bind.call(func, obj, 1)()"),
+      njs_str("true") },
+
+    { njs_str("function F(a, b) { this.a = a + b }"
+                 "var o = new F(1, 2);"
+                 "o.a"),
+      njs_str("3") },
+
+    { njs_str("function F(a, b) { this.a = a + b; return { a: 7 } }"
+                 "var o = new F(1, 2);"
+                 "o.a"),
+      njs_str("7") },
+
+    { njs_str("function F(a, b) { return }"
+                 "F.prototype.constructor === F"),
+      njs_str("true") },
+
+    { njs_str("function F() { return }"
+                 "F.prototype.ok = 'OK';"
+                 "var o = new F(); o.ok"),
+      njs_str("OK") },
+
+    { njs_str("function F() { return }"
+                 "var o = new F();"
+                 "o.constructor === F"),
+      njs_str("true") },
+
+    { njs_str("function F() { return }"
+                 "var o = new F();"
+                 "o.__proto__ === F.prototype"),
+      njs_str("true") },
+
+    { njs_str("var f = { F: function(){} }; var o = new f.F();"
+                 "o.__proto__ === f.F.prototype"),
+      njs_str("true") },
+
+    { njs_str("function F(){}; typeof F.prototype"),
+      njs_str("object") },
+
+    { njs_str("var F = function (){}; typeof F.prototype"),
+      njs_str("object") },
+
+    { njs_str("new decodeURI('%00')"),
+      njs_str("TypeError: function is not a constructor")},
+
+    { njs_str("new ''.toString"),
+      njs_str("TypeError: function is not a constructor")},
+
+    { njs_str("function F() { return Number }"
+                 "var o = new (F())(5);"
+                 "typeof o +' '+ o"),
+      njs_str("object 5") },
+
+    { njs_str("function F() { return Number }"
+                 "var o = new (F());"
+                 "typeof o +' '+ o"),
+      njs_str("object 0") },
+
+    { njs_str("var o = new function F() { return Number }()(5);"
+                 "typeof o +' '+ o"),
+      njs_str("number 5") },
+
+    { njs_str("var o = new (function F() { return Number }())(5);"
+                 "typeof o +' '+ o"),
+      njs_str("object 5") },
+
+    { njs_str("var o = new (new function F() { return Number }())(5);"
+                 "typeof o +' '+ o"),
+      njs_str("object 5") },
+
+    { njs_str("var o = new new function F() { return Number }()(5);"
+                 "typeof o +' '+ o"),
+      njs_str("object 5") },
+
+    { njs_str("var b; function F(x) { return {a:x} }"
+                 "function G(y) { b = y; return F }"
+                 "var o = new G(3)(5);"
+                 "b + ' ' + o.a"),
+      njs_str("3 5") },
+
+    { njs_str("var b; function F(x) { return {a:x} }"
+                 "function G(y) { b = y; return F }"
+                 "var o = new (new G(3))(5);"
+                 "b + ' ' + o.a"),
+      njs_str("3 5") },
+
+    { njs_str("var b; function F(x) { return {a:x} }"
+                 "function G(y) { b = y; return F }"
+                 "var o = new new G(3)(5);"
+                 "b + ' ' + o.a"),
+      njs_str("3 5") },
+
+    { njs_str("var b; function F(x) { return {a:x} }"
+                 "var g = { G: function (y) { b = y; return F } };"
+                 "var o = new new g.G(3)(5);"
+                 "b + ' ' + o.a"),
+      njs_str("3 5") },
+
+    { njs_str("function a() { return function(x) { return x + 1 } }"
+                 "var b = a(); b(2)"),
+      njs_str("3") },
+
+    /* arguments object. */
+
+    { njs_str("arguments"),
+      njs_str("SyntaxError: \"arguments\" object in global scope in 1") },
+
+    { njs_str("{arguments}"),
+      njs_str("SyntaxError: \"arguments\" object in global scope in 1") },
+
+    { njs_str("var arguments"),
+      njs_str("SyntaxError: Identifier \"arguments\" is forbidden in var declaration in 1") },
+
+    { njs_str("for (var arguments in []) {}"),
+      njs_str("SyntaxError: Identifier \"arguments\" is forbidden in var declaration in 1") },
+
+    { njs_str("function arguments(){}"),
+      njs_str("SyntaxError: Identifier \"arguments\" is forbidden in function declaration in 1") },
+
+    { njs_str("(function () {arguments = [];})"),
+      njs_str("SyntaxError: Identifier \"arguments\" is forbidden as left-hand in assignment in 1") },
+
+    { njs_str("(function(){return arguments[0];})(1,2,3)"),
+      njs_str("1") },
+
+    { njs_str("(function(){return arguments[2];})(1,2,3)"),
+      njs_str("3") },
+
+    { njs_str("(function(){return arguments[3];})(1,2,3)"),
+      njs_str("undefined") },
+
+    { njs_str("(function(a,b,c){return a;})(1,2,3)"),
+      njs_str("1") },
+
+    { njs_str("(function(a,b,c){arguments[0] = 4; return a;})(1,2,3)"),
+      njs_str("1") },
+
+    { njs_str("(function(a,b,c){a = 4; return arguments[0];})(1,2,3)"),
+      njs_str("1") },
+
+    { njs_str("function check(v) {if (v == false) {throw TypeError('Too few arguments')}}; "
+                 "function f() {check(arguments.length > 1); return 1}; f()"),
+      njs_str("TypeError: Too few arguments") },
+
+    { njs_str("function check(v) {if (v == false) {throw TypeError('Too few arguments')}}; "
+                 "function f() {check(arguments.length > 1); return 1}; f(1,2)"),
+      njs_str("1") },
+
+    { njs_str("(function(a,b){delete arguments[0]; return arguments[0]})(1,1)"),
+      njs_str("undefined") },
+
+    { njs_str("(function(){return arguments.length;})()"),
+      njs_str("0") },
+
+    { njs_str("(function(){return arguments.length;})(1,2,3)"),
+      njs_str("3") },
+
+    { njs_str("(function(){arguments.length = 1; return arguments.length;})(1,2,3)"),
+      njs_str("1") },
+
+     { njs_str("(function(){return arguments[3];}).bind(null, 0)('a','b','c')"),
+       njs_str("c") },
+
+    { njs_str("(function(){return arguments.callee;})()"),
+      njs_str("TypeError: \"caller\", \"callee\" properties may not be accessed") },
+
+    { njs_str("(function(){return arguments.caller;})()"),
+      njs_str("TypeError: \"caller\", \"callee\" properties may not be accessed") },
+
+    { njs_str("function sum() { var args = Array.prototype.slice.call(arguments); "
+                 "return args.reduce(function(prev, curr) {return prev + curr})};"
+                 "[sum(1), sum(1,2), sum(1,2,3), sum(1,2,3,4)]"),
+      njs_str("1,3,6,10") },
+
+    { njs_str("function concat(sep) { var args = Array.prototype.slice.call(arguments, 1); "
+                 "return args.join(sep)};"
+                 "[concat('.',1,2,3), concat('+',1,2,3,4)]"),
+      njs_str("1.2.3,1+2+3+4") },
+
+    /* rest parameters. */
+
+    { njs_str("function myFoo(a,b,...other) { return other };"
+                 "myFoo(1,2,3,4,5);" ),
+      njs_str("3,4,5") },
+
+    { njs_str("function myFoo(a,b,...other, c) { return other };"),
+      njs_str("SyntaxError: Unexpected token \"c\" in 1") },
+
+    { njs_str("function sum(a, b, c, ...other) { return a+b+c+other[2] };"
+                 "sum(\"one \",2,\" three \",\"four \",\"five \",\"the long enough sixth argument \");"),
+      njs_str("one 2 three the long enough sixth argument ") },
+
+    { njs_str("function myFoo1(a,...other) { return other };"
+                 "function myFoo2(a,b,...other) { return other };"
+                 "myFoo1(1,2,3,4,5,myFoo2(1,2,3,4));"),
+      njs_str("2,3,4,5,3,4") },
+
+    { njs_str("function myFoo(...other) { return (other instanceof Array) };"
+                 "myFoo(1);" ),
+      njs_str("true") },
+
+    { njs_str("function myFoo(a,...other) { return other.length };"
+                 "myFoo(1,2,3,4,5);" ),
+      njs_str("4") },
+
+    { njs_str("function myFoo(a,b,...other) { return other };"
+                 "myFoo(1,2);" ),
+      njs_str("") },
+
+    /* arrow functions. */
+
+    { njs_str("()"),
+      njs_str("SyntaxError: Unexpected token \")\" in 1") },
+
+    { njs_str("() => "),
+      njs_str("SyntaxError: Unexpected end of input in 1") },
+
+    { njs_str("() => {"),
+      njs_str("SyntaxError: Unexpected end of input in 1") },
+
+    { njs_str("a\n => 1"),
+      njs_str("SyntaxError: Unexpected token \"=>\" in 2") },
+
+    { njs_str("new (()=>1)"),
+      njs_str("TypeError: function is not a constructor")},
+
+    { njs_str("(\n) => {}"),
+      njs_str("[object Function]") },
+
+    { njs_str("a => 1"),
+      njs_str("[object Function]") },
+
+    { njs_str("({f:()=>1, g:()=>2}).f()"),
+      njs_str("1") },
+
+    { njs_str("var f = f => {return 1;}; f()"),
+      njs_str("1") },
+
+    { njs_str("var f = (f) => {return 1;}; f()"),
+      njs_str("1") },
+
+    { njs_str("var f = (f, a, b) => {return 1;}; f()"),
+      njs_str("1") },
+
+    { njs_str("var f = () => {return 1;}; f()"),
+      njs_str("1") },
+
+    { njs_str("(f => {return 1;})()"),
+      njs_str("1") },
+
+    { njs_str("((f) => {return 1;})()"),
+      njs_str("1") },
+
+    { njs_str("(((f) => {return 1;}))()"),
+      njs_str("1") },
+
+    { njs_str("var f = f => 1; f()"),
+      njs_str("1") },
+
+    { njs_str("() => 1"),
+      njs_str("[object Function]") },
+
+    { njs_str("var f = ()=>{}; f()"),
+      njs_str("undefined") },
+
+    { njs_str("var f = ()=>({}); f()"),
+      njs_str("[object Object]") },
+
+    { njs_str("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
+                 "materials.map(material => { return material.length; });"),
+      njs_str("8,6,7,9") },
+
+    { njs_str("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
+                 "materials.map(material => material.length);"),
+      njs_str("8,6,7,9") },
+
+    { njs_str("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
+                 "materials.map(material => { material.length });"),
+      njs_str(",,,") },
+
+    { njs_str("function f(a, b, c) {a = 1; return () => { return arguments[1]; };};"
+                 "f(1, 2, 3)('a', 'b');"),
+      njs_str("2") },
+
+    { njs_str("var f = (...c) => { return (function() { return arguments.length; }).bind(null, c); };"
+                 "var x = f(1,'a',false, {}); x()"),
+      njs_str("1") },
+
+    { njs_str("var f = (...c) => { return (function() { return arguments.length; }).bind(null, c); };"
+                 "var x = f(1,'a',false, {}); x(1,2,3)"),
+      njs_str("4") },
+
+    { njs_str("function Car(){ this.age = 0; (() => { this.age++;})();}"
+                 "(new Car()).age"),
+      njs_str("1") },
+
+    { njs_str("function Car(){ this.age = 0; (function(){ this.age++;})();}"
+                 "(new Car()).age"),
+      njs_str("TypeError: cannot get property \"age\" of undefined") },
+
+    /* arrow functions + global this. */
+
+    { njs_str("(() => this)()"),
+      njs_str("[object Object]") },
+
+    { njs_str("(() => this).call('abc')"),
+      njs_str("[object Object]") },
+
+    { njs_str("(() => this).apply('abc')"),
+      njs_str("[object Object]") },
+
+    { njs_str("(() => this).bind('abc')()"),
+      njs_str("[object Object]") },
+
+    { njs_str("(function() { return (() => this); })()()"),
+      njs_str("undefined") },
+
+    { njs_str("(function() { return (() => this); }).call('abc')()"),
+      njs_str("abc") },
+
+    { njs_str("(function() { return (() => this); }).bind('abc')()()"),
+      njs_str("abc") },
+
+    { njs_str("(function() { return (() => this); })"
+                 ".call('abc').call('bca')"),
+      njs_str("abc") },
+
+    { njs_str("(function() { return (() => this); })"
+                 ".call('abc').bind('bca')()"),
+      njs_str("abc") },
+
+    { njs_str("(function() { return function() { return () => this; }; })"
+                 ".call('bca').call('abc')()"),
+      njs_str("abc") },
+
+     { njs_str("var f = () => 1; f.prototype"),
+       njs_str("undefined") },
+
+     { njs_str("var f = (a,b) => 0; f.length"),
+       njs_str("2") },
+
+    { njs_str("var o = Object.create(f => 1); o.length = 3"),
+      njs_str("TypeError: Cannot assign to read-only property \"length\" of object") },
+
+    /* Scopes. */
+
+    { njs_str("function f(x) { a = x } var a; f(5); a"),
+      njs_str("5") },
+
+    { njs_str("function f(x) { var a = x } var a = 2; f(5); a"),
+      njs_str("2") },
+
+    { njs_str("function f(a) { return a } var a = '2'; a + f(5)"),
+      njs_str("25") },
+
+    { njs_str("for (var i = 0; i < 5; i++); i"),
+      njs_str("5") },
+
+    { njs_str("for (var i = 0, j; i < 5; i++); j"),
+      njs_str("undefined") },
+
+    { njs_str("for (var i = 0, j, k = 3; i < 5; i++); k"),
+      njs_str("3") },
+
+    { njs_str("var o = { a: 1, b: 2, c: 3 }, s = ''; "
+                 "for (var i in o) { s += i }; s"),
+      njs_str("abc") },
+
+    { njs_str("var o = { a: 1, b: 2, c: 3 }; for (var i in o); i"),
+      njs_str("c") },
+
+    { njs_str("var o = {}; i = 7; for (var i in o); i"),
+      njs_str("7") },
+
+    { njs_str("var a = [1,2,3]; for (var i in a); i"),
+      njs_str("2") },
+
+    /* RegExp. */
+
+    { njs_str("/./x"),
+      njs_str("SyntaxError: Invalid RegExp flags \"x\" in 1") },
+
+    { njs_str("/"),
+      njs_str("SyntaxError: Unterminated RegExp \"/\" in 1") },
+
+    { njs_str("/a\n/"),
+      njs_str("SyntaxError: Unterminated RegExp \"/a\" in 1") },
+
+    { njs_str("/a\r/"),
+      njs_str("SyntaxError: Unterminated RegExp \"/a\" in 1") },
+
+    { njs_str("/a\\q/"),
+      njs_str("/a\\q/") },
+
+    { njs_str("/\\\\/"),
+      njs_str("/\\\\/") },
+
+    { njs_str("/\\\\\\/"),
+      njs_str("SyntaxError: Unterminated RegExp \"/\\\\\\/\" in 1") },
+
+    { njs_str("/\\\\\\\\/"),
+      njs_str("/\\\\\\\\/") },
+
+    { njs_str("/\\\\\\//"),
+      njs_str("/\\\\\\//") },
+
+    { njs_str("/[A-Z/]/"),
+      njs_str("/[A-Z/]/") },
+
+    { njs_str("/[A-Z\n]/"),
+      njs_str("SyntaxError: Unterminated RegExp \"/[A-Z\" in 1") },
+
+    { njs_str("/[A-Z\\\n]/"),
+      njs_str("SyntaxError: Unterminated RegExp \"/[A-Z\\\" in 1") },
+
+    { njs_str("/\\\n/"),
+      njs_str("SyntaxError: Unterminated RegExp \"/\\\" in 1") },
+
+    { njs_str("/^[A-Za-z0-9+/]{4}$/.test('////')"),
+      njs_str("true") },
+
+    { njs_str("'[]!\"#$%&\\'()*+,.\\/:;<=>?@\\^_`{|}-'.split('')"
+                 ".every(ch=>/[\\]\\[!\"#$%&'()*+,.\\/:;<=>?@\\^_`{|}-]/.test(ch))"),
+      njs_str("true") },
+
+    { njs_str("/a\\q/.test('a\\q')"),
+      njs_str("true") },
+
+    { njs_str("/(\\.(?!com|org)|\\/)/.test('ah.info')"),
+      njs_str("true") },
+
+    { njs_str("/(/.test('')"),
+      njs_str("SyntaxError: pcre_compile(\"(\") failed: missing ) in 1") },
+
+    { njs_str("/+/.test('')"),
+      njs_str("SyntaxError: pcre_compile(\"+\") failed: nothing to repeat at \"+\" in 1") },
+
+    { njs_str("/^$/.test('')"),
+      njs_str("true") },
+
+    { njs_str("var a = /\\d/; a.test('123')"),
+      njs_str("true") },
+
+    { njs_str("var a = /\\d/; a.test('abc')"),
+      njs_str("false") },
+
+    { njs_str("/\\d/.test('123')"),
+      njs_str("true") },
+
+    { njs_str("/\\d/.test(123)"),
+      njs_str("true") },
+
+    { njs_str("/undef/.test()"),
+      njs_str("true") },
+
+    { njs_str("var s = { toString: function() { return 123 } };"
+                 "/\\d/.test(s)"),
+      njs_str("true") },
+
+    { njs_str("/\\d/.test('abc')"),
+      njs_str("false") },
+
+    { njs_str("/abc/i.test('ABC')"),
+      njs_str("true") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* FIXME */
+    { njs_str("/абв/i.test('АБВ')"),
+      njs_str("true") },
+#endif
+
+    { njs_str("/\\x80/.test('\\u0080')"),
+      njs_str("true") },
+
+    { njs_str("/\\x80/.test('\\u0080'.toBytes())"),
+      njs_str("true") },
+
+    { njs_str("/α/.test('\\u03B1')"),
+      njs_str("true") },
+
+    { njs_str("/α/.test('\\u00CE\\u00B1'.toBytes())"),
+      njs_str("true") },
+
+    { njs_str("/\\d/.exec('123')"),
+      njs_str("1") },
+
+    { njs_str("/\\d/.exec(123)"),
+      njs_str("1") },
+
+    { njs_str("/undef/.exec()"),
+      njs_str("undef") },
+
+    { njs_str("var s = { toString: function() { return 123 } };"
+                 "/\\d/.exec(s)"),
+      njs_str("1") },
+
+    { njs_str("var a = /^$/.exec(''); a.length +' '+ a"),
+      njs_str("1 ") },
+
+    { njs_str("var r = /3/g; r.exec('123') +' '+ r.exec('3')"),
+      njs_str("3 null") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* FIXME */
+    { njs_str("var r = /бв/ig;"
+                 "var a = r.exec('АБВ');"
+                 "r.lastIndex +' '+ a +' '+ "
+                 "r.source +' '+ r.source.length +' '+ r"),
+      njs_str("3 БВ бв 2 /бв/gi") },
+#endif
+
+    { njs_str("var r = /\\x80/g; r.exec('\\u0081\\u0080'.toBytes());"
+                 "r.lastIndex +' '+ r.source +' '+ r.source.length +' '+ r"),
+      njs_str("1 \\x80 4 /\\x80/g") },
+
+    /*
+     * It seems that "/стоп/ig" fails on early PCRE versions.
+     * It fails at least in 8.1 and works at least in 8.31.
+     */
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* FIXME */
+    { njs_str("var r = /Стоп/ig;"
+                 "var a = r.exec('АБВДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯСТОП');"
+                 "r.lastIndex +' '+ a +' '+ r.source +' '+ r"),
+      njs_str("35 СТОП Стоп /Стоп/gi") },
+#endif
+
+    { njs_str("var r = /quick\\s(brown).+?(jumps)/ig;"
+                "var a = r.exec('The Quick Brown Fox Jumps Over The Lazy Dog');"
+                "a[0] +' '+ a[1] +' '+ a[2] +' '+ a[3] +' '+ "
+                "a.index +' '+ r.lastIndex +' '+ a.input"),
+      njs_str("Quick Brown Fox Jumps Brown Jumps undefined "
+                 "4 25 The Quick Brown Fox Jumps Over The Lazy Dog") },
+
+    { njs_str("var r = /a/.exec('a'); ['groups' in r, typeof r.groups]"),
+      njs_str("true,undefined") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* PCRE bug in groups code */
+    { njs_str("var r = /(?<m>[0-9]{2})\\/(?<d>[0-9]{2})\\/(?<y>[0-9]{4})/;"
+                 "var g = r.exec('12/31/1986').groups;"
+                 "g.d + '.' + g.m + '.' + g.y"),
+      njs_str("31.12.1986") },
+
+    { njs_str("var g = /(?<r>(?<no>no)?(?<yes>yes)?)/.exec('yes').groups;"
+                 "[Object.keys(g).length,'no' in g, typeof g.no, g.yes, g.r]"),
+      njs_str("3,true,undefined,yes,yes") },
+#endif
+
+    { njs_str("var s; var r = /./g; while (s = r.exec('abc')); s"),
+      njs_str("null") },
+
+    { njs_str("var r = /LS/i.exec(false); r[0]"),
+      njs_str("ls") },
+
+    { njs_str("var r = (/^.+$/mg), s = 'ab\\nc'; [r.exec(s), r.exec(s)]"),
+      njs_str("ab,c") },
+
+    { njs_str("var r = (/^.+$/mg); [r.global, r.multiline, r.ignoreCase]"),
+      njs_str("true,true,false") },
+
+    { njs_str("var r = /./; r"),
+      njs_str("/./") },
+
+    { njs_str("var r = new RegExp(); r"),
+      njs_str("/(?:)/") },
+
+    { njs_str("var r = new RegExp('.'); r"),
+      njs_str("/./") },
+
+    { njs_str("var r = new RegExp('.', 'ig'); r"),
+      njs_str("/./gi") },
+
+    { njs_str("var r = new RegExp('abc'); r.test('00abc11')"),
+      njs_str("true") },
+
+    { njs_str("var r = new RegExp('abc', 'i'); r.test('00ABC11')"),
+      njs_str("true") },
+
+    { njs_str("RegExp('α'.repeat(33)).toString()[32]"),
+      njs_str("α") },
+
+    { njs_str("new RegExp('', 'x')"),
+      njs_str("SyntaxError: Invalid RegExp flags \"x\"") },
+
+    { njs_str("RegExp({})"),
+      njs_str("/[object Object]/") },
+
+    { njs_str("RegExp(true)"),
+      njs_str("/true/") },
+
+    { njs_str("RegExp(undefined)"),
+      njs_str("/(?:)/") },
+
+    { njs_str("RegExp('abc', undefined)"),
+      njs_str("/abc/") },
+
+    { njs_str("RegExp('abc', {})"),
+      njs_str("SyntaxError: Invalid RegExp flags \"[object Object]\"") },
+
+    { njs_str("RegExp(/expr/)"),
+      njs_str("/expr/") },
+
+    { njs_str("RegExp(/expr/i).ignoreCase"),
+      njs_str("true") },
+
+    { njs_str("RegExp(/expr/, 'x')"),
+      njs_str("SyntaxError: Invalid RegExp flags \"x\"") },
+
+    { njs_str("RegExp(new RegExp('expr'))"),
+      njs_str("/expr/") },
+
+    { njs_str("RegExp(new RegExp('expr')).multiline"),
+      njs_str("false") },
+
+    { njs_str("RegExp(new RegExp('expr'), 'm').multiline"),
+      njs_str("true") },
+
+    { njs_str("new RegExp('[')"),
+      njs_str("SyntaxError: pcre_compile(\"[\") failed: missing terminating ] for character class") },
+
+    { njs_str("new RegExp('\\\\')"),
+      njs_str("SyntaxError: pcre_compile(\"\\\") failed: \\ at end of pattern") },
+
+    { njs_str("[0].map(RegExp().toString)"),
+      njs_str("TypeError: \"this\" argument is not a regexp") },
+
+    /* Non-standard ECMA-262 features. */
+
+    /* 0x10400 is not a surrogate pair of 0xD801 and 0xDC00. */
+
+    { njs_str("var chars = '𐐀'; chars.length +' '+ chars.charCodeAt(0)"),
+      njs_str("1 66560") },
+
+    /* es5id: 6.1, 0x104A0 is not a surrogate pair of 0xD801 and 0xDCA0. */
+
+    { njs_str("var chars = '𐒠'; chars.length +' '+ chars.charCodeAt(0)"),
+      njs_str("1 66720") },
+
+    /* Error object. */
+
+    { njs_str("Error()"),
+      njs_str("Error") },
+
+    { njs_str("new Error()"),
+      njs_str("Error") },
+
+    { njs_str("Error('e')"),
+      njs_str("Error: e") },
+
+    { njs_str("var e = Error('e'); e.name = 'E'; e"),
+      njs_str("E: e") },
+
+    { njs_str("var e = Error('e'); e.name = ''; e"),
+      njs_str("e") },
+
+    { njs_str("var e = Error(); e.name = ''; e"),
+      njs_str("") },
+
+    { njs_str("var e = Error(); e.name = ''; e.message = 'e'; e"),
+      njs_str("e") },
+
+    { njs_str("Error('e').name + ': ' + Error('e').message"),
+      njs_str("Error: e") },
+
+    { njs_str("Error(1)"),
+      njs_str("Error: 1") },
+
+    { njs_str("Error.__proto__ == Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("Error.prototype.name"),
+      njs_str("Error") },
+
+    { njs_str("Error.prototype.message"),
+      njs_str("") },
+
+    { njs_str("Error.prototype.constructor == Error"),
+      njs_str("true") },
+
+    { njs_str("Error.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("Error().__proto__ == Error.prototype"),
+      njs_str("true") },
+
+    { njs_str("Error().__proto__.__proto__ == Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("EvalError('e')"),
+      njs_str("EvalError: e") },
+
+    { njs_str("InternalError('e')"),
+      njs_str("InternalError: e") },
+
+    { njs_str("RangeError('e')"),
+      njs_str("RangeError: e") },
+
+    { njs_str("ReferenceError('e')"),
+      njs_str("ReferenceError: e") },
+
+    { njs_str("SyntaxError('e')"),
+      njs_str("SyntaxError: e") },
+
+    { njs_str("TypeError('e')"),
+      njs_str("TypeError: e") },
+
+    { njs_str("URIError('e')"),
+      njs_str("URIError: e") },
+
+    { njs_str("MemoryError('e')"),
+      njs_str("MemoryError") },
+
+    { njs_str("EvalError('e').name + ': ' + EvalError('e').message"),
+      njs_str("EvalError: e") },
+
+    { njs_str("InternalError('e').name + ': ' + InternalError('e').message"),
+      njs_str("InternalError: e") },
+
+    { njs_str("RangeError('e').name + ': ' + RangeError('e').message"),
+      njs_str("RangeError: e") },
+
+    { njs_str("ReferenceError('e').name + ': ' + ReferenceError('e').message"),
+      njs_str("ReferenceError: e") },
+
+    { njs_str("SyntaxError('e').name + ': ' + SyntaxError('e').message"),
+      njs_str("SyntaxError: e") },
+
+    { njs_str("TypeError('e').name + ': ' + TypeError('e').message"),
+      njs_str("TypeError: e") },
+
+    { njs_str("URIError('e').name + ': ' + URIError('e').message"),
+      njs_str("URIError: e") },
+
+    { njs_str("var e = EvalError('e'); e.name = 'E'; e"),
+      njs_str("E: e") },
+
+    { njs_str("var e = InternalError('e'); e.name = 'E'; e"),
+      njs_str("E: e") },
+
+    { njs_str("var e = RangeError('e'); e.name = 'E'; e"),
+      njs_str("E: e") },
+
+    { njs_str("var e = ReferenceError('e'); e.name = 'E'; e"),
+      njs_str("E: e") },
+
+    { njs_str("var e = SyntaxError('e'); e.name = 'E'; e"),
+      njs_str("E: e") },
+
+    { njs_str("var e = TypeError('e'); e.name = 'E'; e"),
+      njs_str("E: e") },
+
+    { njs_str("var e = URIError('e'); e.name = 'E'; e"),
+      njs_str("E: e") },
+
+    /* Memory object is immutable. */
+
+    { njs_str("var e = MemoryError('e'); e.name = 'E'"),
+      njs_str("TypeError: Cannot add property \"name\", object is not extensible") },
+
+    { njs_str("EvalError.prototype.name"),
+      njs_str("EvalError") },
+
+    { njs_str("InternalError.prototype.name"),
+      njs_str("InternalError") },
+
+    { njs_str("RangeError.prototype.name"),
+      njs_str("RangeError") },
+
+    { njs_str("ReferenceError.prototype.name"),
+      njs_str("ReferenceError") },
+
+    { njs_str("SyntaxError.prototype.name"),
+      njs_str("SyntaxError") },
+
+    { njs_str("TypeError.prototype.name"),
+      njs_str("TypeError") },
+
+    { njs_str("URIError.prototype.name"),
+      njs_str("URIError") },
+
+    { njs_str("MemoryError.prototype.name"),
+      njs_str("InternalError") },
+
+    { njs_str("EvalError.prototype.message"),
+      njs_str("") },
+
+    { njs_str("InternalError.prototype.message"),
+      njs_str("") },
+
+    { njs_str("RangeError.prototype.message"),
+      njs_str("") },
+
+    { njs_str("ReferenceError.prototype.message"),
+      njs_str("") },
+
+    { njs_str("SyntaxError.prototype.message"),
+      njs_str("") },
+
+    { njs_str("TypeError.prototype.message"),
+      njs_str("") },
+
+    { njs_str("URIError.prototype.message"),
+      njs_str("") },
+
+    { njs_str("MemoryError.prototype.message"),
+      njs_str("") },
+
+    { njs_str("EvalError.prototype.constructor == EvalError"),
+      njs_str("true") },
+
+    { njs_str("RangeError.prototype.constructor == RangeError"),
+      njs_str("true") },
+
+    { njs_str("ReferenceError.prototype.constructor == ReferenceError"),
+      njs_str("true") },
+
+    { njs_str("SyntaxError.prototype.constructor == SyntaxError"),
+      njs_str("true") },
+
+    { njs_str("TypeError.prototype.constructor == TypeError"),
+      njs_str("true") },
+
+    { njs_str("URIError.prototype.constructor == URIError"),
+      njs_str("true") },
+
+    { njs_str("EvalError.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("RangeError.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("ReferenceError.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("SyntaxError.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("TypeError.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("URIError.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("EvalError().__proto__ == EvalError.prototype"),
+      njs_str("true") },
+
+    { njs_str("RangeError().__proto__ == RangeError.prototype"),
+      njs_str("true") },
+
+    { njs_str("ReferenceError().__proto__ == ReferenceError.prototype"),
+      njs_str("true") },
+
+    { njs_str("SyntaxError().__proto__ == SyntaxError.prototype"),
+      njs_str("true") },
+
+    { njs_str("TypeError().__proto__ == TypeError.prototype"),
+      njs_str("true") },
+
+    { njs_str("URIError().__proto__ == URIError.prototype"),
+      njs_str("true") },
+
+    { njs_str("EvalError().__proto__.__proto__ == Error.prototype"),
+      njs_str("true") },
+
+    { njs_str("RangeError().__proto__.__proto__ == Error.prototype"),
+      njs_str("true") },
+
+    { njs_str("ReferenceError().__proto__.__proto__ == Error.prototype"),
+      njs_str("true") },
+
+    { njs_str("SyntaxError().__proto__.__proto__ == Error.prototype"),
+      njs_str("true") },
+
+    { njs_str("TypeError().__proto__.__proto__ == Error.prototype"),
+      njs_str("true") },
+
+    { njs_str("URIError().__proto__.__proto__ == Error.prototype"),
+      njs_str("true") },
+
+    { njs_str("MemoryError().__proto__ == MemoryError.prototype"),
+      njs_str("true") },
+
+    { njs_str("MemoryError().__proto__.__proto__ == Error.prototype"),
+      njs_str("true") },
+
+    { njs_str("typeof Error()"),
+      njs_str("object") },
+
+    { njs_str("typeof EvalError()"),
+      njs_str("object") },
+
+    { njs_str("typeof InternalError()"),
+      njs_str("object") },
+
+    { njs_str("typeof RangeError()"),
+      njs_str("object") },
+
+    { njs_str("typeof ReferenceError()"),
+      njs_str("object") },
+
+    { njs_str("typeof SyntaxError()"),
+      njs_str("object") },
+
+    { njs_str("typeof TypeError()"),
+      njs_str("object") },
+
+    { njs_str("typeof URIError()"),
+      njs_str("object") },
+
+    { njs_str("typeof MemoryError()"),
+      njs_str("object") },
+
+    /* Exceptions. */
+
+    { njs_str("throw null"),
+      njs_str("null") },
+
+    { njs_str("var a; try { throw null } catch (e) { a = e } a"),
+      njs_str("null") },
+
+    { njs_str("var a; try { throw Error('e') } catch (e) { a = e.message } a"),
+      njs_str("e") },
+
+    { njs_str("var a; try { NaN.toString(NaN) } catch (e) { a = e.name } a"),
+      njs_str("RangeError") },
+
+    { njs_str("try { throw null } catch (e) { throw e }"),
+      njs_str("null") },
+
+    { njs_str("try { throw Error('e') } catch (e) { throw Error(e.message + '2') }"),
+      njs_str("Error: e2") },
+
+    { njs_str("try { throw null } catch (null) { throw e }"),
+      njs_str("SyntaxError: Unexpected token \"null\" in 1") },
+
+    { njs_str("'a'.f()"),
+      njs_str("TypeError: (intermediate value)[\"f\"] is not a function") },
+
+    { njs_str("1..f()"),
+      njs_str("TypeError: (intermediate value)[\"f\"] is not a function") },
+
+    { njs_str("try {}"),
+      njs_str("SyntaxError: Missing catch or finally after try in 1") },
+
+    { njs_str("try{}catch(a[]"),
+      njs_str("SyntaxError: Unexpected token \"[\" in 1") },
+
+    { njs_str("function f(a) {return a;}; "
+                 "function thrower() {throw TypeError('Oops')}; "
+                 "f(thrower())"),
+      njs_str("TypeError: Oops") },
+
+    { njs_str("var a = 0; try { a = 5 }"
+                 "catch (e) { a = 9 } finally { a++ } a"),
+      njs_str("6") },
+
+    { njs_str("var a = 0; try { throw 3 }"
+                 "catch (e) { a = e } finally { a++ } a"),
+      njs_str("4") },
+
+    { njs_str("var a = 0; try { throw 3 }"
+                 "catch (e) { throw e + 1 } finally { a++ }"),
+      njs_str("4") },
+
+    { njs_str("var a = 0; try { throw 3 }"
+                 "catch (e) { a = e } finally { throw a }"),
+      njs_str("3") },
+
+    { njs_str("try { throw null } catch (e) { } finally { }"),
+      njs_str("undefined") },
+
+    { njs_str("var a = 0; try { throw 3 }"
+                 "catch (e) { throw 4 } finally { throw a }"),
+      njs_str("0") },
+
+    { njs_str("var a = 0; try { a = 5 } finally { a++ } a"),
+      njs_str("6") },
+
+    { njs_str("var a = 0; try { throw 5 } finally { a++ }"),
+      njs_str("5") },
+
+    { njs_str("var a = 0; try { a = 5 } finally { throw 7 }"),
+      njs_str("7") },
+
+    { njs_str("function f(a) {"
+                 "   if (a > 1) return f(a - 1);"
+                 "   throw 9; return a }"
+                 "var a = 0; try { a = f(5); a++ } catch(e) { a = e } a"),
+      njs_str("9") },
+
+    { njs_str("var a; try { try { throw 5 } catch (e) { a = e } throw 3 }"
+                 "       catch(x) { a += x } a"),
+      njs_str("8") },
+
+    { njs_str("throw\nnull"),
+      njs_str("SyntaxError: Illegal newline after throw in 2") },
+
+    { njs_str("for (var x in [1,2]) { try{ continue; } catch(e) {} } throw 1"),
+      njs_str("1") },
+
+    { njs_str("for (var x in [1,2]) { try{ break; } catch(e) {} } throw 1"),
+      njs_str("1") },
+
+    { njs_str("try\n {\n continue; } catch(e) {}"),
+      njs_str("SyntaxError: Illegal continue statement in 3") },
+
+    { njs_str("var a = 1; "
+                 "switch (a) {"
+                 "default:"
+                 "  try\n {\n continue; } "
+                 "  catch(e) {}"
+                 "}"),
+      njs_str("SyntaxError: Illegal continue statement in 3") },
+
+    { njs_str("try\n {\n break; } catch(e) {}"),
+      njs_str("SyntaxError: Illegal break statement in 3") },
+
+    { njs_str("try\n { }\n catch(e) {continue;}"),
+      njs_str("SyntaxError: Illegal continue statement in 3") },
+
+    { njs_str("try { } catch(e) {break;}"),
+      njs_str("SyntaxError: Illegal break statement in 1") },
+
+    { njs_str("try { continue; } finally {}"),
+      njs_str("SyntaxError: Illegal continue statement in 1") },
+
+    { njs_str("try { break; } finally {}"),
+      njs_str("SyntaxError: Illegal break statement in 1") },
+
+    { njs_str("try\n {\n try\n {\n continue; } finally {} } finally {}"),
+      njs_str("SyntaxError: Illegal continue statement in 5") },
+
+    /* break from try in try/catch. */
+
+    { njs_str("function f(n) {"
+                 "    var pre = 0; var post = 0;"
+                 "    for (var x in [1, 2, 3]) {"
+                 "        pre++;"
+                 "        try { "
+                 "            if (n == 'b') {break;}"
+                 "        }"
+                 "        catch (e) {};"
+                 "        post++"
+                 "    }"
+                 "    return [pre, post];"
+                 "}; njs.dump([f(),f('b')])"),
+      njs_str("[[3,3],"
+                  "[1,0]]") },
+
+    { njs_str("function f(v, n) {"
+                 "    var pre = 0; var post = 0; var case2 = 0;"
+                 "    switch (v) {"
+                 "    case 1: "
+                 "        pre++;"
+                 "        try { "
+                 "            if (n == 'b') {break;}"
+                 "        }"
+                 "        catch (e) {};"
+                 "        post++;"
+                 "        break;"
+                 "    default:"
+                 "        case2++;"
+                 "    }"
+                 "    return [pre, post, case2];"
+                 "}; njs.dump([f(),f(1)])"),
+      njs_str("[[0,0,1],"
+                  "[1,1,0]]") },
+
+    /* continue from try in try/catch. */
+
+    { njs_str("function f(n) {"
+                 "    var pre = 0; var post = 0;"
+                 "    for (var x in [1, 2, 3]) {"
+                 "        pre++;"
+                 "        try { "
+                 "            if (n == 'c') {continue;}"
+                 "        }"
+                 "        catch (e) {};"
+                 "        post++"
+                 "    }"
+                 "    return [pre, post];"
+                 "}; njs.dump([f(),f('c')])"),
+      njs_str("[[3,3],"
+                  "[3,0]]") },
+
+    /* Multiple break/continue from try in try/catch. */
+
+    { njs_str("function f(n) {"
+                 "    var pre = 0; var mid = 0; var post = 0;"
+                 "    for (var x in [1, 2, 3]) {"
+                 "        pre++;"
+                 "        try { "
+                 "            if (n == 'c') {continue;}"
+                 "            if (n == 'b') {break;}"
+                 "            mid++;"
+                 "            if (n == 'c2') {continue;}"
+                 "            if (n == 'b2') {break;}"
+                 "        }"
+                 "        catch (e) {};"
+                 "        post++"
+                 "    }"
+                 "    return [pre, mid, post];"
+                 "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
+      njs_str("[[3,3,3],"
+                  "[3,0,0],"
+                  "[1,0,0],"
+                  "[3,3,0],"
+                  "[1,1,0]]") },
+
+    /* Multiple break/continue from catch in try/catch. */
+
+    { njs_str("function f(t, n) {"
+                 "    var pre = 0; var mid = 0; var post = 0;"
+                 "    for (var x in [1, 2, 3]) {"
+                 "        pre++;"
+                 "        try { "
+                 "            if (t) {throw 'a'}"
+                 "        }"
+                 "        catch (e) {"
+                 "            if (n == 'c') {continue;}"
+                 "            if (n == 'b') {break;}"
+                 "            mid++;"
+                 "            if (n == 'c2') {continue;}"
+                 "            if (n == 'b2') {break;}"
+                 "        };"
+                 "        post++"
+                 "    }"
+                 "    return [pre, mid, post];"
+                 "}; njs.dump([f(), f(1), f(1, 'c'), f(1, 'b'), f(1, 'c2'), f(1, 'b2')])"),
+      njs_str("[[3,0,3],"
+                  "[3,3,3],"
+                  "[3,0,0],"
+                  "[1,0,0],"
+                  "[3,3,0],"
+                  "[1,1,0]]") },
+
+    /* break from try in try/finally. */
+
+    { njs_str("function f(n) {"
+                 "    var pre = 0; var mid = 0; var fin = 0; var post = 0;"
+                 "    for (var x in [1, 2, 3]) {"
+                 "        pre++;"
+                 "        try { "
+                 "            if (n == 'c') {continue;}"
+                 "            if (n == 'b') {break;}"
+                 "            mid++;"
+                 "            if (n == 'c2') {continue;}"
+                 "            if (n == 'b2') {break;}"
+                 "        }"
+                 "        finally {fin++};"
+                 "        post++"
+                 "    }"
+                 "    return [pre, mid, fin, post];"
+                 "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
+      njs_str("[[3,3,3,3],"
+                  "[3,0,3,0],"
+                  "[1,0,1,0],"
+                  "[3,3,3,0],"
+                  "[1,1,1,0]]") },
+
+    /* Multiple break/continue from try in try/catch/finally. */
+
+    { njs_str("function f(n) {"
+                 "    var pre = 0; var mid = 0; var fin = 0; var post = 0;"
+                 "    for (var x in [1, 2, 3]) {"
+                 "        pre++;"
+                 "        try { "
+                 "            if (n == 'c') {continue;}"
+                 "            if (n == 'b') {break;}"
+                 "            mid++;"
+                 "            if (n == 'c2') {continue;}"
+                 "            if (n == 'b2') {break;}"
+                 "        }"
+                 "        catch (e) {}"
+                 "        finally {fin++};"
+                 "        post++"
+                 "    }"
+                 "    return [pre, mid, fin, post];"
+                 "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
+      njs_str("[[3,3,3,3],"
+                  "[3,0,3,0],"
+                  "[1,0,1,0],"
+                  "[3,3,3,0],"
+                  "[1,1,1,0]]") },
+
+    /* Multiple break/continue from catch in try/catch/finally. */
+
+    { njs_str("function f(t, n) {"
+                 "    var pre = 0; var mid = 0; var fin = 0; var post = 0;"
+                 "    for (var x in [1, 2, 3]) {"
+                 "        pre++;"
+                 "        try {if (t) {throw 'a'}}"
+                 "        catch (e) { "
+                 "            if (n == 'c') {continue;}"
+                 "            if (n == 'b') {break;}"
+                 "            mid++;"
+                 "            if (n == 'c2') {continue;}"
+                 "            if (n == 'b2') {break;}"
+                 "        }"
+                 "        finally {fin++};"
+                 "        post++"
+                 "    }"
+                 "    return [pre, mid, fin, post];"
+                 "}; njs.dump([f(), f(1), f(1, 'c'), f(1, 'b'), f(1, 'c2'), f(1, 'b2')])"),
+      njs_str("[[3,0,3,3],"
+                  "[3,3,3,3],"
+                  "[3,0,3,0],"
+                  "[1,0,1,0],"
+                  "[3,3,3,0],"
+                  "[1,1,1,0]]") },
+
+    /* Multiple return from try. */
+
+    { njs_str("var r = 0; "
+                 "function f(i, n) {"
+                 "   try { "
+                 "      var a = 'x'; "
+                 "      if (i != 0) {"
+                 "         return a.repeat(n);"
+                 "      } else {"
+                 "         return;"
+                 "      }"
+                 "   }"
+                 "   catch (e) {  } "
+                 "   finally { r++; }};"
+                 "[f(1,1), f(1,2), f(0), r]"),
+      njs_str("x,xx,,3") },
+
+    { njs_str("var r = 0; "
+                 "function f(i) {"
+                 "   try { "
+                 "      return i;"
+                 "   }"
+                 "   catch (e) {  } "
+                 "   finally { r++; }};"
+                 "[f(true), f(false), r]"),
+      njs_str("true,false,2") },
+
+    /* Multiple return from catch. */
+
+    { njs_str("var r = 0; "
+                 "function f(i, n) {"
+                 "   try { "
+                 "      throw 1;"
+                 "   }"
+                 "   catch (e) {  "
+                 "      var a = 'x'; "
+                 "      if (i != 0) {"
+                 "         return a.repeat(n);"
+                 "      } else {"
+                 "         return;"
+                 "      }"
+                 "   } "
+                 "   finally { r++; }};"
+                 "[f(1,1), f(1,2), f(0), r]"),
+      njs_str("x,xx,,3") },
+
+    /* return overrun by finally. */
+
+    { njs_str("function f() {"
+                 "   try { "
+                 "      return 'a';"
+                 "   }"
+                 "   catch (e) {  "
+                 "   } "
+                 "   finally { "
+                 "      return 'b'; "
+                 "   }}; "
+                 "f()"),
+      njs_str("b") },
+
+    { njs_str("(function (f, val) { "
+                 "  try { return f(val); } "
+                 "  finally { return val; }"
+                 "})(function () {throw 'a'}, 'v')"),
+      njs_str("v") },
+
+    { njs_str("(function() { try { return ['a'];} finally {} } )()"),
+      njs_str("a") },
+
+    { njs_str("function f(){}; try {f((new RegExp('a**')))} catch (e) { }"),
+      njs_str("undefined") },
+
+    { njs_str("function f(){}; try {f(f((new RegExp('a**'))))} catch (e) { }"),
+      njs_str("undefined") },
+
+    { njs_str("function f(){}; (function(){try {f(f((new RegExp('a**'))))} catch (e) { return 1}})()"),
+      njs_str("1") },
+
+    { njs_str("var o = { valueOf: function() { return '3' } }; --o"),
+      njs_str("2") },
+
+    { njs_str("var o = { valueOf: function() { return [3] } }; --o"),
+      njs_str("NaN") },
+
+    { njs_str("var o = { valueOf: function() { return '3' } }; 10 - o"),
+      njs_str("7") },
+
+    { njs_str("var o = { valueOf: function() { return [3] } }; 10 - o"),
+      njs_str("NaN") },
+
+    { njs_str("var o = { toString: function() { return 'OK' } }; 'o:' + o"),
+      njs_str("o:OK") },
+
+    { njs_str("var o = { toString: function() { return [1] } }; o"),
+      njs_str("TypeError: Cannot convert object to primitive value") },
+
+    { njs_str("var o = { toString: function() { return [1] } }; 'o:' + o"),
+      njs_str("TypeError: Cannot convert object to primitive value") },
+
+    { njs_str("var a = { valueOf: function() { return '3' } };"
+                 "var b = { toString: function() { return 10 - a + 'OK' } };"
+                 "var c = { toString: function() { return b + 'YES' } };"
+                 "'c:' + c"),
+      njs_str("c:7OKYES") },
+
+    { njs_str("[1,2,3].valueOf()"),
+      njs_str("1,2,3") },
+
+    { njs_str("var o = { valueOf: function() { return 'OK' } };"
+                 "o.valueOf()"),
+      njs_str("OK") },
+
+    { njs_str("false.__proto__ === true.__proto__"),
+      njs_str("true") },
+
+    { njs_str("0..__proto__ === 1..__proto__"),
+      njs_str("true") },
+
+    { njs_str("[].__proto__ === [1,2].__proto__"),
+      njs_str("true") },
+
+    { njs_str("/./.__proto__ === /a/.__proto__"),
+      njs_str("true") },
+
+    { njs_str("''.__proto__ === 'abc'.__proto__"),
+      njs_str("true") },
+
+    { njs_str("[].__proto__.join.call([1,2,3], ':')"),
+      njs_str("1:2:3") },
+
+    { njs_str("''.__proto__.concat.call('a', 'b', 'c')"),
+      njs_str("abc") },
+
+    { njs_str("/./.__proto__.test.call(/a{2}/, 'aaa')"),
+      njs_str("true") },
+
+    { njs_str("true instanceof Boolean"),
+      njs_str("false") },
+
+    { njs_str("1 instanceof Number"),
+      njs_str("false") },
+
+    { njs_str("'' instanceof String"),
+      njs_str("false") },
+
+    { njs_str("({}) instanceof Object"),
+      njs_str("true") },
+
+    { njs_str("[] instanceof []"),
+      njs_str("TypeError: right argument is not a function") },
+
+    { njs_str("[] instanceof Array"),
+      njs_str("true") },
+
+    { njs_str("[] instanceof Object"),
+      njs_str("true") },
+
+    { njs_str("/./ instanceof RegExp"),
+      njs_str("true") },
+
+    { njs_str("/./ instanceof Object"),
+      njs_str("true") },
+
+    { njs_str("Object.defineProperty(Function.prototype, \"prototype\", {get: ()=>Array.prototype});"
+                 "[] instanceof Function.prototype"),
+      njs_str("true") },
+
+     { njs_str("Object.defineProperty(Function.prototype, \"prototype\", {get: ()=>{throw Error('Oops')}});"
+                 "[] instanceof Function.prototype"),
+      njs_str("Error: Oops") },
+
+    /* global this. */
+
+    { njs_str("this"),
+      njs_str("[object Object]") },
+
+    { njs_str("this.a = 1; this.a"),
+      njs_str("1") },
+
+    { njs_str("this.undefined = 42"),
+      njs_str("TypeError: Cannot assign to read-only property \"undefined\" of object") },
+
+    { njs_str("this.Infinity = 42"),
+      njs_str("TypeError: Cannot assign to read-only property \"Infinity\" of object") },
+
+    { njs_str("this.NaN = 42"),
+      njs_str("TypeError: Cannot assign to read-only property \"NaN\" of object") },
+
+    { njs_str("typeof this.undefined"),
+      njs_str("undefined") },
+
+    { njs_str("typeof this.Infinity"),
+      njs_str("number") },
+
+    { njs_str("this.Infinity + 1"),
+      njs_str("Infinity") },
+
+    { njs_str("typeof this.NaN"),
+      njs_str("number") },
+
+    { njs_str("this.NaN + 1"),
+      njs_str("NaN") },
+
+    { njs_str("{this}"),
+      njs_str("undefined") },
+
+    { njs_str("if (1) {new this}"),
+      njs_str("TypeError: object is not a function") },
+
+    { njs_str("if (1) {this()}"),
+      njs_str("TypeError: object is not a function") },
+
+    { njs_str("var ex; try {new this} catch (e) {ex = e}; ex"),
+      njs_str("TypeError: object is not a function") },
+
+    { njs_str("var ex; try {({}) instanceof this} catch (e) {ex = e}; ex"),
+      njs_str("TypeError: right argument is not a function") },
+
+    { njs_str("Function.call(this, 'var x / = 1;')"),
+      njs_str("InternalError: Not implemented") },
+
+    { njs_str("njs"),
+      njs_str("[object Object]") },
+
+    { njs_str("var o = Object(); o"),
+      njs_str("[object Object]") },
+
+    { njs_str("var o = new Object(); o"),
+      njs_str("[object Object]") },
+
+    { njs_str("var o = new Object(1); o"),
+      njs_str("1") },
+
+    { njs_str("var o = {}; o === Object(o)"),
+      njs_str("true") },
+
+    { njs_str("var o = {}; o === new Object(o)"),
+      njs_str("true") },
+
+    { njs_str("var o = Object([]); Object.prototype.toString.call(o)"),
+      njs_str("[object Array]") },
+
+    { njs_str("Object.name"),
+      njs_str("Object") },
+
+    { njs_str("Object.length"),
+      njs_str("1") },
+
+    { njs_str("Object.__proto__ === Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.constructor === Object"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.__proto__ === null"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.__proto__ = {}"),
+      njs_str("TypeError: Cyclic __proto__ value") },
+
+    { njs_str("var o = {}; var o2 = Object.create(o); o.__proto__ = o2"),
+      njs_str("TypeError: Cyclic __proto__ value") },
+
+    { njs_str("Object.prototype.__proto__.f()"),
+      njs_str("TypeError: cannot get property \"f\" of undefined") },
+
+    { njs_str("var obj = Object.create(null); obj.one = 1;"
+                 "var res = [];"
+                 "for (var val in obj) res.push(val); res"),
+      njs_str("one") },
+
+    { njs_str("var o1 = Object.create(null); o1.one = 1;"
+                 "var o2 = Object.create(o1); o2.two = 2;"
+                 "var o3 = Object.create(o2); o3.three = 3;"
+                 "var res = [];"
+                 "for (var val in o3) res.push(val); res"),
+      njs_str("three,two,one") },
+
+    { njs_str("var o1 = Object.create(null); o1.one = 1;"
+                 "var o2 = Object.create(o1);"
+                 "var o3 = Object.create(o2); o3.three = 3;"
+                 "var res = [];"
+                 "for (var val in o3) res.push(val); res"),
+      njs_str("three,one") },
+
+    { njs_str("var o1 = Object.create(null); o1.one = 1;"
+                 "var o2 = Object.create(o1);"
+                 "var o3 = Object.create(o2);"
+                 "var res = [];"
+                 "for (var val in o3) res.push(val); res"),
+      njs_str("one") },
+
+    { njs_str("var o1 = Object.create(null); o1.one = 1;"
+                 "var o2 = Object.create(o1); o2.two = 2;"
+                 "var o3 = Object.create(o2); o3.three = 3;"
+                 "o3.two = -2; o3.one = -1;"
+                 "var res = [];"
+                 "for (var val in o3) res.push(val); res"),
+      njs_str("three,two,one") },
+
+    { njs_str("var a = []; for(var p in 'abc') a.push(p); a"),
+      njs_str("0,1,2") },
+
+    { njs_str("var a = []; for(var p in Object('abc')) a.push(p); a"),
+      njs_str("0,1,2") },
+
+    { njs_str("var o = Object('abc'); var x = Object.create(o);"
+                 "x.a = 1; x.b = 2;"
+                 "var a = []; for(var p in x) a.push(p); a"),
+      njs_str("a,b,0,1,2") },
+
+    { njs_str("var o = Object.create(Math); o.abs = -5; Math.abs(o.abs)"),
+      njs_str("5") },
+
+    { njs_str("Object.prototype.toString.call(Object.prototype)"),
+      njs_str("[object Object]") },
+
+    { njs_str("Object.prototype.toString.call(new Array)"),
+      njs_str("[object Array]") },
+
+    { njs_str("Object.prototype.toString.call(new URIError)"),
+      njs_str("[object Error]") },
+
+    { njs_str("Object.prototype"),
+      njs_str("[object Object]") },
+
+    { njs_str("Object.prototype.valueOf.prototype"),
+      njs_str("undefined") },
+
+    { njs_str("Object.constructor === Function"),
+      njs_str("true") },
+
+    { njs_str("({}).__proto__ === Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("({}).__proto__ = 1"),
+      njs_str("1") },
+
+    { njs_str("({}).__proto__ = null"),
+      njs_str("null") },
+
+    { njs_str("({__proto__: []}) instanceof Array"),
+      njs_str("true") },
+
+    { njs_str("({}).__proto__.constructor === Object"),
+      njs_str("true") },
+
+    { njs_str("({}).constructor === Object"),
+      njs_str("true") },
+
+    { njs_str("({}).constructor()"),
+      njs_str("[object Object]") },
+
+    { njs_str("var a = Object.__proto__; a()"),
+      njs_str("undefined") },
+
+    { njs_str("Object.__proto__()"),
+      njs_str("undefined") },
+
+    { njs_str("var a = Array(3); a"),
+      njs_str(",,") },
+
+    { njs_str("var a = Array(); a.length"),
+      njs_str("0") },
+
+    { njs_str("var a = Array(0); a.length"),
+      njs_str("0") },
+
+    { njs_str("var a = Array(true); a"),
+      njs_str("true") },
+
+    { njs_str("var a = Array(1,'two',3); a"),
+      njs_str("1,two,3") },
+
+    { njs_str("var a = Array(-1)"),
+      njs_str("RangeError: Invalid array length") },
+
+    { njs_str("var a = Array(2.5)"),
+      njs_str("RangeError: Invalid array length") },
+
+    { njs_str("var a = Array(NaN)"),
+      njs_str("RangeError: Invalid array length") },
+
+    { njs_str("var a = Array(Infinity)"),
+      njs_str("RangeError: Invalid array length") },
+
+    { njs_str("var a = Array(1111111111)"),
+      njs_str("MemoryError") },
+
+    { njs_str("var x = Array(2**32)"),
+      njs_str("RangeError: Invalid array length") },
+
+    { njs_str("var x = Array(2**28)"),
+      njs_str("MemoryError") },
+
+    { njs_str("var x = Array(2**20), y = Array(2**12).fill(x);"
+                 "Array.prototype.concat.apply(y[0], y.slice(1))"),
+      njs_str("RangeError: Invalid array length") },
+
+    { njs_str("var a = new Array(3); a"),
+      njs_str(",,") },
+
+    { njs_str("Array.name"),
+      njs_str("Array") },
+
+    { njs_str("Array.length"),
+      njs_str("1") },
+
+    { njs_str("Array.__proto__ === Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("Array.prototype.constructor === Array"),
+      njs_str("true") },
+
+    { njs_str("Array.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("Array.prototype.__proto__ === Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.toString.call(Array.prototype)"),
+      njs_str("[object Array]") },
+
+    { njs_str("Array.prototype"),
+      njs_str("") },
+
+    { njs_str("Array.prototype.length"),
+      njs_str("0") },
+
+    { njs_str("Array.prototype.length = 3, Array.prototype"),
+      njs_str(",,") },
+
+    { njs_str("var o = Object.create(Array.prototype); o.length = 3;"
+                 "[Array.prototype, Array.prototype.length, o.length]"),
+      njs_str(",0,3") },
+
+    { njs_str("var o = Object.create(Array.prototype);"
+                 "Object.defineProperty(o, 'length', {value: 3});"
+                 "[Array.prototype, Array.prototype.length, o.length]"),
+      njs_str(",0,3") },
+
+    { njs_str("Array.constructor === Function"),
+      njs_str("true") },
+
+    { njs_str("var a = []; a.join = 'OK'; a"),
+      njs_str("[object Array]") },
+
+    { njs_str("[].__proto__ === Array.prototype"),
+      njs_str("true") },
+
+    { njs_str("[].__proto__.constructor === Array"),
+      njs_str("true") },
+
+    { njs_str("[].constructor === Array"),
+      njs_str("true") },
+
+    { njs_str("([]).constructor()"),
+      njs_str("") },
+
+    { njs_str("Boolean()"),
+      njs_str("false") },
+
+    { njs_str("new Boolean()"),
+      njs_str("false") },
+
+    { njs_str("new Boolean"),
+      njs_str("false") },
+
+    { njs_str("Boolean(0)"),
+      njs_str("false") },
+
+    { njs_str("Boolean('')"),
+      njs_str("false") },
+
+    { njs_str("Boolean(1)"),
+      njs_str("true") },
+
+    { njs_str("Boolean('a')"),
+      njs_str("true") },
+
+    { njs_str("Boolean({})"),
+      njs_str("true") },
+
+    { njs_str("Boolean([])"),
+      njs_str("true") },
+
+    { njs_str("typeof Boolean(1)"),
+      njs_str("boolean") },
+
+    { njs_str("typeof new Boolean(1)"),
+      njs_str("object") },
+
+    { njs_str("typeof new Boolean"),
+      njs_str("object") },
+
+    { njs_str("Boolean.name"),
+      njs_str("Boolean") },
+
+    { njs_str("Boolean.length"),
+      njs_str("1") },
+
+    { njs_str("Boolean.__proto__ === Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("Boolean.prototype.constructor === Boolean"),
+      njs_str("true") },
+
+    { njs_str("Boolean.prototype.constructor = 1;"
+                 "Boolean.prototype.constructor"),
+      njs_str("1") },
+
+    { njs_str("var c = Boolean.prototype.constructor;"
+                 "Boolean.prototype.constructor = 1;"
+                 "[c(0), Boolean.prototype.constructor]"),
+      njs_str("false,1") },
+
+    { njs_str("Boolean.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("Boolean.prototype.__proto__ === Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.toString.call(Boolean.prototype)"),
+      njs_str("[object Boolean]") },
+
+    { njs_str("Boolean.prototype"),
+      njs_str("false") },
+
+    { njs_str("Boolean.constructor === Function"),
+      njs_str("true") },
+
+    { njs_str("true.__proto__ === Boolean.prototype"),
+      njs_str("true") },
+
+    { njs_str("false.__proto__ === Boolean.prototype"),
+      njs_str("true") },
+
+    { njs_str("var b = Boolean(1); b.__proto__ === Boolean.prototype"),
+      njs_str("true") },
+
+    { njs_str("var b = new Boolean(1); b.__proto__ === Boolean.prototype"),
+      njs_str("true") },
+
+    { njs_str("Number()"),
+      njs_str("0") },
+
+    { njs_str("new Number()"),
+      njs_str("0") },
+
+    { njs_str("new Number"),
+      njs_str("0") },
+
+    { njs_str("new Number(undefined)"),
+      njs_str("NaN") },
+
+    { njs_str("new Number(null)"),
+      njs_str("0") },
+
+    { njs_str("new Number(true)"),
+      njs_str("1") },
+
+    { njs_str("new Number(false)"),
+      njs_str("0") },
+
+    { njs_str("Number(undefined)"),
+      njs_str("NaN") },
+
+    { njs_str("Number(null)"),
+      njs_str("0") },
+
+    { njs_str("Number(true)"),
+      njs_str("1") },
+
+    { njs_str("Number(false)"),
+      njs_str("0") },
+
+    { njs_str("Number(123)"),
+      njs_str("123") },
+
+    { njs_str("Number('123')"),
+      njs_str("123") },
+
+    { njs_str("Number('0.'+'1'.repeat(128))"),
+      njs_str("0.1111111111111111") },
+
+    { njs_str("Number('1'.repeat(128))"),
+      njs_str("1.1111111111111113e+127") },
+
+    { njs_str("Number('1'.repeat(129))"),
+      njs_str("1.1111111111111112e+128") },
+
+    { njs_str("Number('1'.repeat(129))"),
+      njs_str("1.1111111111111112e+128") },
+
+    { njs_str("Number('1'.repeat(129)+'e-100')"),
+      njs_str("1.1111111111111112e+28") },
+
+    { njs_str("Number('1'.repeat(310))"),
+      njs_str("Infinity") },
+
+    { njs_str("var o = { valueOf: function() { return 123 } };"
+                 "Number(o)"),
+      njs_str("123") },
+
+    { njs_str("var o = { valueOf: function() { return 123 } };"
+                 "new Number(o)"),
+      njs_str("123") },
+
+    { njs_str("typeof Number(1)"),
+      njs_str("number") },
+
+    { njs_str("typeof new Number(1)"),
+      njs_str("object") },
+
+    { njs_str("typeof new Number"),
+      njs_str("object") },
+
+    { njs_str("Number.name"),
+      njs_str("Number") },
+
+    { njs_str("Number.length"),
+      njs_str("1") },
+
+    { njs_str("Number.__proto__ === Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("Number.prototype.constructor === Number"),
+      njs_str("true") },
+
+    { njs_str("Number.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("Number.prototype.__proto__ === Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.toString.call(Number.prototype)"),
+      njs_str("[object Number]") },
+
+    { njs_str("Number.prototype"),
+      njs_str("0") },
+
+    { njs_str("Number.constructor === Function"),
+      njs_str("true") },
+
+    { njs_str("0..__proto__ === Number.prototype"),
+      njs_str("true") },
+
+    { njs_str("var n = Number(1); n.__proto__ === Number.prototype"),
+      njs_str("true") },
+
+    { njs_str("var n = new Number(1); n.__proto__ === Number.prototype"),
+      njs_str("true") },
+
+    { njs_str("Number.isFinite()"),
+      njs_str("false") },
+
+    { njs_str("Number.isFinite(123)"),
+      njs_str("true") },
+
+    { njs_str("Number.isFinite('123')"),
+      njs_str("false") },
+
+    { njs_str("Number.isFinite(Infinity)"),
+      njs_str("false") },
+
+    { njs_str("Number.isFinite(NaN)"),
+      njs_str("false") },
+
+    { njs_str("Number.isInteger()"),
+      njs_str("false") },
+
+    { njs_str("Number.isInteger('123')"),
+      njs_str("false") },
+
+    { njs_str("Number.isInteger(123)"),
+      njs_str("true") },
+
+    { njs_str("Number.isInteger(-123.0)"),
+      njs_str("true") },
+
+    { njs_str("Number.isInteger(123.4)"),
+      njs_str("false") },
+
+    { njs_str("Number.isInteger(Infinity)"),
+      njs_str("false") },
+
+    { njs_str("Number.isInteger(NaN)"),
+      njs_str("false") },
+
+    { njs_str("Number.isSafeInteger()"),
+      njs_str("false") },
+
+    { njs_str("Number.isSafeInteger('123')"),
+      njs_str("false") },
+
+    { njs_str("Number.isSafeInteger(9007199254740991)"),
+      njs_str("true") },
+
+    { njs_str("Number.isSafeInteger(-9007199254740991.0)"),
+      njs_str("true") },
+
+    { njs_str("Number.isSafeInteger(9007199254740992)"),
+      njs_str("false") },
+
+    { njs_str("Number.isSafeInteger(-9007199254740992.0)"),
+      njs_str("false") },
+
+    { njs_str("Number.isSafeInteger(123.4)"),
+      njs_str("false") },
+
+    { njs_str("Number.isSafeInteger(Infinity)"),
+      njs_str("false") },
+
+    { njs_str("Number.isSafeInteger(-Infinity)"),
+      njs_str("false") },
+
+    { njs_str("Number.isSafeInteger(NaN)"),
+      njs_str("false") },
+
+    { njs_str("Number.isNaN()"),
+      njs_str("false") },
+
+    { njs_str("Number.isNaN('NaN')"),
+      njs_str("false") },
+
+    { njs_str("Number.isNaN(NaN)"),
+      njs_str("true") },
+
+    { njs_str("Number.isNaN(123)"),
+      njs_str("false") },
+
+    { njs_str("Number.isNaN(Infinity)"),
+      njs_str("false") },
+
+#if 0
+    { njs_str("parseFloat === Number.parseFloat"),
+      njs_str("true") },
+
+    { njs_str("parseInt === Number.parseInt"),
+      njs_str("true") },
+#endif
+
+    { njs_str("String()"),
+      njs_str("") },
+
+    { njs_str("new String()"),
+      njs_str("") },
+
+    { njs_str("new String"),
+      njs_str("") },
+
+    { njs_str("String(123)"),
+      njs_str("123") },
+
+    { njs_str("new String(123)"),
+      njs_str("123") },
+
+    { njs_str("Object('123').length"),
+      njs_str("3") },
+
+    { njs_str("new String(123).length"),
+      njs_str("3") },
+
+    { njs_str("new String(123).toString()"),
+      njs_str("123") },
+
+    { njs_str("String([1,2,3])"),
+      njs_str("1,2,3") },
+
+    { njs_str("new String([1,2,3])"),
+      njs_str("1,2,3") },
+
+    { njs_str("var s = new String('αβ'); s.one = 1; 'one' in s"),
+      njs_str("true") },
+
+    { njs_str("var s = new String('αβ'); 'one' in s"),
+      njs_str("false") },
+
+    { njs_str("var s = new String('αβ'); s.one = 1; '1' in s"),
+      njs_str("true") },
+
+    { njs_str("var s = new String('αβ'); s.one = 1; 1 in s"),
+      njs_str("true") },
+
+    { njs_str("var s = new String('αβ'); s.one = 1; 2 in s"),
+      njs_str("false") },
+
+    { njs_str("var s = new String('αβ'); s[1]"),
+      njs_str("β") },
+
+    { njs_str("Object.create(new String('αβ'))[1]"),
+      njs_str("β") },
+
+    { njs_str("var s = new String('αβ'); s[1] = 'b'"),
+      njs_str("TypeError: Cannot assign to read-only property \"1\" of object string") },
+
+    { njs_str("var o = Object.create(new String('αβ')); o[1] = 'a'"),
+      njs_str("TypeError: Cannot assign to read-only property \"1\" of object") },
+
+    { njs_str("var s = new String('αβ'); s[4] = 'ab'; s[4]"),
+      njs_str("ab") },
+
+    { njs_str("Object.create(new String('αβ')).length"),
+      njs_str("2") },
+
+    { njs_str("var s = new String('αβ'); s.valueOf()[1]"),
+      njs_str("β") },
+
+    { njs_str("var o = { toString: function() { return 'OK' } };"
+                 "String(o)"),
+      njs_str("OK") },
+
+    { njs_str("var o = { toString: function() { return 'OK' } };"
+                 "new String(o)"),
+      njs_str("OK") },
+
+    { njs_str("typeof String('abc')"),
+      njs_str("string") },
+
+    { njs_str("typeof new String('abc')"),
+      njs_str("object") },
+
+    { njs_str("typeof new String"),
+      njs_str("object") },
+
+    { njs_str("String.name"),
+      njs_str("String") },
+
+    { njs_str("String.length"),
+      njs_str("1") },
+
+    { njs_str("String.__proto__ === Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.toString.call(String.prototype)"),
+      njs_str("[object String]") },
+
+    { njs_str("String.prototype"),
+      njs_str("") },
+
+    { njs_str("String.prototype.length"),
+      njs_str("0") },
+
+    { njs_str("String.prototype.constructor === String"),
+      njs_str("true") },
+
+    { njs_str("String.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("String.prototype.__proto__ === Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("''.__proto__ === String.prototype"),
+      njs_str("true") },
+
+    { njs_str("String.constructor === Function"),
+      njs_str("true") },
+
+    { njs_str("'test'.__proto__ === String.prototype"),
+      njs_str("true") },
+
+    { njs_str("var s = String('abc'); s.__proto__ === String.prototype"),
+      njs_str("true") },
+
+    { njs_str("var s = new String('abc'); s.__proto__ === String.prototype"),
+      njs_str("true") },
+
+    { njs_str("'test'.constructor === String"),
+      njs_str("true") },
+
+    { njs_str("'test'.constructor.prototype === String.prototype"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.create(String.prototype); o.length = 1"),
+      njs_str("TypeError: Cannot assign to read-only property \"length\" of object") },
+
+    { njs_str("Function.name"),
+      njs_str("Function") },
+
+    { njs_str("Function.length"),
+      njs_str("1") },
+
+    { njs_str("Function.__proto__ === Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("Function.prototype.constructor === Function"),
+      njs_str("true") },
+
+    { njs_str("Function.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("Function.prototype.__proto__ === Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.toString.call(Function.prototype)"),
+      njs_str("[object Function]") },
+
+    { njs_str("Function.prototype"),
+      njs_str("[object Function]") },
+
+    { njs_str("Function.prototype.length"),
+      njs_str("0") },
+
+    { njs_str("Function.constructor === Function"),
+      njs_str("true") },
+
+    { njs_str("function f() {} f.__proto__ === Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("Function()"),
+      njs_str("InternalError: Not implemented") },
+
+    { njs_str("RegExp()"),
+      njs_str("/(?:)/") },
+
+    { njs_str("RegExp('')"),
+      njs_str("/(?:)/") },
+
+    { njs_str("RegExp(123)"),
+      njs_str("/123/") },
+
+    { njs_str("RegExp.name"),
+      njs_str("RegExp") },
+
+    { njs_str("RegExp.length"),
+      njs_str("2") },
+
+    { njs_str("RegExp.__proto__ === Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("RegExp.prototype.constructor === RegExp"),
+      njs_str("true") },
+
+    { njs_str("RegExp.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("RegExp.prototype.__proto__ === Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.toString.call(RegExp.prototype)"),
+      njs_str("[object RegExp]") },
+
+    { njs_str("RegExp.prototype"),
+      njs_str("/(?:)/") },
+
+    { njs_str("RegExp.constructor === Function"),
+      njs_str("true") },
+
+    { njs_str("/./.__proto__ === RegExp.prototype"),
+      njs_str("true") },
+
+    { njs_str("toString()"),
+      njs_str("[object Undefined]") },
+
+    { njs_str("toString() + Object.prototype.toString"),
+      njs_str("[object Undefined][object Function]") },
+
+#if 0
+    { njs_str("toString === Object.prototype.toString"),
+      njs_str("true") },
+
+    { njs_str("Object.prototype.toString.yes = 'OK'; toString.yes"),
+      njs_str("OK") },
+#endif
+
+    { njs_str("Object.prototype.toString.call()"),
+      njs_str("[object Undefined]") },
+
+    { njs_str("Object.prototype.toString.call(undefined)"),
+      njs_str("[object Undefined]") },
+
+    { njs_str("Object.prototype.toString.call(null)"),
+      njs_str("[object Null]") },
+
+    { njs_str("Object.prototype.toString.call(true)"),
+      njs_str("[object Boolean]") },
+
+    { njs_str("Object.prototype.toString.call(1)"),
+      njs_str("[object Number]") },
+
+    { njs_str("Object.prototype.toString.call('')"),
+      njs_str("[object String]") },
+
+    { njs_str("Object.prototype.toString.call({})"),
+      njs_str("[object Object]") },
+
+    { njs_str("Object.prototype.toString.call([])"),
+      njs_str("[object Array]") },
+
+    { njs_str("Object.prototype.toString.call(new Object(true))"),
+      njs_str("[object Boolean]") },
+
+    { njs_str("Object.prototype.toString.call(new Number(1))"),
+      njs_str("[object Number]") },
+
+    { njs_str("Object.prototype.toString.call(new Object(1))"),
+      njs_str("[object Number]") },
+
+    { njs_str("Object.prototype.toString.call(new Object(''))"),
+      njs_str("[object String]") },
+
+    { njs_str("Object.prototype.toString.call(function(){})"),
+      njs_str("[object Function]") },
+
+    { njs_str("Object.prototype.toString.call(/./)"),
+      njs_str("[object RegExp]") },
+
+    { njs_str("var p = { a:5 }; var o = Object.create(p); o.a"),
+      njs_str("5") },
+
+    { njs_str("var p = { a:5 }; var o = Object.create(p);"
+                 "o.__proto__ === p"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.create(Object.prototype);"
+                 "o.__proto__ === Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.create(null); '__proto__' in o"),
+      njs_str("false") },
+
+    { njs_str("Object.create()"),
+      njs_str("TypeError: prototype may only be an object or null: undefined") },
+
+    { njs_str("Object.create(1)"),
+      njs_str("TypeError: prototype may only be an object or null: number") },
+
+    { njs_str("var o = {a:1, b:2, c:3};"
+                 "Object.keys(o)"),
+      njs_str("a,b,c") },
+
+    { njs_str("var a = []; a.one = 7; Object.keys(a)"),
+      njs_str("one") },
+
+    { njs_str("var a = [,,]; a.one = 7; Object.keys(a)"),
+      njs_str("one") },
+
+    { njs_str("var a = [,6,,3]; a.one = 7; Object.keys(a)"),
+      njs_str("1,3,one") },
+
+    { njs_str("var o = {a:1,b:2}; delete o.a; Object.keys(o)"),
+      njs_str("b") },
+
+    { njs_str("Object.keys()"),
+      njs_str("TypeError: cannot convert undefined argument to object") },
+
+    { njs_str("Object.keys('αβZ')"),
+      njs_str("0,1,2") },
+
+    { njs_str("Object.keys(new String('αβZ'))"),
+      njs_str("0,1,2") },
+
+    { njs_str("var s = new String('αβZ'); s.a = 1; Object.keys(s)"),
+      njs_str("0,1,2,a") },
+
+    { njs_str("var r = new RegExp('αbc'); r.a = 1; Object.keys(r)"),
+      njs_str("a") },
+
+    { njs_str("Object.keys(Object.create(new String('abc')))"),
+      njs_str("") },
+
+    { njs_str("Object.keys(1)"),
+      njs_str("") },
+
+    { njs_str("Object.keys(true)"),
+      njs_str("") },
+
+    { njs_str("var o = {a:3, b:2, c:1}; Object.values(o)"),
+      njs_str("3,2,1") },
+
+    { njs_str("Object.values('s')"),
+      njs_str("s") },
+
+    { njs_str("Object.values('абв abc')"),
+      njs_str("а,б,в, ,a,b,c") },
+
+    { njs_str("var s = new String('abc'); s.three = 3; Object.values(s)"),
+      njs_str("a,b,c,3") },
+
+    { njs_str("var a = [,,5,,4,,,3,2]; a.one = 1; Object.values(a)"),
+      njs_str("5,4,3,2,1") },
+
+    { njs_str("Object.values([{}, null, false, NaN, function() {}])"),
+      njs_str("[object Object],,false,NaN,[object Function]") },
+
+    { njs_str("Object.values(1)"),
+      njs_str("") },
+
+    { njs_str("Object.values(njs)[0] === njs.version"),
+      njs_str("true") },
+
+    { njs_str("Object.values(process)"),
+      njs_str("") },
+
+    { njs_str("Object.values()"),
+      njs_str("TypeError: cannot convert undefined argument to object") },
+
+    { njs_str("Object.entries('abc')"),
+      njs_str("0,a,1,b,2,c") },
+
+    { njs_str("JSON.stringify(Object.entries('эюя'))"),
+      njs_str("[[\"0\",\"э\"],[\"1\",\"ю\"],[\"2\",\"я\"]]") },
+
+    { njs_str("var o = {a:\"а\", b:\"б\", c:\"ц\"};"
+                 "JSON.stringify(Object.entries(o))"),
+      njs_str("[[\"a\",\"а\"],[\"b\",\"б\"],[\"c\",\"ц\"]]") },
+
+    { njs_str("JSON.stringify(Object.entries([0]))"),
+      njs_str("[[\"0\",0]]") },
+
+    { njs_str("var s = new String('αβ'); s.two = null; s[3] = true;"
+                 "Object.entries(s)"),
+      njs_str("0,α,1,β,two,,3,true") },
+
+    { njs_str("Object.entries(true)"),
+      njs_str("") },
+
+    { njs_str("Object.entries(njs)[0][1] === njs.version"),
+      njs_str("true") },
+
+    { njs_str("Object.entries()"),
+      njs_str("TypeError: cannot convert undefined argument to object") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'a', {}); o.a"),
+      njs_str("undefined") },
+
+    { njs_str("Object.defineProperty({}, 'a', {value:1})"),
+      njs_str("[object Object]") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'a', {value:1}); o.a"),
+      njs_str("1") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'a', Object.create({value:1})); o.a"),
+      njs_str("1") },
+
+    { njs_str("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
+                 "Object.keys(o)"),
+      njs_str("a,c") },
+
+    { njs_str("var o = {a:1, c:2};"
+                 "Object.defineProperty(o, 'b', {enumerable:false});"
+                 "Object.keys(o)"),
+      njs_str("a,c") },
+
+    { njs_str("var o = {a:1, c:3};"
+                 "Object.defineProperty(o, 'b', {enumerable:true});"
+                 "Object.keys(o)"),
+      njs_str("a,c,b") },
+
+    { njs_str("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
+                 "Object.values(o)"),
+      njs_str("1,2") },
+
+    { njs_str("var o = {a:1, c:2};"
+                 "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
+                 "Object.values(o)"),
+      njs_str("1,2") },
+
+    { njs_str("var o = {a:1, c:3};"
+                 "Object.defineProperty(o, 'b', {enumerable:true, value:2});"
+                 "Object.values(o)"),
+      njs_str("1,3,2") },
+
+    { njs_str("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
+                 "Object.entries(o)"),
+      njs_str("a,1,c,2") },
+
+    { njs_str("var o = {a:1, c:2};"
+                 "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
+                 "Object.entries(o)"),
+      njs_str("a,1,c,2") },
+
+    { njs_str("var o = {a:1, c:3};"
+                 "Object.defineProperty(o, 'b', {enumerable:true, value:2});"
+                 "Object.entries(o)"),
+      njs_str("a,1,c,3,b,2") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'a', {}); o.a = 1"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'a', {writable:false}); o.a = 1"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'a', {writable:true});"
+                 "o.a = 1; o.a"),
+      njs_str("1") },
+
+    { njs_str("Object.defineProperty(Object.prototype, 'a', {writable:false});"
+                 "var o = {a: 1}; [o.a++, o.a]"),
+      njs_str("1,2") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(Object.prototype, 'a', {writable:false});"
+                 "o.a = 1"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(Object.prototype, 'a', {writable:true});"
+                 "o.a = 1; o.a"),
+      njs_str("1") },
+
+    { njs_str("var p = Object.create(Function);"
+                 "Object.defineProperty(p, 'length', {writable: true});"
+                 "p.length = 32; p.length"),
+      njs_str("32") },
+
+    { njs_str("var p = Object.create(Math.abs);"
+                 "Object.defineProperty(p, 'length', {writable: true});"
+                 "p.length = 23; p.length"),
+      njs_str("23") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {value:1}); delete o.a"),
+      njs_str("TypeError: Cannot delete property \"a\" of object") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {value:1, configurable:true});"
+                 "delete o.a; o.a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {value:1, configurable:false});"
+                 "delete o.a"),
+      njs_str("TypeError: Cannot delete property \"a\" of object") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', Object.create({value:2})); o.a"),
+      njs_str("2") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {configurable:false});"
+                 "Object.defineProperty(o, 'a', {configurable:true})"),
+      njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {configurable:false});"
+                 "Object.defineProperty(o, 'a', {enumerable:true})"),
+      njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {configurable:false});"
+                 "Object.defineProperty(o, 'a', {writable:true})"),
+      njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {configurable:false});"
+                 "Object.defineProperty(o, 'a', {enumerable:false}).a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {configurable:false});"
+                 "Object.defineProperty(o, 'a', {}).a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {configurable:false, writable:true});"
+                 "Object.defineProperty(o, 'a', {writable:false}).a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {configurable:true, writable:false});"
+                 "Object.defineProperty(o, 'a', {writable:true}).a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {});"
+                 "Object.defineProperty(o, 'a', {}).a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {value:1});"
+                 "Object.defineProperty(o, 'a', {value:1}).a"),
+      njs_str("1") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {value:1});"
+                 "Object.defineProperty(o, 'a', {value:2}).a"),
+      njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {configurable:true});"
+                 "Object.defineProperty(o, 'a', {value:1}).a"),
+      njs_str("1") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {configurable:true, get:()=>1});"
+                 "Object.defineProperty(o, 'a', {value:1});"
+                 "var d = Object.getOwnPropertyDescriptor(o, 'a'); "
+                 "[d.value, d.writable, d.enumerable, d.configurable, d.get, d.set]"),
+      njs_str("1,false,false,true,,") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {configurable:true, value:1});"
+                 "Object.defineProperty(o, 'a', {set:()=>1});"
+                 "var d = Object.getOwnPropertyDescriptor(o, 'a'); "
+                 "[d.value, d.writable, d.enumerable, d.configurable, d.get, d.set]"),
+      njs_str(",,false,true,,[object Function]") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'a', {get: ()=>1, configurable:true}); "
+                 "Object.defineProperty(o, 'a', {value:123}); o.a =2"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'a', {get: ()=>1, configurable:true}); "
+                 "Object.defineProperty(o, 'a', {writable:false}); o.a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'a', {value: 1, configurable:true}); "
+                 "Object.defineProperty(o, 'a', {get:()=>1}); o.a = 2"),
+      njs_str("TypeError: Cannot set property \"a\" of object which has only a getter") },
+
+    { njs_str("var o = Object.create(Object.defineProperty({}, 'x', { set: function(v) { this.y = v; }})); "
+                 "o.x = 123; Object.getOwnPropertyDescriptor(o, 'y').value"),
+      njs_str("123") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', { configurable: true, value: 0 });"
+                 "Object.defineProperty(o, 'a', { value: 1 });"
+                 "Object.defineProperty(o, 'a', { configurable: false, value: 2 }).a"),
+      njs_str("2") },
+
+    { njs_str("var o = {}; Object.defineProperty()"),
+      njs_str("TypeError: cannot convert undefined argument to object") },
+
+    { njs_str("var o = {}; Object.defineProperty(o)"),
+      njs_str("TypeError: descriptor is not an object") },
+
+    { njs_str("Object.defineProperty(Function.prototype, 'name', {value:'x'}).name"),
+      njs_str("x") },
+
+    { njs_str("Object.defineProperty(Function.prototype, 'xxx', {value:'x'}).xxx"),
+      njs_str("x") },
+
+    { njs_str("Object.defineProperty(Object, 'name', {value:'x'}).name"),
+      njs_str("x") },
+
+    { njs_str("Object.defineProperty(Object.prototype, 'toString', {value:1}).toString"),
+      njs_str("1") },
+
+    { njs_str("var o = Object.defineProperties({}, {a:{value:1}}); o.a"),
+      njs_str("1") },
+
+    { njs_str("var o = Object.defineProperties({}, {a:{enumerable:true}, b:{enumerable:true}});"
+                 "Object.keys(o)"),
+      njs_str("a,b") },
+
+    { njs_str("var desc = Object.defineProperty({b:{value:1, enumerable:true}}, 'a', {});"
+                 "var o = Object.defineProperties({}, desc);"
+                 "Object.keys(o)"),
+      njs_str("b") },
+
+    { njs_str("var o = {a:1}; delete o.a;"
+                 "Object.defineProperty(o, 'a', { value: 1 }); o.a"),
+      njs_str("1") },
+
+    { njs_str("var o = {a:1}; delete o.a;"
+                 "Object.defineProperty(o, 'a', { value: 1 }); o.a = 2; o.a"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+    { njs_str("var o = {a:1}; delete o.a;"
+                 "Object.defineProperty(o, 'a', { value: 1, writable:1 }); o.a = 2; o.a"),
+      njs_str("2") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, new String('a'), { value: 1}); o.a"),
+      njs_str("1") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, {toString:function(){return 'a'}}, { value: 1}); o.a"),
+      njs_str("1") },
+
+    { njs_str("var a = [1, 2];"
+                 "Object.defineProperty(a, '1', {value: 5}); a[1]"),
+      njs_str("5") },
+
+    { njs_str("var a = [1, 2];"
+                 "Object.defineProperty(a, '3', {}); njs.dump(a)"),
+      njs_str("[1,2,<empty>,undefined]") },
+
+    { njs_str("var a = [1, 2];"
+                 "Object.defineProperty(a, 'length', {}); a"),
+      njs_str("1,2") },
+
+    { njs_str("var a = [1, 2];"
+                 "Object.defineProperty(a, 'length', {value: 1}); a"),
+      njs_str("1") },
+
+    { njs_str("var a = [1, 2];"
+                 "Object.defineProperty(a, 'length', {value: 5}); a"),
+      njs_str("1,2,,,") },
+
+    { njs_str("var o = Object.defineProperties({a:1}, {}); o.a"),
+      njs_str("1") },
+
+    { njs_str("var arr = [0, 1]; Object.defineProperty(arr, 'length', {value:3}); arr.length"),
+      njs_str("3") },
+
+    { njs_str("Object.defineProperties()"),
+      njs_str("TypeError: cannot convert undefined argument to object") },
+
+    { njs_str("Object.defineProperties(1, {})"),
+      njs_str("TypeError: cannot convert number argument to object") },
+
+    { njs_str("Object.defineProperties({}, 1)"),
+      njs_str("TypeError: descriptor is not an object") },
+
+    { njs_str("var o = {a:1}; o.hasOwnProperty('a')"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.create({a:2}); o.hasOwnProperty('a')"),
+      njs_str("false") },
+
+    { njs_str("var o = {a:1}; o.hasOwnProperty('b')"),
+      njs_str("false") },
+
+    { njs_str("var a = []; a.hasOwnProperty('0')"),
+      njs_str("false") },
+
+    { njs_str("var a = [,,]; a.hasOwnProperty('0')"),
+      njs_str("false") },
+
+    { njs_str("var a = [3,,]; a.hasOwnProperty('0')"),
+      njs_str("true") },
+
+    { njs_str("var a = [,4]; a.hasOwnProperty('1')"),
+      njs_str("true") },
+
+    { njs_str("var a = [3,4]; a.hasOwnProperty('2')"),
+      njs_str("false") },
+
+    { njs_str("var a = [3,4]; a.one = 1; a.hasOwnProperty('one')"),
+      njs_str("true") },
+
+    { njs_str("var o = {a:1}; o.hasOwnProperty(o)"),
+      njs_str("false") },
+
+    { njs_str("var o = {a:1}; o.hasOwnProperty(1)"),
+      njs_str("false") },
+
+    { njs_str("var o = {a:1}; o.hasOwnProperty()"),
+      njs_str("false") },
+
+    { njs_str("[,].hasOwnProperty()"),
+      njs_str("false") },
+
+    { njs_str("[1,2].hasOwnProperty('len')"),
+      njs_str("false") },
+
+    { njs_str("[1,2].hasOwnProperty('0')"),
+      njs_str("true") },
+
+    { njs_str("[1,2].hasOwnProperty('2')"),
+      njs_str("false") },
+
+    { njs_str("[].hasOwnProperty('length')"),
+      njs_str("true") },
+
+    { njs_str("[1,2].hasOwnProperty('length')"),
+      njs_str("true") },
+
+    { njs_str("(new Array()).hasOwnProperty('length')"),
+      njs_str("true") },
+
+    { njs_str("(new Array(10)).hasOwnProperty('length')"),
+      njs_str("true") },
+
+    { njs_str("Object.valueOf.hasOwnProperty()"),
+      njs_str("false") },
+
+    { njs_str("1..hasOwnProperty('b')"),
+      njs_str("false") },
+
+    { njs_str("'s'.hasOwnProperty('b')"),
+      njs_str("false") },
+
+    { njs_str("'s'.hasOwnProperty('0')"),
+      njs_str("true") },
+
+    { njs_str("'s'.hasOwnProperty('1')"),
+      njs_str("false") },
+
+    { njs_str("Object.hasOwnProperty('hasOwnProperty')"),
+      njs_str("false") },
+
+    { njs_str("Object.prototype.hasOwnProperty('hasOwnProperty')"),
+      njs_str("true") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:undefined, set:undefined}).a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:1})"),
+      njs_str("TypeError: Getter must be a function") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:undefined}).a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:function(){return 1}}).a"),
+      njs_str("1") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {set:1})"),
+      njs_str("TypeError: Setter must be a function") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {set:undefined}); o.a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {set:undefined}); o.a = 4;"),
+      njs_str("TypeError: Cannot set property \"a\" of object which has only a getter") },
+
+    { njs_str("var o = {a: 0};"
+                 "Object.defineProperty(o, 'b', {set:function(x){this.a = x / 2;}}); o.b = 4; o.a;"),
+      njs_str("2") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {value:undefined});"
+                 "Object.defineProperty(o, 'a', {get:undefined})"),
+      njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {});"
+                 "Object.defineProperty(o, 'a', {get:undefined})"),
+      njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:undefined});"
+                 "Object.defineProperty(o, 'a', {get:undefined}).a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:undefined});"
+                 "Object.defineProperty(o, 'a', {set:undefined}).a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:undefined});"
+                 "Object.defineProperty(o, 'a', {}); o.a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:undefined});"
+                 "Object.defineProperty(o, 'a', {set:function(){}})"),
+      njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:undefined});"
+                 "Object.defineProperty(o, 'a', {get:function(){}})"),
+      njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
+                 "Object.defineProperty(o, 'a', {get:()=>2}); o.a"),
+      njs_str("2") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {set:function(v){this.aa=v;}, configurable:true});"
+                 "Object.defineProperty(o, 'a', {get:function(){return this.aa}}); o.a = 1; o.a"),
+      njs_str("1") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
+                 "Object.defineProperty(o, 'a', {value:2}).a"),
+      njs_str("2") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
+                 "Object.defineProperty(o, 'a', {value:2});"
+                 "var d = Object.getOwnPropertyDescriptor(o, 'a');"
+                 "d.get === undefined && d.set === undefined"),
+      njs_str("true") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'a', {value:1, configurable:true});"
+                 "Object.defineProperty(o, 'a', {get:()=>2});"
+                 "var d = Object.getOwnPropertyDescriptor(o, 'a');"
+                 "d.writable === undefined && d.value === undefined"),
+      njs_str("true") },
+
+    { njs_str("Object.defineProperty(Date.prototype, 'year', {get: function() { return this.getFullYear();}});"
+                 "var d = new Date(0); d.year"),
+      njs_str("1970") },
+
+    { njs_str("var o = [];"
+                 "Object.defineProperty(o, 'fill', {get:undefined}).fill"),
+      njs_str("undefined") },
+
+    { njs_str("var o = [];"
+                 "Object.defineProperty(o, 'length', {get:undefined})"),
+      njs_str("TypeError: Cannot redefine property: \"length\"") },
+
+    { njs_str("var o = {};"
+                 "Object.defineProperty(o, 'foo', {get:()=>10});"
+                 "Object.preventExtensions(o);Object.isFrozen(o)"),
+      njs_str("true"), },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'r', { get: function() { return this.r_value; } }); o.r_value = 1; o.r;"),
+      njs_str("1") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'rw', { get: function() { return this.rw_value; }, set: function(x) { this.rw_value = x / 2; } }); o.rw = 10; o.rw"),
+      njs_str("5") },
+
+    { njs_str("var o = {}; function foo() {}; Object.defineProperty(o, 'a', {get: foo});"
+                 "Object.getOwnPropertyDescriptor(o, 'a').get === foo"),
+      njs_str("true") },
+
+    { njs_str("var o = {}; Object.defineProperty(o, 'a', {get: undefined});"
+                "JSON.stringify(Object.getOwnPropertyDescriptor(o, 'a')).set"),
+      njs_str("undefined") },
+
+    { njs_str("var p = { a:5 }; var o = Object.create(p);"
+                 "Object.getPrototypeOf(o) === p"),
+      njs_str("true") },
+
+    { njs_str("var p = { a:5 }; var o = Object.create(p);"
+                 "Object.getPrototypeOf(o) === o.__proto__"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.create(Object.prototype);"
+                 "Object.getPrototypeOf(o) === Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("Object.getPrototypeOf(1)"),
+      njs_str("TypeError: cannot convert number argument to object") },
+
+    { njs_str("Object.getPrototypeOf('a')"),
+      njs_str("TypeError: cannot convert string argument to object") },
+
+    { njs_str("var p = {}; var o = Object.create(p);"
+                 "p.isPrototypeOf(o)"),
+      njs_str("true") },
+
+    { njs_str("var pp = {}; var p = Object.create(pp);"
+                 "var o = Object.create(p);"
+                 "pp.isPrototypeOf(o)"),
+      njs_str("true") },
+
+    { njs_str("var p = {}; var o = Object.create(p);"
+                 "o.isPrototypeOf(p)"),
+      njs_str("false") },
+
+    { njs_str("var p = {}; var o = Object.create(p);"
+                 "o.isPrototypeOf()"),
+      njs_str("false") },
+
+    { njs_str("Object.valueOf.isPrototypeOf()"),
+      njs_str("false") },
+
+    { njs_str("var p = {}; var o = Object.create(p);"
+                 "o.isPrototypeOf(1)"),
+      njs_str("false") },
+
+    { njs_str("var p = {}; var o = Object.create(p);"
+                 "1..isPrototypeOf(p)"),
+      njs_str("false") },
+
+    { njs_str("Object.create(new String('asdf')).length"),
+      njs_str("4") },
+
+    { njs_str("Object.create(Object('123')).length"),
+      njs_str("3") },
+
+    { njs_str("Object.create([1,2]).length"),
+      njs_str("2") },
+
+    { njs_str("Object.create(function(a,b,c){}).length"),
+      njs_str("3") },
+
+    { njs_str("Object.create(Math).hasOwnProperty('abs')"),
+      njs_str("false") },
+
+    { njs_str("var m = Object.create(Math); m.abs = 3;"
+                 "[m.hasOwnProperty('abs'), m.abs]"),
+      njs_str("true,3") },
+
+    { njs_str("var m = Object.create(Math); m.abs = Math.floor;"
+                 "[m.hasOwnProperty('abs'), delete m.abs, m.abs(-1)]"),
+      njs_str("true,true,1") },
+
+    { njs_str("Object.getOwnPropertyDescriptor({a:1}, 'a').value"),
+      njs_str("1") },
+
+    { njs_str("Object.getOwnPropertyDescriptor({a:1}, 'a').configurable"),
+      njs_str("true") },
+
+    { njs_str("Object.getOwnPropertyDescriptor({a:1}, 'a').enumerable"),
+      njs_str("true") },
+
+    { njs_str("Object.getOwnPropertyDescriptor({a:1}, 'a').writable"),
+      njs_str("true") },
+
+    { njs_str("Object.getOwnPropertyDescriptor({a:1}, 'b')"),
+      njs_str("undefined") },
+
+    { njs_str("Object.getOwnPropertyDescriptor({}, 'a')"),
+      njs_str("undefined") },
+
+    { njs_str("Object.getOwnPropertyDescriptor(Object.create({a:1}), 'a')"),
+      njs_str("undefined") },
+
+    { njs_str("Object.getOwnPropertyDescriptor([3,4], '1').value"),
+      njs_str("4") },
+
+    { njs_str("Object.getOwnPropertyDescriptor([3,4], 1).value"),
+      njs_str("4") },
+
+    { njs_str("Object.getOwnPropertyDescriptor([], 'length').value"),
+      njs_str("0") },
+
+    { njs_str("Object.getOwnPropertyDescriptor([], '0')"),
+      njs_str("undefined") },
+
+    { njs_str("Object.getOwnPropertyDescriptor([1,2], '1').value"),
+      njs_str("2") },
+
+    { njs_str("Object.getOwnPropertyDescriptor([1,2], new String('1')).value"),
+      njs_str("2") },
+
+    { njs_str("Object.getOwnPropertyDescriptor({undefined:1}, void 0).value"),
+      njs_str("1") },
+
+    { njs_str("Object.getOwnPropertyDescriptor([1,2], 1).value"),
+      njs_str("2") },
+
+    { njs_str("Object.getOwnPropertyDescriptor([1,,,3], '1')"),
+      njs_str("undefined") },
+
+    { njs_str("Object.getOwnPropertyDescriptor([1,2], '3')"),
+      njs_str("undefined") },
+
+    { njs_str("JSON.stringify(Object.getOwnPropertyDescriptor([3,4], 'length'))"),
+      njs_str("{\"value\":2,\"writable\":true,\"enumerable\":false,\"configurable\":false}") },
+
+    { njs_str("Object.getOwnPropertyDescriptor(Array.of, 'length').value"),
+      njs_str("0") },
+
+    { njs_str("Object.getOwnPropertyDescriptor('αβγδ', '1').value"),
+      njs_str("β") },
+
+    { njs_str("Object.getOwnPropertyDescriptor(new String('αβγδ'), '1').value"),
+      njs_str("β") },
+
+    { njs_str("var s = new String('αβγδ'); s.a = 1;"
+                 "Object.getOwnPropertyDescriptor(s, 'a').value"),
+      njs_str("1") },
+
+    { njs_str("JSON.stringify(Object.getOwnPropertyDescriptor('αβγδ', '2'))"),
+      njs_str("{\"value\":\"γ\",\"writable\":false,\"enumerable\":true,\"configurable\":false}") },
+
+    { njs_str("JSON.stringify(Object.getOwnPropertyDescriptor(new String('abc'), 'length'))"),
+      njs_str("{\"value\":3,\"writable\":false,\"enumerable\":false,\"configurable\":false}") },
+
+    { njs_str("Object.getOwnPropertyDescriptor(1, '0')"),
+      njs_str("undefined") },
+
+    { njs_str("'αβγδ'.propertyIsEnumerable('0')"),
+      njs_str("true") },
+
+    { njs_str("({a:1}).propertyIsEnumerable({toString:function () {return 'a';}})"),
+      njs_str("true") },
+
+    { njs_str("'αβγδ'.propertyIsEnumerable('a')"),
+      njs_str("false") },
+
+    { njs_str("'αβγδ'.propertyIsEnumerable('length')"),
+      njs_str("false") },
+
+    { njs_str("var min = Object.getOwnPropertyDescriptor(Math, 'min').value;"
+                 "[min(1,2), min(2,1), min(-1,1)]"),
+      njs_str("1,1,-1") },
+
+    { njs_str("Object.getOwnPropertyDescriptor()"),
+      njs_str("TypeError: cannot convert undefined argument to object") },
+
+    { njs_str("Object.getOwnPropertyDescriptor(undefined)"),
+      njs_str("TypeError: cannot convert undefined argument to object") },
+
+    { njs_str("var o = {}; o[void 0] = 'a'; Object.getOwnPropertyDescriptor(o).value"),
+      njs_str("a") },
+
+    { njs_str("var o = {}; o[void 0] = 'a'; Object.getOwnPropertyDescriptor(o, undefined).value"),
+      njs_str("a") },
+
+    { njs_str("Object.getOwnPropertyDescriptors()"),
+      njs_str("TypeError: cannot convert undefined argument to object") },
+
+    { njs_str("typeof Object.getOwnPropertyDescriptors(1)"),
+      njs_str("object") },
+
+    { njs_str("Object.keys(Object.getOwnPropertyDescriptors([]))"),
+      njs_str("length") },
+
+    { njs_str("Object.getOwnPropertyDescriptors(function(a,b,c) {}).length.value"),
+      njs_str("3") },
+
+    { njs_str("Object.values(Object.getOwnPropertyDescriptors('abc'))"
+                 ".reduce(function(a, x) { return a += x.value; }, '')"),
+      njs_str("abc3") },
+
+    { njs_str("Object.getOwnPropertyNames()"),
+      njs_str("TypeError: cannot convert undefined argument to object") },
+
+    { njs_str("Array.isArray(Object.getOwnPropertyNames({}))"),
+      njs_str("true") },
+
+    { njs_str("Object.getOwnPropertyNames({a:1, b:1, c:1})"),
+      njs_str("a,b,c") },
+
+    { njs_str("Object.getOwnPropertyNames(Object.defineProperty({a:1}, 'b', {}))"),
+      njs_str("a,b") },
+
+    { njs_str("Object.getOwnPropertyNames(Object.defineProperty([], 'b', {}))"),
+      njs_str("b,length") },
+
+    { njs_str("Object.getOwnPropertyNames(Object.defineProperty(new String(), 'b', {}))"),
+      njs_str("b,length") },
+
+    { njs_str("Object.getOwnPropertyNames([1,2,3])"),
+      njs_str("0,1,2,length") },
+
+    { njs_str("Object.getOwnPropertyNames('abc')"),
+      njs_str("0,1,2,length") },
+
+    { njs_str("Object.getOwnPropertyNames(function() {})"),
+      njs_str("length,prototype") },
+
+    { njs_str("Object.getOwnPropertyNames(Array)"),
+      njs_str("name,length,prototype,isArray,of") },
+
+    { njs_str("Object.getOwnPropertyNames(Array.isArray)"),
+      njs_str("name,length") },
+
+    { njs_str("Object.defineProperty(Object.freeze({}), 'b', {})"),
+      njs_str("TypeError: object is not extensible") },
+
+    { njs_str("Object.defineProperties(Object.freeze({}), {b:{}})"),
+      njs_str("TypeError: object is not extensible") },
+
+    { njs_str("Object.freeze()"),
+      njs_str("undefined") },
+
+    { njs_str("var o = Object.freeze({a:1}); o.a = 2"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+    { njs_str("var o = Object.freeze({a:1}); delete o.a"),
+      njs_str("TypeError: Cannot delete property \"a\" of object") },
+
+    { njs_str("var o = Object.freeze({a:1}); o.b = 1; o.b"),
+      njs_str("TypeError: Cannot add property \"b\", object is not extensible") },
+
+    { njs_str("var o = Object.freeze(Object.create({a:1})); o.a = 2; o.a"),
+      njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+    { njs_str("var o = Object.freeze({a:{b:1}}); o.a.b = 2; o.a.b"),
+      njs_str("2") },
+
+    { njs_str("Object.defineProperty([1,2], 'a', {value:1}).a"),
+      njs_str("1") },
+
+    { njs_str("var a = Object.freeze([1,2]);"
+                 "Object.defineProperty(a, 'a', {value:1}).a"),
+      njs_str("TypeError: object is not extensible") },
+
+    { njs_str("var a = [1,2]; a.a = 1; Object.freeze(a); delete a.a"),
+      njs_str("TypeError: Cannot delete property \"a\" of array") },
+
+    { njs_str("var a = [1,2]; a.a = 1; Object.freeze(a); a.a = 2"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of array") },
+
+    { njs_str("var a = Object.freeze([1,2]); a.a = 1"),
+      njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+    { njs_str("Object.defineProperty(function() {}, 'a', {value:1}).a"),
+      njs_str("1") },
+
+    { njs_str("var f = Object.freeze(function() {});"
+                 "Object.defineProperty(f, 'a', {value:1}).a"),
+      njs_str("TypeError: object is not extensible") },
+
+    { njs_str("var f = function() {}; f.a = 1; Object.freeze(f); delete f.a"),
+      njs_str("TypeError: Cannot delete property \"a\" of function") },
+
+    { njs_str("var f = function() {}; f.a = 1; Object.freeze(f); f.a = 2"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of function") },
+
+    { njs_str("var f = Object.freeze(function() {}); f.a = 1"),
+      njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+    { njs_str("Object.defineProperty(new Date(''), 'a', {value:1}).a"),
+      njs_str("1") },
+
+    { njs_str("var d = Object.freeze(new Date(''));"
+                 "Object.defineProperty(d, 'a', {value:1}).a"),
+      njs_str("TypeError: object is not extensible") },
+
+    { njs_str("var d = new Date(''); d.a = 1; Object.freeze(d);"
+                 "delete d.a"),
+      njs_str("TypeError: Cannot delete property \"a\" of date") },
+
+    { njs_str("var d = new Date(''); d.a = 1; Object.freeze(d); d.a = 2"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of date") },
+
+    { njs_str("var d = Object.freeze(new Date('')); d.a = 1"),
+      njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+    { njs_str("Object.defineProperty(new RegExp(''), 'a', {value:1}).a"),
+      njs_str("1") },
+
+    { njs_str("var r = Object.freeze(new RegExp(''));"
+                 "Object.defineProperty(r, 'a', {value:1}).a"),
+      njs_str("TypeError: object is not extensible") },
+
+    { njs_str("var r = new RegExp(''); r.a = 1; Object.freeze(r); delete r.a"),
+      njs_str("TypeError: Cannot delete property \"a\" of regexp") },
+
+    { njs_str("var r = new RegExp(''); r.a = 1; Object.freeze(r); r.a = 2"),
+      njs_str("TypeError: Cannot assign to read-only property \"a\" of regexp") },
+
+    { njs_str("var r = Object.freeze(new RegExp('')); r.a = 1"),
+      njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+    { njs_str("Object.isFrozen({a:1})"),
+      njs_str("false") },
+
+    { njs_str("Object.isFrozen([1,2])"),
+      njs_str("false") },
+
+    { njs_str("Object.isFrozen(function() {})"),
+      njs_str("false") },
+
+    { njs_str("Object.isFrozen(new Date(''))"),
+      njs_str("false") },
+
+    { njs_str("Object.isFrozen(new RegExp(''))"),
+      njs_str("false") },
+
+    { njs_str("Object.isFrozen()"),
+      njs_str("true") },
+
+    { njs_str("Object.isFrozen(1)"),
+      njs_str("true") },
+
+    { njs_str("Object.isFrozen('')"),
+      njs_str("true") },
+
+    { njs_str("Object.isFrozen(Object.defineProperties({}, {a:{value:1}}))"),
+      njs_str("false") },
+
+    { njs_str("var o = Object.defineProperties({}, {a:{}, b:{}});"
+                 "o = Object.preventExtensions(o);"
+                 "Object.isFrozen(o)"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.defineProperties({}, {a:{}, b:{writable:1}});"
+                 "o = Object.preventExtensions(o);"
+                 "Object.isFrozen(o)"),
+      njs_str("false") },
+
+    { njs_str("var o = Object.defineProperties({}, {a:{writable:1}});"
+                 "o = Object.preventExtensions(o);"
+                 "Object.isFrozen(o)"),
+      njs_str("false") },
+
+    { njs_str("var o = Object.defineProperties({}, {a:{configurable:1}});"
+                 "o = Object.preventExtensions(o);"
+                 "Object.isFrozen(o)"),
+      njs_str("false") },
+
+    { njs_str("var o = Object.preventExtensions({a:1});"
+                 "Object.isFrozen(o)"),
+      njs_str("false") },
+
+    { njs_str("var o = Object.freeze({a:1}); Object.isFrozen(o)"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.seal({a:1}); o.a = 2; o.a"),
+      njs_str("2") },
+
+    { njs_str("var o = Object.seal({a:1}); delete o.a"),
+      njs_str("TypeError: Cannot delete property \"a\" of object") },
+
+    { njs_str("var o = Object.seal({a:1}); o.b = 1; o.b"),
+      njs_str("TypeError: Cannot add property \"b\", object is not extensible") },
+
+    { njs_str("var o = Object.seal(Object.create({a:1})); o.a = 2; o.a"),
+      njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+    { njs_str("var o = Object.seal({a:{b:1}}); o.a.b = 2; o.a.b"),
+      njs_str("2") },
+
+    { njs_str("Object.seal()"),
+      njs_str("undefined") },
+
+    { njs_str("Object.seal(1)"),
+      njs_str("1") },
+
+    { njs_str("Object.seal('')"),
+      njs_str("") },
+
+    { njs_str("Object.isSealed({a:1})"),
+      njs_str("false") },
+
+    { njs_str("Object.isSealed([1,2])"),
+      njs_str("false") },
+
+    { njs_str("Object.isSealed(function() {})"),
+      njs_str("false") },
+
+    { njs_str("Object.isSealed(new Date(''))"),
+      njs_str("false") },
+
+    { njs_str("Object.isSealed(new RegExp(''))"),
+      njs_str("false") },
+
+    { njs_str("Object.isSealed()"),
+      njs_str("true") },
+
+    { njs_str("Object.isSealed(1)"),
+      njs_str("true") },
+
+    { njs_str("Object.isSealed('')"),
+      njs_str("true") },
+
+    { njs_str("Object.isSealed(Object.defineProperties({}, {a:{value:1}}))"),
+      njs_str("false") },
+
+    { njs_str("var o = Object.defineProperties({}, {a:{}, b:{}});"
+                 "o = Object.preventExtensions(o);"
+                 "Object.isSealed(o)"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.defineProperties({}, {a:{}, b:{writable:1}});"
+                 "o = Object.preventExtensions(o);"
+                 "Object.isSealed(o)"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.defineProperties({}, {a:{writable:1}});"
+                 "o = Object.preventExtensions(o);"
+                 "Object.isSealed(o)"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.defineProperties({}, {a:{configurable:1}});"
+                 "o = Object.preventExtensions(o);"
+                 "Object.isSealed(o)"),
+      njs_str("false") },
+
+    { njs_str("var o = Object.preventExtensions({a:1});"
+                 "Object.isFrozen(o)"),
+      njs_str("false") },
+
+    { njs_str("var o = Object.freeze({a:1}); Object.isFrozen(o)"),
+      njs_str("true") },
+
+    { njs_str("var o = Object.preventExtensions({a:1});"
+                 "Object.defineProperty(o, 'b', {value:1})"),
+      njs_str("TypeError: object is not extensible") },
+
+    { njs_str("var o = Object.preventExtensions({a:1});"
+                 "Object.defineProperties(o, {b:{value:1}})"),
+      njs_str("TypeError: object is not extensible") },
+
+    { njs_str("var o = Object.preventExtensions({a:1}); o.a = 2; o.a"),
+      njs_str("2") },
+
+    { njs_str("var o = Object.preventExtensions({a:1}); delete o.a; o.a"),
+      njs_str("undefined") },
+
+    { njs_str("var o = Object.preventExtensions({a:1}); o.b = 1; o.b"),
+      njs_str("TypeError: Cannot add property \"b\", object is not extensible") },
+
+    { njs_str("Object.preventExtensions()"),
+      njs_str("undefined") },
+
+    { njs_str("Object.preventExtensions(1)"),
+      njs_str("1") },
+
+    { njs_str("Object.preventExtensions('')"),
+      njs_str("") },
+
+    { njs_str("Object.isExtensible({})"),
+      njs_str("true") },
+
+    { njs_str("Object.isExtensible([])"),
+      njs_str("true") },
+
+    { njs_str("Object.isExtensible(function() {})"),
+      njs_str("true") },
+
+    { njs_str("Object.isExtensible(new Date(''))"),
+      njs_str("true") },
+
+    { njs_str("Object.isExtensible(new RegExp(''))"),
+      njs_str("true") },
+
+    { njs_str("Object.isExtensible()"),
+      njs_str("false") },
+
+    { njs_str("Object.isExtensible(1)"),
+      njs_str("false") },
+
+    { njs_str("Object.isExtensible('')"),
+      njs_str("false") },
+
+    { njs_str("Object.isExtensible(Object.preventExtensions({}))"),
+      njs_str("false") },
+
+    { njs_str("Object.isExtensible(Object.preventExtensions([]))"),
+      njs_str("false") },
+
+    { njs_str("Object.isExtensible(Object.freeze({}))"),
+      njs_str("false") },
+
+    { njs_str("Object.isExtensible(Object.freeze([]))"),
+      njs_str("false") },
+
+    { njs_str(
+        "var fail;"
+        "function isConfigurableMethods(o) {"
+        "    var except = ["
+        "        'prototype',"
+        "    ];"
+        "    return Object.getOwnPropertyNames(o)"
+        "                 .filter(v => !except.includes(v)"
+        "                              && typeof o[v] == 'function')"
+        "                 .every(v => Object.getOwnPropertyDescriptor(o, v)"
+        "                                   .configurable"
+        "                             || !(fail = `${o.name}.${v}`));"
+        "}"
+        "["
+        "    Boolean, Boolean.prototype,"
+        "    Number, Number.prototype,"
+        "    String, String.prototype,"
+        "    Object, Object.prototype,"
+        "    Array, Array.prototype,"
+        "    Function, Function.prototype,"
+        "    RegExp, RegExp.prototype,"
+        "    Date, Date.prototype,"
+        "    Error, Error.prototype,"
+        "    Math,"
+        "    JSON,"
+        "].every(obj => isConfigurableMethods(obj)) || fail"),
+
+      njs_str("true") },
+
+    { njs_str(
+        "var fail;"
+        "function isWritableMethods(o) {"
+        "    var except = ["
+        "        'prototype',"
+        "    ];"
+        "    return Object.getOwnPropertyNames(o)"
+        "                 .filter(v => !except.includes(v)"
+        "                              && typeof o[v] == 'function')"
+        "                 .every(v => Object.getOwnPropertyDescriptor(o, v)"
+        "                                   .writable"
+        "                             || !(fail = `${o.name}.${v}`));"
+        "}"
+        "["
+        "    Boolean, Boolean.prototype,"
+        "    Number, Number.prototype,"
+        "    String, String.prototype,"
+        "    Object, Object.prototype,"
+        "    Array, Array.prototype,"
+        "    Function, Function.prototype,"
+        "    RegExp, RegExp.prototype,"
+        "    Date, Date.prototype,"
+        "    Error, Error.prototype,"
+        "    Math,"
+        "    JSON,"
+        "].every(obj => isWritableMethods(obj)) || fail"),
+
+      njs_str("true") },
+
+    { njs_str("new Date(undefined)"),
+      njs_str("Invalid Date") },
+
+    { njs_str("new Date(Infinity)"),
+      njs_str("Invalid Date") },
+
+    { njs_str("new Date(NaN)"),
+      njs_str("Invalid Date") },
+
+    { njs_str("new Date(8.65e15)"),
+      njs_str("Invalid Date") },
+
+    { njs_str("new Date(0e0.o0)"),
+      njs_str("Invalid Date") },
+
+    { njs_str("(new Date(8.639e15)).getTime()"),
+      njs_str("8639000000000000") },
+
+    { njs_str("new Date(8.641e15)"),
+      njs_str("Invalid Date") },
+
+    { njs_str("(new Date(null)).getTime()"),
+      njs_str("0") },
+
+    { njs_str("(new Date(86400)).getTime()"),
+      njs_str("86400") },
+
+    { njs_str("var d = new Date(''); d +' '+ d.getTime()"),
+      njs_str("Invalid Date NaN") },
+
+    { njs_str("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
+      njs_str("Thu Jan 01 1970 00:00:00 GMT+0000") },
+
+    { njs_str("var d = new Date({valueOf:()=>86400000}); d = d + ''; d.slice(0, 33)"),
+      njs_str("Fri Jan 02 1970 00:00:00 GMT+0000") },
+
+    { njs_str("(new Date({toString:()=>'2011'})).getTime()"),
+      njs_str("1293840000000") },
+
+    { njs_str("(new Date({valueOf: ()=>86400, toString:()=>'2011'})).getTime()"),
+      njs_str("86400") },
+
+    { njs_str("var d = new Date(1308895200000); d.getTime()"),
+      njs_str("1308895200000") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getTime()"),
+      njs_str("1308941100000") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.valueOf()"),
+      njs_str("1308941100000") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45);"
+                 "d.toString().slice(0, 33)"),
+      njs_str("Fri Jun 24 2011 18:45:00 GMT+0000") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.toDateString()"),
+      njs_str("Fri Jun 24 2011") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45);"
+                 "d.toTimeString().slice(0, 17)"),
+      njs_str("18:45:00 GMT+0000") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.toUTCString()"),
+      njs_str("Fri Jun 24 2011 18:45:00 GMT") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+                 "d.toISOString()"),
+      njs_str("2011-06-24T18:45:12.625Z") },
+
+#if 0
+    /* These tests fail on Solaris: gmtime_r() returns off by one day. */
+
+    { njs_str("var d = new Date(-62167219200000); d.toISOString()"),
+      njs_str("0000-01-01T00:00:00.000Z") },
+
+    { njs_str("var d = new Date(-62135596800000); d.toISOString()"),
+      njs_str("0001-01-01T00:00:00.000Z") },
+
+    { njs_str("var d = new Date(-62198755200000); d.toISOString()"),
+      njs_str("-000001-01-01T00:00:00.000Z") },
+#endif
+
+    { njs_str("Date.UTC(2011, 5, 24, 6, 0)"),
+      njs_str("1308895200000") },
+
+    { njs_str("Date.UTC({valueOf:()=>2011}, 5, 24, 6, 0)"),
+      njs_str("1308895200000") },
+
+    { njs_str("Date.parse()"),
+      njs_str("NaN") },
+
+    { njs_str("Date.parse('2011')"),
+      njs_str("1293840000000") },
+
+    { njs_str("Date.parse('+002011')"),
+      njs_str("1293840000000") },
+
+    { njs_str("Date.parse('2011-06')"),
+      njs_str("1306886400000") },
+
+    { njs_str("Date.parse('2011-06-24')"),
+      njs_str("1308873600000") },
+
+    { njs_str("Date.parse('2011-06-24T06')"),
+      njs_str("NaN") },
+
+    { njs_str("Date.parse('2011-06-24T06:')"),
+      njs_str("NaN") },
+
+    { njs_str("Date.parse('2011-06-24T06:01:')"),
+      njs_str("NaN") },
+
+    { njs_str("Date.parse('2011-06-24T06:01Z')"),
+      njs_str("1308895260000") },
+
+    { njs_str("Date.parse('2011-06-24T06:01:02:')"),
+      njs_str("NaN") },
+
+    { njs_str("Date.parse('2011-06-24T06:01:02Z')"),
+      njs_str("1308895262000") },
+
+    { njs_str("Date.parse('2011-06-24T06:01:02.Z')"),
+      njs_str("NaN") },
+
+    { njs_str("Date.parse('2011-06-24T06:01:02.6Z')"),
+      njs_str("1308895262600") },
+
+    { njs_str("Date.parse('2011-06-24T06:01:02.62Z')"),
+      njs_str("1308895262620") },
+
+    { njs_str("Date.parse('2011-06-24T06:01:02:625Z')"),
+      njs_str("NaN") },
+
+    { njs_str("Date.parse('2011-06-24T06:01:02.625Z')"),
+      njs_str("1308895262625") },
+
+    { njs_str("Date.parse('2011-06-24T06:01:02.6255555Z')"),
+      njs_str("1308895262625") },
+
+    { njs_str("Date.parse('2011-06-24T06:01:02.625555Z5')"),
+      njs_str("NaN") },
+
+    { njs_str("var d = new Date(); var str = d.toISOString();"
+                 "var diff = Date.parse(str) - Date.parse(str.substring(0, str.length - 1));"
+                 "d.getTimezoneOffset() == -diff/1000/60"),
+      njs_str("true") },
+
+    { njs_str("Date.parse('24 Jun 2011')"),
+      njs_str("1308873600000") },
+
+    { njs_str("Date.parse('Fri, 24 Jun 2011 18:48')"),
+      njs_str("1308941280000") },
+
+    { njs_str("Date.parse('Fri, 24 Jun 2011 18:48:02')"),
+      njs_str("1308941282000") },
+
+    { njs_str("Date.parse('Fri, 24 Jun 2011 18:48:02 GMT')"),
+      njs_str("1308941282000") },
+
+    { njs_str("Date.parse('Fri, 24 Jun 2011 18:48:02 +1245')"),
+      njs_str("1308895382000") },
+
+    { njs_str("Date.parse('Jun 24 2011')"),
+      njs_str("1308873600000") },
+
+    { njs_str("Date.parse('Fri Jun 24 2011 18:48')"),
+      njs_str("1308941280000") },
+
+    { njs_str("Date.parse('Fri Jun 24 2011 18:48:02')"),
+      njs_str("1308941282000") },
+
+    { njs_str("Date.parse('Fri Jun 24 2011 18:48:02 GMT+1245')"),
+      njs_str("1308895382000") },
+
+    /* Jan 1, 1. */
+    { njs_str("Date.parse('+000001-01-01T00:00:00.000Z')"),
+      njs_str("-62135596800000") },
+
+    /* Mar 2, 1 BCE. */
+    { njs_str("Date.parse('+000000-03-02T00:00:00.000Z')"),
+      njs_str("-62161948800000") },
+
+    /* Mar 1, 1 BCE. */
+    { njs_str("Date.parse('+000000-03-01T00:00:00.000Z')"),
+      njs_str("-62162035200000") },
+
+    /* Feb 29, 1 BCE. */
+    { njs_str("Date.parse('+000000-02-29T00:00:00.000Z')"),
+      njs_str("-62162121600000") },
+
+    /* Feb 28, 1 BCE. */
+    { njs_str("Date.parse('+000000-02-28T00:00:00.000Z')"),
+      njs_str("-62162208000000") },
+
+    /* Jan 1, 1 BCE. */
+    { njs_str("Date.parse('+000000-01-01T00:00:00.000Z')"),
+      njs_str("-62167219200000") },
+
+    /* Jan 1, 2 BCE. */
+    { njs_str("Date.parse('-000001-01-01T00:00:00.000Z')"),
+      njs_str("-62198755200000") },
+
+    { njs_str("var d = new Date(); d == Date.parse(d.toISOString())"),
+      njs_str("true") },
+
+    { njs_str("var s = Date(); s === Date(Date.parse(s))"),
+      njs_str("true") },
+
+    { njs_str("var n = Date.now(); n == new Date(n)"),
+      njs_str("true") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getFullYear()"),
+      njs_str("2011") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCFullYear()"),
+      njs_str("2011") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getMonth()"),
+      njs_str("5") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMonth()"),
+      njs_str("5") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getDate()"),
+      njs_str("24") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCDate()"),
+      njs_str("24") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getDay()"),
+      njs_str("5") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCDay()"),
+      njs_str("5") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getHours()"),
+      njs_str("18") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCHours()"),
+      njs_str("18") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getMinutes()"),
+      njs_str("45") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMinutes()"),
+      njs_str("45") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12);"
+                 "d.getSeconds()"),
+      njs_str("12") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12);"
+                 "d.getUTCSeconds()"),
+      njs_str("12") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+                 "d.getMilliseconds()"),
+      njs_str("625") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+                 "d.getUTCMilliseconds()"),
+      njs_str("625") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+                 "d.getTimezoneOffset()"),
+      njs_str("0") },
+
+    { njs_str("var d = new Date(); d.setTime(1308895200000); d.getTime()"),
+      njs_str("1308895200000") },
+
+    { njs_str("var d = new Date(1308895201625); d.setMilliseconds(5003);"
+                 "d.getTime()"),
+      njs_str("1308895206003") },
+
+    { njs_str("var d = new Date(1308895201625); d.setSeconds(2, 5003);"
+                 "d.getTime()"),
+      njs_str("1308895207003") },
+
+    { njs_str("var d = new Date(1308895201625); d.setSeconds(2);"
+                 "d.getTime()"),
+      njs_str("1308895202625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setMinutes(3, 2, 5003);"
+                 "d.getTime()"),
+      njs_str("1308895387003") },
+
+    { njs_str("var d = new Date(1308895323625); d.setMinutes(3, 2);"
+                 "d.getTime()"),
+      njs_str("1308895382625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setMinutes(3);"
+                 "d.getTime()"),
+      njs_str("1308895383625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCMinutes(3, 2, 5003);"
+                 "d.getTime()"),
+      njs_str("1308895387003") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCMinutes(3, 2);"
+                 "d.getTime()"),
+      njs_str("1308895382625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCMinutes(3);"
+                 "d.getTime()"),
+      njs_str("1308895383625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setHours(20, 3, 2, 5003);"
+                 "d.getTime()"),
+      njs_str("1308945787003") },
+
+    { njs_str("var d = new Date(1308895323625); d.setHours(20, 3, 2);"
+                 "d.getTime()"),
+      njs_str("1308945782625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setHours(20, 3);"
+                 "d.getTime()"),
+      njs_str("1308945783625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setHours(20);"
+                 "d.getTime()"),
+      njs_str("1308945723625") },
+
+    { njs_str("var d = new Date(1308895323625);"
+                 "d.setUTCHours(20, 3, 2, 5003); d.getTime()"),
+      njs_str("1308945787003") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCHours(20, 3, 2);"
+                 "d.getTime()"),
+      njs_str("1308945782625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCHours(20, 3);"
+                 "d.getTime()"),
+      njs_str("1308945783625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCHours(20);"
+                 "d.getTime()"),
+      njs_str("1308945723625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setDate(10);"
+                 "d.getTime()"),
+      njs_str("1307685723625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCDate(10);"
+                 "d.getTime()"),
+      njs_str("1307685723625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setMonth(2, 10);"
+                 "d.getTime()"),
+      njs_str("1299736923625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCMonth(2, 10);"
+                 "d.getTime()"),
+      njs_str("1299736923625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setMonth(2);"
+                 "d.getTime()"),
+      njs_str("1300946523625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCMonth(2);"
+                 "d.getTime()"),
+      njs_str("1300946523625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setFullYear(2010, 2, 10);"
+                 "d.getTime()"),
+      njs_str("1268200923625") },
+
+    { njs_str("var d = new Date(1308895323625);"
+                 "d.setUTCFullYear(2010, 2, 10); d.getTime()"),
+      njs_str("1268200923625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setFullYear(2010, 2);"
+                 "d.getTime()"),
+      njs_str("1269410523625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCFullYear(2010, 2);"
+                 "d.getTime()"),
+      njs_str("1269410523625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setFullYear(2010);"
+                 "d.getTime()"),
+      njs_str("1277359323625") },
+
+    { njs_str("var d = new Date(1308895323625); d.setUTCFullYear(2010);"
+                 "d.getTime()"),
+      njs_str("1277359323625") },
+
+    { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+                 "d.toJSON(1)"),
+      njs_str("2011-06-24T18:45:12.625Z") },
+
+    { njs_str("var o = { toISOString: function() { return 'OK' } };"
+                 "Date.prototype.toJSON.call(o, 1)"),
+      njs_str("OK") },
+
+    { njs_str("var d = new Date; d.__proto__"),
+      njs_str("Invalid Date") },
+
+    { njs_str("var d = new Date(); d.__proto__"),
+      njs_str("Invalid Date") },
+
+    { njs_str("var d = new Date(); d.__proto__ === Date.prototype"),
+      njs_str("true") },
+
+    { njs_str("new Date(NaN)"),
+      njs_str("Invalid Date") },
+
+    { njs_str("[0].map(new Date().getDate)"),
+      njs_str("TypeError: cannot convert undefined to date") },
+
+    { njs_str("new Date(eval)"),
+      njs_str("Invalid Date") },
+
+    { njs_str("Date.UTC(eval)"),
+      njs_str("NaN") },
+
+    { njs_str("Date.name"),
+      njs_str("Date") },
+
+    { njs_str("Date.length"),
+      njs_str("7") },
+
+    { njs_str("Date.__proto__ === Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("Date.prototype.constructor === Date"),
+      njs_str("true") },
+
+    { njs_str("Date.prototype.hasOwnProperty('constructor')"),
+      njs_str("true") },
+
+    { njs_str("Date.prototype.__proto__ === Object.prototype"),
+      njs_str("true") },
+
+    { njs_str("Date.prototype"),
+      njs_str("Invalid Date") },
+
+    { njs_str("Date.prototype.valueOf()"),
+      njs_str("NaN") },
+
+    { njs_str("Date.constructor === Function"),
+      njs_str("true") },
+
+    /* eval(). */
+
+    { njs_str("eval.name"),
+      njs_str("eval") },
+
+    { njs_str("eval.length"),
+      njs_str("1") },
+
+    { njs_str("eval.prototype"),
+      njs_str("undefined") },
+
+    { njs_str("eval.__proto__ === Function.prototype"),
+      njs_str("true") },
+
+    { njs_str("eval.constructor === Function"),
+      njs_str("true") },
+
+    { njs_str("eval()"),
+      njs_str("InternalError: Not implemented") },
+
+    /* Math. */
+
+    { njs_str("Math.PI"),
+      njs_str("3.141592653589793") },
+
+    { njs_str("Math.abs()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.abs(5)"),
+      njs_str("5") },
+
+    { njs_str("Math.abs(-5)"),
+      njs_str("5") },
+
+    { njs_str("Math.abs('5.0')"),
+      njs_str("5") },
+
+    { njs_str("Math.abs('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.acos()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.acos(NaN)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.acos('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.acos(1.1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.acos(-1.1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.acos('1')"),
+      njs_str("0") },
+
+    { njs_str("Math.acos(0) - Math.PI/2"),
+      njs_str("0") },
+
+    { njs_str("Math.acosh()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.acosh('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.acosh(0.9)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.acosh(1)"),
+      njs_str("0") },
+
+    { njs_str("Math.acosh('Infinity')"),
+      njs_str("Infinity") },
+
+    /*
+     * The difference is Number.EPSILON on Linux/i686
+     * and zero on other platforms.
+     */
+    { njs_str("Math.abs(Math.acosh((1/Math.E + Math.E)/2) - 1)"
+                 " <= Number.EPSILON"),
+      njs_str("true") },
+
+    { njs_str("Math.asin()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.asin(NaN)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.asin('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.asin(1.1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.asin(-1.1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.asin(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.asin('-0')"),
+      njs_str("-0") },
+
+    { njs_str("Math.asin(1) - Math.PI/2"),
+      njs_str("0") },
+
+    { njs_str("Math.asinh()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.asinh('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.asinh(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.asinh('-0')"),
+      njs_str("-0") },
+
+    { njs_str("Math.asinh(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.asinh(-Infinity)"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.asinh((Math.E - 1/Math.E)/2)"),
+      njs_str("1") },
+
+    { njs_str("Math.atan()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.atan(NaN)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.atan('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.atan('Infinity') - Math.PI/2"),
+      njs_str("0") },
+
+    { njs_str("Math.atan(-Infinity) + Math.PI/2"),
+      njs_str("0") },
+
+    { njs_str("Math.atan(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.atan('-0')"),
+      njs_str("-0") },
+
+    { njs_str("Math.atan(1) - Math.PI/4"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.atan2(1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.atan2('abc', 1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.atan2(1, 0) - Math.PI/2"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2('1', -0) - Math.PI/2"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(0, '1')"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(0, 0)"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(0, -0) - Math.PI"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2('0', -1) - Math.PI"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(-0, '0.1')"),
+      njs_str("-0") },
+
+    { njs_str("Math.atan2(-0, 0)"),
+      njs_str("-0") },
+
+    { njs_str("Math.atan2(-0, -0) + Math.PI"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2('-0', '-1') + Math.PI"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(-0.1, 0) + Math.PI/2"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(-1, -0) + Math.PI/2"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(1, 'Infinity')"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(0.1, -Infinity) - Math.PI"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(-1, Infinity)"),
+      njs_str("-0") },
+
+    { njs_str("Math.atan2('-0.1', -Infinity) + Math.PI"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(Infinity, -5) - Math.PI/2"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(-Infinity, 5) + Math.PI/2"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2('Infinity', 'Infinity') - Math.PI/4"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(Infinity, -Infinity) - 3*Math.PI/4"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(-Infinity, 'Infinity') + Math.PI/4"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2('-Infinity', -Infinity) + 3*Math.PI/4"),
+      njs_str("0") },
+
+    { njs_str("Math.atan2(1, 1) - Math.atan2(-5, -5) - Math.PI"),
+      njs_str("0") },
+
+    { njs_str("Math.atanh()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.atanh('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.atanh(-1.1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.atanh(1.1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.atanh(1)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.atanh('-1')"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.atanh(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.atanh(-0)"),
+      njs_str("-0") },
+
+    /*
+     * The difference is Number.EPSILON on Linux/i686
+     * and zero on other platforms.
+     */
+    { njs_str("Math.abs(1 - Math.atanh((Math.E - 1)/(Math.E + 1)) * 2)"
+                 " <= Number.EPSILON"),
+      njs_str("true") },
+
+    { njs_str("Math.cbrt()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.cbrt('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.cbrt(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.cbrt('-0')"),
+      njs_str("-0") },
+
+    { njs_str("Math.cbrt(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.cbrt(-Infinity)"),
+      njs_str("-Infinity") },
+
+    { njs_str("(Math.cbrt('27') - 3) < 1e-15"),
+      njs_str("true") },
+
+    { njs_str("Math.cbrt(-1)"),
+      njs_str("-1") },
+
+    { njs_str("Math.ceil()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.ceil('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.ceil(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.ceil('-0')"),
+      njs_str("-0") },
+
+    { njs_str("Math.ceil('Infinity')"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.ceil(-Infinity)"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.ceil(-0.9)"),
+      njs_str("-0") },
+
+    { njs_str("Math.ceil(3.1)"),
+      njs_str("4") },
+
+    { njs_str("Math.clz32()"),
+      njs_str("32") },
+
+    { njs_str("Math.clz32('abc')"),
+      njs_str("32") },
+
+    { njs_str("Math.clz32(NaN)"),
+      njs_str("32") },
+
+    { njs_str("Math.clz32(Infinity)"),
+      njs_str("32") },
+
+    { njs_str("Math.clz32('1')"),
+      njs_str("31") },
+
+    { njs_str("Math.clz32(0)"),
+      njs_str("32") },
+
+    { njs_str("Math.clz32('65535')"),
+      njs_str("16") },
+
+    { njs_str("Math.clz32(-1)"),
+      njs_str("0") },
+
+    { njs_str("Math.clz32(4294967298)"),
+      njs_str("30") },
+
+    { njs_str("Math.cos()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.cos('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.cos('0')"),
+      njs_str("1") },
+
+    { njs_str("Math.cos(-0)"),
+      njs_str("1") },
+
+    { njs_str("Math.cos(Infinity)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.cos(-Infinity)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.cos(Math.PI*2)"),
+      njs_str("1") },
+
+    { njs_str("Math.cosh()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.cosh('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.cosh('0')"),
+      njs_str("1") },
+
+    { njs_str("Math.cosh(-0)"),
+      njs_str("1") },
+
+    { njs_str("Math.cosh(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.cosh(-Infinity)"),
+      njs_str("Infinity") },
+
+    /*
+     * The difference is Number.EPSILON on FreeBSD
+     * and zero on other platforms.
+     */
+    { njs_str("Math.abs(Math.cosh(1) - (1/Math.E + Math.E)/2)"
+                 " <= Number.EPSILON"),
+      njs_str("true") },
+
+    { njs_str("Math.exp()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.exp('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.exp('0')"),
+      njs_str("1") },
+
+    { njs_str("Math.exp(-0)"),
+      njs_str("1") },
+
+    { njs_str("Math.exp(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.exp(-Infinity)"),
+      njs_str("0") },
+
+    /*
+     * The difference is 2 * Number.EPSILON on FreeBSD
+     * and zero on other platforms.
+     */
+    { njs_str("Math.abs(Math.exp(1) - Math.E) <= 2 * Number.EPSILON"),
+      njs_str("true") },
+
+    { njs_str("Math.expm1()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.expm1('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.expm1('0')"),
+      njs_str("0") },
+
+    { njs_str("Math.expm1(-0)"),
+      njs_str("-0") },
+
+    { njs_str("Math.expm1(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.expm1(-Infinity)"),
+      njs_str("-1") },
+
+    /*
+     * The difference is 2 * Number.EPSILON on FreeBSD, Solaris,
+     * and MacOSX and zero on other platforms.
+     */
+    { njs_str("Math.abs(1 + Math.expm1(1) - Math.E) <= 2 * Number.EPSILON"),
+      njs_str("true") },
+
+    { njs_str("Math.floor()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.floor('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.floor(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.floor('-0')"),
+      njs_str("-0") },
+
+    { njs_str("Math.floor('Infinity')"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.floor(-Infinity)"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.floor(0.9)"),
+      njs_str("0") },
+
+    { njs_str("Math.floor(-3.1)"),
+      njs_str("-4") },
+
+    { njs_str("Math.fround()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.fround('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.fround(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.fround('-0')"),
+      njs_str("-0") },
+
+    { njs_str("Math.fround('Infinity')"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.fround(-Infinity)"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.fround('-1.5')"),
+      njs_str("-1.5") },
+
+    { njs_str("Math.fround(16777216)"),
+      njs_str("16777216") },
+
+    { njs_str("Math.fround(-16777217)"),
+      njs_str("-16777216") },
+
+    { njs_str("Math.hypot()"),
+      njs_str("0") },
+
+    { njs_str("Math.hypot(1, 2, 'abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.hypot(1, NaN, 3)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.hypot(1, NaN, -Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.hypot(-42)"),
+      njs_str("42") },
+
+    { njs_str("Math.hypot(8, -15)"),
+      njs_str("17") },
+
+    { njs_str("Math.hypot(3, -4, 12.0, '84', 132)"),
+      njs_str("157") },
+
+    { njs_str("Math.imul()"),
+      njs_str("0") },
+
+    { njs_str("Math.imul(1)"),
+      njs_str("0") },
+
+    { njs_str("Math.imul('a', 1)"),
+      njs_str("0") },
+
+    { njs_str("Math.imul(1, NaN)"),
+      njs_str("0") },
+
+    { njs_str("Math.imul(2, '3')"),
+      njs_str("6") },
+
+    { njs_str("Math.imul('3.9', -2.1)"),
+      njs_str("-6") },
+
+    { njs_str("Math.imul(2, 2147483647)"),
+      njs_str("-2") },
+
+    { njs_str("Math.imul(Number.MAX_SAFE_INTEGER, 2)"),
+      njs_str("-2") },
+
+    { njs_str("Math.imul(1, Number.MAX_SAFE_INTEGER + 1)"),
+      njs_str("0") },
+
+    { njs_str("Math.imul(2, Number.MIN_SAFE_INTEGER)"),
+      njs_str("2") },
+
+    { njs_str("Math.imul(Number.MIN_SAFE_INTEGER - 1, 1)"),
+      njs_str("0") },
+
+    { njs_str("Math.imul(2, 4294967297)"),
+      njs_str("2") },
+
+    { njs_str("Math.imul(-4294967297, 4294967297)"),
+      njs_str("-1") },
+
+    { njs_str("Math.imul(4294967297, -4294967298)"),
+      njs_str("-2") },
+
+    { njs_str("Math.imul(-4294967290, 4294967290)"),
+      njs_str("-36") },
+
+    { njs_str("Math.imul(-Infinity, 1)"),
+      njs_str("0") },
+
+    { njs_str("Math.imul(1, Infinity)"),
+      njs_str("0") },
+
+    { njs_str("Math.imul(Number.MAX_VALUE, 1)"),
+      njs_str("0") },
+
+    { njs_str("Math.imul(1, -Number.MAX_VALUE)"),
+      njs_str("0") },
+
+    { njs_str("Math.log()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log(-1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log(0)"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.log('-0')"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.log(1)"),
+      njs_str("0") },
+
+    { njs_str("Math.log(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.log(Math.E)"),
+      njs_str("1") },
+
+    { njs_str("Math.log10()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log10('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log10(-1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log10(0)"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.log10('-0')"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.log10(1)"),
+      njs_str("0") },
+
+    { njs_str("Math.log10(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.log10(1000)"),
+      njs_str("3") },
+
+    { njs_str("Math.log1p()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log1p('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log1p(-2)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log1p('-1')"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.log1p(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.log1p(-0)"),
+      njs_str("-0") },
+
+    { njs_str("Math.log1p(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.log1p(Math.E - 1)"),
+      njs_str("1") },
+
+    { njs_str("Math.log2()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log2('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log2(-1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.log2(0)"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.log2('-0')"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.log2(1)"),
+      njs_str("0") },
+
+    { njs_str("Math.log2(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.log2(128)"),
+      njs_str("7") },
+
+    { njs_str("Math.max()"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.max(null)"),
+      njs_str("0") },
+
+    { njs_str("Math.max(undefined)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.max('1', '2', '5')"),
+      njs_str("5") },
+
+    { njs_str("Math.max(5, {valueOf: function () {return 10}}, 6)"),
+      njs_str("10") },
+
+    { njs_str("Math.max(5, {valueOf: function () {return 10}}, 20)"),
+      njs_str("20") },
+
+    { njs_str("Math.max(5, undefined, 20)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.max(-10, null, -30)"),
+      njs_str("0") },
+
+    { njs_str("Math.min()"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.min(null)"),
+      njs_str("0") },
+
+    { njs_str("Math.min(undefined)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.min('1', '2', '5')"),
+      njs_str("1") },
+
+    { njs_str("Math.pow(2, 5)"),
+      njs_str("32") },
+
+    { njs_str("Math.pow(2)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.pow()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.pow(1, NaN)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.pow(3, NaN)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.pow('a', -0)"),
+      njs_str("1") },
+
+    { njs_str("Math.pow(1.1, Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.pow(-1.1, -Infinity)"),
+      njs_str("0") },
+
+    { njs_str("Math.pow(-1, Infinity)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.pow(1, -Infinity)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.pow(-0.9, Infinity)"),
+      njs_str("0") },
+
+    { njs_str("Math.pow(0.9, -Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.pow('Infinity', 0.1)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.pow(Infinity, '-0.1')"),
+      njs_str("0") },
+
+    { njs_str("Math.pow(-Infinity, 3)"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.pow('-Infinity', '3.1')"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.pow(-Infinity, '-3')"),
+      njs_str("-0") },
+
+    { njs_str("Math.pow('-Infinity', -2)"),
+      njs_str("0") },
+
+    { njs_str("Math.pow('0', 0.1)"),
+      njs_str("0") },
+
+#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
+    { njs_str("Math.pow(0, '-0.1')"),
+      njs_str("Infinity") },
+#endif
+
+    { njs_str("Math.pow(-0, 3)"),
+      njs_str("-0") },
+
+    { njs_str("Math.pow('-0', '3.1')"),
+      njs_str("0") },
+
+    { njs_str("Math.pow(-0, '-3')"),
+      njs_str("-Infinity") },
+
+#ifndef __NetBSD__  /* NetBSD 7: pow(0, negative) == -Infinity. */
+    { njs_str("Math.pow('-0', -2)"),
+      njs_str("Infinity") },
+#endif
+
+    { njs_str("Math.pow(-3, 0.1)"),
+      njs_str("NaN") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* intentional use of uninitialized stack */
+    { njs_str("var a = Math.random(); a >= 0 && a < 1"),
+      njs_str("true") },
+#endif
+
+    { njs_str("Math.round()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.round('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.round(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.round('-0')"),
+      njs_str("-0") },
+
+    { njs_str("Math.round('Infinity')"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.round(-Infinity)"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.round(0.4)"),
+      njs_str("0") },
+
+    { njs_str("Math.round('0.5')"),
+      njs_str("1") },
+
+    { njs_str("Math.round('-0.4')"),
+      njs_str("-0") },
+
+    { njs_str("Math.round(-0.5)"),
+      njs_str("-1") },
+
+    { njs_str("Math.sign(5)"),
+      njs_str("1") },
+
+    { njs_str("Math.sign(-5)"),
+      njs_str("-1") },
+
+    { njs_str("Math.sign(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.sign(-0.0)"),
+      njs_str("-0") },
+
+    { njs_str("Math.sign(NaN)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sign()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sin()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sin('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sin('0')"),
+      njs_str("0") },
+
+    { njs_str("Math.sin(-0)"),
+      njs_str("-0") },
+
+    { njs_str("Math.sin(Infinity)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sin(-Infinity)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sin(-Math.PI/2)"),
+      njs_str("-1") },
+
+    { njs_str("Math.sinh()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sinh('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sinh('0')"),
+      njs_str("0") },
+
+    { njs_str("Math.sinh(-0)"),
+      njs_str("-0") },
+
+    { njs_str("Math.sinh(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.sinh(-Infinity)"),
+      njs_str("-Infinity") },
+
+    /*
+     * The difference is Number.EPSILON on Solaris
+     * and zero on other platforms.
+     */
+    { njs_str("Math.abs(Math.sinh(1) - (Math.E - 1/Math.E)/2)"
+                 " <= Number.EPSILON"),
+      njs_str("true") },
+
+    { njs_str("Math.sqrt()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sqrt('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sqrt('0')"),
+      njs_str("0") },
+
+    { njs_str("Math.sqrt(-0)"),
+      njs_str("-0") },
+
+    { njs_str("Math.sqrt(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.sqrt(-0.1)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.sqrt('9.0')"),
+      njs_str("3") },
+
+    { njs_str("Math.tan()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.tan('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.tan('0')"),
+      njs_str("0") },
+
+    { njs_str("Math.tan(-0)"),
+      njs_str("-0") },
+
+    { njs_str("Math.tan(Infinity)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.tan(-Infinity)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.tan(Math.PI/3) + Math.tan(-Math.PI/3)"),
+      njs_str("0") },
+
+    { njs_str("Math.tanh()"),
+      njs_str("NaN") },
+
+    { njs_str("Math.tanh('abc')"),
+      njs_str("NaN") },
+
+    { njs_str("Math.tanh('0')"),
+      njs_str("0") },
+
+    { njs_str("Math.tanh(-0)"),
+      njs_str("-0") },
+
+    { njs_str("Math.tanh(Infinity)"),
+      njs_str("1") },
+
+    { njs_str("Math.tanh(-Infinity)"),
+      njs_str("-1") },
+
+    { njs_str("Math.tanh(0.5) - (Math.E - 1)/(Math.E + 1)"),
+      njs_str("0") },
+
+    { njs_str("Math.trunc(3.9)"),
+      njs_str("3") },
+
+    { njs_str("Math.trunc(-3.9)"),
+      njs_str("-3") },
+
+    { njs_str("Math.trunc(0)"),
+      njs_str("0") },
+
+    { njs_str("Math.trunc(-0)"),
+      njs_str("-0") },
+
+    { njs_str("Math.trunc(0.9)"),
+      njs_str("0") },
+
+    { njs_str("Math.trunc(-0.9)"),
+      njs_str("-0") },
+
+    { njs_str("Math.trunc(Infinity)"),
+      njs_str("Infinity") },
+
+    { njs_str("Math.trunc(-Infinity)"),
+      njs_str("-Infinity") },
+
+    { njs_str("Math.trunc(NaN)"),
+      njs_str("NaN") },
+
+    { njs_str("Math.trunc()"),
+      njs_str("NaN") },
+
+    /* ES5FIX: "[object Math]". */
+
+    { njs_str("Math"),
+      njs_str("[object Object]") },
+
+    { njs_str("Math.x = function (x) {return 2*x;}; Math.x(3)"),
+      njs_str("6") },
+
+    { njs_str("isNaN"),
+      njs_str("[object Function]") },
+
+    { njs_str("isNaN.name"),
+      njs_str("isNaN") },
+
+    { njs_str("isNaN.length"),
+      njs_str("1") },
+
+    { njs_str("isNaN()"),
+      njs_str("true") },
+
+    { njs_str("isNaN(123)"),
+      njs_str("false") },
+
+    { njs_str("isNaN('123')"),
+      njs_str("false") },
+
+    { njs_str("isNaN('Infinity')"),
+      njs_str("false") },
+
+    { njs_str("isNaN('abc')"),
+      njs_str("true") },
+
+    { njs_str("isFinite"),
+      njs_str("[object Function]") },
+
+    { njs_str("isFinite.name"),
+      njs_str("isFinite") },
+
+    { njs_str("isFinite.length"),
+      njs_str("1") },
+
+    { njs_str("isFinite()"),
+      njs_str("false") },
+
+    { njs_str("isFinite(123)"),
+      njs_str("true") },
+
+    { njs_str("isFinite('123')"),
+      njs_str("true") },
+
+    { njs_str("isFinite('Infinity')"),
+      njs_str("false") },
+
+    { njs_str("isFinite('abc')"),
+      njs_str("false") },
+
+    { njs_str("parseInt.name"),
+      njs_str("parseInt") },
+
+    { njs_str("parseInt.length"),
+      njs_str("2") },
+
+    { njs_str("parseInt('12345abc')"),
+      njs_str("12345") },
+
+    { njs_str("parseInt('123', 0)"),
+      njs_str("123") },
+
+    { njs_str("parseInt('0XaBc', 0)"),
+      njs_str("2748") },
+
+    { njs_str("parseInt(' 123')"),
+      njs_str("123") },
+
+    { njs_str("parseInt('1010', 2)"),
+      njs_str("10") },
+
+    { njs_str("parseInt('aBc', 16)"),
+      njs_str("2748") },
+
+    { njs_str("parseInt('0XaBc')"),
+      njs_str("2748") },
+
+    { njs_str("parseInt('-0xabc')"),
+      njs_str("-2748") },
+
+    { njs_str("parseInt('njscript', 36)"),
+      njs_str("1845449130881") },
+
+    { njs_str("parseInt('0x')"),
+      njs_str("NaN") },
+
+    { njs_str("parseInt('z')"),
+      njs_str("NaN") },
+
+    { njs_str("parseInt('0xz')"),
+      njs_str("NaN") },
+
+    { njs_str("parseInt('0x', 16)"),
+      njs_str("NaN") },
+
+    { njs_str("parseInt('0x', 33)"),
+      njs_str("0") },
+
+    { njs_str("parseInt('0x', 34)"),
+      njs_str("33") },
+
+    { njs_str("parseInt('0', 1)"),
+      njs_str("NaN") },
+
+    { njs_str("parseInt('0', 37)"),
+      njs_str("NaN") },
+
+    { njs_str("1/parseInt('-0')"),
+      njs_str("-Infinity") },
+
+    { njs_str("parseFloat.name"),
+      njs_str("parseFloat") },
+
+    { njs_str("parseFloat.length"),
+      njs_str("1") },
+
+    { njs_str("parseFloat('12345abc')"),
+      njs_str("12345") },
+
+    { njs_str("parseFloat('0x')"),
+      njs_str("0") },
+
+    { njs_str("parseFloat('0xff')"),
+      njs_str("0") },
+
+    { njs_str("parseFloat('Infinity')"),
+      njs_str("Infinity") },
+
+    { njs_str("parseFloat(' Infinityzz')"),
+      njs_str("Infinity") },
+
+    { njs_str("parseFloat('Infinit')"),
+      njs_str("NaN") },
+
+    { njs_str("parseFloat('5.7e1')"),
+      njs_str("57") },
+
+    { njs_str("parseFloat('-5.7e-1')"),
+      njs_str("-0.57") },
+
+    { njs_str("parseFloat('-5.e-1')"),
+      njs_str("-0.5") },
+
+    { njs_str("parseFloat('5.7e+01')"),
+      njs_str("57") },
+
+    { njs_str("parseFloat(' 5.7e+01abc')"),
+      njs_str("57") },
+
+    { njs_str("parseFloat('-5.7e-1abc')"),
+      njs_str("-0.57") },
+
+    { njs_str("parseFloat('-5.7e')"),
+      njs_str("-5.7") },
+
+    { njs_str("parseFloat('-5.7e+')"),
+      njs_str("-5.7") },
+
+    { njs_str("parseFloat('-5.7e+abc')"),
+      njs_str("-5.7") },
+
+    /* JSON.parse() */
+
+    { njs_str("JSON.parse('null')"),
+      njs_str("null") },
+
+    { njs_str("JSON.parse('true')"),
+      njs_str("true") },
+
+    { njs_str("JSON.parse('false')"),
+      njs_str("false") },
+
+    { njs_str("JSON.parse('0')"),
+      njs_str("0") },
+
+    { njs_str("JSON.parse('-1234.56e2')"),
+      njs_str("-123456") },
+
+    { njs_str("typeof(JSON.parse('true'))"),
+      njs_str("boolean") },
+
+    { njs_str("typeof(JSON.parse('false'))"),
+      njs_str("boolean") },
+
+    { njs_str("typeof(JSON.parse('1'))"),
+      njs_str("number") },
+
+    { njs_str("typeof(JSON.parse('\"\"'))"),
+      njs_str("string") },
+
+    { njs_str("typeof(JSON.parse('{}'))"),
+      njs_str("object") },
+
+    { njs_str("typeof(JSON.parse('[]'))"),
+      njs_str("object") },
+
+    { njs_str("JSON.parse('\"abc\"')"),
+      njs_str("abc") },
+
+    { njs_str("JSON.parse('\"\\\\\"\"')"),
+      njs_str("\"") },
+
+    { njs_str("JSON.parse('\"\\\\n\"')"),
+      njs_str("\n") },
+
+    { njs_str("JSON.parse('\"\\\\t\"')"),
+      njs_str("\t") },
+
+    { njs_str("JSON.parse('\"ab\\\\\"c\"')"),
+      njs_str("ab\"c") },
+
+    { njs_str("JSON.parse('\"abcdefghijklmopqr\\\\\"s\"')"),
+      njs_str("abcdefghijklmopqr\"s") },
+
+    { njs_str("JSON.parse('\"ab\\\\\"c\"').length"),
+      njs_str("4") },
+
+    { njs_str("JSON.parse('\"аб\\\\\"в\"')"),
+      njs_str("аб\"в") },
+
+    { njs_str("JSON.parse('\"аб\\\\\"в\"').length"),
+      njs_str("4") },
+
+    { njs_str("JSON.parse('\"абвгдеёжзийкл\"').length"),
+      njs_str("13") },
+
+    { njs_str("JSON.parse('[\"' + 'α'.repeat(33) + '\"]')[0][32]"),
+      njs_str("α") },
+
+    { njs_str("JSON.parse('\"\\\\u03B1\"')"),
+      njs_str("α") },
+
+    { njs_str("JSON.parse('\"\\\\uD801\\\\uDC00\"')"),
+      njs_str("𐐀") },
+
+    { njs_str("JSON.parse('\"\\\\u03B1\"') == JSON.parse('\"\\\\u03b1\"')"),
+      njs_str("true") },
+
+    { njs_str("JSON.parse('\"\\\\u03B1\"').length"),
+      njs_str("1") },
+
+    { njs_str("JSON.parse('{\"a\":1}').a"),
+      njs_str("1") },
+
+    { njs_str("JSON.parse('{\"a\":1,\"a\":2}').a"),
+      njs_str("2") },
+
+    { njs_str("JSON.parse('{   \"a\" :  \"b\"   }').a"),
+      njs_str("b") },
+
+    { njs_str("JSON.parse('{\"a\":{\"b\":1}}').a.b"),
+      njs_str("1") },
+
+    { njs_str("JSON.parse('[{}, true ,1.1e2, {\"a\":[3,\"b\"]}]')[3].a[1]"),
+      njs_str("b") },
+
+    { njs_str("var o = JSON.parse('{\"a\":2}');"
+                 "Object.getOwnPropertyDescriptor(o, 'a').configurable"),
+      njs_str("true") },
+
+    { njs_str("var o = JSON.parse('{\"a\":2}');"
+                 "Object.getOwnPropertyDescriptor(o, 'a').writable"),
+      njs_str("true") },
+
+    { njs_str("var o = JSON.parse('{\"a\":2}');"
+                 "Object.getOwnPropertyDescriptor(o, 'a').enumerable"),
+      njs_str("true") },
+
+    { njs_str("var o = JSON.parse('{\"a\":2}');"
+                 "o.a = 3; o.a"),
+      njs_str("3") },
+
+    { njs_str("var o = JSON.parse('{\"a\":2}');"
+                 "o.b = 3; o.b"),
+      njs_str("3") },
+
+    { njs_str("JSON.parse('2') || 10"),
+      njs_str("2") },
+
+    { njs_str("JSON.parse('0') || 10"),
+      njs_str("10") },
+
+    { njs_str("JSON.parse('-0') || 10"),
+      njs_str("10") },
+
+    { njs_str("JSON.parse('\"a\"') || 10"),
+      njs_str("a") },
+
+    { njs_str("JSON.parse('\"\"') || 10"),
+      njs_str("10") },
+
+    { njs_str("JSON.parse('true') || 10"),
+      njs_str("true") },
+
+    { njs_str("JSON.parse('false') || 10"),
+      njs_str("10") },
+
+    { njs_str("JSON.parse('null') || 10"),
+      njs_str("10") },
+
+    { njs_str("var o = JSON.parse('{}', function(k, v) {return v;}); o"),
+      njs_str("[object Object]") },
+
+    { njs_str("var o = JSON.parse('{\"a\":2, \"b\":4, \"a\":{}}',"
+                 "                    function(k, v) {return undefined;});"
+                 "o"),
+      njs_str("undefined") },
+
+    { njs_str("var o = JSON.parse('{\"a\":2, \"c\":4, \"b\":\"x\"}',"
+                 "  function(k, v) {if (k === '' || typeof v === 'number') return v });"
+                 "Object.keys(o)"),
+      njs_str("a,c") },
+
+    { njs_str("var o = JSON.parse('{\"a\":2, \"b\":{}}',"
+                 "                    function(k, v) {return k;});"
+                 "o+typeof(o)"),
+      njs_str("string") },
+
+    { njs_str("var o = JSON.parse('[\"a\", \"b\"]',"
+                 "                    function(k, v) {return v;});"
+                 "o"),
+      njs_str("a,b") },
+
+    { njs_str("var o = JSON.parse('{\"a\":[1,{\"b\":1},3]}',"
+                 "                    function(k, v) {return v;});"
+                 "o.a[1].b"),
+      njs_str("1") },
+
+    { njs_str("var o = JSON.parse('{\"a\":[1,2]}',"
+                 "  function(k, v) {if (k === '' || k === 'a') {return v;}});"
+                 "o.a"),
+      njs_str(",") },
+
+    { njs_str("var o = JSON.parse('{\"a\":[1,2]}',"
+                 "  function(k, v) {return (k === '' || k === 'a') ? v : v*2});"
+                 "o.a"),
+      njs_str("2,4") },
+
+    { njs_str("var o = JSON.parse('{\"a\":2, \"b\":{\"c\":[\"xx\"]}}',"
+                 "   function(k, v) {return typeof v === 'number' ? v * 2 : v;});"
+                 "o.a+o.b.c[0]"),
+      njs_str("4xx") },
+
+    { njs_str("var o = JSON.parse('{\"aa\":{\"b\":1}, \"abb\":1, \"c\":1}',"
+                 "   function(k, v) {return (k === '' || /^a/.test(k)) ? v : undefined;});"
+                 "Object.keys(o)"),
+      njs_str("aa,abb") },
+
+    { njs_str("var o = JSON.parse('{\"a\":\"x\"}',"
+                 "   function(k, v) {if (k === 'a') {this.b='y';} return v});"
+                 "o.a+o.b"),
+      njs_str("xy") },
+
+    { njs_str("var o = JSON.parse('{\"a\":\"x\"}',"
+                 "   function(k, v) {return (k === 'a' ? {x:1} : v)});"
+                 "o.a.x"),
+      njs_str("1") },
+
+    { njs_str("var keys = []; var o = JSON.parse('{\"a\":2, \"b\":{\"c\":\"xx\"}}',"
+                 "   function(k, v) {keys.push(k); return v;});"
+                 "keys"),
+      njs_str("a,c,b,") },
+
+    { njs_str("var args = []; var o = JSON.parse('[2,{\"a\":3}]',"
+                 "   function(k, v) {args.push(k+\":\"+v); return v;});"
+                 "args.join('|')"),
+      njs_str("0:2|a:3|1:[object Object]|:2,[object Object]") },
+
+    { njs_str("JSON.parse()"),
+      njs_str("SyntaxError: Unexpected token at position 0") },
+
+    { njs_str("JSON.parse([])"),
+      njs_str("SyntaxError: Unexpected end of input at position 0") },
+
+    { njs_str("JSON.parse('')"),
+      njs_str("SyntaxError: Unexpected end of input at position 0") },
+
+    { njs_str("JSON.parse('fals')"),
+      njs_str("SyntaxError: Unexpected token at position 0") },
+
+    { njs_str("JSON.parse(' t')"),
+      njs_str("SyntaxError: Unexpected token at position 1") },
+
+    { njs_str("JSON.parse('nu')"),
+      njs_str("SyntaxError: Unexpected token at position 0") },
+
+    { njs_str("JSON.parse('-')"),
+      njs_str("SyntaxError: Unexpected number at position 0") },
+
+    { njs_str("JSON.parse('--')"),
+      njs_str("SyntaxError: Unexpected number at position 1") },
+
+    { njs_str("JSON.parse('1-')"),
+      njs_str("SyntaxError: Unexpected token at position 1") },
+
+    { njs_str("JSON.parse('1ee1')"),
+      njs_str("SyntaxError: Unexpected token at position 1") },
+
+    { njs_str("JSON.parse('1eg')"),
+      njs_str("SyntaxError: Unexpected token at position 1") },
+
+    { njs_str("JSON.parse('0x01')"),
+      njs_str("SyntaxError: Unexpected token at position 1") },
+
+    { njs_str("JSON.parse('\"абв')"),
+      njs_str("SyntaxError: Unexpected end of input at position 4") },
+
+    { njs_str("JSON.parse('\"\b')"),
+      njs_str("SyntaxError: Forbidden source char at position 1") },
+
+    { njs_str("JSON.parse('\"\\\\u')"),
+      njs_str("SyntaxError: Unexpected end of input at position 3") },
+
+    { njs_str("JSON.parse('\"\\\\q\"')"),
+      njs_str("SyntaxError: Unknown escape char at position 2") },
+
+    { njs_str("JSON.parse('\"\\\\uDC01\"')"),
+      njs_str("�") },
+
+    { njs_str("JSON.parse('\"\\\\uD801\\\\uE000\"')"),
+      njs_str("�") },
+
+    { njs_str("JSON.parse('\"\\\\uD83D\"')"),
+      njs_str("�") },
+
+    { njs_str("JSON.parse('\"\\\\uD800\\\\uDB00\"')"),
+      njs_str("��") },
+
+    { njs_str("JSON.parse('\"\\\\ud800[\"')"),
+      njs_str("�[") },
+
+    { njs_str("JSON.parse('{')"),
+      njs_str("SyntaxError: Unexpected end of input at position 1") },
+
+    { njs_str("JSON.parse('{{')"),
+      njs_str("SyntaxError: Unexpected token at position 1") },
+
+    { njs_str("JSON.parse('{[')"),
+      njs_str("SyntaxError: Unexpected token at position 1") },
+
+    { njs_str("JSON.parse('{\"a\"')"),
+      njs_str("SyntaxError: Unexpected token at position 4") },
+
+    { njs_str("JSON.parse('{\"a\":')"),
+      njs_str("SyntaxError: Unexpected end of input at position 5") },
+
+    { njs_str("JSON.parse('{\"a\":{')"),
+      njs_str("SyntaxError: Unexpected end of input at position 6") },
+
+    { njs_str("JSON.parse('{\"a\":{}')"),
+      njs_str("SyntaxError: Unexpected end of input at position 7") },
+
+    { njs_str("JSON.parse('{\"a\":{}g')"),
+      njs_str("SyntaxError: Unexpected token at position 7") },
+
+    { njs_str("JSON.parse('{\"a\":{},')"),
+      njs_str("SyntaxError: Unexpected end of input at position 8") },
+
+    { njs_str("JSON.parse('{\"a\":{},}')"),
+      njs_str("SyntaxError: Trailing comma at position 7") },
+
+    { njs_str("JSON.parse('{\"a\":{},,')"),
+      njs_str("SyntaxError: Unexpected token at position 8") },
+
+    { njs_str("JSON.parse('{\"a\":{},,}')"),
+      njs_str("SyntaxError: Unexpected token at position 8") },
+
+    { njs_str("JSON.parse('[')"),
+      njs_str("SyntaxError: Unexpected end of input at position 1") },
+
+    { njs_str("JSON.parse('[q')"),
+      njs_str("SyntaxError: Unexpected token at position 1") },
+
+    { njs_str("JSON.parse('[\"a')"),
+      njs_str("SyntaxError: Unexpected end of input at position 3") },
+
+    { njs_str("JSON.parse('[1 ')"),
+      njs_str("SyntaxError: Unexpected end of input at position 3") },
+
+    { njs_str("JSON.parse('[1,]')"),
+      njs_str("SyntaxError: Trailing comma at position 2") },
+
+    { njs_str("JSON.parse('[1 , 5 ')"),
+      njs_str("SyntaxError: Unexpected end of input at position 7") },
+
+    { njs_str("JSON.parse('{\"a\":'.repeat(32))"),
+      njs_str("SyntaxError: Nested too deep at position 155") },
+
+    { njs_str("JSON.parse('['.repeat(32))"),
+      njs_str("SyntaxError: Nested too deep at position 31") },
+
+    { njs_str("var o = JSON.parse('{', function(k, v) {return v;});o"),
+      njs_str("SyntaxError: Unexpected end of input at position 1") },
+
+    { njs_str("var o = JSON.parse('{\"a\":1}', "
+                 "                   function(k, v) {return v.a.a;}); o"),
+      njs_str("TypeError: cannot get property \"a\" of undefined") },
+
+    /* JSON.stringify() */
+
+    { njs_str("JSON.stringify()"),
+      njs_str("undefined") },
+
+    { njs_str("JSON.stringify('')"),
+      njs_str("\"\"") },
+
+    { njs_str("JSON.stringify('abc')"),
+      njs_str("\"abc\"") },
+
+    { njs_str("JSON.stringify(new String('abc'))"),
+      njs_str("\"abc\"") },
+
+    { njs_str("JSON.stringify(123)"),
+      njs_str("123") },
+
+    { njs_str("JSON.stringify(-0)"),
+      njs_str("0") },
+
+    { njs_str("JSON.stringify(0.00000123)"),
+      njs_str("0.00000123") },
+
+    { njs_str("JSON.stringify(new Number(123))"),
+      njs_str("123") },
+
+    { njs_str("JSON.stringify(true)"),
+      njs_str("true") },
+
+    { njs_str("JSON.stringify(false)"),
+      njs_str("false") },
+
+    { njs_str("JSON.stringify(new Boolean(1))"),
+      njs_str("true") },
+
+    { njs_str("JSON.stringify(new Boolean(0))"),
+      njs_str("false") },
+
+    { njs_str("JSON.stringify(null)"),
+      njs_str("null") },
+
+    { njs_str("JSON.stringify(undefined)"),
+      njs_str("undefined") },
+
+    { njs_str("JSON.stringify({})"),
+      njs_str("{}") },
+
+    { njs_str("JSON.stringify([])"),
+      njs_str("[]") },
+
+    { njs_str("var a = [1]; a[2] = 'x'; JSON.stringify(a)"),
+      njs_str("[1,null,\"x\"]") },
+
+    { njs_str("JSON.stringify({a:\"b\",c:19,e:null,t:true,f:false})"),
+      njs_str("{\"a\":\"b\",\"c\":19,\"e\":null,\"t\":true,\"f\":false}") },
+
+    { njs_str("JSON.stringify({a:1, b:undefined})"),
+      njs_str("{\"a\":1}") },
+
+    { njs_str("var o = {a:1, c:2};"
+                 "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
+                 "JSON.stringify(o)"),
+      njs_str("{\"a\":1,\"c\":2}") },
+
+    { njs_str("JSON.stringify({a:{}, b:[function(v){}]})"),
+      njs_str("{\"a\":{},\"b\":[null]}") },
+
+    { njs_str("JSON.stringify(RegExp())"),
+      njs_str("{}") },
+
+    { njs_str("JSON.stringify(SyntaxError('e'))"),
+      njs_str("{}") },
+
+    { njs_str("JSON.stringify(URIError('e'))"),
+      njs_str("{}") },
+
+    { njs_str("var e = URIError('e'); e.name = 'E'; JSON.stringify(e)"),
+      njs_str("{\"name\":\"E\"}") },
+
+    { njs_str("var e = URIError('e'); e.message = 'E'; JSON.stringify(e)"),
+      njs_str("{}") },
+
+    { njs_str("var e = URIError('e'); e.foo = 'E'; JSON.stringify(e)"),
+      njs_str("{\"foo\":\"E\"}") },
+
+    { njs_str("JSON.stringify([$r])"),
+      njs_str("[null]") },
+
+    /* Ignoring named properties of an array. */
+
+    { njs_str("var a = [1,2]; a.a = 1;"
+                 "JSON.stringify(a)"),
+      njs_str("[1,2]") },
+
+    { njs_str("JSON.stringify({a:{b:{c:{d:1}, e:function(v){}}}})"),
+      njs_str("{\"a\":{\"b\":{\"c\":{\"d\":1}}}}") },
+
+    { njs_str("JSON.stringify([[\"b\",undefined],1,[5],{a:1}])"),
+      njs_str("[[\"b\",null],1,[5],{\"a\":1}]") },
+
+    { njs_str("var json = '{\"a\":{\"b\":{\"c\":{\"d\":1},\"e\":[true]}}}';"
+                 "json == JSON.stringify(JSON.parse(json))"),
+      njs_str("true") },
+
+    { njs_str("var json = '{\"a\":\"абв\",\"b\":\"α\"}';"
+                 "json == JSON.stringify(JSON.parse(json))"),
+      njs_str("true") },
+
+    /* Multibyte characters: z - 1 byte, α - 2 bytes, 𐐀 - 4 bytes */
+
+    { njs_str("JSON.stringify('α𐐀z'.repeat(10))"),
+      njs_str("\"α𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀z\"") },
+
+    { njs_str("JSON.stringify('α𐐀z'.repeat(10)).length"),
+      njs_str("32") },
+
+    { njs_str("JSON.stringify('α'.repeat(33))[32]"),
+      njs_str("α") },
+
+    { njs_str("JSON.stringify('a\\nbc')"),
+      njs_str("\"a\\nbc\"") },
+
+    { njs_str("JSON.stringify('а\tбв')"),
+      njs_str("\"а\\tбв\"") },
+
+    { njs_str("JSON.stringify('\\n\\t\\r\\\"\\f\\b')"),
+      njs_str("\"\\n\\t\\r\\\"\\f\\b\"") },
+
+    { njs_str("JSON.stringify('\x00\x01\x02\x1f')"),
+      njs_str("\"\\u0000\\u0001\\u0002\\u001F\"") },
+
+    { njs_str("JSON.stringify('abc\x00')"),
+      njs_str("\"abc\\u0000\"") },
+
+    { njs_str("JSON.stringify('\x00zz')"),
+      njs_str("\"\\u0000zz\"") },
+
+    { njs_str("JSON.stringify('\x00')"),
+      njs_str("\"\\u0000\"") },
+
+    { njs_str("JSON.stringify('a\x00z')"),
+      njs_str("\"a\\u0000z\"") },
+
+    { njs_str("JSON.stringify('\x00z\x00')"),
+      njs_str("\"\\u0000z\\u0000\"") },
+
+    { njs_str("var i, s, r = true;"
+                 " for (i = 0; i < 128; i++) {"
+                 "  s = 'α𐐀z'.repeat(i);"
+                 "  r &= (JSON.stringify(s) == ('\"' + s + '\"'));"
+                 "}; r"),
+      njs_str("1") },
+
+    { njs_str("JSON.stringify('\\u0000'.repeat(10)) == ('\"' + '\\\\u0000'.repeat(10) + '\"')"),
+      njs_str("true") },
+
+    { njs_str("JSON.stringify('abc'.repeat(100)).length"),
+      njs_str("302") },
+
+    { njs_str("JSON.stringify('абв'.repeat(100)).length"),
+      njs_str("302") },
+
+    /* Byte strings. */
+
+    { njs_str("JSON.stringify('\\u00CE\\u00B1\\u00C2\\u00B6'.toBytes())"),
+      njs_str("\"α¶\"") },
+
+    { njs_str("JSON.stringify('µ§±®'.toBytes())"),
+      njs_str("\"\xB5\xA7\xB1\xAE\"") },
+
+    /* Optional arguments. */
+
+    { njs_str("JSON.stringify(undefined, undefined, 1)"),
+      njs_str("undefined") },
+
+    { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, 0)"),
+      njs_str("[{\"a\":1,\"b\":{\"c\":2}},1]") },
+
+    { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, 1)"),
+      njs_str("[\n {\n  \"a\": 1,\n  \"b\": {\n   \"c\": 2\n  }\n },\n 1\n]") },
+
+    { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, ' ')"),
+      njs_str("[\n {\n  \"a\": 1,\n  \"b\": {\n   \"c\": 2\n  }\n },\n 1\n]") },
+
+    { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, '#')"),
+      njs_str("[\n#{\n##\"a\": 1,\n##\"b\": {\n###\"c\": 2\n##}\n#},\n#1\n]") },
+
+    { njs_str("JSON.stringify([1], undefined, 'AAAAABBBBBC')"),
+      njs_str("[\nAAAAABBBBB1\n]") },
+
+    { njs_str("JSON.stringify([1], undefined, 11)"),
+      njs_str("[\n          1\n]") },
+
+    { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, -1)"),
+      njs_str("[{\"a\":1,\"b\":{\"c\":2}},1]") },
+
+    { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, new Date())"),
+      njs_str("[{\"a\":1,\"b\":{\"c\":2}},1]") },
+
+    { njs_str("JSON.stringify({toJSON:function(k){}})"),
+      njs_str("undefined") },
+
+    { njs_str("JSON.stringify({toJSON:function(k){return k}})"),
+      njs_str("\"\"") },
+
+    { njs_str("JSON.stringify(new Date(1308895323625))"),
+      njs_str("\"2011-06-24T06:02:03.625Z\"") },
+
+    { njs_str("JSON.stringify({a:new Date(1308895323625)})"),
+      njs_str("{\"a\":\"2011-06-24T06:02:03.625Z\"}") },
+
+    { njs_str("JSON.stringify({b:{toJSON:function(k){return undefined}}})"),
+      njs_str("{}") },
+
+    { njs_str("JSON.stringify({b:{toJSON:function(k){}},c:1})"),
+      njs_str("{\"c\":1}") },
+
+    { njs_str("JSON.stringify({b:{toJSON:function(k){return k}}})"),
+      njs_str("{\"b\":\"b\"}") },
+
+    { njs_str("JSON.stringify({a:1,b:new Date(1308895323625),c:2})"),
+      njs_str("{\"a\":1,\"b\":\"2011-06-24T06:02:03.625Z\",\"c\":2}") },
+
+    { njs_str("JSON.stringify({a:{b:new Date(1308895323625)}})"),
+      njs_str("{\"a\":{\"b\":\"2011-06-24T06:02:03.625Z\"}}") },
+
+    { njs_str("function key(k){return k}; function und(k){}"
+                 "JSON.stringify([{toJSON:key},{toJSON:und},{toJSON:key}])"),
+      njs_str("[\"0\",null,\"2\"]") },
+
+    { njs_str("JSON.stringify({b:{a:1,c:[2]}}, function(k,v){return v})"),
+      njs_str("{\"b\":{\"a\":1,\"c\":[2]}}") },
+
+    { njs_str("JSON.stringify([{a:1}, 2], function(k,v){return v})"),
+      njs_str("[{\"a\":1},2]") },
+
+    { njs_str("JSON.stringify({a:{toJSON:function(k){}}}, function(k,v){return v})"),
+      njs_str("{}") },
+
+    { njs_str("JSON.stringify({a:{toJSON:function(k){return 1}}}, function(k,v){return v})"),
+      njs_str("{\"a\":1}") },
+
+    { njs_str("JSON.stringify([{toJSON:function(k){}}], function(k,v){return v})"),
+      njs_str("[null]") },
+
+    { njs_str("JSON.stringify([{toJSON:function(k){return 1}}], function(k,v){return v})"),
+      njs_str("[1]") },
+
+    { njs_str("JSON.stringify({a:new Date(1308895323625)}, function(k,v){return v})"),
+      njs_str("{\"a\":\"2011-06-24T06:02:03.625Z\"}") },
+
+    { njs_str("JSON.stringify([new Date(1308895323625)], function(k,v){return v})"),
+      njs_str("[\"2011-06-24T06:02:03.625Z\"]") },
+
+    { njs_str("JSON.stringify([new Date(1308895323625)], "
+                 "  function(k,v){return (typeof v === 'string') ? v.toLowerCase() : v})"),
+      njs_str("[\"2011-06-24t06:02:03.625z\"]") },
+
+    { njs_str("JSON.stringify([new Date(1308895323625)], "
+                 "  function(k,v){return (typeof v === 'string') ? v.toLowerCase() : v}, '#')"),
+      njs_str("[\n#\"2011-06-24t06:02:03.625z\"\n]") },
+
+    { njs_str("JSON.stringify({a:new Date(1308895323625),b:1,c:'a'}, "
+                 "  function(k,v){return (typeof v === 'string') ? undefined : v})"),
+      njs_str("{\"b\":1}") },
+
+    { njs_str("JSON.stringify({a:new Date(1308895323625),b:1,c:'a'}, "
+                 "  function(k,v){return (typeof v === 'string') ? undefined : v}, '#')"),
+      njs_str("{\n#\"b\": 1\n}") },
+
+    { njs_str("JSON.stringify([new Date(1308895323625),1,'a'], "
+                 "  function(k,v){return (typeof v === 'string') ? undefined : v})"),
+      njs_str("[null,1,null]") },
+
+    { njs_str("var keys = []; var o = JSON.stringify({a:2, b:{c:1}},"
+                 "   function(k, v) {keys.push(k); return v;});"
+                 "keys"),
+      njs_str(",a,b,c") },
+
+    { njs_str("JSON.stringify(['a', 'b', 'c'], "
+                 "    function(i, v) { if (i === '0') {return undefined} "
+                 "                     else if (i == 1) {return 2} "
+                 "                     else {return v}})"),
+      njs_str("[null,2,\"c\"]") },
+
+    { njs_str("JSON.stringify({a:2, b:{c:1}},"
+                 "               function(k, v) {delete this['b']; return v;})"),
+      njs_str("{\"a\":2}") },
+
+    { njs_str("JSON.stringify(JSON.parse('{\"a\":1,\"b\":2}', "
+                 "          function(k, v) {delete this['b']; return v;}))"),
+      njs_str("{\"a\":1}") },
+
+    { njs_str("var keys = []; var o = JSON.stringify([[1,2],{a:3}, 4],"
+                 "   function(k, v) {keys.push(k); return v;});"
+                 "keys"),
+      njs_str(",0,0,1,1,a,2") },
+
+    { njs_str("JSON.stringify({b:{a:1,c:[2]}}, ['a', undefined, 'b', {}, 'a'])"),
+      njs_str("{\"b\":{\"a\":1}}") },
+
+    { njs_str("JSON.stringify({b:{a:1,c:[2]}}, [new String('a'), new String('b')])"),
+      njs_str("{\"b\":{\"a\":1}}") },
+
+    { njs_str("JSON.stringify({'1':1,'2':2,'3':3}, [1, new Number(2)])"),
+      njs_str("{\"1\":1,\"2\":2}") },
+
+    { njs_str("var objs = []; var o = JSON.stringify({a:1},"
+                 "   function(k, v) {objs.push(this); return v});"
+                 "JSON.stringify(objs)"),
+      njs_str("[{\"\":{\"a\":1}},{\"a\":1}]") },
+
+    { njs_str("var a = []; a[0] = a; JSON.stringify(a)"),
+      njs_str("TypeError: Nested too deep or a cyclic structure") },
+
+    { njs_str("var a = {}; a.a = a; JSON.stringify(a)"),
+      njs_str("TypeError: Nested too deep or a cyclic structure") },
+
+    /* njs.dump(). */
+
+    { njs_str("njs.dump({a:1, b:[1,,2,{c:new Boolean(1)}]})"),
+      njs_str("{a:1,b:[1,<empty>,2,{c:[Boolean: true]}]}") },
+
+    { njs_str("njs.dump(Array.prototype.slice.call({'1':'b', length:2}))"),
+      njs_str("[<empty>,'b']") },
+
+    { njs_str("njs.dump($r.props)"),
+      njs_str("{a:{type:\"property\",props:[\"getter\"]},b:{type:\"property\",props:[\"getter\"]}}") },
+
+    { njs_str("njs.dump($r.header)"),
+      njs_str("{type:\"object\",props:[\"getter\",\"foreach\",\"next\"]}") },
+
+    { njs_str("njs.dump(njs) == `{version:'${njs.version}'}`"),
+      njs_str("true") },
+
+    { njs_str("njs.dump(-0)"),
+      njs_str("-0") },
+
+    { njs_str("njs.dump(Object(-0))"),
+      njs_str("[Number: -0]") },
+
+    { njs_str("njs.dump([0, -0])"),
+      njs_str("[0,-0]") },
+
+    /* Built-in methods name. */
+
+    { njs_str(
+        "var fail;"
+        "function isMethodsHaveName(o) {"
+        "    var except = ["
+        "        'prototype',"
+        "        'constructor',"
+        "    ];"
+        "    return Object.getOwnPropertyNames(o)"
+        "                 .filter(v => !except.includes(v)"
+        "                              && typeof o[v] == 'function')"
+        "                 .every(v => o[v].name == v"
+        "                             || !(fail = `${o.name}.${v}: ${o[v].name}`));"
+        "}"
+        "["
+        "    Boolean, Boolean.prototype,"
+        "    Number, Number.prototype,"
+        "    String, String.prototype,"
+        "    Object, Object.prototype,"
+        "    Array, Array.prototype,"
+        "    Function, Function.prototype,"
+        "    RegExp, RegExp.prototype,"
+        "    Date, Date.prototype,"
+        "    Error, Error.prototype,"
+        "    Math,"
+        "    JSON,"
+        "].every(obj => isMethodsHaveName(obj)) || fail"),
+
+      njs_str("true") },
+
+    /* require(). */
+
+    { njs_str("require('unknown_module')"),
+      njs_str("Error: Cannot find module \"unknown_module\"") },
+
+    { njs_str("require()"),
+      njs_str("TypeError: missing path") },
+
+    { njs_str("var fs = require('fs'); typeof fs"),
+      njs_str("object") },
+
+    /* require('fs').readFile() */
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFile()"),
+      njs_str("TypeError: too few arguments") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFile('/njs_unknown_path')"),
+      njs_str("TypeError: too few arguments") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFile('/njs_unknown_path', {flag:'xx'})"),
+      njs_str("TypeError: callback must be a function") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFile('/njs_unknown_path', {flag:'xx'}, 1)"),
+      njs_str("TypeError: callback must be a function") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFile('/njs_unknown_path', {flag:'xx'}, function () {})"),
+      njs_str("TypeError: Unknown file open flags: \"xx\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFile('/njs_unknown_path', {encoding:'ascii'}, function () {})"),
+      njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFile('/njs_unknown_path', 'ascii', function () {})"),
+      njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+    /* require('fs').readFileSync() */
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFileSync()"),
+      njs_str("TypeError: too few arguments") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFileSync({})"),
+      njs_str("TypeError: path must be a string") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFileSync('/njs_unknown_path', {flag:'xx'})"),
+      njs_str("TypeError: Unknown file open flags: \"xx\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFileSync('/njs_unknown_path', {encoding:'ascii'})"),
+      njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFileSync('/njs_unknown_path', 'ascii')"),
+      njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.readFileSync('/njs_unknown_path', true)"),
+      njs_str("TypeError: Unknown options type (a string or object required)") },
+
+
+    /* require('fs').writeFile() */
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFile()"),
+      njs_str("TypeError: too few arguments") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFile('/njs_unknown_path')"),
+      njs_str("TypeError: too few arguments") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFile('/njs_unknown_path', '')"),
+      njs_str("TypeError: too few arguments") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFile({}, '', function () {})"),
+      njs_str("TypeError: path must be a string") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFile('/njs_unknown_path', '', 'utf8')"),
+      njs_str("TypeError: callback must be a function") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFile('/njs_unknown_path', '', {flag:'xx'}, function () {})"),
+      njs_str("TypeError: Unknown file open flags: \"xx\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFile('/njs_unknown_path', '', {encoding:'ascii'}, function () {})"),
+      njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFile('/njs_unknown_path', '', 'ascii', function () {})"),
+      njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFile('/njs_unknown_path', '', true, function () {})"),
+      njs_str("TypeError: Unknown options type (a string or object required)") },
+
+    /* require('fs').writeFileSync() */
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFileSync()"),
+      njs_str("TypeError: too few arguments") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFileSync('/njs_unknown_path')"),
+      njs_str("TypeError: too few arguments") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFileSync({}, '')"),
+      njs_str("TypeError: path must be a string") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFileSync('/njs_unknown_path', '', {flag:'xx'})"),
+      njs_str("TypeError: Unknown file open flags: \"xx\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFileSync('/njs_unknown_path', '', {encoding:'ascii'})"),
+      njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFileSync('/njs_unknown_path', '', 'ascii')"),
+      njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+    { njs_str("var fs = require('fs');"
+                 "fs.writeFileSync('/njs_unknown_path', '', true)"),
+      njs_str("TypeError: Unknown options type (a string or object required)") },
+
+    /* require('crypto').createHash() */
+
+    { njs_str("require('crypto').createHash('sha1')"),
+      njs_str("[object Hash]") },
+
+    { njs_str("Object.prototype.toString.call(require('crypto').createHash('sha1'))"),
+      njs_str("[object Object]") },
+
+    { njs_str("var h = require('crypto').createHash('md5');"
+                 "h.update('AB').digest('hex')"),
+      njs_str("b86fc6b051f63d73de262d4c34e3a0a9") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update('A').update('B').digest('hex')"),
+      njs_str("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update('AB').digest('hex')"),
+      njs_str("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update('AB').digest().toString('hex')"),
+      njs_str("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update('AB').digest('base64')"),
+      njs_str("BtlFlCqiamG+GMPiK/GbvKjdK10=") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update('AB').digest('base64url')"),
+      njs_str("BtlFlCqiamG-GMPiK_GbvKjdK10") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update('AB').digest().toString('base64')"),
+      njs_str("BtlFlCqiamG+GMPiK/GbvKjdK10=") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update('abc'.repeat(100)).digest('hex')"),
+      njs_str("c95466320eaae6d19ee314ae4f135b12d45ced9a") },
+
+    { njs_str("var h = require('crypto').createHash('sha256');"
+                 "h.update('A').update('B').digest('hex')"),
+      njs_str("38164fbd17603d73f696b8b4d72664d735bb6a7c88577687fd2ae33fd6964153") },
+
+    { njs_str("var h = require('crypto').createHash('sha256');"
+                 "h.update('AB').digest('hex')"),
+      njs_str("38164fbd17603d73f696b8b4d72664d735bb6a7c88577687fd2ae33fd6964153") },
+
+    { njs_str("var h = require('crypto').createHash('sha256');"
+                 "h.update('abc'.repeat(100)).digest('hex')"),
+      njs_str("d9f5aeb06abebb3be3f38adec9a2e3b94228d52193be923eb4e24c9b56ee0930") },
+
+    { njs_str("var h = require('crypto').createHash()"),
+      njs_str("TypeError: algorithm must be a string") },
+
+    { njs_str("var h = require('crypto').createHash([])"),
+      njs_str("TypeError: algorithm must be a string") },
+
+    { njs_str("var h = require('crypto').createHash('sha512')"),
+      njs_str("TypeError: not supported algorithm: \"sha512\"") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update()"),
+      njs_str("TypeError: data must be a string") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update({})"),
+      njs_str("TypeError: data must be a string") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update('A').digest('latin1')"),
+      njs_str("TypeError: Unknown digest encoding: \"latin1\"") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update('A').digest('hex'); h.digest('hex')"),
+      njs_str("Error: Digest already called") },
+
+    { njs_str("var h = require('crypto').createHash('sha1');"
+                 "h.update('A').digest('hex'); h.update('B')"),
+      njs_str("Error: Digest already called") },
+
+    { njs_str("typeof require('crypto').createHash('md5')"),
+      njs_str("object") },
+
+    /* require('crypto').createHmac() */
+
+    { njs_str("require('crypto').createHmac('sha1', '')"),
+      njs_str("[object Hmac]") },
+
+    { njs_str("var h = require('crypto').createHmac('md5', '');"
+                 "h.digest('hex')"),
+      njs_str("74e6f7298a9c2d168935f58c001bad88") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', '');"
+                 "h.digest('hex')"),
+      njs_str("fbdb1d1b18aa6c08324b7d64b71fb76370690e1d") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', '');"
+                 "h.digest().toString('hex')"),
+      njs_str("fbdb1d1b18aa6c08324b7d64b71fb76370690e1d") },
+
+    { njs_str("var h = require('crypto').createHmac('md5', 'secret key');"
+                 "h.update('AB').digest('hex')"),
+      njs_str("9c72728915eb26620a5caeafd0063b29") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('A').update('B').digest('hex')"),
+      njs_str("adc60e03459c4bae7cf4eb6d9730003e9490b22f") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('AB').digest('hex')"),
+      njs_str("adc60e03459c4bae7cf4eb6d9730003e9490b22f") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('AB').digest('base64')"),
+      njs_str("rcYOA0WcS6589OttlzAAPpSQsi8=") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('AB').digest('base64url')"),
+      njs_str("rcYOA0WcS6589OttlzAAPpSQsi8") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('AB').digest().toString('base64')"),
+      njs_str("rcYOA0WcS6589OttlzAAPpSQsi8=") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('abc'.repeat(100)).digest('hex')"),
+      njs_str("b105ad6921e4c54d3fa0a9ec3f7f0ee9bd2c659d") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'A'.repeat(40));"
+                 "h.update('AB').digest('hex')"),
+      njs_str("0b84f78ca5275d76d4b7dafb5845ee2b6a79c4c2") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'A'.repeat(64));"
+                 "h.update('AB').digest('hex')"),
+      njs_str("400ce530816c6b3247e2959f3982a12aaf58c0c9") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'A'.repeat(100));"
+                 "h.update('AB').digest('hex')"),
+      njs_str("670e7cdebae6392797e000e79e51d3b6589d8fad") },
+
+    { njs_str("var h = require('crypto').createHmac('sha256', '');"
+                 "h.digest('hex')"),
+      njs_str("b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad") },
+
+    { njs_str("var h = require('crypto').createHmac('sha256', 'secret key');"
+                 "h.update('A').update('B').digest('hex')"),
+      njs_str("46085184b3b45a13d838bf71a0ce03675dab30931e0f1f68fa636ea65fdb286d") },
+
+    { njs_str("var h = require('crypto').createHmac('sha256', 'secret key');"
+                 "h.update('AB').digest('hex')"),
+      njs_str("46085184b3b45a13d838bf71a0ce03675dab30931e0f1f68fa636ea65fdb286d") },
+
+    { njs_str("var h = require('crypto').createHmac('sha256', 'A'.repeat(64));"
+                 "h.update('AB').digest('hex')"),
+      njs_str("ee9dce43b12eb3e865614ad9c1a8d4fad4b6eac2b64647bd24cd192888d3f367") },
+
+    { njs_str("var h = require('crypto').createHmac('sha256', 'A'.repeat(100));"
+                 "h.update('AB').digest('hex')"),
+      njs_str("5647b6c429701ff512f0f18232b4507065d2376ca8899a816a0a6e721bf8ddcc") },
+
+    { njs_str("var h = require('crypto').createHmac('md5', 'secret key');"
+                 "h.update('abc'.repeat(100)).digest('hex')"),
+      njs_str("5dd706af43536f8c9c83e7ea55b1a5a2") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('abc'.repeat(100)).digest('hex')"),
+      njs_str("b105ad6921e4c54d3fa0a9ec3f7f0ee9bd2c659d") },
+
+    { njs_str("var h = require('crypto').createHmac('sha256', 'secret key');"
+                 "h.update('abc'.repeat(100)).digest('hex')"),
+      njs_str("f6550d398ce350ee8d94a0f44f2cf6b9bc8d316ae4625fb4434f22980a276bac") },
+
+    { njs_str("var h = require('crypto').createHmac()"),
+      njs_str("TypeError: algorithm must be a string") },
+
+    { njs_str("var h = require('crypto').createHmac([])"),
+      njs_str("TypeError: algorithm must be a string") },
+
+    { njs_str("var h = require('crypto').createHmac('sha512', '')"),
+      njs_str("TypeError: not supported algorithm: \"sha512\"") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', [])"),
+      njs_str("TypeError: key must be a string") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('A').digest('hex'); h.digest('hex')"),
+      njs_str("Error: Digest already called") },
+
+    { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+                 "h.update('A').digest('hex'); h.update('B')"),
+      njs_str("Error: Digest already called") },
+
+    { njs_str("typeof require('crypto').createHmac('md5', 'a')"),
+      njs_str("object") },
+
+    /* setTimeout(). */
+
+    { njs_str("setTimeout()"),
+      njs_str("TypeError: too few arguments") },
+
+    { njs_str("setTimeout(function(){})"),
+      njs_str("InternalError: not supported by host environment") },
+
+    { njs_str("setTimeout(function(){}, 12)"),
+      njs_str("InternalError: not supported by host environment") },
+
+    /* clearTimeout(). */
+
+    { njs_str("clearTimeout()"),
+      njs_str("undefined") },
+
+    { njs_str("clearTimeout(123)"),
+      njs_str("undefined") },
+
+    /* Trick: number to boolean. */
+
+    { njs_str("var a = 0; !!a"),
+      njs_str("false") },
+
+    { njs_str("var a = 5; !!a"),
+      njs_str("true") },
+
+    /* Trick: flooring. */
+
+    { njs_str("var n = -10.12345; ~~n"),
+      njs_str("-10") },
+
+    { njs_str("var n = 10.12345; ~~n"),
+      njs_str("10") },
+
+    /* es5id: 8.2_A1_T1 */
+    /* es5id: 8.2_A1_T2 */
+
+    { njs_str("var x = null;"),
+      njs_str("undefined") },
+
+    /* es5id: 8.2_A2 */
+
+    { njs_str("var null;"),
+      njs_str("SyntaxError: Unexpected token \"null\" in 1") },
+
+    /* es5id: 8.2_A3 */
+
+    { njs_str("typeof(null) === \"object\""),
+      njs_str("true") },
+
+    /* Module. */
+
+    { njs_str("import;"),
+      njs_str("SyntaxError: Non-default import is not supported in 1") },
+
+    { njs_str("import {x} from y"),
+      njs_str("SyntaxError: Non-default import is not supported in 1") },
+
+    { njs_str("import x from y"),
+      njs_str("SyntaxError: Unexpected token \"y\" in 1") },
+
+    { njs_str("import x from {"),
+      njs_str("SyntaxError: Unexpected token \"{\" in 1") },
+
+    { njs_str("import x from ''"),
+      njs_str("SyntaxError: Cannot find module \"\" in 1") },
+
+    { njs_str("import x from 'crypto'"),
+      njs_str("undefined") },
+
+    { njs_str("import x from 'crypto' 1"),
+      njs_str("SyntaxError: Unexpected token \"1\" in 1") },
+
+    { njs_str("if (1) {import x from 'crypto'}"),
+      njs_str("SyntaxError: Illegal import statement in 1") },
+
+    { njs_str("export"),
+      njs_str("SyntaxError: Illegal export statement in 1") },
+
+};
+
+
+static njs_unit_test_t  njs_module_test[] =
+{
+    { njs_str("function f(){return 2}; var f; f()"),
+      njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+    { njs_str("function f(){return 2}; var f = 1; f()"),
+      njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+    { njs_str("function f(){return 1}; function f(){return 2}; f()"),
+      njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+    { njs_str("var f = 1; function f() {};"),
+      njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+    { njs_str("{ var f = 1; } function f() {};"),
+      njs_str("SyntaxError: \"f\" has already been declared in 1") },
+};
+
+
+static njs_unit_test_t  njs_tz_test[] =
+{
+     { njs_str("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
+       njs_str("Thu Jan 01 1970 12:45:00 GMT+1245") },
+
+     { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getTime()"),
+       njs_str("1308895200000") },
+
+     { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.valueOf()"),
+       njs_str("1308895200000") },
+
+     { njs_str("var d = new Date(2011, 5, 24, 18, 45);"
+                  "d.toString().slice(0, 33)"),
+       njs_str("Fri Jun 24 2011 18:45:00 GMT+1245") },
+
+     { njs_str("var d = new Date(2011, 5, 24, 18, 45);"
+                  "d.toTimeString().slice(0, 17)"),
+       njs_str("18:45:00 GMT+1245") },
+
+     { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.toUTCString()"),
+       njs_str("Fri Jun 24 2011 06:00:00 GMT") },
+
+     { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+                  "d.toISOString()"),
+       njs_str("2011-06-24T06:00:12.625Z") },
+
+     { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCHours()"),
+       njs_str("6") },
+
+     { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMinutes()"),
+       njs_str("0") },
+
+     { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+                  "d.getTimezoneOffset()"),
+       njs_str("-765") },
+
+     { njs_str("var d = new Date(1308895323625); d.setMinutes(3, 2, 5003);"
+                  "d.getTime()"),
+       njs_str("1308892687003") },
+
+     { njs_str("var d = new Date(1308895323625); d.setMinutes(3, 2);"
+                  "d.getTime()"),
+       njs_str("1308892682625") },
+
+     { njs_str("var d = new Date(1308895323625); d.setMinutes(3);"
+                  "d.getTime()"),
+       njs_str("1308892683625") },
+
+     { njs_str("var d = new Date(1308895323625); d.setHours(20, 3, 2, 5003);"
+                  "d.getTime()"),
+       njs_str("1308899887003") },
+
+     { njs_str("var d = new Date(1308895323625); d.setHours(20, 3, 2);"
+                  "d.getTime()"),
+       njs_str("1308899882625") },
+
+     { njs_str("var d = new Date(1308895323625); d.setHours(20, 3);"
+                  "d.getTime()"),
+       njs_str("1308899883625") },
+
+     { njs_str("var d = new Date(1308895323625); d.setHours(20);"
+                  "d.getTime()"),
+       njs_str("1308902523625") },
+
+     { njs_str("var d = new Date(1308895323625); d.setMonth(2, 10);"
+                  "d.getTime()"),
+       njs_str("1299733323625") },
+
+     { njs_str("var d = new Date(1308895323625); d.setMonth(2);"
+                  "d.getTime()"),
+       njs_str("1300942923625") },
+
+     { njs_str("var d = new Date(1308895323625); d.setFullYear(2010, 2, 10);"
+                  "d.getTime()"),
+       njs_str("1268197323625") },
+
+     { njs_str("var d = new Date(1308895323625); d.setFullYear(2010, 2);"
+                  "d.getTime()"),
+       njs_str("1269406923625") },
+
+     { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+                  "d.toJSON(1)"),
+       njs_str("2011-06-24T06:00:12.625Z") },
+};
+
+
+static njs_unit_test_t  njs_regexp_test[] =
+{
+    { njs_str("/[\\\\u02E0-\\\\u02E4]/"),
+      njs_str("/[\\\\u02E0-\\\\u02E4]/") },
+
+    { njs_str("/[\\u02E0-\\u02E4]/"),
+      njs_str("/[\\u02E0-\\u02E4]/") },
+
+    { njs_str("RegExp('[\\\\u02E0-\\\\u02E4]')"),
+      njs_str("/[\\u02E0-\\u02E4]/") },
+
+    { njs_str("/[\\u0430-\\u044f]+/.test('тест')"),
+      njs_str("true") },
+
+    { njs_str("RegExp('[\\\\u0430-\\\\u044f]+').test('тест')"),
+      njs_str("true") },
+
+    { njs_str("RegExp('[\\\\u0430-\\\\u044f]+').exec('тест')[0]"),
+      njs_str("тест") },
+
+    { njs_str("/[\\uFDE0-\\uFFFD]/g; export default 1"),
+      njs_str("SyntaxError: Illegal export statement in 1") },
+
+    { njs_str("RegExp(RegExp('\x00]]')).test('\x00]]')"),
+      njs_str("true") },
+
+    { njs_str("RegExp('\0').test('\0')"),
+      njs_str("true") },
+
+    { njs_str("RegExp('\x00').test('\0')"),
+      njs_str("true") },
+
+    { njs_str("RegExp('\x00\\\\x00').source"),
+      njs_str("\\u0000\\x00") },
+
+    { njs_str("/\\\0/"),
+      njs_str("/\\\\u0000/") },
+
+    { njs_str("RegExp('\\\\\\0').source"),
+      njs_str("\\\\u0000") },
+
+    { njs_str("RegExp('[\0]').test('\0')"),
+      njs_str("true") },
+};
+
+
+typedef struct {
+    njs_lvlhsh_t          hash;
+    const njs_extern_t    *proto;
+    njs_mp_t              *pool;
+
+    uint32_t              a;
+    njs_str_t             uri;
+
+    njs_opaque_value_t    value;
+} njs_unit_test_req_t;
+
+
+typedef struct {
+    njs_value_t           name;
+    njs_value_t           value;
+} njs_unit_test_prop_t;
+
+
+static njs_int_t
+lvlhsh_unit_test_key_test(njs_lvlhsh_query_t *lhq, void *data)
+{
+    njs_str_t             name;
+    njs_unit_test_prop_t  *prop;
+
+    prop = data;
+    njs_string_get(&prop->name, &name);
+
+    if (name.length != lhq->key.length) {
+        return NJS_DECLINED;
+    }
+
+    if (memcmp(name.start, lhq->key.start, lhq->key.length) == 0) {
+        return NJS_OK;
+    }
+
+    return NJS_DECLINED;
+}
+
+
+static void *
+lvlhsh_unit_test_pool_alloc(void *pool, size_t size)
+{
+    return njs_mp_align(pool, size, size);
+}
+
+
+static void
+lvlhsh_unit_test_pool_free(void *pool, void *p, size_t size)
+{
+    njs_mp_free(pool, p);
+}
+
+
+static const njs_lvlhsh_proto_t  lvlhsh_proto  njs_aligned(64) = {
+    NJS_LVLHSH_LARGE_SLAB,
+    lvlhsh_unit_test_key_test,
+    lvlhsh_unit_test_pool_alloc,
+    lvlhsh_unit_test_pool_free,
+};
+
+
+static njs_unit_test_prop_t *
+lvlhsh_unit_test_alloc(njs_mp_t *pool, const njs_value_t *name,
+    const njs_value_t *value)
+{
+    njs_unit_test_prop_t *prop;
+
+    prop = njs_mp_alloc(pool, sizeof(njs_unit_test_prop_t));
+    if (prop == NULL) {
+        return NULL;
+    }
+
+    prop->name = *name;
+    prop->value = *value;
+
+    return prop;
+}
+
+
+static njs_int_t
+lvlhsh_unit_test_add(njs_unit_test_req_t *r, njs_unit_test_prop_t *prop)
+{
+    njs_lvlhsh_query_t  lhq;
+
+    njs_string_get(&prop->name, &lhq.key);
+    lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
+
+    lhq.replace = 1;
+    lhq.value = (void *) prop;
+    lhq.proto = &lvlhsh_proto;
+    lhq.pool = r->pool;
+
+    switch (njs_lvlhsh_insert(&r->hash, &lhq)) {
+
+    case NJS_OK:
+        return NJS_OK;
+
+    case NJS_DECLINED:
+    default:
+        return NJS_ERROR;
+    }
+}
+
+
+static njs_ret_t
+njs_unit_test_r_get_uri_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+    uintptr_t data)
+{
+    char *p = obj;
+
+    njs_str_t  *field;
+
+    field = (njs_str_t *) (p + data);
+
+    return njs_vm_value_string_set(vm, value, field->start, field->length);
+}
+
+
+static njs_ret_t
+njs_unit_test_r_set_uri_external(njs_vm_t *vm, void *obj, uintptr_t data,
+    njs_str_t *value)
+{
+    char *p = obj;
+
+    njs_str_t  *field;
+
+    field = (njs_str_t *) (p + data);
+
+    *field = *value;
+
+    return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_r_get_a_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+    uintptr_t data)
+{
+    u_char               buf[16], *p;
+    njs_unit_test_req_t  *r;
+
+    r = (njs_unit_test_req_t *) obj;
+
+    p = njs_sprintf(buf, buf + njs_length(buf), "%uD", r->a);
+
+    return njs_vm_value_string_set(vm, value, buf, p - buf);
+}
+
+
+static njs_ret_t
+njs_unit_test_r_get_b_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+    uintptr_t data)
+{
+    njs_value_number_set(value, data);
+
+    return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_host_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+    uintptr_t data)
+{
+    return njs_vm_value_string_set(vm, value, (u_char *) "АБВГДЕЁЖЗИЙ", 22);
+}
+
+
+static njs_ret_t
+njs_unit_test_r_get_vars(njs_vm_t *vm, njs_value_t *value, void *obj,
+    uintptr_t data)
+{
+    njs_int_t             ret;
+    njs_str_t             *key;
+    njs_lvlhsh_query_t    lhq;
+    njs_unit_test_req_t   *r;
+    njs_unit_test_prop_t  *prop;
+
+    r = (njs_unit_test_req_t *) obj;
+    key = (njs_str_t *) data;
+
+    lhq.key = *key;
+    lhq.key_hash = njs_djb_hash(key->start, key->length);
+    lhq.proto = &lvlhsh_proto;
+
+    ret = njs_lvlhsh_find(&r->hash, &lhq);
+
+    prop = lhq.value;
+
+    if (ret == NJS_OK && njs_is_valid(&prop->value)) {
+        *value = prop->value;
+        return NJS_OK;
+    }
+
+    njs_value_undefined_set(value);
+
+    return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_r_set_vars(njs_vm_t *vm, void *obj, uintptr_t data,
+    njs_str_t *value)
+{
+    njs_int_t             ret;
+    njs_str_t             *key;
+    njs_value_t           name, val;
+    njs_unit_test_req_t   *r;
+    njs_unit_test_prop_t  *prop;
+
+    r = (njs_unit_test_req_t *) obj;
+    key = (njs_str_t *) data;
+
+    if (key->length == 5 && memcmp(key->start, "error", 5) == 0) {
+        njs_vm_error(vm, "cannot set \"error\" prop");
+        return NJS_ERROR;
+    }
+
+    njs_vm_value_string_set(vm, &name, key->start, key->length);
+    njs_vm_value_string_set(vm, &val, value->start, value->length);
+
+    prop = lvlhsh_unit_test_alloc(vm->mem_pool, &name, &val);
+    if (prop == NULL) {
+        njs_memory_error(vm);
+        return NJS_ERROR;
+    }
+
+    ret = lvlhsh_unit_test_add(r, prop);
+    if (ret != NJS_OK) {
+        njs_vm_error(vm, "lvlhsh_unit_test_add() failed");
+        return NJS_ERROR;
+    }
+
+    return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_r_del_vars(njs_vm_t *vm, void *obj, uintptr_t data,
+    njs_bool_t delete)
+{
+    njs_int_t             ret;
+    njs_str_t             *key;
+    njs_lvlhsh_query_t    lhq;
+    njs_unit_test_req_t   *r;
+    njs_unit_test_prop_t  *prop;
+
+    r = (njs_unit_test_req_t *) obj;
+    key = (njs_str_t *) data;
+
+    if (key->length == 5 && memcmp(key->start, "error", 5) == 0) {
+        njs_vm_error(vm, "cannot delete \"error\" prop");
+        return NJS_ERROR;
+    }
+
+    lhq.key = *key;
+    lhq.key_hash = njs_djb_hash(key->start, key->length);
+    lhq.proto = &lvlhsh_proto;
+
+    ret = njs_lvlhsh_find(&r->hash, &lhq);
+
+    prop = lhq.value;
+
+    if (ret == NJS_OK) {
+        njs_set_invalid(&prop->value);
+    }
+
+    return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_header_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+    uintptr_t data)
+{
+    u_char     *p;
+    uint32_t   size;
+    njs_str_t  *h;
+
+    h = (njs_str_t *) data;
+
+    size = 7 + h->length;
+
+    p = njs_vm_value_string_alloc(vm, value, size);
+    if (p == NULL) {
+        return NJS_ERROR;
+    }
+
+    p = njs_cpymem(p, h->start, h->length);
+    *p++ = '|';
+    memcpy(p, "АБВ", 6);
+
+    return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_header_foreach_external(njs_vm_t *vm, void *obj, void *next)
+{
+    u_char  *s;
+
+    s = next;
+    s[0] = '0';
+    s[1] = '0';
+
+    return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_header_next_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+    void *next)
+{
+    u_char  *s;
+
+    s = next;
+    s[1]++;
+
+    if (s[1] == '4') {
+        return NJS_DONE;
+    }
+
+    return njs_vm_value_string_set(vm, value, s, 2);
+}
+
+
+static njs_ret_t
+njs_unit_test_method_external(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+    njs_index_t unused)
+{
+    njs_int_t            ret;
+    njs_str_t            s;
+    njs_unit_test_req_t  *r;
+
+    r = njs_vm_external(vm, njs_arg(args, nargs, 0));
+    if (njs_slow_path(r == NULL)) {
+        return NJS_ERROR;
+    }
+
+    ret = njs_vm_value_to_string(vm, &s, njs_arg(args, nargs, 1));
+    if (ret == NJS_OK && s.length == 3 && memcmp(s.start, "YES", 3) == 0) {
+        return njs_vm_value_string_set(vm, njs_vm_retval(vm), r->uri.start,
+                                       r->uri.length);
+    }
+
+    vm->retval = njs_value_undefined;
+
+    return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_create_external(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+    njs_index_t unused)
+{
+    njs_int_t            ret;
+    njs_str_t            uri;
+    njs_value_t          *value;
+    njs_unit_test_req_t  *r, *sr;
+
+    r = njs_vm_external(vm, njs_arg(args, nargs, 0));
+    if (njs_slow_path(r == NULL)) {
+        return NJS_ERROR;
+    }
+
+    if (njs_vm_value_to_string(vm, &uri, njs_arg(args, nargs, 1)) != NJS_OK) {
+        return NJS_ERROR;
+    }
+
+    value = njs_mp_zalloc(r->pool, sizeof(njs_opaque_value_t));
+    if (value == NULL) {
+        goto memory_error;
+    }
+
+    sr = njs_mp_zalloc(r->pool, sizeof(njs_unit_test_req_t));
+    if (sr == NULL) {
+        goto memory_error;
+    }
+
+    sr->uri = uri;
+    sr->pool = r->pool;
+    sr->proto = r->proto;
+
+    ret = njs_vm_external_create(vm, value, sr->proto, sr);
+    if (ret != NJS_OK) {
+        return NJS_ERROR;
+    }
+
+    njs_vm_retval_set(vm, value);
+
+    return NJS_OK;
+
+memory_error:
+
+    njs_memory_error(vm);
+
+    return NJS_ERROR;
+}
+
+
+static njs_external_t  njs_unit_test_r_props[] = {
+
+    { njs_str("a"),
+      NJS_EXTERN_PROPERTY,
+      NULL,
+      0,
+      njs_unit_test_r_get_a_external,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      0 },
+
+    { njs_str("b"),
+      NJS_EXTERN_PROPERTY,
+      NULL,
+      0,
+      njs_unit_test_r_get_b_external,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      42 },
+};
+
+
+static njs_external_t  njs_unit_test_r_external[] = {
+
+    { njs_str("uri"),
+      NJS_EXTERN_PROPERTY,
+      NULL,
+      0,
+      njs_unit_test_r_get_uri_external,
+      njs_unit_test_r_set_uri_external,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      offsetof(njs_unit_test_req_t, uri) },
+
+    { njs_str("host"),
+      NJS_EXTERN_PROPERTY,
+      NULL,
+      0,
+      njs_unit_test_host_external,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      0 },
+
+    { njs_str("props"),
+      NJS_EXTERN_OBJECT,
+      njs_unit_test_r_props,
+      njs_nitems(njs_unit_test_r_props),
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      0 },
+
+    { njs_str("vars"),
+      NJS_EXTERN_OBJECT,
+      NULL,
+      0,
+      njs_unit_test_r_get_vars,
+      njs_unit_test_r_set_vars,
+      njs_unit_test_r_del_vars,
+      NULL,
+      NULL,
+      NULL,
+      0 },
+
+    { njs_str("consts"),
+      NJS_EXTERN_OBJECT,
+      NULL,
+      0,
+      njs_unit_test_r_get_vars,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      0 },
+
+    { njs_str("header"),
+      NJS_EXTERN_OBJECT,
+      NULL,
+      0,
+      njs_unit_test_header_external,
+      NULL,
+      NULL,
+      njs_unit_test_header_foreach_external,
+      njs_unit_test_header_next_external,
+      NULL,
+      0 },
+
+    { njs_str("some_method"),
+      NJS_EXTERN_METHOD,
+      NULL,
+      0,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      njs_unit_test_method_external,
+      0 },
+
+    { njs_str("create"),
+      NJS_EXTERN_METHOD,
+      NULL,
+      0,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      njs_unit_test_create_external,
+      0 },
+
+};
+
+
+static njs_external_t  njs_test_external[] = {
+
+    { njs_str("request.proto"),
+      NJS_EXTERN_OBJECT,
+      njs_unit_test_r_external,
+      njs_nitems(njs_unit_test_r_external),
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      0 },
+
+};
+
+
+typedef struct {
+    njs_str_t            name;
+    njs_unit_test_req_t  request;
+    njs_unit_test_prop_t props[2];
+} njs_unit_test_req_t_init_t;
+
+
+static const njs_unit_test_req_t_init_t njs_test_requests[] = {
+
+    { njs_str("$r"),
+     {
+         .uri = njs_str("АБВ"),
+         .a = 1
+     },
+     {
+         { njs_string("p"), njs_string("pval") },
+         { njs_string("p2"), njs_string("p2val") },
+     }
+    },
+
+    { njs_str("$r2"),
+     {
+         .uri = njs_str("αβγ"),
+         .a = 2
+     },
+     {
+         { njs_string("q"), njs_string("qval") },
+         { njs_string("q2"), njs_string("q2val") },
+     }
+    },
+
+    { njs_str("$r3"),
+     {
+         .uri = njs_str("abc"),
+         .a = 3
+     },
+     {
+         { njs_string("k"), njs_string("kval") },
+         { njs_string("k2"), njs_string("k2val") },
+     }
+    },
+};
+
+
+static njs_int_t
+njs_externals_init(njs_vm_t *vm)
+{
+    njs_int_t             ret;
+    njs_uint_t            i, j;
+    const njs_extern_t    *proto;
+    njs_unit_test_req_t   *requests;
+    njs_unit_test_prop_t  *prop;
+
+    proto = njs_vm_external_prototype(vm, &njs_test_external[0]);
+    if (proto == NULL) {
+        njs_printf("njs_vm_external_prototype() failed\n");
+        return NJS_ERROR;
+    }
+
+    requests = njs_mp_zalloc(vm->mem_pool,
+                             njs_nitems(njs_test_requests)
+                             * sizeof(njs_unit_test_req_t));
+    if (requests == NULL) {
+        return NJS_ERROR;
+    }
+
+    for (i = 0; i < njs_nitems(njs_test_requests); i++) {
+
+        requests[i] = njs_test_requests[i].request;
+        requests[i].pool = vm->mem_pool;
+        requests[i].proto = proto;
+
+        ret = njs_vm_external_create(vm, njs_value_arg(&requests[i].value),
+                                     proto, &requests[i]);
+        if (ret != NJS_OK) {
+            njs_printf("njs_vm_external_create() failed\n");
+            return NJS_ERROR;
+        }
+
+        ret = njs_vm_external_bind(vm, &njs_test_requests[i].name,
+                                   njs_value_arg(&requests[i].value));
+        if (ret != NJS_OK) {
+            njs_printf("njs_vm_external_bind() failed\n");
+            return NJS_ERROR;
+        }
+
+        for (j = 0; j < njs_nitems(njs_test_requests[i].props); j++) {
+            prop = lvlhsh_unit_test_alloc(vm->mem_pool,
+                                          &njs_test_requests[i].props[j].name,
+                                          &njs_test_requests[i].props[j].value);
+
+            if (prop == NULL) {
+                njs_printf("lvlhsh_unit_test_alloc() failed\n");
+                return NJS_ERROR;
+            }
+
+            ret = lvlhsh_unit_test_add(&requests[i], prop);
+            if (ret != NJS_OK) {
+                njs_printf("lvlhsh_unit_test_add() failed\n");
+                return NJS_ERROR;
+            }
+        }
+    }
+
+    return NJS_OK;
+}
+
+
+typedef struct {
+    njs_bool_t  disassemble;
+    njs_bool_t  verbose;
+    njs_bool_t  module;
+} njs_opts_t;
+
+
+typedef struct {
+    njs_uint_t  passed;
+    njs_uint_t  failed;
+} njs_stat_t;
+
+
+static void
+njs_unit_test_report(const char *msg, njs_stat_t *prev, njs_stat_t *current)
+{
+    njs_stat_t  stat;
+
+    stat.failed = current->failed - prev->failed;
+    stat.passed = current->passed - prev->passed;
+
+    njs_printf("%s: %s [%d/%d]\n", msg, stat.failed ? "FAILED" : "PASSED",
+               stat.passed, stat.passed + stat.failed);
+}
+
+
+static njs_int_t
+njs_unit_test(njs_unit_test_t tests[], size_t num, const char *name,
+    njs_opts_t *opts, njs_stat_t *stat)
+{
+    u_char        *start;
+    njs_vm_t      *vm, *nvm;
+    njs_int_t     ret, rc;
+    njs_str_t     s;
+    njs_uint_t    i;
+    njs_stat_t    prev;
+    njs_bool_t    success;
+    njs_vm_opt_t  options;
+
+    vm = NULL;
+    nvm = NULL;
+
+    prev = *stat;
+
+    rc = NJS_ERROR;
+
+    for (i = 0; i < num; i++) {
+
+        if (opts->verbose) {
+            njs_printf("\"%V\"\n", &tests[i].script);
+        }
+
+        njs_memzero(&options, sizeof(njs_vm_opt_t));
+
+        options.module = opts->module;
+
+        vm = njs_vm_create(&options);
+        if (vm == NULL) {
+            njs_printf("njs_vm_create() failed\n");
+            goto done;
+        }
+
+        ret = njs_externals_init(vm);
+        if (ret != NJS_OK) {
+            goto done;
+        }
+
+        start = tests[i].script.start;
+
+        ret = njs_vm_compile(vm, &start, start + tests[i].script.length);
+
+        if (ret == NJS_OK) {
+            if (opts->disassemble) {
+                njs_disassembler(vm);
+            }
+
+            nvm = njs_vm_clone(vm, NULL);
+            if (nvm == NULL) {
+                njs_printf("njs_vm_clone() failed\n");
+                goto done;
+            }
+
+            ret = njs_vm_start(nvm);
+
+            if (njs_vm_retval_string(nvm, &s) != NJS_OK) {
+                njs_printf("njs_vm_retval_string() failed\n");
+                goto done;
+            }
+
+        } else {
+            if (njs_vm_retval_string(vm, &s) != NJS_OK) {
+                njs_printf("njs_vm_retval_string() failed\n");
+                goto done;
+            }
+        }
+
+        success = njs_strstr_eq(&tests[i].ret, &s);
+
+        if (!success) {
+            njs_printf("njs(\"%V\")\nexpected: \"%V\"\n     got: \"%V\"\n",
+                       &tests[i].script, &tests[i].ret, &s);
+
+            stat->failed++;
+
+        } else {
+            stat->passed++;
+        }
+
+        if (nvm != NULL) {
+            njs_vm_destroy(nvm);
+            nvm = NULL;
+        }
+
+        njs_vm_destroy(vm);
+        vm = NULL;
+    }
+
+    rc = NJS_OK;
+
+done:
+
+    if (nvm != NULL) {
+        njs_vm_destroy(nvm);
+    }
+
+    if (vm != NULL) {
+        njs_vm_destroy(vm);
+    }
+
+    njs_unit_test_report(name, &prev, stat);
+
+    return rc;
+}
+
+
+static njs_int_t
+njs_timezone_optional_test(njs_opts_t *opts, njs_stat_t *stat)
+{
+    size_t     size;
+    u_char     buf[16];
+    time_t     clock;
+    struct tm  tm;
+    njs_int_t  ret;
+
+    /*
+     * Chatham Islands NZ-CHAT time zone.
+     * Standard time: UTC+12:45, Daylight Saving time: UTC+13:45.
+     */
+    (void) putenv((char *) "TZ=Pacific/Chatham");
+    tzset();
+
+    clock = 0;
+    localtime_r(&clock, &tm);
+
+    size = strftime((char *) buf, sizeof(buf), "%z", &tm);
+
+    if (memcmp(buf, "+1245", size) == 0) {
+        ret = njs_unit_test(njs_tz_test, njs_nitems(njs_tz_test),
+                            "timezone tests", opts, stat);
+        if (ret != NJS_OK) {
+            return ret;
+        }
+
+    } else {
+        njs_printf("njs timezone tests skipped, timezone is unavailable\n");
+    }
+
+    return NJS_OK;
+}
+
+
+static njs_int_t
+njs_regexp_optional_test(njs_opts_t *opts, njs_stat_t *stat)
+{
+    int         erroff;
+    pcre        *re1, *re2;
+    njs_ret_t   ret;
+    const char  *errstr;
+
+    /*
+     * pcre-8.21 crashes when it compiles unicode escape codes inside
+     * square brackets when PCRE_UTF8 option is provided.
+     * Catching it in runtime by compiling it without PCRE_UTF8. Normally it
+     * should return NULL and "character value in \u.... sequence is too large"
+     * error string.
+     */
+    re1 = pcre_compile("/[\\u0410]/", PCRE_JAVASCRIPT_COMPAT, &errstr, &erroff,
+                      NULL);
+
+    /*
+     * pcre-7.8 fails to compile unicode escape codes inside square brackets
+     * even when PCRE_UTF8 option is provided.
+     */
+    re2 = pcre_compile("/[\\u0410]/", PCRE_JAVASCRIPT_COMPAT | PCRE_UTF8,
+                       &errstr, &erroff, NULL);
+
+    if (re1 == NULL && re2 != NULL) {
+        ret = njs_unit_test(njs_regexp_test, njs_nitems(njs_regexp_test),
+                            "unicode regexp tests", opts, stat);
+        if (ret != NJS_OK) {
+            return ret;
+        }
+
+    } else {
+        njs_printf("njs unicode regexp tests skipped, libpcre fails\n");
+    }
+
+    if (re1 != NULL) {
+        pcre_free(re1);
+    }
+
+    if (re2 != NULL) {
+        pcre_free(re2);
+    }
+
+    return NJS_OK;
+}
+
+
+static njs_int_t
+njs_vm_json_test(njs_opts_t *opts, njs_stat_t *stat)
+{
+    njs_vm_t      *vm;
+    njs_int_t     ret, rc;
+    njs_str_t     s, *script;
+    njs_uint_t    i;
+    njs_bool_t    success;
+    njs_stat_t    prev;
+    njs_value_t   args[3];
+    njs_vm_opt_t  options;
+
+    static const njs_str_t fname = njs_str("replacer");
+    static const njs_str_t iname = njs_str("indent");
+
+    static njs_unit_test_t tests[] = {
+        { njs_str("'[1, true, \"x\", {\"a\": {}}]'"),
+          njs_str("[1,true,\"x\",{\"a\":{}}]") },
+        { njs_str("'{\"a\":{\"b\":1}}'"),
+          njs_str("{\"a\":{\"b\":1}}") },
+        { njs_str("'[[[],{}]]'"),
+          njs_str("[[[],{}]]") },
+        { njs_str("var indent = 1; '[]'"),
+          njs_str("[\n \n]") },
+        { njs_str("function replacer(k, v) {return v}; '{\"a\":{\"b\":1}}'"),
+          njs_str("{\"a\":{\"b\":1}}") },
+        { njs_str("function replacer(k, v) {"
+                     "   return (typeof v === 'string') ? undefined : v};"
+                     "'{\"a\":1, \"b\":\"x\"}'"),
+          njs_str("{\"a\":1}") },
+    };
+
+    vm = NULL;
+
+    prev = *stat;
+
+    rc = NJS_ERROR;
+
+    for (i = 0; i < njs_nitems(tests); i++) {
+
+        memset(&options, 0, sizeof(njs_vm_opt_t));
+        options.init = 1;
+
+        vm = njs_vm_create(&options);
+        if (vm == NULL) {
+            njs_printf("njs_vm_create() failed\n");
+            goto done;
+        }
+
+        script = &tests[i].script;
+
+        ret = njs_vm_compile(vm, &script->start,
+                             script->start + script->length);
+
+        if (ret != NJS_OK) {
+            njs_printf("njs_vm_compile() failed\n");
+            goto done;
+        }
+
+        ret = njs_vm_start(vm);
+        if (ret != NJS_OK) {
+            njs_printf("njs_vm_run() failed\n");
+            goto done;
+        }
+
+        args[0] = *njs_vm_retval(vm);
+
+        ret = njs_vm_json_parse(vm, args, 1);
+        if (ret != NJS_OK) {
+            njs_printf("njs_vm_json_parse() failed\n");
+            goto done;
+        }
+
+        args[0] = vm->retval;
+        args[1] = *njs_vm_value(vm, &fname);
+        args[2] = *njs_vm_value(vm, &iname);
+
+        ret = njs_vm_json_stringify(vm, args, 3);
+        if (ret != NJS_OK) {
+            njs_printf("njs_vm_json_stringify() failed\n");
+            goto done;
+        }
+
+        if (njs_vm_retval_string(vm, &s) != NJS_OK) {
+            njs_printf("njs_vm_retval_string() failed\n");
+            goto done;
+        }
+
+        success = njs_strstr_eq(&tests[i].ret, &s);
+
+        if (!success) {
+            njs_printf("njs_vm_json_test(\"%V\")\n"
+                       "expected: \"%V\"\n     got: \"%V\"\n", script,
+                       &tests[i].ret, &s);
+
+            stat->failed++;
+
+        } else {
+            stat->passed++;
+        }
+
+        njs_vm_destroy(vm);
+        vm = NULL;
+
+    }
+
+    rc = NJS_OK;
+
+done:
+
+    if (rc != NJS_OK) {
+        if (njs_vm_retval_string(vm, &s) != NJS_OK) {
+            njs_printf("njs_vm_retval_string() failed\n");
+
+        } else {
+            njs_printf("%V\n", &s);
+        }
+    }
+
+    njs_unit_test_report("VM json API tests", &prev, stat);
+
+    if (vm != NULL) {
+        njs_vm_destroy(vm);
+    }
+
+    return rc;
+}
+
+
+static njs_int_t
+njs_vm_object_alloc_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
+{
+    njs_ret_t    ret;
+    njs_value_t  args[2], obj;
+
+    static const njs_value_t num_key = njs_string("num");
+    static const njs_value_t bool_key = njs_string("bool");
+
+    njs_value_number_set(njs_argument(&args, 0), 1);
+    njs_value_boolean_set(njs_argument(&args, 1), 0);
+
+    ret = njs_vm_object_alloc(vm, &obj, NULL);
+    if (ret != NJS_OK) {
+        return NJS_ERROR;
+    }
+
+    ret = njs_vm_object_alloc(vm, &obj, &num_key, NULL);
+    if (ret == NJS_OK) {
+        return NJS_ERROR;
+    }
+
+    ret = njs_vm_object_alloc(vm, &obj, &num_key, &args[0], NULL);
+    if (ret != NJS_OK) {
+        return NJS_ERROR;
+    }
+
+    ret = njs_vm_object_alloc(vm, &obj, &num_key, &args[0], &bool_key,
+                              &args[1], NULL);
+    if (ret != NJS_OK) {
+        stat->failed++;
+        return NJS_OK;
+    }
+
+    stat->passed++;
+
+    return NJS_OK;
+}
+
+
+static njs_int_t
+njs_file_basename_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
+{
+    njs_str_t   name;
+    njs_bool_t  success;
+    njs_uint_t  i;
+
+    static const struct {
+        njs_str_t   path;
+        njs_str_t   expected;
+    } tests[] = {
+        { njs_str(""),            njs_str("") },
+        { njs_str("/"),           njs_str("") },
+        { njs_str("/a"),          njs_str("a") },
+        { njs_str("///"),         njs_str("") },
+        { njs_str("///a"),        njs_str("a") },
+        { njs_str("///a/"),       njs_str("") },
+        { njs_str("a"),           njs_str("a") },
+        { njs_str("a/"),          njs_str("") },
+        { njs_str("a//"),         njs_str("") },
+        { njs_str("path/name"),   njs_str("name") },
+        { njs_str("/path/name"),  njs_str("name") },
+        { njs_str("/path/name/"), njs_str("") },
+    };
+
+    for (i = 0; i < njs_nitems(tests); i++) {
+        njs_file_basename(&tests[i].path, &name);
+
+        success = njs_strstr_eq(&tests[i].expected, &name);
+
+        if (!success) {
+            njs_printf("njs_file_basename_test(\"%V\"):\n"
+                       "expected: \"%V\"\n     got: \"%V\"\n",
+                       &tests[i].path, &tests[i].expected, &name);
+
+            stat->failed++;
+
+        } else {
+            stat->passed++;
+        }
+    }
+
+    return NJS_OK;
+}
+
+
+static njs_int_t
+njs_file_dirname_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
+{
+    njs_str_t   name;
+    njs_bool_t  success;
+    njs_uint_t  i;
+
+    static const struct {
+        njs_str_t   path;
+        njs_str_t   expected;
+    } tests[] = {
+        { njs_str(""),               njs_str(".") },
+        { njs_str("/"),              njs_str("/") },
+        { njs_str("/a"),             njs_str("/") },
+        { njs_str("///"),            njs_str("///") },
+        { njs_str("///a"),           njs_str("///") },
+        { njs_str("///a/"),          njs_str("///a") },
+        { njs_str("a"),              njs_str(".") },
+        { njs_str("a/"),             njs_str("a") },
+        { njs_str("a//"),            njs_str("a") },
+        { njs_str("p1/p2/name"),     njs_str("p1/p2") },
+        { njs_str("/p1/p2/name"),    njs_str("/p1/p2") },
+        { njs_str("/p1/p2///name"),  njs_str("/p1/p2") },
+        { njs_str("/p1/p2/name/"),   njs_str("/p1/p2/name") },
+    };
+
+    for (i = 0; i < njs_nitems(tests); i++) {
+        njs_file_dirname(&tests[i].path, &name);
+
+        success = njs_strstr_eq(&tests[i].expected, &name);
+
+        if (!success) {
+            njs_printf("njs_file_dirname_test(\"%V\"):\n"
+                       "expected: \"%V\"\n     got: \"%V\"\n",
+                       &tests[i].path, &tests[i].expected, &name);
+
+            stat->failed++;
+        } else {
+            stat->passed++;
+        }
+
+    }
+
+    return NJS_OK;
+}
+
+
+static njs_int_t
+njs_api_test(njs_opts_t *opts, njs_stat_t *stat)
+{
+    njs_vm_t      *vm;
+    njs_int_t     ret, rc;
+    njs_uint_t    i;
+    njs_stat_t    prev;
+    njs_vm_opt_t  options;
+
+    static const struct {
+        njs_int_t  (*test)(njs_vm_t *, njs_opts_t *, njs_stat_t *stat);
+        njs_str_t  name;
+    } tests[] = {
+        { njs_vm_object_alloc_test,
+          njs_str("njs_vm_object_alloc_test") },
+        { njs_file_basename_test,
+          njs_str("njs_file_basename_test") },
+        { njs_file_dirname_test,
+          njs_str("njs_file_dirname_test") },
+    };
+
+    vm = NULL;
+    njs_memzero(&options, sizeof(njs_vm_opt_t));
+
+    prev = *stat;
+
+    rc = NJS_ERROR;
+
+    for (i = 0; i < njs_nitems(tests); i++) {
+        vm = njs_vm_create(&options);
+        if (vm == NULL) {
+            njs_printf("njs_vm_create() failed\n");
+            goto done;
+        }
+
+        ret = tests[i].test(vm, opts, stat);
+        if (njs_slow_path(ret != NJS_OK)) {
+            njs_printf("njs_api_test: \"%V\" test failed\n", &tests[i].name);
+            goto done;
+        }
+
+        njs_vm_destroy(vm);
+        vm = NULL;
+    }
+
+    rc = NJS_OK;
+
+done:
+
+    njs_unit_test_report("API tests", &prev, stat);
+
+    if (vm != NULL) {
+        njs_vm_destroy(vm);
+    }
+
+    return rc;
+}
+
+
+int njs_cdecl
+main(int argc, char **argv)
+{
+    njs_int_t   ret;
+    njs_opts_t  opts;
+    njs_stat_t  stat;
+
+    njs_memzero(&opts, sizeof(njs_opts_t));
+
+    if (argc > 1) {
+        switch (argv[1][0]) {
+
+        case 'd':
+            opts.disassemble = 1;
+            break;
+
+        case 'v':
+            opts.verbose = 1;
+            break;
+
+        default:
+            break;
+        }
+    }
+
+    (void) putenv((char *) "TZ=UTC");
+    tzset();
+
+    njs_memzero(&stat, sizeof(njs_stat_t));
+
+    ret = njs_unit_test(njs_test, njs_nitems(njs_test), "script tests",
+                        &opts, &stat);
+    if (ret != NJS_OK) {
+        return ret;
+    }
+
+    ret = njs_timezone_optional_test(&opts, &stat);
+    if (ret != NJS_OK) {
+        return ret;
+    }
+
+    ret = njs_regexp_optional_test(&opts, &stat);
+    if (ret != NJS_OK) {
+        return ret;
+    }
+
+    ret = njs_vm_json_test(&opts, &stat);
+    if (ret != NJS_OK) {
+        return ret;
+    }
+
+    ret = njs_api_test(&opts, &stat);
+    if (ret != NJS_OK) {
+        return ret;
+    }
+
+    opts.module = 1;
+
+    ret = njs_unit_test(njs_module_test, njs_nitems(njs_module_test),
+                        "module tests", &opts, &stat);
+    if (ret != NJS_OK) {
+        return ret;
+    }
+
+    njs_printf("TOTAL: %s [%ui/%ui]\n", stat.failed ? "FAILED" : "PASSED",
+               stat.passed, stat.passed + stat.failed);
+
+    return stat.failed ? EXIT_FAILURE : EXIT_SUCCESS;
+}
diff --git a/src/test/random_unit_test.c b/src/test/random_unit_test.c
new file mode 100644 (file)
index 0000000..2e3d833
--- /dev/null
@@ -0,0 +1,62 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_sprintf.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_random.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+static njs_int_t
+random_unit_test(void)
+{
+    njs_uint_t    n;
+    njs_random_t  r;
+
+    njs_random_init(&r, -1);
+
+    r.count = 400000;
+
+    njs_random_add(&r, (u_char *) "arc4random", njs_length("arc4random"));
+
+    /*
+     * Test arc4random() numbers.
+     * RC4 pseudorandom numbers would be 0x4642AFC3 and 0xBAF0FFF0.
+     */
+
+    if (njs_random(&r) == 0xD6270B27) {
+
+        for (n = 100000; n != 0; n--) {
+            (void) njs_random(&r);
+        }
+
+        if (njs_random(&r) == 0x6FCAE186) {
+            njs_printf("random unit test passed\n");
+
+            njs_random_stir(&r, getpid());
+
+            njs_printf("random unit test: 0x%08uXD\n", njs_random(&r));
+
+            return NJS_OK;
+        }
+    }
+
+    njs_printf("random unit test failed\n");
+
+    return NJS_ERROR;
+}
+
+
+int
+main(void)
+{
+    return random_unit_test();
+}
diff --git a/src/test/rbtree_unit_test.c b/src/test/rbtree_unit_test.c
new file mode 100644 (file)
index 0000000..d3d141a
--- /dev/null
@@ -0,0 +1,195 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_stub.h>
+#include <njs_sprintf.h>
+#include <njs_str.h>
+#include <njs_rbtree.h>
+#include <njs_murmur_hash.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+typedef struct {
+    NJS_RBTREE_NODE  (node);
+    uint32_t         key;
+} njs_rbtree_test_t;
+
+
+static intptr_t rbtree_unit_test_comparison(njs_rbtree_node_t *node1,
+    njs_rbtree_node_t *node2);
+static njs_int_t rbtree_unit_test_compare(uint32_t key1, uint32_t key2);
+static int njs_cdecl rbtree_unit_test_sort_cmp(const void *one,
+    const void *two);
+
+
+static njs_int_t
+rbtree_unit_test(njs_uint_t n)
+{
+    void               *mark;
+    uint32_t           key, *keys;
+    njs_uint_t         i;
+    njs_rbtree_t       tree;
+    njs_rbtree_node_t  *node;
+    njs_rbtree_test_t  *items, *item;
+
+    njs_printf("rbtree unit test started: %l nodes\n", (long) n);
+
+    njs_rbtree_init(&tree, rbtree_unit_test_comparison);
+
+    mark = tree.sentinel.right;
+
+    items = malloc(n * sizeof(njs_rbtree_test_t));
+    if (items == NULL) {
+        return NJS_ERROR;
+    }
+
+    keys = malloc(n * sizeof(uint32_t));
+    if (keys == NULL) {
+        free(items);
+        return NJS_ERROR;
+    }
+
+    key = 0;
+
+    for (i = 0; i < n; i++) {
+        key = njs_murmur_hash2(&key, sizeof(uint32_t));
+        keys[i] = key;
+        items[i].key = key;
+    }
+
+    qsort(keys, n, sizeof(uint32_t), rbtree_unit_test_sort_cmp);
+
+    for (i = 0; i < n; i++) {
+        njs_rbtree_insert(&tree, &items[i].node);
+    }
+
+    for (i = 0; i < n; i++) {
+        node = njs_rbtree_find(&tree, &items[i].node);
+
+        if (node != (njs_rbtree_node_t *) &items[i].node) {
+            njs_printf("rbtree unit test failed: %08uXD not found\n",
+                       items[i].key);
+            goto fail;
+        }
+    }
+
+    i = 0;
+    node = njs_rbtree_min(&tree);
+
+    while (njs_rbtree_is_there_successor(&tree, node)) {
+
+        item = (njs_rbtree_test_t *) node;
+
+        if (keys[i] != item->key) {
+            njs_printf("rbtree unit test failed: %l: %08uXD %08uXD\n",
+                       (long) i, keys[i], item->key);
+            goto fail;
+        }
+
+        i++;
+        node = njs_rbtree_node_successor(&tree, node);
+    }
+
+    if (i != n) {
+        njs_printf("rbtree unit test failed: %l\n", (long) i);
+        goto fail;
+    }
+
+    for (i = 0; i < n; i++) {
+        njs_rbtree_delete(&tree, &items[i].node);
+        njs_memset(&items[i], 0xA5, sizeof(njs_rbtree_test_t));
+    }
+
+    if (!njs_rbtree_is_empty(&tree)) {
+        njs_printf("rbtree unit test failed: tree is not empty\n");
+        goto fail;
+    }
+
+    /* Check that the sentinel callback was not modified. */
+
+    if (mark != tree.sentinel.right) {
+        njs_printf("rbtree sentinel unit test failed\n");
+        goto fail;
+    }
+
+    free(keys);
+    free(items);
+
+    njs_printf("rbtree unit test passed\n");
+
+    return NJS_OK;
+
+fail:
+
+    free(keys);
+    free(items);
+
+    return NJS_ERROR;
+}
+
+
+static intptr_t
+rbtree_unit_test_comparison(njs_rbtree_node_t *node1, njs_rbtree_node_t *node2)
+{
+    njs_rbtree_test_t  *item1, *item2;
+
+    item1 = (njs_rbtree_test_t *) node1;
+    item2 = (njs_rbtree_test_t *) node2;
+
+    return rbtree_unit_test_compare(item1->key, item2->key);
+}
+
+
+/*
+ * Subtraction cannot be used in these comparison functions because
+ * the key values are spread uniform in whole 0 .. 2^32 range but are
+ * not grouped around some value as timeout values are.
+ */
+
+static njs_int_t
+rbtree_unit_test_compare(uint32_t key1, uint32_t key2)
+{
+    if (key1 < key2) {
+        return -1;
+    }
+
+    if (key1 == key2) {
+        return 0;
+    }
+
+    return 1;
+}
+
+
+static int njs_cdecl
+rbtree_unit_test_sort_cmp(const void *one, const void *two)
+{
+    const uint32_t  *first, *second;
+
+    first = one;
+    second = two;
+
+    if (*first < *second) {
+        return -1;
+    }
+
+    if (*first == *second) {
+        return 0;
+    }
+
+    return 1;
+}
+
+
+int
+main(void)
+{
+    return rbtree_unit_test(1000 * 1000);
+}
similarity index 60%
rename from nxt/test/utf8_unit_test.c
rename to src/test/utf8_unit_test.c
index 0e66262eb2bb636c54a9d7d16c481ff3718a5f81..f82c02db4892f4d5b705825040eed7ecbbce0a66 100644 (file)
@@ -4,18 +4,18 @@
  * Copyright (C) NGINX, Inc.
  */
 
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_sprintf.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_utf8.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_sprintf.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_utf8.h>
 #include <string.h>
 
 
-#define NXT_UTF8_START_TEST  0xC2
-//#define NXT_UTF8_START_TEST  0
+#define NJS_UTF8_START_TEST  0xC2
+//#define NJS_UTF8_START_TEST  0
 
 
 static u_char  invalid[] = {
@@ -45,23 +45,23 @@ static u_char  invalid[] = {
 };
 
 
-static nxt_int_t
+static njs_int_t
 utf8_overlong(u_char *overlong, size_t len)
 {
     u_char        *p, utf8[4];
     size_t        size;
     uint32_t      u, d;
-    nxt_uint_t    i;
+    njs_uint_t    i;
     const u_char  *pp;
 
     pp = overlong;
 
-    d = nxt_utf8_decode(&pp, overlong + len);
+    d = njs_utf8_decode(&pp, overlong + len);
 
     len = pp - overlong;
 
     if (d != 0xFFFFFFFF) {
-        p = nxt_utf8_encode(utf8, d);
+        p = njs_utf8_encode(utf8, d);
 
         size = (p != NULL) ? p - utf8 : 0;
 
@@ -72,47 +72,47 @@ utf8_overlong(u_char *overlong, size_t len)
                 u = (u << 8) + overlong[i];
             }
 
-            nxt_printf("nxt_utf8_decode(%05uXD, %uz) failed: %05uXD, %uz\n",
+            njs_printf("njs_utf8_decode(%05uXD, %uz) failed: %05uXD, %uz\n",
                        u, len, d, size);
 
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
-    return NXT_OK;
+    return NJS_OK;
 }
 
 
-static nxt_int_t
-utf8_unit_test(nxt_uint_t start)
+static njs_int_t
+utf8_unit_test(njs_uint_t start)
 {
     u_char        *p, utf8[4];
     size_t        len;
     int32_t       n;
     uint32_t      u, d;
-    nxt_uint_t    i, k, l, m;
+    njs_uint_t    i, k, l, m;
     const u_char  *pp;
 
-    nxt_printf("utf8 unit test started\n");
+    njs_printf("utf8 unit test started\n");
 
     /* Test valid UTF-8. */
 
     for (u = 0; u < 0x110000; u++) {
 
-        p = nxt_utf8_encode(utf8, u);
+        p = njs_utf8_encode(utf8, u);
 
         if (p == NULL) {
-            nxt_printf("nxt_utf8_encode(%05uXD) failed\n", u);
-            return NXT_ERROR;
+            njs_printf("njs_utf8_encode(%05uXD) failed\n", u);
+            return NJS_ERROR;
         }
 
         pp = utf8;
 
-        d = nxt_utf8_decode(&pp, p);
+        d = njs_utf8_decode(&pp, p);
 
         if (u != d) {
-            nxt_printf("nxt_utf8_decode(%05uXD) failed: %05uxD\n", u, d);
-            return NXT_ERROR;
+            njs_printf("njs_utf8_decode(%05uXD) failed: %05uxD\n", u, d);
+            return NJS_ERROR;
         }
     }
 
@@ -128,7 +128,7 @@ utf8_unit_test(nxt_uint_t start)
 
         pp = utf8;
 
-        d = nxt_utf8_decode(&pp, utf8 + len);
+        d = njs_utf8_decode(&pp, utf8 + len);
 
         if (d != 0xFFFFFFFF) {
 
@@ -137,9 +137,9 @@ utf8_unit_test(nxt_uint_t start)
                 u = (u << 8) + utf8[i];
             }
 
-            nxt_printf("nxt_utf8_decode(%05uXD, %uz) failed: %05uXD\n",
+            njs_printf("njs_utf8_decode(%05uXD, %uz) failed: %05uXD\n",
                        u, len, d);
-            return NXT_ERROR;
+            return NJS_ERROR;
         }
     }
 
@@ -148,57 +148,57 @@ utf8_unit_test(nxt_uint_t start)
     for (i = start; i < 256; i++) {
         utf8[0] = i;
 
-        if (utf8_overlong(utf8, 1) != NXT_OK) {
-            return NXT_ERROR;
+        if (utf8_overlong(utf8, 1) != NJS_OK) {
+            return NJS_ERROR;
         }
 
         for (k = 0; k < 256; k++) {
             utf8[1] = k;
 
-            if (utf8_overlong(utf8, 2) != NXT_OK) {
-                return NXT_ERROR;
+            if (utf8_overlong(utf8, 2) != NJS_OK) {
+                return NJS_ERROR;
             }
 
             for (l = 0; l < 256; l++) {
                 utf8[2] = l;
 
-                if (utf8_overlong(utf8, 3) != NXT_OK) {
-                    return NXT_ERROR;
+                if (utf8_overlong(utf8, 3) != NJS_OK) {
+                    return NJS_ERROR;
                 }
 
                 for (m = 0; m < 256; m++) {
                     utf8[3] = m;
 
-                    if (utf8_overlong(utf8, 4) != NXT_OK) {
-                        return NXT_ERROR;
+                    if (utf8_overlong(utf8, 4) != NJS_OK) {
+                        return NJS_ERROR;
                     }
                 }
             }
         }
     }
 
-    n = nxt_utf8_casecmp((u_char *) "ABC АБВ ΑΒΓ",
+    n = njs_utf8_casecmp((u_char *) "ABC АБВ ΑΒΓ",
                          (u_char *) "abc абв αβγ",
-                         nxt_length("ABC АБВ ΑΒΓ"),
-                         nxt_length("abc абв αβγ"));
+                         njs_length("ABC АБВ ΑΒΓ"),
+                         njs_length("abc абв αβγ"));
 
     if (n != 0) {
-        nxt_printf("nxt_utf8_casecmp() failed\n");
-        return NXT_ERROR;
+        njs_printf("njs_utf8_casecmp() failed\n");
+        return NJS_ERROR;
     }
 
-    nxt_printf("utf8 unit test passed\n");
-    return NXT_OK;
+    njs_printf("utf8 unit test passed\n");
+    return NJS_OK;
 }
 
 
 int
 main(int argc, char **argv)
 {
-    nxt_uint_t  start;
+    njs_uint_t  start;
 
     if (argc > 1 && argv[1][0] == 'a') {
-        start = NXT_UTF8_START_TEST;
+        start = NJS_UTF8_START_TEST;
 
     } else {
         start = 256;
similarity index 100%
rename from njs/test/fs/ascii
rename to test/fs/ascii
similarity index 100%
rename from njs/test/fs/non_utf8
rename to test/fs/non_utf8
similarity index 100%
rename from njs/test/fs/utf8
rename to test/fs/utf8
similarity index 100%
rename from njs/test/inputrc
rename to test/inputrc
similarity index 100%
rename from njs/test/module/lib1.js
rename to test/module/lib1.js
similarity index 100%
rename from njs/test/module/lib2.js
rename to test/module/lib2.js
similarity index 100%
rename from njs/test/module/lib3.js
rename to test/module/lib3.js
similarity index 79%
rename from njs/test/njs_expect_test.exp
rename to test/njs_expect_test.exp
index 9ff3fb5adf03b65e2c47d10f1a329e63d4b39afa..491a31176c4b408b2b9b6852cc7ca95df225825e 100644 (file)
@@ -401,44 +401,44 @@ njs_test {
 njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFile('njs/test/fs/utf8', 'utf8', function (e, data) {console.log(data[2]+data.length)})\r\n"
+    {"fs.readFile('test/fs/utf8', 'utf8', function (e, data) {console.log(data[2]+data.length)})\r\n"
      "Z4\r\nundefined\r\n>> "}
 }
 
 njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFile('njs/test/fs/utf8', function (e, data) {console.log(data[4]+data.length)})\r\n"
+    {"fs.readFile('test/fs/utf8', function (e, data) {console.log(data[4]+data.length)})\r\n"
      "Z7\r\nundefined\r\n>> "}
 }
 
 njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFile('njs/test/fs/utf8', {encoding:'utf8',flag:'r+'}, function (e, data) {console.log(data)})\r\n"
+    {"fs.readFile('test/fs/utf8', {encoding:'utf8',flag:'r+'}, function (e, data) {console.log(data)})\r\n"
      "αβZγ\r\nundefined\r\n>> "}
 }
 
 njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFile('njs/test/fs/ascii', function (e, data) {console.log(data[599])})\r\n"
+    {"fs.readFile('test/fs/ascii', function (e, data) {console.log(data[599])})\r\n"
      "x\r\nundefined\r\n>> "}
-    {"fs.readFile('njs/test/fs/ascii', {encoding:'utf8',flag:'r+'}, function (e, data) {console.log(data[599])})\r\n"
+    {"fs.readFile('test/fs/ascii', {encoding:'utf8',flag:'r+'}, function (e, data) {console.log(data[599])})\r\n"
      "x\r\nundefined\r\n>> "}
 }
 
 njs_test {
     {"var fs = require('fs'); \r\n"
      "undefined\r\n>> "}
-    {"fs.readFile('njs/test/fs/nonexistent', 'utf8', function (e) {console.log(JSON.stringify(e))})\r\n"
-     "{\"errno\":2,\"path\":\"njs/test/fs/nonexistent\",\"syscall\":\"open\"}\r\nundefined\r\n>> "}
+    {"fs.readFile('test/fs/nonexistent', 'utf8', function (e) {console.log(JSON.stringify(e))})\r\n"
+     "{\"errno\":2,\"path\":\"test/fs/nonexistent\",\"syscall\":\"open\"}\r\nundefined\r\n>> "}
 }
 
 njs_test {
     {"var fs = require('fs'); \r\n"
      "undefined\r\n>> "}
-    {"fs.readFile('njs/test/fs/nonexistent', {encoding:'utf8', flag:'r+'}, function (e) {console.log(e)})\r\n"
+    {"fs.readFile('test/fs/nonexistent', {encoding:'utf8', flag:'r+'}, function (e) {console.log(e)})\r\n"
      "Error: No such file or directory\r\nundefined\r\n>> "}
 }
 
@@ -447,33 +447,33 @@ njs_test {
 njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs/test/fs/utf8').toString('base64')\r\n"
+    {"fs.readFileSync('test/fs/utf8').toString('base64')\r\n"
      "'zrHOslrOsw=='\r\n>> "}
 }
 
 njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs/test/fs/utf8', 'utf8')[2]\r\n"
+    {"fs.readFileSync('test/fs/utf8', 'utf8')[2]\r\n"
      "'Z'\r\n>> "}
 }
 
 njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs/test/fs/utf8')[4]\r\n"
+    {"fs.readFileSync('test/fs/utf8')[4]\r\n"
      "'Z'\r\n>> "}
 }
 
 njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs/test/fs/utf8', {encoding:'utf8',flag:'r+'})\r\n"
+    {"fs.readFileSync('test/fs/utf8', {encoding:'utf8',flag:'r+'})\r\n"
      "'αβZγ'\r\n>> "}
 }
 
 njs_test {
-    {"var fs = require('fs'), fn = 'njs/test/fs/ascii'\r\n"
+    {"var fs = require('fs'), fn = 'test/fs/ascii'\r\n"
      "undefined\r\n>> "}
     {"fs.readFileSync(fn)[599] + fs.readFileSync(fn, 'utf8')[599]\r\n"
      "'xx'\r\n>> "}
@@ -482,58 +482,58 @@ njs_test {
 njs_test {
     {"var fs = require('fs'); \r\n"
      "undefined\r\n>> "}
-    {"try { fs.readFileSync('njs/test/fs/nonexistent')} catch (e) {console.log(JSON.stringify(e))}\r\n"
-     "{\"errno\":2,\"path\":\"njs/test/fs/nonexistent\",\"syscall\":\"open\"}\r\nundefined\r\n>> "}
+    {"try { fs.readFileSync('test/fs/nonexistent')} catch (e) {console.log(JSON.stringify(e))}\r\n"
+     "{\"errno\":2,\"path\":\"test/fs/nonexistent\",\"syscall\":\"open\"}\r\nundefined\r\n>> "}
 }
 
 njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs/test/fs/non_utf8').charCodeAt(1)\r\n"
+    {"fs.readFileSync('test/fs/non_utf8').charCodeAt(1)\r\n"
      "128"}
 }
 
 njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs/test/fs/non_utf8', 'utf8')\r\n"
+    {"fs.readFileSync('test/fs/non_utf8', 'utf8')\r\n"
      "Error: Non-UTF8 file, convertion is not implemented"}
 }
 
 
 # require('fs').writeFile()
 
-exec rm -fr njs_test_file2
+exec rm -fr ./build/test/file2
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/file2';\r\n"
      "undefined\r\n>> "}
-    {"function h1(e) {if (e) {throw e}; console.log(fs.readFileSync('njs_test_file2'))}\r\n"
+    {"function h1(e) {if (e) {throw e}; console.log(fs.readFileSync(fn))}\r\n"
      "undefined\r\n>> "}
-    {"fs.writeFile('njs_test_file2', 'ABC', h1)\r\n"
+    {"fs.writeFile(fn, 'ABC', h1)\r\n"
      "ABC\r\nundefined\r\n>> "}
 }
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/file2';\r\n"
      "undefined\r\n>> "}
-    {"fs.writeFile('njs_test_file2', 'ABC', 'utf8', function (e) { if (e) {throw e}; console.log(fs.readFileSync('njs_test_file2'))})\r\n"
+    {"fs.writeFile(fn, 'ABC', 'utf8', function (e) { if (e) {throw e}; console.log(fs.readFileSync(fn))})\r\n"
      "ABC\r\nundefined\r\n>> "}
 }
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/file2';\r\n"
      "undefined\r\n>> "}
-    {"fs.writeFile('njs_test_file2', 'ABC', {encoding:'utf8', mode:0o666}, function (e) { if (e) {throw e}; console.log(fs.readFileSync('njs_test_file2'))})\r\n"
+    {"fs.writeFile(fn, 'ABC', {encoding:'utf8', mode:0o666}, function (e) { if (e) {throw e}; console.log(fs.readFileSync(fn))})\r\n"
      "ABC\r\nundefined\r\n>> "}
 }
 
-exec rm -fr njs_wo_file
+exec rm -fr ./build/test/wo_file
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/wo_file';\r\n"
      "undefined\r\n>> "}
-    {"fs.writeFile('njs_wo_file', 'ABC', {mode:0o222}, function (e) {console.log(fs.readFileSync('njs_wo_file'))})\r\n"
+    {"fs.writeFile(fn, 'ABC', {mode:0o222}, function (e) {console.log(fs.readFileSync(fn))})\r\n"
      "Error: Permission denied"}
 }
 
@@ -546,103 +546,103 @@ njs_test {
 
 # require('fs').writeFileSync()
 
-exec rm -fr njs_test_file2
+exec rm -fr ./build/test/file2
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/file2';\r\n"
      "undefined\r\n>> "}
-    {"fs.writeFileSync('njs_test_file2', 'ABC')\r\n"
+    {"fs.writeFileSync(fn, 'ABC')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs_test_file2')\r\n"
+    {"fs.readFileSync(fn)\r\n"
      "'ABC'\r\n>> "}
 }
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/file2';\r\n"
      "undefined\r\n>> "}
-    {"fs.writeFileSync('njs_test_file2', 'ABC', 'utf8')\r\n"
+    {"fs.writeFileSync(fn, 'ABC', 'utf8')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs_test_file2')\r\n"
+    {"fs.readFileSync(fn)\r\n"
      "'ABC'\r\n>> "}
 }
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/file2';\r\n"
      "undefined\r\n>> "}
-    {"fs.writeFileSync('njs_test_file2', 'ABC')\r\n"
+    {"fs.writeFileSync(fn, 'ABC')\r\n"
      "undefined\r\n>> "}
-    {"fs.writeFileSync('njs_test_file2', 'ABC')\r\n"
+    {"fs.writeFileSync(fn, 'ABC')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs_test_file2')\r\n"
+    {"fs.readFileSync(fn)\r\n"
      "'ABC'\r\n>> "}
 }
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/file2';\r\n"
      "undefined\r\n>> "}
-    {"fs.writeFileSync('njs_test_file2', 'ABC', {encoding:'utf8', mode:0o666})\r\n"
+    {"fs.writeFileSync(fn, 'ABC', {encoding:'utf8', mode:0o666})\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs_test_file2')\r\n"
+    {"fs.readFileSync(fn)\r\n"
      "'ABC'\r\n>> "}
 }
 
-exec rm -fr njs_wo_file
+exec rm -fr ./build/test/wo_file
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/wo_file';\r\n"
      "undefined\r\n>> "}
-    {"fs.writeFileSync('njs_wo_file', 'ABC', {mode:0o222}); fs.readFileSync('njs_wo_file')\r\n"
+    {"fs.writeFileSync(fn, 'ABC', {mode:0o222}); fs.readFileSync(fn)\r\n"
      "Error: Permission denied"}
 }
 
 # require('fs').appendFile()
 
-exec rm -fr njs_test_file2
+exec rm -fr ./build/test/file2
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/file2';\r\n"
      "undefined\r\n>> "}
-    {"function h1(e) {console.log(fs.readFileSync('njs_test_file2'))}\r\n"
+    {"function h1(e) {console.log(fs.readFileSync(fn))}\r\n"
      "undefined\r\n>> "}
-    {"function h2(e) {fs.appendFile('njs_test_file2', 'ABC', h1)}\r\n"
+    {"function h2(e) {fs.appendFile(fn, 'ABC', h1)}\r\n"
      "undefined\r\n>> "}
-    {"fs.appendFile('njs_test_file2', 'ABC', h2)\r\n"
+    {"fs.appendFile(fn, 'ABC', h2)\r\n"
      "ABCABC\r\nundefined\r\n>> "}
 }
 
 # require('fs').appendFileSync()
 
-exec rm -fr njs_test_file2
+exec rm -fr ./build/test/file2
 
 njs_test {
-    {"var fs = require('fs')\r\n"
+    {"var fs = require('fs'), fn = './build/test/file2';\r\n"
      "undefined\r\n>> "}
-    {"fs.appendFileSync('njs_test_file2', 'ABC')\r\n"
+    {"fs.appendFileSync(fn, 'ABC')\r\n"
      "undefined\r\n>> "}
-    {"fs.appendFileSync('njs_test_file2', 'ABC')\r\n"
+    {"fs.appendFileSync(fn, 'ABC')\r\n"
      "undefined\r\n>> "}
-    {"fs.readFileSync('njs_test_file2')\r\n"
+    {"fs.readFileSync(fn)\r\n"
      "'ABCABC'\r\n>> "}
 }
 
 # Modules
 
-njs_run {"-p" "njs/test/module/libs" "./njs/test/module/normal.js"} \
+njs_run {"-p" "test/module/libs" "./test/module/normal.js"} \
         "passed!"
 
-njs_run {"-p" "njs/test/module/libs/" "./njs/test/module/normal.js"} \
+njs_run {"-p" "test/module/libs/" "./test/module/normal.js"} \
         "passed!"
 
-njs_run {"-p" "njs/test/module" "-p" "njs/test/module/libs" "./njs/test/module/normal.js"} \
+njs_run {"-p" "test/module" "-p" "test/module/libs" "./test/module/normal.js"} \
         "passed!"
 
-njs_run {"./njs/test/module/normal.js"} \
+njs_run {"./test/module/normal.js"} \
         "SyntaxError: Cannot find module \"hash.js\" in sub2.js:5"
 
-njs_run {"-p" "njs/test/module/libs" "./njs/test/module/exception.js"} \
+njs_run {"-p" "test/module/libs" "./test/module/exception.js"} \
         "at error \\(sub1.js:5\\)"
 
-njs_run {"-p" "njs/test/module" "./njs/test/module/recursive.js"} \
+njs_run {"-p" "test/module" "./test/module/recursive.js"} \
         "SyntaxError: Cannot import itself \"./recursive.js\" in recursive.js:3"
 
 # CLI OPTIONS
@@ -735,12 +735,12 @@ njs_test {
      "undefined\r\n"}
     {"m.prod(3,4)\r\n"
      "12\r\n"}
-} "-p njs/test/module/"
+} "-p test/module/"
 
-njs_run {"-q" "./njs/test/module/normal.js"} \
+njs_run {"-q" "./test/module/normal.js"} \
         "SyntaxError: Cannot find module \"hash.js\" in 5"
 
-njs_run {"-p" "njs/test/module/libs/" "-d" "./njs/test/module/normal.js"} \
+njs_run {"-p" "test/module/libs/" "-d" "./test/module/normal.js"} \
         "passed!"
 
 # sandboxing