From: Dmitry Volyntsev Date: Tue, 30 Jul 2019 17:11:46 +0000 (+0300) Subject: Refactored file hierarchy. X-Git-Tag: 0.3.4~41 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=ef08c9585090b1c41df45a9101a1ba850b6e55ef;p=njs.git Refactored file hierarchy. 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. --- diff --git a/auto/clang b/auto/clang index 619906d4..b776ef1c 100644 --- a/auto/clang +++ b/auto/clang @@ -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 +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 void *f(void) __attribute__ ((__malloc__)); @@ -278,12 +278,12 @@ nxt_feature_test="#include . 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 +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 int main(int argc, char *argv[]) { __msan_unpoison(argv, sizeof(char *)); return 0; @@ -304,12 +304,12 @@ nxt_feature_test="#include . 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 +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 #include #include diff --git a/auto/define b/auto/define index 7c318d6f..b2cdc994 100644 --- a/auto/define +++ b/auto/define @@ -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 diff --git a/auto/deps b/auto/deps index 3af6092f..83983f52 100644 --- 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 "" } ;; diff --git a/auto/expect b/auto/expect index bbb898b1..dfbdcd05 100644 --- a/auto/expect +++ b/auto/expect @@ -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" diff --git a/auto/explicit_bzero b/auto/explicit_bzero index dc940094..596da41a 100644 --- a/auto/explicit_bzero +++ b/auto/explicit_bzero @@ -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 +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 #include int main(void) { @@ -22,13 +22,13 @@ nxt_feature_test="#include . 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 + njs_feature="explicit_memset()" + njs_feature_name=NJS_HAVE_EXPLICIT_MEMSET + njs_feature_test="#include int main(void) { int r; diff --git a/auto/feature b/auto/feature index fa03be02..7b1f99a1 100644 --- a/auto/feature +++ b/auto/feature @@ -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* diff --git a/auto/getrandom b/auto/getrandom index 34e61dab..d8b26245 100644 --- a/auto/getrandom +++ b/auto/getrandom @@ -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 +njs_feature="getrandom()" +njs_feature_name=NJS_HAVE_GETRANDOM +njs_feature_run=yes +njs_feature_incs= +njs_feature_libs= +njs_feature_test="#include #include int main(void) { @@ -25,13 +25,13 @@ nxt_feature_test="#include . 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 + njs_feature="SYS_getrandom in Linux" + njs_feature_name=NJS_HAVE_LINUX_SYS_GETRANDOM + njs_feature_test="#include #include #include @@ -48,13 +48,13 @@ if [ $nxt_found = no ]; then fi -if [ $nxt_found = no ]; then +if [ $njs_found = no ]; then # OpenBSD 5.6 lacks . - nxt_feature="getentropy()" - nxt_feature_name=NXT_HAVE_GETENTROPY - nxt_feature_test="#include + njs_feature="getentropy()" + njs_feature_name=NJS_HAVE_GETENTROPY + njs_feature_test="#include 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 + njs_feature="getentropy() in sys/random.h" + njs_feature_name=NJS_HAVE_GETENTROPY_SYS_RANDOM + njs_feature_test="#include #include int main(void) { diff --git a/auto/make b/auto/make index b398a9ef..e43a520d 100644 --- a/auto/make +++ b/auto/make @@ -4,141 +4,61 @@ . 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 diff --git a/auto/memalign b/auto/memalign index 799fea2b..968866ab 100644 --- a/auto/memalign +++ b/auto/memalign @@ -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 +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 int main(void) { void *p; @@ -25,16 +25,16 @@ nxt_feature_test="#include . 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 + njs_feature="memalign()" + njs_feature_name=NJS_HAVE_MEMALIGN + njs_feature_run=yes + njs_feature_incs= + njs_feature_libs= + njs_feature_test="#include int main(void) { void *p; diff --git a/auto/os b/auto/os index 0476647e..7f33ae2d 100644 --- 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 diff --git a/auto/pcre b/auto/pcre index 38057ce7..36ad67f2 100644 --- 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 + 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 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 diff --git a/auto/readline b/auto/readline index 0a2f5a18..55ff2b45 100644 --- a/auto/readline +++ b/auto/readline @@ -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 +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 #include #include @@ -21,11 +21,11 @@ nxt_feature_test="#include }" . 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 +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 #include 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 + njs_feature_name=NJS_HAVE_EDIT_READLINE + njs_feature="editline in edit/readline/readline.h" + njs_feature_test="#include #include 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 + njs_feature_name=NJS_HAVE_NETBSD_READLINE + njs_feature="editline in readline/readline.h" + njs_feature_test="#include #include 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 diff --git a/auto/sources b/auto/sources index 20e5ac87..c07915a0 100644 --- a/auto/sources +++ b/auto/sources @@ -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 \ " diff --git a/auto/time b/auto/time index 0c66c5e9..69f9e74a 100644 --- 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 +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 int main() { struct timespec ts; @@ -20,27 +20,27 @@ nxt_feature_test="#include . 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 +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 int main(void) { time_t t; @@ -55,12 +55,12 @@ nxt_feature_test="#include # Solaris -nxt_feature="altzone" -nxt_feature_name=NXT_HAVE_ALTZONE -nxt_feature_run=no -nxt_feature_incs= -nxt_feature_libs= -nxt_feature_test="#include +njs_feature="altzone" +njs_feature_name=NJS_HAVE_ALTZONE +njs_feature_run=no +njs_feature_incs= +njs_feature_libs= +njs_feature_test="#include int main(void) { altzone = 0; diff --git a/configure b/configure index d564bed0..40e24581 100755 --- 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 diff --git a/nginx/config b/nginx/config index a79c0bb2..bfc8973a 100644 --- a/nginx/config +++ b/nginx/config @@ -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" diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c index 15493ecc..4a95e214 100644 --- a/nginx/ngx_http_js_module.c +++ b/nginx/ngx_http_js_module.c @@ -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; } diff --git a/nginx/ngx_stream_js_module.c b/nginx/ngx_stream_js_module.c index 01c59440..8a995061 100644 --- a/nginx/ngx_stream_js_module.c +++ b/nginx/ngx_stream_js_module.c @@ -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 index 5aa856b0..00000000 --- a/njs/njs_lexer_keyword.c +++ /dev/null @@ -1,195 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) NGINX, Inc. - */ - -#include -#include - - -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 index 87abb7cb..00000000 --- a/njs/njs_object_hash.h +++ /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 index cb3cc185..00000000 --- a/njs/test/njs_unit_test.c +++ /dev/null @@ -1,14690 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) NGINX, Inc. - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - - -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'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("[,undefined,]") }, - - { 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 = /(?[0-9]{2})\\/(?[0-9]{2})\\/(?[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 = /(?(?no)?(?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,,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,,2,{c:[Boolean: true]}]}") }, - - { nxt_string("njs.dump(Array.prototype.slice.call({'1':'b', length:2}))"), - nxt_string("[,'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 index 547c4304..00000000 --- a/nxt/nxt_alignment.h +++ /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 index df64fa99..00000000 --- a/nxt/nxt_array.h +++ /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 index 3e4b5f39..00000000 --- a/nxt/nxt_clang.h +++ /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 -#include /* offsetof(). */ -#include /* 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 - -#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 index a6e4f1be..00000000 --- a/nxt/nxt_diyfp.c +++ /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 -#include -#include -#include - - -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 index ec36d2aa..00000000 --- a/nxt/nxt_diyfp.h +++ /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 -#include - - -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 index 05f1b80f..00000000 --- a/nxt/nxt_djb_hash.c +++ /dev/null @@ -1,48 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) NGINX, Inc. - */ - -#include -#include -#include -#include -#include -#include - - -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 index 43395e6a..00000000 --- a/nxt/nxt_djb_hash.h +++ /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 index 9f6c1e25..00000000 --- a/nxt/nxt_dtoa.h +++ /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 index 3c603cc8..00000000 --- a/nxt/nxt_file.h +++ /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 index 916a5123..00000000 --- a/nxt/nxt_lvlhsh.c +++ /dev/null @@ -1,859 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) NGINX, Inc. - */ - -#include -#include -#include -#include -#include -#include -#include - - -/* - * 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 index cc0343e5..00000000 --- a/nxt/nxt_lvlhsh.h +++ /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 index 586274c1..00000000 --- a/nxt/nxt_malloc.h +++ /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 - -/* - * alloca() is defined in stdlib.h in Linux, FreeBSD and MacOSX - * and in alloca.h in Linux, Solaris and MacOSX. - */ -#if (NXT_SOLARIS) -#include -#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 index 8c39d25d..00000000 --- a/nxt/nxt_md5.h +++ /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 index 77a9b210..00000000 --- a/nxt/nxt_mp.h +++ /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 index 289dc5b0..00000000 --- a/nxt/nxt_murmur_hash.h +++ /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 index de091eae..00000000 --- a/nxt/nxt_queue.c +++ /dev/null @@ -1,87 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) NGINX, Inc. - */ - -#include -#include -#include -#include - - -/* - * 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 index caa4ddba..00000000 --- a/nxt/nxt_random.h +++ /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 index 9501ad07..00000000 --- a/nxt/nxt_rbtree.h +++ /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 index 1e27589c..00000000 --- a/nxt/nxt_regex.h +++ /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 index 2816982b..00000000 --- a/nxt/nxt_sha1.h +++ /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 index 778cd28e..00000000 --- a/nxt/nxt_sha2.h +++ /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 index 27afbf7b..00000000 --- a/nxt/nxt_sprintf.h +++ /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 index c36cc7b3..00000000 --- a/nxt/nxt_strtod.h +++ /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 index 8c88848a..00000000 --- a/nxt/nxt_stub.h +++ /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 -#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 index 3d849639..00000000 --- a/nxt/nxt_time.h +++ /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 index f550e3da..00000000 --- a/nxt/nxt_types.h +++ /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 . - */ -#define _FILE_OFFSET_BITS 64 - -/* u_char, u_int, int8_t, int32_t, int64_t, size_t, off_t. */ -#include -#include - - -#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 index 525cd05f..00000000 --- a/nxt/test/lvlhsh_unit_test.c +++ /dev/null @@ -1,276 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) NGINX, Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -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 index ed6dc45d..00000000 --- a/nxt/test/random_unit_test.c +++ /dev/null @@ -1,62 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) NGINX, Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -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 index 8fd9efc7..00000000 --- a/nxt/test/rbtree_unit_test.c +++ /dev/null @@ -1,195 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) NGINX, Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -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); -} diff --git a/njs/njs.h b/src/njs.h similarity index 59% rename from njs/njs.h rename to src/njs.h index e4dbc5d5..f494a7d3 100644 --- a/njs/njs.h +++ b/src/njs.h @@ -9,17 +9,17 @@ #ifndef _NJS_H_INCLUDED_ #define _NJS_H_INCLUDED_ -#include +#include #define NJS_VERSION "0.3.4" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include 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 index 00000000..0c576704 --- /dev/null +++ b/src/njs_alignment.h @@ -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_ */ diff --git a/nxt/nxt_array.c b/src/njs_arr.c similarity index 66% rename from nxt/nxt_array.c rename to src/njs_arr.c index 6d4ecbdd..04f4da68 100644 --- a/nxt/nxt_array.c +++ b/src/njs_arr.c @@ -4,25 +4,25 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include -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 index 00000000..5c81b338 --- /dev/null +++ b/src/njs_arr.h @@ -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_ */ diff --git a/njs/njs_array.c b/src/njs_array.c similarity index 85% rename from njs/njs_array.c rename to src/njs_array.c index dbeb0014..c2852d56 100644 --- a/njs/njs_array.c +++ b/src/njs_array.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include @@ -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), }; diff --git a/njs/njs_array.h b/src/njs_array.h similarity index 95% rename from njs/njs_array.h rename to src/njs_array.h index 326e7210..88f88a8f 100644 --- a/njs/njs_array.h +++ b/src/njs_array.h @@ -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; diff --git a/njs/njs_boolean.c b/src/njs_boolean.c similarity index 86% rename from njs/njs_boolean.c rename to src/njs_boolean.c index 441829d7..e409ec38 100644 --- a/njs/njs_boolean.c +++ b/src/njs_boolean.c @@ -4,11 +4,11 @@ * Copyright (C) NGINX, Inc. */ -#include +#include 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), }; diff --git a/njs/njs_boolean.h b/src/njs_boolean.h similarity index 89% rename from njs/njs_boolean.h rename to src/njs_boolean.h index 9f087537..cf8de9ed 100644 --- a/njs/njs_boolean.h +++ b/src/njs_boolean.h @@ -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; diff --git a/njs/njs_builtin.c b/src/njs_builtin.c similarity index 77% rename from njs/njs_builtin.c rename to src/njs_builtin.c index acdd7a0b..0e50c285 100644 --- a/njs/njs_builtin.c +++ b/src/njs_builtin.c @@ -5,10 +5,10 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include -#include +#include #include #include #include @@ -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), }; diff --git a/njs/njs_builtin.h b/src/njs_builtin.h 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 index 00000000..bbc81f05 --- /dev/null +++ b/src/njs_clang.h @@ -0,0 +1,160 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#ifndef _NJS_CLANG_H_INCLUDED_ +#define _NJS_CLANG_H_INCLUDED_ + + +#include +#include /* offsetof(). */ +#include /* 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 + +#define njs_msan_unpoison(ptr, size) __msan_unpoison(ptr, size) +#endif + + +#endif /* _NJS_CLANG_H_INCLUDED_ */ diff --git a/njs/njs_crypto.c b/src/njs_crypto.c similarity index 73% rename from njs/njs_crypto.c rename to src/njs_crypto.c index cb58b73b..f7835b1a 100644 --- a/njs/njs_crypto.c +++ b/src/njs_crypto.c @@ -4,10 +4,10 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include @@ -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; } } diff --git a/njs/njs_crypto.h b/src/njs_crypto.h similarity index 87% rename from njs/njs_crypto.h rename to src/njs_crypto.h index c45b8775..c9d082fb 100644 --- a/njs/njs_crypto.h +++ b/src/njs_crypto.h @@ -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; diff --git a/njs/njs_date.c b/src/njs_date.c similarity index 87% rename from njs/njs_date.c rename to src/njs_date.c index ea6cd124..8f85f2fb 100644 --- a/njs/njs_date.c +++ b/src/njs_date.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include #include @@ -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), }; diff --git a/njs/njs_date.h b/src/njs_date.h similarity index 91% rename from njs/njs_date.h rename to src/njs_date.h index 38be5a3a..908aec73 100644 --- a/njs/njs_date.h +++ b/src/njs_date.h @@ -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); diff --git a/njs/njs_disassembler.c b/src/njs_disassembler.c similarity index 76% rename from njs/njs_disassembler.c rename to src/njs_disassembler.c index 20181e0f..6dda9a7a 100644 --- a/njs/njs_disassembler.c +++ b/src/njs_disassembler.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include 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 index 00000000..676b6f85 --- /dev/null +++ b/src/njs_diyfp.c @@ -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 +#include +#include +#include + + +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 index 00000000..e7190a7c --- /dev/null +++ b/src/njs_diyfp.h @@ -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 +#include + + +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 index 00000000..77fa34f9 --- /dev/null +++ b/src/njs_djb_hash.c @@ -0,0 +1,48 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#include +#include +#include +#include +#include +#include + + +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 index 00000000..0cfe69a2 --- /dev/null +++ b/src/njs_djb_hash.h @@ -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_ */ diff --git a/nxt/nxt_dtoa.c b/src/njs_dtoa.c similarity index 74% rename from nxt/nxt_dtoa.c rename to src/njs_dtoa.c index ebf74e56..1c3d4453 100644 --- a/nxt/nxt_dtoa.c +++ b/src/njs_dtoa.c @@ -33,19 +33,19 @@ * THE SOFTWARE. */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #include -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 index 00000000..69d2cdec --- /dev/null +++ b/src/njs_dtoa.h @@ -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_ */ diff --git a/njs/njs_error.c b/src/njs_error.c similarity index 85% rename from njs/njs_error.c rename to src/njs_error.c index 245105cc..e2fb16d1 100644 --- a/njs/njs_error.c +++ b/src/njs_error.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include @@ -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), }; diff --git a/njs/njs_error.h b/src/njs_error.h similarity index 89% rename from njs/njs_error.h rename to src/njs_error.h index 05a8ad67..34145f36 100644 --- a/njs/njs_error.h +++ b/src/njs_error.h @@ -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); diff --git a/njs/njs_event.c b/src/njs_event.c similarity index 60% rename from njs/njs_event.c rename to src/njs_event.c index 90f71ed9..a78c5099 100644 --- a/njs/njs_event.c +++ b/src/njs_event.c @@ -4,57 +4,57 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include -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); } } diff --git a/njs/njs_event.h b/src/njs_event.h similarity index 60% rename from njs/njs_event.h rename to src/njs_event.h index 405c607e..64baad86 100644 --- a/njs/njs_event.h +++ b/src/njs_event.h @@ -12,31 +12,31 @@ #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_ */ diff --git a/njs/njs_extern.c b/src/njs_extern.c similarity index 63% rename from njs/njs_extern.c rename to src/njs_extern.c index 6f33fddb..94ed0ff6 100644 --- a/njs/njs_extern.c +++ b/src/njs_extern.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include @@ -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 = ∂ - 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; } diff --git a/njs/njs_extern.h b/src/njs_extern.h similarity index 62% rename from njs/njs_extern.h rename to src/njs_extern.h index 0e00fb4d..c11557b3 100644 --- a/njs/njs_extern.h +++ b/src/njs_extern.h @@ -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_ */ diff --git a/nxt/nxt_file.c b/src/njs_file.c similarity index 76% rename from nxt/nxt_file.c rename to src/njs_file.c index 40edbcc9..e71adb17 100644 --- a/nxt/nxt_file.c +++ b/src/njs_file.c @@ -4,17 +4,17 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include 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 index 00000000..86adfb2c --- /dev/null +++ b/src/njs_file.h @@ -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_ */ diff --git a/njs/njs_fs.c b/src/njs_fs.c similarity index 76% rename from njs/njs_fs.c rename to src/njs_fs.c index be570e21..269f14ad 100644 --- a/njs/njs_fs.c +++ b/src/njs_fs.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include #include @@ -13,31 +13,31 @@ 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), }; diff --git a/njs/njs_fs.h b/src/njs_fs.h similarity index 100% rename from njs/njs_fs.h rename to src/njs_fs.h diff --git a/njs/njs_function.c b/src/njs_function.c similarity index 83% rename from njs/njs_function.c rename to src/njs_function.c index 121225fa..cd2290f5 100644 --- a/njs/njs_function.c +++ b/src/njs_function.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include @@ -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), }; diff --git a/njs/njs_function.h b/src/njs_function.h similarity index 85% rename from njs/njs_function.h rename to src/njs_function.h index 48665db7..adfa136a 100644 --- a/njs/njs_function.h +++ b/src/njs_function.h @@ -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; diff --git a/njs/njs_generator.c b/src/njs_generator.c similarity index 81% rename from njs/njs_generator.c rename to src/njs_generator.c index 845f5f2f..a3f29721 100644 --- a/njs/njs_generator.c +++ b/src/njs_generator.c @@ -5,7 +5,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include @@ -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; } diff --git a/njs/njs_generator.h b/src/njs_generator.h similarity index 80% rename from njs/njs_generator.h rename to src/njs_generator.h index fc1b4067..51128d7a 100644 --- a/njs/njs_generator.h +++ b/src/njs_generator.h @@ -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_ */ diff --git a/njs/njs_json.c b/src/njs_json.c similarity index 83% rename from njs/njs_json.c rename to src/njs_json.c index e08536a6..93bd29ca 100644 --- a/njs/njs_json.c +++ b/src/njs_json.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include #include @@ -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, "e, 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; } diff --git a/njs/njs_json.h b/src/njs_json.h similarity index 100% rename from njs/njs_json.h rename to src/njs_json.h diff --git a/njs/njs_lexer.c b/src/njs_lexer.c similarity index 91% rename from njs/njs_lexer.c rename to src/njs_lexer.c index a05c9a45..7e9b0839 100644 --- a/njs/njs_lexer.c +++ b/src/njs_lexer.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include @@ -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, <->link); + njs_queue_insert_tail(&lexer->preread, <->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, <->link); + njs_queue_insert_head(&lexer->preread, <->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; diff --git a/njs/njs_lexer.h b/src/njs_lexer.h similarity index 92% rename from njs/njs_lexer.h rename to src/njs_lexer.h index a79a5827..78b47adf 100644 --- a/njs/njs_lexer.h +++ b/src/njs_lexer.h @@ -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 index 00000000..b5c556c2 --- /dev/null +++ b/src/njs_lexer_keyword.c @@ -0,0 +1,195 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#include +#include + + +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 index 00000000..090b750b --- /dev/null +++ b/src/njs_lvlhsh.c @@ -0,0 +1,859 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include + + +/* + * 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 index 00000000..b913dcd5 --- /dev/null +++ b/src/njs_lvlhsh.h @@ -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_ */ diff --git a/njs/njs_core.h b/src/njs_main.h similarity index 55% rename from njs/njs_core.h rename to src/njs_main.h index 09186538..77803a08 100644 --- a/njs/njs_core.h +++ b/src/njs_main.h @@ -8,28 +8,28 @@ #define _NJS_CORE_H_INCLUDED_ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include diff --git a/nxt/nxt_malloc.c b/src/njs_malloc.c similarity index 62% rename from nxt/nxt_malloc.c rename to src/njs_malloc.c index 3285fd5e..c3d0a461 100644 --- a/nxt/nxt_malloc.c +++ b/src/njs_malloc.c @@ -4,13 +4,13 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include +#include +#include +#include +#include -#if (NXT_HAVE_POSIX_MEMALIGN) +#if (NJS_HAVE_POSIX_MEMALIGN) /* * posix_memalign() presents in Linux glibc 2.1.91, FreeBSD 7.0, @@ -18,29 +18,29 @@ */ 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 index 00000000..c971e4f8 --- /dev/null +++ b/src/njs_malloc.h @@ -0,0 +1,28 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#ifndef _NJS_MALLOC_H_INCLUDED_ +#define _NJS_MALLOC_H_INCLUDED_ + +#include + +/* + * alloca() is defined in stdlib.h in Linux, FreeBSD and MacOSX + * and in alloca.h in Linux, Solaris and MacOSX. + */ +#if (NJS_SOLARIS) +#include +#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_ */ diff --git a/njs/njs_math.c b/src/njs_math.c similarity index 85% rename from njs/njs_math.c rename to src/njs_math.c index 18fabad9..ebe36d46 100644 --- a/njs/njs_math.c +++ b/src/njs_math.c @@ -4,12 +4,12 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include 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), }; diff --git a/njs/njs_math.h b/src/njs_math.h similarity index 100% rename from njs/njs_math.h rename to src/njs_math.h diff --git a/nxt/nxt_md5.c b/src/njs_md5.c similarity index 91% rename from nxt/nxt_md5.c rename to src/njs_md5.c index 1f488cf6..d21358ea 100644 --- a/nxt/nxt_md5.c +++ b/src/njs_md5.c @@ -6,20 +6,20 @@ */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include -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 index 00000000..23800eed --- /dev/null +++ b/src/njs_md5.h @@ -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_ */ diff --git a/njs/njs_module.c b/src/njs_module.c similarity index 58% rename from njs/njs_module.c rename to src/njs_module.c index ccfb39a4..665dff01 100644 --- a/njs/njs_module.c +++ b/src/njs_module.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include #include @@ -17,35 +17,35 @@ 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, }; diff --git a/njs/njs_module.h b/src/njs_module.h similarity index 67% rename from njs/njs_module.h rename to src/njs_module.h index 97f0a45f..c827fcc0 100644 --- a/njs/njs_module.h +++ b/src/njs_module.h @@ -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; diff --git a/nxt/nxt_mp.c b/src/njs_mp.c similarity index 56% rename from nxt/nxt_mp.c rename to src/njs_mp.c index 18976d37..117002f9 100644 --- a/nxt/nxt_mp.c +++ b/src/njs_mp.c @@ -4,15 +4,15 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -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 index 00000000..846a3604 --- /dev/null +++ b/src/njs_mp.h @@ -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_ */ diff --git a/nxt/nxt_murmur_hash.c b/src/njs_murmur_hash.c similarity index 85% rename from nxt/nxt_murmur_hash.c rename to src/njs_murmur_hash.c index 7b49419c..336f2b75 100644 --- a/nxt/nxt_murmur_hash.c +++ b/src/njs_murmur_hash.c @@ -4,14 +4,14 @@ * released to the public domain. */ -#include -#include -#include -#include +#include +#include +#include +#include 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 index 00000000..2f368be9 --- /dev/null +++ b/src/njs_murmur_hash.h @@ -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_ */ diff --git a/njs/njs_number.c b/src/njs_number.c similarity index 90% rename from njs/njs_number.c rename to src/njs_number.c index d2b89878..bc0837ac 100644 --- a/njs/njs_number.c +++ b/src/njs_number.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include #include @@ -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), }; diff --git a/njs/njs_number.h b/src/njs_number.h similarity index 85% rename from njs/njs_number.h rename to src/njs_number.h index bc47e49a..7b9b1dc7 100644 --- a/njs/njs_number.h +++ b/src/njs_number.h @@ -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); } diff --git a/njs/njs_object.c b/src/njs_object.c similarity index 82% rename from njs/njs_object.c rename to src/njs_object.c index 166ef0d9..ed8cc8ca 100644 --- a/njs/njs_object.c +++ b/src/njs_object.c @@ -4,29 +4,29 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include -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), }; diff --git a/njs/njs_object.h b/src/njs_object.h similarity index 89% rename from njs/njs_object.h rename to src/njs_object.h index 74c3d3ab..8ffddfb3 100644 --- a/njs/njs_object.h +++ b/src/njs_object.h @@ -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 index 00000000..b9d8a7fc --- /dev/null +++ b/src/njs_object_hash.h @@ -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_ */ diff --git a/njs/njs_object_property.c b/src/njs_object_property.c similarity index 81% rename from njs/njs_object_property.c rename to src/njs_object_property.c index 851a7cf9..e1c7bff6 100644 --- a/njs/njs_object_property.c +++ b/src/njs_object_property.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include @@ -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; } diff --git a/njs/njs_parser.c b/src/njs_parser.c similarity index 81% rename from njs/njs_parser.c rename to src/njs_parser.c index 630c1dd1..e527d7d7 100644 --- a/njs/njs_parser.c +++ b/src/njs_parser.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include @@ -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); diff --git a/njs/njs_parser.h b/src/njs_parser.h similarity index 82% rename from njs/njs_parser.h rename to src/njs_parser.h index e754d6d5..70f10c76 100644 --- a/njs/njs_parser.h +++ b/src/njs_parser.h @@ -11,22 +11,22 @@ 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_ */ diff --git a/njs/njs_parser_expression.c b/src/njs_parser_expression.c similarity index 87% rename from njs/njs_parser_expression.c rename to src/njs_parser_expression.c index d66b2022..b09d3e6b 100644 --- a/njs/njs_parser_expression.c +++ b/src/njs_parser_expression.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include @@ -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; } diff --git a/njs/njs_parser_terminal.c b/src/njs_parser_terminal.c similarity index 80% rename from njs/njs_parser_terminal.c rename to src/njs_parser_terminal.c index c064d5a9..88b11e60 100644 --- a/njs/njs_parser_terminal.c +++ b/src/njs_parser_terminal.c @@ -4,29 +4,29 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include 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: diff --git a/nxt/nxt_pcre.c b/src/njs_pcre.c similarity index 58% rename from nxt/nxt_pcre.c rename to src/njs_pcre.c index 66fee8b4..92ca3a53 100644 --- a/nxt/nxt_pcre.c +++ b/src/njs_pcre.c @@ -4,40 +4,40 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #include -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, ®ex->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, ®ex->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, ®ex->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, ®ex->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; } diff --git a/nxt/nxt_pcre.h b/src/njs_pcre.h similarity index 75% rename from nxt/nxt_pcre.h rename to src/njs_pcre.h index c0cfb8d9..41b8f075 100644 --- a/nxt/nxt_pcre.h +++ b/src/njs_pcre.h @@ -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 -#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 index 00000000..c2ae412d --- /dev/null +++ b/src/njs_queue.c @@ -0,0 +1,87 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#include +#include +#include +#include + + +/* + * 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); + } +} diff --git a/nxt/nxt_queue.h b/src/njs_queue.h similarity index 69% rename from nxt/nxt_queue.h rename to src/njs_queue.h index 3a8a5ba9..0fab9e1b 100644 --- a/nxt/nxt_queue.h +++ b/src/njs_queue.h @@ -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_ */ diff --git a/nxt/nxt_random.c b/src/njs_random.c similarity index 58% rename from nxt/nxt_random.c rename to src/njs_random.c index 9e4b8654..cbfd07b2 100644 --- a/nxt/nxt_random.c +++ b/src/njs_random.c @@ -5,19 +5,19 @@ */ -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include -#if (NXT_HAVE_GETRANDOM) +#if (NJS_HAVE_GETRANDOM) #include -#elif (NXT_HAVE_LINUX_SYS_GETRANDOM) +#elif (NJS_HAVE_LINUX_SYS_GETRANDOM) #include #include -#elif (NXT_HAVE_GETENTROPY_SYS_RANDOM) +#elif (NJS_HAVE_GETENTROPY_SYS_RANDOM) #include #endif @@ -25,20 +25,20 @@ /* * 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 index 00000000..8e8931b7 --- /dev/null +++ b/src/njs_random.h @@ -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_ */ diff --git a/nxt/nxt_rbtree.c b/src/njs_rbtree.c similarity index 54% rename from nxt/nxt_rbtree.c rename to src/njs_rbtree.c index 90d3a55a..c856121e 100644 --- a/nxt/nxt_rbtree.c +++ b/src/njs_rbtree.c @@ -4,10 +4,10 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include +#include +#include +#include +#include /* @@ -16,33 +16,33 @@ */ -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 index 00000000..244343d7 --- /dev/null +++ b/src/njs_rbtree.h @@ -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 index 00000000..fab19cdf --- /dev/null +++ b/src/njs_regex.h @@ -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_ */ diff --git a/njs/njs_regexp.c b/src/njs_regexp.c similarity index 80% rename from njs/njs_regexp.c rename to src/njs_regexp.c index 7fdd5b9b..f6e35f63 100644 --- a/njs/njs_regexp.c +++ b/src/njs_regexp.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include @@ -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(®exp->object.hash); - nxt_lvlhsh_init(®exp->object.shared_hash); + if (njs_fast_path(regexp != NULL)) { + njs_lvlhsh_init(®exp->object.hash); + njs_lvlhsh_init(®exp->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, ®exp->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), }; diff --git a/njs/njs_regexp.h b/src/njs_regexp.h similarity index 80% rename from njs/njs_regexp.h rename to src/njs_regexp.h index 42ed4263..22cde6a9 100644 --- a/njs/njs_regexp.h +++ b/src/njs_regexp.h @@ -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); diff --git a/njs/njs_regexp_pattern.h b/src/njs_regexp_pattern.h similarity index 93% rename from njs/njs_regexp_pattern.h rename to src/njs_regexp_pattern.h index 9d160e11..12228df1 100644 --- a/njs/njs_regexp_pattern.h +++ b/src/njs_regexp_pattern.h @@ -7,8 +7,8 @@ #ifndef _NJS_REGEXP_PATTERN_H_INCLUDED_ #define _NJS_REGEXP_PATTERN_H_INCLUDED_ -#include -#include +#include +#include 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 diff --git a/nxt/nxt_sha1.c b/src/njs_sha1.c similarity index 92% rename from nxt/nxt_sha1.c rename to src/njs_sha1.c index 500b47ef..79abb603 100644 --- a/nxt/nxt_sha1.c +++ b/src/njs_sha1.c @@ -7,20 +7,20 @@ */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include -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 index 00000000..1bbd94ed --- /dev/null +++ b/src/njs_sha1.h @@ -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_ */ diff --git a/nxt/nxt_sha2.c b/src/njs_sha2.c similarity index 92% rename from nxt/nxt_sha2.c rename to src/njs_sha2.c index 58243952..7b1bf93d 100644 --- a/nxt/nxt_sha2.c +++ b/src/njs_sha2.c @@ -7,20 +7,20 @@ */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include -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 index 00000000..5a82a8da --- /dev/null +++ b/src/njs_sha2.h @@ -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_ */ diff --git a/njs/njs_shell.c b/src/njs_shell.c similarity index 69% rename from njs/njs_shell.c rename to src/njs_shell.c index 21063e49..6284757f 100644 --- a/njs/njs_shell.c +++ b/src/njs_shell.c @@ -5,7 +5,7 @@ */ -#include +#include #include #include #include @@ -17,13 +17,13 @@ #include #include -#if (NXT_HAVE_EDITLINE) +#if (NJS_HAVE_EDITLINE) #include -#elif (NXT_HAVE_EDIT_READLINE) +#elif (NJS_HAVE_EDIT_READLINE) #include #else #include -#if (NXT_HAVE_GNU_READLINE) +#if (NJS_HAVE_GNU_READLINE) #include #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" " | - 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. -> the properties and prototype methods of v.\n"); - nxt_printf("type console.help() for more information\n\n"); + njs_printf("v. -> 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); } diff --git a/nxt/nxt_sprintf.c b/src/njs_sprintf.c similarity index 79% rename from nxt/nxt_sprintf.c rename to src/njs_sprintf.c index 442e5594..7ac863d2 100644 --- a/nxt/nxt_sprintf.c +++ b/src/njs_sprintf.c @@ -4,12 +4,12 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #include @@ -19,12 +19,12 @@ /* * 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 @@ -51,13 +51,13 @@ 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 index 00000000..7a44a32f --- /dev/null +++ b/src/njs_sprintf.h @@ -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_ */ diff --git a/nxt/nxt_string.h b/src/njs_str.h similarity index 63% rename from nxt/nxt_string.h rename to src/njs_str.h index d7c92024..5bc013de 100644 --- a/nxt/nxt_string.h +++ b/src/njs_str.h @@ -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: /* */ @@ -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_ */ diff --git a/njs/njs_string.c b/src/njs_string.c similarity index 86% rename from njs/njs_string.c rename to src/njs_string.c index 218d39fa..5cc11d1d 100644 --- a/njs/njs_string.c +++ b/src/njs_string.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include #include @@ -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), }; diff --git a/njs/njs_string.h b/src/njs_string.h similarity index 90% rename from njs/njs_string.h rename to src/njs_string.h index 135e8a3b..e5525502 100644 --- a/njs/njs_string.h +++ b/src/njs_string.h @@ -7,7 +7,7 @@ #ifndef _NJS_STRING_H_INCLUDED_ #define _NJS_STRING_H_INCLUDED_ -#include +#include /* * nJSVM supports two string variants: @@ -39,10 +39,10 @@ */ #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; diff --git a/nxt/nxt_strtod.c b/src/njs_strtod.c similarity index 63% rename from nxt/nxt_strtod.c rename to src/njs_strtod.c index e1da6cce..9fd8cbf1 100644 --- a/nxt/nxt_strtod.c +++ b/src/njs_strtod.c @@ -7,11 +7,11 @@ * that can be found in the LICENSE file. */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include /* * Max double: 1.7976931348623157 x 10^308 @@ -22,11 +22,11 @@ * 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 index 00000000..42e3e652 --- /dev/null +++ b/src/njs_strtod.h @@ -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 index 00000000..f114ab6a --- /dev/null +++ b/src/njs_stub.h @@ -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 +#define njs_pagesize() getpagesize() + + +#endif /* _NJS_STUB_H_INCLUDED_ */ diff --git a/nxt/nxt_time.c b/src/njs_time.c similarity index 72% rename from nxt/nxt_time.c rename to src/njs_time.c index 635d791b..cdca7e89 100644 --- a/nxt/nxt_time.c +++ b/src/njs_time.c @@ -4,18 +4,18 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include +#include +#include +#include +#include #include #include 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 index 00000000..d3751206 --- /dev/null +++ b/src/njs_time.h @@ -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_ */ diff --git a/njs/njs_time.c b/src/njs_timer.c similarity index 67% rename from njs/njs_time.c rename to src/njs_timer.c index 84598446..60b37d02 100644 --- a/njs/njs_time.c +++ b/src/njs_timer.c @@ -4,32 +4,32 @@ * Copyright (C) NGINX, Inc. */ -#include -#include +#include +#include #include 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, }; diff --git a/njs/njs_time.h b/src/njs_timer.h similarity index 65% rename from njs/njs_time.h rename to src/njs_timer.h index 868719e4..e8c7e9af 100644 --- a/njs/njs_time.h +++ b/src/njs_timer.h @@ -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_ */ diff --git a/nxt/nxt_trace.c b/src/njs_trace.c similarity index 58% rename from nxt/nxt_trace.c rename to src/njs_trace.c index 36285310..9b8c19cc 100644 --- a/nxt/nxt_trace.c +++ b/src/njs_trace.c @@ -4,22 +4,22 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include 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) { diff --git a/nxt/nxt_trace.h b/src/njs_trace.h similarity index 51% rename from nxt/nxt_trace.h rename to src/njs_trace.h index 26019785..ed32c1a3 100644 --- a/nxt/nxt_trace.h +++ b/src/njs_trace.h @@ -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 index 00000000..d0fd4bc3 --- /dev/null +++ b/src/njs_types.h @@ -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 . + */ +#define _FILE_OFFSET_BITS 64 + +/* u_char, u_int, int8_t, int32_t, int64_t, size_t, off_t. */ +#include +#include + + +#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_ */ diff --git a/nxt/nxt_unicode_lower_case.h b/src/njs_unicode_lower_case.h similarity index 92% rename from nxt/nxt_unicode_lower_case.h rename to src/njs_unicode_lower_case.h index d5b5cdbe..de6b8f07 100644 --- a/nxt/nxt_unicode_lower_case.h +++ b/src/njs_unicode_lower_case.h @@ -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, }; diff --git a/nxt/nxt_unicode_lower_case.pl b/src/njs_unicode_lower_case.pl similarity index 83% rename from nxt/nxt_unicode_lower_case.pl rename to src/njs_unicode_lower_case.pl index 78f86858..51272e31 100755 --- a/nxt/nxt_unicode_lower_case.pl +++ b/src/njs_unicode_lower_case.pl @@ -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"; diff --git a/nxt/nxt_unicode_upper_case.h b/src/njs_unicode_upper_case.h similarity index 92% rename from nxt/nxt_unicode_upper_case.h rename to src/njs_unicode_upper_case.h index c0d977c6..ea3b2950 100644 --- a/nxt/nxt_unicode_upper_case.h +++ b/src/njs_unicode_upper_case.h @@ -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, }; diff --git a/nxt/nxt_unicode_upper_case.pl b/src/njs_unicode_upper_case.pl similarity index 83% rename from nxt/nxt_unicode_upper_case.pl rename to src/njs_unicode_upper_case.pl index 05d2260a..faa290cd 100755 --- a/nxt/nxt_unicode_upper_case.pl +++ b/src/njs_unicode_upper_case.pl @@ -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"; diff --git a/nxt/nxt_unix.h b/src/njs_unix.h similarity index 60% rename from nxt/nxt_unix.h rename to src/njs_unix.h index bf45fd15..10bdbacd 100644 --- a/nxt/nxt_unix.h +++ b/src/njs_unix.h @@ -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_ */ diff --git a/nxt/nxt_utf8.c b/src/njs_utf8.c similarity index 67% rename from nxt/nxt_utf8.c rename to src/njs_utf8.c index 8bf90b45..bb697fe3 100644 --- a/nxt/nxt_utf8.c +++ b/src/njs_utf8.c @@ -4,29 +4,29 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include +#include +#include +#include +#include /* - * 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 -#include +#include +#include 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; } } diff --git a/nxt/nxt_utf8.h b/src/njs_utf8.h similarity index 61% rename from nxt/nxt_utf8.h rename to src/njs_utf8.h index db1a865e..303a0b92 100644 --- a/nxt/nxt_utf8.h +++ b/src/njs_utf8.h @@ -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_ /* @@ -13,39 +13,39 @@ * 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: /* */ @@ -159,4 +159,4 @@ nxt_utf8_is_whitespace(uint32_t c) } -#endif /* _NXT_UTF8_H_INCLUDED_ */ +#endif /* _NJS_UTF8_H_INCLUDED_ */ diff --git a/njs/njs_value.c b/src/njs_value.c similarity index 92% rename from njs/njs_value.c rename to src/njs_value.c index 0d2203a1..11f3ef53 100644 --- a/njs/njs_value.c +++ b/src/njs_value.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include @@ -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); diff --git a/njs/njs_value.h b/src/njs_value.h similarity index 94% rename from njs/njs_value.h rename to src/njs_value.h index cb5e1864..36f02c66 100644 --- a/njs/njs_value.h +++ b/src/njs_value.h @@ -8,12 +8,12 @@ #define _NJS_VALUE_H_INCLUDED_ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include @@ -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) { diff --git a/njs/njs_variable.c b/src/njs_variable.c similarity index 68% rename from njs/njs_variable.c rename to src/njs_variable.c index 0ed753ac..a5ab01ee 100644 --- a/njs/njs_variable.c +++ b/src/njs_variable.c @@ -5,38 +5,38 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include 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; diff --git a/njs/njs_variable.h b/src/njs_variable.h similarity index 74% rename from njs/njs_variable.h rename to src/njs_variable.h index f5fc9db0..6af6f72d 100644 --- a/njs/njs_variable.h +++ b/src/njs_variable.h @@ -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_ */ diff --git a/njs/njs_vm.c b/src/njs_vm.c similarity index 66% rename from njs/njs_vm.c rename to src/njs_vm.c index 29551142..ea3edab7 100644 --- a/njs/njs_vm.c +++ b/src/njs_vm.c @@ -4,26 +4,26 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include -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); } diff --git a/njs/njs_vm.h b/src/njs_vm.h similarity index 83% rename from njs/njs_vm.h rename to src/njs_vm.h index 8e11bedb..80fdc7b0 100644 --- a/njs/njs_vm.h +++ b/src/njs_vm.h @@ -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_ */ diff --git a/njs/njs_vmcode.c b/src/njs_vmcode.c similarity index 89% rename from njs/njs_vmcode.c rename to src/njs_vmcode.c index 4093c266..2985822a 100644 --- a/njs/njs_vmcode.c +++ b/src/njs_vmcode.c @@ -4,7 +4,7 @@ * Copyright (C) NGINX, Inc. */ -#include +#include #include #include @@ -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; diff --git a/njs/njs_vmcode.h b/src/njs_vmcode.h similarity index 97% rename from njs/njs_vmcode.h rename to src/njs_vmcode.h index 10124cc5..ff08a32a 100644 --- a/njs/njs_vmcode.h +++ b/src/njs_vmcode.h @@ -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 index 00000000..2a94d0d4 --- /dev/null +++ b/src/test/lvlhsh_unit_test.c @@ -0,0 +1,276 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +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); +} diff --git a/njs/test/njs_benchmark.c b/src/test/njs_benchmark.c similarity index 70% rename from njs/test/njs_benchmark.c rename to src/test/njs_benchmark.c index 649a08f4..4dccfa27 100644 --- a/njs/test/njs_benchmark.c +++ b/src/test/njs_benchmark.c @@ -7,42 +7,42 @@ #include #include #include -#include +#include #include #include -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; } diff --git a/njs/test/njs_interactive_test.c b/src/test/njs_interactive_test.c similarity index 52% rename from njs/test/njs_interactive_test.c rename to src/test/njs_interactive_test.c index 185825e4..b4321a0b 100644 --- a/njs/test/njs_interactive_test.c +++ b/src/test/njs_interactive_test.c @@ -6,14 +6,14 @@ #include #include -#include +#include #include #include 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 index 00000000..6914b713 --- /dev/null +++ b/src/test/njs_unit_test.c @@ -0,0 +1,14690 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +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'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("[,undefined,]") }, + + { 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 = /(?[0-9]{2})\\/(?[0-9]{2})\\/(?[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 = /(?(?no)?(?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,,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,,2,{c:[Boolean: true]}]}") }, + + { njs_str("njs.dump(Array.prototype.slice.call({'1':'b', length:2}))"), + njs_str("[,'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 index 00000000..2e3d8335 --- /dev/null +++ b/src/test/random_unit_test.c @@ -0,0 +1,62 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +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 index 00000000..d3d141a5 --- /dev/null +++ b/src/test/rbtree_unit_test.c @@ -0,0 +1,195 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +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); +} diff --git a/nxt/test/utf8_unit_test.c b/src/test/utf8_unit_test.c similarity index 60% rename from nxt/test/utf8_unit_test.c rename to src/test/utf8_unit_test.c index 0e66262e..f82c02db 100644 --- a/nxt/test/utf8_unit_test.c +++ b/src/test/utf8_unit_test.c @@ -4,18 +4,18 @@ * Copyright (C) NGINX, Inc. */ -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include -#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; diff --git a/njs/test/fs/ascii b/test/fs/ascii similarity index 100% rename from njs/test/fs/ascii rename to test/fs/ascii diff --git a/njs/test/fs/non_utf8 b/test/fs/non_utf8 similarity index 100% rename from njs/test/fs/non_utf8 rename to test/fs/non_utf8 diff --git a/njs/test/fs/utf8 b/test/fs/utf8 similarity index 100% rename from njs/test/fs/utf8 rename to test/fs/utf8 diff --git a/njs/test/inputrc b/test/inputrc similarity index 100% rename from njs/test/inputrc rename to test/inputrc diff --git a/njs/test/module/declaration_exception.js b/test/module/declaration_exception.js similarity index 100% rename from njs/test/module/declaration_exception.js rename to test/module/declaration_exception.js diff --git a/njs/test/module/empty.js b/test/module/empty.js similarity index 100% rename from njs/test/module/empty.js rename to test/module/empty.js diff --git a/njs/test/module/exception.js b/test/module/exception.js similarity index 100% rename from njs/test/module/exception.js rename to test/module/exception.js diff --git a/njs/test/module/export.js b/test/module/export.js similarity index 100% rename from njs/test/module/export.js rename to test/module/export.js diff --git a/njs/test/module/export_expression.js b/test/module/export_expression.js similarity index 100% rename from njs/test/module/export_expression.js rename to test/module/export_expression.js diff --git a/njs/test/module/export_expression2.js b/test/module/export_expression2.js similarity index 100% rename from njs/test/module/export_expression2.js rename to test/module/export_expression2.js diff --git a/njs/test/module/export_name.js b/test/module/export_name.js similarity index 100% rename from njs/test/module/export_name.js rename to test/module/export_name.js diff --git a/njs/test/module/export_non_default.js b/test/module/export_non_default.js similarity index 100% rename from njs/test/module/export_non_default.js rename to test/module/export_non_default.js diff --git a/njs/test/module/lib1.js b/test/module/lib1.js similarity index 100% rename from njs/test/module/lib1.js rename to test/module/lib1.js diff --git a/njs/test/module/lib2.js b/test/module/lib2.js similarity index 100% rename from njs/test/module/lib2.js rename to test/module/lib2.js diff --git a/njs/test/module/lib3.js b/test/module/lib3.js similarity index 100% rename from njs/test/module/lib3.js rename to test/module/lib3.js diff --git a/njs/test/module/libs/hash.js b/test/module/libs/hash.js similarity index 100% rename from njs/test/module/libs/hash.js rename to test/module/libs/hash.js diff --git a/njs/test/module/loading_exception.js b/test/module/loading_exception.js similarity index 100% rename from njs/test/module/loading_exception.js rename to test/module/loading_exception.js diff --git a/njs/test/module/normal.js b/test/module/normal.js similarity index 100% rename from njs/test/module/normal.js rename to test/module/normal.js diff --git a/njs/test/module/recursive.js b/test/module/recursive.js similarity index 100% rename from njs/test/module/recursive.js rename to test/module/recursive.js diff --git a/njs/test/module/ref_exception.js b/test/module/ref_exception.js similarity index 100% rename from njs/test/module/ref_exception.js rename to test/module/ref_exception.js diff --git a/njs/test/module/return.js b/test/module/return.js similarity index 100% rename from njs/test/module/return.js rename to test/module/return.js diff --git a/njs/test/module/sub/sub1.js b/test/module/sub/sub1.js similarity index 100% rename from njs/test/module/sub/sub1.js rename to test/module/sub/sub1.js diff --git a/njs/test/module/sub/sub2.js b/test/module/sub/sub2.js similarity index 100% rename from njs/test/module/sub/sub2.js rename to test/module/sub/sub2.js diff --git a/njs/test/njs_expect_test.exp b/test/njs_expect_test.exp similarity index 79% rename from njs/test/njs_expect_test.exp rename to test/njs_expect_test.exp index 9ff3fb5a..491a3117 100644 --- a/njs/test/njs_expect_test.exp +++ b/test/njs_expect_test.exp @@ -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