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.
$echo checking for C compiler: $CC
-cat << END >> $NXT_AUTOCONF_ERR
+cat << END >> $NJS_AUTOCONF_ERR
----------------------------------------
checking for C compiler: $CC
END
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
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"
;;
*)
# 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;
. 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;
}
. 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;
}
. 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;
. auto/feature
-nxt_feature="GCC __attribute__ malloc"
-nxt_feature_name=NXT_HAVE_GCC_ATTRIBUTE_MALLOC
-nxt_feature_run=no
-nxt_feature_path=
-nxt_feature_libs=
-nxt_feature_test="#include <stdlib.h>
+njs_feature="GCC __attribute__ malloc"
+njs_feature_name=NJS_HAVE_GCC_ATTRIBUTE_MALLOC
+njs_feature_run=no
+njs_feature_path=
+njs_feature_libs=
+njs_feature_test="#include <stdlib.h>
void *f(void) __attribute__ ((__malloc__));
. 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;
. auto/feature
-nxt_feature="Memory sanitizer"
-nxt_feature_name=NXT_HAVE_MEMORY_SANITIZER
-nxt_feature_run=yes
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <sanitizer/msan_interface.h>
+njs_feature="Memory sanitizer"
+njs_feature_name=NJS_HAVE_MEMORY_SANITIZER
+njs_feature_run=yes
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <sanitizer/msan_interface.h>
int main(int argc, char *argv[]) {
__msan_unpoison(argv, sizeof(char *));
return 0;
. auto/feature
-nxt_feature="NAN to uint conversion"
-nxt_feature_name=NXT_NAN_TO_UINT_CONVERSION
-nxt_feature_run=value
-nxt_feature_incs=
-nxt_feature_libs=-lm
-nxt_feature_test="#include <math.h>
+njs_feature="NAN to uint conversion"
+njs_feature_name=NJS_NAN_TO_UINT_CONVERSION
+njs_feature_run=value
+njs_feature_incs=
+njs_feature_libs=-lm
+njs_feature_test="#include <math.h>
#include <stdio.h>
#include <stdint.h>
# 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
# 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 ""
}
;;
# 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`"
$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"
# Linux (glibc and musl from 1.1.20), OpenBSD and FreeBSD.
-nxt_feature="explicit_bzero()"
-nxt_feature_name=NXT_HAVE_EXPLICIT_BZERO
-nxt_feature_run=yes
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <strings.h>
+njs_feature="explicit_bzero()"
+njs_feature_name=NJS_HAVE_EXPLICIT_BZERO
+njs_feature_run=yes
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <strings.h>
#include <string.h>
int main(void) {
. auto/feature
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
# NetBSD has explicit_memset instead.
- nxt_feature="explicit_memset()"
- nxt_feature_name=NXT_HAVE_EXPLICIT_MEMSET
- nxt_feature_test="#include <string.h>
+ njs_feature="explicit_memset()"
+ njs_feature_name=NJS_HAVE_EXPLICIT_MEMSET
+ njs_feature_test="#include <string.h>
int main(void) {
int r;
# 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
;;
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
*)
$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
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*
# Linux 3.17 with glibc 2.25, FreeBSD 12, Solaris 11.3.
-nxt_feature="getrandom()"
-nxt_feature_name=NXT_HAVE_GETRANDOM
-nxt_feature_run=yes
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <unistd.h>
+njs_feature="getrandom()"
+njs_feature_name=NJS_HAVE_GETRANDOM
+njs_feature_run=yes
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <unistd.h>
#include <sys/random.h>
int main(void) {
. auto/feature
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
# Linux 3.17 SYS_getrandom.
- nxt_feature="SYS_getrandom in Linux"
- nxt_feature_name=NXT_HAVE_LINUX_SYS_GETRANDOM
- nxt_feature_test="#include <unistd.h>
+ njs_feature="SYS_getrandom in Linux"
+ njs_feature_name=NJS_HAVE_LINUX_SYS_GETRANDOM
+ njs_feature_test="#include <unistd.h>
#include <sys/syscall.h>
#include <linux/random.h>
fi
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
# OpenBSD 5.6 lacks <sys/random.h>.
- nxt_feature="getentropy()"
- nxt_feature_name=NXT_HAVE_GETENTROPY
- nxt_feature_test="#include <unistd.h>
+ njs_feature="getentropy()"
+ njs_feature_name=NJS_HAVE_GETENTROPY
+ njs_feature_test="#include <unistd.h>
int main(void) {
char buf[4];
fi
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
# macOS 10.12.
- nxt_feature="getentropy() in sys/random.h"
- nxt_feature_name=NXT_HAVE_GETENTROPY_SYS_RANDOM
- nxt_feature_test="#include <unistd.h>
+ njs_feature="getentropy() in sys/random.h"
+ njs_feature_name=NJS_HAVE_GETENTROPY_SYS_RANDOM
+ njs_feature_test="#include <unistd.h>
#include <sys/random.h>
int main(void) {
. 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
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
# 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
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
# 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} \\
# 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
# Linux glibc 2.1.91, FreeBSD 7.0, Solaris 11,
# MacOSX 10.6 (Snow Leopard), NetBSD 5.0.
-nxt_feature="posix_memalign()"
-nxt_feature_name=NXT_HAVE_POSIX_MEMALIGN
-nxt_feature_run=yes
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <stdlib.h>
+njs_feature="posix_memalign()"
+njs_feature_name=NJS_HAVE_POSIX_MEMALIGN
+njs_feature_run=yes
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <stdlib.h>
int main(void) {
void *p;
. auto/feature
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
# Solaris, HP-UX.
- nxt_feature="memalign()"
- nxt_feature_name=NXT_HAVE_MEMALIGN
- nxt_feature_run=yes
- nxt_feature_incs=
- nxt_feature_libs=
- nxt_feature_test="#include <stdlib.h>
+ njs_feature="memalign()"
+ njs_feature_name=NJS_HAVE_MEMALIGN
+ njs_feature_run=yes
+ njs_feature_incs=
+ njs_feature_libs=
+ njs_feature_test="#include <stdlib.h>
int main(void) {
void *p;
# 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
;;
*)
- 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
# Copyright (C) NGINX, Inc.
-NXT_PCRE_CFLAGS=
-NXT_PCRE_LIB=
+NJS_PCRE_CFLAGS=
+NJS_PCRE_LIB=
-nxt_found=no
+njs_found=no
-if /bin/sh -c "(pcre-config --version)" >> $NXT_AUTOCONF_ERR 2>&1; then
+if /bin/sh -c "(pcre-config --version)" >> $NJS_AUTOCONF_ERR 2>&1; then
- NXT_PCRE_CFLAGS=`pcre-config --cflags`
- NXT_PCRE_LIB=`pcre-config --libs`
+ NJS_PCRE_CFLAGS=`pcre-config --cflags`
+ NJS_PCRE_LIB=`pcre-config --libs`
- nxt_feature="PCRE library"
- nxt_feature_name=NXT_HAVE_PCRE
- nxt_feature_run=no
- nxt_feature_incs=$NXT_PCRE_CFLAGS
- nxt_feature_libs=$NXT_PCRE_LIB
- nxt_feature_test="#include <pcre.h>
+ njs_feature="PCRE library"
+ njs_feature_name=NJS_HAVE_PCRE
+ njs_feature_run=no
+ njs_feature_incs=$NJS_PCRE_CFLAGS
+ njs_feature_libs=$NJS_PCRE_LIB
+ njs_feature_test="#include <pcre.h>
int main(void) {
pcre *re;
. auto/feature
fi
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
$echo
$echo $0: error: no PCRE library found.
$echo
# Copyright (C) NGINX, Inc.
-NXT_READLINE_LIB=
+NJS_READLINE_LIB=
-nxt_found=no
+njs_found=no
-nxt_feature="GNU readline library"
-nxt_feature_name=NXT_HAVE_GNU_READLINE
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs="-lreadline"
-nxt_feature_test="#include <stdio.h>
+njs_feature="GNU readline library"
+njs_feature_name=NJS_HAVE_GNU_READLINE
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs="-lreadline"
+njs_feature_test="#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>
}"
. auto/feature
-if [ $nxt_found = no ]; then
- nxt_feature="editline library in editline/readline.h"
- nxt_feature_name=NXT_HAVE_EDITLINE
- nxt_feature_libs="-ledit"
- nxt_feature_test="#include <stdio.h>
+if [ $njs_found = no ]; then
+ njs_feature="editline library in editline/readline.h"
+ njs_feature_name=NJS_HAVE_EDITLINE
+ njs_feature_libs="-ledit"
+ njs_feature_test="#include <stdio.h>
#include <editline/readline.h>
int main(void) {
. auto/feature
fi
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
# FreeBSD port
- nxt_feature_name=NXT_HAVE_EDIT_READLINE
- nxt_feature="editline in edit/readline/readline.h"
- nxt_feature_test="#include <stdio.h>
+ njs_feature_name=NJS_HAVE_EDIT_READLINE
+ njs_feature="editline in edit/readline/readline.h"
+ njs_feature_test="#include <stdio.h>
#include <edit/readline/readline.h>
int main(void) {
. auto/feature
fi
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
# NetBSD
- nxt_feature_name=NXT_HAVE_NETBSD_READLINE
- nxt_feature="editline in readline/readline.h"
- nxt_feature_test="#include <stdio.h>
+ njs_feature_name=NJS_HAVE_NETBSD_READLINE
+ njs_feature="editline in readline/readline.h"
+ njs_feature_test="#include <stdio.h>
#include <readline/readline.h>
int main(void) {
. 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
-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 \
"
# Copyright (C) NGINX, Inc.
-nxt_feature="clock_gettime(CLOCK_MONOTONIC)"
-nxt_feature_name=NXT_HAVE_CLOCK_MONOTONIC
-nxt_feature_run=yes
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <time.h>
+njs_feature="clock_gettime(CLOCK_MONOTONIC)"
+njs_feature_name=NJS_HAVE_CLOCK_MONOTONIC
+njs_feature_run=yes
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <time.h>
int main() {
struct timespec ts;
. auto/feature
-if [ $nxt_found = no ]; then
+if [ $njs_found = no ]; then
# Linux and Solaris 10 clock_gettime() are in librt.
- nxt_feature="clock_gettime(CLOCK_MONOTONIC) in librt"
- nxt_feature_libs="-lrt"
+ njs_feature="clock_gettime(CLOCK_MONOTONIC) in librt"
+ njs_feature_libs="-lrt"
. auto/feature
- if [ $nxt_found = yes ]; then
- NXT_LIBRT="-lrt"
+ if [ $njs_found = yes ]; then
+ NJS_LIBRT="-lrt"
fi
fi
# Linux, FreeBSD, MacOSX.
-nxt_feature="struct tm.tm_gmtoff"
-nxt_feature_name=NXT_HAVE_TM_GMTOFF
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <time.h>
+njs_feature="struct tm.tm_gmtoff"
+njs_feature_name=NJS_HAVE_TM_GMTOFF
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <time.h>
int main(void) {
time_t t;
# Solaris
-nxt_feature="altzone"
-nxt_feature_name=NXT_HAVE_ALTZONE
-nxt_feature_run=no
-nxt_feature_incs=
-nxt_feature_libs=
-nxt_feature_test="#include <time.h>
+njs_feature="altzone"
+njs_feature_name=NJS_HAVE_ALTZONE
+njs_feature_run=no
+njs_feature_incs=
+njs_feature_libs=
+njs_feature_test="#include <time.h>
int main(void) {
altzone = 0;
# 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
. 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
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"
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"
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);
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);
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);
static njs_external_t ngx_http_js_ext_request[] = {
- { nxt_string("uri"),
+ { njs_str("uri"),
NJS_EXTERN_PROPERTY,
NULL,
0,
NULL,
offsetof(ngx_http_request_t, uri) },
- { nxt_string("method"),
+ { njs_str("method"),
NJS_EXTERN_PROPERTY,
NULL,
0,
NULL,
offsetof(ngx_http_request_t, method_name) },
- { nxt_string("httpVersion"),
+ { njs_str("httpVersion"),
NJS_EXTERN_PROPERTY,
NULL,
0,
NULL,
0 },
- { nxt_string("remoteAddress"),
+ { njs_str("remoteAddress"),
NJS_EXTERN_PROPERTY,
NULL,
0,
NULL,
0 },
- { nxt_string("parent"),
+ { njs_str("parent"),
NJS_EXTERN_PROPERTY,
NULL,
0,
NULL,
0 },
- { nxt_string("requestBody"),
+ { njs_str("requestBody"),
NJS_EXTERN_PROPERTY,
NULL,
0,
NULL,
0 },
- { nxt_string("responseBody"),
+ { njs_str("responseBody"),
NJS_EXTERN_PROPERTY,
NULL,
0,
NULL,
0 },
- { nxt_string("headersIn"),
+ { njs_str("headersIn"),
NJS_EXTERN_OBJECT,
NULL,
0,
NULL,
0 },
- { nxt_string("args"),
+ { njs_str("args"),
NJS_EXTERN_OBJECT,
NULL,
0,
NULL,
0 },
- { nxt_string("variables"),
+ { njs_str("variables"),
NJS_EXTERN_OBJECT,
NULL,
0,
NULL,
0 },
- { nxt_string("status"),
+ { njs_str("status"),
NJS_EXTERN_PROPERTY,
NULL,
0,
NULL,
offsetof(ngx_http_request_t, headers_out.status) },
- { nxt_string("headersOut"),
+ { njs_str("headersOut"),
NJS_EXTERN_OBJECT,
NULL,
0,
NULL,
0 },
- { nxt_string("subrequest"),
+ { njs_str("subrequest"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_http_js_ext_subrequest,
0 },
- { nxt_string("log"),
+ { njs_str("log"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_http_js_ext_log,
0 },
- { nxt_string("warn"),
+ { njs_str("warn"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_http_js_ext_warn,
0 },
- { nxt_string("error"),
+ { njs_str("error"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_http_js_ext_error,
0 },
- { nxt_string("sendHeader"),
+ { njs_str("sendHeader"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_http_js_ext_send_header,
0 },
- { nxt_string("send"),
+ { njs_str("send"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_http_js_ext_send,
0 },
- { nxt_string("finish"),
+ { njs_str("finish"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_http_js_ext_finish,
0 },
- { nxt_string("return"),
+ { njs_str("return"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_http_js_ext_return,
0 },
- { nxt_string("internalRedirect"),
+ { njs_str("internalRedirect"),
NJS_EXTERN_METHOD,
NULL,
0,
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,
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;
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;
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;
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;
}
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)
{
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)
{
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)
{
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)
{
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);
}
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;
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;
}
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;
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;
}
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;
}
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;
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;
}
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;
}
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);
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);
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);
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;
}
ret = njs_vm_value_string_set(vm, request_body, body, len);
- if (ret != NXT_OK) {
+ if (ret != NJS_OK) {
return NJS_ERROR;
}
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);
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);
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;
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;
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;
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;
{ 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;
}
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;
{
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;
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");
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);
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) {
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;
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;
}
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;
}
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);
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);
static njs_external_t ngx_stream_js_ext_session[] = {
- { nxt_string("remoteAddress"),
+ { njs_str("remoteAddress"),
NJS_EXTERN_PROPERTY,
NULL,
0,
NULL,
0 },
- { nxt_string("variables"),
+ { njs_str("variables"),
NJS_EXTERN_OBJECT,
NULL,
0,
NULL,
0 },
- { nxt_string("allow"),
+ { njs_str("allow"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_stream_js_ext_done,
0 },
- { nxt_string("deny"),
+ { njs_str("deny"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_stream_js_ext_deny,
0 },
- { nxt_string("decline"),
+ { njs_str("decline"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_stream_js_ext_decline,
0 },
- { nxt_string("done"),
+ { njs_str("done"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_stream_js_ext_done,
0 },
- { nxt_string("log"),
+ { njs_str("log"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_stream_js_ext_log,
0 },
- { nxt_string("warn"),
+ { njs_str("warn"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_stream_js_ext_warn,
0 },
- { nxt_string("error"),
+ { njs_str("error"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_stream_js_ext_error,
0 },
- { nxt_string("on"),
+ { njs_str("on"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_stream_js_ext_on,
0 },
- { nxt_string("off"),
+ { njs_str("off"),
NJS_EXTERN_METHOD,
NULL,
0,
ngx_stream_js_ext_off,
0 },
- { nxt_string("send"),
+ { njs_str("send"),
NJS_EXTERN_METHOD,
NULL,
0,
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,
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;
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;
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;
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;
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;
}
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);
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);
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);
}
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;
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;
}
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);
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);
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);
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;
}
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;
}
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;
}
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;
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;
}
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;
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;
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;
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);
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) {
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;
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;
}
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;
}
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <njs_core.h>
-#include <string.h>
-
-
-static const njs_keyword_t njs_keywords[] = {
-
- /* Values. */
-
- { nxt_string("undefined"), NJS_TOKEN_UNDEFINED, 0 },
- { nxt_string("null"), NJS_TOKEN_NULL, 0 },
- { nxt_string("false"), NJS_TOKEN_BOOLEAN, 0 },
- { nxt_string("true"), NJS_TOKEN_BOOLEAN, 1 },
- { nxt_string("NaN"), NJS_TOKEN_NUMBER, NAN },
- { nxt_string("Infinity"), NJS_TOKEN_NUMBER, INFINITY },
-
- /* Operators. */
-
- { nxt_string("in"), NJS_TOKEN_IN, 0 },
- { nxt_string("typeof"), NJS_TOKEN_TYPEOF, 0 },
- { nxt_string("instanceof"), NJS_TOKEN_INSTANCEOF, 0 },
- { nxt_string("void"), NJS_TOKEN_VOID, 0 },
- { nxt_string("new"), NJS_TOKEN_NEW, 0 },
- { nxt_string("delete"), NJS_TOKEN_DELETE, 0 },
- { nxt_string("yield"), NJS_TOKEN_YIELD, 0 },
-
- /* Statements. */
-
- { nxt_string("var"), NJS_TOKEN_VAR, 0 },
- { nxt_string("if"), NJS_TOKEN_IF, 0 },
- { nxt_string("else"), NJS_TOKEN_ELSE, 0 },
- { nxt_string("while"), NJS_TOKEN_WHILE, 0 },
- { nxt_string("do"), NJS_TOKEN_DO, 0 },
- { nxt_string("for"), NJS_TOKEN_FOR, 0 },
- { nxt_string("break"), NJS_TOKEN_BREAK, 0 },
- { nxt_string("continue"), NJS_TOKEN_CONTINUE, 0 },
- { nxt_string("switch"), NJS_TOKEN_SWITCH, 0 },
- { nxt_string("case"), NJS_TOKEN_CASE, 0 },
- { nxt_string("default"), NJS_TOKEN_DEFAULT, 0 },
- { nxt_string("function"), NJS_TOKEN_FUNCTION, 0 },
- { nxt_string("return"), NJS_TOKEN_RETURN, 0 },
- { nxt_string("with"), NJS_TOKEN_WITH, 0 },
- { nxt_string("try"), NJS_TOKEN_TRY, 0 },
- { nxt_string("catch"), NJS_TOKEN_CATCH, 0 },
- { nxt_string("finally"), NJS_TOKEN_FINALLY, 0 },
- { nxt_string("throw"), NJS_TOKEN_THROW, 0 },
-
- /* Builtin objects. */
-
- { nxt_string("this"), NJS_TOKEN_THIS, 0 },
- { nxt_string("arguments"), NJS_TOKEN_ARGUMENTS, 0 },
- { nxt_string("njs"), NJS_TOKEN_NJS, 0 },
- { nxt_string("process"), NJS_TOKEN_PROCESS, 0 },
- { nxt_string("Math"), NJS_TOKEN_MATH, 0 },
- { nxt_string("JSON"), NJS_TOKEN_JSON, 0 },
-
- /* Builtin functions. */
-
- { nxt_string("Object"), NJS_TOKEN_OBJECT_CONSTRUCTOR, 0 },
- { nxt_string("Array"), NJS_TOKEN_ARRAY_CONSTRUCTOR, 0 },
- { nxt_string("Boolean"), NJS_TOKEN_BOOLEAN_CONSTRUCTOR, 0 },
- { nxt_string("Number"), NJS_TOKEN_NUMBER_CONSTRUCTOR, 0 },
- { nxt_string("String"), NJS_TOKEN_STRING_CONSTRUCTOR, 0 },
- { nxt_string("Function"), NJS_TOKEN_FUNCTION_CONSTRUCTOR, 0 },
- { nxt_string("RegExp"), NJS_TOKEN_REGEXP_CONSTRUCTOR, 0 },
- { nxt_string("Date"), NJS_TOKEN_DATE_CONSTRUCTOR, 0 },
- { nxt_string("Error"), NJS_TOKEN_ERROR_CONSTRUCTOR, 0 },
- { nxt_string("EvalError"), NJS_TOKEN_EVAL_ERROR_CONSTRUCTOR, 0 },
- { nxt_string("InternalError"), NJS_TOKEN_INTERNAL_ERROR_CONSTRUCTOR, 0 },
- { nxt_string("RangeError"), NJS_TOKEN_RANGE_ERROR_CONSTRUCTOR, 0 },
- { nxt_string("ReferenceError"), NJS_TOKEN_REF_ERROR_CONSTRUCTOR, 0 },
- { nxt_string("SyntaxError"), NJS_TOKEN_SYNTAX_ERROR_CONSTRUCTOR, 0 },
- { nxt_string("TypeError"), NJS_TOKEN_TYPE_ERROR_CONSTRUCTOR, 0 },
- { nxt_string("URIError"), NJS_TOKEN_URI_ERROR_CONSTRUCTOR, 0 },
- { nxt_string("MemoryError"), NJS_TOKEN_MEMORY_ERROR_CONSTRUCTOR, 0 },
-
- { nxt_string("eval"), NJS_TOKEN_EVAL, 0 },
- { nxt_string("toString"), NJS_TOKEN_TO_STRING, 0 },
- { nxt_string("isNaN"), NJS_TOKEN_IS_NAN, 0 },
- { nxt_string("isFinite"), NJS_TOKEN_IS_FINITE, 0 },
- { nxt_string("parseInt"), NJS_TOKEN_PARSE_INT, 0 },
- { nxt_string("parseFloat"), NJS_TOKEN_PARSE_FLOAT, 0 },
- { nxt_string("encodeURI"), NJS_TOKEN_ENCODE_URI, 0 },
- { nxt_string("encodeURIComponent"), NJS_TOKEN_ENCODE_URI_COMPONENT, 0 },
- { nxt_string("decodeURI"), NJS_TOKEN_DECODE_URI, 0 },
- { nxt_string("decodeURIComponent"), NJS_TOKEN_DECODE_URI_COMPONENT, 0 },
- { nxt_string("require"), NJS_TOKEN_REQUIRE, 0 },
- { nxt_string("setTimeout"), NJS_TOKEN_SET_TIMEOUT, 0 },
- { nxt_string("setImmediate"), NJS_TOKEN_SET_IMMEDIATE, 0 },
- { nxt_string("clearTimeout"), NJS_TOKEN_CLEAR_TIMEOUT, 0 },
-
- /* Module. */
- { nxt_string("import"), NJS_TOKEN_IMPORT, 0 },
- { nxt_string("from"), NJS_TOKEN_FROM, 0 },
- { nxt_string("export"), NJS_TOKEN_EXPORT, 0 },
-
- /* Reserved words. */
-
- { nxt_string("await"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("class"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("const"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("debugger"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("enum"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("extends"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("implements"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("interface"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("let"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("package"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("private"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("protected"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("public"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("static"), NJS_TOKEN_RESERVED, 0 },
- { nxt_string("super"), NJS_TOKEN_RESERVED, 0 },
-};
-
-
-static nxt_int_t
-njs_keyword_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
-{
- njs_keyword_t *keyword;
-
- keyword = data;
-
- if (nxt_strstr_eq(&lhq->key, &keyword->name)) {
- return NXT_OK;
- }
-
- return NXT_DECLINED;
-}
-
-
-const nxt_lvlhsh_proto_t njs_keyword_hash_proto
- nxt_aligned(64) =
-{
- NXT_LVLHSH_DEFAULT,
- njs_keyword_hash_test,
- njs_lvlhsh_alloc,
- njs_lvlhsh_free,
-};
-
-
-nxt_int_t
-njs_lexer_keywords_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash)
-{
- nxt_uint_t n;
- nxt_lvlhsh_query_t lhq;
- const njs_keyword_t *keyword;
-
- keyword = njs_keywords;
- n = nxt_nitems(njs_keywords);
-
- lhq.replace = 0;
- lhq.proto = &njs_keyword_hash_proto;
- lhq.pool = mp;
-
- do {
- lhq.key_hash = nxt_djb_hash(keyword->name.start, keyword->name.length);
- lhq.key = keyword->name;
- lhq.value = (void *) keyword;
-
- if (nxt_slow_path(nxt_lvlhsh_insert(hash, &lhq) != NXT_OK)) {
- return NXT_ERROR;
- }
-
- keyword++;
- n--;
-
- } while (n != 0);
-
- return NXT_OK;
-}
-
-
-void
-njs_lexer_keyword(njs_lexer_t *lexer, njs_lexer_token_t *lt)
-{
- njs_keyword_t *keyword;
- nxt_lvlhsh_query_t lhq;
-
- lhq.key_hash = lt->key_hash;
- lhq.key = lt->text;
- lhq.proto = &njs_keyword_hash_proto;
-
- if (nxt_lvlhsh_find(&lexer->keywords_hash, &lhq) == NXT_OK) {
- keyword = lhq.value;
- lt->token = keyword->token;
- lt->number = keyword->number;
- lexer->keyword = 1;
- }
-}
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-
-#include <njs_core.h>
-#include <nxt_lvlhsh.h>
-#include <nxt_djb_hash.h>
-#include <nxt_pcre.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/resource.h>
-#include <time.h>
-
-
-typedef struct {
- nxt_str_t script;
- nxt_str_t ret;
-} njs_unit_test_t;
-
-
-static njs_unit_test_t njs_test[] =
-{
- { nxt_string("@"),
- nxt_string("SyntaxError: Unexpected token \"@\" in 1") },
-
- { nxt_string("}"),
- nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
- { nxt_string("1}"),
- nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
- { nxt_string("/***/1/*\n**/"),
- nxt_string("1") },
-
- /* Variable declarations. */
-
- { nxt_string("var x"),
- nxt_string("undefined") },
-
- { nxt_string("var x;"),
- nxt_string("undefined") },
-
- { nxt_string("var x;;"),
- nxt_string("undefined") },
-
- { nxt_string("var x = 0"),
- nxt_string("undefined") },
-
- { nxt_string("var x = 0;"),
- nxt_string("undefined") },
-
- { nxt_string("var x = 0;;"),
- nxt_string("undefined") },
-
- { nxt_string("var; a"),
- nxt_string("SyntaxError: Unexpected token \";\" in 1") },
-
- { nxt_string("var + a"),
- nxt_string("SyntaxError: Unexpected token \"+\" in 1") },
-
- { nxt_string("//\r\n; var + a"),
- nxt_string("SyntaxError: Unexpected token \"+\" in 2") },
-
- { nxt_string("/*\n*/; var + a"),
- nxt_string("SyntaxError: Unexpected token \"+\" in 2") },
-
- { nxt_string("var \n a \n = 1; a"),
- nxt_string("1") },
-
- { nxt_string("var \n a, \n b; b"),
- nxt_string("undefined") },
-
- { nxt_string("var a = 1; var b; a"),
- nxt_string("1") },
-
- { nxt_string("a = 1;for(;a;a--)var a; a"),
- nxt_string("0") },
-
- { nxt_string("if(1)if(0){0?0:0}else\nvar a\nelse\nvar b"),
- nxt_string("undefined") },
-
- { nxt_string("var a = 1; var a; a"),
- nxt_string("1") },
-
- { nxt_string("(function (x) {if (x) { var a = 3; return a} else { var a = 4; return a}})(1)"),
- nxt_string("3") },
-
- { nxt_string("(function (x) {if (x) { var a = 3; return a} else { var a = 4; return a}})(0)"),
- nxt_string("4") },
-
- { nxt_string("function f(){return 2}; var f; f()"),
- nxt_string("2") },
-
- { nxt_string("function f(){return 2}; var f = 1; f()"),
- nxt_string("TypeError: number is not a function") },
-
- { nxt_string("function f(){return 1}; function f(){return 2}; f()"),
- nxt_string("2") },
-
- { nxt_string("var f = 1; function f() {}; f"),
- nxt_string("1") },
-
-#if 0 /* TODO */
- { nxt_string("var a; Object.getOwnPropertyDescriptor(this, 'a').value"),
- nxt_string("undefined") },
-
- { nxt_string("this.a = 1; a"),
- nxt_string("1") },
-#endif
-
- { nxt_string("f() = 1"),
- nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
-
- { nxt_string("f.a() = 1"),
- nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
-
- { nxt_string("++f()"),
- nxt_string("ReferenceError: Invalid left-hand side in prefix operation in 1") },
-
- { nxt_string("f()++"),
- nxt_string("ReferenceError: Invalid left-hand side in postfix operation in 1") },
-
- /* Numbers. */
-
- { nxt_string("0"),
- nxt_string("0") },
-
- { nxt_string("-0"),
- nxt_string("-0") },
-
- { nxt_string(".0"),
- nxt_string("0") },
-
- { nxt_string("0.1"),
- nxt_string("0.1") },
-
- { nxt_string(".9"),
- nxt_string("0.9") },
-
- { nxt_string("-.01"),
- nxt_string("-0.01") },
-
- { nxt_string("0.000001"),
- nxt_string("0.000001") },
-
- { nxt_string("0.00000123456"),
- nxt_string("0.00000123456") },
-
- { nxt_string("0.0000001"),
- nxt_string("1e-7") },
-
- { nxt_string("1.1000000"),
- nxt_string("1.1") },
-
- { nxt_string("99999999999999999999"),
- nxt_string("100000000000000000000") },
-
- { nxt_string("99999999999999999999.111"),
- nxt_string("100000000000000000000") },
-
- { nxt_string("999999999999999999999"),
- nxt_string("1e+21") },
-
- { nxt_string("9223372036854775808"),
- nxt_string("9223372036854776000") },
-
- { nxt_string("18446744073709551616"),
- nxt_string("18446744073709552000") },
-
- { nxt_string("1.7976931348623157E+308"),
- nxt_string("1.7976931348623157e+308") },
-
- { nxt_string("+1"),
- nxt_string("1") },
-
- { nxt_string("+1\n"),
- nxt_string("1") },
-
- { nxt_string("."),
- nxt_string("SyntaxError: Unexpected token \".\" in 1") },
-
- /* Octal Numbers. */
-
- { nxt_string("0o0"),
- nxt_string("0") },
-
- { nxt_string("0O10"),
- nxt_string("8") },
-
- { nxt_string("0o011"),
- nxt_string("9") },
-
- { nxt_string("-0O777"),
- nxt_string("-511") },
-
- { nxt_string("0o"),
- nxt_string("SyntaxError: Unexpected token \"0o\" in 1") },
-
- { nxt_string("0O778"),
- nxt_string("SyntaxError: Unexpected token \"0O778\" in 1") },
-
- /* Legacy Octal Numbers are deprecated. */
-
- { nxt_string("00"),
- nxt_string("SyntaxError: Unexpected token \"00\" in 1") },
-
- { nxt_string("08"),
- nxt_string("SyntaxError: Unexpected token \"08\" in 1") },
-
- { nxt_string("09"),
- nxt_string("SyntaxError: Unexpected token \"09\" in 1") },
-
- { nxt_string("0011"),
- nxt_string("SyntaxError: Unexpected token \"00\" in 1") },
-
- /* Binary Numbers. */
-
- { nxt_string("0b0"),
- nxt_string("0") },
-
- { nxt_string("0B10"),
- nxt_string("2") },
-
- { nxt_string("0b0101"),
- nxt_string("5") },
-
- { nxt_string("-0B11111111"),
- nxt_string("-255") },
-
- { nxt_string("0b"),
- nxt_string("SyntaxError: Unexpected token \"0b\" in 1") },
-
- { nxt_string("0B12"),
- nxt_string("SyntaxError: Unexpected token \"0B12\" in 1") },
-
- /* Hex Numbers. */
-
- { nxt_string("0x0"),
- nxt_string("0") },
-
- { nxt_string("-0x1"),
- nxt_string("-1") },
-
- { nxt_string("0xffFF"),
- nxt_string("65535") },
-
- { nxt_string("0X0000BEEF"),
- nxt_string("48879") },
-
- { nxt_string("0x"),
- nxt_string("SyntaxError: Unexpected token \"0x\" in 1") },
-
- { nxt_string("0xffff."),
- nxt_string("SyntaxError: Unexpected token \"\" in 1") },
-
- { nxt_string("0x12g"),
- nxt_string("SyntaxError: Unexpected token \"g\" in 1") },
-
- { nxt_string(""),
- nxt_string("undefined") },
-
- { nxt_string("\n"),
- nxt_string("undefined") },
-
- { nxt_string(";"),
- nxt_string("undefined") },
-
- { nxt_string("\n +1"),
- nxt_string("1") },
-
- /* Scientific notation. */
-
- { nxt_string("0e0"),
- nxt_string("0") },
-
- { nxt_string("0.0e0"),
- nxt_string("0") },
-
- { nxt_string("1e0"),
- nxt_string("1") },
-
- { nxt_string("1e1"),
- nxt_string("10") },
-
- { nxt_string("1.e01"),
- nxt_string("10") },
-
- { nxt_string("5.7e1"),
- nxt_string("57") },
-
- { nxt_string("5.7e-1"),
- nxt_string("0.57") },
-
- { nxt_string("-5.7e-1"),
- nxt_string("-0.57") },
-
- { nxt_string("1.1e-01"),
- nxt_string("0.11") },
-
- { nxt_string("5.7e-2"),
- nxt_string("0.057") },
-
- { nxt_string("1.1e+01"),
- nxt_string("11") },
-
- { nxt_string("-.01e-01"),
- nxt_string("-0.001") },
-
- { nxt_string("1e9"),
- nxt_string("1000000000") },
-
- { nxt_string("1.0e308"),
- nxt_string("1e+308") },
-
- { nxt_string("0e309"),
- nxt_string("0") },
-
- { nxt_string("0e-309"),
- nxt_string("0") },
-
- { nxt_string("1e309"),
- nxt_string("Infinity") },
-
- { nxt_string("-1e309"),
- nxt_string("-Infinity") },
-
- { nxt_string("1e"),
- nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
-
- { nxt_string("1.e"),
- nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
-
- { nxt_string("1e+"),
- nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
-
- { nxt_string("1.e-"),
- nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
-
- { nxt_string("1eZ"),
- nxt_string("SyntaxError: Unexpected token \"eZ\" in 1") },
-
- { nxt_string(".e1"),
- nxt_string("SyntaxError: Unexpected token \".\" in 1") },
-
- { nxt_string("Number.prototype.X = function(){return 123;};"
- "(1).X()"),
- nxt_string("123") },
-
- /* Indexes. */
-
- { nxt_string("var a = []; a[-1] = 2; a[-1] == a['-1']"),
- nxt_string("true") },
-
- { nxt_string("var a = []; a[Infinity] = 2; a[Infinity] == a['Infinity']"),
- nxt_string("true") },
-
- { nxt_string("var a = []; a[NaN] = 2; a[NaN] == a['NaN']"),
- nxt_string("true") },
-
- /* Number.toString(radix) method. */
-
- { nxt_string("0..toString(2)"),
- nxt_string("0") },
-
- { nxt_string("240..toString(2)"),
- nxt_string("11110000") },
-
- { nxt_string("Math.pow(-2, 1023).toString(2).length"),
- nxt_string("1025") },
-
- { nxt_string("8.0625.toString(2)"),
- nxt_string("1000.0001") },
-
- { nxt_string("(1/3).toString(2)"),
- nxt_string("0.010101010101010101010101010101010101010101010101010101") },
-
- { nxt_string("9999..toString(3)"),
- nxt_string("111201100") },
-
- { nxt_string("-9999..toString(3)"),
- nxt_string("-111201100") },
-
- { nxt_string("81985529216486895..toString(16)"),
- nxt_string("123456789abcdf0") },
-
- { nxt_string("0xffff.toString(16)"),
- nxt_string("ffff") },
-
- { nxt_string("30520..toString(36)"),
- nxt_string("njs") },
-
- { nxt_string("Infinity.toString()"),
- nxt_string("Infinity") },
-
- { nxt_string("Infinity.toString(2)"),
- nxt_string("Infinity") },
-
- { nxt_string("Infinity.toString(10)"),
- nxt_string("Infinity") },
-
- { nxt_string("Infinity.toString(NaN)"),
- nxt_string("RangeError") },
-
- { nxt_string("Infinity.toString({})"),
- nxt_string("RangeError") },
-
- { nxt_string("Infinity.toString(Infinity)"),
- nxt_string("RangeError") },
-
- { nxt_string("NaN.toString()"),
- nxt_string("NaN") },
-
- { nxt_string("NaN.toString(2)"),
- nxt_string("NaN") },
-
- { nxt_string("NaN.toString(10)"),
- nxt_string("NaN") },
-
- { nxt_string("NaN.toString(Infinity)"),
- nxt_string("RangeError") },
-
- { nxt_string("NaN.toString({})"),
- nxt_string("RangeError") },
-
- { nxt_string("NaN.toString(NaN)"),
- nxt_string("RangeError") },
-
- /* An object "valueOf/toString" methods. */
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; +a"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } }; +a"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: 2,"
- " toString: function() { return '1' } }; +a"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; ''+a"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return [] },"
- " toString: function() { return '1' } }; +a"),
- nxt_string("1") },
-
- { nxt_string("var a = { toString: function() { return 'a' } };"
- "var b = { toString: function() { return a+'b' } }; '0'+b"),
- nxt_string("0ab") },
-
- { nxt_string("({valueOf:()=>'4'}) / ({valueOf:()=>2})"),
- nxt_string("2") },
-
- { nxt_string("({valueOf:()=>{throw 'x'}}) / ({valueOf:()=>{throw 'y'}});"
- "var e; try { x/y } catch(ex) {e = ex}; ex"),
- nxt_string("x") },
-
- { nxt_string("({valueOf:()=>{ try {throw 'x'} catch (ex) {return 6} } }) / 2"),
- nxt_string("3") },
-
- { nxt_string("({valueOf:()=>2}) / ({valueOf:()=>{throw 'y'}});"
- "var e; try { x/y } catch(ex) {e = ex}; ex"),
- nxt_string("y") },
-
- { nxt_string("({valueOf:()=>'4'}) % ({valueOf:()=>3})"),
- nxt_string("1") },
-
- { nxt_string("({valueOf:()=>9}) >>> ({valueOf:()=>2})"),
- nxt_string("2") },
-
- { nxt_string("({valueOf:()=>0x1f}) & ({valueOf:()=>0xf})"),
- nxt_string("15") },
-
- { nxt_string("({valueOf:()=>0x1f}) ^ ({valueOf:()=>0xf})"),
- nxt_string("16") },
-
- { nxt_string("({valueOf:()=>0xf}) == ({valueOf:()=>0xf})"),
- nxt_string("false") },
-
- { nxt_string("var e; try {({valueOf: String.prototype.valueOf}) == 1} "
- "catch (ex) { e = ex}; e"),
- nxt_string("TypeError: unexpected value type:object") },
-
- { nxt_string("({valueOf:()=>0xf}) == 0xf"),
- nxt_string("true") },
-
- { nxt_string("0xf == ({valueOf:()=>0xf})"),
- nxt_string("true") },
-
- { nxt_string("({valueOf:()=>'0xf'}) == 0xf"),
- nxt_string("true") },
-
- { nxt_string("0xf == ({valueOf:()=>'0xf'})"),
- nxt_string("true") },
-
- { nxt_string("({valueOf:()=>0xf}) == '0xf'"),
- nxt_string("true") },
-
- { nxt_string("'0xf' == ({valueOf:()=>0xf})"),
- nxt_string("true") },
- /**/
-
- { nxt_string("1 + undefined"),
- nxt_string("NaN") },
-
- { nxt_string("1 + ''"),
- nxt_string("1") },
-
- { nxt_string("0xA + ''"),
- nxt_string("10") },
-
- { nxt_string("undefined + undefined"),
- nxt_string("NaN") },
-
- { nxt_string("1.2 + 5.7"),
- nxt_string("6.9") },
-
- { nxt_string("0xf + 1"),
- nxt_string("16") },
-
- { nxt_string("1 + 1 + '2' + 1 + 1"),
- nxt_string("2211") },
-
- { nxt_string("'gg' + -0"),
- nxt_string("gg0") },
-
- { nxt_string("1.2 - '5.7'"),
- nxt_string("-4.5") },
-
- { nxt_string("1.2 + -'5.7'"),
- nxt_string("-4.5") },
-
- { nxt_string("1.2 - '-5.7'"),
- nxt_string("6.9") },
-
- { nxt_string("5 - ' \t 12 \t'"),
- nxt_string("-7") },
-
- { nxt_string("5 - '12zz'"),
- nxt_string("NaN") },
-
- { nxt_string("5 - '0x2'"),
- nxt_string("3") },
-
- { nxt_string("5 - '-0x2'"),
- nxt_string("7") },
-
- { nxt_string("5 - '\t 0x2 \t'"),
- nxt_string("3") },
-
- { nxt_string("5 - '0x2 z'"),
- nxt_string("NaN") },
-
- { nxt_string("12 - '5.7e1'"),
- nxt_string("-45") },
-
- { nxt_string("12 - '5.e1'"),
- nxt_string("-38") },
-
- { nxt_string("12 - '5.7e+01'"),
- nxt_string("-45") },
-
- { nxt_string("12 - '5.7e-01'"),
- nxt_string("11.43") },
-
- { nxt_string("12 - ' 5.7e1 '"),
- nxt_string("-45") },
-
- { nxt_string("12 - '5.7e'"),
- nxt_string("NaN") },
-
- { nxt_string("12 - '5.7e+'"),
- nxt_string("NaN") },
-
- { nxt_string("12 - '5.7e-'"),
- nxt_string("NaN") },
-
- { nxt_string("12 - ' 5.7e1 z'"),
- nxt_string("NaN") },
-
- { nxt_string("5 - '0x'"),
- nxt_string("NaN") },
-
- { nxt_string("1 + +'3'"),
- nxt_string("4") },
-
- { nxt_string("1 - undefined"),
- nxt_string("NaN") },
-
- { nxt_string("1 - ''"),
- nxt_string("1") },
-
- { nxt_string("undefined - undefined"),
- nxt_string("NaN") },
-
- /* String.toString() method. */
-
- { nxt_string("'A'.toString()"),
- nxt_string("A") },
-
- { nxt_string("'A'.toString('hex')"),
- nxt_string("TypeError: argument must be a byte string") },
-
- { nxt_string("'A'.toBytes().toString('latin1')"),
- nxt_string("TypeError: Unknown encoding: \"latin1\"") },
-
- { nxt_string("'ABCD'.toBytes().toString('hex')"),
- nxt_string("41424344") },
-
- { nxt_string("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('hex')"),
- nxt_string("00aabbff") },
-
- { nxt_string("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('base64')"),
- nxt_string("AKq7/w==") },
-
- { nxt_string("'ABCD'.toBytes().toString('base64')"),
- nxt_string("QUJDRA==") },
-
- { nxt_string("'ABC'.toBytes().toString('base64')"),
- nxt_string("QUJD") },
-
- { nxt_string("'AB'.toBytes().toString('base64')"),
- nxt_string("QUI=") },
-
- { nxt_string("'A'.toBytes().toString('base64')"),
- nxt_string("QQ==") },
-
- { nxt_string("''.toBytes().toString('base64')"),
- nxt_string("") },
-
- { nxt_string("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('base64url')"),
- nxt_string("AKq7_w") },
-
- { nxt_string("'ABCD'.toBytes().toString('base64url')"),
- nxt_string("QUJDRA") },
-
- { nxt_string("'ABC'.toBytes().toString('base64url')"),
- nxt_string("QUJD") },
-
- { nxt_string("'AB'.toBytes().toString('base64url')"),
- nxt_string("QUI") },
-
- { nxt_string("'A'.toBytes().toString('base64url')"),
- nxt_string("QQ") },
-
- { nxt_string("''.toBytes().toString('base64url')"),
- nxt_string("") },
-
- /* Assignment. */
-
- { nxt_string("var a, b = (a = [2]) * (3 * 4); a +' '+ b"),
- nxt_string("2 24") },
-
- { nxt_string("var a = 1; var b = a += 1; b"),
- nxt_string("2") },
-
- { nxt_string("var a = 1; var b = a -= 1; b"),
- nxt_string("0") },
-
- { nxt_string("var a = 1; var b = a <<= 1; b"),
- nxt_string("2") },
-
- /* 3 address operation and side effect. */
-
- { nxt_string("var a = 1; function f(x) { a = x; return 2 }; a+f(5)+' '+a"),
- nxt_string("3 5") },
-
- { nxt_string("var a = 1; function f(x) { a = x; return 2 }; a += f(5)"),
- nxt_string("3") },
-
- { nxt_string("var x; x in (x = 1, [1, 2, 3])"),
- nxt_string("false") },
-
- /* Exponentiation. */
-
- { nxt_string("2 ** 3 ** 2"),
- nxt_string("512") },
-
- { nxt_string("2 ** (3 ** 2)"),
- nxt_string("512") },
-
- { nxt_string("(2 ** 3) ** 2"),
- nxt_string("64") },
-
- { nxt_string("3 ** 2 - 9"),
- nxt_string("0") },
-
- { nxt_string("-9 + 3 ** 2"),
- nxt_string("0") },
-
- { nxt_string("-3 ** 2"),
- nxt_string("SyntaxError: Either left-hand side or entire exponentiation "
- "must be parenthesized in 1") },
-
- { nxt_string("-(3) ** 2"),
- nxt_string("SyntaxError: Either left-hand side or entire exponentiation "
- "must be parenthesized in 1") },
-
- { nxt_string("-(3 ** 2)"),
- nxt_string("-9") },
-
- { nxt_string("(-3) ** 2"),
- nxt_string("9") },
-
- { nxt_string("1 ** NaN"),
- nxt_string("NaN") },
-
- { nxt_string("'a' ** -0"),
- nxt_string("1") },
-
- { nxt_string("1.1 ** Infinity"),
- nxt_string("Infinity") },
-
- { nxt_string("(-1.1) ** -Infinity"),
- nxt_string("0") },
-
- { nxt_string("(-1) ** Infinity"),
- nxt_string("NaN") },
-
- { nxt_string("1 ** -Infinity"),
- nxt_string("NaN") },
-
- { nxt_string("(-0.9) ** Infinity"),
- nxt_string("0") },
-
- { nxt_string("0.9 ** -Infinity"),
- nxt_string("Infinity") },
-
- { nxt_string("'Infinity' ** 0.1"),
- nxt_string("Infinity") },
-
- { nxt_string("Infinity ** '-0.1'"),
- nxt_string("0") },
-
- { nxt_string("(-Infinity) ** 3"),
- nxt_string("-Infinity") },
-
- { nxt_string("'-Infinity' ** '3.1'"),
- nxt_string("Infinity") },
-
- { nxt_string("(-Infinity) ** '-3'"),
- nxt_string("-0") },
-
- { nxt_string("'-Infinity' ** -2"),
- nxt_string("0") },
-
- { nxt_string("'0' ** 0.1"),
- nxt_string("0") },
-
-#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
- { nxt_string("0 ** '-0.1'"),
- nxt_string("Infinity") },
-#endif
-
- { nxt_string("(-0) ** 3"),
- nxt_string("-0") },
-
- { nxt_string("'-0' ** '3.1'"),
- nxt_string("0") },
-
- { nxt_string("(-0) ** '-3'"),
- nxt_string("-Infinity") },
-
-#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
- { nxt_string("'-0' ** -2"),
- nxt_string("Infinity") },
-#endif
-
- { nxt_string("(-3) ** 0.1"),
- nxt_string("NaN") },
-
- { nxt_string("var a = 0.1; a **= -2"),
- nxt_string("99.99999999999999") },
-
- { nxt_string("var a = 1; a **= NaN"),
- nxt_string("NaN") },
-
- { nxt_string("var a = 'a'; a **= -0"),
- nxt_string("1") },
-
- { nxt_string("var a = 1.1; a **= Infinity"),
- nxt_string("Infinity") },
-
- { nxt_string("var a = -1.1; a **= -Infinity"),
- nxt_string("0") },
-
- { nxt_string("var a = -1; a **= Infinity"),
- nxt_string("NaN") },
-
- { nxt_string("var a = 1; a **= -Infinity"),
- nxt_string("NaN") },
-
- { nxt_string("var a = -0.9; a **= Infinity"),
- nxt_string("0") },
-
- { nxt_string("var a = 0.9; a **= -Infinity"),
- nxt_string("Infinity") },
-
- { nxt_string("var a = 'Infinity'; a **= 0.1"),
- nxt_string("Infinity") },
-
- { nxt_string("var a = Infinity; a **= '-0.1'"),
- nxt_string("0") },
-
- { nxt_string("var a = -Infinity; a **= 3"),
- nxt_string("-Infinity") },
-
- { nxt_string("var a = '-Infinity'; a **= '3.1'"),
- nxt_string("Infinity") },
-
- { nxt_string("var a = -Infinity; a **= '-3'"),
- nxt_string("-0") },
-
- { nxt_string("var a = '-Infinity'; a **= -2"),
- nxt_string("0") },
-
- { nxt_string("var a = '0'; a **= 0.1"),
- nxt_string("0") },
-
-#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
- { nxt_string("var a = 0; a **= '-0.1'"),
- nxt_string("Infinity") },
-#endif
-
- { nxt_string("var a = -0; a **= 3"),
- nxt_string("-0") },
-
- { nxt_string("var a = '-0'; a **= '3.1'"),
- nxt_string("0") },
-
- { nxt_string("var a = -0; a **= '-3'"),
- nxt_string("-Infinity") },
-
-#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
- { nxt_string("var a = '-0'; a **= -2"),
- nxt_string("Infinity") },
-#endif
-
- { nxt_string("var a = -3; a **= 0.1"),
- nxt_string("NaN") },
-
- /**/
-
- { nxt_string("12 | 6"),
- nxt_string("14") },
-
- { nxt_string("12 | 'abc'"),
- nxt_string("12") },
-
- { nxt_string("-1 | 0"),
- nxt_string("-1") },
-
- { nxt_string("-2147483648 | 0"),
- nxt_string("-2147483648") },
-
- { nxt_string("1024.9 | 0"),
- nxt_string("1024") },
-
- { nxt_string("-1024.9 | 0"),
- nxt_string("-1024") },
-
- { nxt_string("9007199254740991 | 0"),
- nxt_string("-1") },
-
- { nxt_string("9007199254740992 | 0"),
- nxt_string("0") },
-
- { nxt_string("9007199254740993 | 0"),
- nxt_string("0") },
-
-#if 0
- { nxt_string("9223372036854775808 | 0"),
- nxt_string("0") },
-#endif
-
- { nxt_string("9223372036854777856 | 0"),
- nxt_string("2048") },
-
- { nxt_string("-9223372036854777856 | 0"),
- nxt_string("-2048") },
-
- { nxt_string("NaN | 0"),
- nxt_string("0") },
-
- { nxt_string("-NaN | 0"),
- nxt_string("0") },
-
- { nxt_string("Infinity | 0"),
- nxt_string("0") },
-
- { nxt_string("-Infinity | 0"),
- nxt_string("0") },
-
- { nxt_string("+0 | 0"),
- nxt_string("0") },
-
- { nxt_string("-0 | 0"),
- nxt_string("0") },
-
- { nxt_string("32.5 << 2.4"),
- nxt_string("128") },
-
- { nxt_string("32.5 << 'abc'"),
- nxt_string("32") },
-
- { nxt_string("'abc' << 2"),
- nxt_string("0") },
-
- { nxt_string("-1 << 0"),
- nxt_string("-1") },
-
- { nxt_string("-1 << -1"),
- nxt_string("-2147483648") },
-
- { nxt_string("-2147483648 << 0"),
- nxt_string("-2147483648") },
-
-#if 0
- { nxt_string("9223372036854775808 << 0"),
- nxt_string("0") },
-#endif
-
- { nxt_string("9223372036854777856 << 0"),
- nxt_string("2048") },
-
- { nxt_string("-9223372036854777856 << 0"),
- nxt_string("-2048") },
-
- { nxt_string("NaN << 0"),
- nxt_string("0") },
-
- { nxt_string("32.5 >> 2.4"),
- nxt_string("8") },
-
- { nxt_string("-1 >> 30"),
- nxt_string("-1") },
-
- { nxt_string("'abc' >> 2"),
- nxt_string("0") },
-
- { nxt_string("-1 >> 0"),
- nxt_string("-1") },
-
- { nxt_string("-1 >> -1"),
- nxt_string("-1") },
-
- { nxt_string("-2147483648 >> 0"),
- nxt_string("-2147483648") },
-
- { nxt_string("-2147483648 >> -1"),
- nxt_string("-1") },
-
-#if 0
- { nxt_string("9223372036854775808 >> 0"),
- nxt_string("0") },
-#endif
-
- { nxt_string("9223372036854777856 >> 0"),
- nxt_string("2048") },
-
- { nxt_string("-9223372036854777856 >> 0"),
- nxt_string("-2048") },
-
- { nxt_string("NaN >> 0"),
- nxt_string("0") },
-
- { nxt_string("-1 >>> 30"),
- nxt_string("3") },
-
- { nxt_string("NaN >>> 1"),
- nxt_string("0") },
-
-#if 0
- { nxt_string("9223372036854775808 >>> 1"),
- nxt_string("0") },
-#endif
-
- { nxt_string("-1 >>> 0"),
- nxt_string("4294967295") },
-
- { nxt_string("-1 >>> -1"),
- nxt_string("1") },
-
- { nxt_string("-2147483648 >>> 0"),
- nxt_string("2147483648") },
-
- { nxt_string("-2147483648 >>> -1"),
- nxt_string("1") },
-
-#if 0
- { nxt_string("9223372036854775808 >>> 0"),
- nxt_string("0") },
-#endif
-
- { nxt_string("9223372036854777856 >>> 0"),
- nxt_string("2048") },
-
- { nxt_string("-9223372036854777856 >>> 0"),
- nxt_string("4294965248") },
-
- { nxt_string("NaN >>> 0"),
- nxt_string("0") },
-
- { nxt_string("!2"),
- nxt_string("false") },
-
- /**/
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; ~a"),
- nxt_string("-2") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } }; ~a"),
- nxt_string("-2") },
-
- /**/
-
- { nxt_string("1 || 2"),
- nxt_string("1") },
-
- { nxt_string("var a = 1; 1 || (a = 2); a"),
- nxt_string("1") },
-
- { nxt_string("var x; x = 0 || x; x"),
- nxt_string("undefined") },
-
- { nxt_string("var x; x = 1 && x; x"),
- nxt_string("undefined") },
-
- { nxt_string("1 || 2 || 3"),
- nxt_string("1") },
-
- { nxt_string("1 || (2 + 2) || 3"),
- nxt_string("1") },
-
- { nxt_string("1 && 2"),
- nxt_string("2") },
-
- { nxt_string("1 && 2 && 3"),
- nxt_string("3") },
-
- { nxt_string("var a = 1; 0 && (a = 2); a"),
- nxt_string("1") },
-
- { nxt_string("false && true || true"),
- nxt_string("true") },
-
- { nxt_string("false && (true || true)"),
- nxt_string("false") },
-
- { nxt_string("var a = true; a = -~!a"),
- nxt_string("1") },
-
- { nxt_string("12 & 6"),
- nxt_string("4") },
-
- { nxt_string("-1 & 65536"),
- nxt_string("65536") },
-
- { nxt_string("-2147483648 & 65536"),
- nxt_string("0") },
-
-#if 0
- { nxt_string("9223372036854775808 & 65536"),
- nxt_string("0") },
-#endif
-
- { nxt_string("NaN & 65536"),
- nxt_string("0") },
-
- { nxt_string("12 ^ 6"),
- nxt_string("10") },
-
- { nxt_string("-1 ^ 65536"),
- nxt_string("-65537") },
-
- { nxt_string("-2147483648 ^ 65536"),
- nxt_string("-2147418112") },
-
-#if 0
- { nxt_string("9223372036854775808 ^ 65536"),
- nxt_string("65536") },
-#endif
-
- { nxt_string("NaN ^ 65536"),
- nxt_string("65536") },
-
- { nxt_string("var x = '1'; +x + 2"),
- nxt_string("3") },
-
- /* Weird things. */
-
- { nxt_string("'3' -+-+-+ '1' + '1' / '3' * '6' + '2'"),
- nxt_string("42") },
-
- { nxt_string("((+!![])+(+!![])+(+!![])+(+!![])+[])+((+!![])+(+!![])+[])"),
- nxt_string("42") },
-
- { nxt_string("1+[[]+[]]-[]+[[]-[]]-1"),
- nxt_string("9") },
-
- { nxt_string("[[]+[]]-[]+[[]-[]]"),
- nxt_string("00") },
-
- { nxt_string("!--[][1]"),
- nxt_string("true") },
-
- { nxt_string("[].concat[1,2,3]"),
- nxt_string("undefined") },
-
- /**/
-
- { nxt_string("'true' == true"),
- nxt_string("false") },
-
- { nxt_string("null == false"),
- nxt_string("false") },
-
- { nxt_string("0 == null"),
- nxt_string("false") },
-
- { nxt_string("!null"),
- nxt_string("true") },
-
- { nxt_string("0 === -0"),
- nxt_string("true") },
-
- { nxt_string("1/-0"),
- nxt_string("-Infinity") },
-
- { nxt_string("1/0 === 1/-0"),
- nxt_string("false") },
-
- { nxt_string("1 == true"),
- nxt_string("true") },
-
- { nxt_string("NaN === NaN"),
- nxt_string("false") },
-
- { nxt_string("NaN !== NaN"),
- nxt_string("true") },
-
- { nxt_string("NaN == NaN"),
- nxt_string("false") },
-
- { nxt_string("NaN != NaN"),
- nxt_string("true") },
-
- { nxt_string("NaN == false"),
- nxt_string("false") },
-
- { nxt_string("Infinity == Infinity"),
- nxt_string("true") },
-
- { nxt_string("-Infinity == -Infinity"),
- nxt_string("true") },
-
- { nxt_string("-Infinity < Infinity"),
- nxt_string("true") },
-
- { nxt_string("Infinity - Infinity"),
- nxt_string("NaN") },
-
- { nxt_string("Infinity - -Infinity"),
- nxt_string("Infinity") },
-
- { nxt_string("undefined == 0"),
- nxt_string("false") },
-
- { nxt_string("undefined == null"),
- nxt_string("true") },
-
- { nxt_string("'1' == 1"),
- nxt_string("true") },
-
- { nxt_string("'1a' == '1'"),
- nxt_string("false") },
-
- { nxt_string("'abc' == 'abc'"),
- nxt_string("true") },
-
- { nxt_string("'abc' < 'abcde'"),
- nxt_string("true") },
-
- { nxt_string("0 == ''"),
- nxt_string("true") },
-
- { nxt_string("0 == ' '"),
- nxt_string("true") },
-
- { nxt_string("0 == ' '"),
- nxt_string("true") },
-
- { nxt_string("0 == '0'"),
- nxt_string("true") },
-
- { nxt_string("0 == ' 0 '"),
- nxt_string("true") },
-
- { nxt_string("0 == '000'"),
- nxt_string("true") },
-
- { nxt_string("'0' == ''"),
- nxt_string("false") },
-
- { nxt_string("1 < 2"),
- nxt_string("true") },
-
- { nxt_string("NaN < NaN"),
- nxt_string("false") },
-
- { nxt_string("NaN > NaN"),
- nxt_string("false") },
-
- { nxt_string("undefined < 1"),
- nxt_string("false") },
-
- { nxt_string("[] == false"),
- nxt_string("true") },
-
- { nxt_string("[0] == false"),
- nxt_string("true") },
-
- { nxt_string("[0,0] == false"),
- nxt_string("false") },
-
- { nxt_string("({}) == false"),
- nxt_string("false") },
-
- { nxt_string("new Number(1) == new String('1')"),
- nxt_string("false") },
-
- { nxt_string("var a = Object; a == Object"),
- nxt_string("true") },
-
- { nxt_string("'1' == new Number(1)"),
- nxt_string("true") },
-
- { nxt_string("new String('abc') == 'abc'"),
- nxt_string("true") },
-
- { nxt_string("false == new String('0')"),
- nxt_string("true") },
-
- { nxt_string("var a = { valueOf: function() { return 5 } }; a == 5"),
- nxt_string("true") },
-
- { nxt_string("var a = { valueOf: function() { return '5' } }; a == 5"),
- nxt_string("true") },
-
- { nxt_string("var a = { valueOf: function() { return '5' } }; a == '5'"),
- nxt_string("true") },
-
- { nxt_string("var a = { valueOf: function() { return 5 } }; a == '5'"),
- nxt_string("true") },
-
- { nxt_string("var a = { toString: function() { return true } }; '1' == a"),
- nxt_string("true") },
-
- { nxt_string("var a = { valueOf: function() { return 'b' },"
- " toString: function() { return 'a' } }; a == 'a'"),
- nxt_string("false") },
-
- /* Comparisions. */
-
- { nxt_string("1 < 2"),
- nxt_string("true") },
-
- { nxt_string("1 < 1"),
- nxt_string("false") },
-
- { nxt_string("1 <= 1"),
- nxt_string("true") },
-
- { nxt_string("1 <= 2"),
- nxt_string("true") },
-
- { nxt_string("2 > 1"),
- nxt_string("true") },
-
- { nxt_string("1 > 2"),
- nxt_string("false") },
-
- { nxt_string("1 > 1"),
- nxt_string("false") },
-
- { nxt_string("1 >= 1"),
- nxt_string("true") },
-
- { nxt_string("2 >= 1"),
- nxt_string("true") },
-
- { nxt_string("1 >= 2"),
- nxt_string("false") },
-
- /**/
-
- { nxt_string("null === null"),
- nxt_string("true") },
-
- { nxt_string("null !== null"),
- nxt_string("false") },
-
- { nxt_string("null == null"),
- nxt_string("true") },
-
- { nxt_string("null != null"),
- nxt_string("false") },
-
- { nxt_string("null < null"),
- nxt_string("false") },
-
- { nxt_string("null > null"),
- nxt_string("false") },
-
- { nxt_string("null <= null"),
- nxt_string("true") },
-
- { nxt_string("null >= null"),
- nxt_string("true") },
-
- /**/
-
- { nxt_string("null === undefined"),
- nxt_string("false") },
-
- { nxt_string("null !== undefined"),
- nxt_string("true") },
-
- { nxt_string("null == undefined"),
- nxt_string("true") },
-
- { nxt_string("null != undefined"),
- nxt_string("false") },
-
- { nxt_string("null < undefined"),
- nxt_string("false") },
-
- { nxt_string("null > undefined"),
- nxt_string("false") },
-
- { nxt_string("null <= undefined"),
- nxt_string("false") },
-
- { nxt_string("null >= undefined"),
- nxt_string("false") },
-
- /**/
-
- { nxt_string("null === false"),
- nxt_string("false") },
-
- { nxt_string("null !== false"),
- nxt_string("true") },
-
- { nxt_string("null == false"),
- nxt_string("false") },
-
- { nxt_string("null != false"),
- nxt_string("true") },
-
- { nxt_string("null < false"),
- nxt_string("false") },
-
- { nxt_string("null > false"),
- nxt_string("false") },
-
- { nxt_string("null <= false"),
- nxt_string("true") },
-
- { nxt_string("null >= false"),
- nxt_string("true") },
-
- /**/
-
- { nxt_string("null === true"),
- nxt_string("false") },
-
- { nxt_string("null !== true"),
- nxt_string("true") },
-
- { nxt_string("null == true"),
- nxt_string("false") },
-
- { nxt_string("null != true"),
- nxt_string("true") },
-
- { nxt_string("null < true"),
- nxt_string("true") },
-
- { nxt_string("null > true"),
- nxt_string("false") },
-
- { nxt_string("null <= true"),
- nxt_string("true") },
-
- { nxt_string("null >= true"),
- nxt_string("false") },
-
- /**/
-
- { nxt_string("Infinity === Infinity"),
- nxt_string("true") },
-
- { nxt_string("Infinity !== Infinity"),
- nxt_string("false") },
-
- { nxt_string("Infinity == Infinity"),
- nxt_string("true") },
-
- { nxt_string("Infinity != Infinity"),
- nxt_string("false") },
-
- { nxt_string("Infinity < Infinity"),
- nxt_string("false") },
-
- { nxt_string("Infinity > Infinity"),
- nxt_string("false") },
-
- { nxt_string("Infinity <= Infinity"),
- nxt_string("true") },
-
- { nxt_string("Infinity >= Infinity"),
- nxt_string("true") },
-
- /**/
-
- { nxt_string("-Infinity === Infinity"),
- nxt_string("false") },
-
- { nxt_string("-Infinity !== Infinity"),
- nxt_string("true") },
-
- { nxt_string("-Infinity == Infinity"),
- nxt_string("false") },
-
- { nxt_string("-Infinity != Infinity"),
- nxt_string("true") },
-
- { nxt_string("-Infinity < Infinity"),
- nxt_string("true") },
-
- { nxt_string("-Infinity > Infinity"),
- nxt_string("false") },
-
- { nxt_string("-Infinity <= Infinity"),
- nxt_string("true") },
-
- { nxt_string("-Infinity >= Infinity"),
- nxt_string("false") },
-
- /**/
-
- { nxt_string("NaN === NaN"),
- nxt_string("false") },
-
- { nxt_string("NaN !== NaN"),
- nxt_string("true") },
-
- { nxt_string("NaN == NaN"),
- nxt_string("false") },
-
- { nxt_string("NaN != NaN"),
- nxt_string("true") },
-
- { nxt_string("NaN < NaN"),
- nxt_string("false") },
-
- { nxt_string("NaN > NaN"),
- nxt_string("false") },
-
- { nxt_string("NaN >= NaN"),
- nxt_string("false") },
-
- { nxt_string("NaN <= NaN"),
- nxt_string("false") },
-
- /**/
-
- { nxt_string("null < 0"),
- nxt_string("false") },
-
- { nxt_string("null < 1"),
- nxt_string("true") },
-
- { nxt_string("null < NaN"),
- nxt_string("false") },
-
- { nxt_string("null < -Infinity"),
- nxt_string("false") },
-
- { nxt_string("null < Infinity"),
- nxt_string("true") },
-
- { nxt_string("null < 'null'"),
- nxt_string("false") },
-
- { nxt_string("null < '1'"),
- nxt_string("true") },
-
- { nxt_string("null < [1]"),
- nxt_string("true") },
-
- { nxt_string("null < ({})"),
- nxt_string("false") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; null < a"),
- nxt_string("true") },
-
- { nxt_string("var a = { valueOf: function() { return 'null' } };null < a"),
- nxt_string("false") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } }; null < a"),
- nxt_string("true") },
-
- { nxt_string("1 < {valueOf: ()=>{throw 'x'}}"),
- nxt_string("x") },
-
- { nxt_string("({valueOf: ()=>{throw 'x'}}) <= ({valueOf:()=>{throw 'y'}})"),
- nxt_string("x") },
-
- { nxt_string("({valueOf:()=>{throw 'x'}}) > ({valueOf:()=>{throw 'y'}})"),
- nxt_string("x") },
-
- /**/
-
- { nxt_string("undefined == undefined"),
- nxt_string("true") },
-
- { nxt_string("undefined != undefined"),
- nxt_string("false") },
-
- { nxt_string("undefined === undefined"),
- nxt_string("true") },
-
- { nxt_string("undefined !== undefined"),
- nxt_string("false") },
-
- { nxt_string("undefined < undefined"),
- nxt_string("false") },
-
- { nxt_string("undefined < null"),
- nxt_string("false") },
-
- { nxt_string("undefined < false"),
- nxt_string("false") },
-
- { nxt_string("undefined < true"),
- nxt_string("false") },
-
- { nxt_string("undefined < 0"),
- nxt_string("false") },
-
- { nxt_string("undefined < 1"),
- nxt_string("false") },
-
- { nxt_string("undefined < NaN"),
- nxt_string("false") },
-
- { nxt_string("undefined < -Infinity"),
- nxt_string("false") },
-
- { nxt_string("undefined < Infinity"),
- nxt_string("false") },
-
- { nxt_string("undefined < 'undefined'"),
- nxt_string("false") },
-
- { nxt_string("undefined < '1'"),
- nxt_string("false") },
-
- { nxt_string("undefined < [1]"),
- nxt_string("false") },
-
- { nxt_string("undefined < ({})"),
- nxt_string("false") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; undefined < a"),
- nxt_string("false") },
-
- { nxt_string("var a = { valueOf: function() { return 'undefined' } };"
- "undefined < a"),
- nxt_string("false") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } };"
- "undefined < a"),
- nxt_string("false") },
-
- /**/
-
- { nxt_string("false < 1"),
- nxt_string("true") },
-
- { nxt_string("true < 1"),
- nxt_string("false") },
-
- { nxt_string("-1 < 1"),
- nxt_string("true") },
-
- { nxt_string("-1 < '1'"),
- nxt_string("true") },
-
- { nxt_string("NaN < NaN"),
- nxt_string("false") },
-
- { nxt_string("-Infinity < Infinity"),
- nxt_string("true") },
-
- { nxt_string("Infinity < -Infinity"),
- nxt_string("false") },
-
- { nxt_string("1 < 'abc'"),
- nxt_string("false") },
-
- /**/
-
- { nxt_string("[] === []"),
- nxt_string("false") },
-
- { nxt_string("[] !== []"),
- nxt_string("true") },
-
- { nxt_string("[] == []"),
- nxt_string("false") },
-
- { nxt_string("[] != []"),
- nxt_string("true") },
-
- { nxt_string("[] < []"),
- nxt_string("false") },
-
- { nxt_string("[] > []"),
- nxt_string("false") },
-
- { nxt_string("[] >= []"),
- nxt_string("true") },
-
- { nxt_string("[] <= []"),
- nxt_string("true") },
-
- /**/
-
- { nxt_string("({}) === ({})"),
- nxt_string("false") },
-
- { nxt_string("({}) !== ({})"),
- nxt_string("true") },
-
- { nxt_string("({}) == ({})"),
- nxt_string("false") },
-
- { nxt_string("({}) != ({})"),
- nxt_string("true") },
-
- { nxt_string("({}) > ({})"),
- nxt_string("false") },
-
- { nxt_string("({}) <= ({})"),
- nxt_string("true") },
-
- { nxt_string("({}) >= ({})"),
- nxt_string("true") },
-
- /**/
-
- { nxt_string("[0] == ({})"),
- nxt_string("false") },
-
- { nxt_string("[0] != ({})"),
- nxt_string("true") },
-
- { nxt_string("[0] <= ({})"),
- nxt_string("true") },
-
- { nxt_string("[0] >= ({})"),
- nxt_string("false") },
-
- /**/
- { nxt_string("new String('1') > new Number(1)"),
- nxt_string("false") },
-
- { nxt_string("new Boolean(true) > '1'"),
- nxt_string("false") },
-
- { nxt_string("'0' >= new Number(1)"),
- nxt_string("false") },
-
- { nxt_string("'1' >= new Number(1)"),
- nxt_string("true") },
-
- { nxt_string("new String('1') < new Number(1)"),
- nxt_string("false") },
-
- { nxt_string("new Boolean(true) < '1'"),
- nxt_string("false") },
-
- { nxt_string("new String('1') <= new Number(1)"),
- nxt_string("true") },
-
- { nxt_string("new Boolean(true) <= '1'"),
- nxt_string("true") },
-
- { nxt_string("'-1' < {valueOf: function() {return -2}}"),
- nxt_string("false") },
-
- { nxt_string("new 0[isNaN]"),
- nxt_string("TypeError: (intermediate value)[\"[object Function]\"] is not a function") },
-
- { nxt_string("new 0[undefined]"),
- nxt_string("TypeError: (intermediate value)[\"undefined\"] is not a function") },
-
- /**/
-
- { nxt_string("var a; a = 1 ? 2 : 3"),
- nxt_string("2") },
-
- { nxt_string("var a; a = 1 ? 2 : 3 ? 4 : 5"),
- nxt_string("2") },
-
- { nxt_string("var a; a = 0 ? 2 : 3 ? 4 : 5"),
- nxt_string("4") },
-
- { nxt_string("0 ? 2 ? 3 : 4 : 5"),
- nxt_string("5") },
-
- { nxt_string("1 ? 2 ? 3 : 4 : 5"),
- nxt_string("3") },
-
- { nxt_string("1 ? 0 ? 3 : 4 : 5"),
- nxt_string("4") },
-
- { nxt_string("(1 ? 0 : 3) ? 4 : 5"),
- nxt_string("5") },
-
- { nxt_string("var a; a = (1 + 2) ? 2 ? 3 + 4 : 5 : 6"),
- nxt_string("7") },
-
- { nxt_string("var a; a = (1 ? 2 : 3) + 4"),
- nxt_string("6") },
-
- { nxt_string("var a, b; a = 1 ? b = 2 + 4 : b = 3"),
- nxt_string("6") },
-
- { nxt_string("var a; a = 1 ? [1,2] : []"),
- nxt_string("1,2") },
-
- /**/
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; +a"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } }; +a"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; -a"),
- nxt_string("-1") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } }; -a"),
- nxt_string("-1") },
-
- /* Increment. */
-
- { nxt_string("var a = 1; ++a"),
- nxt_string("2") },
-
- { nxt_string("var a = '1'; ++a"),
- nxt_string("2") },
-
- { nxt_string("var a = [1]; ++a"),
- nxt_string("2") },
-
- { nxt_string("var a = {}; ++a"),
- nxt_string("NaN") },
-
- { nxt_string("var a = [1,2,3]; var b = 1; b = ++a[b]; b + ' '+ a"),
- nxt_string("3 1,3,3") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } };"
- "++a +' '+ a +' '+ typeof a"),
- nxt_string("2 2 number") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } };"
- "++a +' '+ a +' '+ typeof a"),
- nxt_string("2 2 number") },
-
- { nxt_string("var a = { valueOf: function() { return [1] } };"
- "++a +' '+ a +' '+ typeof a"),
- nxt_string("NaN NaN number") },
-
- { nxt_string("var a = { valueOf: function() { return {} } };"
- "++a +' '+ a +' '+ typeof a"),
- nxt_string("NaN NaN number") },
-
- /**/
-
- { nxt_string("var a = 1; a = ++a"),
- nxt_string("2") },
-
- { nxt_string("var a = '1'; a = ++a"),
- nxt_string("2") },
-
- { nxt_string("var a = [1]; a = ++a"),
- nxt_string("2") },
-
- { nxt_string("var a = {}; a = ++a"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; a = ++a"),
- nxt_string("2") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } }; a = ++a"),
- nxt_string("2") },
-
- { nxt_string("var a = { valueOf: function() { return [1] } }; a = ++a"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } }; a = ++a"),
- nxt_string("NaN") },
-
- /**/
-
- { nxt_string("var a = 1; var b = ++a; a +' '+ b"),
- nxt_string("2 2") },
-
- { nxt_string("var a = '1'; var b = ++a; a +' '+ b"),
- nxt_string("2 2") },
-
- { nxt_string("var a = [1]; var b = ++a; a +' '+ b"),
- nxt_string("2 2") },
-
- { nxt_string("var a = {}; var b = ++a; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } };"
- "var b = ++a; a +' '+ b"),
- nxt_string("2 2") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } };"
- "var b = ++a; a +' '+ b"),
- nxt_string("2 2") },
-
- { nxt_string("var a = { valueOf: function() { return [1] } };"
- "var b = ++a; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } };"
- "var b = ++a; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- /* Post increment. */
-
- { nxt_string("var a = 1; a++"),
- nxt_string("1") },
-
- { nxt_string("var a = '1'; a++"),
- nxt_string("1") },
-
- { nxt_string("var a = [1]; a++"),
- nxt_string("1") },
-
- { nxt_string("var a = {}; a++"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; a++"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } }; a++"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return [1] } }; a++"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } }; a++"),
- nxt_string("NaN") },
-
- /**/
-
- { nxt_string("var a = 1; a = a++"),
- nxt_string("1") },
-
- { nxt_string("var a = '1'; a = a++"),
- nxt_string("1") },
-
- { nxt_string("var a = [1]; a = a++"),
- nxt_string("1") },
-
- { nxt_string("var a = {}; a = a++"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; a = a++"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } }; a = a++"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return [1] } }; a = a++"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } }; a = a++"),
- nxt_string("NaN") },
-
- /**/
-
- { nxt_string("var a = 1; var b = a++; a +' '+ b"),
- nxt_string("2 1") },
-
- { nxt_string("var a = '1'; var b = a++; a +' '+ b"),
- nxt_string("2 1") },
-
- { nxt_string("var a = [1]; var b = a++; a +' '+ b"),
- nxt_string("2 1") },
-
- { nxt_string("var a = {}; var b = a++; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } };"
- "var b = a++; a +' '+ b"),
- nxt_string("2 1") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } };"
- "var b = a++; a +' '+ b"),
- nxt_string("2 1") },
-
- { nxt_string("var a = { valueOf: function() { return [1] } };"
- "var b = a++; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } };"
- "var b = a++; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- /* Decrement. */
-
- { nxt_string("var a = 1; --a"),
- nxt_string("0") },
-
- { nxt_string("var a = '1'; --a"),
- nxt_string("0") },
-
- { nxt_string("var a = [1]; --a"),
- nxt_string("0") },
-
- { nxt_string("var a = {}; --a"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1} }; --a"),
- nxt_string("0") },
-
- { nxt_string("var a = { valueOf: function() { return '1'} }; --a"),
- nxt_string("0") },
-
- { nxt_string("var a = { valueOf: function() { return [1]} }; --a"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } }; --a"),
- nxt_string("NaN") },
-
- /**/
-
- { nxt_string("var a = 1; a = --a"),
- nxt_string("0") },
-
- { nxt_string("var a = '1'; a = --a"),
- nxt_string("0") },
-
- { nxt_string("var a = [1]; a = --a"),
- nxt_string("0") },
-
- { nxt_string("var a = {}; a = --a"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1} }; a = --a"),
- nxt_string("0") },
-
- { nxt_string("var a = { valueOf: function() { return '1'} }; a = --a"),
- nxt_string("0") },
-
- { nxt_string("var a = { valueOf: function() { return [1]} }; a = --a"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } }; a = --a"),
- nxt_string("NaN") },
-
- /**/
-
- { nxt_string("var a = 1; var b = --a; a +' '+ b"),
- nxt_string("0 0") },
-
- { nxt_string("var a = '1'; var b = --a; a +' '+ b"),
- nxt_string("0 0") },
-
- { nxt_string("var a = [1]; var b = --a; a +' '+ b"),
- nxt_string("0 0") },
-
- { nxt_string("var a = {}; var b = --a; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } };"
- "var b = --a; a +' '+ b"),
- nxt_string("0 0") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } };"
- "var b = --a; a +' '+ b"),
- nxt_string("0 0") },
-
- { nxt_string("var a = { valueOf: function() { return [1] } };"
- "var b = --a; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } };"
- "var b = --a; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- /* Post decrement. */
-
- { nxt_string("var a = 1; a--"),
- nxt_string("1") },
-
- { nxt_string("var a = '1'; a--"),
- nxt_string("1") },
-
- { nxt_string("var a = [1]; a--"),
- nxt_string("1") },
-
- { nxt_string("var a = {}; a--"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; a--"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } }; a--"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return [1] } }; a--"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } }; a--"),
- nxt_string("NaN") },
-
- /**/
-
- { nxt_string("var a = 1; a = a--"),
- nxt_string("1") },
-
- { nxt_string("var a = '1'; a = a--"),
- nxt_string("1") },
-
- { nxt_string("var a = [1]; a = a--"),
- nxt_string("1") },
-
- { nxt_string("var a = {}; a = a--"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; a = a--"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } }; a = a--"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return [1] } }; a = a--"),
- nxt_string("NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } }; a = a--"),
- nxt_string("NaN") },
-
- /**/
-
- { nxt_string("var a = 1; var b = a--; a +' '+ b"),
- nxt_string("0 1") },
-
- { nxt_string("var a = '1'; var b = a--; a +' '+ b"),
- nxt_string("0 1") },
-
- { nxt_string("var a = [1]; var b = a--; a +' '+ b"),
- nxt_string("0 1") },
-
- { nxt_string("var a = {}; var b = a--; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } };"
- "var b = a--; a +' '+ b"),
- nxt_string("0 1") },
-
- { nxt_string("var a = { valueOf: function() { return '1' } };"
- "var b = a--; a +' '+ b"),
- nxt_string("0 1") },
-
- { nxt_string("var a = { valueOf: function() { return [1] } };"
- "var b = a--; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- { nxt_string("var a = { valueOf: function() { return {} } };"
- "var b = a--; a +' '+ b"),
- nxt_string("NaN NaN") },
-
- /**/
-
- { nxt_string("var a, b; a = 2; b = ++a + ++a; a + ' ' + b"),
- nxt_string("4 7") },
-
- { nxt_string("var a, b; a = 2; b = a++ + a++; a + ' ' + b"),
- nxt_string("4 5") },
-
- { nxt_string("var a, b; a = b = 7; a +' '+ b"),
- nxt_string("7 7") },
-
- { nxt_string("var a, b, c; a = b = c = 5; a +' '+ b +' '+ c"),
- nxt_string("5 5 5") },
-
- { nxt_string("var a, b, c; a = b = (c = 5) + 2; a +' '+ b +' '+ c"),
- nxt_string("7 7 5") },
-
- { nxt_string("1, 2 + 5, 3"),
- nxt_string("3") },
-
- { nxt_string("var a, b; a = 1 /* YES */\n b = a + 2 \n \n + 1 \n + 3"),
- nxt_string("7") },
-
- { nxt_string("var a, b; a = 1 // YES \n b = a + 2 \n \n + 1 \n + 3"),
- nxt_string("7") },
-
- { nxt_string("var a; a = 0; ++ \n a"),
- nxt_string("1") },
-
- { nxt_string("var a; a = 0\n ++a"),
- nxt_string("1") },
-
- { nxt_string("a = 0; a \n ++"),
- nxt_string("SyntaxError: Unexpected end of input in 2") },
-
- { nxt_string("a = 0; a \n --"),
- nxt_string("SyntaxError: Unexpected end of input in 2") },
-
- { nxt_string("var a = 0; a \n + 1"),
- nxt_string("1") },
-
- { nxt_string("var a = 0; a \n +\n 1"),
- nxt_string("1") },
-
- { nxt_string("var a; a = 1 ? 2 \n : 3"),
- nxt_string("2") },
-
- { nxt_string("var a, b, c;"
- "a = 0 / 0; b = 1 / 0; c = -1 / 0; a +' '+ b +' '+ c"),
- nxt_string("NaN Infinity -Infinity") },
-
- { nxt_string("var a, b; a = (b = 7) + 5; var c; a +' '+ b +' '+ c"),
- nxt_string("12 7 undefined") },
-
- { nxt_string("var a, b = 1, c; a +' '+ b +' '+ c"),
- nxt_string("undefined 1 undefined") },
-
- { nxt_string("var a = 1, b = a + 1; a +' '+ b"),
- nxt_string("1 2") },
-
- { nxt_string("var a; a = a = 1"),
- nxt_string("1") },
-
- { nxt_string("var a = 1, \n b; a +' '+ b"),
- nxt_string("1 undefined") },
-
- { nxt_string("var a; a = b + 1; var b; a +' '+ b"),
- nxt_string("NaN undefined") },
-
- { nxt_string("var a += 1"),
- nxt_string("SyntaxError: Unexpected token \"+=\" in 1") },
-
- { nxt_string("var a = a + 1"),
- nxt_string("undefined") },
-
- { nxt_string("var a; a = b + 1; var b = 1; a +' '+ b"),
- nxt_string("NaN 1") },
-
- { nxt_string("var a; (a) = 1"),
- nxt_string("1") },
-
- { nxt_string("a"),
- nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
- { nxt_string("\na"),
- nxt_string("ReferenceError: \"a\" is not defined in 2") },
-
- { nxt_string("\n\na"),
- nxt_string("ReferenceError: \"a\" is not defined in 3") },
-
- { nxt_string("a + a"),
- nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
- { nxt_string("a = b + 1"),
- nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
- { nxt_string("a = a + 1"),
- nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
- { nxt_string("a += 1"),
- nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
- { nxt_string("a += 1; var a = 2"),
- nxt_string("undefined") },
-
- { nxt_string("var a = 1"),
- nxt_string("undefined") },
-
- { nxt_string("var a = 1; a = (a = 2) + a"),
- nxt_string("4") },
-
- { nxt_string("var a = 1; a = a + (a = 2)"),
- nxt_string("3") },
-
- { nxt_string("var a = 1; a += (a = 2)"),
- nxt_string("3") },
-
- { nxt_string("var a = b = 1; var b; a +' '+ b"),
- nxt_string("1 1") },
-
- { nxt_string("var a \n if (!a) a = 3; a"),
- nxt_string("3") },
-
- /* automatic semicolon insertion. */
-
- { nxt_string("(a\n--"),
- nxt_string("SyntaxError: Unexpected token \"--\" in 2") },
-
- { nxt_string("(a\n++"),
- nxt_string("SyntaxError: Unexpected token \"++\" in 2") },
-
- { nxt_string("var x = 0, y = 2; x\n--\ny; [x,y]"),
- nxt_string("0,1") },
-
- /* if. */
-
- { nxt_string("if (0);"),
- nxt_string("undefined") },
-
- { nxt_string("if (0) {}"),
- nxt_string("undefined") },
-
- { nxt_string("if (0);else;"),
- nxt_string("undefined") },
-
- { nxt_string("var a = 1; if (true); else a = 2; a"),
- nxt_string("1") },
-
- { nxt_string("var a = 1; if (false); else a = 2; a"),
- nxt_string("2") },
-
- { nxt_string("var a = 1; if (true) a = 2; else a = 3; a"),
- nxt_string("2") },
-
- { nxt_string("var a = 3; if (true) if (false); else a = 2; a"),
- nxt_string("2") },
-
- { nxt_string("var a = 3; if (true) if (false); else; a = 2; a"),
- nxt_string("2") },
-
- { nxt_string("var a = [3], b; if (1==1||2==2) { b = '1'+'2'+a[0] }; b"),
- nxt_string("123") },
-
- { nxt_string("(function(){ if(true) return 1 else return 0; })()"),
- nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
-
- { nxt_string("(function(){ if(true) return 1; else return 0; })()"),
- nxt_string("1") },
-
- { nxt_string("(function(){ if(true) return 1;; else return 0; })()"),
- nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
-
- { nxt_string("(function(){ if(true) return 1\n else return 0; })()"),
- nxt_string("1") },
-
- { nxt_string("(function(){ if(true) return 1\n;\n else return 0; })()"),
- nxt_string("1") },
-
- { nxt_string("function f(n) {if (n) throw 'foo' else return 1}; f(0)"),
- nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
-
- { nxt_string("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(0)"),
- nxt_string("1") },
-
- { nxt_string("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(1)"),
- nxt_string("foo") },
-
- { nxt_string("function f(n) {if (n == 1) throw 'foo'\nelse if (n == 2) return 1}; f(2)"),
- nxt_string("1") },
-
- { nxt_string("(function(){ for (var p in [1] ){ if (1) break else return 0; }})()"),
- nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
-
- { nxt_string("(function(){ for (var p in [1] ){ if (1) break\n else return 0; }})()"),
- nxt_string("undefined") },
-
- { nxt_string("(function(){ for (var p in [1] ){ if (1) break; else return 0; }})()"),
- nxt_string("undefined") },
-
- { nxt_string("(function(){ for (var p in [1] ){ if (1) continue else return 0; }})()"),
- nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
-
- { nxt_string("(function(){ for (var p in [1] ){ if (1) continue\n else return 0; }})()"),
- nxt_string("undefined") },
-
- { nxt_string("(function(){ for (var p in [1] ){ if (1) continue; else return 0; }})()"),
- nxt_string("undefined") },
-
- { nxt_string("(function(x){ if\n(x) return -1; else return 0; })(0)"),
- nxt_string("0") },
-
- { nxt_string("(function(x){ if\n(\nx) return -1; else return 0; })(0)"),
- nxt_string("0") },
-
- { nxt_string("(function(x){ if\n(\nx)\nreturn -1; else return 0; })(0)"),
- nxt_string("0") },
-
- { nxt_string("(function(x){ if\n(\nx)\nreturn -1\n else return 0; })(0)"),
- nxt_string("0") },
-
- { nxt_string("(function(x){ if\n(\nx)\nreturn -1\n else\nreturn 0; })(0)"),
- nxt_string("0") },
-
- /* do while. */
-
- { nxt_string("do { break } if (false)"),
- nxt_string("SyntaxError: Unexpected token \"if\" in 1") },
-
- /* for in. */
-
- { nxt_string("for (null in undefined);"),
- nxt_string("ReferenceError: Invalid left-hand side \"null\" in for-in statement in 1") },
-
- { nxt_string("for (var a, b in []);"),
- nxt_string("SyntaxError: Unexpected token \"in\" in 1") },
-
- { nxt_string("var s = ''; for (var p in [1,2]) {s += p}; s"),
- nxt_string("01") },
-
- { nxt_string("var s; for (var p in [1]) {s = typeof(p)}; s"),
- nxt_string("string") },
-
- { nxt_string("var s = ''; for (var p in {a:1, b:2}) {s += p}; s"),
- nxt_string("ab") },
-
- { nxt_string("var s = '';"
- "var o = Object.defineProperty({}, 'x', {value:1});"
- "Object.defineProperty(o, 'y', {value:2, enumerable:true});"
- "for (var p in o) {s += p}; s"),
- nxt_string("y") },
-
- { nxt_string("var o = {a:1, b:2}; var arr = []; "
- "for (var a in o) {arr.push(a)}; arr"),
- nxt_string("a,b") },
-
- { nxt_string("var o = {a:1, b:2}; var arr = []; delete o.a; "
- "for (var a in o) {arr.push(a)}; arr"),
- nxt_string("b") },
-
- /* switch. */
-
- { nxt_string("switch"),
- nxt_string("SyntaxError: Unexpected end of input in 1") },
-
- { nxt_string("switch (1);"),
- nxt_string("SyntaxError: Unexpected token \";\" in 1") },
-
- { nxt_string("switch (1) { do { } while (1) }"),
- nxt_string("SyntaxError: Unexpected token \"do\" in 1") },
-
- { nxt_string("switch (1) {}"),
- nxt_string("undefined") },
-
- { nxt_string("switch (1) {default:}"),
- nxt_string("undefined") },
-
- { nxt_string("switch (1) {case 0:}"),
- nxt_string("undefined") },
-
- { nxt_string("switch (1) {default:;}"),
- nxt_string("undefined") },
-
- { nxt_string("switch (1) {default:; default:}"),
- nxt_string("SyntaxError: More than one default clause in switch statement in 1") },
-
- { nxt_string("switch (1) {case 0:;}"),
- nxt_string("undefined") },
-
- { nxt_string("var a = 'A'; switch (a) {"
- "case 0: a += '0';"
- "case 1: a += '1';"
- "}; a"),
- nxt_string("A") },
-
- { nxt_string("var a = 'A'; switch (0) {"
- "case 0: a += '0';"
- "case 1: a += '1';"
- "}; a"),
- nxt_string("A01") },
-
- { nxt_string("var a = 'A'; switch (0) {"
- "case 0: a += '0'; break;"
- "case 1: a += '1';"
- "}; a"),
- nxt_string("A0") },
-
- { nxt_string("var a = 'A'; switch (1) {"
- "case 0: a += '0';"
- "case 1: a += '1';"
- "}; a"),
- nxt_string("A1") },
-
- { nxt_string("var a = 'A'; switch (2) {"
- "case 0: a += '0';"
- "case 1: a += '1';"
- "default: a += 'D';"
- "}; a"),
- nxt_string("AD") },
-
- { nxt_string("var a = 'A'; switch (2) {"
- "case 0: a += '0';"
- "default: a += 'D';"
- "case 1: a += '1';"
- "}; a"),
- nxt_string("AD1") },
-
- { nxt_string("var a = 'A'; function f(x) { a += x; return 0 }"
- "switch (a) {"
- "case f(1):"
- "default:"
- "case f(2): a += 'D';"
- "case f(3): a += 'T';"
- "} a"),
- nxt_string("A123DT") },
-
- { nxt_string("var t; "
- "switch ($r3.uri) {"
- "case 'abc': "
- " t='A'; "
- " break; "
- "default: "
- " t='F'; "
- "}; t"),
- nxt_string("A") },
-
- /* continue. */
-
- { nxt_string("continue"),
- nxt_string("SyntaxError: Illegal continue statement in 1") },
-
- { nxt_string("\n{\ncontinue;\n}"),
- nxt_string("SyntaxError: Illegal continue statement in 3") },
-
- { nxt_string("do continue while (false)"),
- nxt_string("SyntaxError: Unexpected token \"while\" in 1") },
-
- { nxt_string("do continue; while (false)"),
- nxt_string("undefined") },
-
- { nxt_string("do { continue } while (false)"),
- nxt_string("undefined") },
-
- { nxt_string("var i = 0; do if (i++ > 9) continue; while (i < 100); i"),
- nxt_string("100") },
-
- { nxt_string("while (false) continue"),
- nxt_string("undefined") },
-
- { nxt_string("while (false) continue;"),
- nxt_string("undefined") },
-
- { nxt_string("while (false) { continue }"),
- nxt_string("undefined") },
-
- { nxt_string("var i = 0; while (i < 100) if (i++ > 9) continue; i"),
- nxt_string("100") },
-
- { nxt_string("for ( ;null; ) continue"),
- nxt_string("undefined") },
-
- { nxt_string("for ( ;null; ) continue;"),
- nxt_string("undefined") },
-
- { nxt_string("for ( ;null; ) { continue }"),
- nxt_string("undefined") },
-
- { nxt_string("var i; for (i = 0; i < 100; i++) if (i > 9) continue; i"),
- nxt_string("100") },
-
- { nxt_string("var a = [], i; for (i in a) continue"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [], i; for (i in a) continue;"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [], i; for (i in a) { continue }"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
- "for (i in a) { if (a[i] > 4) continue; else s += a[i] } s"),
- nxt_string("10") },
-
- { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
- "for (i in a) { if (a[i] > 4) continue; s += a[i] } s"),
- nxt_string("10") },
-
- { nxt_string("var a; for (a = 1; a; a--) switch (a) { case 0: continue }"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [1,2,3], i; for (i in a) {Object.seal({})}"),
- nxt_string("undefined") },
-
- { nxt_string("var i; for (i in [1,2,3]) {Object.seal({});}"),
- nxt_string("undefined") },
-
- /* break. */
-
- { nxt_string("break"),
- nxt_string("SyntaxError: Illegal break statement in 1") },
-
- { nxt_string("{break}"),
- nxt_string("SyntaxError: Illegal break statement in 1") },
-
- { nxt_string("\nbreak"),
- nxt_string("SyntaxError: Illegal break statement in 2") },
-
- { nxt_string("do break while (true)"),
- nxt_string("SyntaxError: Unexpected token \"while\" in 1") },
-
- { nxt_string("do break; while (true)"),
- nxt_string("undefined") },
-
- { nxt_string("do { break } while (true)"),
- nxt_string("undefined") },
-
- { nxt_string("var i = 0; do if (i++ > 9) break; while (i < 100); i"),
- nxt_string("11") },
-
- { nxt_string("while (true) break"),
- nxt_string("undefined") },
-
- { nxt_string("while (true) break;"),
- nxt_string("undefined") },
-
- { nxt_string("while (true) { break }"),
- nxt_string("undefined") },
-
- { nxt_string("var i = 0; while (i < 100) if (i++ > 9) break; i"),
- nxt_string("11") },
-
- { nxt_string("for ( ;; ) break"),
- nxt_string("undefined") },
-
- { nxt_string("for ( ;; ) break;"),
- nxt_string("undefined") },
-
- { nxt_string("for ( ;; ) { break }"),
- nxt_string("undefined") },
-
- { nxt_string("var i; for (i = 0; i < 100; i++) if (i > 9) break; i"),
- nxt_string("10") },
-
- { nxt_string("var a = [], i; for (i in a) break"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [], i; for (i in a) break;"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [], i; for (i in a) { break }"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
- "for (i in a) { if (a[i] > 4) break; else s += a[i] } s"),
- nxt_string("10") },
-
- { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
- "for (i in a) { if (a[i] > 4) break; s += a[i] } s"),
- nxt_string("10") },
-
- { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
- "for (i in a) if (a[i] > 4) break; s += a[i]; s"),
- nxt_string("5") },
-
- /* Labels. */
-
- { nxt_string("var n = 0; a:{n++}; a:{n++}; n"),
- nxt_string("2") },
-
- { nxt_string("a: throw 'a'"),
- nxt_string("a") },
-
- { nxt_string("a\n:\n1"),
- nxt_string("1") },
-
- { nxt_string("a\n\n:1"),
- nxt_string("1") },
-
- { nxt_string("a:\n\n1"),
- nxt_string("1") },
-
- { nxt_string("a:\n\n"),
- nxt_string("SyntaxError: Unexpected end of input in 3") },
-
- { nxt_string("a : var n = 0; b :++n"),
- nxt_string("1") },
-
- { nxt_string("a:{a:1}"),
- nxt_string("SyntaxError: Label \"a\" has already been declared in 1") },
-
- { nxt_string("for (var i in [1]) {break b}"),
- nxt_string("SyntaxError: Undefined label \"b\" in 1") },
-
- { nxt_string("for (var i in [1]) {continue b}"),
- nxt_string("SyntaxError: Undefined label \"b\" in 1") },
-
- { nxt_string("a:{break b}"),
- nxt_string("SyntaxError: Undefined label \"b\" in 1") },
-
- { nxt_string("a:{continue b}"),
- nxt_string("SyntaxError: Undefined label \"b\" in 1") },
-
-#if 0 /* TODO */
- { nxt_string("a:{1; break a}"),
- nxt_string("1") },
-#endif
-
- { nxt_string("var a = 0; a:{a++}; a"),
- nxt_string("1") },
-
- { nxt_string("var a = 0; a:{break a; a++}; a"),
- nxt_string("0") },
-
- { nxt_string("var r = 0; "
- "out: for (var i in [1,2,3]) { if (i == 2) {break out;}; r++}; r"),
- nxt_string("2") },
-
- { nxt_string("var r = 0; "
- "out: for (var i = 0; i < 5; i++) { if (i == 2) {break out;}; r++}; r"),
- nxt_string("2") },
-
- { nxt_string("var l1 = 0, l2 = 0; "
- "out: "
- "for (var i in [1,2,3]) { "
- " for (var j in [1,2,3]) { "
- " if (i == 1 && j == 1) {break;}"
- " l2++;"
- " }"
- " l1++;"
- "}; [l1, l2]"),
- nxt_string("3,7") },
-
- { nxt_string("var l1 = 0, l2 = 0; "
- "out: "
- "for (var i in [1,2,3]) { "
- " for (var j in [1,2,3]) { "
- " if (i == 1 && j == 1) {break out;}"
- " l2++;"
- " }"
- " l1++;"
- "}; [l1, l2]"),
- nxt_string("1,4") },
-
- { nxt_string("var l1 = 0, l2 = 0; "
- "out: "
- "for (var i in [1,2,3]) { "
- " for (var j in [1,2,3]) { "
- " if (i == 1 && j == 1) {continue out;}"
- " l2++;"
- " }"
- " l1++;"
- "}; [l1, l2]"),
- nxt_string("2,7") },
-
- { nxt_string("var l1 = 0, l2 = 0; "
- "out: "
- "for (var i in [1,2,3]) { "
- " l1++;"
- " switch (i) { "
- " case '1':"
- " break out;"
- " default:"
- " }"
- " l2++;"
- "}; [l1, l2]"),
- nxt_string("2,1") },
-
- { nxt_string("var l1 = 0, l2 = 0; "
- "out: "
- "for (var i in [1,2,3]) { "
- " l1++;"
- " switch (i) { "
- " case '1':"
- " continue out;"
- " default:"
- " }"
- " l2++;"
- "}; [l1, l2]"),
- nxt_string("3,2") },
-
- { nxt_string("var l1 = 0, l2 = 0, i = 0, j; "
- "out: "
- "while (i < 3) { "
- " j = 0;"
- " while (j < 3) { "
- " if (i == 1 && j == 1) {break out;}"
- " l2++;"
- " j++;"
- " }"
- " l1++;"
- " i++;"
- "}; [l1, l2]"),
- nxt_string("1,4") },
-
- { nxt_string("var l1 = 0, l2 = 0, i = 0, j; "
- "out: "
- "while (i < 3) { "
- " j = 0;"
- " while (j < 3) { "
- " if (i == 1 && j == 1) {i++; continue out;}"
- " l2++;"
- " j++;"
- " }"
- " l1++;"
- " i++;"
- "}; [l1, l2]"),
- nxt_string("2,7") },
-
- { nxt_string("var l1 = 0, l2 = 0, i = 0, j; "
- "out: "
- "do { "
- " j = 0;"
- " do { "
- " if (i == 1 && j == 1) {break out;}"
- " l2++;"
- " j++;"
- " } while (j < 3)"
- " l1++;"
- " i++;"
- "} while (i < 3); [l1, l2]"),
- nxt_string("1,4") },
-
- { nxt_string("var l1 = 0, l2 = 0, i = 0, j; "
- "out: "
- "do { "
- " j = 0;"
- " do { "
- " if (i == 1 && j == 1) {i++; continue out;}"
- " l2++;"
- " j++;"
- " } while (j < 3)"
- " l1++;"
- " i++;"
- "} while (i < 3); [l1, l2]"),
- nxt_string("2,7") },
-
- { nxt_string("out1: while (1) { out2: while (1) { "
- " try { break out1; break out2; } catch (e) {}"
- "}}"),
- nxt_string("InternalError: break/return instructions with different labels "
- "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
- { nxt_string("out1: while (1) { out2: while (1) { "
- " try { } catch (e) {break out1; break out2;} finally {}"
- "}}"),
- nxt_string("InternalError: break/return instructions with different labels "
- "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
- { nxt_string("out1: while (1) { out2: while (1) { "
- " try { break out1; } catch (e) {break out2;} finally {}"
- "}}"),
- nxt_string("InternalError: try break/return instructions with different labels "
- "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
- { nxt_string("out1: while (1) { out2: while (1) { "
- " try { break out1; break out2; } finally {}"
- "}}"),
- nxt_string("InternalError: break/return instructions with different labels "
- "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
- { nxt_string("out1: while (1) { out2: while (1) { "
- " try { continue out1; continue out2; } catch (e) {}"
- "}}"),
- nxt_string("InternalError: continue instructions with different labels "
- "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
- { nxt_string("out1: while (1) { out2: while (1) { "
- " try { continue out1; } catch (e) {continue out2;} finally {}"
- "}}"),
- nxt_string("InternalError: try continue instructions with different labels "
- "(\"out1\" vs \"out2\") from try-catch block are not supported") },
-
- { nxt_string("function f() {"
- " a:{ try { try { return 'a'; } catch (e) {break a;} finally {} } "
- " catch (e) {} finally {}; }"
- "}"),
- nxt_string("InternalError: try break/return instructions with different labels "
- "(\"@return\" vs \"a\") from try-catch block are not supported") },
-
- { nxt_string("a:{ try { try { continue a; } catch (e) {} finally {} } "
- " catch (e) {} finally {}; "
- "}"),
- nxt_string("SyntaxError: Illegal continue statement in 1") },
-
- { nxt_string("var i = 0, j = 0, r = 0;"
- "out1: while (i < 3) "
- "{ "
- " i++;"
- " out2: while (j < 3) { "
- " j++; try { break out1; } catch (e) {} finally {r++}"
- " }"
- "}; [i, j, r]"),
- nxt_string("1,1,1") },
-
- { nxt_string("var i = 0, j = 0, r = 0;"
- "out1: while (i < 3) "
- "{ "
- " i++;"
- " out2: while (j < 3) { "
- " j++; try { continue out1; } catch (e) {} finally {r++}"
- " }"
- "}; [i, j, r]"),
- nxt_string("3,3,3") },
-
- { nxt_string("var c=0,fin=0;"
- "try {"
- " while (c < 2) {"
- " try { c += 1; throw 'e';}"
- " finally { fin = 1; break;}"
- " fin = -1;"
- " c += 2;"
- " }"
- "} catch(e) {c = 10;}; [c, fin]"),
- nxt_string("1,1") },
-
- /* jumping out of a nested try-catch block. */
-
- { nxt_string("var r = 0; "
- "function f () { try { try {return 'a';} finally { r++; }} "
- " finally { r++; } }; "
- "[f(), r]"),
- nxt_string("a,2") },
-
- { nxt_string("function f(n) { "
- " var r1 = 0, r2 = 0, r3 = 0;"
- " a:{ try { try { "
- " if (n == 0) { break a; } "
- " if (n == 1) { throw 'a'; } "
- " } "
- " catch (e) { break a; } finally { r1++; } } "
- " catch (e) {} "
- " finally { r2++; } "
- " r3++; "
- " }; "
- "return [r1, r2, r3]"
- "}; njs.dump([f(0), f(1), f(3)])"),
- nxt_string("[[1,1,0],[1,1,0],[1,1,1]]") },
-
- /**/
-
- { nxt_string("var i; for (i = 0; i < 10; i++) { i += 1 } i"),
- nxt_string("10") },
-
- /* Factorial. */
-
- { nxt_string("var n = 5, f = 1; while (n--) f *= n + 1; f"),
- nxt_string("120") },
-
- { nxt_string("var n = 5, f = 1; while (n) { f *= n; n-- } f"),
- nxt_string("120") },
-
- /* Fibonacci. */
-
- { nxt_string("var n = 50, x, i, j, k;"
- "for(i=0,j=1,k=0; k<n; i=j,j=x,k++ ){ x=i+j } x"),
- nxt_string("20365011074") },
-
- { nxt_string("3 + 'abc' + 'def' + null + true + false + undefined"),
- nxt_string("3abcdefnulltruefalseundefined") },
-
- { nxt_string("var a = 0; do a++; while (a < 5) if (a == 5) a = 7.33 \n"
- "else a = 8; while (a < 10) a++; a"),
- nxt_string("10.33") },
-
- /* typeof. */
-
- { nxt_string("typeof null"),
- nxt_string("object") },
-
- { nxt_string("typeof undefined"),
- nxt_string("undefined") },
-
- { nxt_string("typeof false"),
- nxt_string("boolean") },
-
- { nxt_string("typeof true"),
- nxt_string("boolean") },
-
- { nxt_string("typeof 0"),
- nxt_string("number") },
-
- { nxt_string("typeof -1"),
- nxt_string("number") },
-
- { nxt_string("typeof Infinity"),
- nxt_string("number") },
-
- { nxt_string("typeof NaN"),
- nxt_string("number") },
-
- { nxt_string("typeof 'a'"),
- nxt_string("string") },
-
- { nxt_string("typeof {}"),
- nxt_string("object") },
-
- { nxt_string("typeof Object()"),
- nxt_string("object") },
-
- { nxt_string("typeof []"),
- nxt_string("object") },
-
- { nxt_string("typeof function(){}"),
- nxt_string("function") },
-
- { nxt_string("typeof Object"),
- nxt_string("function") },
-
- { nxt_string("typeof /./i"),
- nxt_string("object") },
-
- { nxt_string("typeof Date.prototype"),
- nxt_string("object") },
-
- { nxt_string("typeof a"),
- nxt_string("undefined") },
-
- { nxt_string("typeof a; var a"),
- nxt_string("undefined") },
-
- { nxt_string("typeof a; var a; a"),
- nxt_string("undefined") },
-
- { nxt_string("var a = 5; typeof a"),
- nxt_string("number") },
-
- { nxt_string("function f() { return typeof a } ; f()"),
- nxt_string("undefined") },
-
- { nxt_string("typeof a; a"),
- nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
- { nxt_string("typeof a; a = 1"),
- nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
- /**/
-
- { nxt_string("void 0"),
- nxt_string("undefined") },
-
- { nxt_string("null = 1"),
- nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
-
- { nxt_string("undefined = 1"),
- nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
-
- { nxt_string("null++"),
- nxt_string("ReferenceError: Invalid left-hand side in postfix operation in 1") },
-
- { nxt_string("++null"),
- nxt_string("ReferenceError: Invalid left-hand side in prefix operation in 1") },
-
- { nxt_string("var a, b; b = a; a = 1; a +' '+ b"),
- nxt_string("1 undefined") },
-
- { nxt_string("a = 1"),
- nxt_string("ReferenceError: \"a\" is not defined in 1") },
-
- { nxt_string("var a; a = 1; a"),
- nxt_string("1") },
-
- { nxt_string("var a = {}; typeof a +' '+ a"),
- nxt_string("object [object Object]") },
-
- { nxt_string("var a = {}; a.b"),
- nxt_string("undefined") },
-
- { nxt_string("var a = {}; a.b = 1 + 2; a.b"),
- nxt_string("3") },
-
- { nxt_string("var a = {}; a['b']"),
- nxt_string("undefined") },
-
- { nxt_string("var a = {}; a.b.c"),
- nxt_string("TypeError: cannot get property \"c\" of undefined") },
-
- { nxt_string("'a'[0]"),
- nxt_string("a") },
-
- { nxt_string("'a'[undefined]"),
- nxt_string("undefined") },
-
- { nxt_string("'a'[null]"),
- nxt_string("undefined") },
-
- { nxt_string("'a'[false]"),
- nxt_string("undefined") },
-
- { nxt_string("'a'.b = 1"),
- nxt_string("TypeError: property set on primitive string type") },
-
- { nxt_string("'a'[2] = 1"),
- nxt_string("TypeError: property set on primitive string type") },
-
- { nxt_string("var a = {}; a.b = 1; a.b"),
- nxt_string("1") },
-
- { nxt_string("var a = {}; a.b = 1; a.b += 2"),
- nxt_string("3") },
-
- { nxt_string("var a = {}; a.b = 1; a.b += a.b"),
- nxt_string("2") },
-
- { nxt_string("var a = {}; a.b = 1; var x = {}; x.b = 3; a.b += (x.b = 2)"),
- nxt_string("3") },
-
- { nxt_string("var a = {}; a.b = 1; a.b += (a.b = 2)"),
- nxt_string("3") },
-
- { nxt_string("var a = {}; a.b += 1"),
- nxt_string("NaN") },
-
- { nxt_string("var a = 1; var b = 2; a = b += 1"),
- nxt_string("3") },
-
- { nxt_string("var a = 1; var b = { x:2 }; a = b.x += 1"),
- nxt_string("3") },
-
- { nxt_string("var a = 1; var b = { x:2 }; a = b.x += (a = 1)"),
- nxt_string("3") },
-
- { nxt_string("var a = undefined; a.b++; a.b"),
- nxt_string("TypeError: cannot get property \"b\" of undefined") },
-
- { nxt_string("var a = null; a.b++; a.b"),
- nxt_string("TypeError: cannot get property \"b\" of undefined") },
-
- { nxt_string("var a = true; a.b++; a.b"),
- nxt_string("TypeError: property set on primitive boolean type") },
-
- { nxt_string("var a = 1; a.b++; a.b"),
- nxt_string("TypeError: property set on primitive number type") },
-
- { nxt_string("var n = 1, o = { p: n += 1 }; o.p"),
- nxt_string("2") },
-
- { nxt_string("var a = {}; a.b = {}; a.b.c = 1; a.b['c']"),
- nxt_string("1") },
-
- { nxt_string("var a = {}; a.b = {}; a.b.c = 1; a['b']['c']"),
- nxt_string("1") },
-
- { nxt_string("var a = {}; a.b = {}; var c = 'd'; a.b.d = 1; a['b'][c]"),
- nxt_string("1") },
-
- { nxt_string("var a = {}; a.b = 1; var c = a.b++; a.b +' '+ c"),
- nxt_string("2 1") },
-
- { nxt_string("var a = 2; a.b = 1; var c = a.b++; a +' '+ a.b +' '+ c"),
- nxt_string("TypeError: property set on primitive number type") },
-
- { nxt_string("var x = { a: 1 }; x.a"),
- nxt_string("1") },
-
- { nxt_string("var a = { x:1 }; var b = { y:2 }; a.x = b.y; a.x"),
- nxt_string("2") },
-
- { nxt_string("var a = { x:1 }; var b = { y:2 }; var c; c = a.x = b.y"),
- nxt_string("2") },
-
- { nxt_string("var a = { x:1 }; var b = { y:2 }; var c = a.x = b.y; c"),
- nxt_string("2") },
-
- { nxt_string("var a = { x:1 }; var b = { y:2 }; a.x = b.y"),
- nxt_string("2") },
-
- { nxt_string("var a = { x:1 }; var b = a.x = 1 + 2; a.x +' '+ b"),
- nxt_string("3 3") },
-
- { nxt_string("var a = { x:1 }; var b = { y:2 }; var c = {};"
- "c.x = a.x = b.y; c.x"),
- nxt_string("2") },
-
- { nxt_string("var y = 2, x = { a:1, b: y + 5, c:3 };"
- "x.a +' '+ x.b +' '+ x.c"),
- nxt_string("1 7 3") },
-
- { nxt_string("var x = { a: 1, b: { a:2, c:5 } };"
- "x.a +' '+ x.b.a +' '+ x.b.c"),
- nxt_string("1 2 5") },
-
- { nxt_string("var y = 5, x = { a:y }; x.a"),
- nxt_string("5") },
-
- { nxt_string("var x = { a: 1; b: 2 }"),
- nxt_string("SyntaxError: Unexpected token \";\" in 1") },
-
- { nxt_string("var x = { a: 1, b: x.a }"),
- nxt_string("TypeError: cannot get property \"a\" of undefined") },
-
- { nxt_string("var a = { b: 2 }; a.b += 1"),
- nxt_string("3") },
-
- { nxt_string("var o = {a:1}, c = o; o.a = o = {b:5};"
- "o.a +' '+ o.b +' '+ c.a.b"),
- nxt_string("undefined 5 5") },
-
- { nxt_string("var y = { a: 2 }, x = { a: 1, b: y.a }; x.a +' '+ x.b"),
- nxt_string("1 2") },
-
- { nxt_string("var y = { a: 1 }, x = { a: y.a++, b: y.a++ }\n"
- "x.a +' '+ x.b +' '+ y.a"),
- nxt_string("1 2 3") },
-
- { nxt_string("var a='', o = {a:1, b:2}, p;"
- "for (p in o) { a += p +':'+ o[p] +',' } a"),
- nxt_string("a:1,b:2,") },
-
- { nxt_string("var x = { a: 1 }, b = delete x.a; x.a +' '+ b"),
- nxt_string("undefined true") },
-
- /* Object shorthand property. */
-
- { nxt_string("var a = 1; njs.dump({a})"),
- nxt_string("{a:1}") },
-
- { nxt_string("var a = 1, b; njs.dump({a,b})"),
- nxt_string("{a:1,b:undefined}") },
-
- { nxt_string("var a = 1, b = 2; ({a,b,c})"),
- nxt_string("ReferenceError: \"c\" is not defined in 1") },
-
- { nxt_string("var a = 1, b = 2; njs.dump({a,b,c:3})"),
- nxt_string("{a:1,b:2,c:3}") },
-
- { nxt_string("var b = 2, c = 3; njs.dump({a:1,b,c})"),
- nxt_string("{a:1,b:2,c:3}") },
-
- { nxt_string("({1})"),
- nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
- { nxt_string("({default})"),
- nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
- { nxt_string("({var})"),
- nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
- { nxt_string("({this})"),
- nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
- { nxt_string("typeof ({Number}).Number"),
- nxt_string("function") },
-
- { nxt_string("typeof ({eval}).eval"),
- nxt_string("function") },
-
- { nxt_string("typeof ({Math}).Math.sin"),
- nxt_string("function") },
-
- { nxt_string("delete null"),
- nxt_string("true") },
-
- { nxt_string("var a; delete a"),
- nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
-
- { nxt_string("delete undefined"),
- nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
-
- /* Object shorthand methods. */
-
- { nxt_string("var o = {m(){}}; new o.m();"),
- nxt_string("TypeError: function is not a constructor") },
-
- { nxt_string("var o = {sum(a, b){return a + b;}}; o.sum(1, 2)"),
- nxt_string("3") },
-
- /* Object computed property. */
-
- { nxt_string("var o = { [0]: 1, [-0]: 2 }; o[0];"),
- nxt_string("2") },
-
- { nxt_string("var k = 'abc'.split('');var o = {[k[0]]: 'baz'}; o.a"),
- nxt_string("baz") },
-
- { nxt_string("var k = {}; var o = {[k]() {return 'baz'}}; o[k]()"),
- nxt_string("baz") },
-
- { nxt_string("njs.dump({[{toString(){return 'xx'}}]:1})"),
- nxt_string("{xx:1}") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'toString', {value:()=>'xx'});"
- "njs.dump({[o]:1})"),
- nxt_string("{xx:1}") },
-
- { nxt_string("({[{toString(){return {}}}]:1})"),
- nxt_string("TypeError: Cannot convert object to primitive value") },
-
- { nxt_string("var o = { [new Number(12345)]: 1000 }; o[12345]"),
- nxt_string("1000") },
-
- /* ES5FIX: "SyntaxError". */
-
- { nxt_string("delete NaN"),
- nxt_string("true") },
-
- /* ES5FIX: "SyntaxError". */
-
- { nxt_string("delete Infinity"),
- nxt_string("true") },
-
- { nxt_string("delete -Infinity"),
- nxt_string("true") },
-
- { nxt_string("delete (1/0)"),
- nxt_string("true") },
-
- { nxt_string("delete 1"),
- nxt_string("true") },
-
- { nxt_string("var a = []; delete a[1]"),
- nxt_string("true") },
-
- { nxt_string("var o = {}; [delete o.m, delete o.m]"),
- nxt_string("true,true") },
-
- { nxt_string("[delete Array.nonexistent, delete Array.Array]"),
- nxt_string("true,true") },
-
- { nxt_string("var a; delete (a = 1); a"),
- nxt_string("1") },
-
- { nxt_string("delete a"),
- nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
-
- { nxt_string("var a = 1; delete a"),
- nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
-
- { nxt_string("function f(){} delete f"),
- nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
-
- { nxt_string("var a = { x:1 }; ('x' in a) +' '+ (1 in a)"),
- nxt_string("true false") },
-
- { nxt_string("delete --[][1]"),
- nxt_string("true") },
-
- { nxt_string("var a = [1,2]; delete a.length"),
- nxt_string("TypeError: Cannot delete property \"length\" of array") },
-
- { nxt_string("var a = [1,2,3]; a.x = 10; delete a[1]"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.create({a:1}); o.a = 2; delete o.a; o.a"),
- nxt_string("1") },
-
- { nxt_string("delete Array.name"),
- nxt_string("true") },
-
- { nxt_string("delete Math.max"),
- nxt_string("true") },
-
- { nxt_string("delete Math.max.length"),
- nxt_string("true") },
-
- { nxt_string("function f(a,b) {} "
- "[f.length, delete f.length, f.length, delete f.length]"),
- nxt_string("2,true,0,true") },
-
- { nxt_string("njs.dump({break:1,3:2,'a':4,\"b\":2,true:1,null:0})"),
- nxt_string("{break:1,3:2,a:4,b:2,true:1,null:0}") },
-
- { nxt_string("var o1 = {a:1,b:2}, o2 = {c:3}; o1.a + o2.c"),
- nxt_string("4") },
-
- { nxt_string("({[]:1})"),
- nxt_string("SyntaxError: Unexpected token \"]\" in 1") },
-
- { nxt_string("({'AB\\ncd':1})['AB\\ncd']"),
- nxt_string("1") },
-
- /* Inheritance. */
-
- { nxt_string("function Foo() {this.bar = 10;}; Foo.prototype.bar = 42; "
- "var v = new Foo(); delete v.bar; v.bar"),
- nxt_string("42") },
-
- { nxt_string("function Cl(x,y) {this.x = x; this.y = y}; "
- "var c = new Cl('a', 'b'); Cl.prototype.z = 1; c.z"),
- nxt_string("1") },
-
- /**/
-
- { nxt_string("delete Math.E"),
- nxt_string("TypeError: Cannot delete property \"E\" of object") },
-
- { nxt_string("Math.E = 1"),
- nxt_string("TypeError: Cannot assign to read-only property \"E\" of object") },
-
- { nxt_string("var o = { 'a': 1, 'b': 2 }; var i; "
- "for (i in o) { delete o.a; delete o.b; }; njs.dump(o)"),
- nxt_string("{}") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', {value:1, configurable:1}); "
- "delete o.a; o.a=2; o.a"),
- nxt_string("2") },
-
- { nxt_string("var a = {}; 1 in a"),
- nxt_string("false") },
-
- { nxt_string("'a' in {a:1}"),
- nxt_string("true") },
-
- { nxt_string("'a' in Object.create({a:1})"),
- nxt_string("true") },
-
- { nxt_string("var a = 1; 1 in a"),
- nxt_string("TypeError: property in on a primitive value") },
-
- { nxt_string("var a = true; 1 in a"),
- nxt_string("TypeError: property in on a primitive value") },
-
- { nxt_string("var n = { toString: function() { return 'a' } };"
- "var o = { a: 5 }; o[n]"),
- nxt_string("5") },
-
- { nxt_string("var n = { valueOf: function() { return 'a' } };"
- "var o = { a: 5, '[object Object]': 7 }; o[n]"),
- nxt_string("7") },
-
- { nxt_string("var o = {}; o.new = 'OK'; o.new"),
- nxt_string("OK") },
-
- { nxt_string("var o = { new: 'OK'}; o.new"),
- nxt_string("OK") },
-
- /* Arrays */
-
- /* Empty array to primitive. */
-
- { nxt_string("3 + []"),
- nxt_string("3") },
-
- { nxt_string("3 * []"),
- nxt_string("0") },
-
- /* Single element array to primitive. */
-
- { nxt_string("3 + [5]"),
- nxt_string("35") },
-
- { nxt_string("3 * [5]"),
- nxt_string("15") },
-
- /* Array to primitive. */
-
- { nxt_string("3 + [5,7]"),
- nxt_string("35,7") },
-
- { nxt_string("3 * [5,7]"),
- nxt_string("NaN") },
-
- { nxt_string("var a = [ 1, 2, 3 ]; a[0] + a[1] + a[2]"),
- nxt_string("6") },
-
- { nxt_string("var a = [ 1, 2, 3 ]; a[-1] = 4; a + a[-1]"),
- nxt_string("1,2,34") },
-
- { nxt_string("var a = [ 1, 2, 3 ]; a[4294967295] = 4; a + a[4294967295]"),
- nxt_string("1,2,34") },
-
- { nxt_string("var a = [ 1, 2, 3 ]; a[4294967296] = 4; a + a[4294967296]"),
- nxt_string("1,2,34") },
-
- { nxt_string("delete[]['4e9']"),
- nxt_string("true") },
-
- { nxt_string("var n = 1, a = [ n += 1 ]; a"),
- nxt_string("2") },
-
- { nxt_string("var a = [ 1, 2; 3 ]; a[0] + a[1] + a[2]"),
- nxt_string("SyntaxError: Unexpected token \";\" in 1") },
-
- { nxt_string("var a = [ 1, 2, 3 ]; a[0] +' '+ a[1] +' '+ a[2] +' '+ a[3]"),
- nxt_string("1 2 3 undefined") },
-
- { nxt_string("var a = [ 5, 6, 7 ]; a['1']"),
- nxt_string("6") },
-
- { nxt_string("var a = [ 5, 6, 7 ]; a['01']"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [ 5, 6, 7 ]; a[0x1]"),
- nxt_string("6") },
-
- { nxt_string("var a = [ 5, 6, 7 ]; a['0x1']"),
- nxt_string("undefined") },
-
- { nxt_string("[] - 2"),
- nxt_string("-2") },
-
- { nxt_string("[1] - 2"),
- nxt_string("-1") },
-
- { nxt_string("[[1]] - 2"),
- nxt_string("-1") },
-
- { nxt_string("[[[1]]] - 2"),
- nxt_string("-1") },
-
- { nxt_string("var a = []; a - 2"),
- nxt_string("-2") },
-
- { nxt_string("var a = [1]; a - 2"),
- nxt_string("-1") },
-
- { nxt_string("var a = []; a[0] = 1; a - 2"),
- nxt_string("-1") },
-
- { nxt_string("[] + 2 + 3"),
- nxt_string("23") },
-
- { nxt_string("[1] + 2 + 3"),
- nxt_string("123") },
-
- { nxt_string("var a = []; a + 2 + 3"),
- nxt_string("23") },
-
- { nxt_string("var a = [1]; a + 2 + 3"),
- nxt_string("123") },
-
- { nxt_string("var a = [1,2], i = 0; a[i++] += a[0] = 5 + i;"
- "a[0] +' '+ a[1]"),
- nxt_string("7 2") },
-
- { nxt_string("var a = []; a[0] = 1; a + 2 + 3"),
- nxt_string("123") },
-
- { nxt_string("var a = []; a['0'] = 1; a + 2 + 3"),
- nxt_string("123") },
-
- { nxt_string("var a = []; a[2] = 1; a[2]"),
- nxt_string("1") },
-
- { nxt_string("var a = [1, 2]; 1 in a"),
- nxt_string("true") },
-
- { nxt_string("var a = [1, 2]; 2 in a"),
- nxt_string("false") },
-
- { nxt_string("var a = [1, 2]; delete a[0]; 0 in a"),
- nxt_string("false") },
-
- { nxt_string("var a = [ function(a) {return a + 1} ]; a[0](5)"),
- nxt_string("6") },
-
- { nxt_string("var s = '', a = [5,1,2], i;"
- "a[null] = null;"
- "a[undefined] = 'defined';"
- "a[false] = false;"
- "a[true] = true;"
- "a[-0] = 0;"
- "a[Infinity] = Infinity;"
- "a[-Infinity] = -Infinity;"
- "a[NaN] = NaN;"
- "a[-NaN] = -NaN;"
- "for (i in a) { s += i +':'+ a[i] +',' } s"),
- nxt_string("0:0,1:1,2:2,null:null,undefined:defined,false:false,"
- "true:true,Infinity:Infinity,-Infinity:-Infinity,NaN:NaN,") },
-
- { nxt_string("--[][3e9]"),
- nxt_string("MemoryError") },
-
- { nxt_string("[].length"),
- nxt_string("0") },
-
- { nxt_string("[1,2].length"),
- nxt_string("2") },
-
- { nxt_string("var a = [1,2]; a.length"),
- nxt_string("2") },
-
- { nxt_string("[\n1]"),
- nxt_string("1") },
-
- { nxt_string("\n[\n1\n]"),
- nxt_string("1") },
-
- { nxt_string("\n[\n1\n,\n2]\n[\n0]"),
- nxt_string("1") },
-
- { nxt_string("Object.create([1,2]).length"),
- nxt_string("2") },
-
- { nxt_string("Object.create(['α','β'])[1]"),
- nxt_string("β") },
-
- { nxt_string("Object.create(['α','β'])[false]"),
- nxt_string("undefined") },
-
- { nxt_string("var a = ['abc']; var o = Object.create(a); o[0] = 32;"
- "[a,o[0]]"),
- nxt_string("abc,32") },
-
- /* Array.length setter */
-
- { nxt_string("[].length = {}"),
- nxt_string("RangeError: Invalid array length") },
-
- { nxt_string("[].length = 2**32 - 1"),
- nxt_string("MemoryError") },
-
- { nxt_string("[].length = 3e9"),
- nxt_string("MemoryError") },
-
- { nxt_string("Object.defineProperty([], 'length',{value: 2**32 - 1})"),
- nxt_string("MemoryError") },
-
- { nxt_string("[].length = 2**32"),
- nxt_string("RangeError: Invalid array length") },
-
- { nxt_string("[].length = 2**32 + 1"),
- nxt_string("RangeError: Invalid array length") },
-
- { nxt_string("[].length = -1"),
- nxt_string("RangeError: Invalid array length") },
-
- { nxt_string("var a = [1];"
- "typeof (a.length = '') == 'string' && a.length == 0"),
- nxt_string("true") },
-
- { nxt_string("var a = [1]; "
- "typeof (a.length = Object(2)) == 'object' && a.length == 2"),
- nxt_string("true") },
-
- { nxt_string("var a = [1]; "
- "typeof (a.length = Object('2')) == 'object'"),
- nxt_string("true") },
-
- { nxt_string("var a = [1]; "
- "a.length = { valueOf: () => 2 }; a.length == 2"),
- nxt_string("true") },
-
- { nxt_string("var a = [1]; "
- "a.length = { toString: () => '2' }; a.length == 2"),
- nxt_string("true") },
-
- { nxt_string("var a = []; a.length = 0; JSON.stringify(a)"),
- nxt_string("[]") },
-
- { nxt_string("var a = []; a.length = 1; JSON.stringify(a)"),
- nxt_string("[null]") },
-
- { nxt_string("var a = [1]; a.length = 1; JSON.stringify(a)"),
- nxt_string("[1]") },
-
- { nxt_string("var a = [1]; a.length = 2; JSON.stringify(a)"),
- nxt_string("[1,null]") },
-
- { nxt_string("var a = [1]; a.length = 4; a.length = 0; JSON.stringify(a)"),
- nxt_string("[]") },
-
- { nxt_string("var a = [1,2,3]; a.length = 2; JSON.stringify(a)"),
- nxt_string("[1,2]") },
-
- { nxt_string("var a = [1,2,3]; a.length = 3; a"),
- nxt_string("1,2,3") },
-
- { nxt_string("var a = [1,2,3]; a.length = 16; a"),
- nxt_string("1,2,3,,,,,,,,,,,,,") },
-
- { nxt_string("var a = [1,2,3]; a.join()"),
- nxt_string("1,2,3") },
-
- { nxt_string("var a = [1,2,3]; a.join(':')"),
- nxt_string("1:2:3") },
-
- { nxt_string("var a = []; a[5] = 5; a.join()"),
- nxt_string(",,,,,5") },
-
- { nxt_string("var a = [,null,undefined,false,true,0,1]; a.join()"),
- nxt_string(",,,false,true,0,1") },
-
- { nxt_string("var o = { toString: function() { return null } };"
- "[o].join()"),
- nxt_string("null") },
-
- { nxt_string("var o = { toString: function() { return undefined } };"
- "[o].join()"),
- nxt_string("undefined") },
-
- { nxt_string("var a = []; a[5] = 5; a"),
- nxt_string(",,,,,5") },
-
- { nxt_string("var a = []; a.concat([])"),
- nxt_string("") },
-
- { nxt_string("var s = { toString: function() { return 'S' } };"
- "var v = { toString: 8, valueOf: function() { return 'V' } };"
- "var o = [9]; o.join = function() { return 'O' };"
- "var a = [1,2,3,[4,5,6],s,v,o]; a.join('')"),
- nxt_string("1234,5,6SVO") },
-
- { nxt_string("var s = { toString: function() { return 'S' } };"
- "var v = { toString: 8, valueOf: function() { return 'V' } };"
- "var o = [9]; o.join = function() { return 'O' };"
- "var a = [1,2,3,[4,5,6],s,v,o]; a"),
- nxt_string("1,2,3,4,5,6,S,V,O") },
-
- /* Array.toString(). */
-
- { nxt_string("var a = [1,2,3]; a.join = 'NO';"
- "Object.prototype.toString = function () { return 'A' }; a"),
- nxt_string("[object Array]") },
-
- { nxt_string("Array.prototype.toString.call(1)"),
- nxt_string("[object Number]") },
-
- { nxt_string("Array.prototype.toString.call('abc')"),
- nxt_string("[object String]") },
-
- /* Empty array elements. */
-
- { nxt_string("[,,]"),
- nxt_string(",") },
-
- { nxt_string("[,,,]"),
- nxt_string(",,") },
-
- { nxt_string("[1,2,]"),
- nxt_string("1,2") },
-
- { nxt_string("[1,2,,3]"),
- nxt_string("1,2,,3") },
-
- { nxt_string("[,,].length"),
- nxt_string("2") },
-
- { nxt_string("[,,,].length"),
- nxt_string("3") },
-
- { nxt_string("[1,2,,3].length"),
- nxt_string("4") },
-
- /**/
-
- { nxt_string("var n = { toString: function() { return 1 } }; [1,2][n]"),
- nxt_string("2") },
-
- { nxt_string("var n = { toString: function() { return '1' } }; [1,2][n]"),
- nxt_string("2") },
-
- { nxt_string("var n = { toString: function() { return 1 },"
- " valueOf: function() { return 0 } }; [1,2][n]"),
- nxt_string("2") },
-
- { nxt_string("var n = { toString: function() { return 1.5 } };"
- "var a = [1,2]; a[1.5] = 5; a[n]"),
- nxt_string("5") },
-
- { nxt_string("var n = { toString: function() { return 1.5 } };"
- "var a = [1,2]; a[n] = 5; a[1.5]"),
- nxt_string("5") },
-
- { nxt_string("var n = { toString: function() { return '1.5' } };"
- "var a = [1,2]; a[1.5] = 5; a[n]"),
- nxt_string("5") },
-
- { nxt_string("var n = { toString: function() { return '1.5' } };"
- "var a = [1,2]; a[n] = 5; a[1.5]"),
- nxt_string("5") },
-
- { nxt_string("var n = { toString: function() { return 1.5 } };"
- "var a = [1,2]; a[1.5] = 5; n in a"),
- nxt_string("true") },
-
- { nxt_string("var n = { toString: function() { return '1.5' } };"
- "var a = [1,2]; a[1.5] = 5; '' + (n in a) + (delete a[n])"),
- nxt_string("truetrue") },
-
- /**/
-
- { nxt_string("Array.isArray()"),
- nxt_string("false") },
-
- { nxt_string("Array.isArray(1)"),
- nxt_string("false") },
-
- { nxt_string("Array.isArray(1) ? 'true' : 'false'"),
- nxt_string("false") },
-
- { nxt_string("Array.isArray([])"),
- nxt_string("true") },
-
- { nxt_string("Array.isArray([]) ? 'true' : 'false'"),
- nxt_string("true") },
-
- { nxt_string("Array.of()"),
- nxt_string("") },
-
- { nxt_string("Array.of(1,2,3)"),
- nxt_string("1,2,3") },
-
- { nxt_string("Array.of(undefined,1)"),
- nxt_string(",1") },
-
- { nxt_string("Array.of(NaN,-1,{})"),
- nxt_string("NaN,-1,[object Object]") },
-
- { nxt_string("var a = [1,2,3]; a.concat(4, [5, 6, 7], 8)"),
- nxt_string("1,2,3,4,5,6,7,8") },
-
- { nxt_string("var a = []; a[100] = a.length; a[100] +' '+ a.length"),
- nxt_string("0 101") },
-
- { nxt_string("var a = [1,2]; a[100] = 100; a[100] +' '+ a.length"),
- nxt_string("100 101") },
-
- { nxt_string("Array.prototype.slice(1)"),
- nxt_string("") },
-
- { nxt_string("Array.prototype.slice(1,2)"),
- nxt_string("") },
-
- { nxt_string("Array.prototype.slice.call(undefined)"),
- nxt_string("TypeError: cannot convert undefined to object") },
-
- { nxt_string("Array.prototype.slice.call(1)"),
- nxt_string("") },
-
- { nxt_string("Array.prototype.slice.call(false)"),
- nxt_string("") },
-
- { nxt_string("Array.prototype.slice.call({'0':'a', '1':'b', length:1})"),
- nxt_string("a") },
-
- { nxt_string("Array.prototype.slice.call({'0':'a', '1':'b', length:2})"),
- nxt_string("a,b") },
-
- { nxt_string("Array.prototype.slice.call({'0':'a', '1':'b', length:4})"),
- nxt_string("a,b,,") },
-
- { nxt_string("Array.prototype.slice.call({'0':'a', '1':'b', length:2}, 1)"),
- nxt_string("b") },
-
- { nxt_string("Array.prototype.slice.call({'0':'a', '1':'b', length:2}, 1, 2)"),
- nxt_string("b") },
-
- { nxt_string("Array.prototype.slice.call({length:'2'})"),
- nxt_string(",") },
-
- { nxt_string("njs.dump(Array.prototype.slice.call({length: 3, 1: undefined }))"),
- nxt_string("[<empty>,undefined,<empty>]") },
-
- { nxt_string("Array.prototype.slice.call({length:new Number(3)})"),
- nxt_string(",,") },
-
- { nxt_string("Array.prototype.slice.call({length: { valueOf: function() { return 2; } }})"),
- nxt_string(",") },
-
- { nxt_string("Array.prototype.slice.call({ length: Object.create(null) })"),
- nxt_string("TypeError: Cannot convert object to primitive value") },
-
- { nxt_string("Array.prototype.slice.call({length:-1})"),
- nxt_string("") },
-
- { nxt_string("Array.prototype.slice.call('αβZγ')"),
- nxt_string("α,β,Z,γ") },
-
- { nxt_string("Array.prototype.slice.call(String.bytesFrom(Array(16).fill(0x9d)))[0].charCodeAt(0)"),
- nxt_string("157") },
-
- { nxt_string("Array.prototype.slice.call('αβZγ', 1)"),
- nxt_string("β,Z,γ") },
-
- { nxt_string("Array.prototype.slice.call('αβZγ', 2)"),
- nxt_string("Z,γ") },
-
- { nxt_string("Array.prototype.slice.call('αβZγ', 3)"),
- nxt_string("γ") },
-
- { nxt_string("Array.prototype.slice.call('αβZγ', 4)"),
- nxt_string("") },
-
- { nxt_string("Array.prototype.slice.call('αβZγ', 0, 1)"),
- nxt_string("α") },
-
- { nxt_string("Array.prototype.slice.call('αβZγ', 1, 2)"),
- nxt_string("β") },
-
- { nxt_string("Array.prototype.slice.call('αβZγ').length"),
- nxt_string("4") },
-
- { nxt_string("Array.prototype.slice.call('αβZγ')[1].length"),
- nxt_string("1") },
-
- { nxt_string("Array.prototype.slice.call(new String('αβZγ'))"),
- nxt_string("α,β,Z,γ") },
-
- { nxt_string("1..__proto__.length = '2';"
- "Array.prototype.slice.call(1, 0, 2)"),
- nxt_string(",") },
-
- { nxt_string("Array.prototype.pop()"),
- nxt_string("undefined") },
-
- { nxt_string("Array.prototype.shift()"),
- nxt_string("undefined") },
-
- { nxt_string("[0,1].slice()"),
- nxt_string("0,1") },
-
- { nxt_string("[0,1].slice(undefined)"),
- nxt_string("0,1") },
-
- { nxt_string("[0,1].slice(undefined, undefined)"),
- nxt_string("0,1") },
-
- { nxt_string("[0,1,2,3,4].slice(1,4)"),
- nxt_string("1,2,3") },
-
- { nxt_string("[0,1,2,3,4].slice(6,7)"),
- nxt_string("") },
-
- { nxt_string("var a = [1,2,3,4,5], b = a.slice(3);"
- "b[0] +' '+ b[1] +' '+ b[2]"),
- nxt_string("4 5 undefined") },
-
- { nxt_string("var a = [1,2]; a.pop() +' '+ a.length +' '+ a"),
- nxt_string("2 1 1") },
-
- { nxt_string("var a = [1,2], len = a.push(3); len +' '+ a.pop() +' '+ a"),
- nxt_string("3 3 1,2") },
-
- { nxt_string("var a = [1,2], len = a.push(3,4,5);"
- "len +' '+ a.pop() +' '+ a"),
- nxt_string("5 5 1,2,3,4") },
-
- { nxt_string("var a = [1,2,3]; a.shift() +' '+ a[0] +' '+ a.length"),
- nxt_string("1 2 2") },
-
- { nxt_string("var a = [1,2], len = a.unshift(3);"
- "len +' '+ a +' '+ a.shift()"),
- nxt_string("3 3,1,2 3") },
-
- { nxt_string("var a = [1,2], len = a.unshift(3,4,5);"
- "len +' '+ a +' '+ a.shift()"),
- nxt_string("5 3,4,5,1,2 3") },
-
- { nxt_string("var a=[0], n = 64; while(--n) {a.push(n); a.shift()}; a"),
- nxt_string("1") },
-
- { nxt_string("var a = []; a.splice()"),
- nxt_string("") },
-
- { nxt_string("[].splice(0,5,0)"),
- nxt_string("") },
-
- { nxt_string("[1,2,3,4,5].splice(-2,3,0)"),
- nxt_string("4,5") },
-
- { nxt_string("[].__proto__.splice(0,1,0)"),
- nxt_string("") },
-
- { nxt_string("var a = [];"
- "a.splice(9,0,1,2).join(':') + '|' + a"),
- nxt_string("|1,2") },
-
- { nxt_string("var a = [0,1,2,3,4,5,6,7];"
- "a.splice(3).join(':') + '|' + a"),
- nxt_string("3:4:5:6:7|0,1,2") },
-
- { nxt_string("var a = [0,1,2,3,4,5,6,7];"
- "a.splice(3, 2).join(':') + '|' + a"),
- nxt_string("3:4|0,1,2,5,6,7") },
-
- { nxt_string("var a = [0,1,2,3,4,5,6,7];"
- "a.splice(3, 2, 8, 9, 10, 11 ).join(':') + '|' + a"),
- nxt_string("3:4|0,1,2,8,9,10,11,5,6,7") },
-
- { nxt_string("var a = []; a.reverse()"),
- nxt_string("") },
-
- { nxt_string("var a = [1]; a.reverse()"),
- nxt_string("1") },
-
- { nxt_string("var a = [1,2]; a.reverse()"),
- nxt_string("2,1") },
-
- { nxt_string("var a = [1,2,3]; a.reverse()"),
- nxt_string("3,2,1") },
-
- { nxt_string("var a = [1,2,3,4]; a.reverse()"),
- nxt_string("4,3,2,1") },
-
- { nxt_string("var a = [1,2,3,4]; a.indexOf()"),
- nxt_string("-1") },
-
- { nxt_string("var a = [1,2,3,4]; a.indexOf(5)"),
- nxt_string("-1") },
-
- { nxt_string("var a = [1,2,3,4]; a.indexOf(4, 3)"),
- nxt_string("3") },
-
- { nxt_string("var a = [1,2,3,4]; a.indexOf(4, 4)"),
- nxt_string("-1") },
-
- { nxt_string("var a = [1,2,3,4,3,4]; a.indexOf(3, '2')"),
- nxt_string("2") },
-
- { nxt_string("var a = [1,2,3,4,3,4]; a.indexOf(4, -1)"),
- nxt_string("5") },
-
- { nxt_string("var a = [1,2,3,4,3,4]; a.indexOf(3, -10)"),
- nxt_string("2") },
-
- { nxt_string("[].indexOf.bind(0)(0, 0)"),
- nxt_string("-1") },
-
- { nxt_string("[].lastIndexOf(1, -1)"),
- nxt_string("-1") },
-
- { nxt_string("[undefined].lastIndexOf()"),
- nxt_string("0") },
-
- { nxt_string("[undefined].lastIndexOf(undefined)"),
- nxt_string("0") },
-
- { nxt_string("var a = [1,2,3,4]; a.lastIndexOf()"),
- nxt_string("-1") },
-
- { nxt_string("var a = [1,2,3,4]; a.lastIndexOf(5)"),
- nxt_string("-1") },
-
- { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(1, 0)"),
- nxt_string("0") },
-
- { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, '2')"),
- nxt_string("2") },
-
- { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(1, 6)"),
- nxt_string("0") },
-
- { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(2, 6)"),
- nxt_string("1") },
-
- { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(4, -1)"),
- nxt_string("5") },
-
- { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(4, -6)"),
- nxt_string("-1") },
-
- { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, -10)"),
- nxt_string("-1") },
-
- { nxt_string("[1,2,1].lastIndexOf(2,undefined)"),
- nxt_string("-1") },
-
- { nxt_string("[1,2,1].lastIndexOf(1,undefined)"),
- nxt_string("0") },
-
- { nxt_string("[1,2,1].lastIndexOf(1)"),
- nxt_string("2") },
-
- { nxt_string("[1,2,3,4].includes()"),
- nxt_string("false") },
-
- { nxt_string("[1,2,3,4].includes(5)"),
- nxt_string("false") },
-
- { nxt_string("[1,2,3,4].includes(4, 3)"),
- nxt_string("true") },
-
- { nxt_string("[1,2,3,4].includes(4, 4)"),
- nxt_string("false") },
-
- { nxt_string("[1,2,3,4,3,4].includes(3, '2')"),
- nxt_string("true") },
-
- { nxt_string("[1,2,3,4,3,4].includes(4, -1)"),
- nxt_string("true") },
-
- { nxt_string("[1,2,3,4,3,4].includes(3, -10)"),
- nxt_string("true") },
-
- { nxt_string("[1,2,3,NaN,3,4].includes(NaN)"),
- nxt_string("true") },
-
- { nxt_string("[1,2,3,4,5].includes(NaN)"),
- nxt_string("false") },
-
- { nxt_string("[].includes.bind(0)(0, 0)"),
- nxt_string("false") },
-
- { nxt_string("var a = []; var s = { sum: 0 };"
- "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
- nxt_string("0") },
-
- { nxt_string("var a = new Array(3); var s = { sum: 0 };"
- "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
- nxt_string("0") },
-
- { nxt_string("var a = [,,,]; var s = { sum: 0 };"
- "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
- nxt_string("0") },
-
- { nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
- "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
- nxt_string("6") },
-
- { nxt_string("var a = [1,2,3];"
- "a.forEach(function(v, i, a) { a[i+3] = a.length }); a"),
- nxt_string("1,2,3,3,4,5") },
-
- { nxt_string("function f() { var c; [1].forEach(function(v) { c })}; f()"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
- "[].forEach.call(a, function(v, i, a) { this.sum += v }, s);"
- "s.sum"),
- nxt_string("6") },
-
- { nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
- "[].forEach.apply(a,"
- "[ function(v, i, a) { this.sum += v }, s ]);"
- "s.sum"),
- nxt_string("6") },
-
- { nxt_string("var a = []; var c = 0;"
- "a.forEach(function(v, i, a) { c++ }); c"),
- nxt_string("0") },
-
- { nxt_string("var a = [,,,,]; var c = 0;"
- "a.forEach(function(v, i, a) { c++ }); c"),
- nxt_string("0") },
-
- { nxt_string("var a = [];"
- "a.some(function(v, i, a) { return v > 1 })"),
- nxt_string("false") },
-
- { nxt_string("var a = [1,2,3];"
- "a.some(function(v, i, a) { return v > 1 })"),
- nxt_string("true") },
-
- { nxt_string("var a = [1,2,3];"
- "a.some(function(v, i, a) { return v > 2 })"),
- nxt_string("true") },
-
- { nxt_string("var a = [1,2,3];"
- "a.some(function(v, i, a) { return v > 3 })"),
- nxt_string("false") },
-
- { nxt_string("var a = [];"
- "a.every(function(v, i, a) { return v > 1 })"),
- nxt_string("true") },
-
- { nxt_string("var a = [3,2,1];"
- "a.every(function(v, i, a) { return v > 3 })"),
- nxt_string("false") },
-
- { nxt_string("var a = [3,2,1];"
- "a.every(function(v, i, a) { return v > 2 })"),
- nxt_string("false") },
-
- { nxt_string("var a = [3,2,1];"
- "a.every(function(v, i, a) { return v > 0 })"),
- nxt_string("true") },
-
- { nxt_string("[].fill(1);"),
- nxt_string("") },
-
- { nxt_string("[1,2,3].fill(5);"),
- nxt_string("5,5,5") },
-
- { nxt_string("[1,2,3].fill(5, 0);"),
- nxt_string("5,5,5") },
-
- { nxt_string("[1,2,3].fill(5, 1);"),
- nxt_string("1,5,5") },
-
- { nxt_string("[1,2,3].fill(5, 4);"),
- nxt_string("1,2,3") },
-
- { nxt_string("[1,2,3].fill(5, -2);"),
- nxt_string("1,5,5") },
-
- { nxt_string("[1,2,3].fill(5, -3);"),
- nxt_string("5,5,5") },
-
- { nxt_string("[1,2,3].fill(5, -4);"),
- nxt_string("5,5,5") },
-
- { nxt_string("[1,2,3].fill(5, 1, 0);"),
- nxt_string("1,2,3") },
-
- { nxt_string("[1,2,3].fill(5, 1, 1);"),
- nxt_string("1,2,3") },
-
- { nxt_string("[1,2,3].fill(5, 1, 2);"),
- nxt_string("1,5,3") },
-
- { nxt_string("[1,2,3].fill(5, 1, 3);"),
- nxt_string("1,5,5") },
-
- { nxt_string("[1,2,3].fill(5, 1, 4);"),
- nxt_string("1,5,5") },
-
- { nxt_string("[1,2,3].fill(5, 1, -1);"),
- nxt_string("1,5,3") },
-
- { nxt_string("[1,2,3].fill(5, 1, -3);"),
- nxt_string("1,2,3") },
-
- { nxt_string("[1,2,3].fill(5, 1, -4);"),
- nxt_string("1,2,3") },
-
- { nxt_string("[1,2,3].fill(\"a\", 1, 2);"),
- nxt_string("1,a,3") },
-
- { nxt_string("[1,2,3].fill({a:\"b\"}, 1, 2);"),
- nxt_string("1,[object Object],3") },
-
- { nxt_string("Array(3).fill().reduce(function(a, x)"
- "{ return a + (x === undefined); }, 0)"),
- nxt_string("3") },
-
- { nxt_string("var a = Array.prototype.fill.apply("
- "Object({length: 40}), [\"a\", 1, 20]); Object.values(a)"),
- nxt_string("a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,40,a,a,a,a") },
-
- { nxt_string("var a = Array.prototype.fill.apply({length: "
- "{ valueOf: function() { return 40 }}}, [\"a\", 1, 20]);"
- "Object.values(a)"),
- nxt_string("a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,[object Object],a,a,a,a") },
-
- { nxt_string("[NaN, false, ''].map("
- "(x) => Array.prototype.fill.call(x)"
- ").every((x) => typeof x == 'object')"),
- nxt_string("true") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'length', {get:()=>2}); "
- "Array.prototype.slice.call(Array.prototype.fill.call(o, 1))"),
- nxt_string("1,1") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'length', {get:()=> {throw TypeError('Boom')}}); "
- "Array.prototype.fill.call(o, 1)"),
- nxt_string("TypeError: Boom") },
-
- { nxt_string("var o = Object({length: 3});"
- "Object.defineProperty(o, '0', {set: ()=>{throw TypeError('Boom')}});"
- "Array.prototype.fill.call(o, 1)"),
- nxt_string("TypeError: Boom") },
-
- { nxt_string("var o = Object({length: 3});"
- "Object.defineProperty(o, '0', {set: function(v){this.a = 2 * v}});"
- "Array.prototype.fill.call(o, 2).a"),
- nxt_string("4") },
-
- { nxt_string("var o = Object({length: 3});"
- "Object.defineProperty(o, '0', {set: function(v){this[0] = 2 * v}});"
- "Array.prototype.fill.call(o, 2)"),
- nxt_string("RangeError: Maximum call stack size exceeded") },
-
- { nxt_string("var a = [];"
- "a.filter(function(v, i, a) { return v > 1 })"),
- nxt_string("") },
-
- { nxt_string("var a = [1,2,3,-1,5];"
- "a.filter(function(v, i, a) { return v > 1 })"),
- nxt_string("2,3,5") },
-
- { nxt_string("var a = [1,2,3,4,5,6,7,8];"
- "a.filter(function(v, i, a) { a.pop(); return v > 1 })"),
- nxt_string("2,3,4") },
-
- { nxt_string("var a = [1,2,3,4,5,6,7,8];"
- "a.filter(function(v, i, a) { a.shift(); return v > 1 })"),
- nxt_string("3,5,7") },
-
- { nxt_string("var a = [1,2,3,4,5,6,7];"
- "a.filter(function(v, i, a) { a.pop(); return v > 1 })"),
- nxt_string("2,3,4") },
-
- { nxt_string("var a = [1,2,3,4,5,6,7];"
- "a.filter(function(v, i, a) { a.shift(); return v > 1 })"),
- nxt_string("3,5,7") },
-
- { nxt_string("var a = [1,2,3,4,5,6,7];"
- "a.filter(function(v, i, a) { a[i] = v + 1; return true })"),
- nxt_string("1,2,3,4,5,6,7") },
-
- { nxt_string("var a = [1,2,3,4,5,6,7];"
- "a.filter(function(v, i, a) { a[i+1] = v+10; return true })"),
- nxt_string("1,11,21,31,41,51,61") },
-
- { nxt_string("var a = [];"
- "a.find(function(v, i, a) { return v > 1 })"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [,NaN,0,-1];"
- "a.find(function(v, i, a) { return v > 1 })"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [,NaN,0,-1,2];"
- "a.find(function(v, i, a) { return v > 1 })"),
- nxt_string("2") },
-
- { nxt_string("var a = [1,2,3,-1,5];"
- "a.find(function(v, i, a) { return v > 1 })"),
- nxt_string("2") },
-
- { nxt_string("var a = [,1,,-1,5];"
- "a.find(function(v, i, a) { return v > 1 })"),
- nxt_string("5") },
-
- { nxt_string("var a = [,1,,-1,5,6];"
- "a.find(function(v, i, a) { return v > 1 })"),
- nxt_string("5") },
-
- { nxt_string("[].find(function(v) { return (v === undefined) })"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [,3];"
- "a.find(function(v) { return (v === 3 || v === undefined) })"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [1,,3];"
- "a.find(function(v) { return (v === 3 || v === undefined) })"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [1,2,3,4,5,6];"
- "a.find(function(v, i, a) { a.shift(); return v == 3 })"),
- nxt_string("3") },
-
- { nxt_string("var a = [1,2,3,4,5,6];"
- "a.find(function(v, i, a) { a.shift(); return v == 4 })"),
- nxt_string("undefined") },
-
- { nxt_string("var a = [];"
- "a.findIndex(function(v, i, a) { return v > 1 })"),
- nxt_string("-1") },
-
- { nxt_string("var a = [,NaN,0,-1];"
- "a.findIndex(function(v, i, a) { return v > 1 })"),
- nxt_string("-1") },
-
- { nxt_string("var a = [,NaN,0,-1,2];"
- "a.findIndex(function(v, i, a) { return v > 1 })"),
- nxt_string("4") },
-
- { nxt_string("var a = [1,2,3,-1,5];"
- "a.findIndex(function(v, i, a) { return v > 1 })"),
- nxt_string("1") },
-
- { nxt_string("var a = [,1,,-1,5];"
- "a.findIndex(function(v, i, a) { return v > 1 })"),
- nxt_string("4") },
-
- { nxt_string("var a = [,1,,-1,5,6];"
- "a.findIndex(function(v, i, a) { return v > 1 })"),
- nxt_string("4") },
-
- { nxt_string("[].findIndex(function(v) { return (v === undefined) })"),
- nxt_string("-1") },
-
- { nxt_string("[,].findIndex(function(v) { return (v === undefined) })"),
- nxt_string("0") },
-
- { nxt_string("[1,2,,3].findIndex(function(el){return el === undefined})"),
- nxt_string("2") },
-
- { nxt_string("[,2,,3].findIndex(function(el){return el === undefined})"),
- nxt_string("0") },
-
- { nxt_string("var a = [1,2,3,4,5,6];"
- "a.findIndex(function(v, i, a) { a.shift(); return v == 3 })"),
- nxt_string("1") },
-
- { nxt_string("var a = [1,2,3,4,5,6];"
- "a.findIndex(function(v, i, a) { a.shift(); return v == 4 })"),
- nxt_string("-1") },
-
- { nxt_string("var a = [];"
- "a.map(function(v, i, a) { return v + 1 })"),
- nxt_string("") },
-
- { nxt_string("var a = [,,,];"
- "a.map(function(v, i, a) { return v + 1 })"),
- nxt_string(",,") },
-
- { nxt_string("var a = [,,,1];"
- "a.map(function(v, i, a) { return v + 1 })"),
- nxt_string(",,,2") },
-
- { nxt_string("var a = [1,2,3];"
- "a.map(function(v, i, a) { return v + 1 })"),
- nxt_string("2,3,4") },
-
- { nxt_string("var a = [1,2,3,4,5,6];"
- "a.map(function(v, i, a) { a.pop(); return v + 1 })"),
- nxt_string("2,3,4,,,") },
-
- { nxt_string("var a = [1,2,3,4,5,6];"
- "a.map(function(v, i, a) { a.shift(); return v + 1 })"),
- nxt_string("2,4,6,,,") },
-
- { nxt_string("var a = [];"
- "a.reduce(function(p, v, i, a) { return p + v })"),
- nxt_string("TypeError: invalid index") },
-
- { nxt_string("var a = [];"
- "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
- nxt_string("10") },
-
- { nxt_string("var a = [,,];"
- "a.reduce(function(p, v, i, a) { return p + v })"),
- nxt_string("TypeError: invalid index") },
-
- { nxt_string("var a = [,,];"
- "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
- nxt_string("10") },
-
- { nxt_string("var a = [1];"
- "a.reduce(function(p, v, i, a) { return p + v })"),
- nxt_string("1") },
-
- { nxt_string("var a = [1];"
- "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
- nxt_string("11") },
-
- { nxt_string("var a = [1,2,3];"
- "a.reduce(function(p, v, i, a) { return p + v })"),
- nxt_string("6") },
-
- { nxt_string("var a = [1,2,3];"
- "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
- nxt_string("16") },
-
- { nxt_string("[[0, 1], [2, 3], [4, 5]].reduce(function(a, b)"
- " { return a.concat(b) }, [])"),
- nxt_string("0,1,2,3,4,5") },
-
- { nxt_string("var a = [];"
- "a.reduceRight(function(p, v, i, a) { return p + v })"),
- nxt_string("TypeError: invalid index") },
-
- { nxt_string("var a = [];"
- "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
- nxt_string("10") },
-
- { nxt_string("var a = [,,];"
- "a.reduceRight(function(p, v, i, a) { return p + v })"),
- nxt_string("TypeError: invalid index") },
-
- { nxt_string("var a = [,,];"
- "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
- nxt_string("10") },
-
- { nxt_string("var a = [1];"
- "a.reduceRight(function(p, v, i, a) { return p + v })"),
- nxt_string("1") },
-
- { nxt_string("var a = [1];"
- "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
- nxt_string("11") },
-
- { nxt_string("var a = [1,2,3];"
- "a.reduceRight(function(p, v, i, a) { return p + v })"),
- nxt_string("6") },
-
- { nxt_string("var a = [1,2,3];"
- "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
- nxt_string("16") },
-
- { nxt_string("var a = [1,2,3];"
- "a.reduceRight(function(p, v, i, a)"
- " { a.shift(); return p + v })"),
- nxt_string("7") },
-
- { nxt_string("var a = [1,2,3];"
- "a.reduceRight(function(p, v, i, a)"
- " { a.shift(); return p + v }, 10)"),
- nxt_string("19") },
-
- { nxt_string("var a = ['1','2','3','4','5','6']; a.sort()"),
- nxt_string("1,2,3,4,5,6") },
-
- { nxt_string("var o = { toString: function() { return 5 } };"
- "var a = [6,o,4,3,2,1]; a.sort()"),
- nxt_string("1,2,3,4,5,6") },
-
- { nxt_string("var a = [1,2,3,4,5,6];"
- "a.sort(function(x, y) { return x - y })"),
- nxt_string("1,2,3,4,5,6") },
-
- { nxt_string("var a = [6,5,4,3,2,1];"
- "a.sort(function(x, y) { return x - y })"),
- nxt_string("1,2,3,4,5,6") },
-
- { nxt_string("var a = [2,2,2,1,1,1];"
- "a.sort(function(x, y) { return x - y })"),
- nxt_string("1,1,1,2,2,2") },
-
- { nxt_string("var a = [,,,2,2,2,1,1,1];"
- "a.sort(function(x, y) { return x - y })"),
- nxt_string("1,1,1,2,2,2,,,") },
-
- { nxt_string("var a = [,,,,];"
- "a.sort(function(x, y) { return x - y })"),
- nxt_string(",,,") },
-
- { nxt_string("var a = [1,,];"
- "a.sort(function(x, y) { return x - y })"),
- nxt_string("1,") },
-
- /* Template literal. */
-
- { nxt_string("`"),
- nxt_string("SyntaxError: Unterminated template literal in 1") },
-
- { nxt_string("`$"),
- nxt_string("SyntaxError: Unterminated template literal in 1") },
-
- { nxt_string("`${"),
- nxt_string("SyntaxError: Unexpected end of input in 1") },
-
- { nxt_string("`${a"),
- nxt_string("SyntaxError: Missing \"}\" in template expression in 1") },
-
- { nxt_string("`${}"),
- nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
-
- { nxt_string("`${a}"),
- nxt_string("SyntaxError: Unterminated template literal in 1") },
-
- { nxt_string("`${a}bc"),
- nxt_string("SyntaxError: Unterminated template literal in 1") },
-
- { nxt_string("`\\"),
- nxt_string("SyntaxError: Unterminated template literal in 1") },
-
- { nxt_string("`\\${a}bc"),
- nxt_string("SyntaxError: Unterminated template literal in 1") },
-
- { nxt_string("`text1\ntext2`;"),
- nxt_string("text1\ntext2") },
-
- { nxt_string("var o = 1; `o = \\`${o}\\``"),
- nxt_string("o = `1`") },
-
- { nxt_string("`\\unicode`"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\unicode\" in 1") },
-
- { nxt_string("var a = 5; var b = 10;"
- "`Fifteen is ${a + b} and \nnot ${2 * a + b}.`;"),
- nxt_string("Fifteen is 15 and \nnot 20.") },
-
- { nxt_string("var s = `1undefined`; s;"),
- nxt_string("1undefined") },
-
- { nxt_string("var s = '0'; s = `x${s += '1'}`;"),
- nxt_string("x01") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
- "var something = 'test'; var one = 1; var two = 2;"
- "`[${d.toISOString()}] the message contents ${something} ${one + two}`"),
- nxt_string("[2011-06-24T18:45:12.625Z] the message contents test 3") },
-
- { nxt_string("function isLargeScreen() { return false; }"
- "var item = { isCollapsed: true };"
- "`header ${ isLargeScreen() ? '' : `icon-${item.isCollapsed ? 'expander' : 'collapser'}` }`;"),
- nxt_string("header icon-expander") },
-
- { nxt_string("function foo(strings, person, age) { return `${strings[0]}${strings[1]}${person}${age}` };"
- "var person = 'Mike'; var age = 21;"
- "foo`That ${person} is a ${age}`;"),
- nxt_string("That is a Mike21") },
-
- /* Strings. */
-
- { nxt_string("var a = '0123456789' + '012345';"
- "var b = 'abcdefghij' + 'klmnop';"
- " a = b"),
- nxt_string("abcdefghijklmnop") },
-
- { nxt_string("String.prototype.my = function f() {return 7}; 'a'.my()"),
- nxt_string("7") },
-
- { nxt_string("'a'.my"),
- nxt_string("undefined") },
-
- { nxt_string("var a = '123'\n[2].toString();a"),
- nxt_string("3") },
-
- { nxt_string("'\xE5\x96\x9C\xE3\x81\xB6'"),
- nxt_string("喜ぶ") },
-
- /* Broken UTF-8 literals.*/
-
- { nxt_string("'\x96\xE5\x9C\xE3\x81\xB6'"),
- nxt_string("��ぶ") },
-
- { nxt_string("'\x96\xE5\x9C'"),
- nxt_string("��") },
-
- { nxt_string("'\x96\xE5'"),
- nxt_string("��") },
-
- { nxt_string("'\x96'"),
- nxt_string("�") },
-
- { nxt_string("'\xF3'"),
- nxt_string("�") },
-
- { nxt_string("'\xF3\xFF'"),
- nxt_string("��") },
-
- { nxt_string("'\x96\x96\xE5\x9C\xE3\x81\xB6'"),
- nxt_string("���ぶ") },
-
- { nxt_string("'\x9C\x96\xE5\xE3\x81\xB6'"),
- nxt_string("���ぶ") },
-
- { nxt_string("'\xE5\x9C\xE3\x81\xB6'"),
- nxt_string("�ぶ") },
-
- { nxt_string("'\xEF\xBF\xBD\xE3\x81\xB6'"),
- nxt_string("�ぶ") },
-
- { nxt_string("'\xE5\xF6\x9C\xE3\x81\xB6'"),
- nxt_string("���ぶ") },
-
- { nxt_string("var a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xF3'; "
- "[a.length, a[33], a[34]]"),
- nxt_string("35,a,�") },
-
- /* Escape strings. */
-
- { nxt_string("'\\a \\' \\\" \\\\ \\0 \\b \\f \\n \\r \\t \\v'"),
- nxt_string("a ' \" \\ \0 \b \f \n \r \t \v") },
-
- { nxt_string("'\\\n'"),
- nxt_string("") },
-
- { nxt_string("'\\\r'"),
- nxt_string("") },
-
- { nxt_string("'\\\r\n'"),
- nxt_string("") },
-
- { nxt_string("'a\\\nb'"),
- nxt_string("ab") },
-
- { nxt_string("'a\\\rb'"),
- nxt_string("ab") },
-
- { nxt_string("'a\\\r\nb'"),
- nxt_string("ab") },
-
- { nxt_string("'a\\\n\rb'"),
- nxt_string("SyntaxError: Unterminated string \"'a\\\n\r\" in 1") },
-
- { nxt_string("'a\\\nb\nc'"),
- nxt_string("SyntaxError: Unterminated string \"'a\\\nb\n\" in 1") },
-
- { nxt_string("'abcde"),
- nxt_string("SyntaxError: Unterminated string \"'abcde\" in 1") },
-
- { nxt_string("'\\"),
- nxt_string("SyntaxError: Unterminated string \"'\\\" in 1") },
-
- { nxt_string("'\\\r\n"),
- nxt_string("SyntaxError: Unterminated string \"'\\\r\n\" in 1") },
-
- { nxt_string("'\\'"),
- nxt_string("SyntaxError: Unterminated string \"'\\'\" in 1") },
-
- { nxt_string("'a\n"),
- nxt_string("SyntaxError: Unterminated string \"'a\n\" in 1") },
-
- { nxt_string("'a\r"),
- nxt_string("SyntaxError: Unterminated string \"'a\r\" in 1") },
-
- { nxt_string("\"a\n"),
- nxt_string("SyntaxError: Unterminated string \"\"a\n\" in 1") },
-
- { nxt_string("'\\u03B1'"),
- nxt_string("α") },
-
- { nxt_string("'\\u'"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
-
- { nxt_string("'\\uzzzz'"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\uzzzz\" in 1") },
-
- { nxt_string("'\\u03B'"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\u03B\" in 1") },
-
- { nxt_string("'\\u03BG'"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\u03BG\" in 1") },
-
- { nxt_string("'\\u03B '"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\u03B \" in 1") },
-
- { nxt_string("'\\u{61}\\u{3B1}\\u{20AC}'"),
- nxt_string("aα€") },
-
- { nxt_string("'\\u'"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
-
- { nxt_string("'\\u{'"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\u{\" in 1") },
-
- { nxt_string("'\\u{}'"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\u{}\" in 1") },
-
- { nxt_string("'\\u{1234567}'"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\u{1234567}\" in 1") },
-
- { nxt_string("'\\u{a00000}'"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\u{a00000}\" in 1") },
-
- { nxt_string("'\\x61'"),
- nxt_string("a") },
-
- { nxt_string("''.length"),
- nxt_string("0") },
-
- { nxt_string("'abc'.length"),
- nxt_string("3") },
-
- { nxt_string("'привет\\n'.length"),
- nxt_string("7") },
-
- { nxt_string("'привет\\n\\u{61}\\u{3B1}\\u{20AC}'.length"),
- nxt_string("10") },
-
- { nxt_string("'\\ud83d\\udc4d'"),
- nxt_string("\xf0\x9f\x91\x8d") },
-
- { nxt_string("'\\ud83d\\udc4d'.length"),
- nxt_string("1") },
-
- { nxt_string("'\\ud83d abc \\udc4d'"),
- nxt_string("� abc �") },
-
- { nxt_string("'\\ud83d'"),
- nxt_string("�") },
-
- { nxt_string("'\\ud83d\\uabcd'"),
- nxt_string("�ꯍ") },
-
- { nxt_string("'\\u{d800}\\u{dB00}'"),
- nxt_string("��") },
-
- { nxt_string("'\\u{d800}\\u{d7ff}'"),
- nxt_string("�") },
-
- { nxt_string("'\\u{d800}['"),
- nxt_string("�[") },
-
- { nxt_string("'\\u{D800}\\u{'"),
- nxt_string("SyntaxError: Invalid Unicode code point \"\\u{D800}\\u{\" in 1") },
-
- { nxt_string("'α' !== '\\α'"),
- nxt_string("false") },
-
- { nxt_string("'r' !== '\\r'"),
- nxt_string("true") },
-
- /* Broken UTF-8 literals.*/
-
- { nxt_string("'\\a\x96\xE5\x9C\xE3\x81\xB6'"),
- nxt_string("a��ぶ") },
-
- { nxt_string("'\x96\\a\xE5\x9C'"),
- nxt_string("�a�") },
-
- { nxt_string("'\x96\xE5\\a'"),
- nxt_string("��a") },
-
- { nxt_string("'\\a\x96\\a'"),
- nxt_string("a�a") },
-
- { nxt_string("'\xF3\\a'"),
- nxt_string("�a") },
-
- { nxt_string("'\xF3\\a\xFF'"),
- nxt_string("�a�") },
-
- { nxt_string("'\\a\x96\x96\xE5\x9C\xE3\x81\xB6'"),
- nxt_string("a���ぶ") },
-
- { nxt_string("'\\a\x9C\x96\xE5\xE3\x81\xB6'"),
- nxt_string("a���ぶ") },
-
- { nxt_string("'\\a\xE5\x9C\xE3\x81\xB6'"),
- nxt_string("a�ぶ") },
-
- { nxt_string("'\\a\xEF\xBF\xBD\xE3\x81\xB6'"),
- nxt_string("a�ぶ") },
-
- { nxt_string("'\\a\xE5\xF6\x9C\xE3\x81\xB6'"),
- nxt_string("a���ぶ") },
-
- { nxt_string("var a = '\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xF3'; "
- "[a.length, a[34], a[35]]"),
- nxt_string("36,a,�") },
-
- { nxt_string("''.hasOwnProperty('length')"),
- nxt_string("true") },
-
- { nxt_string("'abc'.hasOwnProperty('length')"),
- nxt_string("true") },
-
- { nxt_string("(new String('abc')).hasOwnProperty('length')"),
- nxt_string("true") },
-
- { nxt_string("'abc'.toUTF8().length"),
- nxt_string("3") },
-
- { nxt_string("'абв'.length"),
- nxt_string("3") },
-
- { nxt_string("'абв'.toUTF8().length"),
- nxt_string("6") },
-
- { nxt_string("'αβγ'.length"),
- nxt_string("3") },
-
- { nxt_string("'αβγ'.toUTF8().length"),
- nxt_string("6") },
-
- { nxt_string("'絵文字'.length"),
- nxt_string("3") },
-
- { nxt_string("'絵文字'.toUTF8().length"),
- nxt_string("9") },
-
- { nxt_string("'えもじ'.length"),
- nxt_string("3") },
-
- { nxt_string("'えもじ'.toUTF8().length"),
- nxt_string("9") },
-
- { nxt_string("'囲碁織'.length"),
- nxt_string("3") },
-
- { nxt_string("'囲碁織'.toUTF8().length"),
- nxt_string("9") },
-
- { nxt_string("var a = 'abc'; a.length"),
- nxt_string("3") },
-
- { nxt_string("var a = 'abc'; a['length']"),
- nxt_string("3") },
-
- { nxt_string("var a = 'абв'; a.length"),
- nxt_string("3") },
-
- { nxt_string("var a = 'abc' + 'абв'; a.length"),
- nxt_string("6") },
-
- { nxt_string("var a = 'abc' + 1 + 'абв'; a +' '+ a.length"),
- nxt_string("abc1абв 7") },
-
- { nxt_string("var a = 1; a.length"),
- nxt_string("undefined") },
-
- { nxt_string("var a = 'abc'; a.concat('абв', 123)"),
- nxt_string("abcабв123") },
-
- { nxt_string("''.concat.call(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)"),
- nxt_string("0123456789") },
-
- { nxt_string("''.concat.apply(0, [1, 2, 3, 4, 5, 6, 7, 8, 9])"),
- nxt_string("0123456789") },
-
- { nxt_string("var f = ''.concat.bind(0, 1, 2, 3, 4); f(5, 6, 7, 8, 9)"),
- nxt_string("0123456789") },
-
- { nxt_string("var f = ''.concat.bind(0, 1, 2, 3, 4); f(Math.sqrt(25))"),
- nxt_string("012345") },
-
- { nxt_string("var f = String.prototype.concat.bind(0, 1); f(2)"),
- nxt_string("012") },
-
- { nxt_string("var f = Function.prototype.call.bind"
- " (String.prototype.concat, 0, 1);"
- "f(2)"),
- nxt_string("012") },
-
- { nxt_string("var f = String.prototype.concat.bind(0, 1);"
- "var o = { toString: f }; o"),
- nxt_string("01") },
-
- { nxt_string("''.concat.bind(0, 1, 2, 3, 4).call(5, 6, 7, 8, 9)"),
- nxt_string("012346789") },
-
- { nxt_string("''.concat.bind(0, 1, 2, 3, 4).apply(5,[6, 7, 8, 9])"),
- nxt_string("012346789") },
-
- { nxt_string("var f = Array.prototype.join.bind([0, 1, 2]); f()"),
- nxt_string("0,1,2") },
-
- { nxt_string("var f = Array.prototype.join.bind([0, 1, 2]);"
- "var o = { toString: f }; o"),
- nxt_string("0,1,2") },
-
- { nxt_string("var f = Array.prototype.join.bind([0, 1, 2]); f('.')"),
- nxt_string("0.1.2") },
-
- { nxt_string("var f = Array.prototype.join.bind([0, 1, 2], '.');"
- "var o = { toString: f }; o"),
- nxt_string("0.1.2") },
-
- { nxt_string("var f = Array.prototype.toString.bind([0, 1, 2]); f()"),
- nxt_string("0,1,2") },
-
- { nxt_string("var f = Array.prototype.toString.bind([0, 1, 2]);"
- "var o = { toString: f }; o"),
- nxt_string("0,1,2") },
-
- { nxt_string("var s = { toString: function() { return '123' } };"
- "var a = 'abc'; a.concat('абв', s)"),
- nxt_string("abcабв123") },
-
- { nxt_string("'\\u00CE\\u00B1'.toBytes() == 'α'"),
- nxt_string("true") },
-
- { nxt_string("'\\u00CE\\u00B1'.toBytes() === 'α'"),
- nxt_string("true") },
-
- { nxt_string("var b = '\\u00C2\\u00B6'.toBytes(), u = b.fromUTF8();"
- "b.length +' '+ b +' '+ u.length +' '+ u"),
- nxt_string("2 ¶ 1 ¶") },
-
- { nxt_string("'α'.toBytes()"),
- nxt_string("null") },
-
- { nxt_string("'α'.toUTF8()[0]"),
- nxt_string("\xCE") },
-
- { nxt_string("var r = /^\\x80$/; r.source + r.source.length"),
- nxt_string("^\\x80$6") },
-
- { nxt_string("var r = /^\\\\x80$/; r.source + r.source.length"),
- nxt_string("^\\\\x80$7") },
-
- { nxt_string("/^\\x80$/.test('\\x80'.toBytes())"),
- nxt_string("true") },
-
- { nxt_string("/^\\xC2\\x80$/.test('\\x80'.toUTF8())"),
- nxt_string("true") },
-
- { nxt_string("'α'.toUTF8().toBytes()"),
- nxt_string("α") },
-
- { nxt_string("var a = 'a'.toBytes() + 'α'; a + a.length"),
- nxt_string("aα3") },
-
- { nxt_string("var a = 'µ§±®'.toBytes(); a"),
- nxt_string("\xB5\xA7\xB1\xAE") },
-
- { nxt_string("var a = 'µ§±®'.toBytes(2); a"),
- nxt_string("\xB1\xAE") },
-
- { nxt_string("var a = 'µ§±®'.toBytes(1,3); a"),
- nxt_string("\xA7\xB1") },
-
- { nxt_string("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes()"),
- nxt_string("µ§±®") },
-
- { nxt_string("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(2)"),
- nxt_string("±®") },
-
- { nxt_string("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(1, 3)"),
- nxt_string("§±") },
-
- { nxt_string("'A'.repeat(8).toBytes() === 'A'.repeat(8)"),
- nxt_string("true") },
-
- { nxt_string("'A'.repeat(16).toBytes() === 'A'.repeat(16)"),
- nxt_string("true") },
-
- { nxt_string("'A'.repeat(38).toBytes(-5) === 'AAAAA'"),
- nxt_string("true") },
-
- { nxt_string("('α' + 'A'.repeat(32)).toBytes()"),
- nxt_string("null") },
-
- { nxt_string("('α' + 'A'.repeat(32)).toBytes(1) === 'A'.repeat(32)"),
- nxt_string("true") },
-
- { nxt_string("('α' + 'A'.repeat(40)).toBytes(-3,-1)"),
- nxt_string("AA") },
-
- { nxt_string("var s = 'x'.repeat(2**10).repeat(2**14);"
- "var a = Array(200).fill(s);"
- "String.prototype.concat.apply(s, a.slice(1))"),
- nxt_string("RangeError: invalid string length") },
-
- { nxt_string("var a = 'abcdefgh'; a.substr(3, 15)"),
- nxt_string("defgh") },
-
- { nxt_string("'abcdefgh'.substr(3, 15)"),
- nxt_string("defgh") },
-
- { nxt_string("'abcdefghijklmno'.substr(3, 4)"),
- nxt_string("defg") },
-
- { nxt_string("'abcdefghijklmno'.substr(-3, 2)"),
- nxt_string("mn") },
-
- { nxt_string("'abcdefgh'.substr(100, 120)"),
- nxt_string("") },
-
- { nxt_string("('abc' + 'defgh').substr(1, 4)"),
- nxt_string("bcde") },
-
- { nxt_string("'abcdefghijklmno'.substring(3, 5)"),
- nxt_string("de") },
-
- { nxt_string("'abcdefgh'.substring(3)"),
- nxt_string("defgh") },
-
- { nxt_string("'abcdefgh'.substring(5, 3)"),
- nxt_string("de") },
-
- { nxt_string("'abcdefgh'.substring(100, 120)"),
- nxt_string("") },
-
- { nxt_string("'α'.repeat(32).substring(32)"),
- nxt_string("") },
-
- { nxt_string("'α'.repeat(32).substring(32,32)"),
- nxt_string("") },
-
- { nxt_string("'abcdefghijklmno'.slice(NaN, 5)"),
- nxt_string("abcde") },
-
- { nxt_string("'abcdefghijklmno'.slice(NaN, Infinity)"),
- nxt_string("abcdefghijklmno") },
-
- { nxt_string("'abcdefghijklmno'.slice(-Infinity, Infinity)"),
- nxt_string("abcdefghijklmno") },
-
- { nxt_string("'abcdefghijklmno'.slice('0', '5')"),
- nxt_string("abcde") },
-
- { nxt_string("'abcdefghijklmno'.slice(3, 5)"),
- nxt_string("de") },
-
- { nxt_string("'abcdefgh'.slice(3)"),
- nxt_string("defgh") },
-
- { nxt_string("'abcdefgh'.slice(undefined, undefined)"),
- nxt_string("abcdefgh") },
-
- { nxt_string("'abcdefgh'.slice(undefined)"),
- nxt_string("abcdefgh") },
-
- { nxt_string("'abcdefgh'.slice(undefined, 1)"),
- nxt_string("a") },
-
- { nxt_string("'abcdefgh'.slice(3, undefined)"),
- nxt_string("defgh") },
-
- { nxt_string("'abcde'.slice(50)"),
- nxt_string("") },
-
- { nxt_string("'abcde'.slice(1, 50)"),
- nxt_string("bcde") },
-
- { nxt_string("'abcdefgh'.slice(3, -2)"),
- nxt_string("def") },
-
- { nxt_string("'abcdefgh'.slice(5, 3)"),
- nxt_string("") },
-
- { nxt_string("'abcdefgh'.slice(100, 120)"),
- nxt_string("") },
-
- { nxt_string("String.prototype.substring(1, 5)"),
- nxt_string("") },
-
- { nxt_string("String.prototype.substr.call({toString:()=>{throw new Error('Oops')}})"),
- nxt_string("Error: Oops") },
-
- { nxt_string("String.prototype.slice(1, 5)"),
- nxt_string("") },
-
- { nxt_string("String.prototype.toBytes(1, 5)"),
- nxt_string("") },
-
- { nxt_string("'abc'.charAt(1 + 1)"),
- nxt_string("c") },
-
- { nxt_string("'abc'.charAt(3)"),
- nxt_string("") },
-
- { nxt_string("'abc'.charAt(undefined)"),
- nxt_string("a") },
-
- { nxt_string("'abc'.charAt(null)"),
- nxt_string("a") },
-
- { nxt_string("'abc'.charAt(false)"),
- nxt_string("a") },
-
- { nxt_string("'abc'.charAt(true)"),
- nxt_string("b") },
-
- { nxt_string("'abc'.charAt(NaN)"),
- nxt_string("a") },
-
- { nxt_string("'abc'.charAt(Infinity)"),
- nxt_string("") },
-
- { nxt_string("'abc'.charAt(-Infinity)"),
- nxt_string("") },
-
- { nxt_string("var o = { valueOf: function() {return 2} };"
- "'abc'.charAt(o)"),
- nxt_string("c") },
-
- { nxt_string("var o = { toString: function() {return '2'} };"
- "'abc'.charAt(o)"),
- nxt_string("c") },
-
- { nxt_string("'abc'.charCodeAt(1 + 1)"),
- nxt_string("99") },
-
- { nxt_string("'abc'.charCodeAt(3)"),
- nxt_string("NaN") },
-
- { nxt_string("'abc'.charCodeAt(undefined)"),
- nxt_string("97") },
-
- { nxt_string("var a = 'abcdef'; a.3"),
- nxt_string("SyntaxError: Unexpected token \".3\" in 1") },
-
- { nxt_string("'abcdef'[3]"),
- nxt_string("d") },
-
- { nxt_string("'abcdef'[0]"),
- nxt_string("a") },
-
- { nxt_string("'abcdef'[-1]"),
- nxt_string("undefined") },
-
- { nxt_string("'abcdef'[NaN]"),
- nxt_string("undefined") },
-
- { nxt_string("'abcdef'[3.5]"),
- nxt_string("undefined") },
-
- { nxt_string("'abcdef'[8]"),
- nxt_string("undefined") },
-
- { nxt_string("'abcdef'['1']"),
- nxt_string("b") },
-
- { nxt_string("'abcdef'[' 1']"),
- nxt_string("undefined") },
-
- { nxt_string("'abcdef'['1 ']"),
- nxt_string("undefined") },
-
- { nxt_string("'abcdef'['']"),
- nxt_string("undefined") },
-
- { nxt_string("'abcdef'['-']"),
- nxt_string("undefined") },
-
- { nxt_string("'abcdef'['-1']"),
- nxt_string("undefined") },
-
- { nxt_string("'abcdef'['01']"),
- nxt_string("undefined") },
-
- { nxt_string("'abcdef'['0x01']"),
- nxt_string("undefined") },
-
- { nxt_string("var a = 'abcdef', b = 1 + 2; a[b]"),
- nxt_string("d") },
-
- /**/
-
- { nxt_string("'abc'.toString()"),
- nxt_string("abc") },
-
- { nxt_string("''.toString.call('abc')"),
- nxt_string("abc") },
-
- { nxt_string("String.prototype.toString.call('abc')"),
- nxt_string("abc") },
-
- { nxt_string("String.prototype.toString.call(new String('abc'))"),
- nxt_string("abc") },
-
- { nxt_string("String.prototype.toString.call(1)"),
- nxt_string("TypeError: unexpected value type:number") },
-
- { nxt_string("'abc'.valueOf()"),
- nxt_string("abc") },
-
- /**/
-
- { nxt_string("var n = { toString: function() { return 1 } }; '12'[n]"),
- nxt_string("2") },
-
- { nxt_string("var n = { toString: function() { return '1' } }; '12'[n]"),
- nxt_string("2") },
-
- { nxt_string("var n = { toString: function() { return 1 },"
- " valueOf: function() { return 0 } }; '12'[n]"),
- nxt_string("2") },
-
- /* Externals. */
-
- { nxt_string("typeof $r"),
- nxt_string("external") },
-
- { nxt_string("var a = $r.uri, s = a.fromUTF8(); s.length +' '+ s"),
- nxt_string("3 АБВ") },
-
- { nxt_string("var a = $r.uri, b = $r2.uri, c = $r3.uri; a+b+c"),
- nxt_string("АБВαβγabc") },
-
- { nxt_string("var a = $r.uri; $r.uri = $r2.uri; $r2.uri = a; $r2.uri+$r.uri"),
- nxt_string("АБВαβγ") },
-
- { nxt_string("var a = $r.uri, s = a.fromUTF8(2); s.length +' '+ s"),
- nxt_string("2 БВ") },
-
- { nxt_string("var a = $r.uri, s = a.fromUTF8(2, 4); s.length +' '+ s"),
- nxt_string("1 Б") },
-
- { nxt_string("var a = $r.uri; a +' '+ a.length +' '+ a"),
- nxt_string("АБВ 6 АБВ") },
-
- { nxt_string("$r.uri = 'αβγ'; var a = $r.uri; a.length +' '+ a"),
- nxt_string("6 αβγ") },
-
- { nxt_string("$r.uri.length +' '+ $r.uri"),
- nxt_string("6 АБВ") },
-
- { nxt_string("$r.uri = $r.uri.substr(2); $r.uri.length +' '+ $r.uri"),
- nxt_string("4 БВ") },
-
- { nxt_string("'' + $r.props.a + $r2.props.a + $r.props.a"),
- nxt_string("121") },
-
- { nxt_string("var p1 = $r.props, p2 = $r2.props; '' + p2.a + p1.a"),
- nxt_string("21") },
-
- { nxt_string("var p1 = $r.props, p2 = $r2.props; '' + p1.a + p2.a"),
- nxt_string("12") },
-
- { nxt_string("var p = $r3.props; p.a = 1"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of external") },
- { nxt_string("var p = $r3.props; delete p.a"),
- nxt_string("TypeError: Cannot delete property \"a\" of external") },
-
- { nxt_string("$r.vars.p + $r2.vars.q + $r3.vars.k"),
- nxt_string("pvalqvalkval") },
-
- { nxt_string("$r.vars.unset"),
- nxt_string("undefined") },
-
- { nxt_string("var v = $r3.vars; v.k"),
- nxt_string("kval") },
-
- { nxt_string("var v = $r3.vars; v.unset = 1; v.unset"),
- nxt_string("1") },
-
- { nxt_string("$r.vars.unset = 'a'; $r2.vars.unset = 'b';"
- "$r.vars.unset + $r2.vars.unset"),
- nxt_string("ab") },
-
- { nxt_string("$r.vars.unset = 1; $r2.vars.unset = 2;"
- "$r.vars.unset + $r2.vars.unset"),
- nxt_string("12") },
-
- { nxt_string("$r3.vars.p = 'a'; $r3.vars.p2 = 'b';"
- "$r3.vars.p + $r3.vars.p2"),
- nxt_string("ab") },
-
- { nxt_string("$r3.vars.p = 'a'; delete $r3.vars.p; $r3.vars.p"),
- nxt_string("undefined") },
-
- { nxt_string("$r3.vars.p = 'a'; delete $r3.vars.p; $r3.vars.p = 'b'; $r3.vars.p"),
- nxt_string("b") },
-
- { nxt_string("$r3.vars.error = 1"),
- nxt_string("Error: cannot set \"error\" prop") },
-
- { nxt_string("delete $r3.vars.error"),
- nxt_string("Error: cannot delete \"error\" prop") },
-
- { nxt_string("delete $r3.vars.e"),
- nxt_string("true") },
-
- { nxt_string("$r3.consts.k"),
- nxt_string("kval") },
-
- { nxt_string("$r3.consts.k = 1"),
- nxt_string("TypeError: Cannot assign to read-only property \"k\" of external") },
-
- { nxt_string("delete $r3.consts.k"),
- nxt_string("TypeError: Cannot delete property \"k\" of external") },
-
- { nxt_string("delete $r3.vars.p; $r3.vars.p"),
- nxt_string("undefined") },
-
- { nxt_string("var a = $r.host; a +' '+ a.length +' '+ a"),
- nxt_string("АБВГДЕЁЖЗИЙ 22 АБВГДЕЁЖЗИЙ") },
-
- { nxt_string("var a = $r.host; a.substr(2, 2)"),
- nxt_string("Б") },
-
- { nxt_string("var a = $r.header['User-Agent']; a +' '+ a.length +' '+ a"),
- nxt_string("User-Agent|АБВ 17 User-Agent|АБВ") },
-
- { nxt_string("var a='', p;"
- "for (p in $r.header) { a += p +':'+ $r.header[p] +',' }"
- "a"),
- nxt_string("01:01|АБВ,02:02|АБВ,03:03|АБВ,") },
-
- { nxt_string("$r.some_method('YES')"),
- nxt_string("АБВ") },
-
- { nxt_string("$r.create('XXX').uri"),
- nxt_string("XXX") },
-
- { nxt_string("var sr = $r.create('XXX'); sr.uri = 'YYY'; sr.uri"),
- nxt_string("YYY") },
-
- { nxt_string("var sr = $r.create('XXX'), sr2 = $r.create('YYY');"
- "sr.uri = 'ZZZ'; "
- "sr.uri + sr2.uri"),
- nxt_string("ZZZYYY") },
-
- { nxt_string("var sr = $r.create('XXX'); sr.vars.p = 'a'; sr.vars.p"),
- nxt_string("a") },
-
- { nxt_string("var p; for (p in $r.some_method);"),
- nxt_string("undefined") },
-
- { nxt_string("'uri' in $r"),
- nxt_string("true") },
-
- { nxt_string("'one' in $r"),
- nxt_string("false") },
-
- { nxt_string("'a' in $r.props"),
- nxt_string("true") },
-
- { nxt_string("delete $r.uri"),
- nxt_string("TypeError: Cannot delete property \"uri\" of external") },
-
- { nxt_string("delete $r.one"),
- nxt_string("TypeError: Cannot delete property \"one\" of external") },
-
- { nxt_string("$r.some_method.call($r, 'YES')"),
- nxt_string("АБВ") },
-
- { nxt_string("var f = $r.some_method.bind($r); f('YES')"),
- nxt_string("АБВ") },
-
- { nxt_string("function f(fn, arg) {return fn(arg);}; f($r.some_method.bind($r), 'YES')"),
- nxt_string("АБВ") },
-
- { nxt_string("$r.some_method.apply($r, ['YES'])"),
- nxt_string("АБВ") },
-
- { nxt_string("$r.some_method.call([], 'YES')"),
- nxt_string("TypeError: external value is expected") },
-
- { nxt_string("$r.nonexistent"),
- nxt_string("undefined") },
-
- { nxt_string("$r.error = 'OK'"),
- nxt_string("TypeError: Cannot assign to read-only property \"error\" of external") },
-
- { nxt_string("var a = { toString: function() { return 1 } }; a"),
- nxt_string("1") },
-
- { nxt_string("var a = { valueOf: function() { return 1 } }; a"),
- nxt_string("[object Object]") },
-
- { nxt_string("var a = { toString: 2,"
- " valueOf: function() { return 1 } }; a"),
- nxt_string("1") },
-
- { nxt_string("var a = { toString: function() { return [] },"
- " valueOf: function() { return 1 } }; a"),
- nxt_string("1") },
-
- { nxt_string("var a = { toString: function() { return [] },"
- " valueOf: function() { return 1 } };"
- "var o = {}; o[a] = 'test'"),
- nxt_string("test") },
-
- { nxt_string("({})[{}] = 'test'"),
- nxt_string("test") },
-
- { nxt_string("var o = {b:$r.props.b}; o.b"),
- nxt_string("42") },
-
- { nxt_string("$r2.uri == 'αβγ' && $r2.uri === 'αβγ'"),
- nxt_string("true") },
-
- /**/
-
- { nxt_string("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(5)"),
- nxt_string("1077") },
-
- { nxt_string("'12345абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(35)"),
- nxt_string("1101") },
-
- { nxt_string("'12345абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.substring(35)"),
- nxt_string("эюя") },
-
- { nxt_string("'abcdef'.substr(-5, 4).substring(3, 1).charAt(1)"),
- nxt_string("d") },
-
- { nxt_string("'abcdef'.substr(2, 4).charAt(2)"),
- nxt_string("e") },
-
- { nxt_string("var a = 'abcdef'.substr(2, 4).charAt(2).length; a"),
- nxt_string("1") },
-
- { nxt_string("var a = 'abcdef'.substr(2, 4).charAt(2) + '1234'; a"),
- nxt_string("e1234") },
-
- { nxt_string("var a = ('abcdef'.substr(2, 5 * 2 - 6).charAt(2) + '1234')"
- " .length; a"),
- nxt_string("5") },
-
- { nxt_string("String.fromCharCode('_').charCodeAt(0)"),
- nxt_string("0") },
-
- { nxt_string("String.fromCodePoint('_')"),
- nxt_string("RangeError") },
-
- { nxt_string("String.fromCharCode(65.14)"),
- nxt_string("A") },
-
- { nxt_string("String.fromCodePoint(3.14)"),
- nxt_string("RangeError") },
-
- { nxt_string("String.fromCharCode(65.14 + 65536)"),
- nxt_string("A") },
-
- { nxt_string("String.fromCodePoint(65 + 65536)"),
- nxt_string("𐁁") },
-
- { nxt_string("String.fromCharCode(2**53 + 10)"),
- nxt_string("\n") },
-
- { nxt_string("String.fromCodePoint(1114111 + 1)"),
- nxt_string("RangeError") },
-
- { nxt_string("String.fromCharCode(65, 90) + String.fromCodePoint(65, 90)"),
- nxt_string("AZAZ") },
-
- { nxt_string("String.fromCharCode(945, 946, 947) + String.fromCodePoint(945, 946, 947)"),
- nxt_string("αβγαβγ") },
-
- { nxt_string("(function() {"
- " var n;"
- " for (n = 0; n <= 65536; n++) {"
- " if (String.fromCharCode(n).charCodeAt(0) !== n)"
- " return n;"
- " }"
- " return -1"
- "})()"),
- nxt_string("65536") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* very long test under MSAN */
- { nxt_string("(function() {"
- " var n;"
- " for (n = 0; n <= 1114111; n++) {"
- " if (String.fromCodePoint(n).codePointAt(0) !== n)"
- " return n;"
- " }"
- " return -1"
- "})()"),
- nxt_string("-1") },
-#endif
-
- { nxt_string("var a = 'abcdef'; function f(a) {"
- "return a.slice(a.indexOf('cd')) } f(a)"),
- nxt_string("cdef") },
-
- { nxt_string("var a = 'abcdef'; a.slice(a.indexOf('cd'))"),
- nxt_string("cdef") },
-
- { nxt_string("'abcdef'.indexOf('de', 2)"),
- nxt_string("3") },
-
- { nxt_string("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.indexOf('лмно', 10)"),
- nxt_string("12") },
-
- { nxt_string("'abcdef'.indexOf('a', 10)"),
- nxt_string("-1") },
-
- { nxt_string("'abcdef'.indexOf('q', 0)"),
- nxt_string("-1") },
-
- { nxt_string("'abcdef'.indexOf('', 10)"),
- nxt_string("6") },
-
- { nxt_string("'abcdef'.indexOf('', 3)"),
- nxt_string("3") },
-
- { nxt_string("'12345'.indexOf()"),
- nxt_string("-1") },
-
- { nxt_string("''.indexOf('')"),
- nxt_string("0") },
-
- { nxt_string("'12345'.indexOf(45, '0')"),
- nxt_string("3") },
-
- { nxt_string("'12'.indexOf('12345')"),
- nxt_string("-1") },
-
- { nxt_string("''.indexOf.call(12345, 45, '0')"),
- nxt_string("3") },
-
- { nxt_string("'abc'.lastIndexOf('abcdef')"),
- nxt_string("-1") },
-
- { nxt_string("'abc abc abc abc'.lastIndexOf('abc')"),
- nxt_string("12") },
-
- { nxt_string("'abc abc abc abc'.lastIndexOf('abc', 11)"),
- nxt_string("8") },
-
- { nxt_string("'abc abc abc abc'.lastIndexOf('abc', 0)"),
- nxt_string("0") },
-
- { nxt_string("'abc abc abc abc'.lastIndexOf('', 0)"),
- nxt_string("0") },
-
- { nxt_string("'abc abc abc abc'.lastIndexOf('', 5)"),
- nxt_string("5") },
-
- { nxt_string("'abc abc абвгд abc'.lastIndexOf('абвгд')"),
- nxt_string("8") },
-
- { nxt_string("'abc abc абвгд abc'.lastIndexOf('абвгд', undefined)"),
- nxt_string("8") },
-
- { nxt_string("'abc abc абвгд abc'.lastIndexOf('абвгд', NaN)"),
- nxt_string("8") },
-
- { nxt_string("'abc abc абвгд abc'.lastIndexOf('абвгд', {})"),
- nxt_string("8") },
-
- { nxt_string("String.prototype.lastIndexOf.call({toString:()=>'abc abc абвгд abc'}, 'абвгд')"),
- nxt_string("8") },
-
- { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд')"),
- nxt_string("8") },
-
- { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд', 11)"),
- nxt_string("8") },
-
- { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд', 12)"),
- nxt_string("8") },
-
- { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд', 13)"),
- nxt_string("8") },
-
- { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд', 14)"),
- nxt_string("8") },
-
- { nxt_string("'abc abc абвгдежз'.lastIndexOf('абвгд', 15)"),
- nxt_string("8") },
-
- { nxt_string("'abc abc абвгдежз'.lastIndexOf('')"),
- nxt_string("16") },
-
- { nxt_string("'abc abc абвгдежз'.lastIndexOf('', 12)"),
- nxt_string("12") },
-
- { nxt_string("''.lastIndexOf('')"),
- nxt_string("0") },
-
- { nxt_string("''.lastIndexOf()"),
- nxt_string("-1") },
-
- { nxt_string("''.lastIndexOf(undefined)"),
- nxt_string("-1") },
-
- { nxt_string("'β'.repeat(32).lastIndexOf('β')"),
- nxt_string("31") },
-
- { nxt_string("'β'.repeat(32).lastIndexOf``"),
- nxt_string("32") },
-
- { nxt_string("JSON.stringify(Array(24).fill(true).map((v,i) => 'abc abc ab abc абвгдежзab'.lastIndexOf('abc', i)))"
- "== JSON.stringify([].concat(Array(4).fill(0), Array(7).fill(4), Array(13).fill(11)))"),
- nxt_string("true") },
-
- { nxt_string("''.includes('')"),
- nxt_string("true") },
-
- { nxt_string("'12345'.includes()"),
- nxt_string("false") },
-
- { nxt_string("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.includes('лмно', 10)"),
- nxt_string("true") },
-
- { nxt_string("'абв абв абвгдежз'.includes('абвгд', 7)"),
- nxt_string("true") },
-
- { nxt_string("'абв абв абвгдежз'.includes('абвгд', 8)"),
- nxt_string("true") },
-
- { nxt_string("'абв абв абвгдежз'.includes('абвгд', 9)"),
- nxt_string("false") },
-
- { nxt_string("''.startsWith('')"),
- nxt_string("true") },
-
- { nxt_string("'12345'.startsWith()"),
- nxt_string("false") },
-
- { nxt_string("'abc'.startsWith('abc')"),
- nxt_string("true") },
-
- { nxt_string("'abc'.startsWith('abc', 1)"),
- nxt_string("false") },
-
- { nxt_string("'abc'.startsWith('abc', -1)"),
- nxt_string("true") },
-
- { nxt_string("'абв абв абвгдежз'.startsWith('абвгд', 8)"),
- nxt_string("true") },
-
- { nxt_string("'абв абв абвгдежз'.startsWith('абвгд', 9)"),
- nxt_string("false") },
-
- { nxt_string("''.endsWith('')"),
- nxt_string("true") },
-
- { nxt_string("'12345'.endsWith()"),
- nxt_string("false") },
-
- { nxt_string("'abc'.endsWith('abc')"),
- nxt_string("true") },
-
- { nxt_string("'abc'.endsWith('abc', 4)"),
- nxt_string("true") },
-
- { nxt_string("'abc'.endsWith('abc', 1)"),
- nxt_string("false") },
-
- { nxt_string("'abc'.endsWith('abc', -1)"),
- nxt_string("true") },
-
- { nxt_string("'абв абв абвгдежз'.endsWith('абвгд', 13)"),
- nxt_string("true") },
-
- { nxt_string("'абв абв абвгдежз'.endsWith('абвгд', 14)"),
- nxt_string("false") },
-
- { nxt_string("'\x00АБВГДЕЁЖЗ'.toLowerCase().length"),
- nxt_string("10") },
-
- { nxt_string("'ΑΒΓ'.toLowerCase()"),
- nxt_string("αβγ") },
-
- { nxt_string("'АБВ'.toLowerCase()"),
- nxt_string("абв") },
-
- { nxt_string("'Ȿ'.repeat(256).toLowerCase() === 'ȿ'.repeat(256)"),
- nxt_string("true") },
-
- { nxt_string("'abc'.toUpperCase()"),
- nxt_string("ABC") },
-
- { nxt_string("'αβγ'.toUpperCase()"),
- nxt_string("ΑΒΓ") },
-
- { nxt_string("'ȿ'.repeat(256).toUpperCase() === 'Ȿ'.repeat(256)"),
- nxt_string("true") },
-
- { nxt_string("'\x00абвгдеёжз'.toUpperCase().length"),
- nxt_string("10") },
-
- { nxt_string("['ȿ', 'Ȿ', 'ȿ'.toUpperCase(), 'Ȿ'.toLowerCase()].map((v)=>v.toUTF8().length)"),
- nxt_string("2,3,3,2") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* very long tests under MSAN */
- { nxt_string("var a = [], code;"
- "for (code = 0; code <= 1114111; code++) {"
- " var s = String.fromCodePoint(code);"
- " var n = s.toUpperCase();"
- " if (s != n && s != n.toLowerCase())"
- " a.push(code);"
- "} a"),
- nxt_string("181,305,383,453,456,459,498,837,962,976,977,981,982,1008,1009,1013,7296,7297,7298,7299,7300,7301,7302,7303,7304,7835,8126") },
-
- { nxt_string("var a = [], code;"
- "for (code = 0; code <= 1114111; code++) {"
- " var s = String.fromCodePoint(code);"
- " var n = s.toLowerCase();"
- " if (s != n && s != n.toUpperCase())"
- " a.push(code);"
- "} a"),
- nxt_string("304,453,456,459,498,1012,7838,8486,8490,8491") },
-#endif
-
- { nxt_string("'abc'.trimStart().trim().trimEnd()"),
- nxt_string("abc") },
-
- { nxt_string("''.trim()"),
- nxt_string("") },
-
- { nxt_string("' '.trim()"),
- nxt_string("") },
-
- { nxt_string("'abc '.trimEnd()"),
- nxt_string("abc") },
-
- { nxt_string("' abc'.trimStart()"),
- nxt_string("abc") },
-
- { nxt_string("' abc '.trim()"),
- nxt_string("abc") },
-
- { nxt_string("'абв '.trimEnd()"),
- nxt_string("абв") },
-
- { nxt_string("' абв'.trimStart()"),
- nxt_string("абв") },
-
- { nxt_string("' абв '.trimStart().trimEnd()"),
- nxt_string("абв") },
-
- { nxt_string("'\\u2029abc\\uFEFF\\u2028'.trim()"),
- nxt_string("abc") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* very long test under MSAN */
- { nxt_string("var a = [], code;"
- "for (code = 0; code <= 1114111; code++) {"
- " var ws = String.fromCodePoint(code);"
- " if ((ws + '-' + ws).trim() === '-')"
- " a.push(code);"
- "} a"),
- nxt_string("9,10,11,12,13,32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288,65279") },
-#endif
-
- { nxt_string("'abcdefgh'.search()"),
- nxt_string("0") },
-
- { nxt_string("'abcdefgh'.search('')"),
- nxt_string("0") },
-
- { nxt_string("'abcdefgh'.search(undefined)"),
- nxt_string("0") },
-
- { nxt_string("'abcdefgh'.search(/def/)"),
- nxt_string("3") },
-
- { nxt_string("'abcdefgh'.search('def')"),
- nxt_string("3") },
-
- { nxt_string("'123456'.search('45')"),
- nxt_string("3") },
-
- { nxt_string("'123456'.search(45)"),
- nxt_string("3") },
-
- { nxt_string("'123456'.search(String(45))"),
- nxt_string("3") },
-
- { nxt_string("'123456'.search(Number('45'))"),
- nxt_string("3") },
-
- { nxt_string("var r = { toString: function() { return '45' } };"
- "'123456'.search(r)"),
- nxt_string("3") },
-
- { nxt_string("var r = { toString: function() { return 45 } };"
- "'123456'.search(r)"),
- nxt_string("3") },
-
- { nxt_string("var r = { toString: function() { return /45/ } };"
- "'123456'.search(r)"),
- nxt_string("TypeError: Cannot convert object to primitive value") },
-
- { nxt_string("var r = { toString: function() { return /34/ },"
- " valueOf: function() { return 45 } };"
- "'123456'.search(r)"),
- nxt_string("3") },
-
- { nxt_string("'abcdefgh'.replace()"),
- nxt_string("abcdefgh") },
-
- { nxt_string("'abcdefgh'.replace('d')"),
- nxt_string("abcundefinedefgh") },
-
- { nxt_string("'abcdefgh'.replace('d', undefined)"),
- nxt_string("abcundefinedefgh") },
-
- { nxt_string("'a'.repeat(16).replace('a'.repeat(17)) === 'a'.repeat(16)"),
- nxt_string("true") },
-
- { nxt_string("'abcdefgh'.replace('d', null)"),
- nxt_string("abcnullefgh") },
-
- { nxt_string("'abcdefgh'.replace('d', 1)"),
- nxt_string("abc1efgh") },
-
- { nxt_string("'abcdefghdijklm'.replace('d', 'X')"),
- nxt_string("abcXefghdijklm") },
-
- { nxt_string("'абвгдежгийклм'.replace('г', 'Г')"),
- nxt_string("абвГдежгийклм") },
-
- { nxt_string("'abcdefghdijklm'.replace('d',"
- " function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
- nxt_string("abc|abcdefghdijklm|3|d|efghdijklm") },
-
- { nxt_string("'abcdefgh'.replace('', 'X')"),
- nxt_string("Xabcdefgh") },
-
- { nxt_string("'abcdefghdijklm'.replace(/d/, 'X')"),
- nxt_string("abcXefghdijklm") },
-
- { nxt_string("'abcdefghdijklm'.replace(/d/,"
- " function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
- nxt_string("abc|abcdefghdijklm|3|d|efghdijklm") },
-
- { nxt_string("'abcdefghdijklm'.replace(/(d)/,"
- " function(m, p, o, s)"
- "{ return '|'+s+'|'+o+'|'+m+'|'+p+'|' })"),
- nxt_string("abc|abcdefghdijklm|3|d|d|efghdijklm") },
-
- { nxt_string("'abcdefghdijklm'.replace(/x/, 'X')"),
- nxt_string("abcdefghdijklm") },
-
- { nxt_string("'abcdefghdijklm'.replace(/x/,"
- " function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
- nxt_string("abcdefghdijklm") },
-
- { nxt_string("'абвгдежгийклм'.replace(/г/, 'Г')"),
- nxt_string("абвГдежгийклм") },
-
- { nxt_string("'abcdefghdijklm'.replace(/d/g, 'X')"),
- nxt_string("abcXefghXijklm") },
-
- { nxt_string("'абвгдежгийклм'.replace(/г/g, 'Г')"),
- nxt_string("абвГдежГийклм") },
-
- { nxt_string("'abc12345#$*%'.replace(/([^\\d]*)(\\d*)([^\\w]*)/,"
- " function(match, p1, p2, p3) {"
- " return [p1, p2, p3].join('-')})"),
- nxt_string("abc-12345-#$*%") },
-
- { nxt_string("'ABCDEFGHDIJKLM'.replace(/[A-Z]/g,"
- " function(match) { return '-' + match.toLowerCase() })"),
- nxt_string("-a-b-c-d-e-f-g-h-d-i-j-k-l-m") },
-
- { nxt_string("'abcdbe'.replace(/(b)/g, '$')"),
- nxt_string("a$cd$e") },
-
- { nxt_string("'abcdbe'.replace(/(b)/g, '$2$23')"),
- nxt_string("a$2$23cd$2$23e") },
-
- { nxt_string("'abcdbe'.replace(/(b)/g, '$2$23X$$Y')"),
- nxt_string("a$2$23X$Ycd$2$23X$Ye") },
-
- { nxt_string("'abcdbe'.replace('b', '|$`X$\\'|')"),
- nxt_string("a|aXcdbe|cdbe") },
-
- { nxt_string("'abcdbe'.replace(/b/, '|$`X$\\'|')"),
- nxt_string("a|aXcdbe|cdbe") },
-
- { nxt_string("'abcdbefbgh'.replace(/b/g, '|$`X$\\'|')"),
- nxt_string("a|aXcdbefbgh|cd|abcdXefbgh|ef|abcdbefXgh|gh") },
-
- { nxt_string("'abc12345#$*%'.replace(/([^\\d]*)(\\d*)([^\\w]*)/,"
- " '$1-$2-$3')"),
- nxt_string("abc-12345-#$*%") },
-
- { nxt_string("'$1,$2'.replace(/(\\$(\\d))/g, '$$1-$1$2')"),
- nxt_string("$1-$11,$1-$22") },
-
- { nxt_string("('β' + 'α'.repeat(33)+'β').replace(/(α+)(β+)/, function(m, p1) { return p1[32]; })"),
- nxt_string("βα") },
-
- { nxt_string("'abc'.replace(/(h*)(z*)(g*)/g, '$1nn$2zz$3')"),
- nxt_string("nnzzannzzbnnzzcnnzz") },
-
- { nxt_string("'abc'.replace(/(h*)(z*)/g, '$1nn$2zz$3yy')"),
- nxt_string("nnzz$3yyannzz$3yybnnzz$3yycnnzz$3yy") },
-
- { nxt_string("'ъ'.replace(/(h*)/g, '$1ЮЙ')"),
- nxt_string("ЮЙъЮЙ") },
-
- { nxt_string("'ъg'.replace(/(h*)/g, '$1ЮЙ')"),
- nxt_string("ЮЙъЮЙgЮЙ") },
-
- { nxt_string("'ъg'.replace(/(ъ*)/g, '$1ЮЙ')"),
- nxt_string("ъЮЙЮЙgЮЙ") },
-
- { nxt_string("'ъg'.replace(/(h*)/g, 'fg$1ЮЙ')"),
- nxt_string("fgЮЙъfgЮЙgfgЮЙ") },
-
- { nxt_string("'юgёfя'.replace(/(gё)/g, 'n$1i')"),
- nxt_string("юngёifя") },
-
- { nxt_string("'aabbccaa'.replace(/a*/g, '')"),
- nxt_string("bbcc") },
-
- { nxt_string("'aabbccaab'.replace(/z*/g, '')"),
- nxt_string("aabbccaab") },
-
- { nxt_string("'αβγ'.replace(/z*/g, '|')"),
- nxt_string("|α|β|γ|") },
-
- { nxt_string("''.replace(/a*/g, '')"),
- nxt_string("") },
-
- { nxt_string("'12345'.replace(3, () => 0)"),
- nxt_string("12045") },
-
- { nxt_string("'123'.replace(3, function() { return {toString: ()=>({})}; })"),
- nxt_string("TypeError: Cannot convert object to primitive value") },
-
- { nxt_string("'12345'.replace(3, () => ({toString: () => 'aaaa'}))"),
- nxt_string("12aaaa45") },
-
- { nxt_string("'abc'.replace(/(z*)/g, function v0() {return '124'})"),
- nxt_string("124a124b124c124") },
-
- { nxt_string("'abc'.replace(/(a*)/g, function v0() {return '124'})"),
- nxt_string("124124b124c124") },
-
- { nxt_string("'abc'.replace(/b/g, '$0')"),
- nxt_string("a$0c") },
-
- { nxt_string("typeof String.bytesFrom(Array(15).fill(0xE3)).replace(/^/g, 1)"),
- nxt_string("string") },
-
-#if 0 /* FIXME: PCRE limitation */
- { nxt_string("'abc'.replace(/^/g, '|$&|')"),
- nxt_string("||abc") },
-#endif
-
- { nxt_string("'abc'.replace(/b/g, '|$&|')"),
- nxt_string("a|b|c") },
-
- { nxt_string("'ABC'.replace(/((A)B)/g, '($1|$&|$2)')"),
- nxt_string("(AB|AB|A)C") },
-
- { nxt_string("/]/"),
- nxt_string("/\\]/") },
-
- { nxt_string("RegExp(']')"),
- nxt_string("/\\]/") },
-
- { nxt_string("RegExp('[\\\\\\\\]]')"),
- nxt_string("/[\\\\]\\]/") },
-
- { nxt_string("/[\\\\]]/"),
- nxt_string("/[\\\\]\\]/") },
-
- { nxt_string("/\\]/"),
- nxt_string("/\\]/") },
-
- { nxt_string("RegExp('\\]')"),
- nxt_string("/\\]/") },
-
- { nxt_string("/ab]cd/"),
- nxt_string("/ab\\]cd/") },
-
- { nxt_string("/ab]/"),
- nxt_string("/ab\\]/") },
-
- { nxt_string("/]cd/"),
- nxt_string("/\\]cd/") },
-
- { nxt_string("RegExp('\\\\0').source[1]"),
- nxt_string("0") },
-
- { nxt_string("']'.match(/]/)"),
- nxt_string("]") },
-
- { nxt_string("'ab]cd'.match(/]/)"),
- nxt_string("]") },
-
- { nxt_string("'ab]'.match(/]/)"),
- nxt_string("]") },
-
- { nxt_string("']cd'.match(/]/)"),
- nxt_string("]") },
-
- { nxt_string("'ab]cd'.match(/\\]/)"),
- nxt_string("]") },
-
- { nxt_string("'abc'.match(/a*/g)"),
- nxt_string("a,,,") },
-
- { nxt_string("'abc'.match(/z*/g)"),
- nxt_string(",,,") },
-
- { nxt_string("'abc'.match(/.?/g)"),
- nxt_string("a,b,c,") },
-
- { nxt_string("''.match(/a*/g)"),
- nxt_string("") },
-
- { nxt_string("''.match(/.?/g)"),
- nxt_string("") },
-
- { nxt_string("'абв'.match(/я?/g)"),
- nxt_string(",,,") },
-
- { nxt_string("'αβγ'.match(/z*/g)"),
- nxt_string(",,,") },
-
- { nxt_string("'囲碁織'.match(/z*/g)"),
- nxt_string(",,,") },
-
- { nxt_string("'𝟘𝟙𝟚𝟛'.match(/z*/g)"),
- nxt_string(",,,,") },
-
- { nxt_string("'abcdefgh'.match()"),
- nxt_string("") },
-
- { nxt_string("'abcdefgh'.match('')"),
- nxt_string("") },
-
- { nxt_string("'abcdefgh'.match(undefined)"),
- nxt_string("") },
-
- { nxt_string("'abcdefgh'.match(/def/)"),
- nxt_string("def") },
-
- { nxt_string("'abcdefgh'.match('def')"),
- nxt_string("def") },
-
- { nxt_string("'123456'.match('45')"),
- nxt_string("45") },
-
- { nxt_string("'123456'.match(45)"),
- nxt_string("45") },
-
- { nxt_string("'123456'.match(String(45))"),
- nxt_string("45") },
-
- { nxt_string("'123456'.match(Number('45'))"),
- nxt_string("45") },
-
- { nxt_string("var r = { toString: function() { return '45' } };"
- "'123456'.match(r)"),
- nxt_string("45") },
-
- { nxt_string("var r = { toString: function() { return 45 } };"
- "'123456'.match(r)"),
- nxt_string("45") },
-
- { nxt_string("var r = { toString: function() { return /45/ } };"
- "'123456'.match(r)"),
- nxt_string("TypeError: Cannot convert object to primitive value") },
-
- { nxt_string("var r = { toString: function() { return /34/ },"
- " valueOf: function() { return 45 } };"
- "'123456'.match(r)"),
- nxt_string("45") },
-
- { nxt_string("''.match(/^$/)"),
- nxt_string("") },
-
- { nxt_string("''.match(/^$/g)"),
- nxt_string("") },
-
- { nxt_string("'abcdefgh'.match(/def/)"),
- nxt_string("def") },
-
- { nxt_string("'abc abc abc'.match('abc')"),
- nxt_string("abc") },
-
- { nxt_string("'abc abc abc'.match(/abc/)"),
- nxt_string("abc") },
-
- { nxt_string("'abc abc abc'.match(/abc/g)"),
- nxt_string("abc,abc,abc") },
-
- { nxt_string("'abc ABC aBc'.match(/abc/ig)"),
- nxt_string("abc,ABC,aBc") },
-
- { nxt_string("var a = 'α'.match(/α/g)[0] + 'α';"
- "a +' '+ a.length"),
- nxt_string("αα 2") },
-
- { nxt_string("('β' + 'α'.repeat(33) +'β').match(/α+/g)[0][32]"),
- nxt_string("α") },
-
- { nxt_string("var a = '\\u00CE\\u00B1'.toBytes().match(/α/g)[0] + 'α';"
- "a +' '+ a.length"),
- nxt_string("αα 4") },
-
- { nxt_string("typeof String.bytesFrom(Array(15).fill(0xE3)).match(/^/g)"),
- nxt_string("object") },
-
- { nxt_string("'abc'.split()"),
- nxt_string("abc") },
-
- { nxt_string("'abc'.split(undefined)"),
- nxt_string("abc") },
-
- { nxt_string("''.split('').length"),
- nxt_string("1") },
-
- { nxt_string("'abc'.split('')"),
- nxt_string("a,b,c") },
-
- { nxt_string("'αβγ'.split('')"),
- nxt_string("α,β,γ") },
-
- { nxt_string("'囲碁織'.split('')"),
- nxt_string("囲,碁,織") },
-
- { nxt_string("'𝟘𝟙𝟚𝟛'.split('')"),
- nxt_string("𝟘,𝟙,𝟚,𝟛") },
-
- { nxt_string("'囲α碁α織'.split('α')"),
- nxt_string("囲,碁,織") },
-
- { nxt_string("'a'.repeat(16).split('a'.repeat(15))"),
- nxt_string(",a") },
-
- { nxt_string("('α'+'β'.repeat(33)).repeat(2).split('α')[1][32]"),
- nxt_string("β") },
-
- { nxt_string("'abc'.split('abc')"),
- nxt_string(",") },
-
- { nxt_string("'a bc def'.split(' ')"),
- nxt_string("a,bc,def") },
-
- { nxt_string("'a bc def'.split(' ')"),
- nxt_string("a,bc,,def") },
-
- { nxt_string("'a bc def'.split(' ', 3)"),
- nxt_string("a,bc,") },
-
- { nxt_string("'abc'.split('abc')"),
- nxt_string(",") },
-
- { nxt_string("'ab'.split('123')"),
- nxt_string("ab") },
-
- { nxt_string("''.split(/0/).length"),
- nxt_string("1") },
-
- { nxt_string("'abc'.split(/(?:)/)"),
- nxt_string("a,b,c") },
-
- { nxt_string("'a bc def'.split(/ /)"),
- nxt_string("a,bc,def") },
-
- { nxt_string("'a bc def'.split(/ /)"),
- nxt_string("a,bc,,def") },
-
- { nxt_string("'abc'.split(/abc/)"),
- nxt_string(",") },
-
- { nxt_string("'0123456789'.split('').reverse().join('')"),
- nxt_string("9876543210") },
-
- { nxt_string("'abc'.repeat(3)"),
- nxt_string("abcabcabc") },
-
- { nxt_string("'абв'.repeat(3)"),
- nxt_string("абвабвабв") },
-
- { nxt_string("''.repeat(3)"),
- nxt_string("") },
-
- { nxt_string("'abc'.repeat(0)"),
- nxt_string("") },
-
- { nxt_string("'abc'.repeat(NaN)"),
- nxt_string("") },
-
- { nxt_string("'abc'.repeat(Infinity)"),
- nxt_string("RangeError") },
-
- { nxt_string("'abc'.repeat(-1)"),
- nxt_string("RangeError") },
-
- { nxt_string("''.repeat(-1)"),
- nxt_string("RangeError") },
-
- { nxt_string("'a'.repeat(2147483647)"),
- nxt_string("RangeError") },
-
- { nxt_string("'a'.repeat(2147483648)"),
- nxt_string("RangeError") },
-
- { nxt_string("'a'.repeat(Infinity)"),
- nxt_string("RangeError") },
-
- { nxt_string("'a'.repeat(NaN)"),
- nxt_string("") },
-
- { nxt_string("''.repeat(2147483646)"),
- nxt_string("") },
-
- /* ES6: "". */
- { nxt_string("''.repeat(2147483647)"),
- nxt_string("RangeError") },
-
- { nxt_string("''.repeat(2147483648)"),
- nxt_string("RangeError") },
-
- { nxt_string("''.repeat(Infinity)"),
- nxt_string("RangeError") },
-
- { nxt_string("''.repeat(NaN)"),
- nxt_string("") },
-
- { nxt_string("'abc'.padStart(7)"),
- nxt_string(" abc") },
-
- { nxt_string("'абв'.padStart(7)"),
- nxt_string(" абв") },
-
- { nxt_string("'abc'.padStart(3)"),
- nxt_string("abc") },
-
- { nxt_string("'абв'.padStart(0)"),
- nxt_string("абв") },
-
- { nxt_string("'abc'.padStart(NaN)"),
- nxt_string("abc") },
-
- { nxt_string("'abc'.padStart(2147483647)"),
- nxt_string("RangeError") },
-
- { nxt_string("'abc'.padStart(2147483646, '')"),
- nxt_string("abc") },
-
- { nxt_string("''.padStart(0, '')"),
- nxt_string("") },
-
- { nxt_string("'1'.padStart(5, 0)"),
- nxt_string("00001") },
-
- { nxt_string("''.padStart(1, 'я')"),
- nxt_string("я") },
-
- { nxt_string("'abc'.padStart(6, NaN)"),
- nxt_string("NaNabc") },
-
- { nxt_string("'abc'.padStart(11, 123)"),
- nxt_string("12312312abc") },
-
- { nxt_string("'abc'.padStart(6, 12345)"),
- nxt_string("123abc") },
-
- { nxt_string("'абв'.padStart(6, 'эюя')"),
- nxt_string("эюяабв") },
-
- { nxt_string("'абв'.padStart(4, 'эюя')"),
- nxt_string("эабв") },
-
- { nxt_string("'абв'.padStart(7, 'эюя')"),
- nxt_string("эюяэабв") },
-
- { nxt_string("'абв'.padStart(10, 'эю')"),
- nxt_string("эюэюэюэабв") },
-
- { nxt_string("'1234'.padEnd(4)"),
- nxt_string("1234") },
-
- { nxt_string("'1234'.padEnd(-1)"),
- nxt_string("1234") },
-
- { nxt_string("'я'.padEnd(1)"),
- nxt_string("я") },
-
- { nxt_string("'1234'.padEnd(5)"),
- nxt_string("1234 ") },
-
- { nxt_string("'я'.padEnd(6)"),
- nxt_string("я ") },
-
- { nxt_string("'я'.padEnd(2147483647)"),
- nxt_string("RangeError") },
-
- { nxt_string("'я'.padEnd(2147483646, '')"),
- nxt_string("я") },
-
- { nxt_string("''.padEnd(0, '')"),
- nxt_string("") },
-
- { nxt_string("'эю'.padEnd(3, 'я')"),
- nxt_string("эюя") },
-
- { nxt_string("''.padEnd(1, 0)"),
- nxt_string("0") },
-
- { nxt_string("'1234'.padEnd(8, 'abcd')"),
- nxt_string("1234abcd") },
-
- { nxt_string("'1234'.padEnd(10, 'abcd')"),
- nxt_string("1234abcdab") },
-
- { nxt_string("'1234'.padEnd(7, 'abcd')"),
- nxt_string("1234abc") },
-
- { nxt_string("'абв'.padEnd(5, 'ГД')"),
- nxt_string("абвГД") },
-
- { nxt_string("'абв'.padEnd(4, 'ГДУ')"),
- nxt_string("абвГ") },
-
- { nxt_string("'абвг'.padEnd(10, 'ДЕЖЗ')"),
- nxt_string("абвгДЕЖЗДЕ") },
-
- { nxt_string("String.bytesFrom({})"),
- nxt_string("TypeError: value must be a string or array") },
-
- { nxt_string("String.bytesFrom([1, 2, 0.23, '5', 'A']).toString('hex')"),
- nxt_string("0102000500") },
-
- { nxt_string("String.bytesFrom([NaN, Infinity]).toString('hex')"),
- nxt_string("0000") },
-
- { nxt_string("String.bytesFrom('', 'hex')"),
- nxt_string("") },
-
- { nxt_string("String.bytesFrom('00aabbcc', 'hex').toString('hex')"),
- nxt_string("00aabbcc") },
-
- { nxt_string("String.bytesFrom('deadBEEF##', 'hex').toString('hex')"),
- nxt_string("deadbeef") },
-
- { nxt_string("String.bytesFrom('aa0', 'hex').toString('hex')"),
- nxt_string("aa") },
-
- { nxt_string("String.bytesFrom('', 'base64')"),
- nxt_string("") },
-
- { nxt_string("String.bytesFrom('#', 'base64')"),
- nxt_string("") },
-
- { nxt_string("String.bytesFrom('QQ==', 'base64')"),
- nxt_string("A") },
-
- { nxt_string("String.bytesFrom('QQ', 'base64')"),
- nxt_string("A") },
-
- { nxt_string("String.bytesFrom('QUI=', 'base64')"),
- nxt_string("AB") },
-
- { nxt_string("String.bytesFrom('QUI', 'base64')"),
- nxt_string("AB") },
-
- { nxt_string("String.bytesFrom('QUJD', 'base64')"),
- nxt_string("ABC") },
-
- { nxt_string("String.bytesFrom('QUJDRA==', 'base64')"),
- nxt_string("ABCD") },
-
- { nxt_string("String.bytesFrom('', 'base64url')"),
- nxt_string("") },
-
- { nxt_string("String.bytesFrom('QQ', 'base64url')"),
- nxt_string("A") },
-
- { nxt_string("String.bytesFrom('QUI', 'base64url')"),
- nxt_string("AB") },
-
- { nxt_string("String.bytesFrom('QUJD', 'base64url')"),
- nxt_string("ABC") },
-
- { nxt_string("String.bytesFrom('QUJDRA', 'base64url')"),
- nxt_string("ABCD") },
-
- { nxt_string("String.bytesFrom('QUJDRA#', 'base64url')"),
- nxt_string("ABCD") },
-
- { nxt_string("encodeURI.name"),
- nxt_string("encodeURI")},
-
- { nxt_string("encodeURI.length"),
- nxt_string("1")},
-
- { nxt_string("encodeURI()"),
- nxt_string("undefined")},
-
- { nxt_string("encodeURI('012абв')"),
- nxt_string("012%D0%B0%D0%B1%D0%B2")},
-
- { nxt_string("encodeURI('~}|{`_^]\\\\[@?>=<;:/.-,+*)(\\\'&%$#\"! ')"),
- nxt_string("~%7D%7C%7B%60_%5E%5D%5C%5B@?%3E=%3C;:/.-,+*)('&%25$#%22!%20")},
-
- { nxt_string("encodeURIComponent.name"),
- nxt_string("encodeURIComponent")},
-
- { nxt_string("encodeURIComponent.length"),
- nxt_string("1")},
-
- { nxt_string("encodeURIComponent('~}|{`_^]\\\\[@?>=<;:/.-,+*)(\\\'&%$#\"! ')"),
- nxt_string("~%7D%7C%7B%60_%5E%5D%5C%5B%40%3F%3E%3D%3C%3B%3A%2F.-%2C%2B*)('%26%25%24%23%22!%20")},
-
- { nxt_string("decodeURI.name"),
- nxt_string("decodeURI")},
-
- { nxt_string("decodeURI.length"),
- nxt_string("1")},
-
- { nxt_string("decodeURI()"),
- nxt_string("undefined")},
-
- { nxt_string("decodeURI('%QQ')"),
- nxt_string("URIError")},
-
- { nxt_string("decodeURI('%')"),
- nxt_string("URIError")},
-
- { nxt_string("decodeURI('%0')"),
- nxt_string("URIError")},
-
- { nxt_string("decodeURI('%00')"),
- nxt_string("\0")},
-
- { nxt_string("decodeURI('%3012%D0%B0%D0%B1%D0%B2')"),
- nxt_string("012абв")},
-
- { nxt_string("decodeURI('%7e%7d%7c%7b%60%5f%5e%5d%5c%5b%40%3f%3e%3d%3c%3b%3a%2f%2e%2c%2b%2a%29%28%27%26%25%24%23%22%21%20')"),
- nxt_string("~}|{`_^]\\[%40%3f>%3d<%3b%3a%2f.%2c%2b*)('%26%%24%23\"! ")},
-
- { nxt_string("decodeURIComponent.name"),
- nxt_string("decodeURIComponent")},
-
- { nxt_string("decodeURIComponent.length"),
- nxt_string("1")},
-
- { nxt_string("decodeURIComponent('%7e%7d%7c%7b%60%5f%5e%5d%5c%5b%40%3f%3e%3d%3c%3b%3a%2f%2e%2c%2b%2a%29%28%27%26%25%24%23%22%21%20')"),
- nxt_string("~}|{`_^]\\[@?>=<;:/.,+*)('&%$#\"! ")},
-
- { nxt_string("decodeURI('%41%42%43').length"),
- nxt_string("3")},
-
- { nxt_string("decodeURI('%D0%B0%D0%B1%D0%B2').length"),
- nxt_string("3")},
-
- { nxt_string("decodeURI('%80%81%82').length"),
- nxt_string("3")},
-
- /* Functions. */
-
- { nxt_string("return"),
- nxt_string("SyntaxError: Illegal return statement in 1") },
-
- { nxt_string("{return}"),
- nxt_string("SyntaxError: Illegal return statement in 1") },
-
- { nxt_string("\n{\nreturn;\n}"),
- nxt_string("SyntaxError: Illegal return statement in 3") },
-
- { nxt_string("if (1) function f(){}"),
- nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
-
- { nxt_string("if (1) { function f(){}}"),
- nxt_string("undefined") },
-
- { nxt_string("while (1) function f() { }"),
- nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
-
- { nxt_string("while (1) { break; function f(){}}"),
- nxt_string("undefined") },
-
- { nxt_string("for (;;) function f() { }"),
- nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
-
- { nxt_string("for (;;) { break; function f(){}}"),
- nxt_string("undefined") },
-
- { nxt_string("do function f() { } while (0)"),
- nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
-
- { nxt_string("function f() { return 1; } { function f() { return 2; } } f()"),
- nxt_string("1") },
-
- { nxt_string("function f() { return 1; } { function f() { return 2; } { function f() { return 3; } }} f()"),
- nxt_string("1") },
-
- { nxt_string("{function f() {} {} f() }"),
- nxt_string("undefined") },
-
- { nxt_string("{ var f; function f() {} }"),
- nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
- { nxt_string("{ function f() {} var f; }"),
- nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
- { nxt_string("{ function f() {} { var f }}"),
- nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
- { nxt_string("function f() { return f() } f()"),
- nxt_string("RangeError: Maximum call stack size exceeded") },
-
- { nxt_string("function () { } f()"),
- nxt_string("SyntaxError: Unexpected token \"(\" in 1") },
-
- { nxt_string("function f() { }"),
- nxt_string("undefined") },
-
- { nxt_string("function f() { }; f.length"),
- nxt_string("0") },
-
- { nxt_string("function f() { }; f.length = 1"),
- nxt_string("TypeError: Cannot assign to read-only property \"length\" of function") },
-
- { nxt_string("function f(...rest) { }; f.length"),
- nxt_string("0") },
-
- { nxt_string("function f(...rest) { }; var binded = f.bind(this, [1,2]);"
- "binded.length"),
- nxt_string("0") },
-
- { nxt_string("function f(a,a) { };"),
- nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
- { nxt_string("function f(a,b,a) { };"),
- nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
- { nxt_string("function f(a, ...a) { };"),
- nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
- { nxt_string("(function(a,a) { })"),
- nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
- { nxt_string("(function(a,...a) { })"),
- nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
- { nxt_string("(function f(a,a) { })"),
- nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
- { nxt_string("(function f(a,...a) { })"),
- nxt_string("SyntaxError: Duplicate parameter names in 1") },
-
- { nxt_string("function f(a,b) { }; f.length"),
- nxt_string("2") },
-
- { nxt_string("function f(a,...rest) { }; f.length"),
- nxt_string("1") },
-
- { nxt_string("function f(a,b) { }; var ff = f.bind(f, 1); ff.length"),
- nxt_string("1") },
-
- { nxt_string("Object((new Date(0)).toJSON())+0"),
- nxt_string("1970-01-01T00:00:00.000Z0") },
-
- { nxt_string("Object((new Array(0)).toString())+0"),
- nxt_string("0") },
-
- { nxt_string("JSON.parse.length"),
- nxt_string("2") },
-
- { nxt_string("JSON.parse.bind(JSON, '[]').length"),
- nxt_string("1") },
-
- { nxt_string("var o = {}; o.hasOwnProperty.length"),
- nxt_string("1") },
-
- { nxt_string("var x; function f() { }"),
- nxt_string("undefined") },
-
- { nxt_string("function f() { } f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f() { ; } f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f() { ;; } f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f() { return } f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f() { return; } f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f() { return;; } f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f() { return 1 } f()"),
- nxt_string("1") },
-
- { nxt_string("function f() { return 1; } f()"),
- nxt_string("1") },
-
- { nxt_string("function f() { return 1;; } f()"),
- nxt_string("1") },
-
- { nxt_string("function f() { return 1\n 2 } f()"),
- nxt_string("1") },
-
- { nxt_string("function f() { return 1\n 2 } f()"),
- nxt_string("1") },
-
- { nxt_string("(function f() { return 2.toString(); })()"),
- nxt_string("SyntaxError: Unexpected token \"toString\" in 1") },
-
- { nxt_string("(function f() { return 2..toString(); })()"),
- nxt_string("2") },
-
- { nxt_string("function f(a) { if (a) return 'OK' } f(1)+f(0)"),
- nxt_string("OKundefined") },
-
- { nxt_string("function f(a) { if (a) return 'OK'; } f(1)+f(0)"),
- nxt_string("OKundefined") },
-
- { nxt_string("function f(a) { if (a) return 'OK';; } f(1)+f(0)"),
- nxt_string("OKundefined") },
-
- { nxt_string("var a = 1; a()"),
- nxt_string("TypeError: number is not a function") },
-
- { nxt_string("var o = {a:1}; o.a()"),
- nxt_string("TypeError: (intermediate value)[\"a\"] is not a function") },
-
- { nxt_string("(function(){})()"),
- nxt_string("undefined") },
-
- { nxt_string("var q = 1; function x(a, b, c) { q = a } x(5); q"),
- nxt_string("5") },
-
- { nxt_string("function x(a) { while (a < 2) a++; return a + 1 } x(1) "),
- nxt_string("3") },
-
- { nxt_string("(function(){(function(){(function(){(function(){"
- "(function(){(function(){(function(){})})})})})})})"),
- nxt_string("SyntaxError: The maximum function nesting level is \"5\" in 1") },
-
- { nxt_string("Function.prototype.toString = function () {return 'X'};"
- "eval"),
- nxt_string("X") },
-
- { nxt_string("var o = {f:function(x){ return x**2}}; o.f\n(2)"),
- nxt_string("4") },
-
- { nxt_string("var o = {f:function(x){ return x**2}}; o\n.f\n(2)"),
- nxt_string("4") },
-
- { nxt_string("var o = {f:function(x){ return x**2}}; o\n.\nf\n(2)"),
- nxt_string("4") },
-
- { nxt_string("function f(x){ return x**2}; [f(2)\n, f\n(2),\nf\n(\n2),\nf\n(\n2\n)]"),
- nxt_string("4,4,4,4") },
-
- { nxt_string("function f (x){ return x**2}; f\n(2)"),
- nxt_string("4") },
-
- { nxt_string("function f (x){ return x**2}; f\n(\n2)"),
- nxt_string("4") },
-
- { nxt_string("function f (x){ return x**2}; f\n(\n2\n)"),
- nxt_string("4") },
-
- { nxt_string("function f (x){ return x**2}; f\n(2\n)"),
- nxt_string("4") },
-
- { nxt_string("function f (x){ return x**2}; f(2\n)"),
- nxt_string("4") },
-
- { nxt_string("var fn = Function.prototype.call; fn.call(() => 1)"),
- nxt_string("1") },
-
- { nxt_string("var fn = Function.prototype.call; fn.call(fn, () => 1)"),
- nxt_string("1") },
-
- { nxt_string("var fn = Function.prototype.call; fn.call(fn, fn, () => 1)"),
- nxt_string("1") },
-
- { nxt_string("eval.call.call(Number)"),
- nxt_string("0") },
-
- { nxt_string("URIError.apply.apply(RegExp)"),
- nxt_string("/(?:)/") },
-
- { nxt_string("[0].some(function(){return Array.call.bind(isNaN)}())"),
- nxt_string("false") },
-
- /* Recursive factorial. */
-
- { nxt_string("function f(a) {"
- " if (a > 1)"
- " return a * f(a - 1)\n"
- " return 1"
- "}"
- "f(10)"),
- nxt_string("3628800") },
-
- /* Recursive factorial. */
-
- { nxt_string("function f(a) { return (a > 1) ? a * f(a - 1) : 1 } f(10)"),
- nxt_string("3628800") },
-
- { nxt_string("var g = function f(a) { return (a > 1) ? a * f(a - 1) : 1 };"
- "g(10)"),
- nxt_string("3628800") },
-
- { nxt_string("(function f(a) { return (a > 1) ? a * f(a - 1) : 1 })(10)"),
- nxt_string("3628800") },
-
- /* Nested functions and closures. */
-
- { nxt_string("function f() { var x = 4; "
- "function g() { return x }; return g(); } f()"),
- nxt_string("4") },
-
- { nxt_string("function f(a) { function g(b) { return a + b } return g }"
- "var k = f('a'); k('b')"),
- nxt_string("ab") },
-
- { nxt_string("function f(a) { return function(b) { return a + b } }"
- "var k = f('a'); k('b')"),
- nxt_string("ab") },
-
- { nxt_string("function f(a) { return function(b) { return a + b } }"
- "var k = f('a'), m = f('b'); k('c') + m('d')"),
- nxt_string("acbd") },
-
- { nxt_string("function f(a) { return "
- "function(b) { return function(c) { return a + b + c } } }"
- "var g = f('a'), k = g('b'), m = g('c'); k('d') + m('e')"),
- nxt_string("abdace") },
-
- { nxt_string("function f(a) {"
- "function g() { return a }; return g; }"
- "var y = f(4); y()"),
- nxt_string("4") },
-
- { nxt_string("function f() { var x = 4; "
- "return function() { return x } }"
- "var y = f(); y()"),
- nxt_string("4") },
-
- { nxt_string("function f() { var x = 4;"
- "function g() { if (1) { return 2 + x; } }; return g }"
- "var y = f(); y()"),
- nxt_string("6") },
-
- { nxt_string("var x; var y = 4;"
- "function f() { function h() { x = 3; return y; } }"),
- nxt_string("undefined") },
-
- { nxt_string("function f() {"
- " var a = 'a';"
- " if (0) { a = 'b' };"
- " function f2() { return a };"
- " return f2"
- "};"
- "f()()"),
- nxt_string("a") },
-
- { nxt_string("function f() {"
- " var a = 'a'; "
- " if (0) { if (0) {a = 'b'} };"
- " function f2() { return a };"
- " return f2"
- "};"
- "f()()"),
- nxt_string("a") },
-
- { nxt_string("function f() { var a = f2(); }"),
- nxt_string("undefined") },
-
- { nxt_string("function f() { var a = f2(); } f();"),
- nxt_string("ReferenceError: \"f2\" is not defined in 1") },
-
- { nxt_string("typeof Buffer !== 'undefined' ? Buffer : function Buffer(){}"),
- nxt_string("[object Function]") },
-
- { nxt_string("1 == 2 ? func() : '123'"),
- nxt_string("123") },
-
- { nxt_string("1 == 1 ? func() : '123'"),
- nxt_string("ReferenceError: \"func\" is not defined in 1") },
-
- { nxt_string("function f(){ if (1 == 1) { 1 == 2 ? some_var : '123' } }; f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f(){ if (1 == 1) { 1 == 1 ? some_var : '123' } }; f()"),
- nxt_string("ReferenceError: \"some_var\" is not defined in 1") },
-
- { nxt_string("function f(){ if (1 == 1) { 1 == 2 ? some_func() : '123' } }; f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f(){ if (1 == 1) { 1 == 1 ? some_func() : '123' } }; f()"),
- nxt_string("ReferenceError: \"some_func\" is not defined in 1") },
-
- { nxt_string("(function(){ function f() {return f}; return f()})()"),
- nxt_string("[object Function]") },
-
- { nxt_string("function f() {}; f.toString = ()=> 'F'; ({'F':1})[f]"),
- nxt_string("1") },
-
- { nxt_string("var a = ''; "
- "function f(list) {"
- " function add(v) {a+=v};"
- " list.forEach(function(v) {add(v)});"
- "};"
- "f(['a', 'b', 'c']); a"),
- nxt_string("abc") },
-
- { nxt_string("var l = [];"
- "var f = function() { "
- " function f2() { l.push(f); l.push(f2); }; "
- " l.push(f); l.push(f2); "
- " f2(); "
- "}; "
- "f(); "
- "l.every(function(v) {return typeof v == 'function'})"),
- nxt_string("true") },
-
- { nxt_string("var l = [];"
- "function baz() {"
- " function foo(v) {"
- " function bar() { foo(0); }"
- " l.push(v);"
- " if (v === 1) { bar(); }"
- " }"
- " foo(1);"
- "}; baz(); l"),
- nxt_string("1,0") },
-
- { nxt_string("var gen = (function(){ "
- " var s = 0; "
- " return { inc: function() {s++}, "
- " s: function() {return s} };});"
- "var o1 = gen(); var o2 = gen();"
- "[o1.s(),o2.s(),o1.inc(),o1.s(),o2.s(),o2.inc(),o1.s(),o2.s()]"),
- nxt_string("0,0,,1,0,,1,1") },
-
- /* Recursive fibonacci. */
-
- { nxt_string("function fibo(n) {"
- " if (n > 1)"
- " return fibo(n-1) + fibo(n-2)\n"
- " return 1"
- "}"
- "fibo(10)"),
- nxt_string("89") },
-
- { nxt_string("function fibo(n) {"
- " if (n > 1)"
- " return fibo(n-1) + fibo(n-2)\n"
- " return '.'"
- "}"
- "fibo(10).length"),
- nxt_string("89") },
-
- { nxt_string("function fibo(n) {"
- " if (n > 1)"
- " return fibo(n-1) + fibo(n-2)\n"
- " return 1"
- "}"
- "fibo('10')"),
- nxt_string("89") },
-
- { nxt_string("function add(a, b) { return a + b }"
- "function mul(a, b) { return a * b }"
- "function f(a, b) {"
- " return a + mul(add(1, 2), add(2, 3)) + b"
- "}"
- "f(30, 70)"),
- nxt_string("115") },
-
- { nxt_string("function a(x, y) { return x + y }"
- "function b(x, y) { return x * y }"
- "a(3, b(4, 5))"),
- nxt_string("23") },
-
- { nxt_string("function x(n) { return n }; x('12'.substr(1))"),
- nxt_string("2") },
-
- { nxt_string("function f(a) { a *= 2 } f(10)"),
- nxt_string("undefined") },
-
- { nxt_string("function f() { return 5 } f()"),
- nxt_string("5") },
-
- { nxt_string("function g(x) { return x + 1 }"
- "function f(x) { return x } f(g)(2)"),
- nxt_string("3") },
-
- { nxt_string("function f() { return 5 } f(1)"),
- nxt_string("5") },
-
- { nxt_string("function f() {} f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f() {;} f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f(){return} f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f(){return;} f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f(){return\n1} f()"),
- nxt_string("undefined") },
-
- { nxt_string("function f(a) { return a + 1 } var b = f(2); b"),
- nxt_string("3") },
-
- { nxt_string("var f = function(a) { a *= 2; return a }; f(10)"),
- nxt_string("20") },
-
- { nxt_string("var f = function b(a) { a *= 2; return a }; f(10)"),
- nxt_string("20") },
-
- { nxt_string("var f = function b(a) { a *= 2; return a }; b(10)"),
- nxt_string("ReferenceError: \"b\" is not defined in 1") },
-
- { nxt_string("var f; f = function(a) { a *= 2; return a }; f(10)"),
- nxt_string("20") },
-
- { nxt_string("var f; f = function b(a) { a *= 2; return a }; f(10)"),
- nxt_string("20") },
-
- { nxt_string("var a, f = a = function(a) { a *= 2; return a }; f(10)"),
- nxt_string("20") },
-
- { nxt_string("var a, f = a = function(a) { a *= 2; return a }; a(10)"),
- nxt_string("20") },
-
- { nxt_string("var f = function b(a) { a *= 2; return a } = 5"),
- nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
-
- { nxt_string("function a() { return { x:2} }; var b = a(); b.x"),
- nxt_string("2") },
-
- { nxt_string("var a = {}; function f(a) { return a + 1 } a.b = f(2); a.b"),
- nxt_string("3") },
-
- { nxt_string("(function(x) { return x + 1 })(2)"),
- nxt_string("3") },
-
- { nxt_string("(function(x) { return x + 1 }(2))"),
- nxt_string("3") },
-
- { nxt_string("var a = function() { return 1 }(); a"),
- nxt_string("1") },
-
- { nxt_string("var a = (function() { return 1 })(); a"),
- nxt_string("1") },
-
- { nxt_string("var a = (function(a) { return a + 1 })(2); a"),
- nxt_string("3") },
-
- { nxt_string("var a = (function(a) { return a + 1 }(2)); a"),
- nxt_string("3") },
-
- { nxt_string("var a = +function(a) { return a + 1 }(2); a"),
- nxt_string("3") },
-
- { nxt_string("var a = -function(a) { return a + 1 }(2); a"),
- nxt_string("-3") },
-
- { nxt_string("var a = !function(a) { return a + 1 }(2); a"),
- nxt_string("false") },
-
- { nxt_string("var a = ~function(a) { return a + 1 }(2); a"),
- nxt_string("-4") },
-
- { nxt_string("var a = void function(a) { return a + 1 }(2); a"),
- nxt_string("undefined") },
-
- { nxt_string("var a = true && function(a) { return a + 1 }(2); a"),
- nxt_string("3") },
-
- { nxt_string("var a; a = 0, function(a) { return a + 1 }(2); a"),
- nxt_string("0") },
-
- { nxt_string("var a = (0, function(a) { return a + 1 }(2)); a"),
- nxt_string("3") },
-
- { nxt_string("var a = 0, function(a) { return a + 1 }(2); a"),
- nxt_string("SyntaxError: Unexpected token \"function\" in 1") },
-
- { nxt_string("var a = (0, function(a) { return a + 1 }(2)); a"),
- nxt_string("3") },
-
- { nxt_string("var a = +function f(a) { return a + 1 }(2);"
- "var b = f(5); a"),
- nxt_string("ReferenceError: \"f\" is not defined in 1") },
-
- { nxt_string("var o = { f: function(a) { return a * 2 } }; o.f(5)"),
- nxt_string("10") },
-
- { nxt_string("var o = {}; o.f = function(a) { return a * 2 }; o.f(5)"),
- nxt_string("10") },
-
- { nxt_string("var o = { x: 1, f: function() { return this.x } }; o.f()"),
- nxt_string("1") },
-
- { nxt_string("var o = { x: 1, f: function(a) { return this.x += a } };"
- "o.f(5) +' '+ o.x"),
- nxt_string("6 6") },
-
- { nxt_string("var f = function(a) { return 3 }; f.call()"),
- nxt_string("3") },
-
- { nxt_string("var f = function(a) { return this }; f.call(5)"),
- nxt_string("5") },
-
- { nxt_string("var f = function(a, b) { return this + a }; f.call(5, 1)"),
- nxt_string("6") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "f.call(5, 1, 2)"),
- nxt_string("8") },
-
- { nxt_string("var f = function(a) { return 3 }; f.apply()"),
- nxt_string("3") },
-
- { nxt_string("var f = function(a) { return this }; f.apply(5)"),
- nxt_string("5") },
-
- { nxt_string("var f = function(a) { return this + a }; f.apply(5, 1)"),
- nxt_string("TypeError: second argument is not an array-like object") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "f.apply(5, [1, 2])"),
- nxt_string("8") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "f.apply(5, [1, 2], 3)"),
- nxt_string("8") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "f.apply(5, {'length':2, '0':1, '1':2})"),
- nxt_string("8") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "f.apply(5, {'length':2, '0':1, '1':2, '2':3})"),
- nxt_string("8") },
-
- { nxt_string("var f = function(a, b, c) { return this + a + b + c};"
- "f.apply(\"a\", {'length':2, '0':1, '1':2, '2':3})"),
- nxt_string("a12undefined") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "f.apply(5, {'length':3, '0':1, '1':2, '2':3})"),
- nxt_string("8") },
-
- { nxt_string("var f = function(a) { return this + a };"
- "f.apply(5, {'nolength':3, '0':1, '1':2})"),
- nxt_string("NaN") },
-
- { nxt_string("var f = function(a) { return this };"
- "f.apply(5, {'nolength':3, '0':1, '1':2})"),
- nxt_string("5") },
-
- { nxt_string("var f = function(a, b, c) { return this + a + b + c };"
- "f.apply(\"a\", {'length':3, '0':1, '1':2})"),
- nxt_string("a12undefined") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "f.apply(\"a\", {'length':2, '0':undefined, '1':null})"),
- nxt_string("aundefinednull") },
-
- { nxt_string("var f = function() { return this };"
- "f.apply(123, {})"),
- nxt_string("123") },
-
- { nxt_string("String.prototype.concat.apply('a', "
- "{length:2, 0:{toString:function() {return 'b'}}, 1:'c'})"),
- nxt_string("abc") },
-
-#if 0
- /* TODO: non-primitive length values are not supported yet. */
- { nxt_string("String.prototype.concat.apply('a',"
- "{length:{valueOf:function() {return 2}}, 0:'b', 1:'c'})"),
- nxt_string("abc") },
-#else
- { nxt_string("String.prototype.concat.apply('a',"
- "{length:{valueOf:function() {return 2}}, 0:'b', 1:'c'})"),
- nxt_string("TypeError: non-primitive length values are not supported") },
-#endif
-
- { nxt_string("var a = function() { return 1 } + ''; a"),
- nxt_string("[object Function]") },
-
- { nxt_string("''.concat.call()"),
- nxt_string("TypeError: \"this\" argument is null or undefined") },
-
- { nxt_string("''.concat.call('a', 'b', 'c')"),
- nxt_string("abc") },
-
- { nxt_string("''.concat.call('a')"),
- nxt_string("a") },
-
- { nxt_string("''.concat.call('a', [ 'b', 'c' ])"),
- nxt_string("ab,c") },
-
- { nxt_string("''.concat.call('a', [ 'b', 'c' ], 'd')"),
- nxt_string("ab,cd") },
-
- { nxt_string("''.concat.apply()"),
- nxt_string("TypeError: \"this\" argument is null or undefined") },
-
- { nxt_string("''.concat.apply('a')"),
- nxt_string("a") },
-
- { nxt_string("''.concat.apply('a', 'b')"),
- nxt_string("TypeError: second argument is not an array-like object") },
-
- { nxt_string("''.concat.apply('a', [ 'b', 'c' ])"),
- nxt_string("abc") },
-
- { nxt_string("''.concat.apply('a', [ 'b', 'c' ], 'd')"),
- nxt_string("abc") },
-
- { nxt_string("[].join.call([1,2,3])"),
- nxt_string("1,2,3") },
-
- { nxt_string("[].join.call([1,2,3], ':')"),
- nxt_string("1:2:3") },
-
- { nxt_string("[].join.call([1,2,3], 55)"),
- nxt_string("1552553") },
-
- { nxt_string("[].join.call()"),
- nxt_string("TypeError: cannot convert undefined to object") },
-
- { nxt_string("[].slice.call()"),
- nxt_string("TypeError: cannot convert undefined to object") },
-
- { nxt_string("function f(a) {} ; var a = f; var b = f; a === b"),
- nxt_string("true") },
-
- { nxt_string("function f() {} ; f.toString()"),
- nxt_string("[object Function]") },
-
- { nxt_string("function f() {}; f"),
- nxt_string("[object Function]") },
-
- { nxt_string("function f() {}; f = f + 1; f"),
- nxt_string("[object Function]1") },
-
- { nxt_string("function a() { return 1 }"
- "function b() { return a }"
- "function c() { return b }"
- "c()()()"),
- nxt_string("1") },
-
-#if 0
- { nxt_string("function f() {}; f += 1; f"),
- nxt_string("[object Function]1") },
-#endif
-
- { nxt_string("function f() {}; function g() { return f }; g()"),
- nxt_string("[object Function]") },
-
- { nxt_string("function f(a) { return this+a }; var a = f; a.call('0', 1)"),
- nxt_string("01") },
-
- { nxt_string("function f(a) { return this+a }; f.call('0', 1)"),
- nxt_string("01") },
-
- { nxt_string("function f(a) { return this+a };"
- "function g(f, a, b) { return f.call(a, b) }; g(f, '0', 1)"),
- nxt_string("01") },
-
- { nxt_string("function f(a) { return this+a };"
- "var o = { g: function (f, a, b) { return f.call(a, b) } };"
- "o.g(f, '0', 1)"),
- nxt_string("01") },
-
- { nxt_string("var concat = ''.concat; concat(1,2,3)"),
- nxt_string("TypeError: \"this\" argument is null or undefined") },
-
- { nxt_string("var concat = ''.concat; concat.call(1,2,3)"),
- nxt_string("123") },
-
- { nxt_string("var concat = ''.concat; concat.yes = 'OK';"
- "concat.call(1,2,3, concat.yes)"),
- nxt_string("123OK") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1'); b('2', '3')"),
- nxt_string("123") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1', '2'); b('3')"),
- nxt_string("123") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1', 2, '3'); b()"),
- nxt_string("123") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1'); b.call('0', '2', '3')"),
- nxt_string("123") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1', '2'); b.call('0', '3')"),
- nxt_string("123") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1', '2', '3'); b.call('0')"),
- nxt_string("123") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1', '2', '3'); b.call()"),
- nxt_string("123") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1'); b.apply('0', ['2', '3'])"),
- nxt_string("123") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1', '2'); b.apply('0', ['3'])"),
- nxt_string("123") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1', '2', '3'); b.apply('0')"),
- nxt_string("123") },
-
- { nxt_string("var f = function(a, b) { return this + a + b };"
- "var b = f.bind('1', '2', '3'); b.apply()"),
- nxt_string("123") },
-
- { nxt_string("function f(a, b) { return this + a + b }"
- "var b = f.bind('1', '2', '3'); b.apply()"),
- nxt_string("123") },
-
- { nxt_string("function f() { var a; return (function() { a = 1; return a; }).bind()() } f()"),
- nxt_string("1") },
-
- { nxt_string("function f() { var a; function baz() { a = 1; return a; } return baz.bind()(); } f()"),
- nxt_string("1") },
-
- { nxt_string("(function(){ var a = 1; return (function() { return a; })})().bind()()"),
- nxt_string("1") },
-
- { nxt_string("function f() { var a = 1; function baz() { return a; } return baz; } f().bind()()"),
- nxt_string("1") },
-
- { nxt_string("function f() { var t = 1; function baz() { return t; } return baz; }"
- "f().bind()();"),
- nxt_string("1") },
-
- { nxt_string("(function(a) { var s = typeof g, q = g; var g = 1; s += typeof g; function g(b) { return a + b }; return q; })(1)(2)"),
- nxt_string("3")},
-
- { nxt_string("(function(a) { var g = f; var f = 1; function f() { return a; } return g; })(42)()"),
- nxt_string("42") },
-
- { nxt_string("function f(a, b) { return a + b }"
- "f(3,4) === f.bind()(3,4)"),
- nxt_string("true") },
-
- { nxt_string("var obj = {prop:'abc'}; "
- "var func = function(x) { "
- " return this === obj && x === 1 && arguments[0] === 1 "
- " && arguments.length === 1 && this.prop === 'abc';"
- "};"
- "Function.prototype.bind.call(func, obj, 1)()"),
- nxt_string("true") },
-
- { nxt_string("function F(a, b) { this.a = a + b }"
- "var o = new F(1, 2);"
- "o.a"),
- nxt_string("3") },
-
- { nxt_string("function F(a, b) { this.a = a + b; return { a: 7 } }"
- "var o = new F(1, 2);"
- "o.a"),
- nxt_string("7") },
-
- { nxt_string("function F(a, b) { return }"
- "F.prototype.constructor === F"),
- nxt_string("true") },
-
- { nxt_string("function F() { return }"
- "F.prototype.ok = 'OK';"
- "var o = new F(); o.ok"),
- nxt_string("OK") },
-
- { nxt_string("function F() { return }"
- "var o = new F();"
- "o.constructor === F"),
- nxt_string("true") },
-
- { nxt_string("function F() { return }"
- "var o = new F();"
- "o.__proto__ === F.prototype"),
- nxt_string("true") },
-
- { nxt_string("var f = { F: function(){} }; var o = new f.F();"
- "o.__proto__ === f.F.prototype"),
- nxt_string("true") },
-
- { nxt_string("function F(){}; typeof F.prototype"),
- nxt_string("object") },
-
- { nxt_string("var F = function (){}; typeof F.prototype"),
- nxt_string("object") },
-
- { nxt_string("new decodeURI('%00')"),
- nxt_string("TypeError: function is not a constructor")},
-
- { nxt_string("new ''.toString"),
- nxt_string("TypeError: function is not a constructor")},
-
- { nxt_string("function F() { return Number }"
- "var o = new (F())(5);"
- "typeof o +' '+ o"),
- nxt_string("object 5") },
-
- { nxt_string("function F() { return Number }"
- "var o = new (F());"
- "typeof o +' '+ o"),
- nxt_string("object 0") },
-
- { nxt_string("var o = new function F() { return Number }()(5);"
- "typeof o +' '+ o"),
- nxt_string("number 5") },
-
- { nxt_string("var o = new (function F() { return Number }())(5);"
- "typeof o +' '+ o"),
- nxt_string("object 5") },
-
- { nxt_string("var o = new (new function F() { return Number }())(5);"
- "typeof o +' '+ o"),
- nxt_string("object 5") },
-
- { nxt_string("var o = new new function F() { return Number }()(5);"
- "typeof o +' '+ o"),
- nxt_string("object 5") },
-
- { nxt_string("var b; function F(x) { return {a:x} }"
- "function G(y) { b = y; return F }"
- "var o = new G(3)(5);"
- "b + ' ' + o.a"),
- nxt_string("3 5") },
-
- { nxt_string("var b; function F(x) { return {a:x} }"
- "function G(y) { b = y; return F }"
- "var o = new (new G(3))(5);"
- "b + ' ' + o.a"),
- nxt_string("3 5") },
-
- { nxt_string("var b; function F(x) { return {a:x} }"
- "function G(y) { b = y; return F }"
- "var o = new new G(3)(5);"
- "b + ' ' + o.a"),
- nxt_string("3 5") },
-
- { nxt_string("var b; function F(x) { return {a:x} }"
- "var g = { G: function (y) { b = y; return F } };"
- "var o = new new g.G(3)(5);"
- "b + ' ' + o.a"),
- nxt_string("3 5") },
-
- { nxt_string("function a() { return function(x) { return x + 1 } }"
- "var b = a(); b(2)"),
- nxt_string("3") },
-
- /* arguments object. */
-
- { nxt_string("arguments"),
- nxt_string("SyntaxError: \"arguments\" object in global scope in 1") },
-
- { nxt_string("{arguments}"),
- nxt_string("SyntaxError: \"arguments\" object in global scope in 1") },
-
- { nxt_string("var arguments"),
- nxt_string("SyntaxError: Identifier \"arguments\" is forbidden in var declaration in 1") },
-
- { nxt_string("for (var arguments in []) {}"),
- nxt_string("SyntaxError: Identifier \"arguments\" is forbidden in var declaration in 1") },
-
- { nxt_string("function arguments(){}"),
- nxt_string("SyntaxError: Identifier \"arguments\" is forbidden in function declaration in 1") },
-
- { nxt_string("(function () {arguments = [];})"),
- nxt_string("SyntaxError: Identifier \"arguments\" is forbidden as left-hand in assignment in 1") },
-
- { nxt_string("(function(){return arguments[0];})(1,2,3)"),
- nxt_string("1") },
-
- { nxt_string("(function(){return arguments[2];})(1,2,3)"),
- nxt_string("3") },
-
- { nxt_string("(function(){return arguments[3];})(1,2,3)"),
- nxt_string("undefined") },
-
- { nxt_string("(function(a,b,c){return a;})(1,2,3)"),
- nxt_string("1") },
-
- { nxt_string("(function(a,b,c){arguments[0] = 4; return a;})(1,2,3)"),
- nxt_string("1") },
-
- { nxt_string("(function(a,b,c){a = 4; return arguments[0];})(1,2,3)"),
- nxt_string("1") },
-
- { nxt_string("function check(v) {if (v == false) {throw TypeError('Too few arguments')}}; "
- "function f() {check(arguments.length > 1); return 1}; f()"),
- nxt_string("TypeError: Too few arguments") },
-
- { nxt_string("function check(v) {if (v == false) {throw TypeError('Too few arguments')}}; "
- "function f() {check(arguments.length > 1); return 1}; f(1,2)"),
- nxt_string("1") },
-
- { nxt_string("(function(a,b){delete arguments[0]; return arguments[0]})(1,1)"),
- nxt_string("undefined") },
-
- { nxt_string("(function(){return arguments.length;})()"),
- nxt_string("0") },
-
- { nxt_string("(function(){return arguments.length;})(1,2,3)"),
- nxt_string("3") },
-
- { nxt_string("(function(){arguments.length = 1; return arguments.length;})(1,2,3)"),
- nxt_string("1") },
-
- { nxt_string("(function(){return arguments[3];}).bind(null, 0)('a','b','c')"),
- nxt_string("c") },
-
- { nxt_string("(function(){return arguments.callee;})()"),
- nxt_string("TypeError: \"caller\", \"callee\" properties may not be accessed") },
-
- { nxt_string("(function(){return arguments.caller;})()"),
- nxt_string("TypeError: \"caller\", \"callee\" properties may not be accessed") },
-
- { nxt_string("function sum() { var args = Array.prototype.slice.call(arguments); "
- "return args.reduce(function(prev, curr) {return prev + curr})};"
- "[sum(1), sum(1,2), sum(1,2,3), sum(1,2,3,4)]"),
- nxt_string("1,3,6,10") },
-
- { nxt_string("function concat(sep) { var args = Array.prototype.slice.call(arguments, 1); "
- "return args.join(sep)};"
- "[concat('.',1,2,3), concat('+',1,2,3,4)]"),
- nxt_string("1.2.3,1+2+3+4") },
-
- /* rest parameters. */
-
- { nxt_string("function myFoo(a,b,...other) { return other };"
- "myFoo(1,2,3,4,5);" ),
- nxt_string("3,4,5") },
-
- { nxt_string("function myFoo(a,b,...other, c) { return other };"),
- nxt_string("SyntaxError: Unexpected token \"c\" in 1") },
-
- { nxt_string("function sum(a, b, c, ...other) { return a+b+c+other[2] };"
- "sum(\"one \",2,\" three \",\"four \",\"five \",\"the long enough sixth argument \");"),
- nxt_string("one 2 three the long enough sixth argument ") },
-
- { nxt_string("function myFoo1(a,...other) { return other };"
- "function myFoo2(a,b,...other) { return other };"
- "myFoo1(1,2,3,4,5,myFoo2(1,2,3,4));"),
- nxt_string("2,3,4,5,3,4") },
-
- { nxt_string("function myFoo(...other) { return (other instanceof Array) };"
- "myFoo(1);" ),
- nxt_string("true") },
-
- { nxt_string("function myFoo(a,...other) { return other.length };"
- "myFoo(1,2,3,4,5);" ),
- nxt_string("4") },
-
- { nxt_string("function myFoo(a,b,...other) { return other };"
- "myFoo(1,2);" ),
- nxt_string("") },
-
- /* arrow functions. */
-
- { nxt_string("()"),
- nxt_string("SyntaxError: Unexpected token \")\" in 1") },
-
- { nxt_string("() => "),
- nxt_string("SyntaxError: Unexpected end of input in 1") },
-
- { nxt_string("() => {"),
- nxt_string("SyntaxError: Unexpected end of input in 1") },
-
- { nxt_string("a\n => 1"),
- nxt_string("SyntaxError: Unexpected token \"=>\" in 2") },
-
- { nxt_string("new (()=>1)"),
- nxt_string("TypeError: function is not a constructor")},
-
- { nxt_string("(\n) => {}"),
- nxt_string("[object Function]") },
-
- { nxt_string("a => 1"),
- nxt_string("[object Function]") },
-
- { nxt_string("({f:()=>1, g:()=>2}).f()"),
- nxt_string("1") },
-
- { nxt_string("var f = f => {return 1;}; f()"),
- nxt_string("1") },
-
- { nxt_string("var f = (f) => {return 1;}; f()"),
- nxt_string("1") },
-
- { nxt_string("var f = (f, a, b) => {return 1;}; f()"),
- nxt_string("1") },
-
- { nxt_string("var f = () => {return 1;}; f()"),
- nxt_string("1") },
-
- { nxt_string("(f => {return 1;})()"),
- nxt_string("1") },
-
- { nxt_string("((f) => {return 1;})()"),
- nxt_string("1") },
-
- { nxt_string("(((f) => {return 1;}))()"),
- nxt_string("1") },
-
- { nxt_string("var f = f => 1; f()"),
- nxt_string("1") },
-
- { nxt_string("() => 1"),
- nxt_string("[object Function]") },
-
- { nxt_string("var f = ()=>{}; f()"),
- nxt_string("undefined") },
-
- { nxt_string("var f = ()=>({}); f()"),
- nxt_string("[object Object]") },
-
- { nxt_string("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
- "materials.map(material => { return material.length; });"),
- nxt_string("8,6,7,9") },
-
- { nxt_string("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
- "materials.map(material => material.length);"),
- nxt_string("8,6,7,9") },
-
- { nxt_string("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
- "materials.map(material => { material.length });"),
- nxt_string(",,,") },
-
- { nxt_string("function f(a, b, c) {a = 1; return () => { return arguments[1]; };};"
- "f(1, 2, 3)('a', 'b');"),
- nxt_string("2") },
-
- { nxt_string("var f = (...c) => { return (function() { return arguments.length; }).bind(null, c); };"
- "var x = f(1,'a',false, {}); x()"),
- nxt_string("1") },
-
- { nxt_string("var f = (...c) => { return (function() { return arguments.length; }).bind(null, c); };"
- "var x = f(1,'a',false, {}); x(1,2,3)"),
- nxt_string("4") },
-
- { nxt_string("function Car(){ this.age = 0; (() => { this.age++;})();}"
- "(new Car()).age"),
- nxt_string("1") },
-
- { nxt_string("function Car(){ this.age = 0; (function(){ this.age++;})();}"
- "(new Car()).age"),
- nxt_string("TypeError: cannot get property \"age\" of undefined") },
-
- /* arrow functions + global this. */
-
- { nxt_string("(() => this)()"),
- nxt_string("[object Object]") },
-
- { nxt_string("(() => this).call('abc')"),
- nxt_string("[object Object]") },
-
- { nxt_string("(() => this).apply('abc')"),
- nxt_string("[object Object]") },
-
- { nxt_string("(() => this).bind('abc')()"),
- nxt_string("[object Object]") },
-
- { nxt_string("(function() { return (() => this); })()()"),
- nxt_string("undefined") },
-
- { nxt_string("(function() { return (() => this); }).call('abc')()"),
- nxt_string("abc") },
-
- { nxt_string("(function() { return (() => this); }).bind('abc')()()"),
- nxt_string("abc") },
-
- { nxt_string("(function() { return (() => this); })"
- ".call('abc').call('bca')"),
- nxt_string("abc") },
-
- { nxt_string("(function() { return (() => this); })"
- ".call('abc').bind('bca')()"),
- nxt_string("abc") },
-
- { nxt_string("(function() { return function() { return () => this; }; })"
- ".call('bca').call('abc')()"),
- nxt_string("abc") },
-
- { nxt_string("var f = () => 1; f.prototype"),
- nxt_string("undefined") },
-
- { nxt_string("var f = (a,b) => 0; f.length"),
- nxt_string("2") },
-
- { nxt_string("var o = Object.create(f => 1); o.length = 3"),
- nxt_string("TypeError: Cannot assign to read-only property \"length\" of object") },
-
- /* Scopes. */
-
- { nxt_string("function f(x) { a = x } var a; f(5); a"),
- nxt_string("5") },
-
- { nxt_string("function f(x) { var a = x } var a = 2; f(5); a"),
- nxt_string("2") },
-
- { nxt_string("function f(a) { return a } var a = '2'; a + f(5)"),
- nxt_string("25") },
-
- { nxt_string("for (var i = 0; i < 5; i++); i"),
- nxt_string("5") },
-
- { nxt_string("for (var i = 0, j; i < 5; i++); j"),
- nxt_string("undefined") },
-
- { nxt_string("for (var i = 0, j, k = 3; i < 5; i++); k"),
- nxt_string("3") },
-
- { nxt_string("var o = { a: 1, b: 2, c: 3 }, s = ''; "
- "for (var i in o) { s += i }; s"),
- nxt_string("abc") },
-
- { nxt_string("var o = { a: 1, b: 2, c: 3 }; for (var i in o); i"),
- nxt_string("c") },
-
- { nxt_string("var o = {}; i = 7; for (var i in o); i"),
- nxt_string("7") },
-
- { nxt_string("var a = [1,2,3]; for (var i in a); i"),
- nxt_string("2") },
-
- /* RegExp. */
-
- { nxt_string("/./x"),
- nxt_string("SyntaxError: Invalid RegExp flags \"x\" in 1") },
-
- { nxt_string("/"),
- nxt_string("SyntaxError: Unterminated RegExp \"/\" in 1") },
-
- { nxt_string("/a\n/"),
- nxt_string("SyntaxError: Unterminated RegExp \"/a\" in 1") },
-
- { nxt_string("/a\r/"),
- nxt_string("SyntaxError: Unterminated RegExp \"/a\" in 1") },
-
- { nxt_string("/a\\q/"),
- nxt_string("/a\\q/") },
-
- { nxt_string("/\\\\/"),
- nxt_string("/\\\\/") },
-
- { nxt_string("/\\\\\\/"),
- nxt_string("SyntaxError: Unterminated RegExp \"/\\\\\\/\" in 1") },
-
- { nxt_string("/\\\\\\\\/"),
- nxt_string("/\\\\\\\\/") },
-
- { nxt_string("/\\\\\\//"),
- nxt_string("/\\\\\\//") },
-
- { nxt_string("/[A-Z/]/"),
- nxt_string("/[A-Z/]/") },
-
- { nxt_string("/[A-Z\n]/"),
- nxt_string("SyntaxError: Unterminated RegExp \"/[A-Z\" in 1") },
-
- { nxt_string("/[A-Z\\\n]/"),
- nxt_string("SyntaxError: Unterminated RegExp \"/[A-Z\\\" in 1") },
-
- { nxt_string("/\\\n/"),
- nxt_string("SyntaxError: Unterminated RegExp \"/\\\" in 1") },
-
- { nxt_string("/^[A-Za-z0-9+/]{4}$/.test('////')"),
- nxt_string("true") },
-
- { nxt_string("'[]!\"#$%&\\'()*+,.\\/:;<=>?@\\^_`{|}-'.split('')"
- ".every(ch=>/[\\]\\[!\"#$%&'()*+,.\\/:;<=>?@\\^_`{|}-]/.test(ch))"),
- nxt_string("true") },
-
- { nxt_string("/a\\q/.test('a\\q')"),
- nxt_string("true") },
-
- { nxt_string("/(\\.(?!com|org)|\\/)/.test('ah.info')"),
- nxt_string("true") },
-
- { nxt_string("/(/.test('')"),
- nxt_string("SyntaxError: pcre_compile(\"(\") failed: missing ) in 1") },
-
- { nxt_string("/+/.test('')"),
- nxt_string("SyntaxError: pcre_compile(\"+\") failed: nothing to repeat at \"+\" in 1") },
-
- { nxt_string("/^$/.test('')"),
- nxt_string("true") },
-
- { nxt_string("var a = /\\d/; a.test('123')"),
- nxt_string("true") },
-
- { nxt_string("var a = /\\d/; a.test('abc')"),
- nxt_string("false") },
-
- { nxt_string("/\\d/.test('123')"),
- nxt_string("true") },
-
- { nxt_string("/\\d/.test(123)"),
- nxt_string("true") },
-
- { nxt_string("/undef/.test()"),
- nxt_string("true") },
-
- { nxt_string("var s = { toString: function() { return 123 } };"
- "/\\d/.test(s)"),
- nxt_string("true") },
-
- { nxt_string("/\\d/.test('abc')"),
- nxt_string("false") },
-
- { nxt_string("/abc/i.test('ABC')"),
- nxt_string("true") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* FIXME */
- { nxt_string("/абв/i.test('АБВ')"),
- nxt_string("true") },
-#endif
-
- { nxt_string("/\\x80/.test('\\u0080')"),
- nxt_string("true") },
-
- { nxt_string("/\\x80/.test('\\u0080'.toBytes())"),
- nxt_string("true") },
-
- { nxt_string("/α/.test('\\u03B1')"),
- nxt_string("true") },
-
- { nxt_string("/α/.test('\\u00CE\\u00B1'.toBytes())"),
- nxt_string("true") },
-
- { nxt_string("/\\d/.exec('123')"),
- nxt_string("1") },
-
- { nxt_string("/\\d/.exec(123)"),
- nxt_string("1") },
-
- { nxt_string("/undef/.exec()"),
- nxt_string("undef") },
-
- { nxt_string("var s = { toString: function() { return 123 } };"
- "/\\d/.exec(s)"),
- nxt_string("1") },
-
- { nxt_string("var a = /^$/.exec(''); a.length +' '+ a"),
- nxt_string("1 ") },
-
- { nxt_string("var r = /3/g; r.exec('123') +' '+ r.exec('3')"),
- nxt_string("3 null") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* FIXME */
- { nxt_string("var r = /бв/ig;"
- "var a = r.exec('АБВ');"
- "r.lastIndex +' '+ a +' '+ "
- "r.source +' '+ r.source.length +' '+ r"),
- nxt_string("3 БВ бв 2 /бв/gi") },
-#endif
-
- { nxt_string("var r = /\\x80/g; r.exec('\\u0081\\u0080'.toBytes());"
- "r.lastIndex +' '+ r.source +' '+ r.source.length +' '+ r"),
- nxt_string("1 \\x80 4 /\\x80/g") },
-
- /*
- * It seems that "/стоп/ig" fails on early PCRE versions.
- * It fails at least in 8.1 and works at least in 8.31.
- */
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* FIXME */
- { nxt_string("var r = /Стоп/ig;"
- "var a = r.exec('АБВДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯСТОП');"
- "r.lastIndex +' '+ a +' '+ r.source +' '+ r"),
- nxt_string("35 СТОП Стоп /Стоп/gi") },
-#endif
-
- { nxt_string("var r = /quick\\s(brown).+?(jumps)/ig;"
- "var a = r.exec('The Quick Brown Fox Jumps Over The Lazy Dog');"
- "a[0] +' '+ a[1] +' '+ a[2] +' '+ a[3] +' '+ "
- "a.index +' '+ r.lastIndex +' '+ a.input"),
- nxt_string("Quick Brown Fox Jumps Brown Jumps undefined "
- "4 25 The Quick Brown Fox Jumps Over The Lazy Dog") },
-
- { nxt_string("var r = /a/.exec('a'); ['groups' in r, typeof r.groups]"),
- nxt_string("true,undefined") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* PCRE bug in groups code */
- { nxt_string("var r = /(?<m>[0-9]{2})\\/(?<d>[0-9]{2})\\/(?<y>[0-9]{4})/;"
- "var g = r.exec('12/31/1986').groups;"
- "g.d + '.' + g.m + '.' + g.y"),
- nxt_string("31.12.1986") },
-
- { nxt_string("var g = /(?<r>(?<no>no)?(?<yes>yes)?)/.exec('yes').groups;"
- "[Object.keys(g).length,'no' in g, typeof g.no, g.yes, g.r]"),
- nxt_string("3,true,undefined,yes,yes") },
-#endif
-
- { nxt_string("var s; var r = /./g; while (s = r.exec('abc')); s"),
- nxt_string("null") },
-
- { nxt_string("var r = /LS/i.exec(false); r[0]"),
- nxt_string("ls") },
-
- { nxt_string("var r = (/^.+$/mg), s = 'ab\\nc'; [r.exec(s), r.exec(s)]"),
- nxt_string("ab,c") },
-
- { nxt_string("var r = (/^.+$/mg); [r.global, r.multiline, r.ignoreCase]"),
- nxt_string("true,true,false") },
-
- { nxt_string("var r = /./; r"),
- nxt_string("/./") },
-
- { nxt_string("var r = new RegExp(); r"),
- nxt_string("/(?:)/") },
-
- { nxt_string("var r = new RegExp('.'); r"),
- nxt_string("/./") },
-
- { nxt_string("var r = new RegExp('.', 'ig'); r"),
- nxt_string("/./gi") },
-
- { nxt_string("var r = new RegExp('abc'); r.test('00abc11')"),
- nxt_string("true") },
-
- { nxt_string("var r = new RegExp('abc', 'i'); r.test('00ABC11')"),
- nxt_string("true") },
-
- { nxt_string("RegExp('α'.repeat(33)).toString()[32]"),
- nxt_string("α") },
-
- { nxt_string("new RegExp('', 'x')"),
- nxt_string("SyntaxError: Invalid RegExp flags \"x\"") },
-
- { nxt_string("RegExp({})"),
- nxt_string("/[object Object]/") },
-
- { nxt_string("RegExp(true)"),
- nxt_string("/true/") },
-
- { nxt_string("RegExp(undefined)"),
- nxt_string("/(?:)/") },
-
- { nxt_string("RegExp('abc', undefined)"),
- nxt_string("/abc/") },
-
- { nxt_string("RegExp('abc', {})"),
- nxt_string("SyntaxError: Invalid RegExp flags \"[object Object]\"") },
-
- { nxt_string("RegExp(/expr/)"),
- nxt_string("/expr/") },
-
- { nxt_string("RegExp(/expr/i).ignoreCase"),
- nxt_string("true") },
-
- { nxt_string("RegExp(/expr/, 'x')"),
- nxt_string("SyntaxError: Invalid RegExp flags \"x\"") },
-
- { nxt_string("RegExp(new RegExp('expr'))"),
- nxt_string("/expr/") },
-
- { nxt_string("RegExp(new RegExp('expr')).multiline"),
- nxt_string("false") },
-
- { nxt_string("RegExp(new RegExp('expr'), 'm').multiline"),
- nxt_string("true") },
-
- { nxt_string("new RegExp('[')"),
- nxt_string("SyntaxError: pcre_compile(\"[\") failed: missing terminating ] for character class") },
-
- { nxt_string("new RegExp('\\\\')"),
- nxt_string("SyntaxError: pcre_compile(\"\\\") failed: \\ at end of pattern") },
-
- { nxt_string("[0].map(RegExp().toString)"),
- nxt_string("TypeError: \"this\" argument is not a regexp") },
-
- /* Non-standard ECMA-262 features. */
-
- /* 0x10400 is not a surrogate pair of 0xD801 and 0xDC00. */
-
- { nxt_string("var chars = '𐐀'; chars.length +' '+ chars.charCodeAt(0)"),
- nxt_string("1 66560") },
-
- /* es5id: 6.1, 0x104A0 is not a surrogate pair of 0xD801 and 0xDCA0. */
-
- { nxt_string("var chars = '𐒠'; chars.length +' '+ chars.charCodeAt(0)"),
- nxt_string("1 66720") },
-
- /* Error object. */
-
- { nxt_string("Error()"),
- nxt_string("Error") },
-
- { nxt_string("new Error()"),
- nxt_string("Error") },
-
- { nxt_string("Error('e')"),
- nxt_string("Error: e") },
-
- { nxt_string("var e = Error('e'); e.name = 'E'; e"),
- nxt_string("E: e") },
-
- { nxt_string("var e = Error('e'); e.name = ''; e"),
- nxt_string("e") },
-
- { nxt_string("var e = Error(); e.name = ''; e"),
- nxt_string("") },
-
- { nxt_string("var e = Error(); e.name = ''; e.message = 'e'; e"),
- nxt_string("e") },
-
- { nxt_string("Error('e').name + ': ' + Error('e').message"),
- nxt_string("Error: e") },
-
- { nxt_string("Error(1)"),
- nxt_string("Error: 1") },
-
- { nxt_string("Error.__proto__ == Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("Error.prototype.name"),
- nxt_string("Error") },
-
- { nxt_string("Error.prototype.message"),
- nxt_string("") },
-
- { nxt_string("Error.prototype.constructor == Error"),
- nxt_string("true") },
-
- { nxt_string("Error.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("Error().__proto__ == Error.prototype"),
- nxt_string("true") },
-
- { nxt_string("Error().__proto__.__proto__ == Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("EvalError('e')"),
- nxt_string("EvalError: e") },
-
- { nxt_string("InternalError('e')"),
- nxt_string("InternalError: e") },
-
- { nxt_string("RangeError('e')"),
- nxt_string("RangeError: e") },
-
- { nxt_string("ReferenceError('e')"),
- nxt_string("ReferenceError: e") },
-
- { nxt_string("SyntaxError('e')"),
- nxt_string("SyntaxError: e") },
-
- { nxt_string("TypeError('e')"),
- nxt_string("TypeError: e") },
-
- { nxt_string("URIError('e')"),
- nxt_string("URIError: e") },
-
- { nxt_string("MemoryError('e')"),
- nxt_string("MemoryError") },
-
- { nxt_string("EvalError('e').name + ': ' + EvalError('e').message"),
- nxt_string("EvalError: e") },
-
- { nxt_string("InternalError('e').name + ': ' + InternalError('e').message"),
- nxt_string("InternalError: e") },
-
- { nxt_string("RangeError('e').name + ': ' + RangeError('e').message"),
- nxt_string("RangeError: e") },
-
- { nxt_string("ReferenceError('e').name + ': ' + ReferenceError('e').message"),
- nxt_string("ReferenceError: e") },
-
- { nxt_string("SyntaxError('e').name + ': ' + SyntaxError('e').message"),
- nxt_string("SyntaxError: e") },
-
- { nxt_string("TypeError('e').name + ': ' + TypeError('e').message"),
- nxt_string("TypeError: e") },
-
- { nxt_string("URIError('e').name + ': ' + URIError('e').message"),
- nxt_string("URIError: e") },
-
- { nxt_string("var e = EvalError('e'); e.name = 'E'; e"),
- nxt_string("E: e") },
-
- { nxt_string("var e = InternalError('e'); e.name = 'E'; e"),
- nxt_string("E: e") },
-
- { nxt_string("var e = RangeError('e'); e.name = 'E'; e"),
- nxt_string("E: e") },
-
- { nxt_string("var e = ReferenceError('e'); e.name = 'E'; e"),
- nxt_string("E: e") },
-
- { nxt_string("var e = SyntaxError('e'); e.name = 'E'; e"),
- nxt_string("E: e") },
-
- { nxt_string("var e = TypeError('e'); e.name = 'E'; e"),
- nxt_string("E: e") },
-
- { nxt_string("var e = URIError('e'); e.name = 'E'; e"),
- nxt_string("E: e") },
-
- /* Memory object is immutable. */
-
- { nxt_string("var e = MemoryError('e'); e.name = 'E'"),
- nxt_string("TypeError: Cannot add property \"name\", object is not extensible") },
-
- { nxt_string("EvalError.prototype.name"),
- nxt_string("EvalError") },
-
- { nxt_string("InternalError.prototype.name"),
- nxt_string("InternalError") },
-
- { nxt_string("RangeError.prototype.name"),
- nxt_string("RangeError") },
-
- { nxt_string("ReferenceError.prototype.name"),
- nxt_string("ReferenceError") },
-
- { nxt_string("SyntaxError.prototype.name"),
- nxt_string("SyntaxError") },
-
- { nxt_string("TypeError.prototype.name"),
- nxt_string("TypeError") },
-
- { nxt_string("URIError.prototype.name"),
- nxt_string("URIError") },
-
- { nxt_string("MemoryError.prototype.name"),
- nxt_string("InternalError") },
-
- { nxt_string("EvalError.prototype.message"),
- nxt_string("") },
-
- { nxt_string("InternalError.prototype.message"),
- nxt_string("") },
-
- { nxt_string("RangeError.prototype.message"),
- nxt_string("") },
-
- { nxt_string("ReferenceError.prototype.message"),
- nxt_string("") },
-
- { nxt_string("SyntaxError.prototype.message"),
- nxt_string("") },
-
- { nxt_string("TypeError.prototype.message"),
- nxt_string("") },
-
- { nxt_string("URIError.prototype.message"),
- nxt_string("") },
-
- { nxt_string("MemoryError.prototype.message"),
- nxt_string("") },
-
- { nxt_string("EvalError.prototype.constructor == EvalError"),
- nxt_string("true") },
-
- { nxt_string("RangeError.prototype.constructor == RangeError"),
- nxt_string("true") },
-
- { nxt_string("ReferenceError.prototype.constructor == ReferenceError"),
- nxt_string("true") },
-
- { nxt_string("SyntaxError.prototype.constructor == SyntaxError"),
- nxt_string("true") },
-
- { nxt_string("TypeError.prototype.constructor == TypeError"),
- nxt_string("true") },
-
- { nxt_string("URIError.prototype.constructor == URIError"),
- nxt_string("true") },
-
- { nxt_string("EvalError.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("RangeError.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("ReferenceError.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("SyntaxError.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("TypeError.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("URIError.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("EvalError().__proto__ == EvalError.prototype"),
- nxt_string("true") },
-
- { nxt_string("RangeError().__proto__ == RangeError.prototype"),
- nxt_string("true") },
-
- { nxt_string("ReferenceError().__proto__ == ReferenceError.prototype"),
- nxt_string("true") },
-
- { nxt_string("SyntaxError().__proto__ == SyntaxError.prototype"),
- nxt_string("true") },
-
- { nxt_string("TypeError().__proto__ == TypeError.prototype"),
- nxt_string("true") },
-
- { nxt_string("URIError().__proto__ == URIError.prototype"),
- nxt_string("true") },
-
- { nxt_string("EvalError().__proto__.__proto__ == Error.prototype"),
- nxt_string("true") },
-
- { nxt_string("RangeError().__proto__.__proto__ == Error.prototype"),
- nxt_string("true") },
-
- { nxt_string("ReferenceError().__proto__.__proto__ == Error.prototype"),
- nxt_string("true") },
-
- { nxt_string("SyntaxError().__proto__.__proto__ == Error.prototype"),
- nxt_string("true") },
-
- { nxt_string("TypeError().__proto__.__proto__ == Error.prototype"),
- nxt_string("true") },
-
- { nxt_string("URIError().__proto__.__proto__ == Error.prototype"),
- nxt_string("true") },
-
- { nxt_string("MemoryError().__proto__ == MemoryError.prototype"),
- nxt_string("true") },
-
- { nxt_string("MemoryError().__proto__.__proto__ == Error.prototype"),
- nxt_string("true") },
-
- { nxt_string("typeof Error()"),
- nxt_string("object") },
-
- { nxt_string("typeof EvalError()"),
- nxt_string("object") },
-
- { nxt_string("typeof InternalError()"),
- nxt_string("object") },
-
- { nxt_string("typeof RangeError()"),
- nxt_string("object") },
-
- { nxt_string("typeof ReferenceError()"),
- nxt_string("object") },
-
- { nxt_string("typeof SyntaxError()"),
- nxt_string("object") },
-
- { nxt_string("typeof TypeError()"),
- nxt_string("object") },
-
- { nxt_string("typeof URIError()"),
- nxt_string("object") },
-
- { nxt_string("typeof MemoryError()"),
- nxt_string("object") },
-
- /* Exceptions. */
-
- { nxt_string("throw null"),
- nxt_string("null") },
-
- { nxt_string("var a; try { throw null } catch (e) { a = e } a"),
- nxt_string("null") },
-
- { nxt_string("var a; try { throw Error('e') } catch (e) { a = e.message } a"),
- nxt_string("e") },
-
- { nxt_string("var a; try { NaN.toString(NaN) } catch (e) { a = e.name } a"),
- nxt_string("RangeError") },
-
- { nxt_string("try { throw null } catch (e) { throw e }"),
- nxt_string("null") },
-
- { nxt_string("try { throw Error('e') } catch (e) { throw Error(e.message + '2') }"),
- nxt_string("Error: e2") },
-
- { nxt_string("try { throw null } catch (null) { throw e }"),
- nxt_string("SyntaxError: Unexpected token \"null\" in 1") },
-
- { nxt_string("'a'.f()"),
- nxt_string("TypeError: (intermediate value)[\"f\"] is not a function") },
-
- { nxt_string("1..f()"),
- nxt_string("TypeError: (intermediate value)[\"f\"] is not a function") },
-
- { nxt_string("try {}"),
- nxt_string("SyntaxError: Missing catch or finally after try in 1") },
-
- { nxt_string("try{}catch(a[]"),
- nxt_string("SyntaxError: Unexpected token \"[\" in 1") },
-
- { nxt_string("function f(a) {return a;}; "
- "function thrower() {throw TypeError('Oops')}; "
- "f(thrower())"),
- nxt_string("TypeError: Oops") },
-
- { nxt_string("var a = 0; try { a = 5 }"
- "catch (e) { a = 9 } finally { a++ } a"),
- nxt_string("6") },
-
- { nxt_string("var a = 0; try { throw 3 }"
- "catch (e) { a = e } finally { a++ } a"),
- nxt_string("4") },
-
- { nxt_string("var a = 0; try { throw 3 }"
- "catch (e) { throw e + 1 } finally { a++ }"),
- nxt_string("4") },
-
- { nxt_string("var a = 0; try { throw 3 }"
- "catch (e) { a = e } finally { throw a }"),
- nxt_string("3") },
-
- { nxt_string("try { throw null } catch (e) { } finally { }"),
- nxt_string("undefined") },
-
- { nxt_string("var a = 0; try { throw 3 }"
- "catch (e) { throw 4 } finally { throw a }"),
- nxt_string("0") },
-
- { nxt_string("var a = 0; try { a = 5 } finally { a++ } a"),
- nxt_string("6") },
-
- { nxt_string("var a = 0; try { throw 5 } finally { a++ }"),
- nxt_string("5") },
-
- { nxt_string("var a = 0; try { a = 5 } finally { throw 7 }"),
- nxt_string("7") },
-
- { nxt_string("function f(a) {"
- " if (a > 1) return f(a - 1);"
- " throw 9; return a }"
- "var a = 0; try { a = f(5); a++ } catch(e) { a = e } a"),
- nxt_string("9") },
-
- { nxt_string("var a; try { try { throw 5 } catch (e) { a = e } throw 3 }"
- " catch(x) { a += x } a"),
- nxt_string("8") },
-
- { nxt_string("throw\nnull"),
- nxt_string("SyntaxError: Illegal newline after throw in 2") },
-
- { nxt_string("for (var x in [1,2]) { try{ continue; } catch(e) {} } throw 1"),
- nxt_string("1") },
-
- { nxt_string("for (var x in [1,2]) { try{ break; } catch(e) {} } throw 1"),
- nxt_string("1") },
-
- { nxt_string("try\n {\n continue; } catch(e) {}"),
- nxt_string("SyntaxError: Illegal continue statement in 3") },
-
- { nxt_string("var a = 1; "
- "switch (a) {"
- "default:"
- " try\n {\n continue; } "
- " catch(e) {}"
- "}"),
- nxt_string("SyntaxError: Illegal continue statement in 3") },
-
- { nxt_string("try\n {\n break; } catch(e) {}"),
- nxt_string("SyntaxError: Illegal break statement in 3") },
-
- { nxt_string("try\n { }\n catch(e) {continue;}"),
- nxt_string("SyntaxError: Illegal continue statement in 3") },
-
- { nxt_string("try { } catch(e) {break;}"),
- nxt_string("SyntaxError: Illegal break statement in 1") },
-
- { nxt_string("try { continue; } finally {}"),
- nxt_string("SyntaxError: Illegal continue statement in 1") },
-
- { nxt_string("try { break; } finally {}"),
- nxt_string("SyntaxError: Illegal break statement in 1") },
-
- { nxt_string("try\n {\n try\n {\n continue; } finally {} } finally {}"),
- nxt_string("SyntaxError: Illegal continue statement in 5") },
-
- /* break from try in try/catch. */
-
- { nxt_string("function f(n) {"
- " var pre = 0; var post = 0;"
- " for (var x in [1, 2, 3]) {"
- " pre++;"
- " try { "
- " if (n == 'b') {break;}"
- " }"
- " catch (e) {};"
- " post++"
- " }"
- " return [pre, post];"
- "}; njs.dump([f(),f('b')])"),
- nxt_string("[[3,3],"
- "[1,0]]") },
-
- { nxt_string("function f(v, n) {"
- " var pre = 0; var post = 0; var case2 = 0;"
- " switch (v) {"
- " case 1: "
- " pre++;"
- " try { "
- " if (n == 'b') {break;}"
- " }"
- " catch (e) {};"
- " post++;"
- " break;"
- " default:"
- " case2++;"
- " }"
- " return [pre, post, case2];"
- "}; njs.dump([f(),f(1)])"),
- nxt_string("[[0,0,1],"
- "[1,1,0]]") },
-
- /* continue from try in try/catch. */
-
- { nxt_string("function f(n) {"
- " var pre = 0; var post = 0;"
- " for (var x in [1, 2, 3]) {"
- " pre++;"
- " try { "
- " if (n == 'c') {continue;}"
- " }"
- " catch (e) {};"
- " post++"
- " }"
- " return [pre, post];"
- "}; njs.dump([f(),f('c')])"),
- nxt_string("[[3,3],"
- "[3,0]]") },
-
- /* Multiple break/continue from try in try/catch. */
-
- { nxt_string("function f(n) {"
- " var pre = 0; var mid = 0; var post = 0;"
- " for (var x in [1, 2, 3]) {"
- " pre++;"
- " try { "
- " if (n == 'c') {continue;}"
- " if (n == 'b') {break;}"
- " mid++;"
- " if (n == 'c2') {continue;}"
- " if (n == 'b2') {break;}"
- " }"
- " catch (e) {};"
- " post++"
- " }"
- " return [pre, mid, post];"
- "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
- nxt_string("[[3,3,3],"
- "[3,0,0],"
- "[1,0,0],"
- "[3,3,0],"
- "[1,1,0]]") },
-
- /* Multiple break/continue from catch in try/catch. */
-
- { nxt_string("function f(t, n) {"
- " var pre = 0; var mid = 0; var post = 0;"
- " for (var x in [1, 2, 3]) {"
- " pre++;"
- " try { "
- " if (t) {throw 'a'}"
- " }"
- " catch (e) {"
- " if (n == 'c') {continue;}"
- " if (n == 'b') {break;}"
- " mid++;"
- " if (n == 'c2') {continue;}"
- " if (n == 'b2') {break;}"
- " };"
- " post++"
- " }"
- " return [pre, mid, post];"
- "}; njs.dump([f(), f(1), f(1, 'c'), f(1, 'b'), f(1, 'c2'), f(1, 'b2')])"),
- nxt_string("[[3,0,3],"
- "[3,3,3],"
- "[3,0,0],"
- "[1,0,0],"
- "[3,3,0],"
- "[1,1,0]]") },
-
- /* break from try in try/finally. */
-
- { nxt_string("function f(n) {"
- " var pre = 0; var mid = 0; var fin = 0; var post = 0;"
- " for (var x in [1, 2, 3]) {"
- " pre++;"
- " try { "
- " if (n == 'c') {continue;}"
- " if (n == 'b') {break;}"
- " mid++;"
- " if (n == 'c2') {continue;}"
- " if (n == 'b2') {break;}"
- " }"
- " finally {fin++};"
- " post++"
- " }"
- " return [pre, mid, fin, post];"
- "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
- nxt_string("[[3,3,3,3],"
- "[3,0,3,0],"
- "[1,0,1,0],"
- "[3,3,3,0],"
- "[1,1,1,0]]") },
-
- /* Multiple break/continue from try in try/catch/finally. */
-
- { nxt_string("function f(n) {"
- " var pre = 0; var mid = 0; var fin = 0; var post = 0;"
- " for (var x in [1, 2, 3]) {"
- " pre++;"
- " try { "
- " if (n == 'c') {continue;}"
- " if (n == 'b') {break;}"
- " mid++;"
- " if (n == 'c2') {continue;}"
- " if (n == 'b2') {break;}"
- " }"
- " catch (e) {}"
- " finally {fin++};"
- " post++"
- " }"
- " return [pre, mid, fin, post];"
- "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
- nxt_string("[[3,3,3,3],"
- "[3,0,3,0],"
- "[1,0,1,0],"
- "[3,3,3,0],"
- "[1,1,1,0]]") },
-
- /* Multiple break/continue from catch in try/catch/finally. */
-
- { nxt_string("function f(t, n) {"
- " var pre = 0; var mid = 0; var fin = 0; var post = 0;"
- " for (var x in [1, 2, 3]) {"
- " pre++;"
- " try {if (t) {throw 'a'}}"
- " catch (e) { "
- " if (n == 'c') {continue;}"
- " if (n == 'b') {break;}"
- " mid++;"
- " if (n == 'c2') {continue;}"
- " if (n == 'b2') {break;}"
- " }"
- " finally {fin++};"
- " post++"
- " }"
- " return [pre, mid, fin, post];"
- "}; njs.dump([f(), f(1), f(1, 'c'), f(1, 'b'), f(1, 'c2'), f(1, 'b2')])"),
- nxt_string("[[3,0,3,3],"
- "[3,3,3,3],"
- "[3,0,3,0],"
- "[1,0,1,0],"
- "[3,3,3,0],"
- "[1,1,1,0]]") },
-
- /* Multiple return from try. */
-
- { nxt_string("var r = 0; "
- "function f(i, n) {"
- " try { "
- " var a = 'x'; "
- " if (i != 0) {"
- " return a.repeat(n);"
- " } else {"
- " return;"
- " }"
- " }"
- " catch (e) { } "
- " finally { r++; }};"
- "[f(1,1), f(1,2), f(0), r]"),
- nxt_string("x,xx,,3") },
-
- { nxt_string("var r = 0; "
- "function f(i) {"
- " try { "
- " return i;"
- " }"
- " catch (e) { } "
- " finally { r++; }};"
- "[f(true), f(false), r]"),
- nxt_string("true,false,2") },
-
- /* Multiple return from catch. */
-
- { nxt_string("var r = 0; "
- "function f(i, n) {"
- " try { "
- " throw 1;"
- " }"
- " catch (e) { "
- " var a = 'x'; "
- " if (i != 0) {"
- " return a.repeat(n);"
- " } else {"
- " return;"
- " }"
- " } "
- " finally { r++; }};"
- "[f(1,1), f(1,2), f(0), r]"),
- nxt_string("x,xx,,3") },
-
- /* return overrun by finally. */
-
- { nxt_string("function f() {"
- " try { "
- " return 'a';"
- " }"
- " catch (e) { "
- " } "
- " finally { "
- " return 'b'; "
- " }}; "
- "f()"),
- nxt_string("b") },
-
- { nxt_string("(function (f, val) { "
- " try { return f(val); } "
- " finally { return val; }"
- "})(function () {throw 'a'}, 'v')"),
- nxt_string("v") },
-
- { nxt_string("(function() { try { return ['a'];} finally {} } )()"),
- nxt_string("a") },
-
- { nxt_string("function f(){}; try {f((new RegExp('a**')))} catch (e) { }"),
- nxt_string("undefined") },
-
- { nxt_string("function f(){}; try {f(f((new RegExp('a**'))))} catch (e) { }"),
- nxt_string("undefined") },
-
- { nxt_string("function f(){}; (function(){try {f(f((new RegExp('a**'))))} catch (e) { return 1}})()"),
- nxt_string("1") },
-
- { nxt_string("var o = { valueOf: function() { return '3' } }; --o"),
- nxt_string("2") },
-
- { nxt_string("var o = { valueOf: function() { return [3] } }; --o"),
- nxt_string("NaN") },
-
- { nxt_string("var o = { valueOf: function() { return '3' } }; 10 - o"),
- nxt_string("7") },
-
- { nxt_string("var o = { valueOf: function() { return [3] } }; 10 - o"),
- nxt_string("NaN") },
-
- { nxt_string("var o = { toString: function() { return 'OK' } }; 'o:' + o"),
- nxt_string("o:OK") },
-
- { nxt_string("var o = { toString: function() { return [1] } }; o"),
- nxt_string("TypeError: Cannot convert object to primitive value") },
-
- { nxt_string("var o = { toString: function() { return [1] } }; 'o:' + o"),
- nxt_string("TypeError: Cannot convert object to primitive value") },
-
- { nxt_string("var a = { valueOf: function() { return '3' } };"
- "var b = { toString: function() { return 10 - a + 'OK' } };"
- "var c = { toString: function() { return b + 'YES' } };"
- "'c:' + c"),
- nxt_string("c:7OKYES") },
-
- { nxt_string("[1,2,3].valueOf()"),
- nxt_string("1,2,3") },
-
- { nxt_string("var o = { valueOf: function() { return 'OK' } };"
- "o.valueOf()"),
- nxt_string("OK") },
-
- { nxt_string("false.__proto__ === true.__proto__"),
- nxt_string("true") },
-
- { nxt_string("0..__proto__ === 1..__proto__"),
- nxt_string("true") },
-
- { nxt_string("[].__proto__ === [1,2].__proto__"),
- nxt_string("true") },
-
- { nxt_string("/./.__proto__ === /a/.__proto__"),
- nxt_string("true") },
-
- { nxt_string("''.__proto__ === 'abc'.__proto__"),
- nxt_string("true") },
-
- { nxt_string("[].__proto__.join.call([1,2,3], ':')"),
- nxt_string("1:2:3") },
-
- { nxt_string("''.__proto__.concat.call('a', 'b', 'c')"),
- nxt_string("abc") },
-
- { nxt_string("/./.__proto__.test.call(/a{2}/, 'aaa')"),
- nxt_string("true") },
-
- { nxt_string("true instanceof Boolean"),
- nxt_string("false") },
-
- { nxt_string("1 instanceof Number"),
- nxt_string("false") },
-
- { nxt_string("'' instanceof String"),
- nxt_string("false") },
-
- { nxt_string("({}) instanceof Object"),
- nxt_string("true") },
-
- { nxt_string("[] instanceof []"),
- nxt_string("TypeError: right argument is not a function") },
-
- { nxt_string("[] instanceof Array"),
- nxt_string("true") },
-
- { nxt_string("[] instanceof Object"),
- nxt_string("true") },
-
- { nxt_string("/./ instanceof RegExp"),
- nxt_string("true") },
-
- { nxt_string("/./ instanceof Object"),
- nxt_string("true") },
-
- { nxt_string("Object.defineProperty(Function.prototype, \"prototype\", {get: ()=>Array.prototype});"
- "[] instanceof Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("Object.defineProperty(Function.prototype, \"prototype\", {get: ()=>{throw Error('Oops')}});"
- "[] instanceof Function.prototype"),
- nxt_string("Error: Oops") },
-
- /* global this. */
-
- { nxt_string("this"),
- nxt_string("[object Object]") },
-
- { nxt_string("this.a = 1; this.a"),
- nxt_string("1") },
-
- { nxt_string("this.undefined = 42"),
- nxt_string("TypeError: Cannot assign to read-only property \"undefined\" of object") },
-
- { nxt_string("this.Infinity = 42"),
- nxt_string("TypeError: Cannot assign to read-only property \"Infinity\" of object") },
-
- { nxt_string("this.NaN = 42"),
- nxt_string("TypeError: Cannot assign to read-only property \"NaN\" of object") },
-
- { nxt_string("typeof this.undefined"),
- nxt_string("undefined") },
-
- { nxt_string("typeof this.Infinity"),
- nxt_string("number") },
-
- { nxt_string("this.Infinity + 1"),
- nxt_string("Infinity") },
-
- { nxt_string("typeof this.NaN"),
- nxt_string("number") },
-
- { nxt_string("this.NaN + 1"),
- nxt_string("NaN") },
-
- { nxt_string("{this}"),
- nxt_string("undefined") },
-
- { nxt_string("if (1) {new this}"),
- nxt_string("TypeError: object is not a function") },
-
- { nxt_string("if (1) {this()}"),
- nxt_string("TypeError: object is not a function") },
-
- { nxt_string("var ex; try {new this} catch (e) {ex = e}; ex"),
- nxt_string("TypeError: object is not a function") },
-
- { nxt_string("var ex; try {({}) instanceof this} catch (e) {ex = e}; ex"),
- nxt_string("TypeError: right argument is not a function") },
-
- { nxt_string("Function.call(this, 'var x / = 1;')"),
- nxt_string("InternalError: Not implemented") },
-
- { nxt_string("njs"),
- nxt_string("[object Object]") },
-
- { nxt_string("var o = Object(); o"),
- nxt_string("[object Object]") },
-
- { nxt_string("var o = new Object(); o"),
- nxt_string("[object Object]") },
-
- { nxt_string("var o = new Object(1); o"),
- nxt_string("1") },
-
- { nxt_string("var o = {}; o === Object(o)"),
- nxt_string("true") },
-
- { nxt_string("var o = {}; o === new Object(o)"),
- nxt_string("true") },
-
- { nxt_string("var o = Object([]); Object.prototype.toString.call(o)"),
- nxt_string("[object Array]") },
-
- { nxt_string("Object.name"),
- nxt_string("Object") },
-
- { nxt_string("Object.length"),
- nxt_string("1") },
-
- { nxt_string("Object.__proto__ === Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.constructor === Object"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.__proto__ === null"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.__proto__ = {}"),
- nxt_string("TypeError: Cyclic __proto__ value") },
-
- { nxt_string("var o = {}; var o2 = Object.create(o); o.__proto__ = o2"),
- nxt_string("TypeError: Cyclic __proto__ value") },
-
- { nxt_string("Object.prototype.__proto__.f()"),
- nxt_string("TypeError: cannot get property \"f\" of undefined") },
-
- { nxt_string("var obj = Object.create(null); obj.one = 1;"
- "var res = [];"
- "for (var val in obj) res.push(val); res"),
- nxt_string("one") },
-
- { nxt_string("var o1 = Object.create(null); o1.one = 1;"
- "var o2 = Object.create(o1); o2.two = 2;"
- "var o3 = Object.create(o2); o3.three = 3;"
- "var res = [];"
- "for (var val in o3) res.push(val); res"),
- nxt_string("three,two,one") },
-
- { nxt_string("var o1 = Object.create(null); o1.one = 1;"
- "var o2 = Object.create(o1);"
- "var o3 = Object.create(o2); o3.three = 3;"
- "var res = [];"
- "for (var val in o3) res.push(val); res"),
- nxt_string("three,one") },
-
- { nxt_string("var o1 = Object.create(null); o1.one = 1;"
- "var o2 = Object.create(o1);"
- "var o3 = Object.create(o2);"
- "var res = [];"
- "for (var val in o3) res.push(val); res"),
- nxt_string("one") },
-
- { nxt_string("var o1 = Object.create(null); o1.one = 1;"
- "var o2 = Object.create(o1); o2.two = 2;"
- "var o3 = Object.create(o2); o3.three = 3;"
- "o3.two = -2; o3.one = -1;"
- "var res = [];"
- "for (var val in o3) res.push(val); res"),
- nxt_string("three,two,one") },
-
- { nxt_string("var a = []; for(var p in 'abc') a.push(p); a"),
- nxt_string("0,1,2") },
-
- { nxt_string("var a = []; for(var p in Object('abc')) a.push(p); a"),
- nxt_string("0,1,2") },
-
- { nxt_string("var o = Object('abc'); var x = Object.create(o);"
- "x.a = 1; x.b = 2;"
- "var a = []; for(var p in x) a.push(p); a"),
- nxt_string("a,b,0,1,2") },
-
- { nxt_string("var o = Object.create(Math); o.abs = -5; Math.abs(o.abs)"),
- nxt_string("5") },
-
- { nxt_string("Object.prototype.toString.call(Object.prototype)"),
- nxt_string("[object Object]") },
-
- { nxt_string("Object.prototype.toString.call(new Array)"),
- nxt_string("[object Array]") },
-
- { nxt_string("Object.prototype.toString.call(new URIError)"),
- nxt_string("[object Error]") },
-
- { nxt_string("Object.prototype"),
- nxt_string("[object Object]") },
-
- { nxt_string("Object.prototype.valueOf.prototype"),
- nxt_string("undefined") },
-
- { nxt_string("Object.constructor === Function"),
- nxt_string("true") },
-
- { nxt_string("({}).__proto__ === Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("({}).__proto__ = 1"),
- nxt_string("1") },
-
- { nxt_string("({}).__proto__ = null"),
- nxt_string("null") },
-
- { nxt_string("({__proto__: []}) instanceof Array"),
- nxt_string("true") },
-
- { nxt_string("({}).__proto__.constructor === Object"),
- nxt_string("true") },
-
- { nxt_string("({}).constructor === Object"),
- nxt_string("true") },
-
- { nxt_string("({}).constructor()"),
- nxt_string("[object Object]") },
-
- { nxt_string("var a = Object.__proto__; a()"),
- nxt_string("undefined") },
-
- { nxt_string("Object.__proto__()"),
- nxt_string("undefined") },
-
- { nxt_string("var a = Array(3); a"),
- nxt_string(",,") },
-
- { nxt_string("var a = Array(); a.length"),
- nxt_string("0") },
-
- { nxt_string("var a = Array(0); a.length"),
- nxt_string("0") },
-
- { nxt_string("var a = Array(true); a"),
- nxt_string("true") },
-
- { nxt_string("var a = Array(1,'two',3); a"),
- nxt_string("1,two,3") },
-
- { nxt_string("var a = Array(-1)"),
- nxt_string("RangeError: Invalid array length") },
-
- { nxt_string("var a = Array(2.5)"),
- nxt_string("RangeError: Invalid array length") },
-
- { nxt_string("var a = Array(NaN)"),
- nxt_string("RangeError: Invalid array length") },
-
- { nxt_string("var a = Array(Infinity)"),
- nxt_string("RangeError: Invalid array length") },
-
- { nxt_string("var a = Array(1111111111)"),
- nxt_string("MemoryError") },
-
- { nxt_string("var x = Array(2**32)"),
- nxt_string("RangeError: Invalid array length") },
-
- { nxt_string("var x = Array(2**28)"),
- nxt_string("MemoryError") },
-
- { nxt_string("var x = Array(2**20), y = Array(2**12).fill(x);"
- "Array.prototype.concat.apply(y[0], y.slice(1))"),
- nxt_string("RangeError: Invalid array length") },
-
- { nxt_string("var a = new Array(3); a"),
- nxt_string(",,") },
-
- { nxt_string("Array.name"),
- nxt_string("Array") },
-
- { nxt_string("Array.length"),
- nxt_string("1") },
-
- { nxt_string("Array.__proto__ === Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("Array.prototype.constructor === Array"),
- nxt_string("true") },
-
- { nxt_string("Array.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("Array.prototype.__proto__ === Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.toString.call(Array.prototype)"),
- nxt_string("[object Array]") },
-
- { nxt_string("Array.prototype"),
- nxt_string("") },
-
- { nxt_string("Array.prototype.length"),
- nxt_string("0") },
-
- { nxt_string("Array.prototype.length = 3, Array.prototype"),
- nxt_string(",,") },
-
- { nxt_string("var o = Object.create(Array.prototype); o.length = 3;"
- "[Array.prototype, Array.prototype.length, o.length]"),
- nxt_string(",0,3") },
-
- { nxt_string("var o = Object.create(Array.prototype);"
- "Object.defineProperty(o, 'length', {value: 3});"
- "[Array.prototype, Array.prototype.length, o.length]"),
- nxt_string(",0,3") },
-
- { nxt_string("Array.constructor === Function"),
- nxt_string("true") },
-
- { nxt_string("var a = []; a.join = 'OK'; a"),
- nxt_string("[object Array]") },
-
- { nxt_string("[].__proto__ === Array.prototype"),
- nxt_string("true") },
-
- { nxt_string("[].__proto__.constructor === Array"),
- nxt_string("true") },
-
- { nxt_string("[].constructor === Array"),
- nxt_string("true") },
-
- { nxt_string("([]).constructor()"),
- nxt_string("") },
-
- { nxt_string("Boolean()"),
- nxt_string("false") },
-
- { nxt_string("new Boolean()"),
- nxt_string("false") },
-
- { nxt_string("new Boolean"),
- nxt_string("false") },
-
- { nxt_string("Boolean(0)"),
- nxt_string("false") },
-
- { nxt_string("Boolean('')"),
- nxt_string("false") },
-
- { nxt_string("Boolean(1)"),
- nxt_string("true") },
-
- { nxt_string("Boolean('a')"),
- nxt_string("true") },
-
- { nxt_string("Boolean({})"),
- nxt_string("true") },
-
- { nxt_string("Boolean([])"),
- nxt_string("true") },
-
- { nxt_string("typeof Boolean(1)"),
- nxt_string("boolean") },
-
- { nxt_string("typeof new Boolean(1)"),
- nxt_string("object") },
-
- { nxt_string("typeof new Boolean"),
- nxt_string("object") },
-
- { nxt_string("Boolean.name"),
- nxt_string("Boolean") },
-
- { nxt_string("Boolean.length"),
- nxt_string("1") },
-
- { nxt_string("Boolean.__proto__ === Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("Boolean.prototype.constructor === Boolean"),
- nxt_string("true") },
-
- { nxt_string("Boolean.prototype.constructor = 1;"
- "Boolean.prototype.constructor"),
- nxt_string("1") },
-
- { nxt_string("var c = Boolean.prototype.constructor;"
- "Boolean.prototype.constructor = 1;"
- "[c(0), Boolean.prototype.constructor]"),
- nxt_string("false,1") },
-
- { nxt_string("Boolean.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("Boolean.prototype.__proto__ === Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.toString.call(Boolean.prototype)"),
- nxt_string("[object Boolean]") },
-
- { nxt_string("Boolean.prototype"),
- nxt_string("false") },
-
- { nxt_string("Boolean.constructor === Function"),
- nxt_string("true") },
-
- { nxt_string("true.__proto__ === Boolean.prototype"),
- nxt_string("true") },
-
- { nxt_string("false.__proto__ === Boolean.prototype"),
- nxt_string("true") },
-
- { nxt_string("var b = Boolean(1); b.__proto__ === Boolean.prototype"),
- nxt_string("true") },
-
- { nxt_string("var b = new Boolean(1); b.__proto__ === Boolean.prototype"),
- nxt_string("true") },
-
- { nxt_string("Number()"),
- nxt_string("0") },
-
- { nxt_string("new Number()"),
- nxt_string("0") },
-
- { nxt_string("new Number"),
- nxt_string("0") },
-
- { nxt_string("new Number(undefined)"),
- nxt_string("NaN") },
-
- { nxt_string("new Number(null)"),
- nxt_string("0") },
-
- { nxt_string("new Number(true)"),
- nxt_string("1") },
-
- { nxt_string("new Number(false)"),
- nxt_string("0") },
-
- { nxt_string("Number(undefined)"),
- nxt_string("NaN") },
-
- { nxt_string("Number(null)"),
- nxt_string("0") },
-
- { nxt_string("Number(true)"),
- nxt_string("1") },
-
- { nxt_string("Number(false)"),
- nxt_string("0") },
-
- { nxt_string("Number(123)"),
- nxt_string("123") },
-
- { nxt_string("Number('123')"),
- nxt_string("123") },
-
- { nxt_string("Number('0.'+'1'.repeat(128))"),
- nxt_string("0.1111111111111111") },
-
- { nxt_string("Number('1'.repeat(128))"),
- nxt_string("1.1111111111111113e+127") },
-
- { nxt_string("Number('1'.repeat(129))"),
- nxt_string("1.1111111111111112e+128") },
-
- { nxt_string("Number('1'.repeat(129))"),
- nxt_string("1.1111111111111112e+128") },
-
- { nxt_string("Number('1'.repeat(129)+'e-100')"),
- nxt_string("1.1111111111111112e+28") },
-
- { nxt_string("Number('1'.repeat(310))"),
- nxt_string("Infinity") },
-
- { nxt_string("var o = { valueOf: function() { return 123 } };"
- "Number(o)"),
- nxt_string("123") },
-
- { nxt_string("var o = { valueOf: function() { return 123 } };"
- "new Number(o)"),
- nxt_string("123") },
-
- { nxt_string("typeof Number(1)"),
- nxt_string("number") },
-
- { nxt_string("typeof new Number(1)"),
- nxt_string("object") },
-
- { nxt_string("typeof new Number"),
- nxt_string("object") },
-
- { nxt_string("Number.name"),
- nxt_string("Number") },
-
- { nxt_string("Number.length"),
- nxt_string("1") },
-
- { nxt_string("Number.__proto__ === Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("Number.prototype.constructor === Number"),
- nxt_string("true") },
-
- { nxt_string("Number.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("Number.prototype.__proto__ === Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.toString.call(Number.prototype)"),
- nxt_string("[object Number]") },
-
- { nxt_string("Number.prototype"),
- nxt_string("0") },
-
- { nxt_string("Number.constructor === Function"),
- nxt_string("true") },
-
- { nxt_string("0..__proto__ === Number.prototype"),
- nxt_string("true") },
-
- { nxt_string("var n = Number(1); n.__proto__ === Number.prototype"),
- nxt_string("true") },
-
- { nxt_string("var n = new Number(1); n.__proto__ === Number.prototype"),
- nxt_string("true") },
-
- { nxt_string("Number.isFinite()"),
- nxt_string("false") },
-
- { nxt_string("Number.isFinite(123)"),
- nxt_string("true") },
-
- { nxt_string("Number.isFinite('123')"),
- nxt_string("false") },
-
- { nxt_string("Number.isFinite(Infinity)"),
- nxt_string("false") },
-
- { nxt_string("Number.isFinite(NaN)"),
- nxt_string("false") },
-
- { nxt_string("Number.isInteger()"),
- nxt_string("false") },
-
- { nxt_string("Number.isInteger('123')"),
- nxt_string("false") },
-
- { nxt_string("Number.isInteger(123)"),
- nxt_string("true") },
-
- { nxt_string("Number.isInteger(-123.0)"),
- nxt_string("true") },
-
- { nxt_string("Number.isInteger(123.4)"),
- nxt_string("false") },
-
- { nxt_string("Number.isInteger(Infinity)"),
- nxt_string("false") },
-
- { nxt_string("Number.isInteger(NaN)"),
- nxt_string("false") },
-
- { nxt_string("Number.isSafeInteger()"),
- nxt_string("false") },
-
- { nxt_string("Number.isSafeInteger('123')"),
- nxt_string("false") },
-
- { nxt_string("Number.isSafeInteger(9007199254740991)"),
- nxt_string("true") },
-
- { nxt_string("Number.isSafeInteger(-9007199254740991.0)"),
- nxt_string("true") },
-
- { nxt_string("Number.isSafeInteger(9007199254740992)"),
- nxt_string("false") },
-
- { nxt_string("Number.isSafeInteger(-9007199254740992.0)"),
- nxt_string("false") },
-
- { nxt_string("Number.isSafeInteger(123.4)"),
- nxt_string("false") },
-
- { nxt_string("Number.isSafeInteger(Infinity)"),
- nxt_string("false") },
-
- { nxt_string("Number.isSafeInteger(-Infinity)"),
- nxt_string("false") },
-
- { nxt_string("Number.isSafeInteger(NaN)"),
- nxt_string("false") },
-
- { nxt_string("Number.isNaN()"),
- nxt_string("false") },
-
- { nxt_string("Number.isNaN('NaN')"),
- nxt_string("false") },
-
- { nxt_string("Number.isNaN(NaN)"),
- nxt_string("true") },
-
- { nxt_string("Number.isNaN(123)"),
- nxt_string("false") },
-
- { nxt_string("Number.isNaN(Infinity)"),
- nxt_string("false") },
-
-#if 0
- { nxt_string("parseFloat === Number.parseFloat"),
- nxt_string("true") },
-
- { nxt_string("parseInt === Number.parseInt"),
- nxt_string("true") },
-#endif
-
- { nxt_string("String()"),
- nxt_string("") },
-
- { nxt_string("new String()"),
- nxt_string("") },
-
- { nxt_string("new String"),
- nxt_string("") },
-
- { nxt_string("String(123)"),
- nxt_string("123") },
-
- { nxt_string("new String(123)"),
- nxt_string("123") },
-
- { nxt_string("Object('123').length"),
- nxt_string("3") },
-
- { nxt_string("new String(123).length"),
- nxt_string("3") },
-
- { nxt_string("new String(123).toString()"),
- nxt_string("123") },
-
- { nxt_string("String([1,2,3])"),
- nxt_string("1,2,3") },
-
- { nxt_string("new String([1,2,3])"),
- nxt_string("1,2,3") },
-
- { nxt_string("var s = new String('αβ'); s.one = 1; 'one' in s"),
- nxt_string("true") },
-
- { nxt_string("var s = new String('αβ'); 'one' in s"),
- nxt_string("false") },
-
- { nxt_string("var s = new String('αβ'); s.one = 1; '1' in s"),
- nxt_string("true") },
-
- { nxt_string("var s = new String('αβ'); s.one = 1; 1 in s"),
- nxt_string("true") },
-
- { nxt_string("var s = new String('αβ'); s.one = 1; 2 in s"),
- nxt_string("false") },
-
- { nxt_string("var s = new String('αβ'); s[1]"),
- nxt_string("β") },
-
- { nxt_string("Object.create(new String('αβ'))[1]"),
- nxt_string("β") },
-
- { nxt_string("var s = new String('αβ'); s[1] = 'b'"),
- nxt_string("TypeError: Cannot assign to read-only property \"1\" of object string") },
-
- { nxt_string("var o = Object.create(new String('αβ')); o[1] = 'a'"),
- nxt_string("TypeError: Cannot assign to read-only property \"1\" of object") },
-
- { nxt_string("var s = new String('αβ'); s[4] = 'ab'; s[4]"),
- nxt_string("ab") },
-
- { nxt_string("Object.create(new String('αβ')).length"),
- nxt_string("2") },
-
- { nxt_string("var s = new String('αβ'); s.valueOf()[1]"),
- nxt_string("β") },
-
- { nxt_string("var o = { toString: function() { return 'OK' } };"
- "String(o)"),
- nxt_string("OK") },
-
- { nxt_string("var o = { toString: function() { return 'OK' } };"
- "new String(o)"),
- nxt_string("OK") },
-
- { nxt_string("typeof String('abc')"),
- nxt_string("string") },
-
- { nxt_string("typeof new String('abc')"),
- nxt_string("object") },
-
- { nxt_string("typeof new String"),
- nxt_string("object") },
-
- { nxt_string("String.name"),
- nxt_string("String") },
-
- { nxt_string("String.length"),
- nxt_string("1") },
-
- { nxt_string("String.__proto__ === Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.toString.call(String.prototype)"),
- nxt_string("[object String]") },
-
- { nxt_string("String.prototype"),
- nxt_string("") },
-
- { nxt_string("String.prototype.length"),
- nxt_string("0") },
-
- { nxt_string("String.prototype.constructor === String"),
- nxt_string("true") },
-
- { nxt_string("String.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("String.prototype.__proto__ === Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("''.__proto__ === String.prototype"),
- nxt_string("true") },
-
- { nxt_string("String.constructor === Function"),
- nxt_string("true") },
-
- { nxt_string("'test'.__proto__ === String.prototype"),
- nxt_string("true") },
-
- { nxt_string("var s = String('abc'); s.__proto__ === String.prototype"),
- nxt_string("true") },
-
- { nxt_string("var s = new String('abc'); s.__proto__ === String.prototype"),
- nxt_string("true") },
-
- { nxt_string("'test'.constructor === String"),
- nxt_string("true") },
-
- { nxt_string("'test'.constructor.prototype === String.prototype"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.create(String.prototype); o.length = 1"),
- nxt_string("TypeError: Cannot assign to read-only property \"length\" of object") },
-
- { nxt_string("Function.name"),
- nxt_string("Function") },
-
- { nxt_string("Function.length"),
- nxt_string("1") },
-
- { nxt_string("Function.__proto__ === Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("Function.prototype.constructor === Function"),
- nxt_string("true") },
-
- { nxt_string("Function.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("Function.prototype.__proto__ === Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.toString.call(Function.prototype)"),
- nxt_string("[object Function]") },
-
- { nxt_string("Function.prototype"),
- nxt_string("[object Function]") },
-
- { nxt_string("Function.prototype.length"),
- nxt_string("0") },
-
- { nxt_string("Function.constructor === Function"),
- nxt_string("true") },
-
- { nxt_string("function f() {} f.__proto__ === Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("Function()"),
- nxt_string("InternalError: Not implemented") },
-
- { nxt_string("RegExp()"),
- nxt_string("/(?:)/") },
-
- { nxt_string("RegExp('')"),
- nxt_string("/(?:)/") },
-
- { nxt_string("RegExp(123)"),
- nxt_string("/123/") },
-
- { nxt_string("RegExp.name"),
- nxt_string("RegExp") },
-
- { nxt_string("RegExp.length"),
- nxt_string("2") },
-
- { nxt_string("RegExp.__proto__ === Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("RegExp.prototype.constructor === RegExp"),
- nxt_string("true") },
-
- { nxt_string("RegExp.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("RegExp.prototype.__proto__ === Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.toString.call(RegExp.prototype)"),
- nxt_string("[object RegExp]") },
-
- { nxt_string("RegExp.prototype"),
- nxt_string("/(?:)/") },
-
- { nxt_string("RegExp.constructor === Function"),
- nxt_string("true") },
-
- { nxt_string("/./.__proto__ === RegExp.prototype"),
- nxt_string("true") },
-
- { nxt_string("toString()"),
- nxt_string("[object Undefined]") },
-
- { nxt_string("toString() + Object.prototype.toString"),
- nxt_string("[object Undefined][object Function]") },
-
-#if 0
- { nxt_string("toString === Object.prototype.toString"),
- nxt_string("true") },
-
- { nxt_string("Object.prototype.toString.yes = 'OK'; toString.yes"),
- nxt_string("OK") },
-#endif
-
- { nxt_string("Object.prototype.toString.call()"),
- nxt_string("[object Undefined]") },
-
- { nxt_string("Object.prototype.toString.call(undefined)"),
- nxt_string("[object Undefined]") },
-
- { nxt_string("Object.prototype.toString.call(null)"),
- nxt_string("[object Null]") },
-
- { nxt_string("Object.prototype.toString.call(true)"),
- nxt_string("[object Boolean]") },
-
- { nxt_string("Object.prototype.toString.call(1)"),
- nxt_string("[object Number]") },
-
- { nxt_string("Object.prototype.toString.call('')"),
- nxt_string("[object String]") },
-
- { nxt_string("Object.prototype.toString.call({})"),
- nxt_string("[object Object]") },
-
- { nxt_string("Object.prototype.toString.call([])"),
- nxt_string("[object Array]") },
-
- { nxt_string("Object.prototype.toString.call(new Object(true))"),
- nxt_string("[object Boolean]") },
-
- { nxt_string("Object.prototype.toString.call(new Number(1))"),
- nxt_string("[object Number]") },
-
- { nxt_string("Object.prototype.toString.call(new Object(1))"),
- nxt_string("[object Number]") },
-
- { nxt_string("Object.prototype.toString.call(new Object(''))"),
- nxt_string("[object String]") },
-
- { nxt_string("Object.prototype.toString.call(function(){})"),
- nxt_string("[object Function]") },
-
- { nxt_string("Object.prototype.toString.call(/./)"),
- nxt_string("[object RegExp]") },
-
- { nxt_string("var p = { a:5 }; var o = Object.create(p); o.a"),
- nxt_string("5") },
-
- { nxt_string("var p = { a:5 }; var o = Object.create(p);"
- "o.__proto__ === p"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.create(Object.prototype);"
- "o.__proto__ === Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.create(null); '__proto__' in o"),
- nxt_string("false") },
-
- { nxt_string("Object.create()"),
- nxt_string("TypeError: prototype may only be an object or null: undefined") },
-
- { nxt_string("Object.create(1)"),
- nxt_string("TypeError: prototype may only be an object or null: number") },
-
- { nxt_string("var o = {a:1, b:2, c:3};"
- "Object.keys(o)"),
- nxt_string("a,b,c") },
-
- { nxt_string("var a = []; a.one = 7; Object.keys(a)"),
- nxt_string("one") },
-
- { nxt_string("var a = [,,]; a.one = 7; Object.keys(a)"),
- nxt_string("one") },
-
- { nxt_string("var a = [,6,,3]; a.one = 7; Object.keys(a)"),
- nxt_string("1,3,one") },
-
- { nxt_string("var o = {a:1,b:2}; delete o.a; Object.keys(o)"),
- nxt_string("b") },
-
- { nxt_string("Object.keys()"),
- nxt_string("TypeError: cannot convert undefined argument to object") },
-
- { nxt_string("Object.keys('αβZ')"),
- nxt_string("0,1,2") },
-
- { nxt_string("Object.keys(new String('αβZ'))"),
- nxt_string("0,1,2") },
-
- { nxt_string("var s = new String('αβZ'); s.a = 1; Object.keys(s)"),
- nxt_string("0,1,2,a") },
-
- { nxt_string("var r = new RegExp('αbc'); r.a = 1; Object.keys(r)"),
- nxt_string("a") },
-
- { nxt_string("Object.keys(Object.create(new String('abc')))"),
- nxt_string("") },
-
- { nxt_string("Object.keys(1)"),
- nxt_string("") },
-
- { nxt_string("Object.keys(true)"),
- nxt_string("") },
-
- { nxt_string("var o = {a:3, b:2, c:1}; Object.values(o)"),
- nxt_string("3,2,1") },
-
- { nxt_string("Object.values('s')"),
- nxt_string("s") },
-
- { nxt_string("Object.values('абв abc')"),
- nxt_string("а,б,в, ,a,b,c") },
-
- { nxt_string("var s = new String('abc'); s.three = 3; Object.values(s)"),
- nxt_string("a,b,c,3") },
-
- { nxt_string("var a = [,,5,,4,,,3,2]; a.one = 1; Object.values(a)"),
- nxt_string("5,4,3,2,1") },
-
- { nxt_string("Object.values([{}, null, false, NaN, function() {}])"),
- nxt_string("[object Object],,false,NaN,[object Function]") },
-
- { nxt_string("Object.values(1)"),
- nxt_string("") },
-
- { nxt_string("Object.values(njs)[0] === njs.version"),
- nxt_string("true") },
-
- { nxt_string("Object.values(process)"),
- nxt_string("") },
-
- { nxt_string("Object.values()"),
- nxt_string("TypeError: cannot convert undefined argument to object") },
-
- { nxt_string("Object.entries('abc')"),
- nxt_string("0,a,1,b,2,c") },
-
- { nxt_string("JSON.stringify(Object.entries('эюя'))"),
- nxt_string("[[\"0\",\"э\"],[\"1\",\"ю\"],[\"2\",\"я\"]]") },
-
- { nxt_string("var o = {a:\"а\", b:\"б\", c:\"ц\"};"
- "JSON.stringify(Object.entries(o))"),
- nxt_string("[[\"a\",\"а\"],[\"b\",\"б\"],[\"c\",\"ц\"]]") },
-
- { nxt_string("JSON.stringify(Object.entries([0]))"),
- nxt_string("[[\"0\",0]]") },
-
- { nxt_string("var s = new String('αβ'); s.two = null; s[3] = true;"
- "Object.entries(s)"),
- nxt_string("0,α,1,β,two,,3,true") },
-
- { nxt_string("Object.entries(true)"),
- nxt_string("") },
-
- { nxt_string("Object.entries(njs)[0][1] === njs.version"),
- nxt_string("true") },
-
- { nxt_string("Object.entries()"),
- nxt_string("TypeError: cannot convert undefined argument to object") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', {}); o.a"),
- nxt_string("undefined") },
-
- { nxt_string("Object.defineProperty({}, 'a', {value:1})"),
- nxt_string("[object Object]") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', {value:1}); o.a"),
- nxt_string("1") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', Object.create({value:1})); o.a"),
- nxt_string("1") },
-
- { nxt_string("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
- "Object.keys(o)"),
- nxt_string("a,c") },
-
- { nxt_string("var o = {a:1, c:2};"
- "Object.defineProperty(o, 'b', {enumerable:false});"
- "Object.keys(o)"),
- nxt_string("a,c") },
-
- { nxt_string("var o = {a:1, c:3};"
- "Object.defineProperty(o, 'b', {enumerable:true});"
- "Object.keys(o)"),
- nxt_string("a,c,b") },
-
- { nxt_string("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
- "Object.values(o)"),
- nxt_string("1,2") },
-
- { nxt_string("var o = {a:1, c:2};"
- "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
- "Object.values(o)"),
- nxt_string("1,2") },
-
- { nxt_string("var o = {a:1, c:3};"
- "Object.defineProperty(o, 'b', {enumerable:true, value:2});"
- "Object.values(o)"),
- nxt_string("1,3,2") },
-
- { nxt_string("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
- "Object.entries(o)"),
- nxt_string("a,1,c,2") },
-
- { nxt_string("var o = {a:1, c:2};"
- "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
- "Object.entries(o)"),
- nxt_string("a,1,c,2") },
-
- { nxt_string("var o = {a:1, c:3};"
- "Object.defineProperty(o, 'b', {enumerable:true, value:2});"
- "Object.entries(o)"),
- nxt_string("a,1,c,3,b,2") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', {}); o.a = 1"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', {writable:false}); o.a = 1"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', {writable:true});"
- "o.a = 1; o.a"),
- nxt_string("1") },
-
- { nxt_string("Object.defineProperty(Object.prototype, 'a', {writable:false});"
- "var o = {a: 1}; [o.a++, o.a]"),
- nxt_string("1,2") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(Object.prototype, 'a', {writable:false});"
- "o.a = 1"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(Object.prototype, 'a', {writable:true});"
- "o.a = 1; o.a"),
- nxt_string("1") },
-
- { nxt_string("var p = Object.create(Function);"
- "Object.defineProperty(p, 'length', {writable: true});"
- "p.length = 32; p.length"),
- nxt_string("32") },
-
- { nxt_string("var p = Object.create(Math.abs);"
- "Object.defineProperty(p, 'length', {writable: true});"
- "p.length = 23; p.length"),
- nxt_string("23") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {value:1}); delete o.a"),
- nxt_string("TypeError: Cannot delete property \"a\" of object") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {value:1, configurable:true});"
- "delete o.a; o.a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {value:1, configurable:false});"
- "delete o.a"),
- nxt_string("TypeError: Cannot delete property \"a\" of object") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', Object.create({value:2})); o.a"),
- nxt_string("2") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {configurable:false});"
- "Object.defineProperty(o, 'a', {configurable:true})"),
- nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {configurable:false});"
- "Object.defineProperty(o, 'a', {enumerable:true})"),
- nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {configurable:false});"
- "Object.defineProperty(o, 'a', {writable:true})"),
- nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {configurable:false});"
- "Object.defineProperty(o, 'a', {enumerable:false}).a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {configurable:false});"
- "Object.defineProperty(o, 'a', {}).a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {configurable:false, writable:true});"
- "Object.defineProperty(o, 'a', {writable:false}).a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {configurable:true, writable:false});"
- "Object.defineProperty(o, 'a', {writable:true}).a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {});"
- "Object.defineProperty(o, 'a', {}).a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {value:1});"
- "Object.defineProperty(o, 'a', {value:1}).a"),
- nxt_string("1") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {value:1});"
- "Object.defineProperty(o, 'a', {value:2}).a"),
- nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {configurable:true});"
- "Object.defineProperty(o, 'a', {value:1}).a"),
- nxt_string("1") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {configurable:true, get:()=>1});"
- "Object.defineProperty(o, 'a', {value:1});"
- "var d = Object.getOwnPropertyDescriptor(o, 'a'); "
- "[d.value, d.writable, d.enumerable, d.configurable, d.get, d.set]"),
- nxt_string("1,false,false,true,,") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {configurable:true, value:1});"
- "Object.defineProperty(o, 'a', {set:()=>1});"
- "var d = Object.getOwnPropertyDescriptor(o, 'a'); "
- "[d.value, d.writable, d.enumerable, d.configurable, d.get, d.set]"),
- nxt_string(",,false,true,,[object Function]") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', {get: ()=>1, configurable:true}); "
- "Object.defineProperty(o, 'a', {value:123}); o.a =2"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', {get: ()=>1, configurable:true}); "
- "Object.defineProperty(o, 'a', {writable:false}); o.a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', {value: 1, configurable:true}); "
- "Object.defineProperty(o, 'a', {get:()=>1}); o.a = 2"),
- nxt_string("TypeError: Cannot set property \"a\" of object which has only a getter") },
-
- { nxt_string("var o = Object.create(Object.defineProperty({}, 'x', { set: function(v) { this.y = v; }})); "
- "o.x = 123; Object.getOwnPropertyDescriptor(o, 'y').value"),
- nxt_string("123") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', { configurable: true, value: 0 });"
- "Object.defineProperty(o, 'a', { value: 1 });"
- "Object.defineProperty(o, 'a', { configurable: false, value: 2 }).a"),
- nxt_string("2") },
-
- { nxt_string("var o = {}; Object.defineProperty()"),
- nxt_string("TypeError: cannot convert undefined argument to object") },
-
- { nxt_string("var o = {}; Object.defineProperty(o)"),
- nxt_string("TypeError: descriptor is not an object") },
-
- { nxt_string("Object.defineProperty(Function.prototype, 'name', {value:'x'}).name"),
- nxt_string("x") },
-
- { nxt_string("Object.defineProperty(Function.prototype, 'xxx', {value:'x'}).xxx"),
- nxt_string("x") },
-
- { nxt_string("Object.defineProperty(Object, 'name', {value:'x'}).name"),
- nxt_string("x") },
-
- { nxt_string("Object.defineProperty(Object.prototype, 'toString', {value:1}).toString"),
- nxt_string("1") },
-
- { nxt_string("var o = Object.defineProperties({}, {a:{value:1}}); o.a"),
- nxt_string("1") },
-
- { nxt_string("var o = Object.defineProperties({}, {a:{enumerable:true}, b:{enumerable:true}});"
- "Object.keys(o)"),
- nxt_string("a,b") },
-
- { nxt_string("var desc = Object.defineProperty({b:{value:1, enumerable:true}}, 'a', {});"
- "var o = Object.defineProperties({}, desc);"
- "Object.keys(o)"),
- nxt_string("b") },
-
- { nxt_string("var o = {a:1}; delete o.a;"
- "Object.defineProperty(o, 'a', { value: 1 }); o.a"),
- nxt_string("1") },
-
- { nxt_string("var o = {a:1}; delete o.a;"
- "Object.defineProperty(o, 'a', { value: 1 }); o.a = 2; o.a"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
- { nxt_string("var o = {a:1}; delete o.a;"
- "Object.defineProperty(o, 'a', { value: 1, writable:1 }); o.a = 2; o.a"),
- nxt_string("2") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, new String('a'), { value: 1}); o.a"),
- nxt_string("1") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, {toString:function(){return 'a'}}, { value: 1}); o.a"),
- nxt_string("1") },
-
- { nxt_string("var a = [1, 2];"
- "Object.defineProperty(a, '1', {value: 5}); a[1]"),
- nxt_string("5") },
-
- { nxt_string("var a = [1, 2];"
- "Object.defineProperty(a, '3', {}); njs.dump(a)"),
- nxt_string("[1,2,<empty>,undefined]") },
-
- { nxt_string("var a = [1, 2];"
- "Object.defineProperty(a, 'length', {}); a"),
- nxt_string("1,2") },
-
- { nxt_string("var a = [1, 2];"
- "Object.defineProperty(a, 'length', {value: 1}); a"),
- nxt_string("1") },
-
- { nxt_string("var a = [1, 2];"
- "Object.defineProperty(a, 'length', {value: 5}); a"),
- nxt_string("1,2,,,") },
-
- { nxt_string("var o = Object.defineProperties({a:1}, {}); o.a"),
- nxt_string("1") },
-
- { nxt_string("var arr = [0, 1]; Object.defineProperty(arr, 'length', {value:3}); arr.length"),
- nxt_string("3") },
-
- { nxt_string("Object.defineProperties()"),
- nxt_string("TypeError: cannot convert undefined argument to object") },
-
- { nxt_string("Object.defineProperties(1, {})"),
- nxt_string("TypeError: cannot convert number argument to object") },
-
- { nxt_string("Object.defineProperties({}, 1)"),
- nxt_string("TypeError: descriptor is not an object") },
-
- { nxt_string("var o = {a:1}; o.hasOwnProperty('a')"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.create({a:2}); o.hasOwnProperty('a')"),
- nxt_string("false") },
-
- { nxt_string("var o = {a:1}; o.hasOwnProperty('b')"),
- nxt_string("false") },
-
- { nxt_string("var a = []; a.hasOwnProperty('0')"),
- nxt_string("false") },
-
- { nxt_string("var a = [,,]; a.hasOwnProperty('0')"),
- nxt_string("false") },
-
- { nxt_string("var a = [3,,]; a.hasOwnProperty('0')"),
- nxt_string("true") },
-
- { nxt_string("var a = [,4]; a.hasOwnProperty('1')"),
- nxt_string("true") },
-
- { nxt_string("var a = [3,4]; a.hasOwnProperty('2')"),
- nxt_string("false") },
-
- { nxt_string("var a = [3,4]; a.one = 1; a.hasOwnProperty('one')"),
- nxt_string("true") },
-
- { nxt_string("var o = {a:1}; o.hasOwnProperty(o)"),
- nxt_string("false") },
-
- { nxt_string("var o = {a:1}; o.hasOwnProperty(1)"),
- nxt_string("false") },
-
- { nxt_string("var o = {a:1}; o.hasOwnProperty()"),
- nxt_string("false") },
-
- { nxt_string("[,].hasOwnProperty()"),
- nxt_string("false") },
-
- { nxt_string("[1,2].hasOwnProperty('len')"),
- nxt_string("false") },
-
- { nxt_string("[1,2].hasOwnProperty('0')"),
- nxt_string("true") },
-
- { nxt_string("[1,2].hasOwnProperty('2')"),
- nxt_string("false") },
-
- { nxt_string("[].hasOwnProperty('length')"),
- nxt_string("true") },
-
- { nxt_string("[1,2].hasOwnProperty('length')"),
- nxt_string("true") },
-
- { nxt_string("(new Array()).hasOwnProperty('length')"),
- nxt_string("true") },
-
- { nxt_string("(new Array(10)).hasOwnProperty('length')"),
- nxt_string("true") },
-
- { nxt_string("Object.valueOf.hasOwnProperty()"),
- nxt_string("false") },
-
- { nxt_string("1..hasOwnProperty('b')"),
- nxt_string("false") },
-
- { nxt_string("'s'.hasOwnProperty('b')"),
- nxt_string("false") },
-
- { nxt_string("'s'.hasOwnProperty('0')"),
- nxt_string("true") },
-
- { nxt_string("'s'.hasOwnProperty('1')"),
- nxt_string("false") },
-
- { nxt_string("Object.hasOwnProperty('hasOwnProperty')"),
- nxt_string("false") },
-
- { nxt_string("Object.prototype.hasOwnProperty('hasOwnProperty')"),
- nxt_string("true") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:undefined, set:undefined}).a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:1})"),
- nxt_string("TypeError: Getter must be a function") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:undefined}).a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:function(){return 1}}).a"),
- nxt_string("1") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {set:1})"),
- nxt_string("TypeError: Setter must be a function") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {set:undefined}); o.a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {set:undefined}); o.a = 4;"),
- nxt_string("TypeError: Cannot set property \"a\" of object which has only a getter") },
-
- { nxt_string("var o = {a: 0};"
- "Object.defineProperty(o, 'b', {set:function(x){this.a = x / 2;}}); o.b = 4; o.a;"),
- nxt_string("2") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {value:undefined});"
- "Object.defineProperty(o, 'a', {get:undefined})"),
- nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {});"
- "Object.defineProperty(o, 'a', {get:undefined})"),
- nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:undefined});"
- "Object.defineProperty(o, 'a', {get:undefined}).a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:undefined});"
- "Object.defineProperty(o, 'a', {set:undefined}).a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:undefined});"
- "Object.defineProperty(o, 'a', {}); o.a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:undefined});"
- "Object.defineProperty(o, 'a', {set:function(){}})"),
- nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:undefined});"
- "Object.defineProperty(o, 'a', {get:function(){}})"),
- nxt_string("TypeError: Cannot redefine property: \"a\"") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
- "Object.defineProperty(o, 'a', {get:()=>2}); o.a"),
- nxt_string("2") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {set:function(v){this.aa=v;}, configurable:true});"
- "Object.defineProperty(o, 'a', {get:function(){return this.aa}}); o.a = 1; o.a"),
- nxt_string("1") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
- "Object.defineProperty(o, 'a', {value:2}).a"),
- nxt_string("2") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
- "Object.defineProperty(o, 'a', {value:2});"
- "var d = Object.getOwnPropertyDescriptor(o, 'a');"
- "d.get === undefined && d.set === undefined"),
- nxt_string("true") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'a', {value:1, configurable:true});"
- "Object.defineProperty(o, 'a', {get:()=>2});"
- "var d = Object.getOwnPropertyDescriptor(o, 'a');"
- "d.writable === undefined && d.value === undefined"),
- nxt_string("true") },
-
- { nxt_string("Object.defineProperty(Date.prototype, 'year', {get: function() { return this.getFullYear();}});"
- "var d = new Date(0); d.year"),
- nxt_string("1970") },
-
- { nxt_string("var o = [];"
- "Object.defineProperty(o, 'fill', {get:undefined}).fill"),
- nxt_string("undefined") },
-
- { nxt_string("var o = [];"
- "Object.defineProperty(o, 'length', {get:undefined})"),
- nxt_string("TypeError: Cannot redefine property: \"length\"") },
-
- { nxt_string("var o = {};"
- "Object.defineProperty(o, 'foo', {get:()=>10});"
- "Object.preventExtensions(o);Object.isFrozen(o)"),
- nxt_string("true"), },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'r', { get: function() { return this.r_value; } }); o.r_value = 1; o.r;"),
- nxt_string("1") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'rw', { get: function() { return this.rw_value; }, set: function(x) { this.rw_value = x / 2; } }); o.rw = 10; o.rw"),
- nxt_string("5") },
-
- { nxt_string("var o = {}; function foo() {}; Object.defineProperty(o, 'a', {get: foo});"
- "Object.getOwnPropertyDescriptor(o, 'a').get === foo"),
- nxt_string("true") },
-
- { nxt_string("var o = {}; Object.defineProperty(o, 'a', {get: undefined});"
- "JSON.stringify(Object.getOwnPropertyDescriptor(o, 'a')).set"),
- nxt_string("undefined") },
-
- { nxt_string("var p = { a:5 }; var o = Object.create(p);"
- "Object.getPrototypeOf(o) === p"),
- nxt_string("true") },
-
- { nxt_string("var p = { a:5 }; var o = Object.create(p);"
- "Object.getPrototypeOf(o) === o.__proto__"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.create(Object.prototype);"
- "Object.getPrototypeOf(o) === Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("Object.getPrototypeOf(1)"),
- nxt_string("TypeError: cannot convert number argument to object") },
-
- { nxt_string("Object.getPrototypeOf('a')"),
- nxt_string("TypeError: cannot convert string argument to object") },
-
- { nxt_string("var p = {}; var o = Object.create(p);"
- "p.isPrototypeOf(o)"),
- nxt_string("true") },
-
- { nxt_string("var pp = {}; var p = Object.create(pp);"
- "var o = Object.create(p);"
- "pp.isPrototypeOf(o)"),
- nxt_string("true") },
-
- { nxt_string("var p = {}; var o = Object.create(p);"
- "o.isPrototypeOf(p)"),
- nxt_string("false") },
-
- { nxt_string("var p = {}; var o = Object.create(p);"
- "o.isPrototypeOf()"),
- nxt_string("false") },
-
- { nxt_string("Object.valueOf.isPrototypeOf()"),
- nxt_string("false") },
-
- { nxt_string("var p = {}; var o = Object.create(p);"
- "o.isPrototypeOf(1)"),
- nxt_string("false") },
-
- { nxt_string("var p = {}; var o = Object.create(p);"
- "1..isPrototypeOf(p)"),
- nxt_string("false") },
-
- { nxt_string("Object.create(new String('asdf')).length"),
- nxt_string("4") },
-
- { nxt_string("Object.create(Object('123')).length"),
- nxt_string("3") },
-
- { nxt_string("Object.create([1,2]).length"),
- nxt_string("2") },
-
- { nxt_string("Object.create(function(a,b,c){}).length"),
- nxt_string("3") },
-
- { nxt_string("Object.create(Math).hasOwnProperty('abs')"),
- nxt_string("false") },
-
- { nxt_string("var m = Object.create(Math); m.abs = 3;"
- "[m.hasOwnProperty('abs'), m.abs]"),
- nxt_string("true,3") },
-
- { nxt_string("var m = Object.create(Math); m.abs = Math.floor;"
- "[m.hasOwnProperty('abs'), delete m.abs, m.abs(-1)]"),
- nxt_string("true,true,1") },
-
- { nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'a').value"),
- nxt_string("1") },
-
- { nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'a').configurable"),
- nxt_string("true") },
-
- { nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'a').enumerable"),
- nxt_string("true") },
-
- { nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'a').writable"),
- nxt_string("true") },
-
- { nxt_string("Object.getOwnPropertyDescriptor({a:1}, 'b')"),
- nxt_string("undefined") },
-
- { nxt_string("Object.getOwnPropertyDescriptor({}, 'a')"),
- nxt_string("undefined") },
-
- { nxt_string("Object.getOwnPropertyDescriptor(Object.create({a:1}), 'a')"),
- nxt_string("undefined") },
-
- { nxt_string("Object.getOwnPropertyDescriptor([3,4], '1').value"),
- nxt_string("4") },
-
- { nxt_string("Object.getOwnPropertyDescriptor([3,4], 1).value"),
- nxt_string("4") },
-
- { nxt_string("Object.getOwnPropertyDescriptor([], 'length').value"),
- nxt_string("0") },
-
- { nxt_string("Object.getOwnPropertyDescriptor([], '0')"),
- nxt_string("undefined") },
-
- { nxt_string("Object.getOwnPropertyDescriptor([1,2], '1').value"),
- nxt_string("2") },
-
- { nxt_string("Object.getOwnPropertyDescriptor([1,2], new String('1')).value"),
- nxt_string("2") },
-
- { nxt_string("Object.getOwnPropertyDescriptor({undefined:1}, void 0).value"),
- nxt_string("1") },
-
- { nxt_string("Object.getOwnPropertyDescriptor([1,2], 1).value"),
- nxt_string("2") },
-
- { nxt_string("Object.getOwnPropertyDescriptor([1,,,3], '1')"),
- nxt_string("undefined") },
-
- { nxt_string("Object.getOwnPropertyDescriptor([1,2], '3')"),
- nxt_string("undefined") },
-
- { nxt_string("JSON.stringify(Object.getOwnPropertyDescriptor([3,4], 'length'))"),
- nxt_string("{\"value\":2,\"writable\":true,\"enumerable\":false,\"configurable\":false}") },
-
- { nxt_string("Object.getOwnPropertyDescriptor(Array.of, 'length').value"),
- nxt_string("0") },
-
- { nxt_string("Object.getOwnPropertyDescriptor('αβγδ', '1').value"),
- nxt_string("β") },
-
- { nxt_string("Object.getOwnPropertyDescriptor(new String('αβγδ'), '1').value"),
- nxt_string("β") },
-
- { nxt_string("var s = new String('αβγδ'); s.a = 1;"
- "Object.getOwnPropertyDescriptor(s, 'a').value"),
- nxt_string("1") },
-
- { nxt_string("JSON.stringify(Object.getOwnPropertyDescriptor('αβγδ', '2'))"),
- nxt_string("{\"value\":\"γ\",\"writable\":false,\"enumerable\":true,\"configurable\":false}") },
-
- { nxt_string("JSON.stringify(Object.getOwnPropertyDescriptor(new String('abc'), 'length'))"),
- nxt_string("{\"value\":3,\"writable\":false,\"enumerable\":false,\"configurable\":false}") },
-
- { nxt_string("Object.getOwnPropertyDescriptor(1, '0')"),
- nxt_string("undefined") },
-
- { nxt_string("'αβγδ'.propertyIsEnumerable('0')"),
- nxt_string("true") },
-
- { nxt_string("({a:1}).propertyIsEnumerable({toString:function () {return 'a';}})"),
- nxt_string("true") },
-
- { nxt_string("'αβγδ'.propertyIsEnumerable('a')"),
- nxt_string("false") },
-
- { nxt_string("'αβγδ'.propertyIsEnumerable('length')"),
- nxt_string("false") },
-
- { nxt_string("var min = Object.getOwnPropertyDescriptor(Math, 'min').value;"
- "[min(1,2), min(2,1), min(-1,1)]"),
- nxt_string("1,1,-1") },
-
- { nxt_string("Object.getOwnPropertyDescriptor()"),
- nxt_string("TypeError: cannot convert undefined argument to object") },
-
- { nxt_string("Object.getOwnPropertyDescriptor(undefined)"),
- nxt_string("TypeError: cannot convert undefined argument to object") },
-
- { nxt_string("var o = {}; o[void 0] = 'a'; Object.getOwnPropertyDescriptor(o).value"),
- nxt_string("a") },
-
- { nxt_string("var o = {}; o[void 0] = 'a'; Object.getOwnPropertyDescriptor(o, undefined).value"),
- nxt_string("a") },
-
- { nxt_string("Object.getOwnPropertyDescriptors()"),
- nxt_string("TypeError: cannot convert undefined argument to object") },
-
- { nxt_string("typeof Object.getOwnPropertyDescriptors(1)"),
- nxt_string("object") },
-
- { nxt_string("Object.keys(Object.getOwnPropertyDescriptors([]))"),
- nxt_string("length") },
-
- { nxt_string("Object.getOwnPropertyDescriptors(function(a,b,c) {}).length.value"),
- nxt_string("3") },
-
- { nxt_string("Object.values(Object.getOwnPropertyDescriptors('abc'))"
- ".reduce(function(a, x) { return a += x.value; }, '')"),
- nxt_string("abc3") },
-
- { nxt_string("Object.getOwnPropertyNames()"),
- nxt_string("TypeError: cannot convert undefined argument to object") },
-
- { nxt_string("Array.isArray(Object.getOwnPropertyNames({}))"),
- nxt_string("true") },
-
- { nxt_string("Object.getOwnPropertyNames({a:1, b:1, c:1})"),
- nxt_string("a,b,c") },
-
- { nxt_string("Object.getOwnPropertyNames(Object.defineProperty({a:1}, 'b', {}))"),
- nxt_string("a,b") },
-
- { nxt_string("Object.getOwnPropertyNames(Object.defineProperty([], 'b', {}))"),
- nxt_string("b,length") },
-
- { nxt_string("Object.getOwnPropertyNames(Object.defineProperty(new String(), 'b', {}))"),
- nxt_string("b,length") },
-
- { nxt_string("Object.getOwnPropertyNames([1,2,3])"),
- nxt_string("0,1,2,length") },
-
- { nxt_string("Object.getOwnPropertyNames('abc')"),
- nxt_string("0,1,2,length") },
-
- { nxt_string("Object.getOwnPropertyNames(function() {})"),
- nxt_string("length,prototype") },
-
- { nxt_string("Object.getOwnPropertyNames(Array)"),
- nxt_string("name,length,prototype,isArray,of") },
-
- { nxt_string("Object.getOwnPropertyNames(Array.isArray)"),
- nxt_string("name,length") },
-
- { nxt_string("Object.defineProperty(Object.freeze({}), 'b', {})"),
- nxt_string("TypeError: object is not extensible") },
-
- { nxt_string("Object.defineProperties(Object.freeze({}), {b:{}})"),
- nxt_string("TypeError: object is not extensible") },
-
- { nxt_string("Object.freeze()"),
- nxt_string("undefined") },
-
- { nxt_string("var o = Object.freeze({a:1}); o.a = 2"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of object") },
-
- { nxt_string("var o = Object.freeze({a:1}); delete o.a"),
- nxt_string("TypeError: Cannot delete property \"a\" of object") },
-
- { nxt_string("var o = Object.freeze({a:1}); o.b = 1; o.b"),
- nxt_string("TypeError: Cannot add property \"b\", object is not extensible") },
-
- { nxt_string("var o = Object.freeze(Object.create({a:1})); o.a = 2; o.a"),
- nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
- { nxt_string("var o = Object.freeze({a:{b:1}}); o.a.b = 2; o.a.b"),
- nxt_string("2") },
-
- { nxt_string("Object.defineProperty([1,2], 'a', {value:1}).a"),
- nxt_string("1") },
-
- { nxt_string("var a = Object.freeze([1,2]);"
- "Object.defineProperty(a, 'a', {value:1}).a"),
- nxt_string("TypeError: object is not extensible") },
-
- { nxt_string("var a = [1,2]; a.a = 1; Object.freeze(a); delete a.a"),
- nxt_string("TypeError: Cannot delete property \"a\" of array") },
-
- { nxt_string("var a = [1,2]; a.a = 1; Object.freeze(a); a.a = 2"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of array") },
-
- { nxt_string("var a = Object.freeze([1,2]); a.a = 1"),
- nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
- { nxt_string("Object.defineProperty(function() {}, 'a', {value:1}).a"),
- nxt_string("1") },
-
- { nxt_string("var f = Object.freeze(function() {});"
- "Object.defineProperty(f, 'a', {value:1}).a"),
- nxt_string("TypeError: object is not extensible") },
-
- { nxt_string("var f = function() {}; f.a = 1; Object.freeze(f); delete f.a"),
- nxt_string("TypeError: Cannot delete property \"a\" of function") },
-
- { nxt_string("var f = function() {}; f.a = 1; Object.freeze(f); f.a = 2"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of function") },
-
- { nxt_string("var f = Object.freeze(function() {}); f.a = 1"),
- nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
- { nxt_string("Object.defineProperty(new Date(''), 'a', {value:1}).a"),
- nxt_string("1") },
-
- { nxt_string("var d = Object.freeze(new Date(''));"
- "Object.defineProperty(d, 'a', {value:1}).a"),
- nxt_string("TypeError: object is not extensible") },
-
- { nxt_string("var d = new Date(''); d.a = 1; Object.freeze(d);"
- "delete d.a"),
- nxt_string("TypeError: Cannot delete property \"a\" of date") },
-
- { nxt_string("var d = new Date(''); d.a = 1; Object.freeze(d); d.a = 2"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of date") },
-
- { nxt_string("var d = Object.freeze(new Date('')); d.a = 1"),
- nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
- { nxt_string("Object.defineProperty(new RegExp(''), 'a', {value:1}).a"),
- nxt_string("1") },
-
- { nxt_string("var r = Object.freeze(new RegExp(''));"
- "Object.defineProperty(r, 'a', {value:1}).a"),
- nxt_string("TypeError: object is not extensible") },
-
- { nxt_string("var r = new RegExp(''); r.a = 1; Object.freeze(r); delete r.a"),
- nxt_string("TypeError: Cannot delete property \"a\" of regexp") },
-
- { nxt_string("var r = new RegExp(''); r.a = 1; Object.freeze(r); r.a = 2"),
- nxt_string("TypeError: Cannot assign to read-only property \"a\" of regexp") },
-
- { nxt_string("var r = Object.freeze(new RegExp('')); r.a = 1"),
- nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
- { nxt_string("Object.isFrozen({a:1})"),
- nxt_string("false") },
-
- { nxt_string("Object.isFrozen([1,2])"),
- nxt_string("false") },
-
- { nxt_string("Object.isFrozen(function() {})"),
- nxt_string("false") },
-
- { nxt_string("Object.isFrozen(new Date(''))"),
- nxt_string("false") },
-
- { nxt_string("Object.isFrozen(new RegExp(''))"),
- nxt_string("false") },
-
- { nxt_string("Object.isFrozen()"),
- nxt_string("true") },
-
- { nxt_string("Object.isFrozen(1)"),
- nxt_string("true") },
-
- { nxt_string("Object.isFrozen('')"),
- nxt_string("true") },
-
- { nxt_string("Object.isFrozen(Object.defineProperties({}, {a:{value:1}}))"),
- nxt_string("false") },
-
- { nxt_string("var o = Object.defineProperties({}, {a:{}, b:{}});"
- "o = Object.preventExtensions(o);"
- "Object.isFrozen(o)"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.defineProperties({}, {a:{}, b:{writable:1}});"
- "o = Object.preventExtensions(o);"
- "Object.isFrozen(o)"),
- nxt_string("false") },
-
- { nxt_string("var o = Object.defineProperties({}, {a:{writable:1}});"
- "o = Object.preventExtensions(o);"
- "Object.isFrozen(o)"),
- nxt_string("false") },
-
- { nxt_string("var o = Object.defineProperties({}, {a:{configurable:1}});"
- "o = Object.preventExtensions(o);"
- "Object.isFrozen(o)"),
- nxt_string("false") },
-
- { nxt_string("var o = Object.preventExtensions({a:1});"
- "Object.isFrozen(o)"),
- nxt_string("false") },
-
- { nxt_string("var o = Object.freeze({a:1}); Object.isFrozen(o)"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.seal({a:1}); o.a = 2; o.a"),
- nxt_string("2") },
-
- { nxt_string("var o = Object.seal({a:1}); delete o.a"),
- nxt_string("TypeError: Cannot delete property \"a\" of object") },
-
- { nxt_string("var o = Object.seal({a:1}); o.b = 1; o.b"),
- nxt_string("TypeError: Cannot add property \"b\", object is not extensible") },
-
- { nxt_string("var o = Object.seal(Object.create({a:1})); o.a = 2; o.a"),
- nxt_string("TypeError: Cannot add property \"a\", object is not extensible") },
-
- { nxt_string("var o = Object.seal({a:{b:1}}); o.a.b = 2; o.a.b"),
- nxt_string("2") },
-
- { nxt_string("Object.seal()"),
- nxt_string("undefined") },
-
- { nxt_string("Object.seal(1)"),
- nxt_string("1") },
-
- { nxt_string("Object.seal('')"),
- nxt_string("") },
-
- { nxt_string("Object.isSealed({a:1})"),
- nxt_string("false") },
-
- { nxt_string("Object.isSealed([1,2])"),
- nxt_string("false") },
-
- { nxt_string("Object.isSealed(function() {})"),
- nxt_string("false") },
-
- { nxt_string("Object.isSealed(new Date(''))"),
- nxt_string("false") },
-
- { nxt_string("Object.isSealed(new RegExp(''))"),
- nxt_string("false") },
-
- { nxt_string("Object.isSealed()"),
- nxt_string("true") },
-
- { nxt_string("Object.isSealed(1)"),
- nxt_string("true") },
-
- { nxt_string("Object.isSealed('')"),
- nxt_string("true") },
-
- { nxt_string("Object.isSealed(Object.defineProperties({}, {a:{value:1}}))"),
- nxt_string("false") },
-
- { nxt_string("var o = Object.defineProperties({}, {a:{}, b:{}});"
- "o = Object.preventExtensions(o);"
- "Object.isSealed(o)"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.defineProperties({}, {a:{}, b:{writable:1}});"
- "o = Object.preventExtensions(o);"
- "Object.isSealed(o)"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.defineProperties({}, {a:{writable:1}});"
- "o = Object.preventExtensions(o);"
- "Object.isSealed(o)"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.defineProperties({}, {a:{configurable:1}});"
- "o = Object.preventExtensions(o);"
- "Object.isSealed(o)"),
- nxt_string("false") },
-
- { nxt_string("var o = Object.preventExtensions({a:1});"
- "Object.isFrozen(o)"),
- nxt_string("false") },
-
- { nxt_string("var o = Object.freeze({a:1}); Object.isFrozen(o)"),
- nxt_string("true") },
-
- { nxt_string("var o = Object.preventExtensions({a:1});"
- "Object.defineProperty(o, 'b', {value:1})"),
- nxt_string("TypeError: object is not extensible") },
-
- { nxt_string("var o = Object.preventExtensions({a:1});"
- "Object.defineProperties(o, {b:{value:1}})"),
- nxt_string("TypeError: object is not extensible") },
-
- { nxt_string("var o = Object.preventExtensions({a:1}); o.a = 2; o.a"),
- nxt_string("2") },
-
- { nxt_string("var o = Object.preventExtensions({a:1}); delete o.a; o.a"),
- nxt_string("undefined") },
-
- { nxt_string("var o = Object.preventExtensions({a:1}); o.b = 1; o.b"),
- nxt_string("TypeError: Cannot add property \"b\", object is not extensible") },
-
- { nxt_string("Object.preventExtensions()"),
- nxt_string("undefined") },
-
- { nxt_string("Object.preventExtensions(1)"),
- nxt_string("1") },
-
- { nxt_string("Object.preventExtensions('')"),
- nxt_string("") },
-
- { nxt_string("Object.isExtensible({})"),
- nxt_string("true") },
-
- { nxt_string("Object.isExtensible([])"),
- nxt_string("true") },
-
- { nxt_string("Object.isExtensible(function() {})"),
- nxt_string("true") },
-
- { nxt_string("Object.isExtensible(new Date(''))"),
- nxt_string("true") },
-
- { nxt_string("Object.isExtensible(new RegExp(''))"),
- nxt_string("true") },
-
- { nxt_string("Object.isExtensible()"),
- nxt_string("false") },
-
- { nxt_string("Object.isExtensible(1)"),
- nxt_string("false") },
-
- { nxt_string("Object.isExtensible('')"),
- nxt_string("false") },
-
- { nxt_string("Object.isExtensible(Object.preventExtensions({}))"),
- nxt_string("false") },
-
- { nxt_string("Object.isExtensible(Object.preventExtensions([]))"),
- nxt_string("false") },
-
- { nxt_string("Object.isExtensible(Object.freeze({}))"),
- nxt_string("false") },
-
- { nxt_string("Object.isExtensible(Object.freeze([]))"),
- nxt_string("false") },
-
- { nxt_string(
- "var fail;"
- "function isConfigurableMethods(o) {"
- " var except = ["
- " 'prototype',"
- " ];"
- " return Object.getOwnPropertyNames(o)"
- " .filter(v => !except.includes(v)"
- " && typeof o[v] == 'function')"
- " .every(v => Object.getOwnPropertyDescriptor(o, v)"
- " .configurable"
- " || !(fail = `${o.name}.${v}`));"
- "}"
- "["
- " Boolean, Boolean.prototype,"
- " Number, Number.prototype,"
- " String, String.prototype,"
- " Object, Object.prototype,"
- " Array, Array.prototype,"
- " Function, Function.prototype,"
- " RegExp, RegExp.prototype,"
- " Date, Date.prototype,"
- " Error, Error.prototype,"
- " Math,"
- " JSON,"
- "].every(obj => isConfigurableMethods(obj)) || fail"),
-
- nxt_string("true") },
-
- { nxt_string(
- "var fail;"
- "function isWritableMethods(o) {"
- " var except = ["
- " 'prototype',"
- " ];"
- " return Object.getOwnPropertyNames(o)"
- " .filter(v => !except.includes(v)"
- " && typeof o[v] == 'function')"
- " .every(v => Object.getOwnPropertyDescriptor(o, v)"
- " .writable"
- " || !(fail = `${o.name}.${v}`));"
- "}"
- "["
- " Boolean, Boolean.prototype,"
- " Number, Number.prototype,"
- " String, String.prototype,"
- " Object, Object.prototype,"
- " Array, Array.prototype,"
- " Function, Function.prototype,"
- " RegExp, RegExp.prototype,"
- " Date, Date.prototype,"
- " Error, Error.prototype,"
- " Math,"
- " JSON,"
- "].every(obj => isWritableMethods(obj)) || fail"),
-
- nxt_string("true") },
-
- { nxt_string("new Date(undefined)"),
- nxt_string("Invalid Date") },
-
- { nxt_string("new Date(Infinity)"),
- nxt_string("Invalid Date") },
-
- { nxt_string("new Date(NaN)"),
- nxt_string("Invalid Date") },
-
- { nxt_string("new Date(8.65e15)"),
- nxt_string("Invalid Date") },
-
- { nxt_string("new Date(0e0.o0)"),
- nxt_string("Invalid Date") },
-
- { nxt_string("(new Date(8.639e15)).getTime()"),
- nxt_string("8639000000000000") },
-
- { nxt_string("new Date(8.641e15)"),
- nxt_string("Invalid Date") },
-
- { nxt_string("(new Date(null)).getTime()"),
- nxt_string("0") },
-
- { nxt_string("(new Date(86400)).getTime()"),
- nxt_string("86400") },
-
- { nxt_string("var d = new Date(''); d +' '+ d.getTime()"),
- nxt_string("Invalid Date NaN") },
-
- { nxt_string("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
- nxt_string("Thu Jan 01 1970 00:00:00 GMT+0000") },
-
- { nxt_string("var d = new Date({valueOf:()=>86400000}); d = d + ''; d.slice(0, 33)"),
- nxt_string("Fri Jan 02 1970 00:00:00 GMT+0000") },
-
- { nxt_string("(new Date({toString:()=>'2011'})).getTime()"),
- nxt_string("1293840000000") },
-
- { nxt_string("(new Date({valueOf: ()=>86400, toString:()=>'2011'})).getTime()"),
- nxt_string("86400") },
-
- { nxt_string("var d = new Date(1308895200000); d.getTime()"),
- nxt_string("1308895200000") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getTime()"),
- nxt_string("1308941100000") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.valueOf()"),
- nxt_string("1308941100000") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45);"
- "d.toString().slice(0, 33)"),
- nxt_string("Fri Jun 24 2011 18:45:00 GMT+0000") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.toDateString()"),
- nxt_string("Fri Jun 24 2011") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45);"
- "d.toTimeString().slice(0, 17)"),
- nxt_string("18:45:00 GMT+0000") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.toUTCString()"),
- nxt_string("Fri Jun 24 2011 18:45:00 GMT") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
- "d.toISOString()"),
- nxt_string("2011-06-24T18:45:12.625Z") },
-
-#if 0
- /* These tests fail on Solaris: gmtime_r() returns off by one day. */
-
- { nxt_string("var d = new Date(-62167219200000); d.toISOString()"),
- nxt_string("0000-01-01T00:00:00.000Z") },
-
- { nxt_string("var d = new Date(-62135596800000); d.toISOString()"),
- nxt_string("0001-01-01T00:00:00.000Z") },
-
- { nxt_string("var d = new Date(-62198755200000); d.toISOString()"),
- nxt_string("-000001-01-01T00:00:00.000Z") },
-#endif
-
- { nxt_string("Date.UTC(2011, 5, 24, 6, 0)"),
- nxt_string("1308895200000") },
-
- { nxt_string("Date.UTC({valueOf:()=>2011}, 5, 24, 6, 0)"),
- nxt_string("1308895200000") },
-
- { nxt_string("Date.parse()"),
- nxt_string("NaN") },
-
- { nxt_string("Date.parse('2011')"),
- nxt_string("1293840000000") },
-
- { nxt_string("Date.parse('+002011')"),
- nxt_string("1293840000000") },
-
- { nxt_string("Date.parse('2011-06')"),
- nxt_string("1306886400000") },
-
- { nxt_string("Date.parse('2011-06-24')"),
- nxt_string("1308873600000") },
-
- { nxt_string("Date.parse('2011-06-24T06')"),
- nxt_string("NaN") },
-
- { nxt_string("Date.parse('2011-06-24T06:')"),
- nxt_string("NaN") },
-
- { nxt_string("Date.parse('2011-06-24T06:01:')"),
- nxt_string("NaN") },
-
- { nxt_string("Date.parse('2011-06-24T06:01Z')"),
- nxt_string("1308895260000") },
-
- { nxt_string("Date.parse('2011-06-24T06:01:02:')"),
- nxt_string("NaN") },
-
- { nxt_string("Date.parse('2011-06-24T06:01:02Z')"),
- nxt_string("1308895262000") },
-
- { nxt_string("Date.parse('2011-06-24T06:01:02.Z')"),
- nxt_string("NaN") },
-
- { nxt_string("Date.parse('2011-06-24T06:01:02.6Z')"),
- nxt_string("1308895262600") },
-
- { nxt_string("Date.parse('2011-06-24T06:01:02.62Z')"),
- nxt_string("1308895262620") },
-
- { nxt_string("Date.parse('2011-06-24T06:01:02:625Z')"),
- nxt_string("NaN") },
-
- { nxt_string("Date.parse('2011-06-24T06:01:02.625Z')"),
- nxt_string("1308895262625") },
-
- { nxt_string("Date.parse('2011-06-24T06:01:02.6255555Z')"),
- nxt_string("1308895262625") },
-
- { nxt_string("Date.parse('2011-06-24T06:01:02.625555Z5')"),
- nxt_string("NaN") },
-
- { nxt_string("var d = new Date(); var str = d.toISOString();"
- "var diff = Date.parse(str) - Date.parse(str.substring(0, str.length - 1));"
- "d.getTimezoneOffset() == -diff/1000/60"),
- nxt_string("true") },
-
- { nxt_string("Date.parse('24 Jun 2011')"),
- nxt_string("1308873600000") },
-
- { nxt_string("Date.parse('Fri, 24 Jun 2011 18:48')"),
- nxt_string("1308941280000") },
-
- { nxt_string("Date.parse('Fri, 24 Jun 2011 18:48:02')"),
- nxt_string("1308941282000") },
-
- { nxt_string("Date.parse('Fri, 24 Jun 2011 18:48:02 GMT')"),
- nxt_string("1308941282000") },
-
- { nxt_string("Date.parse('Fri, 24 Jun 2011 18:48:02 +1245')"),
- nxt_string("1308895382000") },
-
- { nxt_string("Date.parse('Jun 24 2011')"),
- nxt_string("1308873600000") },
-
- { nxt_string("Date.parse('Fri Jun 24 2011 18:48')"),
- nxt_string("1308941280000") },
-
- { nxt_string("Date.parse('Fri Jun 24 2011 18:48:02')"),
- nxt_string("1308941282000") },
-
- { nxt_string("Date.parse('Fri Jun 24 2011 18:48:02 GMT+1245')"),
- nxt_string("1308895382000") },
-
- /* Jan 1, 1. */
- { nxt_string("Date.parse('+000001-01-01T00:00:00.000Z')"),
- nxt_string("-62135596800000") },
-
- /* Mar 2, 1 BCE. */
- { nxt_string("Date.parse('+000000-03-02T00:00:00.000Z')"),
- nxt_string("-62161948800000") },
-
- /* Mar 1, 1 BCE. */
- { nxt_string("Date.parse('+000000-03-01T00:00:00.000Z')"),
- nxt_string("-62162035200000") },
-
- /* Feb 29, 1 BCE. */
- { nxt_string("Date.parse('+000000-02-29T00:00:00.000Z')"),
- nxt_string("-62162121600000") },
-
- /* Feb 28, 1 BCE. */
- { nxt_string("Date.parse('+000000-02-28T00:00:00.000Z')"),
- nxt_string("-62162208000000") },
-
- /* Jan 1, 1 BCE. */
- { nxt_string("Date.parse('+000000-01-01T00:00:00.000Z')"),
- nxt_string("-62167219200000") },
-
- /* Jan 1, 2 BCE. */
- { nxt_string("Date.parse('-000001-01-01T00:00:00.000Z')"),
- nxt_string("-62198755200000") },
-
- { nxt_string("var d = new Date(); d == Date.parse(d.toISOString())"),
- nxt_string("true") },
-
- { nxt_string("var s = Date(); s === Date(Date.parse(s))"),
- nxt_string("true") },
-
- { nxt_string("var n = Date.now(); n == new Date(n)"),
- nxt_string("true") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getFullYear()"),
- nxt_string("2011") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCFullYear()"),
- nxt_string("2011") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getMonth()"),
- nxt_string("5") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMonth()"),
- nxt_string("5") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getDate()"),
- nxt_string("24") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCDate()"),
- nxt_string("24") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getDay()"),
- nxt_string("5") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCDay()"),
- nxt_string("5") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getHours()"),
- nxt_string("18") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCHours()"),
- nxt_string("18") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getMinutes()"),
- nxt_string("45") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMinutes()"),
- nxt_string("45") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12);"
- "d.getSeconds()"),
- nxt_string("12") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12);"
- "d.getUTCSeconds()"),
- nxt_string("12") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
- "d.getMilliseconds()"),
- nxt_string("625") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
- "d.getUTCMilliseconds()"),
- nxt_string("625") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
- "d.getTimezoneOffset()"),
- nxt_string("0") },
-
- { nxt_string("var d = new Date(); d.setTime(1308895200000); d.getTime()"),
- nxt_string("1308895200000") },
-
- { nxt_string("var d = new Date(1308895201625); d.setMilliseconds(5003);"
- "d.getTime()"),
- nxt_string("1308895206003") },
-
- { nxt_string("var d = new Date(1308895201625); d.setSeconds(2, 5003);"
- "d.getTime()"),
- nxt_string("1308895207003") },
-
- { nxt_string("var d = new Date(1308895201625); d.setSeconds(2);"
- "d.getTime()"),
- nxt_string("1308895202625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setMinutes(3, 2, 5003);"
- "d.getTime()"),
- nxt_string("1308895387003") },
-
- { nxt_string("var d = new Date(1308895323625); d.setMinutes(3, 2);"
- "d.getTime()"),
- nxt_string("1308895382625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setMinutes(3);"
- "d.getTime()"),
- nxt_string("1308895383625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCMinutes(3, 2, 5003);"
- "d.getTime()"),
- nxt_string("1308895387003") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCMinutes(3, 2);"
- "d.getTime()"),
- nxt_string("1308895382625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCMinutes(3);"
- "d.getTime()"),
- nxt_string("1308895383625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3, 2, 5003);"
- "d.getTime()"),
- nxt_string("1308945787003") },
-
- { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3, 2);"
- "d.getTime()"),
- nxt_string("1308945782625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3);"
- "d.getTime()"),
- nxt_string("1308945783625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setHours(20);"
- "d.getTime()"),
- nxt_string("1308945723625") },
-
- { nxt_string("var d = new Date(1308895323625);"
- "d.setUTCHours(20, 3, 2, 5003); d.getTime()"),
- nxt_string("1308945787003") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCHours(20, 3, 2);"
- "d.getTime()"),
- nxt_string("1308945782625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCHours(20, 3);"
- "d.getTime()"),
- nxt_string("1308945783625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCHours(20);"
- "d.getTime()"),
- nxt_string("1308945723625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setDate(10);"
- "d.getTime()"),
- nxt_string("1307685723625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCDate(10);"
- "d.getTime()"),
- nxt_string("1307685723625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setMonth(2, 10);"
- "d.getTime()"),
- nxt_string("1299736923625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCMonth(2, 10);"
- "d.getTime()"),
- nxt_string("1299736923625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setMonth(2);"
- "d.getTime()"),
- nxt_string("1300946523625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCMonth(2);"
- "d.getTime()"),
- nxt_string("1300946523625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setFullYear(2010, 2, 10);"
- "d.getTime()"),
- nxt_string("1268200923625") },
-
- { nxt_string("var d = new Date(1308895323625);"
- "d.setUTCFullYear(2010, 2, 10); d.getTime()"),
- nxt_string("1268200923625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setFullYear(2010, 2);"
- "d.getTime()"),
- nxt_string("1269410523625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCFullYear(2010, 2);"
- "d.getTime()"),
- nxt_string("1269410523625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setFullYear(2010);"
- "d.getTime()"),
- nxt_string("1277359323625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setUTCFullYear(2010);"
- "d.getTime()"),
- nxt_string("1277359323625") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
- "d.toJSON(1)"),
- nxt_string("2011-06-24T18:45:12.625Z") },
-
- { nxt_string("var o = { toISOString: function() { return 'OK' } };"
- "Date.prototype.toJSON.call(o, 1)"),
- nxt_string("OK") },
-
- { nxt_string("var d = new Date; d.__proto__"),
- nxt_string("Invalid Date") },
-
- { nxt_string("var d = new Date(); d.__proto__"),
- nxt_string("Invalid Date") },
-
- { nxt_string("var d = new Date(); d.__proto__ === Date.prototype"),
- nxt_string("true") },
-
- { nxt_string("new Date(NaN)"),
- nxt_string("Invalid Date") },
-
- { nxt_string("[0].map(new Date().getDate)"),
- nxt_string("TypeError: cannot convert undefined to date") },
-
- { nxt_string("new Date(eval)"),
- nxt_string("Invalid Date") },
-
- { nxt_string("Date.UTC(eval)"),
- nxt_string("NaN") },
-
- { nxt_string("Date.name"),
- nxt_string("Date") },
-
- { nxt_string("Date.length"),
- nxt_string("7") },
-
- { nxt_string("Date.__proto__ === Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("Date.prototype.constructor === Date"),
- nxt_string("true") },
-
- { nxt_string("Date.prototype.hasOwnProperty('constructor')"),
- nxt_string("true") },
-
- { nxt_string("Date.prototype.__proto__ === Object.prototype"),
- nxt_string("true") },
-
- { nxt_string("Date.prototype"),
- nxt_string("Invalid Date") },
-
- { nxt_string("Date.prototype.valueOf()"),
- nxt_string("NaN") },
-
- { nxt_string("Date.constructor === Function"),
- nxt_string("true") },
-
- /* eval(). */
-
- { nxt_string("eval.name"),
- nxt_string("eval") },
-
- { nxt_string("eval.length"),
- nxt_string("1") },
-
- { nxt_string("eval.prototype"),
- nxt_string("undefined") },
-
- { nxt_string("eval.__proto__ === Function.prototype"),
- nxt_string("true") },
-
- { nxt_string("eval.constructor === Function"),
- nxt_string("true") },
-
- { nxt_string("eval()"),
- nxt_string("InternalError: Not implemented") },
-
- /* Math. */
-
- { nxt_string("Math.PI"),
- nxt_string("3.141592653589793") },
-
- { nxt_string("Math.abs()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.abs(5)"),
- nxt_string("5") },
-
- { nxt_string("Math.abs(-5)"),
- nxt_string("5") },
-
- { nxt_string("Math.abs('5.0')"),
- nxt_string("5") },
-
- { nxt_string("Math.abs('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.acos()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.acos(NaN)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.acos('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.acos(1.1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.acos(-1.1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.acos('1')"),
- nxt_string("0") },
-
- { nxt_string("Math.acos(0) - Math.PI/2"),
- nxt_string("0") },
-
- { nxt_string("Math.acosh()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.acosh('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.acosh(0.9)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.acosh(1)"),
- nxt_string("0") },
-
- { nxt_string("Math.acosh('Infinity')"),
- nxt_string("Infinity") },
-
- /*
- * The difference is Number.EPSILON on Linux/i686
- * and zero on other platforms.
- */
- { nxt_string("Math.abs(Math.acosh((1/Math.E + Math.E)/2) - 1)"
- " <= Number.EPSILON"),
- nxt_string("true") },
-
- { nxt_string("Math.asin()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.asin(NaN)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.asin('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.asin(1.1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.asin(-1.1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.asin(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.asin('-0')"),
- nxt_string("-0") },
-
- { nxt_string("Math.asin(1) - Math.PI/2"),
- nxt_string("0") },
-
- { nxt_string("Math.asinh()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.asinh('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.asinh(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.asinh('-0')"),
- nxt_string("-0") },
-
- { nxt_string("Math.asinh(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.asinh(-Infinity)"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.asinh((Math.E - 1/Math.E)/2)"),
- nxt_string("1") },
-
- { nxt_string("Math.atan()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.atan(NaN)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.atan('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.atan('Infinity') - Math.PI/2"),
- nxt_string("0") },
-
- { nxt_string("Math.atan(-Infinity) + Math.PI/2"),
- nxt_string("0") },
-
- { nxt_string("Math.atan(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.atan('-0')"),
- nxt_string("-0") },
-
- { nxt_string("Math.atan(1) - Math.PI/4"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.atan2(1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.atan2('abc', 1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.atan2(1, 0) - Math.PI/2"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2('1', -0) - Math.PI/2"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(0, '1')"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(0, 0)"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(0, -0) - Math.PI"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2('0', -1) - Math.PI"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(-0, '0.1')"),
- nxt_string("-0") },
-
- { nxt_string("Math.atan2(-0, 0)"),
- nxt_string("-0") },
-
- { nxt_string("Math.atan2(-0, -0) + Math.PI"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2('-0', '-1') + Math.PI"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(-0.1, 0) + Math.PI/2"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(-1, -0) + Math.PI/2"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(1, 'Infinity')"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(0.1, -Infinity) - Math.PI"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(-1, Infinity)"),
- nxt_string("-0") },
-
- { nxt_string("Math.atan2('-0.1', -Infinity) + Math.PI"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(Infinity, -5) - Math.PI/2"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(-Infinity, 5) + Math.PI/2"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2('Infinity', 'Infinity') - Math.PI/4"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(Infinity, -Infinity) - 3*Math.PI/4"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(-Infinity, 'Infinity') + Math.PI/4"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2('-Infinity', -Infinity) + 3*Math.PI/4"),
- nxt_string("0") },
-
- { nxt_string("Math.atan2(1, 1) - Math.atan2(-5, -5) - Math.PI"),
- nxt_string("0") },
-
- { nxt_string("Math.atanh()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.atanh('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.atanh(-1.1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.atanh(1.1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.atanh(1)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.atanh('-1')"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.atanh(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.atanh(-0)"),
- nxt_string("-0") },
-
- /*
- * The difference is Number.EPSILON on Linux/i686
- * and zero on other platforms.
- */
- { nxt_string("Math.abs(1 - Math.atanh((Math.E - 1)/(Math.E + 1)) * 2)"
- " <= Number.EPSILON"),
- nxt_string("true") },
-
- { nxt_string("Math.cbrt()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.cbrt('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.cbrt(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.cbrt('-0')"),
- nxt_string("-0") },
-
- { nxt_string("Math.cbrt(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.cbrt(-Infinity)"),
- nxt_string("-Infinity") },
-
- { nxt_string("(Math.cbrt('27') - 3) < 1e-15"),
- nxt_string("true") },
-
- { nxt_string("Math.cbrt(-1)"),
- nxt_string("-1") },
-
- { nxt_string("Math.ceil()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.ceil('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.ceil(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.ceil('-0')"),
- nxt_string("-0") },
-
- { nxt_string("Math.ceil('Infinity')"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.ceil(-Infinity)"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.ceil(-0.9)"),
- nxt_string("-0") },
-
- { nxt_string("Math.ceil(3.1)"),
- nxt_string("4") },
-
- { nxt_string("Math.clz32()"),
- nxt_string("32") },
-
- { nxt_string("Math.clz32('abc')"),
- nxt_string("32") },
-
- { nxt_string("Math.clz32(NaN)"),
- nxt_string("32") },
-
- { nxt_string("Math.clz32(Infinity)"),
- nxt_string("32") },
-
- { nxt_string("Math.clz32('1')"),
- nxt_string("31") },
-
- { nxt_string("Math.clz32(0)"),
- nxt_string("32") },
-
- { nxt_string("Math.clz32('65535')"),
- nxt_string("16") },
-
- { nxt_string("Math.clz32(-1)"),
- nxt_string("0") },
-
- { nxt_string("Math.clz32(4294967298)"),
- nxt_string("30") },
-
- { nxt_string("Math.cos()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.cos('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.cos('0')"),
- nxt_string("1") },
-
- { nxt_string("Math.cos(-0)"),
- nxt_string("1") },
-
- { nxt_string("Math.cos(Infinity)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.cos(-Infinity)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.cos(Math.PI*2)"),
- nxt_string("1") },
-
- { nxt_string("Math.cosh()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.cosh('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.cosh('0')"),
- nxt_string("1") },
-
- { nxt_string("Math.cosh(-0)"),
- nxt_string("1") },
-
- { nxt_string("Math.cosh(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.cosh(-Infinity)"),
- nxt_string("Infinity") },
-
- /*
- * The difference is Number.EPSILON on FreeBSD
- * and zero on other platforms.
- */
- { nxt_string("Math.abs(Math.cosh(1) - (1/Math.E + Math.E)/2)"
- " <= Number.EPSILON"),
- nxt_string("true") },
-
- { nxt_string("Math.exp()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.exp('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.exp('0')"),
- nxt_string("1") },
-
- { nxt_string("Math.exp(-0)"),
- nxt_string("1") },
-
- { nxt_string("Math.exp(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.exp(-Infinity)"),
- nxt_string("0") },
-
- /*
- * The difference is 2 * Number.EPSILON on FreeBSD
- * and zero on other platforms.
- */
- { nxt_string("Math.abs(Math.exp(1) - Math.E) <= 2 * Number.EPSILON"),
- nxt_string("true") },
-
- { nxt_string("Math.expm1()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.expm1('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.expm1('0')"),
- nxt_string("0") },
-
- { nxt_string("Math.expm1(-0)"),
- nxt_string("-0") },
-
- { nxt_string("Math.expm1(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.expm1(-Infinity)"),
- nxt_string("-1") },
-
- /*
- * The difference is 2 * Number.EPSILON on FreeBSD, Solaris,
- * and MacOSX and zero on other platforms.
- */
- { nxt_string("Math.abs(1 + Math.expm1(1) - Math.E) <= 2 * Number.EPSILON"),
- nxt_string("true") },
-
- { nxt_string("Math.floor()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.floor('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.floor(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.floor('-0')"),
- nxt_string("-0") },
-
- { nxt_string("Math.floor('Infinity')"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.floor(-Infinity)"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.floor(0.9)"),
- nxt_string("0") },
-
- { nxt_string("Math.floor(-3.1)"),
- nxt_string("-4") },
-
- { nxt_string("Math.fround()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.fround('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.fround(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.fround('-0')"),
- nxt_string("-0") },
-
- { nxt_string("Math.fround('Infinity')"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.fround(-Infinity)"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.fround('-1.5')"),
- nxt_string("-1.5") },
-
- { nxt_string("Math.fround(16777216)"),
- nxt_string("16777216") },
-
- { nxt_string("Math.fround(-16777217)"),
- nxt_string("-16777216") },
-
- { nxt_string("Math.hypot()"),
- nxt_string("0") },
-
- { nxt_string("Math.hypot(1, 2, 'abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.hypot(1, NaN, 3)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.hypot(1, NaN, -Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.hypot(-42)"),
- nxt_string("42") },
-
- { nxt_string("Math.hypot(8, -15)"),
- nxt_string("17") },
-
- { nxt_string("Math.hypot(3, -4, 12.0, '84', 132)"),
- nxt_string("157") },
-
- { nxt_string("Math.imul()"),
- nxt_string("0") },
-
- { nxt_string("Math.imul(1)"),
- nxt_string("0") },
-
- { nxt_string("Math.imul('a', 1)"),
- nxt_string("0") },
-
- { nxt_string("Math.imul(1, NaN)"),
- nxt_string("0") },
-
- { nxt_string("Math.imul(2, '3')"),
- nxt_string("6") },
-
- { nxt_string("Math.imul('3.9', -2.1)"),
- nxt_string("-6") },
-
- { nxt_string("Math.imul(2, 2147483647)"),
- nxt_string("-2") },
-
- { nxt_string("Math.imul(Number.MAX_SAFE_INTEGER, 2)"),
- nxt_string("-2") },
-
- { nxt_string("Math.imul(1, Number.MAX_SAFE_INTEGER + 1)"),
- nxt_string("0") },
-
- { nxt_string("Math.imul(2, Number.MIN_SAFE_INTEGER)"),
- nxt_string("2") },
-
- { nxt_string("Math.imul(Number.MIN_SAFE_INTEGER - 1, 1)"),
- nxt_string("0") },
-
- { nxt_string("Math.imul(2, 4294967297)"),
- nxt_string("2") },
-
- { nxt_string("Math.imul(-4294967297, 4294967297)"),
- nxt_string("-1") },
-
- { nxt_string("Math.imul(4294967297, -4294967298)"),
- nxt_string("-2") },
-
- { nxt_string("Math.imul(-4294967290, 4294967290)"),
- nxt_string("-36") },
-
- { nxt_string("Math.imul(-Infinity, 1)"),
- nxt_string("0") },
-
- { nxt_string("Math.imul(1, Infinity)"),
- nxt_string("0") },
-
- { nxt_string("Math.imul(Number.MAX_VALUE, 1)"),
- nxt_string("0") },
-
- { nxt_string("Math.imul(1, -Number.MAX_VALUE)"),
- nxt_string("0") },
-
- { nxt_string("Math.log()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log(-1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log(0)"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.log('-0')"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.log(1)"),
- nxt_string("0") },
-
- { nxt_string("Math.log(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.log(Math.E)"),
- nxt_string("1") },
-
- { nxt_string("Math.log10()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log10('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log10(-1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log10(0)"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.log10('-0')"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.log10(1)"),
- nxt_string("0") },
-
- { nxt_string("Math.log10(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.log10(1000)"),
- nxt_string("3") },
-
- { nxt_string("Math.log1p()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log1p('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log1p(-2)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log1p('-1')"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.log1p(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.log1p(-0)"),
- nxt_string("-0") },
-
- { nxt_string("Math.log1p(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.log1p(Math.E - 1)"),
- nxt_string("1") },
-
- { nxt_string("Math.log2()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log2('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log2(-1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.log2(0)"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.log2('-0')"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.log2(1)"),
- nxt_string("0") },
-
- { nxt_string("Math.log2(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.log2(128)"),
- nxt_string("7") },
-
- { nxt_string("Math.max()"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.max(null)"),
- nxt_string("0") },
-
- { nxt_string("Math.max(undefined)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.max('1', '2', '5')"),
- nxt_string("5") },
-
- { nxt_string("Math.max(5, {valueOf: function () {return 10}}, 6)"),
- nxt_string("10") },
-
- { nxt_string("Math.max(5, {valueOf: function () {return 10}}, 20)"),
- nxt_string("20") },
-
- { nxt_string("Math.max(5, undefined, 20)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.max(-10, null, -30)"),
- nxt_string("0") },
-
- { nxt_string("Math.min()"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.min(null)"),
- nxt_string("0") },
-
- { nxt_string("Math.min(undefined)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.min('1', '2', '5')"),
- nxt_string("1") },
-
- { nxt_string("Math.pow(2, 5)"),
- nxt_string("32") },
-
- { nxt_string("Math.pow(2)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.pow()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.pow(1, NaN)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.pow(3, NaN)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.pow('a', -0)"),
- nxt_string("1") },
-
- { nxt_string("Math.pow(1.1, Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.pow(-1.1, -Infinity)"),
- nxt_string("0") },
-
- { nxt_string("Math.pow(-1, Infinity)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.pow(1, -Infinity)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.pow(-0.9, Infinity)"),
- nxt_string("0") },
-
- { nxt_string("Math.pow(0.9, -Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.pow('Infinity', 0.1)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.pow(Infinity, '-0.1')"),
- nxt_string("0") },
-
- { nxt_string("Math.pow(-Infinity, 3)"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.pow('-Infinity', '3.1')"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.pow(-Infinity, '-3')"),
- nxt_string("-0") },
-
- { nxt_string("Math.pow('-Infinity', -2)"),
- nxt_string("0") },
-
- { nxt_string("Math.pow('0', 0.1)"),
- nxt_string("0") },
-
-#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
- { nxt_string("Math.pow(0, '-0.1')"),
- nxt_string("Infinity") },
-#endif
-
- { nxt_string("Math.pow(-0, 3)"),
- nxt_string("-0") },
-
- { nxt_string("Math.pow('-0', '3.1')"),
- nxt_string("0") },
-
- { nxt_string("Math.pow(-0, '-3')"),
- nxt_string("-Infinity") },
-
-#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
- { nxt_string("Math.pow('-0', -2)"),
- nxt_string("Infinity") },
-#endif
-
- { nxt_string("Math.pow(-3, 0.1)"),
- nxt_string("NaN") },
-
-#if (!NXT_HAVE_MEMORY_SANITIZER) /* intentional use of uninitialized stack */
- { nxt_string("var a = Math.random(); a >= 0 && a < 1"),
- nxt_string("true") },
-#endif
-
- { nxt_string("Math.round()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.round('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.round(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.round('-0')"),
- nxt_string("-0") },
-
- { nxt_string("Math.round('Infinity')"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.round(-Infinity)"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.round(0.4)"),
- nxt_string("0") },
-
- { nxt_string("Math.round('0.5')"),
- nxt_string("1") },
-
- { nxt_string("Math.round('-0.4')"),
- nxt_string("-0") },
-
- { nxt_string("Math.round(-0.5)"),
- nxt_string("-1") },
-
- { nxt_string("Math.sign(5)"),
- nxt_string("1") },
-
- { nxt_string("Math.sign(-5)"),
- nxt_string("-1") },
-
- { nxt_string("Math.sign(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.sign(-0.0)"),
- nxt_string("-0") },
-
- { nxt_string("Math.sign(NaN)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sign()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sin()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sin('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sin('0')"),
- nxt_string("0") },
-
- { nxt_string("Math.sin(-0)"),
- nxt_string("-0") },
-
- { nxt_string("Math.sin(Infinity)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sin(-Infinity)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sin(-Math.PI/2)"),
- nxt_string("-1") },
-
- { nxt_string("Math.sinh()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sinh('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sinh('0')"),
- nxt_string("0") },
-
- { nxt_string("Math.sinh(-0)"),
- nxt_string("-0") },
-
- { nxt_string("Math.sinh(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.sinh(-Infinity)"),
- nxt_string("-Infinity") },
-
- /*
- * The difference is Number.EPSILON on Solaris
- * and zero on other platforms.
- */
- { nxt_string("Math.abs(Math.sinh(1) - (Math.E - 1/Math.E)/2)"
- " <= Number.EPSILON"),
- nxt_string("true") },
-
- { nxt_string("Math.sqrt()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sqrt('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sqrt('0')"),
- nxt_string("0") },
-
- { nxt_string("Math.sqrt(-0)"),
- nxt_string("-0") },
-
- { nxt_string("Math.sqrt(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.sqrt(-0.1)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.sqrt('9.0')"),
- nxt_string("3") },
-
- { nxt_string("Math.tan()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.tan('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.tan('0')"),
- nxt_string("0") },
-
- { nxt_string("Math.tan(-0)"),
- nxt_string("-0") },
-
- { nxt_string("Math.tan(Infinity)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.tan(-Infinity)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.tan(Math.PI/3) + Math.tan(-Math.PI/3)"),
- nxt_string("0") },
-
- { nxt_string("Math.tanh()"),
- nxt_string("NaN") },
-
- { nxt_string("Math.tanh('abc')"),
- nxt_string("NaN") },
-
- { nxt_string("Math.tanh('0')"),
- nxt_string("0") },
-
- { nxt_string("Math.tanh(-0)"),
- nxt_string("-0") },
-
- { nxt_string("Math.tanh(Infinity)"),
- nxt_string("1") },
-
- { nxt_string("Math.tanh(-Infinity)"),
- nxt_string("-1") },
-
- { nxt_string("Math.tanh(0.5) - (Math.E - 1)/(Math.E + 1)"),
- nxt_string("0") },
-
- { nxt_string("Math.trunc(3.9)"),
- nxt_string("3") },
-
- { nxt_string("Math.trunc(-3.9)"),
- nxt_string("-3") },
-
- { nxt_string("Math.trunc(0)"),
- nxt_string("0") },
-
- { nxt_string("Math.trunc(-0)"),
- nxt_string("-0") },
-
- { nxt_string("Math.trunc(0.9)"),
- nxt_string("0") },
-
- { nxt_string("Math.trunc(-0.9)"),
- nxt_string("-0") },
-
- { nxt_string("Math.trunc(Infinity)"),
- nxt_string("Infinity") },
-
- { nxt_string("Math.trunc(-Infinity)"),
- nxt_string("-Infinity") },
-
- { nxt_string("Math.trunc(NaN)"),
- nxt_string("NaN") },
-
- { nxt_string("Math.trunc()"),
- nxt_string("NaN") },
-
- /* ES5FIX: "[object Math]". */
-
- { nxt_string("Math"),
- nxt_string("[object Object]") },
-
- { nxt_string("Math.x = function (x) {return 2*x;}; Math.x(3)"),
- nxt_string("6") },
-
- { nxt_string("isNaN"),
- nxt_string("[object Function]") },
-
- { nxt_string("isNaN.name"),
- nxt_string("isNaN") },
-
- { nxt_string("isNaN.length"),
- nxt_string("1") },
-
- { nxt_string("isNaN()"),
- nxt_string("true") },
-
- { nxt_string("isNaN(123)"),
- nxt_string("false") },
-
- { nxt_string("isNaN('123')"),
- nxt_string("false") },
-
- { nxt_string("isNaN('Infinity')"),
- nxt_string("false") },
-
- { nxt_string("isNaN('abc')"),
- nxt_string("true") },
-
- { nxt_string("isFinite"),
- nxt_string("[object Function]") },
-
- { nxt_string("isFinite.name"),
- nxt_string("isFinite") },
-
- { nxt_string("isFinite.length"),
- nxt_string("1") },
-
- { nxt_string("isFinite()"),
- nxt_string("false") },
-
- { nxt_string("isFinite(123)"),
- nxt_string("true") },
-
- { nxt_string("isFinite('123')"),
- nxt_string("true") },
-
- { nxt_string("isFinite('Infinity')"),
- nxt_string("false") },
-
- { nxt_string("isFinite('abc')"),
- nxt_string("false") },
-
- { nxt_string("parseInt.name"),
- nxt_string("parseInt") },
-
- { nxt_string("parseInt.length"),
- nxt_string("2") },
-
- { nxt_string("parseInt('12345abc')"),
- nxt_string("12345") },
-
- { nxt_string("parseInt('123', 0)"),
- nxt_string("123") },
-
- { nxt_string("parseInt('0XaBc', 0)"),
- nxt_string("2748") },
-
- { nxt_string("parseInt(' 123')"),
- nxt_string("123") },
-
- { nxt_string("parseInt('1010', 2)"),
- nxt_string("10") },
-
- { nxt_string("parseInt('aBc', 16)"),
- nxt_string("2748") },
-
- { nxt_string("parseInt('0XaBc')"),
- nxt_string("2748") },
-
- { nxt_string("parseInt('-0xabc')"),
- nxt_string("-2748") },
-
- { nxt_string("parseInt('njscript', 36)"),
- nxt_string("1845449130881") },
-
- { nxt_string("parseInt('0x')"),
- nxt_string("NaN") },
-
- { nxt_string("parseInt('z')"),
- nxt_string("NaN") },
-
- { nxt_string("parseInt('0xz')"),
- nxt_string("NaN") },
-
- { nxt_string("parseInt('0x', 16)"),
- nxt_string("NaN") },
-
- { nxt_string("parseInt('0x', 33)"),
- nxt_string("0") },
-
- { nxt_string("parseInt('0x', 34)"),
- nxt_string("33") },
-
- { nxt_string("parseInt('0', 1)"),
- nxt_string("NaN") },
-
- { nxt_string("parseInt('0', 37)"),
- nxt_string("NaN") },
-
- { nxt_string("1/parseInt('-0')"),
- nxt_string("-Infinity") },
-
- { nxt_string("parseFloat.name"),
- nxt_string("parseFloat") },
-
- { nxt_string("parseFloat.length"),
- nxt_string("1") },
-
- { nxt_string("parseFloat('12345abc')"),
- nxt_string("12345") },
-
- { nxt_string("parseFloat('0x')"),
- nxt_string("0") },
-
- { nxt_string("parseFloat('0xff')"),
- nxt_string("0") },
-
- { nxt_string("parseFloat('Infinity')"),
- nxt_string("Infinity") },
-
- { nxt_string("parseFloat(' Infinityzz')"),
- nxt_string("Infinity") },
-
- { nxt_string("parseFloat('Infinit')"),
- nxt_string("NaN") },
-
- { nxt_string("parseFloat('5.7e1')"),
- nxt_string("57") },
-
- { nxt_string("parseFloat('-5.7e-1')"),
- nxt_string("-0.57") },
-
- { nxt_string("parseFloat('-5.e-1')"),
- nxt_string("-0.5") },
-
- { nxt_string("parseFloat('5.7e+01')"),
- nxt_string("57") },
-
- { nxt_string("parseFloat(' 5.7e+01abc')"),
- nxt_string("57") },
-
- { nxt_string("parseFloat('-5.7e-1abc')"),
- nxt_string("-0.57") },
-
- { nxt_string("parseFloat('-5.7e')"),
- nxt_string("-5.7") },
-
- { nxt_string("parseFloat('-5.7e+')"),
- nxt_string("-5.7") },
-
- { nxt_string("parseFloat('-5.7e+abc')"),
- nxt_string("-5.7") },
-
- /* JSON.parse() */
-
- { nxt_string("JSON.parse('null')"),
- nxt_string("null") },
-
- { nxt_string("JSON.parse('true')"),
- nxt_string("true") },
-
- { nxt_string("JSON.parse('false')"),
- nxt_string("false") },
-
- { nxt_string("JSON.parse('0')"),
- nxt_string("0") },
-
- { nxt_string("JSON.parse('-1234.56e2')"),
- nxt_string("-123456") },
-
- { nxt_string("typeof(JSON.parse('true'))"),
- nxt_string("boolean") },
-
- { nxt_string("typeof(JSON.parse('false'))"),
- nxt_string("boolean") },
-
- { nxt_string("typeof(JSON.parse('1'))"),
- nxt_string("number") },
-
- { nxt_string("typeof(JSON.parse('\"\"'))"),
- nxt_string("string") },
-
- { nxt_string("typeof(JSON.parse('{}'))"),
- nxt_string("object") },
-
- { nxt_string("typeof(JSON.parse('[]'))"),
- nxt_string("object") },
-
- { nxt_string("JSON.parse('\"abc\"')"),
- nxt_string("abc") },
-
- { nxt_string("JSON.parse('\"\\\\\"\"')"),
- nxt_string("\"") },
-
- { nxt_string("JSON.parse('\"\\\\n\"')"),
- nxt_string("\n") },
-
- { nxt_string("JSON.parse('\"\\\\t\"')"),
- nxt_string("\t") },
-
- { nxt_string("JSON.parse('\"ab\\\\\"c\"')"),
- nxt_string("ab\"c") },
-
- { nxt_string("JSON.parse('\"abcdefghijklmopqr\\\\\"s\"')"),
- nxt_string("abcdefghijklmopqr\"s") },
-
- { nxt_string("JSON.parse('\"ab\\\\\"c\"').length"),
- nxt_string("4") },
-
- { nxt_string("JSON.parse('\"аб\\\\\"в\"')"),
- nxt_string("аб\"в") },
-
- { nxt_string("JSON.parse('\"аб\\\\\"в\"').length"),
- nxt_string("4") },
-
- { nxt_string("JSON.parse('\"абвгдеёжзийкл\"').length"),
- nxt_string("13") },
-
- { nxt_string("JSON.parse('[\"' + 'α'.repeat(33) + '\"]')[0][32]"),
- nxt_string("α") },
-
- { nxt_string("JSON.parse('\"\\\\u03B1\"')"),
- nxt_string("α") },
-
- { nxt_string("JSON.parse('\"\\\\uD801\\\\uDC00\"')"),
- nxt_string("𐐀") },
-
- { nxt_string("JSON.parse('\"\\\\u03B1\"') == JSON.parse('\"\\\\u03b1\"')"),
- nxt_string("true") },
-
- { nxt_string("JSON.parse('\"\\\\u03B1\"').length"),
- nxt_string("1") },
-
- { nxt_string("JSON.parse('{\"a\":1}').a"),
- nxt_string("1") },
-
- { nxt_string("JSON.parse('{\"a\":1,\"a\":2}').a"),
- nxt_string("2") },
-
- { nxt_string("JSON.parse('{ \"a\" : \"b\" }').a"),
- nxt_string("b") },
-
- { nxt_string("JSON.parse('{\"a\":{\"b\":1}}').a.b"),
- nxt_string("1") },
-
- { nxt_string("JSON.parse('[{}, true ,1.1e2, {\"a\":[3,\"b\"]}]')[3].a[1]"),
- nxt_string("b") },
-
- { nxt_string("var o = JSON.parse('{\"a\":2}');"
- "Object.getOwnPropertyDescriptor(o, 'a').configurable"),
- nxt_string("true") },
-
- { nxt_string("var o = JSON.parse('{\"a\":2}');"
- "Object.getOwnPropertyDescriptor(o, 'a').writable"),
- nxt_string("true") },
-
- { nxt_string("var o = JSON.parse('{\"a\":2}');"
- "Object.getOwnPropertyDescriptor(o, 'a').enumerable"),
- nxt_string("true") },
-
- { nxt_string("var o = JSON.parse('{\"a\":2}');"
- "o.a = 3; o.a"),
- nxt_string("3") },
-
- { nxt_string("var o = JSON.parse('{\"a\":2}');"
- "o.b = 3; o.b"),
- nxt_string("3") },
-
- { nxt_string("JSON.parse('2') || 10"),
- nxt_string("2") },
-
- { nxt_string("JSON.parse('0') || 10"),
- nxt_string("10") },
-
- { nxt_string("JSON.parse('-0') || 10"),
- nxt_string("10") },
-
- { nxt_string("JSON.parse('\"a\"') || 10"),
- nxt_string("a") },
-
- { nxt_string("JSON.parse('\"\"') || 10"),
- nxt_string("10") },
-
- { nxt_string("JSON.parse('true') || 10"),
- nxt_string("true") },
-
- { nxt_string("JSON.parse('false') || 10"),
- nxt_string("10") },
-
- { nxt_string("JSON.parse('null') || 10"),
- nxt_string("10") },
-
- { nxt_string("var o = JSON.parse('{}', function(k, v) {return v;}); o"),
- nxt_string("[object Object]") },
-
- { nxt_string("var o = JSON.parse('{\"a\":2, \"b\":4, \"a\":{}}',"
- " function(k, v) {return undefined;});"
- "o"),
- nxt_string("undefined") },
-
- { nxt_string("var o = JSON.parse('{\"a\":2, \"c\":4, \"b\":\"x\"}',"
- " function(k, v) {if (k === '' || typeof v === 'number') return v });"
- "Object.keys(o)"),
- nxt_string("a,c") },
-
- { nxt_string("var o = JSON.parse('{\"a\":2, \"b\":{}}',"
- " function(k, v) {return k;});"
- "o+typeof(o)"),
- nxt_string("string") },
-
- { nxt_string("var o = JSON.parse('[\"a\", \"b\"]',"
- " function(k, v) {return v;});"
- "o"),
- nxt_string("a,b") },
-
- { nxt_string("var o = JSON.parse('{\"a\":[1,{\"b\":1},3]}',"
- " function(k, v) {return v;});"
- "o.a[1].b"),
- nxt_string("1") },
-
- { nxt_string("var o = JSON.parse('{\"a\":[1,2]}',"
- " function(k, v) {if (k === '' || k === 'a') {return v;}});"
- "o.a"),
- nxt_string(",") },
-
- { nxt_string("var o = JSON.parse('{\"a\":[1,2]}',"
- " function(k, v) {return (k === '' || k === 'a') ? v : v*2});"
- "o.a"),
- nxt_string("2,4") },
-
- { nxt_string("var o = JSON.parse('{\"a\":2, \"b\":{\"c\":[\"xx\"]}}',"
- " function(k, v) {return typeof v === 'number' ? v * 2 : v;});"
- "o.a+o.b.c[0]"),
- nxt_string("4xx") },
-
- { nxt_string("var o = JSON.parse('{\"aa\":{\"b\":1}, \"abb\":1, \"c\":1}',"
- " function(k, v) {return (k === '' || /^a/.test(k)) ? v : undefined;});"
- "Object.keys(o)"),
- nxt_string("aa,abb") },
-
- { nxt_string("var o = JSON.parse('{\"a\":\"x\"}',"
- " function(k, v) {if (k === 'a') {this.b='y';} return v});"
- "o.a+o.b"),
- nxt_string("xy") },
-
- { nxt_string("var o = JSON.parse('{\"a\":\"x\"}',"
- " function(k, v) {return (k === 'a' ? {x:1} : v)});"
- "o.a.x"),
- nxt_string("1") },
-
- { nxt_string("var keys = []; var o = JSON.parse('{\"a\":2, \"b\":{\"c\":\"xx\"}}',"
- " function(k, v) {keys.push(k); return v;});"
- "keys"),
- nxt_string("a,c,b,") },
-
- { nxt_string("var args = []; var o = JSON.parse('[2,{\"a\":3}]',"
- " function(k, v) {args.push(k+\":\"+v); return v;});"
- "args.join('|')"),
- nxt_string("0:2|a:3|1:[object Object]|:2,[object Object]") },
-
- { nxt_string("JSON.parse()"),
- nxt_string("SyntaxError: Unexpected token at position 0") },
-
- { nxt_string("JSON.parse([])"),
- nxt_string("SyntaxError: Unexpected end of input at position 0") },
-
- { nxt_string("JSON.parse('')"),
- nxt_string("SyntaxError: Unexpected end of input at position 0") },
-
- { nxt_string("JSON.parse('fals')"),
- nxt_string("SyntaxError: Unexpected token at position 0") },
-
- { nxt_string("JSON.parse(' t')"),
- nxt_string("SyntaxError: Unexpected token at position 1") },
-
- { nxt_string("JSON.parse('nu')"),
- nxt_string("SyntaxError: Unexpected token at position 0") },
-
- { nxt_string("JSON.parse('-')"),
- nxt_string("SyntaxError: Unexpected number at position 0") },
-
- { nxt_string("JSON.parse('--')"),
- nxt_string("SyntaxError: Unexpected number at position 1") },
-
- { nxt_string("JSON.parse('1-')"),
- nxt_string("SyntaxError: Unexpected token at position 1") },
-
- { nxt_string("JSON.parse('1ee1')"),
- nxt_string("SyntaxError: Unexpected token at position 1") },
-
- { nxt_string("JSON.parse('1eg')"),
- nxt_string("SyntaxError: Unexpected token at position 1") },
-
- { nxt_string("JSON.parse('0x01')"),
- nxt_string("SyntaxError: Unexpected token at position 1") },
-
- { nxt_string("JSON.parse('\"абв')"),
- nxt_string("SyntaxError: Unexpected end of input at position 4") },
-
- { nxt_string("JSON.parse('\"\b')"),
- nxt_string("SyntaxError: Forbidden source char at position 1") },
-
- { nxt_string("JSON.parse('\"\\\\u')"),
- nxt_string("SyntaxError: Unexpected end of input at position 3") },
-
- { nxt_string("JSON.parse('\"\\\\q\"')"),
- nxt_string("SyntaxError: Unknown escape char at position 2") },
-
- { nxt_string("JSON.parse('\"\\\\uDC01\"')"),
- nxt_string("�") },
-
- { nxt_string("JSON.parse('\"\\\\uD801\\\\uE000\"')"),
- nxt_string("�") },
-
- { nxt_string("JSON.parse('\"\\\\uD83D\"')"),
- nxt_string("�") },
-
- { nxt_string("JSON.parse('\"\\\\uD800\\\\uDB00\"')"),
- nxt_string("��") },
-
- { nxt_string("JSON.parse('\"\\\\ud800[\"')"),
- nxt_string("�[") },
-
- { nxt_string("JSON.parse('{')"),
- nxt_string("SyntaxError: Unexpected end of input at position 1") },
-
- { nxt_string("JSON.parse('{{')"),
- nxt_string("SyntaxError: Unexpected token at position 1") },
-
- { nxt_string("JSON.parse('{[')"),
- nxt_string("SyntaxError: Unexpected token at position 1") },
-
- { nxt_string("JSON.parse('{\"a\"')"),
- nxt_string("SyntaxError: Unexpected token at position 4") },
-
- { nxt_string("JSON.parse('{\"a\":')"),
- nxt_string("SyntaxError: Unexpected end of input at position 5") },
-
- { nxt_string("JSON.parse('{\"a\":{')"),
- nxt_string("SyntaxError: Unexpected end of input at position 6") },
-
- { nxt_string("JSON.parse('{\"a\":{}')"),
- nxt_string("SyntaxError: Unexpected end of input at position 7") },
-
- { nxt_string("JSON.parse('{\"a\":{}g')"),
- nxt_string("SyntaxError: Unexpected token at position 7") },
-
- { nxt_string("JSON.parse('{\"a\":{},')"),
- nxt_string("SyntaxError: Unexpected end of input at position 8") },
-
- { nxt_string("JSON.parse('{\"a\":{},}')"),
- nxt_string("SyntaxError: Trailing comma at position 7") },
-
- { nxt_string("JSON.parse('{\"a\":{},,')"),
- nxt_string("SyntaxError: Unexpected token at position 8") },
-
- { nxt_string("JSON.parse('{\"a\":{},,}')"),
- nxt_string("SyntaxError: Unexpected token at position 8") },
-
- { nxt_string("JSON.parse('[')"),
- nxt_string("SyntaxError: Unexpected end of input at position 1") },
-
- { nxt_string("JSON.parse('[q')"),
- nxt_string("SyntaxError: Unexpected token at position 1") },
-
- { nxt_string("JSON.parse('[\"a')"),
- nxt_string("SyntaxError: Unexpected end of input at position 3") },
-
- { nxt_string("JSON.parse('[1 ')"),
- nxt_string("SyntaxError: Unexpected end of input at position 3") },
-
- { nxt_string("JSON.parse('[1,]')"),
- nxt_string("SyntaxError: Trailing comma at position 2") },
-
- { nxt_string("JSON.parse('[1 , 5 ')"),
- nxt_string("SyntaxError: Unexpected end of input at position 7") },
-
- { nxt_string("JSON.parse('{\"a\":'.repeat(32))"),
- nxt_string("SyntaxError: Nested too deep at position 155") },
-
- { nxt_string("JSON.parse('['.repeat(32))"),
- nxt_string("SyntaxError: Nested too deep at position 31") },
-
- { nxt_string("var o = JSON.parse('{', function(k, v) {return v;});o"),
- nxt_string("SyntaxError: Unexpected end of input at position 1") },
-
- { nxt_string("var o = JSON.parse('{\"a\":1}', "
- " function(k, v) {return v.a.a;}); o"),
- nxt_string("TypeError: cannot get property \"a\" of undefined") },
-
- /* JSON.stringify() */
-
- { nxt_string("JSON.stringify()"),
- nxt_string("undefined") },
-
- { nxt_string("JSON.stringify('')"),
- nxt_string("\"\"") },
-
- { nxt_string("JSON.stringify('abc')"),
- nxt_string("\"abc\"") },
-
- { nxt_string("JSON.stringify(new String('abc'))"),
- nxt_string("\"abc\"") },
-
- { nxt_string("JSON.stringify(123)"),
- nxt_string("123") },
-
- { nxt_string("JSON.stringify(-0)"),
- nxt_string("0") },
-
- { nxt_string("JSON.stringify(0.00000123)"),
- nxt_string("0.00000123") },
-
- { nxt_string("JSON.stringify(new Number(123))"),
- nxt_string("123") },
-
- { nxt_string("JSON.stringify(true)"),
- nxt_string("true") },
-
- { nxt_string("JSON.stringify(false)"),
- nxt_string("false") },
-
- { nxt_string("JSON.stringify(new Boolean(1))"),
- nxt_string("true") },
-
- { nxt_string("JSON.stringify(new Boolean(0))"),
- nxt_string("false") },
-
- { nxt_string("JSON.stringify(null)"),
- nxt_string("null") },
-
- { nxt_string("JSON.stringify(undefined)"),
- nxt_string("undefined") },
-
- { nxt_string("JSON.stringify({})"),
- nxt_string("{}") },
-
- { nxt_string("JSON.stringify([])"),
- nxt_string("[]") },
-
- { nxt_string("var a = [1]; a[2] = 'x'; JSON.stringify(a)"),
- nxt_string("[1,null,\"x\"]") },
-
- { nxt_string("JSON.stringify({a:\"b\",c:19,e:null,t:true,f:false})"),
- nxt_string("{\"a\":\"b\",\"c\":19,\"e\":null,\"t\":true,\"f\":false}") },
-
- { nxt_string("JSON.stringify({a:1, b:undefined})"),
- nxt_string("{\"a\":1}") },
-
- { nxt_string("var o = {a:1, c:2};"
- "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
- "JSON.stringify(o)"),
- nxt_string("{\"a\":1,\"c\":2}") },
-
- { nxt_string("JSON.stringify({a:{}, b:[function(v){}]})"),
- nxt_string("{\"a\":{},\"b\":[null]}") },
-
- { nxt_string("JSON.stringify(RegExp())"),
- nxt_string("{}") },
-
- { nxt_string("JSON.stringify(SyntaxError('e'))"),
- nxt_string("{}") },
-
- { nxt_string("JSON.stringify(URIError('e'))"),
- nxt_string("{}") },
-
- { nxt_string("var e = URIError('e'); e.name = 'E'; JSON.stringify(e)"),
- nxt_string("{\"name\":\"E\"}") },
-
- { nxt_string("var e = URIError('e'); e.message = 'E'; JSON.stringify(e)"),
- nxt_string("{}") },
-
- { nxt_string("var e = URIError('e'); e.foo = 'E'; JSON.stringify(e)"),
- nxt_string("{\"foo\":\"E\"}") },
-
- { nxt_string("JSON.stringify([$r])"),
- nxt_string("[null]") },
-
- /* Ignoring named properties of an array. */
-
- { nxt_string("var a = [1,2]; a.a = 1;"
- "JSON.stringify(a)"),
- nxt_string("[1,2]") },
-
- { nxt_string("JSON.stringify({a:{b:{c:{d:1}, e:function(v){}}}})"),
- nxt_string("{\"a\":{\"b\":{\"c\":{\"d\":1}}}}") },
-
- { nxt_string("JSON.stringify([[\"b\",undefined],1,[5],{a:1}])"),
- nxt_string("[[\"b\",null],1,[5],{\"a\":1}]") },
-
- { nxt_string("var json = '{\"a\":{\"b\":{\"c\":{\"d\":1},\"e\":[true]}}}';"
- "json == JSON.stringify(JSON.parse(json))"),
- nxt_string("true") },
-
- { nxt_string("var json = '{\"a\":\"абв\",\"b\":\"α\"}';"
- "json == JSON.stringify(JSON.parse(json))"),
- nxt_string("true") },
-
- /* Multibyte characters: z - 1 byte, α - 2 bytes, 𐐀 - 4 bytes */
-
- { nxt_string("JSON.stringify('α𐐀z'.repeat(10))"),
- nxt_string("\"α𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀z\"") },
-
- { nxt_string("JSON.stringify('α𐐀z'.repeat(10)).length"),
- nxt_string("32") },
-
- { nxt_string("JSON.stringify('α'.repeat(33))[32]"),
- nxt_string("α") },
-
- { nxt_string("JSON.stringify('a\\nbc')"),
- nxt_string("\"a\\nbc\"") },
-
- { nxt_string("JSON.stringify('а\tбв')"),
- nxt_string("\"а\\tбв\"") },
-
- { nxt_string("JSON.stringify('\\n\\t\\r\\\"\\f\\b')"),
- nxt_string("\"\\n\\t\\r\\\"\\f\\b\"") },
-
- { nxt_string("JSON.stringify('\x00\x01\x02\x1f')"),
- nxt_string("\"\\u0000\\u0001\\u0002\\u001F\"") },
-
- { nxt_string("JSON.stringify('abc\x00')"),
- nxt_string("\"abc\\u0000\"") },
-
- { nxt_string("JSON.stringify('\x00zz')"),
- nxt_string("\"\\u0000zz\"") },
-
- { nxt_string("JSON.stringify('\x00')"),
- nxt_string("\"\\u0000\"") },
-
- { nxt_string("JSON.stringify('a\x00z')"),
- nxt_string("\"a\\u0000z\"") },
-
- { nxt_string("JSON.stringify('\x00z\x00')"),
- nxt_string("\"\\u0000z\\u0000\"") },
-
- { nxt_string("var i, s, r = true;"
- " for (i = 0; i < 128; i++) {"
- " s = 'α𐐀z'.repeat(i);"
- " r &= (JSON.stringify(s) == ('\"' + s + '\"'));"
- "}; r"),
- nxt_string("1") },
-
- { nxt_string("JSON.stringify('\\u0000'.repeat(10)) == ('\"' + '\\\\u0000'.repeat(10) + '\"')"),
- nxt_string("true") },
-
- { nxt_string("JSON.stringify('abc'.repeat(100)).length"),
- nxt_string("302") },
-
- { nxt_string("JSON.stringify('абв'.repeat(100)).length"),
- nxt_string("302") },
-
- /* Byte strings. */
-
- { nxt_string("JSON.stringify('\\u00CE\\u00B1\\u00C2\\u00B6'.toBytes())"),
- nxt_string("\"α¶\"") },
-
- { nxt_string("JSON.stringify('µ§±®'.toBytes())"),
- nxt_string("\"\xB5\xA7\xB1\xAE\"") },
-
- /* Optional arguments. */
-
- { nxt_string("JSON.stringify(undefined, undefined, 1)"),
- nxt_string("undefined") },
-
- { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, 0)"),
- nxt_string("[{\"a\":1,\"b\":{\"c\":2}},1]") },
-
- { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, 1)"),
- nxt_string("[\n {\n \"a\": 1,\n \"b\": {\n \"c\": 2\n }\n },\n 1\n]") },
-
- { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, ' ')"),
- nxt_string("[\n {\n \"a\": 1,\n \"b\": {\n \"c\": 2\n }\n },\n 1\n]") },
-
- { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, '#')"),
- nxt_string("[\n#{\n##\"a\": 1,\n##\"b\": {\n###\"c\": 2\n##}\n#},\n#1\n]") },
-
- { nxt_string("JSON.stringify([1], undefined, 'AAAAABBBBBC')"),
- nxt_string("[\nAAAAABBBBB1\n]") },
-
- { nxt_string("JSON.stringify([1], undefined, 11)"),
- nxt_string("[\n 1\n]") },
-
- { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, -1)"),
- nxt_string("[{\"a\":1,\"b\":{\"c\":2}},1]") },
-
- { nxt_string("JSON.stringify([{a:1,b:{c:2}},1], undefined, new Date())"),
- nxt_string("[{\"a\":1,\"b\":{\"c\":2}},1]") },
-
- { nxt_string("JSON.stringify({toJSON:function(k){}})"),
- nxt_string("undefined") },
-
- { nxt_string("JSON.stringify({toJSON:function(k){return k}})"),
- nxt_string("\"\"") },
-
- { nxt_string("JSON.stringify(new Date(1308895323625))"),
- nxt_string("\"2011-06-24T06:02:03.625Z\"") },
-
- { nxt_string("JSON.stringify({a:new Date(1308895323625)})"),
- nxt_string("{\"a\":\"2011-06-24T06:02:03.625Z\"}") },
-
- { nxt_string("JSON.stringify({b:{toJSON:function(k){return undefined}}})"),
- nxt_string("{}") },
-
- { nxt_string("JSON.stringify({b:{toJSON:function(k){}},c:1})"),
- nxt_string("{\"c\":1}") },
-
- { nxt_string("JSON.stringify({b:{toJSON:function(k){return k}}})"),
- nxt_string("{\"b\":\"b\"}") },
-
- { nxt_string("JSON.stringify({a:1,b:new Date(1308895323625),c:2})"),
- nxt_string("{\"a\":1,\"b\":\"2011-06-24T06:02:03.625Z\",\"c\":2}") },
-
- { nxt_string("JSON.stringify({a:{b:new Date(1308895323625)}})"),
- nxt_string("{\"a\":{\"b\":\"2011-06-24T06:02:03.625Z\"}}") },
-
- { nxt_string("function key(k){return k}; function und(k){}"
- "JSON.stringify([{toJSON:key},{toJSON:und},{toJSON:key}])"),
- nxt_string("[\"0\",null,\"2\"]") },
-
- { nxt_string("JSON.stringify({b:{a:1,c:[2]}}, function(k,v){return v})"),
- nxt_string("{\"b\":{\"a\":1,\"c\":[2]}}") },
-
- { nxt_string("JSON.stringify([{a:1}, 2], function(k,v){return v})"),
- nxt_string("[{\"a\":1},2]") },
-
- { nxt_string("JSON.stringify({a:{toJSON:function(k){}}}, function(k,v){return v})"),
- nxt_string("{}") },
-
- { nxt_string("JSON.stringify({a:{toJSON:function(k){return 1}}}, function(k,v){return v})"),
- nxt_string("{\"a\":1}") },
-
- { nxt_string("JSON.stringify([{toJSON:function(k){}}], function(k,v){return v})"),
- nxt_string("[null]") },
-
- { nxt_string("JSON.stringify([{toJSON:function(k){return 1}}], function(k,v){return v})"),
- nxt_string("[1]") },
-
- { nxt_string("JSON.stringify({a:new Date(1308895323625)}, function(k,v){return v})"),
- nxt_string("{\"a\":\"2011-06-24T06:02:03.625Z\"}") },
-
- { nxt_string("JSON.stringify([new Date(1308895323625)], function(k,v){return v})"),
- nxt_string("[\"2011-06-24T06:02:03.625Z\"]") },
-
- { nxt_string("JSON.stringify([new Date(1308895323625)], "
- " function(k,v){return (typeof v === 'string') ? v.toLowerCase() : v})"),
- nxt_string("[\"2011-06-24t06:02:03.625z\"]") },
-
- { nxt_string("JSON.stringify([new Date(1308895323625)], "
- " function(k,v){return (typeof v === 'string') ? v.toLowerCase() : v}, '#')"),
- nxt_string("[\n#\"2011-06-24t06:02:03.625z\"\n]") },
-
- { nxt_string("JSON.stringify({a:new Date(1308895323625),b:1,c:'a'}, "
- " function(k,v){return (typeof v === 'string') ? undefined : v})"),
- nxt_string("{\"b\":1}") },
-
- { nxt_string("JSON.stringify({a:new Date(1308895323625),b:1,c:'a'}, "
- " function(k,v){return (typeof v === 'string') ? undefined : v}, '#')"),
- nxt_string("{\n#\"b\": 1\n}") },
-
- { nxt_string("JSON.stringify([new Date(1308895323625),1,'a'], "
- " function(k,v){return (typeof v === 'string') ? undefined : v})"),
- nxt_string("[null,1,null]") },
-
- { nxt_string("var keys = []; var o = JSON.stringify({a:2, b:{c:1}},"
- " function(k, v) {keys.push(k); return v;});"
- "keys"),
- nxt_string(",a,b,c") },
-
- { nxt_string("JSON.stringify(['a', 'b', 'c'], "
- " function(i, v) { if (i === '0') {return undefined} "
- " else if (i == 1) {return 2} "
- " else {return v}})"),
- nxt_string("[null,2,\"c\"]") },
-
- { nxt_string("JSON.stringify({a:2, b:{c:1}},"
- " function(k, v) {delete this['b']; return v;})"),
- nxt_string("{\"a\":2}") },
-
- { nxt_string("JSON.stringify(JSON.parse('{\"a\":1,\"b\":2}', "
- " function(k, v) {delete this['b']; return v;}))"),
- nxt_string("{\"a\":1}") },
-
- { nxt_string("var keys = []; var o = JSON.stringify([[1,2],{a:3}, 4],"
- " function(k, v) {keys.push(k); return v;});"
- "keys"),
- nxt_string(",0,0,1,1,a,2") },
-
- { nxt_string("JSON.stringify({b:{a:1,c:[2]}}, ['a', undefined, 'b', {}, 'a'])"),
- nxt_string("{\"b\":{\"a\":1}}") },
-
- { nxt_string("JSON.stringify({b:{a:1,c:[2]}}, [new String('a'), new String('b')])"),
- nxt_string("{\"b\":{\"a\":1}}") },
-
- { nxt_string("JSON.stringify({'1':1,'2':2,'3':3}, [1, new Number(2)])"),
- nxt_string("{\"1\":1,\"2\":2}") },
-
- { nxt_string("var objs = []; var o = JSON.stringify({a:1},"
- " function(k, v) {objs.push(this); return v});"
- "JSON.stringify(objs)"),
- nxt_string("[{\"\":{\"a\":1}},{\"a\":1}]") },
-
- { nxt_string("var a = []; a[0] = a; JSON.stringify(a)"),
- nxt_string("TypeError: Nested too deep or a cyclic structure") },
-
- { nxt_string("var a = {}; a.a = a; JSON.stringify(a)"),
- nxt_string("TypeError: Nested too deep or a cyclic structure") },
-
- /* njs.dump(). */
-
- { nxt_string("njs.dump({a:1, b:[1,,2,{c:new Boolean(1)}]})"),
- nxt_string("{a:1,b:[1,<empty>,2,{c:[Boolean: true]}]}") },
-
- { nxt_string("njs.dump(Array.prototype.slice.call({'1':'b', length:2}))"),
- nxt_string("[<empty>,'b']") },
-
- { nxt_string("njs.dump($r.props)"),
- nxt_string("{a:{type:\"property\",props:[\"getter\"]},b:{type:\"property\",props:[\"getter\"]}}") },
-
- { nxt_string("njs.dump($r.header)"),
- nxt_string("{type:\"object\",props:[\"getter\",\"foreach\",\"next\"]}") },
-
- { nxt_string("njs.dump(njs) == `{version:'${njs.version}'}`"),
- nxt_string("true") },
-
- { nxt_string("njs.dump(-0)"),
- nxt_string("-0") },
-
- { nxt_string("njs.dump(Object(-0))"),
- nxt_string("[Number: -0]") },
-
- { nxt_string("njs.dump([0, -0])"),
- nxt_string("[0,-0]") },
-
- /* Built-in methods name. */
-
- { nxt_string(
- "var fail;"
- "function isMethodsHaveName(o) {"
- " var except = ["
- " 'prototype',"
- " 'constructor',"
- " ];"
- " return Object.getOwnPropertyNames(o)"
- " .filter(v => !except.includes(v)"
- " && typeof o[v] == 'function')"
- " .every(v => o[v].name == v"
- " || !(fail = `${o.name}.${v}: ${o[v].name}`));"
- "}"
- "["
- " Boolean, Boolean.prototype,"
- " Number, Number.prototype,"
- " String, String.prototype,"
- " Object, Object.prototype,"
- " Array, Array.prototype,"
- " Function, Function.prototype,"
- " RegExp, RegExp.prototype,"
- " Date, Date.prototype,"
- " Error, Error.prototype,"
- " Math,"
- " JSON,"
- "].every(obj => isMethodsHaveName(obj)) || fail"),
-
- nxt_string("true") },
-
- /* require(). */
-
- { nxt_string("require('unknown_module')"),
- nxt_string("Error: Cannot find module \"unknown_module\"") },
-
- { nxt_string("require()"),
- nxt_string("TypeError: missing path") },
-
- { nxt_string("var fs = require('fs'); typeof fs"),
- nxt_string("object") },
-
- /* require('fs').readFile() */
-
- { nxt_string("var fs = require('fs');"
- "fs.readFile()"),
- nxt_string("TypeError: too few arguments") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFile('/njs_unknown_path')"),
- nxt_string("TypeError: too few arguments") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFile('/njs_unknown_path', {flag:'xx'})"),
- nxt_string("TypeError: callback must be a function") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFile('/njs_unknown_path', {flag:'xx'}, 1)"),
- nxt_string("TypeError: callback must be a function") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFile('/njs_unknown_path', {flag:'xx'}, function () {})"),
- nxt_string("TypeError: Unknown file open flags: \"xx\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFile('/njs_unknown_path', {encoding:'ascii'}, function () {})"),
- nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFile('/njs_unknown_path', 'ascii', function () {})"),
- nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
- /* require('fs').readFileSync() */
-
- { nxt_string("var fs = require('fs');"
- "fs.readFileSync()"),
- nxt_string("TypeError: too few arguments") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFileSync({})"),
- nxt_string("TypeError: path must be a string") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFileSync('/njs_unknown_path', {flag:'xx'})"),
- nxt_string("TypeError: Unknown file open flags: \"xx\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFileSync('/njs_unknown_path', {encoding:'ascii'})"),
- nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFileSync('/njs_unknown_path', 'ascii')"),
- nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.readFileSync('/njs_unknown_path', true)"),
- nxt_string("TypeError: Unknown options type (a string or object required)") },
-
-
- /* require('fs').writeFile() */
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFile()"),
- nxt_string("TypeError: too few arguments") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFile('/njs_unknown_path')"),
- nxt_string("TypeError: too few arguments") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFile('/njs_unknown_path', '')"),
- nxt_string("TypeError: too few arguments") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFile({}, '', function () {})"),
- nxt_string("TypeError: path must be a string") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFile('/njs_unknown_path', '', 'utf8')"),
- nxt_string("TypeError: callback must be a function") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFile('/njs_unknown_path', '', {flag:'xx'}, function () {})"),
- nxt_string("TypeError: Unknown file open flags: \"xx\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFile('/njs_unknown_path', '', {encoding:'ascii'}, function () {})"),
- nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFile('/njs_unknown_path', '', 'ascii', function () {})"),
- nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFile('/njs_unknown_path', '', true, function () {})"),
- nxt_string("TypeError: Unknown options type (a string or object required)") },
-
- /* require('fs').writeFileSync() */
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFileSync()"),
- nxt_string("TypeError: too few arguments") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFileSync('/njs_unknown_path')"),
- nxt_string("TypeError: too few arguments") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFileSync({}, '')"),
- nxt_string("TypeError: path must be a string") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFileSync('/njs_unknown_path', '', {flag:'xx'})"),
- nxt_string("TypeError: Unknown file open flags: \"xx\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFileSync('/njs_unknown_path', '', {encoding:'ascii'})"),
- nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFileSync('/njs_unknown_path', '', 'ascii')"),
- nxt_string("TypeError: Unknown encoding: \"ascii\"") },
-
- { nxt_string("var fs = require('fs');"
- "fs.writeFileSync('/njs_unknown_path', '', true)"),
- nxt_string("TypeError: Unknown options type (a string or object required)") },
-
- /* require('crypto').createHash() */
-
- { nxt_string("require('crypto').createHash('sha1')"),
- nxt_string("[object Hash]") },
-
- { nxt_string("Object.prototype.toString.call(require('crypto').createHash('sha1'))"),
- nxt_string("[object Object]") },
-
- { nxt_string("var h = require('crypto').createHash('md5');"
- "h.update('AB').digest('hex')"),
- nxt_string("b86fc6b051f63d73de262d4c34e3a0a9") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update('A').update('B').digest('hex')"),
- nxt_string("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update('AB').digest('hex')"),
- nxt_string("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update('AB').digest().toString('hex')"),
- nxt_string("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update('AB').digest('base64')"),
- nxt_string("BtlFlCqiamG+GMPiK/GbvKjdK10=") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update('AB').digest('base64url')"),
- nxt_string("BtlFlCqiamG-GMPiK_GbvKjdK10") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update('AB').digest().toString('base64')"),
- nxt_string("BtlFlCqiamG+GMPiK/GbvKjdK10=") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update('abc'.repeat(100)).digest('hex')"),
- nxt_string("c95466320eaae6d19ee314ae4f135b12d45ced9a") },
-
- { nxt_string("var h = require('crypto').createHash('sha256');"
- "h.update('A').update('B').digest('hex')"),
- nxt_string("38164fbd17603d73f696b8b4d72664d735bb6a7c88577687fd2ae33fd6964153") },
-
- { nxt_string("var h = require('crypto').createHash('sha256');"
- "h.update('AB').digest('hex')"),
- nxt_string("38164fbd17603d73f696b8b4d72664d735bb6a7c88577687fd2ae33fd6964153") },
-
- { nxt_string("var h = require('crypto').createHash('sha256');"
- "h.update('abc'.repeat(100)).digest('hex')"),
- nxt_string("d9f5aeb06abebb3be3f38adec9a2e3b94228d52193be923eb4e24c9b56ee0930") },
-
- { nxt_string("var h = require('crypto').createHash()"),
- nxt_string("TypeError: algorithm must be a string") },
-
- { nxt_string("var h = require('crypto').createHash([])"),
- nxt_string("TypeError: algorithm must be a string") },
-
- { nxt_string("var h = require('crypto').createHash('sha512')"),
- nxt_string("TypeError: not supported algorithm: \"sha512\"") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update()"),
- nxt_string("TypeError: data must be a string") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update({})"),
- nxt_string("TypeError: data must be a string") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update('A').digest('latin1')"),
- nxt_string("TypeError: Unknown digest encoding: \"latin1\"") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update('A').digest('hex'); h.digest('hex')"),
- nxt_string("Error: Digest already called") },
-
- { nxt_string("var h = require('crypto').createHash('sha1');"
- "h.update('A').digest('hex'); h.update('B')"),
- nxt_string("Error: Digest already called") },
-
- { nxt_string("typeof require('crypto').createHash('md5')"),
- nxt_string("object") },
-
- /* require('crypto').createHmac() */
-
- { nxt_string("require('crypto').createHmac('sha1', '')"),
- nxt_string("[object Hmac]") },
-
- { nxt_string("var h = require('crypto').createHmac('md5', '');"
- "h.digest('hex')"),
- nxt_string("74e6f7298a9c2d168935f58c001bad88") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', '');"
- "h.digest('hex')"),
- nxt_string("fbdb1d1b18aa6c08324b7d64b71fb76370690e1d") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', '');"
- "h.digest().toString('hex')"),
- nxt_string("fbdb1d1b18aa6c08324b7d64b71fb76370690e1d") },
-
- { nxt_string("var h = require('crypto').createHmac('md5', 'secret key');"
- "h.update('AB').digest('hex')"),
- nxt_string("9c72728915eb26620a5caeafd0063b29") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
- "h.update('A').update('B').digest('hex')"),
- nxt_string("adc60e03459c4bae7cf4eb6d9730003e9490b22f") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
- "h.update('AB').digest('hex')"),
- nxt_string("adc60e03459c4bae7cf4eb6d9730003e9490b22f") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
- "h.update('AB').digest('base64')"),
- nxt_string("rcYOA0WcS6589OttlzAAPpSQsi8=") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
- "h.update('AB').digest('base64url')"),
- nxt_string("rcYOA0WcS6589OttlzAAPpSQsi8") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
- "h.update('AB').digest().toString('base64')"),
- nxt_string("rcYOA0WcS6589OttlzAAPpSQsi8=") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
- "h.update('abc'.repeat(100)).digest('hex')"),
- nxt_string("b105ad6921e4c54d3fa0a9ec3f7f0ee9bd2c659d") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'A'.repeat(40));"
- "h.update('AB').digest('hex')"),
- nxt_string("0b84f78ca5275d76d4b7dafb5845ee2b6a79c4c2") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'A'.repeat(64));"
- "h.update('AB').digest('hex')"),
- nxt_string("400ce530816c6b3247e2959f3982a12aaf58c0c9") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'A'.repeat(100));"
- "h.update('AB').digest('hex')"),
- nxt_string("670e7cdebae6392797e000e79e51d3b6589d8fad") },
-
- { nxt_string("var h = require('crypto').createHmac('sha256', '');"
- "h.digest('hex')"),
- nxt_string("b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad") },
-
- { nxt_string("var h = require('crypto').createHmac('sha256', 'secret key');"
- "h.update('A').update('B').digest('hex')"),
- nxt_string("46085184b3b45a13d838bf71a0ce03675dab30931e0f1f68fa636ea65fdb286d") },
-
- { nxt_string("var h = require('crypto').createHmac('sha256', 'secret key');"
- "h.update('AB').digest('hex')"),
- nxt_string("46085184b3b45a13d838bf71a0ce03675dab30931e0f1f68fa636ea65fdb286d") },
-
- { nxt_string("var h = require('crypto').createHmac('sha256', 'A'.repeat(64));"
- "h.update('AB').digest('hex')"),
- nxt_string("ee9dce43b12eb3e865614ad9c1a8d4fad4b6eac2b64647bd24cd192888d3f367") },
-
- { nxt_string("var h = require('crypto').createHmac('sha256', 'A'.repeat(100));"
- "h.update('AB').digest('hex')"),
- nxt_string("5647b6c429701ff512f0f18232b4507065d2376ca8899a816a0a6e721bf8ddcc") },
-
- { nxt_string("var h = require('crypto').createHmac('md5', 'secret key');"
- "h.update('abc'.repeat(100)).digest('hex')"),
- nxt_string("5dd706af43536f8c9c83e7ea55b1a5a2") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
- "h.update('abc'.repeat(100)).digest('hex')"),
- nxt_string("b105ad6921e4c54d3fa0a9ec3f7f0ee9bd2c659d") },
-
- { nxt_string("var h = require('crypto').createHmac('sha256', 'secret key');"
- "h.update('abc'.repeat(100)).digest('hex')"),
- nxt_string("f6550d398ce350ee8d94a0f44f2cf6b9bc8d316ae4625fb4434f22980a276bac") },
-
- { nxt_string("var h = require('crypto').createHmac()"),
- nxt_string("TypeError: algorithm must be a string") },
-
- { nxt_string("var h = require('crypto').createHmac([])"),
- nxt_string("TypeError: algorithm must be a string") },
-
- { nxt_string("var h = require('crypto').createHmac('sha512', '')"),
- nxt_string("TypeError: not supported algorithm: \"sha512\"") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', [])"),
- nxt_string("TypeError: key must be a string") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
- "h.update('A').digest('hex'); h.digest('hex')"),
- nxt_string("Error: Digest already called") },
-
- { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');"
- "h.update('A').digest('hex'); h.update('B')"),
- nxt_string("Error: Digest already called") },
-
- { nxt_string("typeof require('crypto').createHmac('md5', 'a')"),
- nxt_string("object") },
-
- /* setTimeout(). */
-
- { nxt_string("setTimeout()"),
- nxt_string("TypeError: too few arguments") },
-
- { nxt_string("setTimeout(function(){})"),
- nxt_string("InternalError: not supported by host environment") },
-
- { nxt_string("setTimeout(function(){}, 12)"),
- nxt_string("InternalError: not supported by host environment") },
-
- /* clearTimeout(). */
-
- { nxt_string("clearTimeout()"),
- nxt_string("undefined") },
-
- { nxt_string("clearTimeout(123)"),
- nxt_string("undefined") },
-
- /* Trick: number to boolean. */
-
- { nxt_string("var a = 0; !!a"),
- nxt_string("false") },
-
- { nxt_string("var a = 5; !!a"),
- nxt_string("true") },
-
- /* Trick: flooring. */
-
- { nxt_string("var n = -10.12345; ~~n"),
- nxt_string("-10") },
-
- { nxt_string("var n = 10.12345; ~~n"),
- nxt_string("10") },
-
- /* es5id: 8.2_A1_T1 */
- /* es5id: 8.2_A1_T2 */
-
- { nxt_string("var x = null;"),
- nxt_string("undefined") },
-
- /* es5id: 8.2_A2 */
-
- { nxt_string("var null;"),
- nxt_string("SyntaxError: Unexpected token \"null\" in 1") },
-
- /* es5id: 8.2_A3 */
-
- { nxt_string("typeof(null) === \"object\""),
- nxt_string("true") },
-
- /* Module. */
-
- { nxt_string("import;"),
- nxt_string("SyntaxError: Non-default import is not supported in 1") },
-
- { nxt_string("import {x} from y"),
- nxt_string("SyntaxError: Non-default import is not supported in 1") },
-
- { nxt_string("import x from y"),
- nxt_string("SyntaxError: Unexpected token \"y\" in 1") },
-
- { nxt_string("import x from {"),
- nxt_string("SyntaxError: Unexpected token \"{\" in 1") },
-
- { nxt_string("import x from ''"),
- nxt_string("SyntaxError: Cannot find module \"\" in 1") },
-
- { nxt_string("import x from 'crypto'"),
- nxt_string("undefined") },
-
- { nxt_string("import x from 'crypto' 1"),
- nxt_string("SyntaxError: Unexpected token \"1\" in 1") },
-
- { nxt_string("if (1) {import x from 'crypto'}"),
- nxt_string("SyntaxError: Illegal import statement in 1") },
-
- { nxt_string("export"),
- nxt_string("SyntaxError: Illegal export statement in 1") },
-
-};
-
-
-static njs_unit_test_t njs_module_test[] =
-{
- { nxt_string("function f(){return 2}; var f; f()"),
- nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
- { nxt_string("function f(){return 2}; var f = 1; f()"),
- nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
- { nxt_string("function f(){return 1}; function f(){return 2}; f()"),
- nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
- { nxt_string("var f = 1; function f() {};"),
- nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-
- { nxt_string("{ var f = 1; } function f() {};"),
- nxt_string("SyntaxError: \"f\" has already been declared in 1") },
-};
-
-
-static njs_unit_test_t njs_tz_test[] =
-{
- { nxt_string("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
- nxt_string("Thu Jan 01 1970 12:45:00 GMT+1245") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getTime()"),
- nxt_string("1308895200000") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.valueOf()"),
- nxt_string("1308895200000") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45);"
- "d.toString().slice(0, 33)"),
- nxt_string("Fri Jun 24 2011 18:45:00 GMT+1245") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45);"
- "d.toTimeString().slice(0, 17)"),
- nxt_string("18:45:00 GMT+1245") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.toUTCString()"),
- nxt_string("Fri Jun 24 2011 06:00:00 GMT") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
- "d.toISOString()"),
- nxt_string("2011-06-24T06:00:12.625Z") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCHours()"),
- nxt_string("6") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMinutes()"),
- nxt_string("0") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
- "d.getTimezoneOffset()"),
- nxt_string("-765") },
-
- { nxt_string("var d = new Date(1308895323625); d.setMinutes(3, 2, 5003);"
- "d.getTime()"),
- nxt_string("1308892687003") },
-
- { nxt_string("var d = new Date(1308895323625); d.setMinutes(3, 2);"
- "d.getTime()"),
- nxt_string("1308892682625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setMinutes(3);"
- "d.getTime()"),
- nxt_string("1308892683625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3, 2, 5003);"
- "d.getTime()"),
- nxt_string("1308899887003") },
-
- { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3, 2);"
- "d.getTime()"),
- nxt_string("1308899882625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setHours(20, 3);"
- "d.getTime()"),
- nxt_string("1308899883625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setHours(20);"
- "d.getTime()"),
- nxt_string("1308902523625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setMonth(2, 10);"
- "d.getTime()"),
- nxt_string("1299733323625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setMonth(2);"
- "d.getTime()"),
- nxt_string("1300942923625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setFullYear(2010, 2, 10);"
- "d.getTime()"),
- nxt_string("1268197323625") },
-
- { nxt_string("var d = new Date(1308895323625); d.setFullYear(2010, 2);"
- "d.getTime()"),
- nxt_string("1269406923625") },
-
- { nxt_string("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
- "d.toJSON(1)"),
- nxt_string("2011-06-24T06:00:12.625Z") },
-};
-
-
-static njs_unit_test_t njs_regexp_test[] =
-{
- { nxt_string("/[\\\\u02E0-\\\\u02E4]/"),
- nxt_string("/[\\\\u02E0-\\\\u02E4]/") },
-
- { nxt_string("/[\\u02E0-\\u02E4]/"),
- nxt_string("/[\\u02E0-\\u02E4]/") },
-
- { nxt_string("RegExp('[\\\\u02E0-\\\\u02E4]')"),
- nxt_string("/[\\u02E0-\\u02E4]/") },
-
- { nxt_string("/[\\u0430-\\u044f]+/.test('тест')"),
- nxt_string("true") },
-
- { nxt_string("RegExp('[\\\\u0430-\\\\u044f]+').test('тест')"),
- nxt_string("true") },
-
- { nxt_string("RegExp('[\\\\u0430-\\\\u044f]+').exec('тест')[0]"),
- nxt_string("тест") },
-
- { nxt_string("/[\\uFDE0-\\uFFFD]/g; export default 1"),
- nxt_string("SyntaxError: Illegal export statement in 1") },
-
- { nxt_string("RegExp(RegExp('\x00]]')).test('\x00]]')"),
- nxt_string("true") },
-
- { nxt_string("RegExp('\0').test('\0')"),
- nxt_string("true") },
-
- { nxt_string("RegExp('\x00').test('\0')"),
- nxt_string("true") },
-
- { nxt_string("RegExp('\x00\\\\x00').source"),
- nxt_string("\\u0000\\x00") },
-
- { nxt_string("/\\\0/"),
- nxt_string("/\\\\u0000/") },
-
- { nxt_string("RegExp('\\\\\\0').source"),
- nxt_string("\\\\u0000") },
-
- { nxt_string("RegExp('[\0]').test('\0')"),
- nxt_string("true") },
-};
-
-
-typedef struct {
- nxt_lvlhsh_t hash;
- const njs_extern_t *proto;
- nxt_mp_t *pool;
-
- uint32_t a;
- nxt_str_t uri;
-
- njs_opaque_value_t value;
-} njs_unit_test_req_t;
-
-
-typedef struct {
- njs_value_t name;
- njs_value_t value;
-} njs_unit_test_prop_t;
-
-
-static nxt_int_t
-lvlhsh_unit_test_key_test(nxt_lvlhsh_query_t *lhq, void *data)
-{
- nxt_str_t name;
- njs_unit_test_prop_t *prop;
-
- prop = data;
- njs_string_get(&prop->name, &name);
-
- if (name.length != lhq->key.length) {
- return NXT_DECLINED;
- }
-
- if (memcmp(name.start, lhq->key.start, lhq->key.length) == 0) {
- return NXT_OK;
- }
-
- return NXT_DECLINED;
-}
-
-
-static void *
-lvlhsh_unit_test_pool_alloc(void *pool, size_t size)
-{
- return nxt_mp_align(pool, size, size);
-}
-
-
-static void
-lvlhsh_unit_test_pool_free(void *pool, void *p, size_t size)
-{
- nxt_mp_free(pool, p);
-}
-
-
-static const nxt_lvlhsh_proto_t lvlhsh_proto nxt_aligned(64) = {
- NXT_LVLHSH_LARGE_SLAB,
- lvlhsh_unit_test_key_test,
- lvlhsh_unit_test_pool_alloc,
- lvlhsh_unit_test_pool_free,
-};
-
-
-static njs_unit_test_prop_t *
-lvlhsh_unit_test_alloc(nxt_mp_t *pool, const njs_value_t *name,
- const njs_value_t *value)
-{
- njs_unit_test_prop_t *prop;
-
- prop = nxt_mp_alloc(pool, sizeof(njs_unit_test_prop_t));
- if (prop == NULL) {
- return NULL;
- }
-
- prop->name = *name;
- prop->value = *value;
-
- return prop;
-}
-
-
-static nxt_int_t
-lvlhsh_unit_test_add(njs_unit_test_req_t *r, njs_unit_test_prop_t *prop)
-{
- nxt_lvlhsh_query_t lhq;
-
- njs_string_get(&prop->name, &lhq.key);
- lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
-
- lhq.replace = 1;
- lhq.value = (void *) prop;
- lhq.proto = &lvlhsh_proto;
- lhq.pool = r->pool;
-
- switch (nxt_lvlhsh_insert(&r->hash, &lhq)) {
-
- case NXT_OK:
- return NXT_OK;
-
- case NXT_DECLINED:
- default:
- return NXT_ERROR;
- }
-}
-
-
-static njs_ret_t
-njs_unit_test_r_get_uri_external(njs_vm_t *vm, njs_value_t *value, void *obj,
- uintptr_t data)
-{
- char *p = obj;
-
- nxt_str_t *field;
-
- field = (nxt_str_t *) (p + data);
-
- return njs_vm_value_string_set(vm, value, field->start, field->length);
-}
-
-
-static njs_ret_t
-njs_unit_test_r_set_uri_external(njs_vm_t *vm, void *obj, uintptr_t data,
- nxt_str_t *value)
-{
- char *p = obj;
-
- nxt_str_t *field;
-
- field = (nxt_str_t *) (p + data);
-
- *field = *value;
-
- return NXT_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_r_get_a_external(njs_vm_t *vm, njs_value_t *value, void *obj,
- uintptr_t data)
-{
- u_char buf[16], *p;
- njs_unit_test_req_t *r;
-
- r = (njs_unit_test_req_t *) obj;
-
- p = nxt_sprintf(buf, buf + nxt_length(buf), "%uD", r->a);
-
- return njs_vm_value_string_set(vm, value, buf, p - buf);
-}
-
-
-static njs_ret_t
-njs_unit_test_r_get_b_external(njs_vm_t *vm, njs_value_t *value, void *obj,
- uintptr_t data)
-{
- njs_value_number_set(value, data);
-
- return NJS_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_host_external(njs_vm_t *vm, njs_value_t *value, void *obj,
- uintptr_t data)
-{
- return njs_vm_value_string_set(vm, value, (u_char *) "АБВГДЕЁЖЗИЙ", 22);
-}
-
-
-static njs_ret_t
-njs_unit_test_r_get_vars(njs_vm_t *vm, njs_value_t *value, void *obj,
- uintptr_t data)
-{
- nxt_int_t ret;
- nxt_str_t *key;
- nxt_lvlhsh_query_t lhq;
- njs_unit_test_req_t *r;
- njs_unit_test_prop_t *prop;
-
- r = (njs_unit_test_req_t *) obj;
- key = (nxt_str_t *) data;
-
- lhq.key = *key;
- lhq.key_hash = nxt_djb_hash(key->start, key->length);
- lhq.proto = &lvlhsh_proto;
-
- ret = nxt_lvlhsh_find(&r->hash, &lhq);
-
- prop = lhq.value;
-
- if (ret == NXT_OK && njs_is_valid(&prop->value)) {
- *value = prop->value;
- return NXT_OK;
- }
-
- njs_value_undefined_set(value);
-
- return NXT_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_r_set_vars(njs_vm_t *vm, void *obj, uintptr_t data,
- nxt_str_t *value)
-{
- nxt_int_t ret;
- nxt_str_t *key;
- njs_value_t name, val;
- njs_unit_test_req_t *r;
- njs_unit_test_prop_t *prop;
-
- r = (njs_unit_test_req_t *) obj;
- key = (nxt_str_t *) data;
-
- if (key->length == 5 && memcmp(key->start, "error", 5) == 0) {
- njs_vm_error(vm, "cannot set \"error\" prop");
- return NXT_ERROR;
- }
-
- njs_vm_value_string_set(vm, &name, key->start, key->length);
- njs_vm_value_string_set(vm, &val, value->start, value->length);
-
- prop = lvlhsh_unit_test_alloc(vm->mem_pool, &name, &val);
- if (prop == NULL) {
- njs_memory_error(vm);
- return NXT_ERROR;
- }
-
- ret = lvlhsh_unit_test_add(r, prop);
- if (ret != NXT_OK) {
- njs_vm_error(vm, "lvlhsh_unit_test_add() failed");
- return NXT_ERROR;
- }
-
- return NXT_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_r_del_vars(njs_vm_t *vm, void *obj, uintptr_t data,
- nxt_bool_t delete)
-{
- nxt_int_t ret;
- nxt_str_t *key;
- nxt_lvlhsh_query_t lhq;
- njs_unit_test_req_t *r;
- njs_unit_test_prop_t *prop;
-
- r = (njs_unit_test_req_t *) obj;
- key = (nxt_str_t *) data;
-
- if (key->length == 5 && memcmp(key->start, "error", 5) == 0) {
- njs_vm_error(vm, "cannot delete \"error\" prop");
- return NXT_ERROR;
- }
-
- lhq.key = *key;
- lhq.key_hash = nxt_djb_hash(key->start, key->length);
- lhq.proto = &lvlhsh_proto;
-
- ret = nxt_lvlhsh_find(&r->hash, &lhq);
-
- prop = lhq.value;
-
- if (ret == NXT_OK) {
- njs_set_invalid(&prop->value);
- }
-
- return NXT_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_header_external(njs_vm_t *vm, njs_value_t *value, void *obj,
- uintptr_t data)
-{
- u_char *p;
- uint32_t size;
- nxt_str_t *h;
-
- h = (nxt_str_t *) data;
-
- size = 7 + h->length;
-
- p = njs_vm_value_string_alloc(vm, value, size);
- if (p == NULL) {
- return NJS_ERROR;
- }
-
- p = nxt_cpymem(p, h->start, h->length);
- *p++ = '|';
- memcpy(p, "АБВ", 6);
-
- return NJS_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_header_foreach_external(njs_vm_t *vm, void *obj, void *next)
-{
- u_char *s;
-
- s = next;
- s[0] = '0';
- s[1] = '0';
-
- return NXT_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_header_next_external(njs_vm_t *vm, njs_value_t *value, void *obj,
- void *next)
-{
- u_char *s;
-
- s = next;
- s[1]++;
-
- if (s[1] == '4') {
- return NXT_DONE;
- }
-
- return njs_vm_value_string_set(vm, value, s, 2);
-}
-
-
-static njs_ret_t
-njs_unit_test_method_external(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
- njs_index_t unused)
-{
- nxt_int_t ret;
- nxt_str_t s;
- njs_unit_test_req_t *r;
-
- r = njs_vm_external(vm, njs_arg(args, nargs, 0));
- if (nxt_slow_path(r == NULL)) {
- return NJS_ERROR;
- }
-
- ret = njs_vm_value_to_string(vm, &s, njs_arg(args, nargs, 1));
- if (ret == NXT_OK && s.length == 3 && memcmp(s.start, "YES", 3) == 0) {
- return njs_vm_value_string_set(vm, njs_vm_retval(vm), r->uri.start,
- r->uri.length);
- }
-
- vm->retval = njs_value_undefined;
-
- return NJS_OK;
-}
-
-
-static njs_ret_t
-njs_unit_test_create_external(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
- njs_index_t unused)
-{
- nxt_int_t ret;
- nxt_str_t uri;
- njs_value_t *value;
- njs_unit_test_req_t *r, *sr;
-
- r = njs_vm_external(vm, njs_arg(args, nargs, 0));
- if (nxt_slow_path(r == NULL)) {
- return NJS_ERROR;
- }
-
- if (njs_vm_value_to_string(vm, &uri, njs_arg(args, nargs, 1)) != NJS_OK) {
- return NJS_ERROR;
- }
-
- value = nxt_mp_zalloc(r->pool, sizeof(njs_opaque_value_t));
- if (value == NULL) {
- goto memory_error;
- }
-
- sr = nxt_mp_zalloc(r->pool, sizeof(njs_unit_test_req_t));
- if (sr == NULL) {
- goto memory_error;
- }
-
- sr->uri = uri;
- sr->pool = r->pool;
- sr->proto = r->proto;
-
- ret = njs_vm_external_create(vm, value, sr->proto, sr);
- if (ret != NXT_OK) {
- return NJS_ERROR;
- }
-
- njs_vm_retval_set(vm, value);
-
- return NJS_OK;
-
-memory_error:
-
- njs_memory_error(vm);
-
- return NXT_ERROR;
-}
-
-
-static njs_external_t njs_unit_test_r_props[] = {
-
- { nxt_string("a"),
- NJS_EXTERN_PROPERTY,
- NULL,
- 0,
- njs_unit_test_r_get_a_external,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- 0 },
-
- { nxt_string("b"),
- NJS_EXTERN_PROPERTY,
- NULL,
- 0,
- njs_unit_test_r_get_b_external,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- 42 },
-};
-
-
-static njs_external_t njs_unit_test_r_external[] = {
-
- { nxt_string("uri"),
- NJS_EXTERN_PROPERTY,
- NULL,
- 0,
- njs_unit_test_r_get_uri_external,
- njs_unit_test_r_set_uri_external,
- NULL,
- NULL,
- NULL,
- NULL,
- offsetof(njs_unit_test_req_t, uri) },
-
- { nxt_string("host"),
- NJS_EXTERN_PROPERTY,
- NULL,
- 0,
- njs_unit_test_host_external,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- 0 },
-
- { nxt_string("props"),
- NJS_EXTERN_OBJECT,
- njs_unit_test_r_props,
- nxt_nitems(njs_unit_test_r_props),
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- 0 },
-
- { nxt_string("vars"),
- NJS_EXTERN_OBJECT,
- NULL,
- 0,
- njs_unit_test_r_get_vars,
- njs_unit_test_r_set_vars,
- njs_unit_test_r_del_vars,
- NULL,
- NULL,
- NULL,
- 0 },
-
- { nxt_string("consts"),
- NJS_EXTERN_OBJECT,
- NULL,
- 0,
- njs_unit_test_r_get_vars,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- 0 },
-
- { nxt_string("header"),
- NJS_EXTERN_OBJECT,
- NULL,
- 0,
- njs_unit_test_header_external,
- NULL,
- NULL,
- njs_unit_test_header_foreach_external,
- njs_unit_test_header_next_external,
- NULL,
- 0 },
-
- { nxt_string("some_method"),
- NJS_EXTERN_METHOD,
- NULL,
- 0,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- njs_unit_test_method_external,
- 0 },
-
- { nxt_string("create"),
- NJS_EXTERN_METHOD,
- NULL,
- 0,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- njs_unit_test_create_external,
- 0 },
-
-};
-
-
-static njs_external_t nxt_test_external[] = {
-
- { nxt_string("request.proto"),
- NJS_EXTERN_OBJECT,
- njs_unit_test_r_external,
- nxt_nitems(njs_unit_test_r_external),
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- 0 },
-
-};
-
-
-typedef struct {
- nxt_str_t name;
- njs_unit_test_req_t request;
- njs_unit_test_prop_t props[2];
-} njs_unit_test_req_t_init_t;
-
-
-static const njs_unit_test_req_t_init_t nxt_test_requests[] = {
-
- { nxt_string("$r"),
- {
- .uri = nxt_string("АБВ"),
- .a = 1
- },
- {
- { njs_string("p"), njs_string("pval") },
- { njs_string("p2"), njs_string("p2val") },
- }
- },
-
- { nxt_string("$r2"),
- {
- .uri = nxt_string("αβγ"),
- .a = 2
- },
- {
- { njs_string("q"), njs_string("qval") },
- { njs_string("q2"), njs_string("q2val") },
- }
- },
-
- { nxt_string("$r3"),
- {
- .uri = nxt_string("abc"),
- .a = 3
- },
- {
- { njs_string("k"), njs_string("kval") },
- { njs_string("k2"), njs_string("k2val") },
- }
- },
-};
-
-
-static nxt_int_t
-njs_externals_init(njs_vm_t *vm)
-{
- nxt_int_t ret;
- nxt_uint_t i, j;
- const njs_extern_t *proto;
- njs_unit_test_req_t *requests;
- njs_unit_test_prop_t *prop;
-
- proto = njs_vm_external_prototype(vm, &nxt_test_external[0]);
- if (proto == NULL) {
- nxt_printf("njs_vm_external_prototype() failed\n");
- return NXT_ERROR;
- }
-
- requests = nxt_mp_zalloc(vm->mem_pool,
- nxt_nitems(nxt_test_requests)
- * sizeof(njs_unit_test_req_t));
- if (requests == NULL) {
- return NXT_ERROR;
- }
-
- for (i = 0; i < nxt_nitems(nxt_test_requests); i++) {
-
- requests[i] = nxt_test_requests[i].request;
- requests[i].pool = vm->mem_pool;
- requests[i].proto = proto;
-
- ret = njs_vm_external_create(vm, njs_value_arg(&requests[i].value),
- proto, &requests[i]);
- if (ret != NXT_OK) {
- nxt_printf("njs_vm_external_create() failed\n");
- return NXT_ERROR;
- }
-
- ret = njs_vm_external_bind(vm, &nxt_test_requests[i].name,
- njs_value_arg(&requests[i].value));
- if (ret != NXT_OK) {
- nxt_printf("njs_vm_external_bind() failed\n");
- return NXT_ERROR;
- }
-
- for (j = 0; j < nxt_nitems(nxt_test_requests[i].props); j++) {
- prop = lvlhsh_unit_test_alloc(vm->mem_pool,
- &nxt_test_requests[i].props[j].name,
- &nxt_test_requests[i].props[j].value);
-
- if (prop == NULL) {
- nxt_printf("lvlhsh_unit_test_alloc() failed\n");
- return NXT_ERROR;
- }
-
- ret = lvlhsh_unit_test_add(&requests[i], prop);
- if (ret != NXT_OK) {
- nxt_printf("lvlhsh_unit_test_add() failed\n");
- return NXT_ERROR;
- }
- }
- }
-
- return NXT_OK;
-}
-
-
-typedef struct {
- nxt_bool_t disassemble;
- nxt_bool_t verbose;
- nxt_bool_t module;
-} njs_opts_t;
-
-
-typedef struct {
- nxt_uint_t passed;
- nxt_uint_t failed;
-} njs_stat_t;
-
-
-static void
-njs_unit_test_report(const char *msg, njs_stat_t *prev, njs_stat_t *current)
-{
- njs_stat_t stat;
-
- stat.failed = current->failed - prev->failed;
- stat.passed = current->passed - prev->passed;
-
- nxt_printf("%s: %s [%d/%d]\n", msg, stat.failed ? "FAILED" : "PASSED",
- stat.passed, stat.passed + stat.failed);
-}
-
-
-static nxt_int_t
-njs_unit_test(njs_unit_test_t tests[], size_t num, const char *name,
- njs_opts_t *opts, njs_stat_t *stat)
-{
- u_char *start;
- njs_vm_t *vm, *nvm;
- nxt_int_t ret, rc;
- nxt_str_t s;
- nxt_uint_t i;
- njs_stat_t prev;
- nxt_bool_t success;
- njs_vm_opt_t options;
-
- vm = NULL;
- nvm = NULL;
-
- prev = *stat;
-
- rc = NXT_ERROR;
-
- for (i = 0; i < num; i++) {
-
- if (opts->verbose) {
- nxt_printf("\"%V\"\n", &tests[i].script);
- }
-
- nxt_memzero(&options, sizeof(njs_vm_opt_t));
-
- options.module = opts->module;
-
- vm = njs_vm_create(&options);
- if (vm == NULL) {
- nxt_printf("njs_vm_create() failed\n");
- goto done;
- }
-
- ret = njs_externals_init(vm);
- if (ret != NXT_OK) {
- goto done;
- }
-
- start = tests[i].script.start;
-
- ret = njs_vm_compile(vm, &start, start + tests[i].script.length);
-
- if (ret == NXT_OK) {
- if (opts->disassemble) {
- njs_disassembler(vm);
- }
-
- nvm = njs_vm_clone(vm, NULL);
- if (nvm == NULL) {
- nxt_printf("njs_vm_clone() failed\n");
- goto done;
- }
-
- ret = njs_vm_start(nvm);
-
- if (njs_vm_retval_string(nvm, &s) != NXT_OK) {
- nxt_printf("njs_vm_retval_string() failed\n");
- goto done;
- }
-
- } else {
- if (njs_vm_retval_string(vm, &s) != NXT_OK) {
- nxt_printf("njs_vm_retval_string() failed\n");
- goto done;
- }
- }
-
- success = nxt_strstr_eq(&tests[i].ret, &s);
-
- if (!success) {
- nxt_printf("njs(\"%V\")\nexpected: \"%V\"\n got: \"%V\"\n",
- &tests[i].script, &tests[i].ret, &s);
-
- stat->failed++;
-
- } else {
- stat->passed++;
- }
-
- if (nvm != NULL) {
- njs_vm_destroy(nvm);
- nvm = NULL;
- }
-
- njs_vm_destroy(vm);
- vm = NULL;
- }
-
- rc = NXT_OK;
-
-done:
-
- if (nvm != NULL) {
- njs_vm_destroy(nvm);
- }
-
- if (vm != NULL) {
- njs_vm_destroy(vm);
- }
-
- njs_unit_test_report(name, &prev, stat);
-
- return rc;
-}
-
-
-static nxt_int_t
-njs_timezone_optional_test(njs_opts_t *opts, njs_stat_t *stat)
-{
- size_t size;
- u_char buf[16];
- time_t clock;
- struct tm tm;
- nxt_int_t ret;
-
- /*
- * Chatham Islands NZ-CHAT time zone.
- * Standard time: UTC+12:45, Daylight Saving time: UTC+13:45.
- */
- (void) putenv((char *) "TZ=Pacific/Chatham");
- tzset();
-
- clock = 0;
- localtime_r(&clock, &tm);
-
- size = strftime((char *) buf, sizeof(buf), "%z", &tm);
-
- if (memcmp(buf, "+1245", size) == 0) {
- ret = njs_unit_test(njs_tz_test, nxt_nitems(njs_tz_test),
- "timezone tests", opts, stat);
- if (ret != NXT_OK) {
- return ret;
- }
-
- } else {
- nxt_printf("njs timezone tests skipped, timezone is unavailable\n");
- }
-
- return NXT_OK;
-}
-
-
-static nxt_int_t
-njs_regexp_optional_test(njs_opts_t *opts, njs_stat_t *stat)
-{
- int erroff;
- pcre *re1, *re2;
- njs_ret_t ret;
- const char *errstr;
-
- /*
- * pcre-8.21 crashes when it compiles unicode escape codes inside
- * square brackets when PCRE_UTF8 option is provided.
- * Catching it in runtime by compiling it without PCRE_UTF8. Normally it
- * should return NULL and "character value in \u.... sequence is too large"
- * error string.
- */
- re1 = pcre_compile("/[\\u0410]/", PCRE_JAVASCRIPT_COMPAT, &errstr, &erroff,
- NULL);
-
- /*
- * pcre-7.8 fails to compile unicode escape codes inside square brackets
- * even when PCRE_UTF8 option is provided.
- */
- re2 = pcre_compile("/[\\u0410]/", PCRE_JAVASCRIPT_COMPAT | PCRE_UTF8,
- &errstr, &erroff, NULL);
-
- if (re1 == NULL && re2 != NULL) {
- ret = njs_unit_test(njs_regexp_test, nxt_nitems(njs_regexp_test),
- "unicode regexp tests", opts, stat);
- if (ret != NXT_OK) {
- return ret;
- }
-
- } else {
- nxt_printf("njs unicode regexp tests skipped, libpcre fails\n");
- }
-
- if (re1 != NULL) {
- pcre_free(re1);
- }
-
- if (re2 != NULL) {
- pcre_free(re2);
- }
-
- return NXT_OK;
-}
-
-
-static nxt_int_t
-njs_vm_json_test(njs_opts_t *opts, njs_stat_t *stat)
-{
- njs_vm_t *vm;
- nxt_int_t ret, rc;
- nxt_str_t s, *script;
- nxt_uint_t i;
- nxt_bool_t success;
- njs_stat_t prev;
- njs_value_t args[3];
- njs_vm_opt_t options;
-
- static const nxt_str_t fname = nxt_string("replacer");
- static const nxt_str_t iname = nxt_string("indent");
-
- static njs_unit_test_t tests[] = {
- { nxt_string("'[1, true, \"x\", {\"a\": {}}]'"),
- nxt_string("[1,true,\"x\",{\"a\":{}}]") },
- { nxt_string("'{\"a\":{\"b\":1}}'"),
- nxt_string("{\"a\":{\"b\":1}}") },
- { nxt_string("'[[[],{}]]'"),
- nxt_string("[[[],{}]]") },
- { nxt_string("var indent = 1; '[]'"),
- nxt_string("[\n \n]") },
- { nxt_string("function replacer(k, v) {return v}; '{\"a\":{\"b\":1}}'"),
- nxt_string("{\"a\":{\"b\":1}}") },
- { nxt_string("function replacer(k, v) {"
- " return (typeof v === 'string') ? undefined : v};"
- "'{\"a\":1, \"b\":\"x\"}'"),
- nxt_string("{\"a\":1}") },
- };
-
- vm = NULL;
-
- prev = *stat;
-
- rc = NXT_ERROR;
-
- for (i = 0; i < nxt_nitems(tests); i++) {
-
- memset(&options, 0, sizeof(njs_vm_opt_t));
- options.init = 1;
-
- vm = njs_vm_create(&options);
- if (vm == NULL) {
- nxt_printf("njs_vm_create() failed\n");
- goto done;
- }
-
- script = &tests[i].script;
-
- ret = njs_vm_compile(vm, &script->start,
- script->start + script->length);
-
- if (ret != NXT_OK) {
- nxt_printf("njs_vm_compile() failed\n");
- goto done;
- }
-
- ret = njs_vm_start(vm);
- if (ret != NXT_OK) {
- nxt_printf("njs_vm_run() failed\n");
- goto done;
- }
-
- args[0] = *njs_vm_retval(vm);
-
- ret = njs_vm_json_parse(vm, args, 1);
- if (ret != NXT_OK) {
- nxt_printf("njs_vm_json_parse() failed\n");
- goto done;
- }
-
- args[0] = vm->retval;
- args[1] = *njs_vm_value(vm, &fname);
- args[2] = *njs_vm_value(vm, &iname);
-
- ret = njs_vm_json_stringify(vm, args, 3);
- if (ret != NXT_OK) {
- nxt_printf("njs_vm_json_stringify() failed\n");
- goto done;
- }
-
- if (njs_vm_retval_string(vm, &s) != NXT_OK) {
- nxt_printf("njs_vm_retval_string() failed\n");
- goto done;
- }
-
- success = nxt_strstr_eq(&tests[i].ret, &s);
-
- if (!success) {
- nxt_printf("njs_vm_json_test(\"%V\")\n"
- "expected: \"%V\"\n got: \"%V\"\n", script,
- &tests[i].ret, &s);
-
- stat->failed++;
-
- } else {
- stat->passed++;
- }
-
- njs_vm_destroy(vm);
- vm = NULL;
-
- }
-
- rc = NXT_OK;
-
-done:
-
- if (rc != NXT_OK) {
- if (njs_vm_retval_string(vm, &s) != NXT_OK) {
- nxt_printf("njs_vm_retval_string() failed\n");
-
- } else {
- nxt_printf("%V\n", &s);
- }
- }
-
- njs_unit_test_report("VM json API tests", &prev, stat);
-
- if (vm != NULL) {
- njs_vm_destroy(vm);
- }
-
- return rc;
-}
-
-
-static nxt_int_t
-njs_vm_object_alloc_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
-{
- njs_ret_t ret;
- njs_value_t args[2], obj;
-
- static const njs_value_t num_key = njs_string("num");
- static const njs_value_t bool_key = njs_string("bool");
-
- njs_value_number_set(njs_argument(&args, 0), 1);
- njs_value_boolean_set(njs_argument(&args, 1), 0);
-
- ret = njs_vm_object_alloc(vm, &obj, NULL);
- if (ret != NJS_OK) {
- return NXT_ERROR;
- }
-
- ret = njs_vm_object_alloc(vm, &obj, &num_key, NULL);
- if (ret == NJS_OK) {
- return NXT_ERROR;
- }
-
- ret = njs_vm_object_alloc(vm, &obj, &num_key, &args[0], NULL);
- if (ret != NJS_OK) {
- return NXT_ERROR;
- }
-
- ret = njs_vm_object_alloc(vm, &obj, &num_key, &args[0], &bool_key,
- &args[1], NULL);
- if (ret != NJS_OK) {
- stat->failed++;
- return NXT_OK;
- }
-
- stat->passed++;
-
- return NXT_OK;
-}
-
-
-static nxt_int_t
-nxt_file_basename_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
-{
- nxt_str_t name;
- nxt_bool_t success;
- nxt_uint_t i;
-
- static const struct {
- nxt_str_t path;
- nxt_str_t expected;
- } tests[] = {
- { nxt_string(""), nxt_string("") },
- { nxt_string("/"), nxt_string("") },
- { nxt_string("/a"), nxt_string("a") },
- { nxt_string("///"), nxt_string("") },
- { nxt_string("///a"), nxt_string("a") },
- { nxt_string("///a/"), nxt_string("") },
- { nxt_string("a"), nxt_string("a") },
- { nxt_string("a/"), nxt_string("") },
- { nxt_string("a//"), nxt_string("") },
- { nxt_string("path/name"), nxt_string("name") },
- { nxt_string("/path/name"), nxt_string("name") },
- { nxt_string("/path/name/"), nxt_string("") },
- };
-
- for (i = 0; i < nxt_nitems(tests); i++) {
- nxt_file_basename(&tests[i].path, &name);
-
- success = nxt_strstr_eq(&tests[i].expected, &name);
-
- if (!success) {
- nxt_printf("nxt_file_basename_test(\"%V\"):\n"
- "expected: \"%V\"\n got: \"%V\"\n",
- &tests[i].path, &tests[i].expected, &name);
-
- stat->failed++;
-
- } else {
- stat->passed++;
- }
- }
-
- return NXT_OK;
-}
-
-
-static nxt_int_t
-nxt_file_dirname_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
-{
- nxt_str_t name;
- nxt_bool_t success;
- nxt_uint_t i;
-
- static const struct {
- nxt_str_t path;
- nxt_str_t expected;
- } tests[] = {
- { nxt_string(""), nxt_string(".") },
- { nxt_string("/"), nxt_string("/") },
- { nxt_string("/a"), nxt_string("/") },
- { nxt_string("///"), nxt_string("///") },
- { nxt_string("///a"), nxt_string("///") },
- { nxt_string("///a/"), nxt_string("///a") },
- { nxt_string("a"), nxt_string(".") },
- { nxt_string("a/"), nxt_string("a") },
- { nxt_string("a//"), nxt_string("a") },
- { nxt_string("p1/p2/name"), nxt_string("p1/p2") },
- { nxt_string("/p1/p2/name"), nxt_string("/p1/p2") },
- { nxt_string("/p1/p2///name"), nxt_string("/p1/p2") },
- { nxt_string("/p1/p2/name/"), nxt_string("/p1/p2/name") },
- };
-
- for (i = 0; i < nxt_nitems(tests); i++) {
- nxt_file_dirname(&tests[i].path, &name);
-
- success = nxt_strstr_eq(&tests[i].expected, &name);
-
- if (!success) {
- nxt_printf("nxt_file_dirname_test(\"%V\"):\n"
- "expected: \"%V\"\n got: \"%V\"\n",
- &tests[i].path, &tests[i].expected, &name);
-
- stat->failed++;
- } else {
- stat->passed++;
- }
-
- }
-
- return NXT_OK;
-}
-
-
-static nxt_int_t
-njs_api_test(njs_opts_t *opts, njs_stat_t *stat)
-{
- njs_vm_t *vm;
- nxt_int_t ret, rc;
- nxt_uint_t i;
- njs_stat_t prev;
- njs_vm_opt_t options;
-
- static const struct {
- nxt_int_t (*test)(njs_vm_t *, njs_opts_t *, njs_stat_t *stat);
- nxt_str_t name;
- } tests[] = {
- { njs_vm_object_alloc_test,
- nxt_string("njs_vm_object_alloc_test") },
- { nxt_file_basename_test,
- nxt_string("nxt_file_basename_test") },
- { nxt_file_dirname_test,
- nxt_string("nxt_file_dirname_test") },
- };
-
- vm = NULL;
- nxt_memzero(&options, sizeof(njs_vm_opt_t));
-
- prev = *stat;
-
- rc = NXT_ERROR;
-
- for (i = 0; i < nxt_nitems(tests); i++) {
- vm = njs_vm_create(&options);
- if (vm == NULL) {
- nxt_printf("njs_vm_create() failed\n");
- goto done;
- }
-
- ret = tests[i].test(vm, opts, stat);
- if (nxt_slow_path(ret != NXT_OK)) {
- nxt_printf("njs_api_test: \"%V\" test failed\n", &tests[i].name);
- goto done;
- }
-
- njs_vm_destroy(vm);
- vm = NULL;
- }
-
- rc = NXT_OK;
-
-done:
-
- njs_unit_test_report("API tests", &prev, stat);
-
- if (vm != NULL) {
- njs_vm_destroy(vm);
- }
-
- return rc;
-}
-
-
-int nxt_cdecl
-main(int argc, char **argv)
-{
- nxt_int_t ret;
- njs_opts_t opts;
- njs_stat_t stat;
-
- nxt_memzero(&opts, sizeof(njs_opts_t));
-
- if (argc > 1) {
- switch (argv[1][0]) {
-
- case 'd':
- opts.disassemble = 1;
- break;
-
- case 'v':
- opts.verbose = 1;
- break;
-
- default:
- break;
- }
- }
-
- (void) putenv((char *) "TZ=UTC");
- tzset();
-
- nxt_memzero(&stat, sizeof(njs_stat_t));
-
- ret = njs_unit_test(njs_test, nxt_nitems(njs_test), "script tests",
- &opts, &stat);
- if (ret != NXT_OK) {
- return ret;
- }
-
- ret = njs_timezone_optional_test(&opts, &stat);
- if (ret != NXT_OK) {
- return ret;
- }
-
- ret = njs_regexp_optional_test(&opts, &stat);
- if (ret != NXT_OK) {
- return ret;
- }
-
- ret = njs_vm_json_test(&opts, &stat);
- if (ret != NXT_OK) {
- return ret;
- }
-
- ret = njs_api_test(&opts, &stat);
- if (ret != NXT_OK) {
- return ret;
- }
-
- opts.module = 1;
-
- ret = njs_unit_test(njs_module_test, nxt_nitems(njs_module_test),
- "module tests", &opts, &stat);
- if (ret != NXT_OK) {
- return ret;
- }
-
- nxt_printf("TOTAL: %s [%ui/%ui]\n", stat.failed ? "FAILED" : "PASSED",
- stat.passed, stat.passed + stat.failed);
-
- return stat.failed ? EXIT_FAILURE : EXIT_SUCCESS;
-}
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_CLANG_H_INCLUDED_
-#define _NXT_CLANG_H_INCLUDED_
-
-
-#include <stdarg.h>
-#include <stddef.h> /* offsetof(). */
-#include <unistd.h> /* NULL. */
-
-
-#define nxt_inline static inline __attribute__((always_inline))
-#define nxt_noinline __attribute__((noinline))
-#define nxt_cdecl
-
-
-#define nxt_container_of(p, type, field) \
- (type *) ((u_char *) (p) - offsetof(type, field))
-
-#define nxt_nitems(x) \
- (sizeof(x) / sizeof((x)[0]))
-
-
-#if (NXT_HAVE_BUILTIN_EXPECT)
-#define nxt_expect(c, x) __builtin_expect((long) (x), (c))
-#define nxt_fast_path(x) nxt_expect(1, x)
-#define nxt_slow_path(x) nxt_expect(0, x)
-
-#else
-#define nxt_expect(c, x) (x)
-#define nxt_fast_path(x) (x)
-#define nxt_slow_path(x) (x)
-#endif
-
-
-#if (NXT_HAVE_BUILTIN_UNREACHABLE)
-#define nxt_unreachable() __builtin_unreachable()
-
-#else
-#define nxt_unreachable()
-#endif
-
-
-#if (NXT_HAVE_BUILTIN_PREFETCH)
-#define nxt_prefetch(a) __builtin_prefetch(a)
-
-#else
-#define nxt_prefetch(a)
-#endif
-
-
-#if (NXT_HAVE_BUILTIN_CLZ)
-#define nxt_leading_zeros(x) (((x) == 0) ? 32 : __builtin_clz(x))
-
-#else
-
-nxt_inline uint32_t
-nxt_leading_zeros(uint32_t x)
-{
- uint32_t n;
-
- /*
- * There is no sense to optimize this function, since almost
- * all platforms nowadays support the built-in instruction.
- */
-
- if (x == 0) {
- return 32;
- }
-
- n = 0;
-
- while ((x & 0x80000000) == 0) {
- n++;
- x <<= 1;
- }
-
- return n;
-}
-
-#endif
-
-
-#if (NXT_HAVE_BUILTIN_CLZLL)
-#define nxt_leading_zeros64(x) (((x) == 0) ? 64 : __builtin_clzll(x))
-
-#else
-
-nxt_inline uint64_t
-nxt_leading_zeros64(uint64_t x)
-{
- uint64_t n;
-
- /*
- * There is no sense to optimize this function, since almost
- * all platforms nowadays support the built-in instruction.
- */
-
- if (x == 0) {
- return 64;
- }
-
- n = 0;
-
- while ((x & 0x8000000000000000) == 0) {
- n++;
- x <<= 1;
- }
-
- return n;
-}
-
-#endif
-
-
-#if (NXT_HAVE_GCC_ATTRIBUTE_VISIBILITY)
-#define NXT_EXPORT __attribute__((visibility("default")))
-
-#else
-#define NXT_EXPORT
-#endif
-
-
-#if (NXT_HAVE_GCC_ATTRIBUTE_ALIGNED)
-#define nxt_aligned(x) __attribute__((aligned(x)))
-
-#else
-#define nxt_aligned(x)
-#endif
-
-
-#if (NXT_HAVE_GCC_ATTRIBUTE_MALLOC)
-#define NXT_MALLOC_LIKE __attribute__((__malloc__))
-
-#else
-#define NXT_MALLOC_LIKE
-#endif
-
-
-#if (NXT_CLANG)
-/* Any __asm__ directive disables loop vectorization in GCC and Clang. */
-#define nxt_pragma_loop_disable_vectorization __asm__("")
-
-#else
-#define nxt_pragma_loop_disable_vectorization
-#endif
-
-
-#if (NXT_HAVE_MEMORY_SANITIZER)
-#include <sanitizer/msan_interface.h>
-
-#define nxt_msan_unpoison(ptr, size) __msan_unpoison(ptr, size)
-#endif
-
-
-#endif /* _NXT_CLANG_H_INCLUDED_ */
+++ /dev/null
-
-/*
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) NGINX, Inc.
- *
- * An internal diy_fp implementation.
- * For details, see Loitsch, Florian. "Printing floating-point numbers quickly
- * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_diyfp.h>
-
-
-typedef struct nxt_cpe_s {
- uint64_t significand;
- int16_t bin_exp;
- int16_t dec_exp;
-} nxt_cpe_t;
-
-
-static const nxt_cpe_t nxt_cached_powers[] = {
- { nxt_uint64(0xfa8fd5a0, 0x081c0288), -1220, -348 },
- { nxt_uint64(0xbaaee17f, 0xa23ebf76), -1193, -340 },
- { nxt_uint64(0x8b16fb20, 0x3055ac76), -1166, -332 },
- { nxt_uint64(0xcf42894a, 0x5dce35ea), -1140, -324 },
- { nxt_uint64(0x9a6bb0aa, 0x55653b2d), -1113, -316 },
- { nxt_uint64(0xe61acf03, 0x3d1a45df), -1087, -308 },
- { nxt_uint64(0xab70fe17, 0xc79ac6ca), -1060, -300 },
- { nxt_uint64(0xff77b1fc, 0xbebcdc4f), -1034, -292 },
- { nxt_uint64(0xbe5691ef, 0x416bd60c), -1007, -284 },
- { nxt_uint64(0x8dd01fad, 0x907ffc3c), -980, -276 },
- { nxt_uint64(0xd3515c28, 0x31559a83), -954, -268 },
- { nxt_uint64(0x9d71ac8f, 0xada6c9b5), -927, -260 },
- { nxt_uint64(0xea9c2277, 0x23ee8bcb), -901, -252 },
- { nxt_uint64(0xaecc4991, 0x4078536d), -874, -244 },
- { nxt_uint64(0x823c1279, 0x5db6ce57), -847, -236 },
- { nxt_uint64(0xc2109436, 0x4dfb5637), -821, -228 },
- { nxt_uint64(0x9096ea6f, 0x3848984f), -794, -220 },
- { nxt_uint64(0xd77485cb, 0x25823ac7), -768, -212 },
- { nxt_uint64(0xa086cfcd, 0x97bf97f4), -741, -204 },
- { nxt_uint64(0xef340a98, 0x172aace5), -715, -196 },
- { nxt_uint64(0xb23867fb, 0x2a35b28e), -688, -188 },
- { nxt_uint64(0x84c8d4df, 0xd2c63f3b), -661, -180 },
- { nxt_uint64(0xc5dd4427, 0x1ad3cdba), -635, -172 },
- { nxt_uint64(0x936b9fce, 0xbb25c996), -608, -164 },
- { nxt_uint64(0xdbac6c24, 0x7d62a584), -582, -156 },
- { nxt_uint64(0xa3ab6658, 0x0d5fdaf6), -555, -148 },
- { nxt_uint64(0xf3e2f893, 0xdec3f126), -529, -140 },
- { nxt_uint64(0xb5b5ada8, 0xaaff80b8), -502, -132 },
- { nxt_uint64(0x87625f05, 0x6c7c4a8b), -475, -124 },
- { nxt_uint64(0xc9bcff60, 0x34c13053), -449, -116 },
- { nxt_uint64(0x964e858c, 0x91ba2655), -422, -108 },
- { nxt_uint64(0xdff97724, 0x70297ebd), -396, -100 },
- { nxt_uint64(0xa6dfbd9f, 0xb8e5b88f), -369, -92 },
- { nxt_uint64(0xf8a95fcf, 0x88747d94), -343, -84 },
- { nxt_uint64(0xb9447093, 0x8fa89bcf), -316, -76 },
- { nxt_uint64(0x8a08f0f8, 0xbf0f156b), -289, -68 },
- { nxt_uint64(0xcdb02555, 0x653131b6), -263, -60 },
- { nxt_uint64(0x993fe2c6, 0xd07b7fac), -236, -52 },
- { nxt_uint64(0xe45c10c4, 0x2a2b3b06), -210, -44 },
- { nxt_uint64(0xaa242499, 0x697392d3), -183, -36 },
- { nxt_uint64(0xfd87b5f2, 0x8300ca0e), -157, -28 },
- { nxt_uint64(0xbce50864, 0x92111aeb), -130, -20 },
- { nxt_uint64(0x8cbccc09, 0x6f5088cc), -103, -12 },
- { nxt_uint64(0xd1b71758, 0xe219652c), -77, -4 },
- { nxt_uint64(0x9c400000, 0x00000000), -50, 4 },
- { nxt_uint64(0xe8d4a510, 0x00000000), -24, 12 },
- { nxt_uint64(0xad78ebc5, 0xac620000), 3, 20 },
- { nxt_uint64(0x813f3978, 0xf8940984), 30, 28 },
- { nxt_uint64(0xc097ce7b, 0xc90715b3), 56, 36 },
- { nxt_uint64(0x8f7e32ce, 0x7bea5c70), 83, 44 },
- { nxt_uint64(0xd5d238a4, 0xabe98068), 109, 52 },
- { nxt_uint64(0x9f4f2726, 0x179a2245), 136, 60 },
- { nxt_uint64(0xed63a231, 0xd4c4fb27), 162, 68 },
- { nxt_uint64(0xb0de6538, 0x8cc8ada8), 189, 76 },
- { nxt_uint64(0x83c7088e, 0x1aab65db), 216, 84 },
- { nxt_uint64(0xc45d1df9, 0x42711d9a), 242, 92 },
- { nxt_uint64(0x924d692c, 0xa61be758), 269, 100 },
- { nxt_uint64(0xda01ee64, 0x1a708dea), 295, 108 },
- { nxt_uint64(0xa26da399, 0x9aef774a), 322, 116 },
- { nxt_uint64(0xf209787b, 0xb47d6b85), 348, 124 },
- { nxt_uint64(0xb454e4a1, 0x79dd1877), 375, 132 },
- { nxt_uint64(0x865b8692, 0x5b9bc5c2), 402, 140 },
- { nxt_uint64(0xc83553c5, 0xc8965d3d), 428, 148 },
- { nxt_uint64(0x952ab45c, 0xfa97a0b3), 455, 156 },
- { nxt_uint64(0xde469fbd, 0x99a05fe3), 481, 164 },
- { nxt_uint64(0xa59bc234, 0xdb398c25), 508, 172 },
- { nxt_uint64(0xf6c69a72, 0xa3989f5c), 534, 180 },
- { nxt_uint64(0xb7dcbf53, 0x54e9bece), 561, 188 },
- { nxt_uint64(0x88fcf317, 0xf22241e2), 588, 196 },
- { nxt_uint64(0xcc20ce9b, 0xd35c78a5), 614, 204 },
- { nxt_uint64(0x98165af3, 0x7b2153df), 641, 212 },
- { nxt_uint64(0xe2a0b5dc, 0x971f303a), 667, 220 },
- { nxt_uint64(0xa8d9d153, 0x5ce3b396), 694, 228 },
- { nxt_uint64(0xfb9b7cd9, 0xa4a7443c), 720, 236 },
- { nxt_uint64(0xbb764c4c, 0xa7a44410), 747, 244 },
- { nxt_uint64(0x8bab8eef, 0xb6409c1a), 774, 252 },
- { nxt_uint64(0xd01fef10, 0xa657842c), 800, 260 },
- { nxt_uint64(0x9b10a4e5, 0xe9913129), 827, 268 },
- { nxt_uint64(0xe7109bfb, 0xa19c0c9d), 853, 276 },
- { nxt_uint64(0xac2820d9, 0x623bf429), 880, 284 },
- { nxt_uint64(0x80444b5e, 0x7aa7cf85), 907, 292 },
- { nxt_uint64(0xbf21e440, 0x03acdd2d), 933, 300 },
- { nxt_uint64(0x8e679c2f, 0x5e44ff8f), 960, 308 },
- { nxt_uint64(0xd433179d, 0x9c8cb841), 986, 316 },
- { nxt_uint64(0x9e19db92, 0xb4e31ba9), 1013, 324 },
- { nxt_uint64(0xeb96bf6e, 0xbadf77d9), 1039, 332 },
- { nxt_uint64(0xaf87023b, 0x9bf0ee6b), 1066, 340 },
-};
-
-
-#define NXT_D_1_LOG2_10 0.30102999566398114 /* 1 / log2(10). */
-
-
-nxt_diyfp_t
-nxt_cached_power_dec(int exp, int *dec_exp)
-{
- u_int index;
- const nxt_cpe_t *cp;
-
- index = (exp + NXT_DECIMAL_EXPONENT_OFF) / NXT_DECIMAL_EXPONENT_DIST;
- cp = &nxt_cached_powers[index];
-
- *dec_exp = cp->dec_exp;
-
- return nxt_diyfp(cp->significand, cp->bin_exp);
-}
-
-
-nxt_diyfp_t
-nxt_cached_power_bin(int exp, int *dec_exp)
-{
- int k;
- u_int index;
- const nxt_cpe_t *cp;
-
- k = (int) ceil((-61 - exp) * NXT_D_1_LOG2_10)
- + NXT_DECIMAL_EXPONENT_OFF - 1;
-
- index = (unsigned) (k >> 3) + 1;
-
- cp = &nxt_cached_powers[index];
-
- *dec_exp = -(NXT_DECIMAL_EXPONENT_MIN + (int) (index << 3));
-
- return nxt_diyfp(cp->significand, cp->bin_exp);
-}
+++ /dev/null
-
-/*
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) NGINX, Inc.
- *
- * An internal diy_fp implementation.
- * For details, see Loitsch, Florian. "Printing floating-point numbers quickly
- * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
- */
-
-#ifndef _NXT_DIYFP_H_INCLUDED_
-#define _NXT_DIYFP_H_INCLUDED_
-
-#include <nxt_types.h>
-#include <math.h>
-
-
-typedef struct {
- uint64_t significand;
- int exp;
-} nxt_diyfp_t;
-
-
-#define nxt_diyfp(_s, _e) (nxt_diyfp_t) \
- { .significand = (_s), .exp = (_e) }
-#define nxt_uint64(h, l) (((uint64_t) (h) << 32) + (l))
-
-
-#define NXT_DBL_SIGNIFICAND_SIZE 52
-#define NXT_DBL_EXPONENT_BIAS (0x3FF + NXT_DBL_SIGNIFICAND_SIZE)
-#define NXT_DBL_EXPONENT_MIN (-NXT_DBL_EXPONENT_BIAS)
-#define NXT_DBL_EXPONENT_MAX (0x7FF - NXT_DBL_EXPONENT_BIAS)
-#define NXT_DBL_EXPONENT_DENORMAL (-NXT_DBL_EXPONENT_BIAS + 1)
-
-#define NXT_DBL_SIGNIFICAND_MASK nxt_uint64(0x000FFFFF, 0xFFFFFFFF)
-#define NXT_DBL_HIDDEN_BIT nxt_uint64(0x00100000, 0x00000000)
-#define NXT_DBL_EXPONENT_MASK nxt_uint64(0x7FF00000, 0x00000000)
-
-#define NXT_DIYFP_SIGNIFICAND_SIZE 64
-
-#define NXT_SIGNIFICAND_SIZE 53
-#define NXT_SIGNIFICAND_SHIFT (NXT_DIYFP_SIGNIFICAND_SIZE \
- - NXT_DBL_SIGNIFICAND_SIZE)
-
-#define NXT_DECIMAL_EXPONENT_OFF 348
-#define NXT_DECIMAL_EXPONENT_MIN (-348)
-#define NXT_DECIMAL_EXPONENT_MAX 340
-#define NXT_DECIMAL_EXPONENT_DIST 8
-
-
-nxt_inline nxt_diyfp_t
-nxt_d2diyfp(double d)
-{
- int biased_exp;
- uint64_t significand;
- nxt_diyfp_t r;
-
- union {
- double d;
- uint64_t u64;
- } u;
-
- u.d = d;
-
- biased_exp = (u.u64 & NXT_DBL_EXPONENT_MASK) >> NXT_DBL_SIGNIFICAND_SIZE;
- significand = u.u64 & NXT_DBL_SIGNIFICAND_MASK;
-
- if (biased_exp != 0) {
- r.significand = significand + NXT_DBL_HIDDEN_BIT;
- r.exp = biased_exp - NXT_DBL_EXPONENT_BIAS;
-
- } else {
- r.significand = significand;
- r.exp = NXT_DBL_EXPONENT_MIN + 1;
- }
-
- return r;
-}
-
-
-nxt_inline double
-nxt_diyfp2d(nxt_diyfp_t v)
-{
- int exp;
- uint64_t significand, biased_exp;
-
- union {
- double d;
- uint64_t u64;
- } u;
-
- exp = v.exp;
- significand = v.significand;
-
- while (significand > NXT_DBL_HIDDEN_BIT + NXT_DBL_SIGNIFICAND_MASK) {
- significand >>= 1;
- exp++;
- }
-
- if (exp >= NXT_DBL_EXPONENT_MAX) {
- return INFINITY;
- }
-
- if (exp < NXT_DBL_EXPONENT_DENORMAL) {
- return 0.0;
- }
-
- while (exp > NXT_DBL_EXPONENT_DENORMAL
- && (significand & NXT_DBL_HIDDEN_BIT) == 0)
- {
- significand <<= 1;
- exp--;
- }
-
- if (exp == NXT_DBL_EXPONENT_DENORMAL
- && (significand & NXT_DBL_HIDDEN_BIT) == 0)
- {
- biased_exp = 0;
-
- } else {
- biased_exp = (uint64_t) (exp + NXT_DBL_EXPONENT_BIAS);
- }
-
- u.u64 = (significand & NXT_DBL_SIGNIFICAND_MASK)
- | (biased_exp << NXT_DBL_SIGNIFICAND_SIZE);
-
- return u.d;
-}
-
-
-nxt_inline nxt_diyfp_t
-nxt_diyfp_shift_left(nxt_diyfp_t v, unsigned shift)
-{
- return nxt_diyfp(v.significand << shift, v.exp - shift);
-}
-
-
-nxt_inline nxt_diyfp_t
-nxt_diyfp_shift_right(nxt_diyfp_t v, unsigned shift)
-{
- return nxt_diyfp(v.significand >> shift, v.exp + shift);
-}
-
-
-nxt_inline nxt_diyfp_t
-nxt_diyfp_sub(nxt_diyfp_t lhs, nxt_diyfp_t rhs)
-{
- return nxt_diyfp(lhs.significand - rhs.significand, lhs.exp);
-}
-
-
-nxt_inline nxt_diyfp_t
-nxt_diyfp_mul(nxt_diyfp_t lhs, nxt_diyfp_t rhs)
-{
-#if (NXT_HAVE_UNSIGNED_INT128)
-
- uint64_t l, h;
- nxt_uint128_t u128;
-
- u128 = (nxt_uint128_t) (lhs.significand)
- * (nxt_uint128_t) (rhs.significand);
-
- h = u128 >> 64;
- l = (uint64_t) u128;
-
- /* rounding. */
-
- if (l & ((uint64_t) 1 << 63)) {
- h++;
- }
-
- return nxt_diyfp(h, lhs.exp + rhs.exp + 64);
-
-#else
-
- uint64_t a, b, c, d, ac, bc, ad, bd, tmp;
-
- a = lhs.significand >> 32;
- b = lhs.significand & 0xffffffff;
- c = rhs.significand >> 32;
- d = rhs.significand & 0xffffffff;
-
- ac = a * c;
- bc = b * c;
- ad = a * d;
- bd = b * d;
-
- tmp = (bd >> 32) + (ad & 0xffffffff) + (bc & 0xffffffff);
-
- /* mult_round. */
-
- tmp += 1U << 31;
-
- return nxt_diyfp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32),
- lhs.exp + rhs.exp + 64);
-
-#endif
-}
-
-
-nxt_inline nxt_diyfp_t
-nxt_diyfp_normalize(nxt_diyfp_t v)
-{
- return nxt_diyfp_shift_left(v, nxt_leading_zeros64(v.significand));
-}
-
-
-nxt_diyfp_t nxt_cached_power_dec(int exp, int *dec_exp);
-nxt_diyfp_t nxt_cached_power_bin(int exp, int *dec_exp);
-
-
-#endif /* _NXT_DIYFP_H_INCLUDED_ */
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_djb_hash.h>
-
-
-uint32_t
-nxt_djb_hash(const void *data, size_t len)
-{
- uint32_t hash;
- const u_char *p;
-
- p = data;
- hash = NXT_DJB_HASH_INIT;
-
- while (len != 0) {
- hash = nxt_djb_hash_add(hash, *p++);
- len--;
- }
-
- return hash;
-}
-
-
-uint32_t
-nxt_djb_hash_lowcase(const void *data, size_t len)
-{
- uint32_t hash;
- const u_char *p;
-
- p = data;
- hash = NXT_DJB_HASH_INIT;
-
- while (len != 0) {
- hash = nxt_djb_hash_add(hash, nxt_lower_case(*p++));
- len--;
- }
-
- return hash;
-}
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_lvlhsh.h>
-#include <string.h>
-
-
-/*
- * The level hash consists of hierarchical levels of arrays of pointers.
- * The pointers may point to another level, a bucket, or NULL.
- * The levels and buckets must be allocated in manner alike posix_memalign()
- * to bookkeep additional information in pointer low bits.
- *
- * A level is an array of pointers. Its size is a power of 2. Levels
- * may be different sizes, but on the same level the sizes are the same.
- * Level sizes are specified by number of bits per level in lvlhsh->shift
- * array. A hash may have up to 7 levels. There are two predefined
- * shift arrays given by the first two shift array values:
- *
- * 1) [0, 0]: [4, 4, 4, 4, 4, 4, 4] on a 64-bit platform or
- * [5, 5, 5, 5, 5, 5, 0] on a 32-bit platform,
- * so default size of levels is 128 bytes.
- *
- * 2) [0, 10]: [10, 4, 4, 4, 4, 4, 0] on a 64-bit platform or
- * [10, 5, 5, 5, 5, 0, 0] on a 32-bit platform,
- * so default size of levels is 128 bytes on all levels except
- * the first level. The first level is 8K or 4K on 64-bit or 32-bit
- * platforms respectively.
- *
- * All buckets in a hash are the same size which is a power of 2.
- * A bucket contains several entries stored and tested sequentially.
- * The bucket size should be one or two CPU cache line size, a minimum
- * allowed size is 32 bytes. A default 128-byte bucket contains 10 64-bit
- * entries or 15 32-bit entries. Each entry consists of pointer to value
- * data and 32-bit key. If an entry value pointer is NULL, the entry is free.
- * On a 64-bit platform entry value pointers are no aligned, therefore they
- * are accessed as two 32-bit integers. The rest trailing space in a bucket
- * is used as pointer to next bucket and this pointer is always aligned.
- * Although the level hash allows to store a lot of values in a bucket chain,
- * this is non optimal way. The large data set should be stored using
- * several levels.
- */
-
-#define nxt_lvlhsh_is_bucket(p) \
- ((uintptr_t) (p) & 1)
-
-
-#define nxt_lvlhsh_count_inc(n) \
- n = (void *) ((uintptr_t) (n) + 2)
-
-
-#define nxt_lvlhsh_count_dec(n) \
- n = (void *) ((uintptr_t) (n) - 2)
-
-
-#define nxt_lvlhsh_level_size(proto, nlvl) \
- ((uintptr_t) 1 << proto->shift[nlvl])
-
-
-#define nxt_lvlhsh_level(lvl, mask) \
- (void **) ((uintptr_t) lvl & (~mask << 2))
-
-
-#define nxt_lvlhsh_level_entries(lvl, mask) \
- ((uintptr_t) lvl & (mask << 1))
-
-
-#define nxt_lvlhsh_store_bucket(slot, bkt) \
- slot = (void **) ((uintptr_t) bkt | 2 | 1)
-
-
-#define nxt_lvlhsh_bucket_size(proto) \
- proto->bucket_size
-
-
-#define nxt_lvlhsh_bucket(proto, bkt) \
- (uint32_t *) ((uintptr_t) bkt & ~(uintptr_t) proto->bucket_mask)
-
-
-#define nxt_lvlhsh_bucket_entries(proto, bkt) \
- (((uintptr_t) bkt & (uintptr_t) proto->bucket_mask) >> 1)
-
-
-#define nxt_lvlhsh_bucket_end(proto, bkt) \
- &bkt[proto->bucket_end]
-
-
-#define nxt_lvlhsh_free_entry(e) \
- (!(nxt_lvlhsh_valid_entry(e)))
-
-
-#define nxt_lvlhsh_next_bucket(proto, bkt) \
- ((void **) &bkt[proto->bucket_end])
-
-#if (NXT_64BIT)
-
-#define nxt_lvlhsh_valid_entry(e) \
- (((e)[0] | (e)[1]) != 0)
-
-
-#define nxt_lvlhsh_entry_value(e) \
- (void *) (((uintptr_t) (e)[1] << 32) + (e)[0])
-
-
-#define nxt_lvlhsh_set_entry_value(e, n) \
- (e)[0] = (uint32_t) (uintptr_t) n; \
- (e)[1] = (uint32_t) ((uintptr_t) n >> 32)
-
-
-#define nxt_lvlhsh_entry_key(e) \
- (e)[2]
-
-
-#define nxt_lvlhsh_set_entry_key(e, n) \
- (e)[2] = n
-
-#else
-
-#define nxt_lvlhsh_valid_entry(e) \
- ((e)[0] != 0)
-
-
-#define nxt_lvlhsh_entry_value(e) \
- (void *) (e)[0]
-
-
-#define nxt_lvlhsh_set_entry_value(e, n) \
- (e)[0] = (uint32_t) n
-
-
-#define nxt_lvlhsh_entry_key(e) \
- (e)[1]
-
-
-#define nxt_lvlhsh_set_entry_key(e, n) \
- (e)[1] = n
-
-#endif
-
-
-#define NXT_LVLHSH_BUCKET_DONE ((void *) -1)
-
-
-static nxt_int_t nxt_lvlhsh_level_find(nxt_lvlhsh_query_t *lhq, void **lvl,
- uint32_t key, nxt_uint_t nlvl);
-static nxt_int_t nxt_lvlhsh_bucket_find(nxt_lvlhsh_query_t *lhq, void **bkt);
-static nxt_int_t nxt_lvlhsh_new_bucket(nxt_lvlhsh_query_t *lhq, void **slot);
-static nxt_int_t nxt_lvlhsh_level_insert(nxt_lvlhsh_query_t *lhq,
- void **slot, uint32_t key, nxt_uint_t nlvl);
-static nxt_int_t nxt_lvlhsh_bucket_insert(nxt_lvlhsh_query_t *lhq,
- void **slot, uint32_t key, nxt_int_t nlvl);
-static nxt_int_t nxt_lvlhsh_convert_bucket_to_level(nxt_lvlhsh_query_t *lhq,
- void **slot, nxt_uint_t nlvl, uint32_t *bucket);
-static nxt_int_t nxt_lvlhsh_level_convertion_insert(nxt_lvlhsh_query_t *lhq,
- void **parent, uint32_t key, nxt_uint_t nlvl);
-static nxt_int_t nxt_lvlhsh_bucket_convertion_insert(nxt_lvlhsh_query_t *lhq,
- void **slot, uint32_t key, nxt_int_t nlvl);
-static nxt_int_t nxt_lvlhsh_free_level(nxt_lvlhsh_query_t *lhq, void **level,
- nxt_uint_t size);
-static nxt_int_t nxt_lvlhsh_level_delete(nxt_lvlhsh_query_t *lhq, void **slot,
- uint32_t key, nxt_uint_t nlvl);
-static nxt_int_t nxt_lvlhsh_bucket_delete(nxt_lvlhsh_query_t *lhq, void **bkt);
-static void *nxt_lvlhsh_level_each(nxt_lvlhsh_each_t *lhe, void **level,
- nxt_uint_t nlvl, nxt_uint_t shift);
-static void *nxt_lvlhsh_bucket_each(nxt_lvlhsh_each_t *lhe);
-
-
-nxt_int_t
-nxt_lvlhsh_find(const nxt_lvlhsh_t *lh, nxt_lvlhsh_query_t *lhq)
-{
- void *slot;
-
- slot = lh->slot;
-
- if (nxt_fast_path(slot != NULL)) {
-
- if (nxt_lvlhsh_is_bucket(slot)) {
- return nxt_lvlhsh_bucket_find(lhq, slot);
- }
-
- return nxt_lvlhsh_level_find(lhq, slot, lhq->key_hash, 0);
- }
-
- return NXT_DECLINED;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_level_find(nxt_lvlhsh_query_t *lhq, void **lvl, uint32_t key,
- nxt_uint_t nlvl)
-{
- void **slot;
- uintptr_t mask;
- nxt_uint_t shift;
-
- shift = lhq->proto->shift[nlvl];
- mask = ((uintptr_t) 1 << shift) - 1;
-
- lvl = nxt_lvlhsh_level(lvl, mask);
- slot = lvl[key & mask];
-
- if (slot != NULL) {
-
- if (nxt_lvlhsh_is_bucket(slot)) {
- return nxt_lvlhsh_bucket_find(lhq, slot);
- }
-
- return nxt_lvlhsh_level_find(lhq, slot, key >> shift, nlvl + 1);
- }
-
- return NXT_DECLINED;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_bucket_find(nxt_lvlhsh_query_t *lhq, void **bkt)
-{
- void *value;
- uint32_t *bucket, *e;
- nxt_uint_t n;
-
- do {
- bucket = nxt_lvlhsh_bucket(lhq->proto, bkt);
- n = nxt_lvlhsh_bucket_entries(lhq->proto, bkt);
- e = bucket;
-
- do {
- if (nxt_lvlhsh_valid_entry(e)) {
- n--;
-
- if (nxt_lvlhsh_entry_key(e) == lhq->key_hash) {
-
- value = nxt_lvlhsh_entry_value(e);
-
- if (lhq->proto->test(lhq, value) == NXT_OK) {
- lhq->value = value;
-
- return NXT_OK;
- }
- }
- }
-
- e += NXT_LVLHSH_ENTRY_SIZE;
-
- } while (n != 0);
-
- bkt = *nxt_lvlhsh_next_bucket(lhq->proto, bucket);
-
- } while (bkt != NULL);
-
- return NXT_DECLINED;
-}
-
-
-nxt_int_t
-nxt_lvlhsh_insert(nxt_lvlhsh_t *lh, nxt_lvlhsh_query_t *lhq)
-{
- uint32_t key;
-
- if (nxt_fast_path(lh->slot != NULL)) {
-
- key = lhq->key_hash;
-
- if (nxt_lvlhsh_is_bucket(lh->slot)) {
- return nxt_lvlhsh_bucket_insert(lhq, &lh->slot, key, -1);
- }
-
- return nxt_lvlhsh_level_insert(lhq, &lh->slot, key, 0);
- }
-
- return nxt_lvlhsh_new_bucket(lhq, &lh->slot);
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_new_bucket(nxt_lvlhsh_query_t *lhq, void **slot)
-{
- uint32_t *bucket;
-
- bucket = lhq->proto->alloc(lhq->pool, nxt_lvlhsh_bucket_size(lhq->proto));
-
- if (nxt_fast_path(bucket != NULL)) {
-
- nxt_lvlhsh_set_entry_value(bucket, lhq->value);
- nxt_lvlhsh_set_entry_key(bucket, lhq->key_hash);
-
- *nxt_lvlhsh_next_bucket(lhq->proto, bucket) = NULL;
-
- nxt_lvlhsh_store_bucket(*slot, bucket);
-
- return NXT_OK;
- }
-
- return NXT_ERROR;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_level_insert(nxt_lvlhsh_query_t *lhq, void **parent, uint32_t key,
- nxt_uint_t nlvl)
-{
- void **slot, **lvl;
- nxt_int_t ret;
- uintptr_t mask;
- nxt_uint_t shift;
-
- shift = lhq->proto->shift[nlvl];
- mask = ((uintptr_t) 1 << shift) - 1;
-
- lvl = nxt_lvlhsh_level(*parent, mask);
- slot = &lvl[key & mask];
-
- if (*slot != NULL) {
- key >>= shift;
-
- if (nxt_lvlhsh_is_bucket(*slot)) {
- return nxt_lvlhsh_bucket_insert(lhq, slot, key, nlvl);
- }
-
- return nxt_lvlhsh_level_insert(lhq, slot, key, nlvl + 1);
- }
-
- ret = nxt_lvlhsh_new_bucket(lhq, slot);
-
- if (nxt_fast_path(ret == NXT_OK)) {
- nxt_lvlhsh_count_inc(*parent);
- }
-
- return ret;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_bucket_insert(nxt_lvlhsh_query_t *lhq, void **slot, uint32_t key,
- nxt_int_t nlvl)
-{
- void **bkt, **vacant_bucket, *value;
- uint32_t *bucket, *e, *vacant_entry;
- nxt_int_t ret;
- uintptr_t n;
- const void *new_value;
- const nxt_lvlhsh_proto_t *proto;
-
- bkt = slot;
- vacant_entry = NULL;
- vacant_bucket = NULL;
- proto = lhq->proto;
-
- /* Search for duplicate entry in bucket chain. */
-
- do {
- bucket = nxt_lvlhsh_bucket(proto, *bkt);
- n = nxt_lvlhsh_bucket_entries(proto, *bkt);
- e = bucket;
-
- do {
- if (nxt_lvlhsh_valid_entry(e)) {
-
- if (nxt_lvlhsh_entry_key(e) == lhq->key_hash) {
-
- value = nxt_lvlhsh_entry_value(e);
-
- if (proto->test(lhq, value) == NXT_OK) {
-
- new_value = lhq->value;
- lhq->value = value;
-
- if (lhq->replace) {
- nxt_lvlhsh_set_entry_value(e, new_value);
-
- return NXT_OK;
- }
-
- return NXT_DECLINED;
- }
- }
-
- n--;
-
- } else {
- /*
- * Save a hole vacant position in bucket
- * and continue to search for duplicate entry.
- */
- if (vacant_entry == NULL) {
- vacant_entry = e;
- vacant_bucket = bkt;
- }
- }
-
- e += NXT_LVLHSH_ENTRY_SIZE;
-
- } while (n != 0);
-
- if (e < nxt_lvlhsh_bucket_end(proto, bucket)) {
- /*
- * Save a vacant position on incomplete bucket's end
- * and continue to search for duplicate entry.
- */
- if (vacant_entry == NULL) {
- vacant_entry = e;
- vacant_bucket = bkt;
- }
- }
-
- bkt = nxt_lvlhsh_next_bucket(proto, bucket);
-
- } while (*bkt != NULL);
-
- if (vacant_entry != NULL) {
- nxt_lvlhsh_set_entry_value(vacant_entry, lhq->value);
- nxt_lvlhsh_set_entry_key(vacant_entry, lhq->key_hash);
- nxt_lvlhsh_count_inc(*vacant_bucket);
-
- return NXT_OK;
- }
-
- /* All buckets are full. */
-
- nlvl++;
-
- if (nxt_fast_path(proto->shift[nlvl] != 0)) {
-
- ret = nxt_lvlhsh_convert_bucket_to_level(lhq, slot, nlvl, bucket);
-
- if (nxt_fast_path(ret == NXT_OK)) {
- return nxt_lvlhsh_level_insert(lhq, slot, key, nlvl);
- }
-
- return ret;
- }
-
- /* The last allowed level, only buckets may be allocated here. */
-
- return nxt_lvlhsh_new_bucket(lhq, bkt);
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_convert_bucket_to_level(nxt_lvlhsh_query_t *lhq, void **slot,
- nxt_uint_t nlvl, uint32_t *bucket)
-{
- void *lvl, **level;
- uint32_t *e, *end, key;
- nxt_int_t ret;
- nxt_uint_t i, shift, size;
- nxt_lvlhsh_query_t q;
- const nxt_lvlhsh_proto_t *proto;
-
- proto = lhq->proto;
- size = nxt_lvlhsh_level_size(proto, nlvl);
-
- lvl = proto->alloc(lhq->pool, size * (sizeof(void *)));
-
- if (nxt_slow_path(lvl == NULL)) {
- return NXT_ERROR;
- }
-
- nxt_memzero(lvl, size * (sizeof(void *)));
-
- level = lvl;
- shift = 0;
-
- for (i = 0; i < nlvl; i++) {
- /*
- * Using SIMD operations in this trivial loop with maximum
- * 8 iterations may increase code size by 170 bytes.
- */
- nxt_pragma_loop_disable_vectorization;
-
- shift += proto->shift[i];
- }
-
- end = nxt_lvlhsh_bucket_end(proto, bucket);
-
- for (e = bucket; e < end; e += NXT_LVLHSH_ENTRY_SIZE) {
-
- q.proto = proto;
- q.pool = lhq->pool;
- q.value = nxt_lvlhsh_entry_value(e);
- key = nxt_lvlhsh_entry_key(e);
- q.key_hash = key;
-
- ret = nxt_lvlhsh_level_convertion_insert(&q, &lvl, key >> shift, nlvl);
-
- if (nxt_slow_path(ret != NXT_OK)) {
- return nxt_lvlhsh_free_level(lhq, level, size);
- }
- }
-
- *slot = lvl;
-
- proto->free(lhq->pool, bucket, nxt_lvlhsh_bucket_size(proto));
-
- return NXT_OK;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_level_convertion_insert(nxt_lvlhsh_query_t *lhq, void **parent,
- uint32_t key, nxt_uint_t nlvl)
-{
- void **slot, **lvl;
- nxt_int_t ret;
- uintptr_t mask;
- nxt_uint_t shift;
-
- shift = lhq->proto->shift[nlvl];
- mask = ((uintptr_t) 1 << shift) - 1;
-
- lvl = nxt_lvlhsh_level(*parent, mask);
- slot = &lvl[key & mask];
-
- if (*slot == NULL) {
- ret = nxt_lvlhsh_new_bucket(lhq, slot);
-
- if (nxt_fast_path(ret == NXT_OK)) {
- nxt_lvlhsh_count_inc(*parent);
- }
-
- return ret;
- }
-
- /* Only backets can be here. */
-
- return nxt_lvlhsh_bucket_convertion_insert(lhq, slot, key >> shift, nlvl);
-}
-
-
-/*
- * The special bucket insertion procedure is required because during
- * convertion lhq->key contains garbage values and the test function
- * cannot be called. Besides, the procedure can be simpler because
- * a new entry is inserted just after occupied entries.
- */
-
-static nxt_int_t
-nxt_lvlhsh_bucket_convertion_insert(nxt_lvlhsh_query_t *lhq, void **slot,
- uint32_t key, nxt_int_t nlvl)
-{
- void **bkt;
- uint32_t *bucket, *e;
- nxt_int_t ret;
- uintptr_t n;
- const nxt_lvlhsh_proto_t *proto;
-
- bkt = slot;
- proto = lhq->proto;
-
- do {
- bucket = nxt_lvlhsh_bucket(proto, *bkt);
- n = nxt_lvlhsh_bucket_entries(proto, *bkt);
- e = bucket + n * NXT_LVLHSH_ENTRY_SIZE;
-
- if (nxt_fast_path(e < nxt_lvlhsh_bucket_end(proto, bucket))) {
-
- nxt_lvlhsh_set_entry_value(e, lhq->value);
- nxt_lvlhsh_set_entry_key(e, lhq->key_hash);
- nxt_lvlhsh_count_inc(*bkt);
-
- return NXT_OK;
- }
-
- bkt = nxt_lvlhsh_next_bucket(proto, bucket);
-
- } while (*bkt != NULL);
-
- /* All buckets are full. */
-
- nlvl++;
-
- if (nxt_fast_path(proto->shift[nlvl] != 0)) {
-
- ret = nxt_lvlhsh_convert_bucket_to_level(lhq, slot, nlvl, bucket);
-
- if (nxt_fast_path(ret == NXT_OK)) {
- return nxt_lvlhsh_level_insert(lhq, slot, key, nlvl);
- }
-
- return ret;
- }
-
- /* The last allowed level, only buckets may be allocated here. */
-
- return nxt_lvlhsh_new_bucket(lhq, bkt);
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_free_level(nxt_lvlhsh_query_t *lhq, void **level, nxt_uint_t size)
-{
- size_t bsize;
- nxt_uint_t i;
- const nxt_lvlhsh_proto_t *proto;
-
- proto = lhq->proto;
- bsize = nxt_lvlhsh_bucket_size(proto);
-
- for (i = 0; i < size; i++) {
-
- if (level[i] != NULL) {
- /*
- * Chained buckets are not possible here, since even
- * in the worst case one bucket cannot be converted
- * in two chained buckets but remains the same bucket.
- */
- proto->free(lhq->pool, nxt_lvlhsh_bucket(proto, level[i]), bsize);
- }
- }
-
- proto->free(lhq->pool, level, size * (sizeof(void *)));
-
- return NXT_ERROR;
-}
-
-
-nxt_int_t
-nxt_lvlhsh_delete(nxt_lvlhsh_t *lh, nxt_lvlhsh_query_t *lhq)
-{
- if (nxt_fast_path(lh->slot != NULL)) {
-
- if (nxt_lvlhsh_is_bucket(lh->slot)) {
- return nxt_lvlhsh_bucket_delete(lhq, &lh->slot);
- }
-
- return nxt_lvlhsh_level_delete(lhq, &lh->slot, lhq->key_hash, 0);
- }
-
- return NXT_DECLINED;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_level_delete(nxt_lvlhsh_query_t *lhq, void **parent, uint32_t key,
- nxt_uint_t nlvl)
-{
- size_t size;
- void **slot, **lvl;
- uintptr_t mask;
- nxt_int_t ret;
- nxt_uint_t shift;
-
- shift = lhq->proto->shift[nlvl];
- mask = ((uintptr_t) 1 << shift) - 1;
-
- lvl = nxt_lvlhsh_level(*parent, mask);
- slot = &lvl[key & mask];
-
- if (*slot != NULL) {
-
- if (nxt_lvlhsh_is_bucket(*slot)) {
- ret = nxt_lvlhsh_bucket_delete(lhq, slot);
-
- } else {
- key >>= shift;
- ret = nxt_lvlhsh_level_delete(lhq, slot, key, nlvl + 1);
- }
-
- if (*slot == NULL) {
- nxt_lvlhsh_count_dec(*parent);
-
- if (nxt_lvlhsh_level_entries(*parent, mask) == 0) {
- *parent = NULL;
- size = nxt_lvlhsh_level_size(lhq->proto, nlvl);
- lhq->proto->free(lhq->pool, lvl, size * sizeof(void *));
- }
- }
-
- return ret;
- }
-
- return NXT_DECLINED;
-}
-
-
-static nxt_int_t
-nxt_lvlhsh_bucket_delete(nxt_lvlhsh_query_t *lhq, void **bkt)
-{
- void *value;
- size_t size;
- uint32_t *bucket, *e;
- uintptr_t n;
- const nxt_lvlhsh_proto_t *proto;
-
- proto = lhq->proto;
-
- do {
- bucket = nxt_lvlhsh_bucket(proto, *bkt);
- n = nxt_lvlhsh_bucket_entries(proto, *bkt);
- e = bucket;
-
- do {
- if (nxt_lvlhsh_valid_entry(e)) {
-
- if (nxt_lvlhsh_entry_key(e) == lhq->key_hash) {
-
- value = nxt_lvlhsh_entry_value(e);
-
- if (proto->test(lhq, value) == NXT_OK) {
-
- if (nxt_lvlhsh_bucket_entries(proto, *bkt) == 1) {
- *bkt = *nxt_lvlhsh_next_bucket(proto, bucket);
- size = nxt_lvlhsh_bucket_size(proto);
- proto->free(lhq->pool, bucket, size);
-
- } else {
- nxt_lvlhsh_count_dec(*bkt);
- nxt_lvlhsh_set_entry_value(e, NULL);
- }
-
- lhq->value = value;
-
- return NXT_OK;
- }
- }
-
- n--;
- }
-
- e += NXT_LVLHSH_ENTRY_SIZE;
-
- } while (n != 0);
-
- bkt = nxt_lvlhsh_next_bucket(proto, bucket);
-
- } while (*bkt != NULL);
-
- return NXT_DECLINED;
-}
-
-
-void *
-nxt_lvlhsh_each(const nxt_lvlhsh_t *lh, nxt_lvlhsh_each_t *lhe)
-{
- void **slot;
-
- if (lhe->bucket == NXT_LVLHSH_BUCKET_DONE) {
- slot = lh->slot;
-
- if (nxt_lvlhsh_is_bucket(slot)) {
- return NULL;
- }
-
- } else {
- if (nxt_slow_path(lhe->bucket == NULL)) {
-
- /* The first iteration only. */
-
- slot = lh->slot;
-
- if (slot == NULL) {
- return NULL;
- }
-
- if (!nxt_lvlhsh_is_bucket(slot)) {
- goto level;
- }
-
- lhe->bucket = nxt_lvlhsh_bucket(lhe->proto, slot);
- lhe->entries = nxt_lvlhsh_bucket_entries(lhe->proto, slot);
- }
-
- return nxt_lvlhsh_bucket_each(lhe);
- }
-
-level:
-
- return nxt_lvlhsh_level_each(lhe, slot, 0, 0);
-}
-
-
-static void *
-nxt_lvlhsh_level_each(nxt_lvlhsh_each_t *lhe, void **level, nxt_uint_t nlvl,
- nxt_uint_t shift)
-{
- void **slot, *value;
- uintptr_t mask;
- nxt_uint_t n, level_shift;
-
- level_shift = lhe->proto->shift[nlvl];
- mask = ((uintptr_t) 1 << level_shift) - 1;
-
- level = nxt_lvlhsh_level(level, mask);
-
- do {
- n = (lhe->current >> shift) & mask;
- slot = level[n];
-
- if (slot != NULL) {
- if (nxt_lvlhsh_is_bucket(slot)) {
-
- if (lhe->bucket != NXT_LVLHSH_BUCKET_DONE) {
-
- lhe->bucket = nxt_lvlhsh_bucket(lhe->proto, slot);
- lhe->entries = nxt_lvlhsh_bucket_entries(lhe->proto, slot);
- lhe->entry = 0;
-
- return nxt_lvlhsh_bucket_each(lhe);
- }
-
- lhe->bucket = NULL;
-
- } else {
- value = nxt_lvlhsh_level_each(lhe, slot, nlvl + 1,
- shift + level_shift);
- if (value != NULL) {
- return value;
- }
- }
- }
-
- lhe->current &= ~(mask << shift);
- n = ((n + 1) & mask) << shift;
- lhe->current |= n;
-
- } while (n != 0);
-
- return NULL;
-}
-
-
-static void *
-nxt_lvlhsh_bucket_each(nxt_lvlhsh_each_t *lhe)
-{
- void *value, **next;
- uint32_t *bucket;
-
- /* At least one valid entry must present here. */
- do {
- bucket = &lhe->bucket[lhe->entry];
- lhe->entry += NXT_LVLHSH_ENTRY_SIZE;
-
- } while (nxt_lvlhsh_free_entry(bucket));
-
- value = nxt_lvlhsh_entry_value(bucket);
- lhe->key_hash = nxt_lvlhsh_entry_key(bucket);
-
- lhe->entries--;
-
- if (lhe->entries == 0) {
- next = *nxt_lvlhsh_next_bucket(lhe->proto, lhe->bucket);
-
- lhe->bucket = (next == NULL) ? NXT_LVLHSH_BUCKET_DONE
- : nxt_lvlhsh_bucket(lhe->proto, next);
-
- lhe->entries = nxt_lvlhsh_bucket_entries(lhe->proto, next);
- lhe->entry = 0;
- }
-
- return value;
-}
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_MALLOC_H_INCLUDED_
-#define _NXT_MALLOC_H_INCLUDED_
-
-#include <stdlib.h>
-
-/*
- * alloca() is defined in stdlib.h in Linux, FreeBSD and MacOSX
- * and in alloca.h in Linux, Solaris and MacOSX.
- */
-#if (NXT_SOLARIS)
-#include <alloca.h>
-#endif
-
-
-#define nxt_malloc(size) malloc(size)
-#define nxt_free(p) free(p)
-
-
-NXT_EXPORT void *nxt_memalign(size_t alignment, size_t size);
-
-
-#endif /* _NXT_MALLOC_H_INCLUDED_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_queue.h>
-
-
-/*
- * Find the middle queue element if the queue has odd number of elements,
- * or the first element of the queue's second part otherwise.
- */
-
-nxt_queue_link_t *
-nxt_queue_middle(nxt_queue_t *queue)
-{
- nxt_queue_link_t *middle, *next;
-
- middle = nxt_queue_first(queue);
-
- if (middle == nxt_queue_last(queue)) {
- return middle;
- }
-
- next = middle;
-
- for ( ;; ) {
- middle = nxt_queue_next(middle);
-
- next = nxt_queue_next(next);
-
- if (next == nxt_queue_last(queue)) {
- return middle;
- }
-
- next = nxt_queue_next(next);
-
- if (next == nxt_queue_last(queue)) {
- return middle;
- }
- }
-}
-
-
-/*
- * nxt_queue_sort() provides a stable sort because it uses the insertion
- * sort algorithm. Its worst and average computational complexity is O^2.
- */
-
-void
-nxt_queue_sort(nxt_queue_t *queue,
- nxt_int_t (*compare)(const void *data, const nxt_queue_link_t *,
- const nxt_queue_link_t *), const void *data)
-{
- nxt_queue_link_t *link, *prev, *next;
-
- link = nxt_queue_first(queue);
-
- if (link == nxt_queue_last(queue)) {
- return;
- }
-
- for (link = nxt_queue_next(link);
- link != nxt_queue_tail(queue);
- link = next)
- {
- prev = nxt_queue_prev(link);
- next = nxt_queue_next(link);
-
- nxt_queue_remove(link);
-
- do {
- if (compare(data, prev, link) <= 0) {
- break;
- }
-
- prev = nxt_queue_prev(prev);
-
- } while (prev != nxt_queue_head(queue));
-
- nxt_queue_insert_after(prev, link);
- }
-}
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_STUB_H_INCLUDED_
-#define _NXT_STUB_H_INCLUDED_
-
-
-#define nxt_max(val1, val2) \
- ((val1 < val2) ? (val2) : (val1))
-
-#define nxt_min(val1, val2) \
- ((val1 < val2) ? (val1) : (val2))
-
-
-#define NXT_OK 0
-#define NXT_ERROR (-1)
-#define NXT_AGAIN (-2)
-#define NXT_DECLINED (-3)
-#define NXT_DONE (-4)
-
-
-typedef struct {
- void *(*alloc)(void *mem, size_t size);
- void *(*zalloc)(void *mem, size_t size);
- void *(*align)(void *mem, size_t alignment, size_t size);
- void *(*zalign)(void *mem, size_t alignment, size_t size);
- void (*free)(void *mem, void *p);
- void (*alert)(void *trace, const char *fmt, ...);
- void nxt_cdecl (*trace)(void *trace, const char *fmt, ...);
-} nxt_mem_proto_t;
-
-
-#define nxt_thread_log_alert(...)
-#define nxt_thread_log_error(...)
-#define nxt_log_error(...)
-#define nxt_thread_log_debug(...)
-
-#include <unistd.h>
-#define nxt_pagesize() getpagesize()
-
-
-#endif /* _NXT_STUB_H_INCLUDED_ */
+++ /dev/null
-
-/*
- * 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_ */
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#ifndef _NXT_TYPES_H_INCLUDED_
-#define _NXT_TYPES_H_INCLUDED_
-
-
-/*
- * off_t is 32 bit on Linux, Solaris and HP-UX by default.
- * Must be before <sys/types.h>.
- */
-#define _FILE_OFFSET_BITS 64
-
-/* u_char, u_int, int8_t, int32_t, int64_t, size_t, off_t. */
-#include <sys/types.h>
-#include <inttypes.h>
-
-
-#if (__LP64__)
-#define NXT_64BIT 1
-#define NXT_PTR_SIZE 8
-#else
-#define NXT_64BIT 0
-#define NXT_PTR_SIZE 4
-#endif
-
-
-/*
- * nxt_int_t corresponds to the most efficient integer type, an architecture
- * word. It is usually the long type, however on Win64 the long is int32_t,
- * so pointer size suits better. nxt_int_t must be no less than int32_t.
- */
-
-#if (__amd64__)
-/*
- * AMD64 64-bit multiplication and division operations are slower and 64-bit
- * instructions are longer.
- */
-#define NXT_INT_T_SIZE 4
-typedef int nxt_int_t;
-typedef u_int nxt_uint_t;
-
-#else
-#define NXT_INT_T_SIZE NXT_PTR_SIZE
-typedef intptr_t nxt_int_t;
-typedef uintptr_t nxt_uint_t;
-#endif
-
-
-#if (NXT_HAVE_UNSIGNED_INT128)
-typedef unsigned __int128 nxt_uint128_t;
-#endif
-
-
-#if (NXT_INT_T_SIZE == 8)
-#define NXT_INT_T_LEN NXT_INT64_T_LEN
-#define NXT_INT_T_HEXLEN NXT_INT64_T_HEXLEN
-#define NXT_INT_T_MAX NXT_INT64_T_MAX
-
-#else
-#define NXT_INT_T_LEN NXT_INT32_T_LEN
-#define NXT_INT_T_HEXLEN NXT_INT32_T_HEXLEN
-#define NXT_INT_T_MAX NXT_INT32_T_MAX
-#endif
-
-
-typedef nxt_uint_t nxt_bool_t;
-typedef int nxt_err_t;
-
-
-/*
- * nxt_off_t corresponds to OS's off_t, a file offset type. Although Linux,
- * Solaris, and HP-UX define both off_t and off64_t, setting _FILE_OFFSET_BITS
- * to 64 defines off_t as off64_t.
- */
-#if (NXT_WINDOWS)
-/* Windows defines off_t as a 32-bit "long". */
-typedef __int64 nxt_off_t;
-
-#else
-typedef off_t nxt_off_t;
-#endif
-
-
-/*
- * nxt_time_t corresponds to OS's time_t, time in seconds. nxt_time_t is
- * a signed integer. OS's time_t may be an integer or real-floating type,
- * though it is usually a signed 32-bit or 64-bit integer depending on
- * platform bits length. There are however exceptions, e.g., time_t is:
- * 32-bit on 64-bit NetBSD prior to 6.0 version;
- * 64-bit on 32-bit NetBSD 6.0;
- * 32-bit on 64-bit OpenBSD;
- * 64-bit in Linux x32 ABI;
- * 64-bit in 32-bit Visual Studio C++ 2005.
- *
- * Besides, QNX defines time_t as uint32_t.
- */
-#if (NXT_QNX)
-/* Y2038 fix: "typedef int64_t nxt_time_t". */
-typedef int32_t nxt_time_t;
-
-#else
-/* Y2038, if time_t is 32-bit integer. */
-typedef time_t nxt_time_t;
-#endif
-
-
-typedef pid_t nxt_pid_t;
-
-
-#define NXT_INT32_T_LEN nxt_length("-2147483648")
-#define NXT_INT64_T_LEN nxt_length("-9223372036854775808")
-
-#define NXT_DOUBLE_LEN (1 + DBL_MAX_10_EXP)
-
-#define NXT_MAX_ERROR_STR 2048
-
-
-#endif /* _NXT_TYPES_H_INCLUDED_ */
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_sprintf.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_malloc.h>
-#include <nxt_lvlhsh.h>
-#include <nxt_murmur_hash.h>
-#include <nxt_mp.h>
-#include <string.h>
-
-
-static nxt_int_t
-lvlhsh_unit_test_key_test(nxt_lvlhsh_query_t *lhq, void *data)
-{
- if (*(uintptr_t *) lhq->key.start == (uintptr_t) data) {
- return NXT_OK;
- }
-
- return NXT_DECLINED;
-}
-
-
-static void *
-lvlhsh_unit_test_pool_alloc(void *pool, size_t size)
-{
- return nxt_mp_align(pool, size, size);
-}
-
-
-static void
-lvlhsh_unit_test_pool_free(void *pool, void *p, size_t size)
-{
- nxt_mp_free(pool, p);
-}
-
-
-static const nxt_lvlhsh_proto_t lvlhsh_proto nxt_aligned(64) = {
- NXT_LVLHSH_LARGE_SLAB,
- lvlhsh_unit_test_key_test,
- lvlhsh_unit_test_pool_alloc,
- lvlhsh_unit_test_pool_free,
-};
-
-
-static nxt_int_t
-lvlhsh_unit_test_add(nxt_lvlhsh_t *lh, const nxt_lvlhsh_proto_t *proto,
- void *pool, uintptr_t key)
-{
- nxt_lvlhsh_query_t lhq;
-
- lhq.key_hash = key;
- lhq.replace = 0;
- lhq.key.length = sizeof(uintptr_t);
- lhq.key.start = (u_char *) &key;
- lhq.value = (void *) key;
- lhq.proto = proto;
- lhq.pool = pool;
-
- switch (nxt_lvlhsh_insert(lh, &lhq)) {
-
- case NXT_OK:
- return NXT_OK;
-
- case NXT_DECLINED:
- nxt_printf("lvlhsh unit test failed: key %08Xl is already in hash\n",
- (long) key);
- /* Fall through. */
-
- default:
- return NXT_ERROR;
- }
-}
-
-
-static nxt_int_t
-lvlhsh_unit_test_get(nxt_lvlhsh_t *lh, const nxt_lvlhsh_proto_t *proto,
- uintptr_t key)
-{
- nxt_lvlhsh_query_t lhq;
-
- lhq.key_hash = key;
- lhq.key.length = sizeof(uintptr_t);
- lhq.key.start = (u_char *) &key;
- lhq.proto = proto;
-
- if (nxt_lvlhsh_find(lh, &lhq) == NXT_OK) {
-
- if (key == (uintptr_t) lhq.value) {
- return NXT_OK;
- }
- }
-
- nxt_printf("lvlhsh unit test failed: key %08Xl not found in hash\n",
- (long) key);
-
- return NXT_ERROR;
-}
-
-
-static nxt_int_t
-lvlhsh_unit_test_delete(nxt_lvlhsh_t *lh, const nxt_lvlhsh_proto_t *proto,
- void *pool, uintptr_t key)
-{
- nxt_int_t ret;
- nxt_lvlhsh_query_t lhq;
-
- lhq.key_hash = key;
- lhq.key.length = sizeof(uintptr_t);
- lhq.key.start = (u_char *) &key;
- lhq.proto = proto;
- lhq.pool = pool;
-
- ret = nxt_lvlhsh_delete(lh, &lhq);
-
- if (ret != NXT_OK) {
- nxt_printf("lvlhsh unit test failed: key %08lX not found in hash\n",
- (long) key);
- }
-
- return ret;
-}
-
-
-static void *
-lvlhsh_malloc(void *mem, size_t size)
-{
- return nxt_malloc(size);
-}
-
-
-static void *
-lvlhsh_zalloc(void *mem, size_t size)
-{
- void *p;
-
- p = nxt_malloc(size);
-
- if (p != NULL) {
- nxt_memzero(p, size);
- }
-
- return p;
-}
-
-
-static void *
-lvlhsh_align(void *mem, size_t alignment, size_t size)
-{
- return nxt_memalign(alignment, size);
-}
-
-
-static void
-lvlhsh_free(void *mem, void *p)
-{
- nxt_free(p);
-}
-
-
-static void
-lvlhsh_alert(void *mem, const char *fmt, ...)
-{
- u_char buf[1024], *p;
- va_list args;
-
- va_start(args, fmt);
- p = nxt_sprintf(buf, buf + sizeof(buf), fmt, args);
- va_end(args);
-
- (void) nxt_error("alert: \"%*s\"\n", p - buf, buf);
-}
-
-
-static const nxt_mem_proto_t lvl_mp_proto = {
- lvlhsh_malloc,
- lvlhsh_zalloc,
- lvlhsh_align,
- NULL,
- lvlhsh_free,
- lvlhsh_alert,
- NULL,
-};
-
-
-static nxt_int_t
-lvlhsh_unit_test(nxt_uint_t n)
-{
- nxt_mp_t *pool;
- uint32_t key;
- nxt_uint_t i;
- nxt_lvlhsh_t lh;
- nxt_lvlhsh_each_t lhe;
-
- const size_t min_chunk_size = 32;
- const size_t page_size = 1024;
- const size_t page_alignment = 128;
- const size_t cluster_size = 4096;
-
- pool = nxt_mp_create(&lvl_mp_proto, NULL, NULL, cluster_size,
- page_alignment, page_size, min_chunk_size);
- if (pool == NULL) {
- return NXT_ERROR;
- }
-
- nxt_printf("lvlhsh unit test started: %l items\n", (long) n);
-
- nxt_memzero(&lh, sizeof(nxt_lvlhsh_t));
-
- key = 0;
- for (i = 0; i < n; i++) {
- key = nxt_murmur_hash2(&key, sizeof(uint32_t));
-
- if (lvlhsh_unit_test_add(&lh, &lvlhsh_proto, pool, key) != NXT_OK) {
- nxt_printf("lvlhsh add unit test failed at %l\n", (long) i);
- return NXT_ERROR;
- }
- }
-
- key = 0;
- for (i = 0; i < n; i++) {
- key = nxt_murmur_hash2(&key, sizeof(uint32_t));
-
- if (lvlhsh_unit_test_get(&lh, &lvlhsh_proto, key) != NXT_OK) {
- return NXT_ERROR;
- }
- }
-
- nxt_lvlhsh_each_init(&lhe, &lvlhsh_proto);
-
- for (i = 0; i < n + 1; i++) {
- if (nxt_lvlhsh_each(&lh, &lhe) == NULL) {
- break;
- }
- }
-
- if (i != n) {
- nxt_printf("lvlhsh each unit test failed at %l of %l\n",
- (long) i, (long) n);
- return NXT_ERROR;
- }
-
- key = 0;
- for (i = 0; i < n; i++) {
- key = nxt_murmur_hash2(&key, sizeof(uint32_t));
-
- if (lvlhsh_unit_test_delete(&lh, &lvlhsh_proto, pool, key) != NXT_OK) {
- return NXT_ERROR;
- }
- }
-
- if (!nxt_mp_is_empty(pool)) {
- nxt_printf("mem cache pool is not empty\n");
- return NXT_ERROR;
- }
-
- nxt_mp_destroy(pool);
-
- nxt_printf("lvlhsh unit test passed\n");
-
- return NXT_OK;
-}
-
-
-int
-main(void)
-{
- return lvlhsh_unit_test(1000 * 1000);
-}
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_sprintf.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_random.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-static nxt_int_t
-random_unit_test(void)
-{
- nxt_uint_t n;
- nxt_random_t r;
-
- nxt_random_init(&r, -1);
-
- r.count = 400000;
-
- nxt_random_add(&r, (u_char *) "arc4random", nxt_length("arc4random"));
-
- /*
- * Test arc4random() numbers.
- * RC4 pseudorandom numbers would be 0x4642AFC3 and 0xBAF0FFF0.
- */
-
- if (nxt_random(&r) == 0xD6270B27) {
-
- for (n = 100000; n != 0; n--) {
- (void) nxt_random(&r);
- }
-
- if (nxt_random(&r) == 0x6FCAE186) {
- nxt_printf("random unit test passed\n");
-
- nxt_random_stir(&r, getpid());
-
- nxt_printf("random unit test: 0x%08uXD\n", nxt_random(&r));
-
- return NXT_OK;
- }
- }
-
- nxt_printf("random unit test failed\n");
-
- return NXT_ERROR;
-}
-
-
-int
-main(void)
-{
- return random_unit_test();
-}
+++ /dev/null
-
-/*
- * Copyright (C) Igor Sysoev
- * Copyright (C) NGINX, Inc.
- */
-
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_stub.h>
-#include <nxt_sprintf.h>
-#include <nxt_string.h>
-#include <nxt_rbtree.h>
-#include <nxt_murmur_hash.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-typedef struct {
- NXT_RBTREE_NODE (node);
- uint32_t key;
-} nxt_rbtree_test_t;
-
-
-static intptr_t rbtree_unit_test_comparison(nxt_rbtree_node_t *node1,
- nxt_rbtree_node_t *node2);
-static nxt_int_t rbtree_unit_test_compare(uint32_t key1, uint32_t key2);
-static int nxt_cdecl rbtree_unit_test_sort_cmp(const void *one,
- const void *two);
-
-
-static nxt_int_t
-rbtree_unit_test(nxt_uint_t n)
-{
- void *mark;
- uint32_t key, *keys;
- nxt_uint_t i;
- nxt_rbtree_t tree;
- nxt_rbtree_node_t *node;
- nxt_rbtree_test_t *items, *item;
-
- nxt_printf("rbtree unit test started: %l nodes\n", (long) n);
-
- nxt_rbtree_init(&tree, rbtree_unit_test_comparison);
-
- mark = tree.sentinel.right;
-
- items = malloc(n * sizeof(nxt_rbtree_test_t));
- if (items == NULL) {
- return NXT_ERROR;
- }
-
- keys = malloc(n * sizeof(uint32_t));
- if (keys == NULL) {
- free(items);
- return NXT_ERROR;
- }
-
- key = 0;
-
- for (i = 0; i < n; i++) {
- key = nxt_murmur_hash2(&key, sizeof(uint32_t));
- keys[i] = key;
- items[i].key = key;
- }
-
- qsort(keys, n, sizeof(uint32_t), rbtree_unit_test_sort_cmp);
-
- for (i = 0; i < n; i++) {
- nxt_rbtree_insert(&tree, &items[i].node);
- }
-
- for (i = 0; i < n; i++) {
- node = nxt_rbtree_find(&tree, &items[i].node);
-
- if (node != (nxt_rbtree_node_t *) &items[i].node) {
- nxt_printf("rbtree unit test failed: %08uXD not found\n",
- items[i].key);
- goto fail;
- }
- }
-
- i = 0;
- node = nxt_rbtree_min(&tree);
-
- while (nxt_rbtree_is_there_successor(&tree, node)) {
-
- item = (nxt_rbtree_test_t *) node;
-
- if (keys[i] != item->key) {
- nxt_printf("rbtree unit test failed: %l: %08uXD %08uXD\n",
- (long) i, keys[i], item->key);
- goto fail;
- }
-
- i++;
- node = nxt_rbtree_node_successor(&tree, node);
- }
-
- if (i != n) {
- nxt_printf("rbtree unit test failed: %l\n", (long) i);
- goto fail;
- }
-
- for (i = 0; i < n; i++) {
- nxt_rbtree_delete(&tree, &items[i].node);
- nxt_memset(&items[i], 0xA5, sizeof(nxt_rbtree_test_t));
- }
-
- if (!nxt_rbtree_is_empty(&tree)) {
- nxt_printf("rbtree unit test failed: tree is not empty\n");
- goto fail;
- }
-
- /* Check that the sentinel callback was not modified. */
-
- if (mark != tree.sentinel.right) {
- nxt_printf("rbtree sentinel unit test failed\n");
- goto fail;
- }
-
- free(keys);
- free(items);
-
- nxt_printf("rbtree unit test passed\n");
-
- return NXT_OK;
-
-fail:
-
- free(keys);
- free(items);
-
- return NXT_ERROR;
-}
-
-
-static intptr_t
-rbtree_unit_test_comparison(nxt_rbtree_node_t *node1, nxt_rbtree_node_t *node2)
-{
- nxt_rbtree_test_t *item1, *item2;
-
- item1 = (nxt_rbtree_test_t *) node1;
- item2 = (nxt_rbtree_test_t *) node2;
-
- return rbtree_unit_test_compare(item1->key, item2->key);
-}
-
-
-/*
- * Subtraction cannot be used in these comparison functions because
- * the key values are spread uniform in whole 0 .. 2^32 range but are
- * not grouped around some value as timeout values are.
- */
-
-static nxt_int_t
-rbtree_unit_test_compare(uint32_t key1, uint32_t key2)
-{
- if (key1 < key2) {
- return -1;
- }
-
- if (key1 == key2) {
- return 0;
- }
-
- return 1;
-}
-
-
-static int nxt_cdecl
-rbtree_unit_test_sort_cmp(const void *one, const void *two)
-{
- const uint32_t *first, *second;
-
- first = one;
- second = two;
-
- if (*first < *second) {
- return -1;
- }
-
- if (*first == *second) {
- return 0;
- }
-
- return 1;
-}
-
-
-int
-main(void)
-{
- return rbtree_unit_test(1000 * 1000);
-}
#ifndef _NJS_H_INCLUDED_
#define _NJS_H_INCLUDED_
-#include <nxt_auto_config.h>
+#include <njs_auto_config.h>
#define NJS_VERSION "0.3.4"
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_array.h>
-#include <nxt_lvlhsh.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_arr.h>
+#include <njs_lvlhsh.h>
typedef intptr_t njs_ret_t;
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
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;
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 */
} 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))
*
* 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.
* 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.
*
* 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_ */
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_stub.h>
-#include <nxt_array.h>
-#include <nxt_string.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_stub.h>
+#include <njs_arr.h>
+#include <njs_str.h>
#include <string.h>
-nxt_array_t *
-nxt_array_create(uint32_t items, uint32_t item_size,
- const nxt_mem_proto_t *proto, void *pool)
+njs_arr_t *
+njs_arr_create(uint32_t items, uint32_t item_size,
+ const njs_mem_proto_t *proto, void *pool)
{
- nxt_array_t *array;
+ njs_arr_t *array;
- array = proto->alloc(pool, sizeof(nxt_array_t) + items * item_size);
+ array = proto->alloc(pool, sizeof(njs_arr_t) + items * item_size);
- if (nxt_fast_path(array != NULL)) {
- array->start = (char *) array + sizeof(nxt_array_t);
+ if (njs_fast_path(array != NULL)) {
+ array->start = (char *) array + sizeof(njs_arr_t);
array->items = 0;
array->item_size = item_size;
array->avalaible = items;
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;
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;
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;
}
start = proto->alloc(pool, n * array->item_size);
- if (nxt_slow_path(start == NULL)) {
+ if (njs_slow_path(start == NULL)) {
return NULL;
}
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;
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;
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
#include <stdint.h>
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;
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;
}
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);
}
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;
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;
}
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;
if ((double) size != num) {
njs_range_error(vm, "Invalid array length");
- return NXT_ERROR;
+ return NJS_ERROR;
}
args = NULL;
array = njs_array_alloc(vm, size, NJS_ARRAY_SPARE);
- if (nxt_fast_path(array != NULL)) {
+ if (njs_fast_path(array != NULL)) {
value = array->start;
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;
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;
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);
array->start[i] = args[i + 1];
}
- return NXT_OK;
+ return NJS_OK;
}
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),
};
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;
}
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;
}
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;
}
*/
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;
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;
}
}
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);
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 {
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);
value = &array->start[n++];
ret = njs_value_property(vm, this, &name, value);
- if (ret != NXT_OK) {
+ if (ret != NJS_OK) {
*value = njs_value_invalid;
}
}
}
- 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])) {
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;
}
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;
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])) {
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;
}
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;
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;
}
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];
}
*/
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;
}
}
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;
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);
}
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]);
}
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;
if (!njs_is_string(value)) {
ret = njs_value_to_string(vm, value, value);
- if (ret != NXT_OK) {
+ if (ret != NJS_OK) {
return ret;
}
}
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;
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;
}
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);
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;
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;
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;
}
if (n >= 0) {
- k = nxt_min(n, length - 1);
+ k = njs_min(n, length - 1);
} else {
k = n + length;
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;
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;
}
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;
} 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;
}
}
}
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;
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);
vm->retval = *this;
- return NXT_OK;
+ return NJS_OK;
}
value = njs_arg(args, nargs, 1);
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)
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];
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];
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 = *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];
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 = *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;
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];
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++) {
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];
}
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;
}
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];
}
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;
}
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;
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];
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++) {
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));
}
for ( ; i < size; i++) {
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)
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];
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];
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;
}
}
njs_set_number(&vm->retval, ret);
- return NXT_OK;
+ return NJS_OK;
}
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])) {
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;
}
vm->retval = args[0];
- return NXT_OK;
+ return NJS_OK;
}
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),
};
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),
};
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;
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
njs_ret_t
-njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
{
njs_object_t *object;
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);
vm->retval = *value;
}
- return NXT_OK;
+ return NJS_OK;
}
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;
} 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;
} 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;
}
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),
};
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;
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_regexp.h>
#include <njs_date.h>
-#include <njs_time.h>
+#include <njs_timer.h>
#include <njs_math.h>
#include <njs_json.h>
#include <njs_module.h>
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);
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;
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;
}
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;
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;
}
}
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;
}
}
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;
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;
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;
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;
}
* 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;
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;
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;
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;
}
-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;
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;
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;
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;
}
}
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;
}
}
- 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;
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;
}
-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;
}
}
-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;
}
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;
}
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;
}
}
-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;
}
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;
}
} 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;
}
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;
}
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;
}
}
}
}
- 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;
}
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;
}
}
}
-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;
*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;
}
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:
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);
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)
};
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),
};
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;
}
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;
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;
}
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);
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;
}
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),
};
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_CLANG_H_INCLUDED_
+#define _NJS_CLANG_H_INCLUDED_
+
+
+#include <stdarg.h>
+#include <stddef.h> /* offsetof(). */
+#include <unistd.h> /* NULL. */
+
+
+#define njs_inline static inline __attribute__((always_inline))
+#define njs_noinline __attribute__((noinline))
+#define njs_cdecl
+
+
+#define njs_container_of(p, type, field) \
+ (type *) ((u_char *) (p) - offsetof(type, field))
+
+#define njs_nitems(x) \
+ (sizeof(x) / sizeof((x)[0]))
+
+
+#if (NJS_HAVE_BUILTIN_EXPECT)
+#define njs_expect(c, x) __builtin_expect((long) (x), (c))
+#define njs_fast_path(x) njs_expect(1, x)
+#define njs_slow_path(x) njs_expect(0, x)
+
+#else
+#define njs_expect(c, x) (x)
+#define njs_fast_path(x) (x)
+#define njs_slow_path(x) (x)
+#endif
+
+
+#if (NJS_HAVE_BUILTIN_UNREACHABLE)
+#define njs_unreachable() __builtin_unreachable()
+
+#else
+#define njs_unreachable()
+#endif
+
+
+#if (NJS_HAVE_BUILTIN_PREFETCH)
+#define njs_prefetch(a) __builtin_prefetch(a)
+
+#else
+#define njs_prefetch(a)
+#endif
+
+
+#if (NJS_HAVE_BUILTIN_CLZ)
+#define njs_leading_zeros(x) (((x) == 0) ? 32 : __builtin_clz(x))
+
+#else
+
+njs_inline uint32_t
+njs_leading_zeros(uint32_t x)
+{
+ uint32_t n;
+
+ /*
+ * There is no sense to optimize this function, since almost
+ * all platforms nowadays support the built-in instruction.
+ */
+
+ if (x == 0) {
+ return 32;
+ }
+
+ n = 0;
+
+ while ((x & 0x80000000) == 0) {
+ n++;
+ x <<= 1;
+ }
+
+ return n;
+}
+
+#endif
+
+
+#if (NJS_HAVE_BUILTIN_CLZLL)
+#define njs_leading_zeros64(x) (((x) == 0) ? 64 : __builtin_clzll(x))
+
+#else
+
+njs_inline uint64_t
+njs_leading_zeros64(uint64_t x)
+{
+ uint64_t n;
+
+ /*
+ * There is no sense to optimize this function, since almost
+ * all platforms nowadays support the built-in instruction.
+ */
+
+ if (x == 0) {
+ return 64;
+ }
+
+ n = 0;
+
+ while ((x & 0x8000000000000000) == 0) {
+ n++;
+ x <<= 1;
+ }
+
+ return n;
+}
+
+#endif
+
+
+#if (NJS_HAVE_GCC_ATTRIBUTE_VISIBILITY)
+#define NJS_EXPORT __attribute__((visibility("default")))
+
+#else
+#define NJS_EXPORT
+#endif
+
+
+#if (NJS_HAVE_GCC_ATTRIBUTE_ALIGNED)
+#define njs_aligned(x) __attribute__((aligned(x)))
+
+#else
+#define njs_aligned(x)
+#endif
+
+
+#if (NJS_HAVE_GCC_ATTRIBUTE_MALLOC)
+#define NJS_MALLOC_LIKE __attribute__((__malloc__))
+
+#else
+#define NJS_MALLOC_LIKE
+#endif
+
+
+#if (NJS_CLANG)
+/* Any __asm__ directive disables loop vectorization in GCC and Clang. */
+#define njs_pragma_loop_disable_vectorization __asm__("")
+
+#else
+#define njs_pragma_loop_disable_vectorization
+#endif
+
+
+#if (NJS_HAVE_MEMORY_SANITIZER)
+#include <sanitizer/msan_interface.h>
+
+#define njs_msan_unpoison(ptr, size) __msan_unpoison(ptr, size)
+#endif
+
+
+#endif /* _NJS_CLANG_H_INCLUDED_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
-#include <nxt_md5.h>
-#include <nxt_sha1.h>
-#include <nxt_sha2.h>
+#include <njs_main.h>
+#include <njs_md5.h>
+#include <njs_sha1.h>
+#include <njs_sha2.h>
#include <njs_crypto.h>
#include <string.h>
#include <math.h>
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;
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;
typedef struct {
- nxt_str_t name;
+ njs_str_t name;
njs_digest_encode encode;
} njs_crypto_enc_t;
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,
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;
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
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]");
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;
}
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;
}
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);
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
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]");
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,
};
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;
}
}
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;
}
}
#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;
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_date.h>
#include <string.h>
#include <sys/time.h>
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);
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;
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;
}
}
}
} 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;
}
}
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;
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());
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;
}
}
njs_set_number(&vm->retval, time);
- return NXT_OK;
+ return NJS_OK;
}
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;
njs_set_number(&vm->retval, time);
- return NXT_OK;
+ return NJS_OK;
}
{
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);
p = string.start;
end = p + string.length;
- if (nxt_slow_path(p >= end)) {
+ if (njs_slow_path(p >= end)) {
return NAN;
}
/* 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;
}
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;
}
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;
}
goto done;
}
- if (nxt_slow_path(*p != 'T')) {
+ if (njs_slow_path(*p != 'T')) {
return NAN;
}
}
p = njs_date_time_parse(&tm, p + 1, end);
- if (nxt_slow_path(p == NULL)) {
+ if (njs_slow_path(p == NULL)) {
return NAN;
}
goto done;
}
- if (nxt_slow_path(p > end || *p != '.')) {
+ if (njs_slow_path(p > end || *p != '.')) {
return NAN;
}
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;
}
}
}
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;
}
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;
}
}
p = njs_date_skip_spaces(p, end);
- if (nxt_slow_path(p == NULL)) {
+ if (njs_slow_path(p == NULL)) {
return NAN;
}
}
p = njs_date_time_parse(tm, 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;
}
goto done;
}
- if (nxt_slow_path(p + 2 >= end)) {
+ if (njs_slow_path(p + 2 >= end)) {
return NAN;
}
} else {
gmtoff = njs_date_gmtoff_parse(p, end);
- if (nxt_slow_path(gmtoff == -1)) {
+ if (njs_slow_path(gmtoff == -1)) {
return NAN;
}
}
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;
}
}
p = njs_date_skip_spaces(p, end);
- if (nxt_slow_path(p == NULL)) {
+ if (njs_slow_path(p == NULL)) {
return NAN;
}
}
p = njs_date_time_parse(tm, 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;
}
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;
}
}
}
-static nxt_int_t
+static njs_int_t
njs_date_month_parse(const u_char *p, const u_char *end)
{
if (p + 2 < end) {
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;
}
return p;
}
- if (nxt_slow_path(*p != ':')) {
+ if (njs_slow_path(*p != ':')) {
return NULL;
}
}
-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;
}
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;
}
/* Values below '0' become >= 208. */
c = c - '0';
- if (nxt_slow_path(c > 9)) {
+ if (njs_slow_path(c > 9)) {
return NULL;
}
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)",
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);
}
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);
}
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;
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);
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]);
}
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,
*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;
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);
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;
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);
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;
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);
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;
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);
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;
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);
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;
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);
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;
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);
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;
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);
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;
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);
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;
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);
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;
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);
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;
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);
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;
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]);
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]);
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]);
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;
time = njs_date(&args[0])->time;
- if (nxt_fast_path(!isnan(time))) {
+ if (njs_fast_path(!isnan(time))) {
if (nargs > 1) {
clock = time / 1000;
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;
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;
time = njs_date(&args[0])->time;
- if (nxt_fast_path(!isnan(time))) {
+ if (njs_fast_path(!isnan(time))) {
if (nargs > 1) {
clock = time / 1000;
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;
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;
time = njs_date(&args[0])->time;
- if (nxt_fast_path(!isnan(time))) {
+ if (njs_fast_path(!isnan(time))) {
if (nargs > 1) {
clock = time / 1000;
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;
time = njs_date(&args[0])->time;
- if (nxt_fast_path(!isnan(time))) {
+ if (njs_fast_path(!isnan(time))) {
if (nargs > 1) {
clock = time / 1000;
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;
time = njs_date(&args[0])->time;
- if (nxt_fast_path(!isnan(time))) {
+ if (njs_fast_path(!isnan(time))) {
if (nargs > 1) {
clock = time / 1000;
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;
time = njs_date(&args[0])->time;
- if (nxt_fast_path(!isnan(time))) {
+ if (njs_fast_path(!isnan(time))) {
if (nargs > 1) {
clock = time / 1000;
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;
time = njs_date(&args[0])->time;
- if (nxt_fast_path(!isnan(time))) {
+ if (njs_fast_path(!isnan(time))) {
if (nargs > 1) {
clock = time / 1000;
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;
time = njs_date(&args[0])->time;
- if (nxt_fast_path(!isnan(time))) {
+ if (njs_fast_path(!isnan(time))) {
if (nargs > 1) {
clock = time / 1000;
njs_date(&args[0])->time = time;
njs_set_number(&vm->retval, time);
- return NXT_OK;
+ return NJS_OK;
}
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 {
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);
}
njs_type_error(vm, "\"this\" argument is not an object");
- return NXT_ERROR;
+ return NJS_ERROR;
}
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),
};
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);
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
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 ") },
};
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--;
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;
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" : "");
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);
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);
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);
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);
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);
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);
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" : "");
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" : "");
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);
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);
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);
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);
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);
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);
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);
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);
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,
}
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);
}
code_name = code_names;
- n = nxt_nitems(code_names);
+ n = njs_nitems(code_names);
do {
if (operation == code_name->operation) {
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);
} 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);
}
} 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);
--- /dev/null
+
+/*
+ * Copyright (C) Dmitry Volyntsev
+ * Copyright (C) NGINX, Inc.
+ *
+ * An internal diy_fp implementation.
+ * For details, see Loitsch, Florian. "Printing floating-point numbers quickly
+ * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_diyfp.h>
+
+
+typedef struct njs_cpe_s {
+ uint64_t significand;
+ int16_t bin_exp;
+ int16_t dec_exp;
+} njs_cpe_t;
+
+
+static const njs_cpe_t njs_cached_powers[] = {
+ { njs_uint64(0xfa8fd5a0, 0x081c0288), -1220, -348 },
+ { njs_uint64(0xbaaee17f, 0xa23ebf76), -1193, -340 },
+ { njs_uint64(0x8b16fb20, 0x3055ac76), -1166, -332 },
+ { njs_uint64(0xcf42894a, 0x5dce35ea), -1140, -324 },
+ { njs_uint64(0x9a6bb0aa, 0x55653b2d), -1113, -316 },
+ { njs_uint64(0xe61acf03, 0x3d1a45df), -1087, -308 },
+ { njs_uint64(0xab70fe17, 0xc79ac6ca), -1060, -300 },
+ { njs_uint64(0xff77b1fc, 0xbebcdc4f), -1034, -292 },
+ { njs_uint64(0xbe5691ef, 0x416bd60c), -1007, -284 },
+ { njs_uint64(0x8dd01fad, 0x907ffc3c), -980, -276 },
+ { njs_uint64(0xd3515c28, 0x31559a83), -954, -268 },
+ { njs_uint64(0x9d71ac8f, 0xada6c9b5), -927, -260 },
+ { njs_uint64(0xea9c2277, 0x23ee8bcb), -901, -252 },
+ { njs_uint64(0xaecc4991, 0x4078536d), -874, -244 },
+ { njs_uint64(0x823c1279, 0x5db6ce57), -847, -236 },
+ { njs_uint64(0xc2109436, 0x4dfb5637), -821, -228 },
+ { njs_uint64(0x9096ea6f, 0x3848984f), -794, -220 },
+ { njs_uint64(0xd77485cb, 0x25823ac7), -768, -212 },
+ { njs_uint64(0xa086cfcd, 0x97bf97f4), -741, -204 },
+ { njs_uint64(0xef340a98, 0x172aace5), -715, -196 },
+ { njs_uint64(0xb23867fb, 0x2a35b28e), -688, -188 },
+ { njs_uint64(0x84c8d4df, 0xd2c63f3b), -661, -180 },
+ { njs_uint64(0xc5dd4427, 0x1ad3cdba), -635, -172 },
+ { njs_uint64(0x936b9fce, 0xbb25c996), -608, -164 },
+ { njs_uint64(0xdbac6c24, 0x7d62a584), -582, -156 },
+ { njs_uint64(0xa3ab6658, 0x0d5fdaf6), -555, -148 },
+ { njs_uint64(0xf3e2f893, 0xdec3f126), -529, -140 },
+ { njs_uint64(0xb5b5ada8, 0xaaff80b8), -502, -132 },
+ { njs_uint64(0x87625f05, 0x6c7c4a8b), -475, -124 },
+ { njs_uint64(0xc9bcff60, 0x34c13053), -449, -116 },
+ { njs_uint64(0x964e858c, 0x91ba2655), -422, -108 },
+ { njs_uint64(0xdff97724, 0x70297ebd), -396, -100 },
+ { njs_uint64(0xa6dfbd9f, 0xb8e5b88f), -369, -92 },
+ { njs_uint64(0xf8a95fcf, 0x88747d94), -343, -84 },
+ { njs_uint64(0xb9447093, 0x8fa89bcf), -316, -76 },
+ { njs_uint64(0x8a08f0f8, 0xbf0f156b), -289, -68 },
+ { njs_uint64(0xcdb02555, 0x653131b6), -263, -60 },
+ { njs_uint64(0x993fe2c6, 0xd07b7fac), -236, -52 },
+ { njs_uint64(0xe45c10c4, 0x2a2b3b06), -210, -44 },
+ { njs_uint64(0xaa242499, 0x697392d3), -183, -36 },
+ { njs_uint64(0xfd87b5f2, 0x8300ca0e), -157, -28 },
+ { njs_uint64(0xbce50864, 0x92111aeb), -130, -20 },
+ { njs_uint64(0x8cbccc09, 0x6f5088cc), -103, -12 },
+ { njs_uint64(0xd1b71758, 0xe219652c), -77, -4 },
+ { njs_uint64(0x9c400000, 0x00000000), -50, 4 },
+ { njs_uint64(0xe8d4a510, 0x00000000), -24, 12 },
+ { njs_uint64(0xad78ebc5, 0xac620000), 3, 20 },
+ { njs_uint64(0x813f3978, 0xf8940984), 30, 28 },
+ { njs_uint64(0xc097ce7b, 0xc90715b3), 56, 36 },
+ { njs_uint64(0x8f7e32ce, 0x7bea5c70), 83, 44 },
+ { njs_uint64(0xd5d238a4, 0xabe98068), 109, 52 },
+ { njs_uint64(0x9f4f2726, 0x179a2245), 136, 60 },
+ { njs_uint64(0xed63a231, 0xd4c4fb27), 162, 68 },
+ { njs_uint64(0xb0de6538, 0x8cc8ada8), 189, 76 },
+ { njs_uint64(0x83c7088e, 0x1aab65db), 216, 84 },
+ { njs_uint64(0xc45d1df9, 0x42711d9a), 242, 92 },
+ { njs_uint64(0x924d692c, 0xa61be758), 269, 100 },
+ { njs_uint64(0xda01ee64, 0x1a708dea), 295, 108 },
+ { njs_uint64(0xa26da399, 0x9aef774a), 322, 116 },
+ { njs_uint64(0xf209787b, 0xb47d6b85), 348, 124 },
+ { njs_uint64(0xb454e4a1, 0x79dd1877), 375, 132 },
+ { njs_uint64(0x865b8692, 0x5b9bc5c2), 402, 140 },
+ { njs_uint64(0xc83553c5, 0xc8965d3d), 428, 148 },
+ { njs_uint64(0x952ab45c, 0xfa97a0b3), 455, 156 },
+ { njs_uint64(0xde469fbd, 0x99a05fe3), 481, 164 },
+ { njs_uint64(0xa59bc234, 0xdb398c25), 508, 172 },
+ { njs_uint64(0xf6c69a72, 0xa3989f5c), 534, 180 },
+ { njs_uint64(0xb7dcbf53, 0x54e9bece), 561, 188 },
+ { njs_uint64(0x88fcf317, 0xf22241e2), 588, 196 },
+ { njs_uint64(0xcc20ce9b, 0xd35c78a5), 614, 204 },
+ { njs_uint64(0x98165af3, 0x7b2153df), 641, 212 },
+ { njs_uint64(0xe2a0b5dc, 0x971f303a), 667, 220 },
+ { njs_uint64(0xa8d9d153, 0x5ce3b396), 694, 228 },
+ { njs_uint64(0xfb9b7cd9, 0xa4a7443c), 720, 236 },
+ { njs_uint64(0xbb764c4c, 0xa7a44410), 747, 244 },
+ { njs_uint64(0x8bab8eef, 0xb6409c1a), 774, 252 },
+ { njs_uint64(0xd01fef10, 0xa657842c), 800, 260 },
+ { njs_uint64(0x9b10a4e5, 0xe9913129), 827, 268 },
+ { njs_uint64(0xe7109bfb, 0xa19c0c9d), 853, 276 },
+ { njs_uint64(0xac2820d9, 0x623bf429), 880, 284 },
+ { njs_uint64(0x80444b5e, 0x7aa7cf85), 907, 292 },
+ { njs_uint64(0xbf21e440, 0x03acdd2d), 933, 300 },
+ { njs_uint64(0x8e679c2f, 0x5e44ff8f), 960, 308 },
+ { njs_uint64(0xd433179d, 0x9c8cb841), 986, 316 },
+ { njs_uint64(0x9e19db92, 0xb4e31ba9), 1013, 324 },
+ { njs_uint64(0xeb96bf6e, 0xbadf77d9), 1039, 332 },
+ { njs_uint64(0xaf87023b, 0x9bf0ee6b), 1066, 340 },
+};
+
+
+#define NJS_D_1_LOG2_10 0.30102999566398114 /* 1 / log2(10). */
+
+
+njs_diyfp_t
+njs_cached_power_dec(int exp, int *dec_exp)
+{
+ u_int index;
+ const njs_cpe_t *cp;
+
+ index = (exp + NJS_DECIMAL_EXPONENT_OFF) / NJS_DECIMAL_EXPONENT_DIST;
+ cp = &njs_cached_powers[index];
+
+ *dec_exp = cp->dec_exp;
+
+ return njs_diyfp(cp->significand, cp->bin_exp);
+}
+
+
+njs_diyfp_t
+njs_cached_power_bin(int exp, int *dec_exp)
+{
+ int k;
+ u_int index;
+ const njs_cpe_t *cp;
+
+ k = (int) ceil((-61 - exp) * NJS_D_1_LOG2_10)
+ + NJS_DECIMAL_EXPONENT_OFF - 1;
+
+ index = (unsigned) (k >> 3) + 1;
+
+ cp = &njs_cached_powers[index];
+
+ *dec_exp = -(NJS_DECIMAL_EXPONENT_MIN + (int) (index << 3));
+
+ return njs_diyfp(cp->significand, cp->bin_exp);
+}
--- /dev/null
+
+/*
+ * Copyright (C) Dmitry Volyntsev
+ * Copyright (C) NGINX, Inc.
+ *
+ * An internal diy_fp implementation.
+ * For details, see Loitsch, Florian. "Printing floating-point numbers quickly
+ * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
+ */
+
+#ifndef _NJS_DIYFP_H_INCLUDED_
+#define _NJS_DIYFP_H_INCLUDED_
+
+#include <njs_types.h>
+#include <math.h>
+
+
+typedef struct {
+ uint64_t significand;
+ int exp;
+} njs_diyfp_t;
+
+
+#define njs_diyfp(_s, _e) (njs_diyfp_t) \
+ { .significand = (_s), .exp = (_e) }
+#define njs_uint64(h, l) (((uint64_t) (h) << 32) + (l))
+
+
+#define NJS_DBL_SIGNIFICAND_SIZE 52
+#define NJS_DBL_EXPONENT_BIAS (0x3FF + NJS_DBL_SIGNIFICAND_SIZE)
+#define NJS_DBL_EXPONENT_MIN (-NJS_DBL_EXPONENT_BIAS)
+#define NJS_DBL_EXPONENT_MAX (0x7FF - NJS_DBL_EXPONENT_BIAS)
+#define NJS_DBL_EXPONENT_DENORMAL (-NJS_DBL_EXPONENT_BIAS + 1)
+
+#define NJS_DBL_SIGNIFICAND_MASK njs_uint64(0x000FFFFF, 0xFFFFFFFF)
+#define NJS_DBL_HIDDEN_BIT njs_uint64(0x00100000, 0x00000000)
+#define NJS_DBL_EXPONENT_MASK njs_uint64(0x7FF00000, 0x00000000)
+
+#define NJS_DIYFP_SIGNIFICAND_SIZE 64
+
+#define NJS_SIGNIFICAND_SIZE 53
+#define NJS_SIGNIFICAND_SHIFT (NJS_DIYFP_SIGNIFICAND_SIZE \
+ - NJS_DBL_SIGNIFICAND_SIZE)
+
+#define NJS_DECIMAL_EXPONENT_OFF 348
+#define NJS_DECIMAL_EXPONENT_MIN (-348)
+#define NJS_DECIMAL_EXPONENT_MAX 340
+#define NJS_DECIMAL_EXPONENT_DIST 8
+
+
+njs_inline njs_diyfp_t
+njs_d2diyfp(double d)
+{
+ int biased_exp;
+ uint64_t significand;
+ njs_diyfp_t r;
+
+ union {
+ double d;
+ uint64_t u64;
+ } u;
+
+ u.d = d;
+
+ biased_exp = (u.u64 & NJS_DBL_EXPONENT_MASK) >> NJS_DBL_SIGNIFICAND_SIZE;
+ significand = u.u64 & NJS_DBL_SIGNIFICAND_MASK;
+
+ if (biased_exp != 0) {
+ r.significand = significand + NJS_DBL_HIDDEN_BIT;
+ r.exp = biased_exp - NJS_DBL_EXPONENT_BIAS;
+
+ } else {
+ r.significand = significand;
+ r.exp = NJS_DBL_EXPONENT_MIN + 1;
+ }
+
+ return r;
+}
+
+
+njs_inline double
+njs_diyfp2d(njs_diyfp_t v)
+{
+ int exp;
+ uint64_t significand, biased_exp;
+
+ union {
+ double d;
+ uint64_t u64;
+ } u;
+
+ exp = v.exp;
+ significand = v.significand;
+
+ while (significand > NJS_DBL_HIDDEN_BIT + NJS_DBL_SIGNIFICAND_MASK) {
+ significand >>= 1;
+ exp++;
+ }
+
+ if (exp >= NJS_DBL_EXPONENT_MAX) {
+ return INFINITY;
+ }
+
+ if (exp < NJS_DBL_EXPONENT_DENORMAL) {
+ return 0.0;
+ }
+
+ while (exp > NJS_DBL_EXPONENT_DENORMAL
+ && (significand & NJS_DBL_HIDDEN_BIT) == 0)
+ {
+ significand <<= 1;
+ exp--;
+ }
+
+ if (exp == NJS_DBL_EXPONENT_DENORMAL
+ && (significand & NJS_DBL_HIDDEN_BIT) == 0)
+ {
+ biased_exp = 0;
+
+ } else {
+ biased_exp = (uint64_t) (exp + NJS_DBL_EXPONENT_BIAS);
+ }
+
+ u.u64 = (significand & NJS_DBL_SIGNIFICAND_MASK)
+ | (biased_exp << NJS_DBL_SIGNIFICAND_SIZE);
+
+ return u.d;
+}
+
+
+njs_inline njs_diyfp_t
+njs_diyfp_shift_left(njs_diyfp_t v, unsigned shift)
+{
+ return njs_diyfp(v.significand << shift, v.exp - shift);
+}
+
+
+njs_inline njs_diyfp_t
+njs_diyfp_shift_right(njs_diyfp_t v, unsigned shift)
+{
+ return njs_diyfp(v.significand >> shift, v.exp + shift);
+}
+
+
+njs_inline njs_diyfp_t
+njs_diyfp_sub(njs_diyfp_t lhs, njs_diyfp_t rhs)
+{
+ return njs_diyfp(lhs.significand - rhs.significand, lhs.exp);
+}
+
+
+njs_inline njs_diyfp_t
+njs_diyfp_mul(njs_diyfp_t lhs, njs_diyfp_t rhs)
+{
+#if (NJS_HAVE_UNSIGNED_INT128)
+
+ uint64_t l, h;
+ njs_uint128_t u128;
+
+ u128 = (njs_uint128_t) (lhs.significand)
+ * (njs_uint128_t) (rhs.significand);
+
+ h = u128 >> 64;
+ l = (uint64_t) u128;
+
+ /* rounding. */
+
+ if (l & ((uint64_t) 1 << 63)) {
+ h++;
+ }
+
+ return njs_diyfp(h, lhs.exp + rhs.exp + 64);
+
+#else
+
+ uint64_t a, b, c, d, ac, bc, ad, bd, tmp;
+
+ a = lhs.significand >> 32;
+ b = lhs.significand & 0xffffffff;
+ c = rhs.significand >> 32;
+ d = rhs.significand & 0xffffffff;
+
+ ac = a * c;
+ bc = b * c;
+ ad = a * d;
+ bd = b * d;
+
+ tmp = (bd >> 32) + (ad & 0xffffffff) + (bc & 0xffffffff);
+
+ /* mult_round. */
+
+ tmp += 1U << 31;
+
+ return njs_diyfp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32),
+ lhs.exp + rhs.exp + 64);
+
+#endif
+}
+
+
+njs_inline njs_diyfp_t
+njs_diyfp_normalize(njs_diyfp_t v)
+{
+ return njs_diyfp_shift_left(v, njs_leading_zeros64(v.significand));
+}
+
+
+njs_diyfp_t njs_cached_power_dec(int exp, int *dec_exp);
+njs_diyfp_t njs_cached_power_bin(int exp, int *dec_exp);
+
+
+#endif /* _NJS_DIYFP_H_INCLUDED_ */
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_djb_hash.h>
+
+
+uint32_t
+njs_djb_hash(const void *data, size_t len)
+{
+ uint32_t hash;
+ const u_char *p;
+
+ p = data;
+ hash = NJS_DJB_HASH_INIT;
+
+ while (len != 0) {
+ hash = njs_djb_hash_add(hash, *p++);
+ len--;
+ }
+
+ return hash;
+}
+
+
+uint32_t
+njs_djb_hash_lowcase(const void *data, size_t len)
+{
+ uint32_t hash;
+ const u_char *p;
+
+ p = data;
+ hash = NJS_DJB_HASH_INIT;
+
+ while (len != 0) {
+ hash = njs_djb_hash_add(hash, njs_lower_case(*p++));
+ len--;
+ }
+
+ return hash;
+}
--- /dev/null
+
+/*
+ * 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_ */
* THE SOFTWARE.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_string.h>
-#include <nxt_diyfp.h>
-#include <nxt_dtoa.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_str.h>
+#include <njs_diyfp.h>
+#include <njs_dtoa.h>
#include <math.h>
#include <string.h>
-nxt_inline void
-nxt_grisu2_round(char *start, size_t len, uint64_t delta, uint64_t rest,
+njs_inline void
+njs_grisu2_round(char *start, size_t len, uint64_t delta, uint64_t rest,
uint64_t ten_kappa, uint64_t wp_w)
{
while (rest < wp_w && delta - rest >= ten_kappa
}
-nxt_inline int
-nxt_dec_count(uint32_t n)
+njs_inline int
+njs_dec_count(uint32_t n)
{
if (n < 10000) {
if (n < 100) {
}
-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,
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);
/* GCC 4.2 complains about uninitialized d. */
d = 0;
- kappa = nxt_dec_count(p1);
+ kappa = njs_dec_count(p1);
while (kappa > 0) {
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) {
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;
}
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;
}
}
-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;
}
-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;
}
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);
}
-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;
/* 1234e7 -> 12340000000 */
if (kk - length > 0) {
- nxt_memset(&start[length], '0', kk - length);
+ njs_memset(&start[length], '0', kk - length);
}
return kk;
start[1] = '.';
if (offset - 2 > 0) {
- nxt_memset(&start[2], '0', offset - 2);
+ njs_memset(&start[2], '0', offset - 2);
}
return (length + offset);
start[1] = 'e';
- size = nxt_write_exponent(kk - 1, &start[2]);
+ size = njs_write_exponent(kk - 1, &start[2]);
return (size + 2);
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;
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);
}
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
#include <math.h>
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);
}
}
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);
}
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;
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;
}
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;
}
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;
}
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);
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);
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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),
};
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;
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;
}
*retval = *proto;
- return NXT_OK;
+ return NJS_OK;
}
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]);
{
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);
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);
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);
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),
};
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])) {
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),
};
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),
};
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),
};
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),
};
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),
};
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),
};
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);
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);
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
-static nxt_int_t njs_event_hash_test(nxt_lvlhsh_query_t *lhq, void *data);
+static njs_int_t njs_event_hash_test(njs_lvlhsh_query_t *lhq, void *data);
-const nxt_lvlhsh_proto_t njs_event_hash_proto
- nxt_aligned(64) =
+const njs_lvlhsh_proto_t njs_event_hash_proto
+ njs_aligned(64) =
{
- NXT_LVLHSH_DEFAULT,
+ NJS_LVLHSH_DEFAULT,
njs_event_hash_test,
njs_lvlhsh_alloc,
njs_lvlhsh_free,
};
-static nxt_int_t
-njs_event_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+njs_event_hash_test(njs_lvlhsh_query_t *lhq, void *data)
{
- nxt_str_t id;
+ njs_str_t id;
njs_event_t *event;
event = data;
njs_string_get(&event->id, &id);
- if (nxt_strstr_eq(&lhq->key, &id)) {
- return NXT_OK;
+ if (njs_strstr_eq(&lhq->key, &id)) {
+ return NJS_OK;
}
- return NXT_DECLINED;
+ return NJS_DECLINED;
}
-nxt_int_t
+njs_int_t
njs_add_event(njs_vm_t *vm, njs_event_t *event)
{
- nxt_int_t ret;
- nxt_lvlhsh_query_t lhq;
+ njs_int_t ret;
+ njs_lvlhsh_query_t lhq;
njs_uint32_to_string(&event->id, vm->event_id++);
njs_string_get(&event->id, &lhq.key);
- lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+ lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
lhq.value = event;
lhq.proto = &njs_event_hash_proto;
lhq.pool = vm->mem_pool;
- ret = nxt_lvlhsh_insert(&vm->events_hash, &lhq);
- if (nxt_slow_path(ret != NXT_OK)) {
+ ret = njs_lvlhsh_insert(&vm->events_hash, &lhq);
+ if (njs_slow_path(ret != NJS_OK)) {
njs_internal_error(vm, "Failed to add event with id: %s",
njs_string_short_start(&event->id));
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) {
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);
}
}
#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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
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,
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;
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;
*/
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;
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;
}
}
-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 *));
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);
}
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;
}
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;
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;
}
}
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;
}
}
-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;
}
}
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;
}
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;
}
#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;
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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_string.h>
-#include <nxt_file.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_str.h>
+#include <njs_file.h>
#include <string.h>
void
-nxt_file_basename(const nxt_str_t *path, nxt_str_t *name)
+njs_file_basename(const njs_str_t *path, njs_str_t *name)
{
const u_char *p, *end;
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;
current_dir:
- *name = nxt_string_value(".");
+ *name = njs_str_value(".");
}
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_fs.h>
#include <string.h>
#include <fcntl.h>
typedef struct {
- nxt_str_t name;
+ njs_str_t name;
int value;
} njs_fs_entry_t;
static njs_ret_t njs_fs_read_file(njs_vm_t *vm, njs_value_t *args,
- nxt_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused);
static njs_ret_t njs_fs_read_file_sync(njs_vm_t *vm, njs_value_t *args,
- nxt_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused);
static njs_ret_t njs_fs_append_file(njs_vm_t *vm, njs_value_t *args,
- nxt_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused);
static njs_ret_t njs_fs_write_file(njs_vm_t *vm, njs_value_t *args,
- nxt_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused);
static njs_ret_t njs_fs_append_file_sync(njs_vm_t *vm, njs_value_t *args,
- nxt_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused);
static njs_ret_t njs_fs_write_file_sync(njs_vm_t *vm, njs_value_t *args,
- nxt_uint_t nargs, njs_index_t unused);
+ njs_uint_t nargs, njs_index_t unused);
static njs_ret_t njs_fs_write_file_internal(njs_vm_t *vm, njs_value_t *args,
- nxt_uint_t nargs, int default_flags);
+ njs_uint_t nargs, int default_flags);
static njs_ret_t njs_fs_write_file_sync_internal(njs_vm_t *vm,
- njs_value_t *args, nxt_uint_t nargs, int default_flags);
+ njs_value_t *args, njs_uint_t nargs, int default_flags);
static njs_ret_t njs_fs_error(njs_vm_t *vm, const char *syscall,
const char *description, njs_value_t *path, int errn, njs_value_t *retval);
-static int njs_fs_flags(nxt_str_t *value);
+static int njs_fs_flags(njs_str_t *value);
static mode_t njs_fs_mode(njs_value_t *value);
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;
}
} 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);
}
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;
}
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;
}
}
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;
}
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";
}
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";
}
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;
}
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;
}
}
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);
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;
}
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:
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;
}
} 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);
}
}
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;
}
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";
}
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";
}
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;
}
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;
}
}
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);
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,
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,
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);
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);
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;
}
} 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;
}
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;
}
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;
}
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;
}
}
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;
}
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";
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;
}
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;
}
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;
}
} 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;
}
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;
}
}
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;
}
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";
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;
}
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;
}
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;
}
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;
}
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;
}
}
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),
};
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
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;
*/
}
copy = njs_function_copy(vm, function);
- if (nxt_slow_path(copy == NULL)) {
+ if (njs_slow_path(copy == NULL)) {
njs_memory_error(vm);
return NULL;
}
}
-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
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;
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;
}
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;
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;
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;
}
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;
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) {
/* GC: retain. */
njs_set_array(rest_arguments, array);
- return NXT_OK;
+ return NJS_OK;
}
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;
}
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;
+ (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;
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;
lambda = function->u.lambda;
- max_args = nxt_max(nargs, lambda->nargs);
+ max_args = njs_max(nargs, lambda->nargs);
closures = lambda->nesting + lambda->block_closures;
+ 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;
frame->local = value;
frame->previous_active_frame = vm->active_frame;
- return NXT_OK;
+ return NJS_OK;
}
* 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;
}
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;
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;
}
{
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;
lambda = function->u.lambda;
-#if (NXT_DEBUG)
+#if (NJS_DEBUG)
vm->scopes[NJS_SCOPE_CALLEE_ARGUMENTS] = NULL;
#endif
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);
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;
}
}
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);
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) {
if (!njs_is_string(args)) {
ret = njs_value_to_string(vm, args, args);
- if (ret != NXT_OK) {
+ if (ret != NJS_OK) {
return ret;
}
}
if (!njs_is_numeric(args)) {
ret = njs_value_to_numeric(vm, args, args);
- if (ret != NXT_OK) {
+ if (ret != NJS_OK) {
return ret;
}
}
if (!njs_is_numeric(args)) {
ret = njs_value_to_numeric(vm, args, args);
- if (ret != NXT_OK) {
+ if (ret != NJS_OK) {
return ret;
}
}
default:
ret = njs_value_to_string(vm, args, args);
- if (ret != NXT_OK) {
+ if (ret != NJS_OK) {
return ret;
}
}
default:
ret = njs_value_to_string(vm, args, args);
- if (ret != NXT_OK) {
+ if (ret != NJS_OK) {
return ret;
}
}
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;
}
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;
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;
}
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;
}
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;
}
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),
};
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;
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;
}
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;
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) {
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;
}
* 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;
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));
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;
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;
}
}
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;
}
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;
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) {
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;
njs_set_function(&vm->retval, function);
- return NXT_OK;
+ return NJS_OK;
}
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),
};
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),
};
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;
}
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),
};
/* 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
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[];
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);
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;
}
}
-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);
}
-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;
}
-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;
}
-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);
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;
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
njs_ret_t jump_offset;
njs_generator_patch_t *next;
- nxt_str_t label;
+ njs_str_t label;
};
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;
};
-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);
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); \
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) {
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);
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:
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. */
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;
}
}
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) {
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;
}
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;
}
-static nxt_int_t
+static njs_int_t
njs_generate_name(njs_vm_t *vm, njs_generator_t *generator,
njs_parser_node_t *node)
{
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;
}
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)
{
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,
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;
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;
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;
}
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;
}
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;
}
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;
}
*/
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;
/* 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;
}
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;
}
/* 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;
}
}
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;
}
/* 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;
}
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;
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;
}
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);
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;
}
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;
}
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)
/* 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;
}
next = patch->next;
- nxt_mp_free(vm->mem_pool, patch);
+ njs_mp_free(vm->mem_pool, patch);
patch = next;
node = branch->right;
/* 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;
}
}
/* 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;
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;
}
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;
}
}
-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;
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;
}
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;
}
}
-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;
}
/* 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;
}
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;
}
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;
}
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;
}
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;
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;
}
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;
}
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;
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;
}
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;
}
* 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;
}
}
-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;
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;
}
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;
* 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;
}
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;
}
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;
}
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;
}
-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;
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;
}
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;
}
}
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;
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;
}
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;
}
}
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);
}
}
-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;
}
}
-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;
}
}
-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);
}
-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;
}
}
-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;
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;
}
node->index = expr->index;
node->temporary = expr->temporary;
- return NXT_OK;
+ return NJS_OK;
}
/* lvalue->token == NJS_TOKEN_PROPERTY(_INIT) */
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;
}
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.
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);
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);
}
ret = njs_generator(vm, generator, expr);
- if (nxt_slow_path(ret != NXT_OK)) {
+ if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
}
-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;
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,
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;
}
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;
}
}
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;
}
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,
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;
}
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;
}
}
-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,
}
-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,
}
-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;
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;
}
}
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,
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;
}
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;
}
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;
}
}
-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;
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;
}
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;
}
ret = njs_generator(vm, generator, right);
- if (nxt_slow_path(ret != NXT_OK)) {
+ if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
* 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;
}
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;
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 {
} else {
ret = njs_generator(vm, generator, node->left);
- if (nxt_slow_path(ret != NXT_OK)) {
+ if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
}
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;
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;
}
code->src1 = lvalue->index;
code->src2 = lvalue->index;
- return NXT_OK;
+ return NJS_OK;
}
/* lvalue->token == NJS_TOKEN_PROPERTY */
/* 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;
}
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,
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;
}
}
}
-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;
}
}
-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];
}
-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;
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);
}
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;
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;
}
}
- 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;
}
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) {
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;
}
}
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)
{
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;
}
} else {
ret = njs_generate_variable(vm, generator, node);
- if (nxt_slow_path(ret != NXT_OK)) {
+ if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
}
if (node->u.reference.not_defined) {
- return NXT_OK;
+ return NJS_OK;
}
njs_generate_code(generator, njs_vmcode_function_frame_t, func,
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;
/* 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;
}
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;
nargs++;
ret = njs_generator(vm, generator, arg->left);
- if (nxt_slow_path(ret != NXT_OK)) {
+ if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
}
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;
}
} 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;
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;
*/
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;
}
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;
}
/* 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;
}
&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;
}
}
&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;
}
}
}
/* 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);
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;
}
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;
}
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;
}
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;
}
/*
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;
}
}
| 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;
}
/*
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;
}
}
}
}
-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);
}
-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;
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;
}
}
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;
}
code->retval = obj->index;
node->index = obj->index;
- return NXT_OK;
+ return NJS_OK;
}
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;
}
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;
}
}
-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);
}
}
-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)
{
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;
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;
}
}
-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;
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;
}
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;
};
-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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_json.h>
#include <njs_date.h>
#include <njs_regexp.h>
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;
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;
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;
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);
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);
#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;
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);
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;
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;
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;
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;
}
}
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;
}
}
}
- 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;
}
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;
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;
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;
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;
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);
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
continue;
}
- if (nxt_fast_path(ch >= ' ')) {
+ if (njs_fast_path(ch >= ' ')) {
continue;
}
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')))
{
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;
}
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;
}
/* 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;
}
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);
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;
const u_char *p)
{
double num;
- nxt_int_t sign;
+ njs_int_t sign;
const u_char *start;
sign = 1;
}
-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;
{
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 ' ':
#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:
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;
}
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;
}
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++;
}
ret = njs_json_parse_iterator_call(vm, parse);
- if (nxt_slow_path(ret != NXT_OK)) {
+ if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
default:
njs_internal_error(vm, "Unexpected state %d in JSON.parse()",
state->type);
- return NXT_ERROR;
+ return NJS_ERROR;
}
}
njs_memory_error(vm);
- return NXT_ERROR;
+ return NJS_ERROR;
}
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);
{
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;
{
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;
}
{
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;
}
#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; \
}
#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); \
} \
#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; \
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:
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;
}
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;
}
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;
}
state = njs_json_push_stringify_state(vm, stringify,
&prop->value);
if (state == NULL) {
- return NXT_ERROR;
+ return NJS_ERROR;
}
break;
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;
}
if (njs_is_object(value)) {
state = njs_json_push_stringify_state(vm, stringify, value);
if (state == NULL) {
- return NXT_ERROR;
+ return NJS_ERROR;
}
break;
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;
}
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;
}
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;
{
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;
}
state = njs_json_push_stringify_state(vm, stringify,
&stringify->retval);
if (state == NULL) {
- return NXT_ERROR;
+ return NJS_ERROR;
}
break;
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;
}
* 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;
}
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;
}
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);
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);
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);
}
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;
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;
properties->length = n;
stringify->replacer.data.u.array = properties;
- return NXT_OK;
+ return NJS_OK;
}
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;
{
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;
}
}
-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) {
}
-static nxt_int_t
+static njs_int_t
njs_json_append_string(njs_json_stringify_t *stringify,
const njs_value_t *value, char quote)
{
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;
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. */
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;
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)
{
} 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;
}
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;
}
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;
}
}
-static nxt_int_t
+static njs_int_t
njs_json_buf_append(njs_json_stringify_t *stringify, const char *msg,
size_t len)
{
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);
njs_json_buf_written(stringify, len);
}
- return NXT_OK;
+ return NJS_OK;
}
{
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;
}
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;
}
}
-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;
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;
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;
n = n->next;
}
- return NXT_OK;
+ return NJS_OK;
}
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; \
}
} \
\
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;
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))))
{
}
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);
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))))
{
}
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);
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);
}
njs_memory_error(stringify->vm);
- return NXT_ERROR;
+ return NJS_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; \
} \
\
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;
}
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;
}
}
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;
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;
}
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;
}
}
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:
njs_vm_value_string(vm, retval, &vm->retval);
- return NXT_OK;
+ return NJS_OK;
}
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
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,
};
-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;
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;
}
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;
}
}
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. */
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;
}
}
{
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;
}
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;
}
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;
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;
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;
/* 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 */
};
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++) {
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;
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;
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;
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;
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);
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_main.h>
+#include <string.h>
+
+
+static const njs_keyword_t njs_keywords[] = {
+
+ /* Values. */
+
+ { njs_str("undefined"), NJS_TOKEN_UNDEFINED, 0 },
+ { njs_str("null"), NJS_TOKEN_NULL, 0 },
+ { njs_str("false"), NJS_TOKEN_BOOLEAN, 0 },
+ { njs_str("true"), NJS_TOKEN_BOOLEAN, 1 },
+ { njs_str("NaN"), NJS_TOKEN_NUMBER, NAN },
+ { njs_str("Infinity"), NJS_TOKEN_NUMBER, INFINITY },
+
+ /* Operators. */
+
+ { njs_str("in"), NJS_TOKEN_IN, 0 },
+ { njs_str("typeof"), NJS_TOKEN_TYPEOF, 0 },
+ { njs_str("instanceof"), NJS_TOKEN_INSTANCEOF, 0 },
+ { njs_str("void"), NJS_TOKEN_VOID, 0 },
+ { njs_str("new"), NJS_TOKEN_NEW, 0 },
+ { njs_str("delete"), NJS_TOKEN_DELETE, 0 },
+ { njs_str("yield"), NJS_TOKEN_YIELD, 0 },
+
+ /* Statements. */
+
+ { njs_str("var"), NJS_TOKEN_VAR, 0 },
+ { njs_str("if"), NJS_TOKEN_IF, 0 },
+ { njs_str("else"), NJS_TOKEN_ELSE, 0 },
+ { njs_str("while"), NJS_TOKEN_WHILE, 0 },
+ { njs_str("do"), NJS_TOKEN_DO, 0 },
+ { njs_str("for"), NJS_TOKEN_FOR, 0 },
+ { njs_str("break"), NJS_TOKEN_BREAK, 0 },
+ { njs_str("continue"), NJS_TOKEN_CONTINUE, 0 },
+ { njs_str("switch"), NJS_TOKEN_SWITCH, 0 },
+ { njs_str("case"), NJS_TOKEN_CASE, 0 },
+ { njs_str("default"), NJS_TOKEN_DEFAULT, 0 },
+ { njs_str("function"), NJS_TOKEN_FUNCTION, 0 },
+ { njs_str("return"), NJS_TOKEN_RETURN, 0 },
+ { njs_str("with"), NJS_TOKEN_WITH, 0 },
+ { njs_str("try"), NJS_TOKEN_TRY, 0 },
+ { njs_str("catch"), NJS_TOKEN_CATCH, 0 },
+ { njs_str("finally"), NJS_TOKEN_FINALLY, 0 },
+ { njs_str("throw"), NJS_TOKEN_THROW, 0 },
+
+ /* Builtin objects. */
+
+ { njs_str("this"), NJS_TOKEN_THIS, 0 },
+ { njs_str("arguments"), NJS_TOKEN_ARGUMENTS, 0 },
+ { njs_str("njs"), NJS_TOKEN_NJS, 0 },
+ { njs_str("process"), NJS_TOKEN_PROCESS, 0 },
+ { njs_str("Math"), NJS_TOKEN_MATH, 0 },
+ { njs_str("JSON"), NJS_TOKEN_JSON, 0 },
+
+ /* Builtin functions. */
+
+ { njs_str("Object"), NJS_TOKEN_OBJECT_CONSTRUCTOR, 0 },
+ { njs_str("Array"), NJS_TOKEN_ARRAY_CONSTRUCTOR, 0 },
+ { njs_str("Boolean"), NJS_TOKEN_BOOLEAN_CONSTRUCTOR, 0 },
+ { njs_str("Number"), NJS_TOKEN_NUMBER_CONSTRUCTOR, 0 },
+ { njs_str("String"), NJS_TOKEN_STRING_CONSTRUCTOR, 0 },
+ { njs_str("Function"), NJS_TOKEN_FUNCTION_CONSTRUCTOR, 0 },
+ { njs_str("RegExp"), NJS_TOKEN_REGEXP_CONSTRUCTOR, 0 },
+ { njs_str("Date"), NJS_TOKEN_DATE_CONSTRUCTOR, 0 },
+ { njs_str("Error"), NJS_TOKEN_ERROR_CONSTRUCTOR, 0 },
+ { njs_str("EvalError"), NJS_TOKEN_EVAL_ERROR_CONSTRUCTOR, 0 },
+ { njs_str("InternalError"), NJS_TOKEN_INTERNAL_ERROR_CONSTRUCTOR, 0 },
+ { njs_str("RangeError"), NJS_TOKEN_RANGE_ERROR_CONSTRUCTOR, 0 },
+ { njs_str("ReferenceError"), NJS_TOKEN_REF_ERROR_CONSTRUCTOR, 0 },
+ { njs_str("SyntaxError"), NJS_TOKEN_SYNTAX_ERROR_CONSTRUCTOR, 0 },
+ { njs_str("TypeError"), NJS_TOKEN_TYPE_ERROR_CONSTRUCTOR, 0 },
+ { njs_str("URIError"), NJS_TOKEN_URI_ERROR_CONSTRUCTOR, 0 },
+ { njs_str("MemoryError"), NJS_TOKEN_MEMORY_ERROR_CONSTRUCTOR, 0 },
+
+ { njs_str("eval"), NJS_TOKEN_EVAL, 0 },
+ { njs_str("toString"), NJS_TOKEN_TO_STRING, 0 },
+ { njs_str("isNaN"), NJS_TOKEN_IS_NAN, 0 },
+ { njs_str("isFinite"), NJS_TOKEN_IS_FINITE, 0 },
+ { njs_str("parseInt"), NJS_TOKEN_PARSE_INT, 0 },
+ { njs_str("parseFloat"), NJS_TOKEN_PARSE_FLOAT, 0 },
+ { njs_str("encodeURI"), NJS_TOKEN_ENCODE_URI, 0 },
+ { njs_str("encodeURIComponent"), NJS_TOKEN_ENCODE_URI_COMPONENT, 0 },
+ { njs_str("decodeURI"), NJS_TOKEN_DECODE_URI, 0 },
+ { njs_str("decodeURIComponent"), NJS_TOKEN_DECODE_URI_COMPONENT, 0 },
+ { njs_str("require"), NJS_TOKEN_REQUIRE, 0 },
+ { njs_str("setTimeout"), NJS_TOKEN_SET_TIMEOUT, 0 },
+ { njs_str("setImmediate"), NJS_TOKEN_SET_IMMEDIATE, 0 },
+ { njs_str("clearTimeout"), NJS_TOKEN_CLEAR_TIMEOUT, 0 },
+
+ /* Module. */
+ { njs_str("import"), NJS_TOKEN_IMPORT, 0 },
+ { njs_str("from"), NJS_TOKEN_FROM, 0 },
+ { njs_str("export"), NJS_TOKEN_EXPORT, 0 },
+
+ /* Reserved words. */
+
+ { njs_str("await"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("class"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("const"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("debugger"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("enum"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("extends"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("implements"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("interface"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("let"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("package"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("private"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("protected"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("public"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("static"), NJS_TOKEN_RESERVED, 0 },
+ { njs_str("super"), NJS_TOKEN_RESERVED, 0 },
+};
+
+
+static njs_int_t
+njs_keyword_hash_test(njs_lvlhsh_query_t *lhq, void *data)
+{
+ njs_keyword_t *keyword;
+
+ keyword = data;
+
+ if (njs_strstr_eq(&lhq->key, &keyword->name)) {
+ return NJS_OK;
+ }
+
+ return NJS_DECLINED;
+}
+
+
+const njs_lvlhsh_proto_t njs_keyword_hash_proto
+ njs_aligned(64) =
+{
+ NJS_LVLHSH_DEFAULT,
+ njs_keyword_hash_test,
+ njs_lvlhsh_alloc,
+ njs_lvlhsh_free,
+};
+
+
+njs_int_t
+njs_lexer_keywords_init(njs_mp_t *mp, njs_lvlhsh_t *hash)
+{
+ njs_uint_t n;
+ njs_lvlhsh_query_t lhq;
+ const njs_keyword_t *keyword;
+
+ keyword = njs_keywords;
+ n = njs_nitems(njs_keywords);
+
+ lhq.replace = 0;
+ lhq.proto = &njs_keyword_hash_proto;
+ lhq.pool = mp;
+
+ do {
+ lhq.key_hash = njs_djb_hash(keyword->name.start, keyword->name.length);
+ lhq.key = keyword->name;
+ lhq.value = (void *) keyword;
+
+ if (njs_slow_path(njs_lvlhsh_insert(hash, &lhq) != NJS_OK)) {
+ return NJS_ERROR;
+ }
+
+ keyword++;
+ n--;
+
+ } while (n != 0);
+
+ return NJS_OK;
+}
+
+
+void
+njs_lexer_keyword(njs_lexer_t *lexer, njs_lexer_token_t *lt)
+{
+ njs_keyword_t *keyword;
+ njs_lvlhsh_query_t lhq;
+
+ lhq.key_hash = lt->key_hash;
+ lhq.key = lt->text;
+ lhq.proto = &njs_keyword_hash_proto;
+
+ if (njs_lvlhsh_find(&lexer->keywords_hash, &lhq) == NJS_OK) {
+ keyword = lhq.value;
+ lt->token = keyword->token;
+ lt->number = keyword->number;
+ lexer->keyword = 1;
+ }
+}
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_lvlhsh.h>
+#include <string.h>
+
+
+/*
+ * The level hash consists of hierarchical levels of arrays of pointers.
+ * The pointers may point to another level, a bucket, or NULL.
+ * The levels and buckets must be allocated in manner alike posix_memalign()
+ * to bookkeep additional information in pointer low bits.
+ *
+ * A level is an array of pointers. Its size is a power of 2. Levels
+ * may be different sizes, but on the same level the sizes are the same.
+ * Level sizes are specified by number of bits per level in lvlhsh->shift
+ * array. A hash may have up to 7 levels. There are two predefined
+ * shift arrays given by the first two shift array values:
+ *
+ * 1) [0, 0]: [4, 4, 4, 4, 4, 4, 4] on a 64-bit platform or
+ * [5, 5, 5, 5, 5, 5, 0] on a 32-bit platform,
+ * so default size of levels is 128 bytes.
+ *
+ * 2) [0, 10]: [10, 4, 4, 4, 4, 4, 0] on a 64-bit platform or
+ * [10, 5, 5, 5, 5, 0, 0] on a 32-bit platform,
+ * so default size of levels is 128 bytes on all levels except
+ * the first level. The first level is 8K or 4K on 64-bit or 32-bit
+ * platforms respectively.
+ *
+ * All buckets in a hash are the same size which is a power of 2.
+ * A bucket contains several entries stored and tested sequentially.
+ * The bucket size should be one or two CPU cache line size, a minimum
+ * allowed size is 32 bytes. A default 128-byte bucket contains 10 64-bit
+ * entries or 15 32-bit entries. Each entry consists of pointer to value
+ * data and 32-bit key. If an entry value pointer is NULL, the entry is free.
+ * On a 64-bit platform entry value pointers are no aligned, therefore they
+ * are accessed as two 32-bit integers. The rest trailing space in a bucket
+ * is used as pointer to next bucket and this pointer is always aligned.
+ * Although the level hash allows to store a lot of values in a bucket chain,
+ * this is non optimal way. The large data set should be stored using
+ * several levels.
+ */
+
+#define njs_lvlhsh_is_bucket(p) \
+ ((uintptr_t) (p) & 1)
+
+
+#define njs_lvlhsh_count_inc(n) \
+ n = (void *) ((uintptr_t) (n) + 2)
+
+
+#define njs_lvlhsh_count_dec(n) \
+ n = (void *) ((uintptr_t) (n) - 2)
+
+
+#define njs_lvlhsh_level_size(proto, nlvl) \
+ ((uintptr_t) 1 << proto->shift[nlvl])
+
+
+#define njs_lvlhsh_level(lvl, mask) \
+ (void **) ((uintptr_t) lvl & (~mask << 2))
+
+
+#define njs_lvlhsh_level_entries(lvl, mask) \
+ ((uintptr_t) lvl & (mask << 1))
+
+
+#define njs_lvlhsh_store_bucket(slot, bkt) \
+ slot = (void **) ((uintptr_t) bkt | 2 | 1)
+
+
+#define njs_lvlhsh_bucket_size(proto) \
+ proto->bucket_size
+
+
+#define njs_lvlhsh_bucket(proto, bkt) \
+ (uint32_t *) ((uintptr_t) bkt & ~(uintptr_t) proto->bucket_mask)
+
+
+#define njs_lvlhsh_bucket_entries(proto, bkt) \
+ (((uintptr_t) bkt & (uintptr_t) proto->bucket_mask) >> 1)
+
+
+#define njs_lvlhsh_bucket_end(proto, bkt) \
+ &bkt[proto->bucket_end]
+
+
+#define njs_lvlhsh_free_entry(e) \
+ (!(njs_lvlhsh_valid_entry(e)))
+
+
+#define njs_lvlhsh_next_bucket(proto, bkt) \
+ ((void **) &bkt[proto->bucket_end])
+
+#if (NJS_64BIT)
+
+#define njs_lvlhsh_valid_entry(e) \
+ (((e)[0] | (e)[1]) != 0)
+
+
+#define njs_lvlhsh_entry_value(e) \
+ (void *) (((uintptr_t) (e)[1] << 32) + (e)[0])
+
+
+#define njs_lvlhsh_set_entry_value(e, n) \
+ (e)[0] = (uint32_t) (uintptr_t) n; \
+ (e)[1] = (uint32_t) ((uintptr_t) n >> 32)
+
+
+#define njs_lvlhsh_entry_key(e) \
+ (e)[2]
+
+
+#define njs_lvlhsh_set_entry_key(e, n) \
+ (e)[2] = n
+
+#else
+
+#define njs_lvlhsh_valid_entry(e) \
+ ((e)[0] != 0)
+
+
+#define njs_lvlhsh_entry_value(e) \
+ (void *) (e)[0]
+
+
+#define njs_lvlhsh_set_entry_value(e, n) \
+ (e)[0] = (uint32_t) n
+
+
+#define njs_lvlhsh_entry_key(e) \
+ (e)[1]
+
+
+#define njs_lvlhsh_set_entry_key(e, n) \
+ (e)[1] = n
+
+#endif
+
+
+#define NJS_LVLHSH_BUCKET_DONE ((void *) -1)
+
+
+static njs_int_t njs_lvlhsh_level_find(njs_lvlhsh_query_t *lhq, void **lvl,
+ uint32_t key, njs_uint_t nlvl);
+static njs_int_t njs_lvlhsh_bucket_find(njs_lvlhsh_query_t *lhq, void **bkt);
+static njs_int_t njs_lvlhsh_new_bucket(njs_lvlhsh_query_t *lhq, void **slot);
+static njs_int_t njs_lvlhsh_level_insert(njs_lvlhsh_query_t *lhq,
+ void **slot, uint32_t key, njs_uint_t nlvl);
+static njs_int_t njs_lvlhsh_bucket_insert(njs_lvlhsh_query_t *lhq,
+ void **slot, uint32_t key, njs_int_t nlvl);
+static njs_int_t njs_lvlhsh_convert_bucket_to_level(njs_lvlhsh_query_t *lhq,
+ void **slot, njs_uint_t nlvl, uint32_t *bucket);
+static njs_int_t njs_lvlhsh_level_convertion_insert(njs_lvlhsh_query_t *lhq,
+ void **parent, uint32_t key, njs_uint_t nlvl);
+static njs_int_t njs_lvlhsh_bucket_convertion_insert(njs_lvlhsh_query_t *lhq,
+ void **slot, uint32_t key, njs_int_t nlvl);
+static njs_int_t njs_lvlhsh_free_level(njs_lvlhsh_query_t *lhq, void **level,
+ njs_uint_t size);
+static njs_int_t njs_lvlhsh_level_delete(njs_lvlhsh_query_t *lhq, void **slot,
+ uint32_t key, njs_uint_t nlvl);
+static njs_int_t njs_lvlhsh_bucket_delete(njs_lvlhsh_query_t *lhq, void **bkt);
+static void *njs_lvlhsh_level_each(njs_lvlhsh_each_t *lhe, void **level,
+ njs_uint_t nlvl, njs_uint_t shift);
+static void *njs_lvlhsh_bucket_each(njs_lvlhsh_each_t *lhe);
+
+
+njs_int_t
+njs_lvlhsh_find(const njs_lvlhsh_t *lh, njs_lvlhsh_query_t *lhq)
+{
+ void *slot;
+
+ slot = lh->slot;
+
+ if (njs_fast_path(slot != NULL)) {
+
+ if (njs_lvlhsh_is_bucket(slot)) {
+ return njs_lvlhsh_bucket_find(lhq, slot);
+ }
+
+ return njs_lvlhsh_level_find(lhq, slot, lhq->key_hash, 0);
+ }
+
+ return NJS_DECLINED;
+}
+
+
+static njs_int_t
+njs_lvlhsh_level_find(njs_lvlhsh_query_t *lhq, void **lvl, uint32_t key,
+ njs_uint_t nlvl)
+{
+ void **slot;
+ uintptr_t mask;
+ njs_uint_t shift;
+
+ shift = lhq->proto->shift[nlvl];
+ mask = ((uintptr_t) 1 << shift) - 1;
+
+ lvl = njs_lvlhsh_level(lvl, mask);
+ slot = lvl[key & mask];
+
+ if (slot != NULL) {
+
+ if (njs_lvlhsh_is_bucket(slot)) {
+ return njs_lvlhsh_bucket_find(lhq, slot);
+ }
+
+ return njs_lvlhsh_level_find(lhq, slot, key >> shift, nlvl + 1);
+ }
+
+ return NJS_DECLINED;
+}
+
+
+static njs_int_t
+njs_lvlhsh_bucket_find(njs_lvlhsh_query_t *lhq, void **bkt)
+{
+ void *value;
+ uint32_t *bucket, *e;
+ njs_uint_t n;
+
+ do {
+ bucket = njs_lvlhsh_bucket(lhq->proto, bkt);
+ n = njs_lvlhsh_bucket_entries(lhq->proto, bkt);
+ e = bucket;
+
+ do {
+ if (njs_lvlhsh_valid_entry(e)) {
+ n--;
+
+ if (njs_lvlhsh_entry_key(e) == lhq->key_hash) {
+
+ value = njs_lvlhsh_entry_value(e);
+
+ if (lhq->proto->test(lhq, value) == NJS_OK) {
+ lhq->value = value;
+
+ return NJS_OK;
+ }
+ }
+ }
+
+ e += NJS_LVLHSH_ENTRY_SIZE;
+
+ } while (n != 0);
+
+ bkt = *njs_lvlhsh_next_bucket(lhq->proto, bucket);
+
+ } while (bkt != NULL);
+
+ return NJS_DECLINED;
+}
+
+
+njs_int_t
+njs_lvlhsh_insert(njs_lvlhsh_t *lh, njs_lvlhsh_query_t *lhq)
+{
+ uint32_t key;
+
+ if (njs_fast_path(lh->slot != NULL)) {
+
+ key = lhq->key_hash;
+
+ if (njs_lvlhsh_is_bucket(lh->slot)) {
+ return njs_lvlhsh_bucket_insert(lhq, &lh->slot, key, -1);
+ }
+
+ return njs_lvlhsh_level_insert(lhq, &lh->slot, key, 0);
+ }
+
+ return njs_lvlhsh_new_bucket(lhq, &lh->slot);
+}
+
+
+static njs_int_t
+njs_lvlhsh_new_bucket(njs_lvlhsh_query_t *lhq, void **slot)
+{
+ uint32_t *bucket;
+
+ bucket = lhq->proto->alloc(lhq->pool, njs_lvlhsh_bucket_size(lhq->proto));
+
+ if (njs_fast_path(bucket != NULL)) {
+
+ njs_lvlhsh_set_entry_value(bucket, lhq->value);
+ njs_lvlhsh_set_entry_key(bucket, lhq->key_hash);
+
+ *njs_lvlhsh_next_bucket(lhq->proto, bucket) = NULL;
+
+ njs_lvlhsh_store_bucket(*slot, bucket);
+
+ return NJS_OK;
+ }
+
+ return NJS_ERROR;
+}
+
+
+static njs_int_t
+njs_lvlhsh_level_insert(njs_lvlhsh_query_t *lhq, void **parent, uint32_t key,
+ njs_uint_t nlvl)
+{
+ void **slot, **lvl;
+ njs_int_t ret;
+ uintptr_t mask;
+ njs_uint_t shift;
+
+ shift = lhq->proto->shift[nlvl];
+ mask = ((uintptr_t) 1 << shift) - 1;
+
+ lvl = njs_lvlhsh_level(*parent, mask);
+ slot = &lvl[key & mask];
+
+ if (*slot != NULL) {
+ key >>= shift;
+
+ if (njs_lvlhsh_is_bucket(*slot)) {
+ return njs_lvlhsh_bucket_insert(lhq, slot, key, nlvl);
+ }
+
+ return njs_lvlhsh_level_insert(lhq, slot, key, nlvl + 1);
+ }
+
+ ret = njs_lvlhsh_new_bucket(lhq, slot);
+
+ if (njs_fast_path(ret == NJS_OK)) {
+ njs_lvlhsh_count_inc(*parent);
+ }
+
+ return ret;
+}
+
+
+static njs_int_t
+njs_lvlhsh_bucket_insert(njs_lvlhsh_query_t *lhq, void **slot, uint32_t key,
+ njs_int_t nlvl)
+{
+ void **bkt, **vacant_bucket, *value;
+ uint32_t *bucket, *e, *vacant_entry;
+ njs_int_t ret;
+ uintptr_t n;
+ const void *new_value;
+ const njs_lvlhsh_proto_t *proto;
+
+ bkt = slot;
+ vacant_entry = NULL;
+ vacant_bucket = NULL;
+ proto = lhq->proto;
+
+ /* Search for duplicate entry in bucket chain. */
+
+ do {
+ bucket = njs_lvlhsh_bucket(proto, *bkt);
+ n = njs_lvlhsh_bucket_entries(proto, *bkt);
+ e = bucket;
+
+ do {
+ if (njs_lvlhsh_valid_entry(e)) {
+
+ if (njs_lvlhsh_entry_key(e) == lhq->key_hash) {
+
+ value = njs_lvlhsh_entry_value(e);
+
+ if (proto->test(lhq, value) == NJS_OK) {
+
+ new_value = lhq->value;
+ lhq->value = value;
+
+ if (lhq->replace) {
+ njs_lvlhsh_set_entry_value(e, new_value);
+
+ return NJS_OK;
+ }
+
+ return NJS_DECLINED;
+ }
+ }
+
+ n--;
+
+ } else {
+ /*
+ * Save a hole vacant position in bucket
+ * and continue to search for duplicate entry.
+ */
+ if (vacant_entry == NULL) {
+ vacant_entry = e;
+ vacant_bucket = bkt;
+ }
+ }
+
+ e += NJS_LVLHSH_ENTRY_SIZE;
+
+ } while (n != 0);
+
+ if (e < njs_lvlhsh_bucket_end(proto, bucket)) {
+ /*
+ * Save a vacant position on incomplete bucket's end
+ * and continue to search for duplicate entry.
+ */
+ if (vacant_entry == NULL) {
+ vacant_entry = e;
+ vacant_bucket = bkt;
+ }
+ }
+
+ bkt = njs_lvlhsh_next_bucket(proto, bucket);
+
+ } while (*bkt != NULL);
+
+ if (vacant_entry != NULL) {
+ njs_lvlhsh_set_entry_value(vacant_entry, lhq->value);
+ njs_lvlhsh_set_entry_key(vacant_entry, lhq->key_hash);
+ njs_lvlhsh_count_inc(*vacant_bucket);
+
+ return NJS_OK;
+ }
+
+ /* All buckets are full. */
+
+ nlvl++;
+
+ if (njs_fast_path(proto->shift[nlvl] != 0)) {
+
+ ret = njs_lvlhsh_convert_bucket_to_level(lhq, slot, nlvl, bucket);
+
+ if (njs_fast_path(ret == NJS_OK)) {
+ return njs_lvlhsh_level_insert(lhq, slot, key, nlvl);
+ }
+
+ return ret;
+ }
+
+ /* The last allowed level, only buckets may be allocated here. */
+
+ return njs_lvlhsh_new_bucket(lhq, bkt);
+}
+
+
+static njs_int_t
+njs_lvlhsh_convert_bucket_to_level(njs_lvlhsh_query_t *lhq, void **slot,
+ njs_uint_t nlvl, uint32_t *bucket)
+{
+ void *lvl, **level;
+ uint32_t *e, *end, key;
+ njs_int_t ret;
+ njs_uint_t i, shift, size;
+ njs_lvlhsh_query_t q;
+ const njs_lvlhsh_proto_t *proto;
+
+ proto = lhq->proto;
+ size = njs_lvlhsh_level_size(proto, nlvl);
+
+ lvl = proto->alloc(lhq->pool, size * (sizeof(void *)));
+
+ if (njs_slow_path(lvl == NULL)) {
+ return NJS_ERROR;
+ }
+
+ njs_memzero(lvl, size * (sizeof(void *)));
+
+ level = lvl;
+ shift = 0;
+
+ for (i = 0; i < nlvl; i++) {
+ /*
+ * Using SIMD operations in this trivial loop with maximum
+ * 8 iterations may increase code size by 170 bytes.
+ */
+ njs_pragma_loop_disable_vectorization;
+
+ shift += proto->shift[i];
+ }
+
+ end = njs_lvlhsh_bucket_end(proto, bucket);
+
+ for (e = bucket; e < end; e += NJS_LVLHSH_ENTRY_SIZE) {
+
+ q.proto = proto;
+ q.pool = lhq->pool;
+ q.value = njs_lvlhsh_entry_value(e);
+ key = njs_lvlhsh_entry_key(e);
+ q.key_hash = key;
+
+ ret = njs_lvlhsh_level_convertion_insert(&q, &lvl, key >> shift, nlvl);
+
+ if (njs_slow_path(ret != NJS_OK)) {
+ return njs_lvlhsh_free_level(lhq, level, size);
+ }
+ }
+
+ *slot = lvl;
+
+ proto->free(lhq->pool, bucket, njs_lvlhsh_bucket_size(proto));
+
+ return NJS_OK;
+}
+
+
+static njs_int_t
+njs_lvlhsh_level_convertion_insert(njs_lvlhsh_query_t *lhq, void **parent,
+ uint32_t key, njs_uint_t nlvl)
+{
+ void **slot, **lvl;
+ njs_int_t ret;
+ uintptr_t mask;
+ njs_uint_t shift;
+
+ shift = lhq->proto->shift[nlvl];
+ mask = ((uintptr_t) 1 << shift) - 1;
+
+ lvl = njs_lvlhsh_level(*parent, mask);
+ slot = &lvl[key & mask];
+
+ if (*slot == NULL) {
+ ret = njs_lvlhsh_new_bucket(lhq, slot);
+
+ if (njs_fast_path(ret == NJS_OK)) {
+ njs_lvlhsh_count_inc(*parent);
+ }
+
+ return ret;
+ }
+
+ /* Only backets can be here. */
+
+ return njs_lvlhsh_bucket_convertion_insert(lhq, slot, key >> shift, nlvl);
+}
+
+
+/*
+ * The special bucket insertion procedure is required because during
+ * convertion lhq->key contains garbage values and the test function
+ * cannot be called. Besides, the procedure can be simpler because
+ * a new entry is inserted just after occupied entries.
+ */
+
+static njs_int_t
+njs_lvlhsh_bucket_convertion_insert(njs_lvlhsh_query_t *lhq, void **slot,
+ uint32_t key, njs_int_t nlvl)
+{
+ void **bkt;
+ uint32_t *bucket, *e;
+ njs_int_t ret;
+ uintptr_t n;
+ const njs_lvlhsh_proto_t *proto;
+
+ bkt = slot;
+ proto = lhq->proto;
+
+ do {
+ bucket = njs_lvlhsh_bucket(proto, *bkt);
+ n = njs_lvlhsh_bucket_entries(proto, *bkt);
+ e = bucket + n * NJS_LVLHSH_ENTRY_SIZE;
+
+ if (njs_fast_path(e < njs_lvlhsh_bucket_end(proto, bucket))) {
+
+ njs_lvlhsh_set_entry_value(e, lhq->value);
+ njs_lvlhsh_set_entry_key(e, lhq->key_hash);
+ njs_lvlhsh_count_inc(*bkt);
+
+ return NJS_OK;
+ }
+
+ bkt = njs_lvlhsh_next_bucket(proto, bucket);
+
+ } while (*bkt != NULL);
+
+ /* All buckets are full. */
+
+ nlvl++;
+
+ if (njs_fast_path(proto->shift[nlvl] != 0)) {
+
+ ret = njs_lvlhsh_convert_bucket_to_level(lhq, slot, nlvl, bucket);
+
+ if (njs_fast_path(ret == NJS_OK)) {
+ return njs_lvlhsh_level_insert(lhq, slot, key, nlvl);
+ }
+
+ return ret;
+ }
+
+ /* The last allowed level, only buckets may be allocated here. */
+
+ return njs_lvlhsh_new_bucket(lhq, bkt);
+}
+
+
+static njs_int_t
+njs_lvlhsh_free_level(njs_lvlhsh_query_t *lhq, void **level, njs_uint_t size)
+{
+ size_t bsize;
+ njs_uint_t i;
+ const njs_lvlhsh_proto_t *proto;
+
+ proto = lhq->proto;
+ bsize = njs_lvlhsh_bucket_size(proto);
+
+ for (i = 0; i < size; i++) {
+
+ if (level[i] != NULL) {
+ /*
+ * Chained buckets are not possible here, since even
+ * in the worst case one bucket cannot be converted
+ * in two chained buckets but remains the same bucket.
+ */
+ proto->free(lhq->pool, njs_lvlhsh_bucket(proto, level[i]), bsize);
+ }
+ }
+
+ proto->free(lhq->pool, level, size * (sizeof(void *)));
+
+ return NJS_ERROR;
+}
+
+
+njs_int_t
+njs_lvlhsh_delete(njs_lvlhsh_t *lh, njs_lvlhsh_query_t *lhq)
+{
+ if (njs_fast_path(lh->slot != NULL)) {
+
+ if (njs_lvlhsh_is_bucket(lh->slot)) {
+ return njs_lvlhsh_bucket_delete(lhq, &lh->slot);
+ }
+
+ return njs_lvlhsh_level_delete(lhq, &lh->slot, lhq->key_hash, 0);
+ }
+
+ return NJS_DECLINED;
+}
+
+
+static njs_int_t
+njs_lvlhsh_level_delete(njs_lvlhsh_query_t *lhq, void **parent, uint32_t key,
+ njs_uint_t nlvl)
+{
+ size_t size;
+ void **slot, **lvl;
+ uintptr_t mask;
+ njs_int_t ret;
+ njs_uint_t shift;
+
+ shift = lhq->proto->shift[nlvl];
+ mask = ((uintptr_t) 1 << shift) - 1;
+
+ lvl = njs_lvlhsh_level(*parent, mask);
+ slot = &lvl[key & mask];
+
+ if (*slot != NULL) {
+
+ if (njs_lvlhsh_is_bucket(*slot)) {
+ ret = njs_lvlhsh_bucket_delete(lhq, slot);
+
+ } else {
+ key >>= shift;
+ ret = njs_lvlhsh_level_delete(lhq, slot, key, nlvl + 1);
+ }
+
+ if (*slot == NULL) {
+ njs_lvlhsh_count_dec(*parent);
+
+ if (njs_lvlhsh_level_entries(*parent, mask) == 0) {
+ *parent = NULL;
+ size = njs_lvlhsh_level_size(lhq->proto, nlvl);
+ lhq->proto->free(lhq->pool, lvl, size * sizeof(void *));
+ }
+ }
+
+ return ret;
+ }
+
+ return NJS_DECLINED;
+}
+
+
+static njs_int_t
+njs_lvlhsh_bucket_delete(njs_lvlhsh_query_t *lhq, void **bkt)
+{
+ void *value;
+ size_t size;
+ uint32_t *bucket, *e;
+ uintptr_t n;
+ const njs_lvlhsh_proto_t *proto;
+
+ proto = lhq->proto;
+
+ do {
+ bucket = njs_lvlhsh_bucket(proto, *bkt);
+ n = njs_lvlhsh_bucket_entries(proto, *bkt);
+ e = bucket;
+
+ do {
+ if (njs_lvlhsh_valid_entry(e)) {
+
+ if (njs_lvlhsh_entry_key(e) == lhq->key_hash) {
+
+ value = njs_lvlhsh_entry_value(e);
+
+ if (proto->test(lhq, value) == NJS_OK) {
+
+ if (njs_lvlhsh_bucket_entries(proto, *bkt) == 1) {
+ *bkt = *njs_lvlhsh_next_bucket(proto, bucket);
+ size = njs_lvlhsh_bucket_size(proto);
+ proto->free(lhq->pool, bucket, size);
+
+ } else {
+ njs_lvlhsh_count_dec(*bkt);
+ njs_lvlhsh_set_entry_value(e, NULL);
+ }
+
+ lhq->value = value;
+
+ return NJS_OK;
+ }
+ }
+
+ n--;
+ }
+
+ e += NJS_LVLHSH_ENTRY_SIZE;
+
+ } while (n != 0);
+
+ bkt = njs_lvlhsh_next_bucket(proto, bucket);
+
+ } while (*bkt != NULL);
+
+ return NJS_DECLINED;
+}
+
+
+void *
+njs_lvlhsh_each(const njs_lvlhsh_t *lh, njs_lvlhsh_each_t *lhe)
+{
+ void **slot;
+
+ if (lhe->bucket == NJS_LVLHSH_BUCKET_DONE) {
+ slot = lh->slot;
+
+ if (njs_lvlhsh_is_bucket(slot)) {
+ return NULL;
+ }
+
+ } else {
+ if (njs_slow_path(lhe->bucket == NULL)) {
+
+ /* The first iteration only. */
+
+ slot = lh->slot;
+
+ if (slot == NULL) {
+ return NULL;
+ }
+
+ if (!njs_lvlhsh_is_bucket(slot)) {
+ goto level;
+ }
+
+ lhe->bucket = njs_lvlhsh_bucket(lhe->proto, slot);
+ lhe->entries = njs_lvlhsh_bucket_entries(lhe->proto, slot);
+ }
+
+ return njs_lvlhsh_bucket_each(lhe);
+ }
+
+level:
+
+ return njs_lvlhsh_level_each(lhe, slot, 0, 0);
+}
+
+
+static void *
+njs_lvlhsh_level_each(njs_lvlhsh_each_t *lhe, void **level, njs_uint_t nlvl,
+ njs_uint_t shift)
+{
+ void **slot, *value;
+ uintptr_t mask;
+ njs_uint_t n, level_shift;
+
+ level_shift = lhe->proto->shift[nlvl];
+ mask = ((uintptr_t) 1 << level_shift) - 1;
+
+ level = njs_lvlhsh_level(level, mask);
+
+ do {
+ n = (lhe->current >> shift) & mask;
+ slot = level[n];
+
+ if (slot != NULL) {
+ if (njs_lvlhsh_is_bucket(slot)) {
+
+ if (lhe->bucket != NJS_LVLHSH_BUCKET_DONE) {
+
+ lhe->bucket = njs_lvlhsh_bucket(lhe->proto, slot);
+ lhe->entries = njs_lvlhsh_bucket_entries(lhe->proto, slot);
+ lhe->entry = 0;
+
+ return njs_lvlhsh_bucket_each(lhe);
+ }
+
+ lhe->bucket = NULL;
+
+ } else {
+ value = njs_lvlhsh_level_each(lhe, slot, nlvl + 1,
+ shift + level_shift);
+ if (value != NULL) {
+ return value;
+ }
+ }
+ }
+
+ lhe->current &= ~(mask << shift);
+ n = ((n + 1) & mask) << shift;
+ lhe->current |= n;
+
+ } while (n != 0);
+
+ return NULL;
+}
+
+
+static void *
+njs_lvlhsh_bucket_each(njs_lvlhsh_each_t *lhe)
+{
+ void *value, **next;
+ uint32_t *bucket;
+
+ /* At least one valid entry must present here. */
+ do {
+ bucket = &lhe->bucket[lhe->entry];
+ lhe->entry += NJS_LVLHSH_ENTRY_SIZE;
+
+ } while (njs_lvlhsh_free_entry(bucket));
+
+ value = njs_lvlhsh_entry_value(bucket);
+ lhe->key_hash = njs_lvlhsh_entry_key(bucket);
+
+ lhe->entries--;
+
+ if (lhe->entries == 0) {
+ next = *njs_lvlhsh_next_bucket(lhe->proto, lhe->bucket);
+
+ lhe->bucket = (next == NULL) ? NJS_LVLHSH_BUCKET_DONE
+ : njs_lvlhsh_bucket(lhe->proto, next);
+
+ lhe->entries = njs_lvlhsh_bucket_entries(lhe->proto, next);
+ lhe->entry = 0;
+ }
+
+ return value;
+}
--- /dev/null
+
+/*
+ * 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_ */
#define _NJS_CORE_H_INCLUDED_
-#include <nxt_auto_config.h>
-
-#include <nxt_unix.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_alignment.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_utf8.h>
-#include <nxt_dtoa.h>
-#include <nxt_strtod.h>
-#include <nxt_djb_hash.h>
-#include <nxt_trace.h>
-#include <nxt_array.h>
-#include <nxt_queue.h>
-#include <nxt_lvlhsh.h>
-#include <nxt_random.h>
-#include <nxt_time.h>
-#include <nxt_file.h>
-#include <nxt_malloc.h>
-#include <nxt_mp.h>
-#include <nxt_sprintf.h>
+#include <njs_auto_config.h>
+
+#include <njs_unix.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_alignment.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_utf8.h>
+#include <njs_dtoa.h>
+#include <njs_strtod.h>
+#include <njs_djb_hash.h>
+#include <njs_trace.h>
+#include <njs_arr.h>
+#include <njs_queue.h>
+#include <njs_lvlhsh.h>
+#include <njs_random.h>
+#include <njs_time.h>
+#include <njs_file.h>
+#include <njs_malloc.h>
+#include <njs_mp.h>
+#include <njs_sprintf.h>
#include <njs.h>
#include <njs_value.h>
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_malloc.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_malloc.h>
-#if (NXT_HAVE_POSIX_MEMALIGN)
+#if (NJS_HAVE_POSIX_MEMALIGN)
/*
* posix_memalign() presents in Linux glibc 2.1.91, FreeBSD 7.0,
*/
void *
-nxt_memalign(size_t alignment, size_t size)
+njs_memalign(size_t alignment, size_t size)
{
int err;
void *p;
err = posix_memalign(&p, alignment, size);
- if (nxt_fast_path(err == 0)) {
+ if (njs_fast_path(err == 0)) {
return p;
}
// STUB
- //nxt_errno_set(err);
+ //njs_errno_set(err);
return NULL;
}
-#elif (NXT_HAVE_MEMALIGN)
+#elif (NJS_HAVE_MEMALIGN)
/* memalign() presents in Solaris, HP-UX. */
void *
-nxt_memalign(size_t alignment, size_t size)
+njs_memalign(size_t alignment, size_t size)
{
return memalign(alignment, size);
}
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_MALLOC_H_INCLUDED_
+#define _NJS_MALLOC_H_INCLUDED_
+
+#include <stdlib.h>
+
+/*
+ * alloca() is defined in stdlib.h in Linux, FreeBSD and MacOSX
+ * and in alloca.h in Linux, Solaris and MacOSX.
+ */
+#if (NJS_SOLARIS)
+#include <alloca.h>
+#endif
+
+
+#define njs_malloc(size) malloc(size)
+#define njs_free(p) free(p)
+
+
+NJS_EXPORT void *njs_memalign(size_t alignment, size_t size);
+
+
+#endif /* _NJS_MALLOC_H_INCLUDED_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <math.h>
static njs_ret_t
-njs_object_math_abs(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+njs_object_math_abs(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
{
double num;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
}
}
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;
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;
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;
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;
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;
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;
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++) {
} 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;
}
}
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;
}
}
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;
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;
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;
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;
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;
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;
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;
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;
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;
njs_set_number(&vm->retval, num);
- return NXT_OK;
+ return NJS_OK;
}
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),
};
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_md5.h>
-#include <nxt_string.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_md5.h>
+#include <njs_str.h>
#include <string.h>
-static const u_char *nxt_md5_body(nxt_md5_t *ctx, const u_char *data,
+static const u_char *njs_md5_body(njs_md5_t *ctx, const u_char *data,
size_t size);
void
-nxt_md5_init(nxt_md5_t *ctx)
+njs_md5_init(njs_md5_t *ctx)
{
ctx->a = 0x67452301;
ctx->b = 0xefcdab89;
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;
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;
}
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;
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;
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);
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));
}
*/
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;
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_module.h>
#include <string.h>
#include <errno.h>
typedef struct {
int fd;
- nxt_str_t name;
- nxt_str_t file;
+ njs_str_t name;
+ njs_str_t file;
} njs_module_info_t;
-static nxt_int_t njs_module_lookup(njs_vm_t *vm, const nxt_str_t *cwd,
+static njs_int_t njs_module_lookup(njs_vm_t *vm, const njs_str_t *cwd,
njs_module_info_t *info);
-static nxt_int_t njs_module_relative_path(njs_vm_t *vm,
- const nxt_str_t *dir, njs_module_info_t *info);
-static nxt_int_t njs_module_absolute_path(njs_vm_t *vm,
+static njs_int_t njs_module_relative_path(njs_vm_t *vm,
+ const njs_str_t *dir, njs_module_info_t *info);
+static njs_int_t njs_module_absolute_path(njs_vm_t *vm,
njs_module_info_t *info);
-static nxt_bool_t njs_module_realpath_equal(const nxt_str_t *path1,
- const nxt_str_t *path2);
-static nxt_int_t njs_module_read(njs_vm_t *vm, int fd, nxt_str_t *body);
-static njs_module_t *njs_module_find(njs_vm_t *vm, nxt_str_t *name);
-static njs_module_t *njs_module_add(njs_vm_t *vm, nxt_str_t *name);
-static nxt_int_t njs_module_insert(njs_vm_t *vm, njs_module_t *module);
+static njs_bool_t njs_module_realpath_equal(const njs_str_t *path1,
+ const njs_str_t *path2);
+static njs_int_t njs_module_read(njs_vm_t *vm, int fd, njs_str_t *body);
+static njs_module_t *njs_module_find(njs_vm_t *vm, njs_str_t *name);
+static njs_module_t *njs_module_add(njs_vm_t *vm, njs_str_t *name);
+static njs_int_t njs_module_insert(njs_vm_t *vm, njs_module_t *module);
-nxt_int_t
+njs_int_t
njs_module_load(njs_vm_t *vm)
{
- nxt_int_t ret;
- nxt_uint_t i;
+ njs_int_t ret;
+ njs_uint_t i;
njs_value_t *value;
njs_module_t **item, *module;
if (vm->modules == NULL) {
- return NXT_OK;
+ return NJS_OK;
}
item = vm->modules->start;
} else {
ret = njs_vm_invoke(vm, &module->function, NULL, 0, module->index);
- if (ret == NXT_ERROR) {
+ if (ret == NJS_ERROR) {
return ret;
}
}
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;
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;
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);
/* 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;
}
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;
}
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;
}
}
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);
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;
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;
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);
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];
}
-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,
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;
}
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");
}
-static nxt_int_t
+static njs_int_t
njs_module_insert(njs_vm_t *vm, njs_module_t *module)
{
njs_module_t **value;
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");
}
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);
const njs_object_init_t njs_require_function_init = {
- nxt_string("require"),
+ njs_str("require"),
NULL,
0,
};
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;
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_alignment.h>
-#include <nxt_stub.h>
-#include <nxt_string.h>
-#include <nxt_queue.h>
-#include <nxt_rbtree.h>
-#include <nxt_mp.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_alignment.h>
+#include <njs_stub.h>
+#include <njs_str.h>
+#include <njs_queue.h>
+#include <njs_rbtree.h>
+#include <njs_mp.h>
#include <string.h>
#include <stdint.h>
* 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.
/* 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;
/* 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;
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
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;
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. */
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;
}
-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);
}
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;
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,
/* 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;
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;
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--;
* 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;
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
}
}
-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;
}
-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;
}
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);
}
}
-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;
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);
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 */ }
* 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;
* 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. */
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;
--- /dev/null
+
+/*
+ * 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_ */
* released to the public domain.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_murmur_hash.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_murmur_hash.h>
uint32_t
-nxt_murmur_hash2(const void *data, size_t len)
+njs_murmur_hash2(const void *data, size_t len)
{
uint32_t h, k;
const u_char *p;
/* 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;
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <math.h>
#include <string.h>
#include <float.h>
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)) {
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. */
double
njs_number_dec_parse(const u_char **start, const u_char *end)
{
- return nxt_strtod(start, end);
+ return njs_strtod(start, end);
}
/* Values less than '0' become >= 208. */
c = *p - '0';
- if (nxt_slow_path(c > 7)) {
+ if (njs_slow_path(c > 7)) {
break;
}
/* Values less than '0' become >= 208. */
c = *p - '0';
- if (nxt_slow_path(c > 1)) {
+ if (njs_slow_path(c > 1)) {
break;
}
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;
while (p < end) {
n = njs_char_to_hex(*p);
- if (nxt_slow_path(n < 0)) {
+ if (njs_slow_path(n < 0)) {
break;
}
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,
for (p = *start; p < end; p++) {
d = digits[*p];
- if (nxt_slow_path(d >= radix)) {
+ if (njs_slow_path(d >= radix)) {
break;
}
}
} 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;
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);
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;
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;
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;
vm->retval = *value;
- return NXT_OK;
+ return NJS_OK;
}
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;
} 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;
} else {
njs_type_error(vm, "unexpected value type:%s",
njs_type_string(value->type));
- return NXT_ERROR;
+ return NJS_ERROR;
}
}
if (radix < 2 || radix > 36 || radix != (int) radix) {
njs_range_error(vm, NULL);
- return NXT_ERROR;
+ return NJS_ERROR;
}
number = njs_number(value);
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;
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;
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;
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;
njs_set_number(&vm->retval, num);
- return NXT_OK;
+ return NJS_OK;
}
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),
};
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),
};
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),
};
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),
};
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.
}
-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;
}
}
-nxt_inline nxt_int_t
+njs_inline njs_int_t
njs_char_to_hex(u_char c)
{
c |= 0x20;
/* Values less than 'a' become >= 159. */
c = c - ('a' - '0');
- if (nxt_slow_path(c > 5)) {
+ if (njs_slow_path(c > 5)) {
return -1;
}
}
-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);
}
}
-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);
}
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
-static nxt_int_t njs_object_hash_test(nxt_lvlhsh_query_t *lhq, void *data);
+static njs_int_t njs_object_hash_test(njs_lvlhsh_query_t *lhq, void *data);
static njs_object_prop_t *njs_object_exist_in_proto(const njs_object_t *begin,
- const njs_object_t *end, nxt_lvlhsh_query_t *lhq);
+ const njs_object_t *end, njs_lvlhsh_query_t *lhq);
static uint32_t njs_object_enumerate_array_length(const njs_object_t *object);
static uint32_t njs_object_enumerate_string_length(const njs_object_t *object);
static uint32_t njs_object_enumerate_object_length(const njs_object_t *object,
- nxt_bool_t all);
+ njs_bool_t all);
static uint32_t njs_object_own_enumerate_object_length(
- const njs_object_t *object, const njs_object_t *parent, nxt_bool_t all);
+ const njs_object_t *object, const njs_object_t *parent, njs_bool_t all);
static njs_ret_t njs_object_enumerate_array(njs_vm_t *vm,
const njs_array_t *array, njs_array_t *items, njs_object_enum_t kind);
static njs_ret_t njs_object_enumerate_string(njs_vm_t *vm,
const njs_value_t *value, njs_array_t *items, njs_object_enum_t kind);
static njs_ret_t njs_object_enumerate_object(njs_vm_t *vm,
const njs_object_t *object, njs_array_t *items, njs_object_enum_t kind,
- nxt_bool_t all);
+ njs_bool_t all);
static njs_ret_t njs_object_own_enumerate_object(njs_vm_t *vm,
const njs_object_t *object, const njs_object_t *parent, njs_array_t *items,
- njs_object_enum_t kind, nxt_bool_t all);
+ njs_object_enum_t kind, njs_bool_t all);
njs_object_t *
{
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;
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;
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);
}
-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;
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;
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;
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;
/* 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);
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;
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)) {
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;
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;
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;
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) {
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;
}
}
-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;
}
-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;
}
-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;
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;
}
}
-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;
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;
}
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;
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;
}
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;
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;
}
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;
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;
}
}
- 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;
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)) {
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;
}
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);
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;
}
do {
entry = njs_array_alloc(vm, 2, 0);
- if (nxt_slow_path(entry == NULL)) {
+ if (njs_slow_path(entry == NULL)) {
return NJS_ERROR;
}
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);
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__;
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__;
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;
switch (kind) {
case NJS_ENUM_KEYS:
for ( ;; ) {
- prop = nxt_lvlhsh_each(hash, &lhe);
+ prop = njs_lvlhsh_each(hash, &lhe);
if (prop == NULL) {
break;
}
}
- 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;
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)) {
case NJS_ENUM_VALUES:
for ( ;; ) {
- prop = nxt_lvlhsh_each(hash, &lhe);
+ prop = njs_lvlhsh_each(hash, &lhe);
if (prop == NULL) {
break;
}
}
- 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;
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)) {
case NJS_ENUM_BOTH:
for ( ;; ) {
- prop = nxt_lvlhsh_each(hash, &lhe);
+ prop = njs_lvlhsh_each(hash, &lhe);
if (prop == NULL) {
break;
&& (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;
}
}
}
- 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;
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;
}
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;
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;
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);
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;
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);
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;
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;
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;
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;
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;
}
for ( ;; ) {
- prop = nxt_lvlhsh_each(hash, &lhe);
+ prop = njs_lvlhsh_each(hash, &lhe);
if (prop == NULL) {
break;
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;
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;
}
for ( ;; ) {
- prop = nxt_lvlhsh_each(hash, &lhe);
+ prop = njs_lvlhsh_each(hash, &lhe);
if (prop == NULL) {
break;
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;
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;
if (!njs_is_object(value)) {
vm->retval = njs_value_false;
- return NXT_OK;
+ return NJS_OK;
}
retval = njs_object(value)->extensible ? &njs_value_true
vm->retval = *retval;
- return NXT_OK;
+ return NJS_OK;
}
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;
/*
njs_set_type_object(retval, proto, proto->type);
- return NXT_OK;
+ return NJS_OK;
}
*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;
}
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;
}
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)
{
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;
}
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)) {
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;
}
}
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;
}
} 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);
}
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;
}
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;
}
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;
}
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;
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;
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);
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;
}
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;
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);
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;
vm->retval = *retval;
- return NXT_OK;
+ return NJS_OK;
}
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),
};
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;
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);
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,
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
/*
* 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})
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;
}
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);
}
}
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;
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;
{
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;
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);
}
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;
}
}
}
}
- 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) {
}
} 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;
}
if (own) {
- return NXT_DECLINED;
+ return NJS_DECLINED;
}
pq->own = 0;
} while (proto != NULL);
- return NXT_DECLINED;
+ return NJS_DECLINED;
}
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;
}
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];
pq->lhq.value = prop;
- return NXT_OK;
+ return NJS_OK;
}
njs_string_get(&pq->value, &pq->lhq.key);
}
- return NXT_OK;
+ return NJS_OK;
}
- return NXT_DECLINED;
+ return NJS_DECLINED;
}
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;
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;
}
}
vm->stash = (uintptr_t) pq;
- return NXT_OK;
+ return NJS_OK;
}
done:
{
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;
/*
* 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
switch (ret) {
- case NXT_OK:
+ case NJS_OK:
prop = pq.lhq.value;
switch (prop->type) {
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;
}
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;
}
"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,
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;
switch (ret) {
- case NXT_OK:
+ case NJS_OK:
prop = pq.lhq.value;
if (njs_is_data_descriptor(prop)) {
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 {
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;
}
}
switch (prop->type) {
case NJS_PROPERTY:
case NJS_METHOD:
- if (nxt_slow_path(pq.shared)) {
+ if (njs_slow_path(pq.shared)) {
shared = prop;
break;
}
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;
/* 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;
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;
}
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;
}
{
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;
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;
}
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 */
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;
}
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;
}
}
*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 */
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;
}
}
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;
}
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);
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);
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);
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);
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);
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);
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");
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);
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;
}
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;
}
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;
}
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;
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;
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) {
}
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;
}
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_regexp.h>
#include <string.h>
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,
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);
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);
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);
(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) {
* 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;
prev_variables = &prev->scope->variables;
for ( ;; ) {
- var = nxt_lvlhsh_each(prev_variables, &lhe);
+ var = njs_lvlhsh_each(prev_variables, &lhe);
if (var == NULL) {
break;
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;
}
}
}
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) {
/* 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);
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;
"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;
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;
}
}
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;
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. */
}
}
- return NXT_OK;
+ return NJS_OK;
}
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;
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);
}
}
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;
}
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;
}
}
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;
}
break;
}
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+ if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
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;
}
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;
}
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;
}
}
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;
}
{
uint32_t hash;
njs_ret_t ret;
- nxt_str_t name;
+ njs_str_t name;
njs_token_t token;
njs_variable_t *label;
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;
}
}
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;
}
*/
function = njs_function_alloc(vm, lambda, NULL, 1);
- if (nxt_slow_path(function == NULL)) {
+ if (njs_slow_path(function == NULL)) {
return NULL;
}
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;
}
}
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;
}
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;
}
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;
}
* 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;
}
} 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;
}
}
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;
}
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;
}
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;
}
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;
}
}
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;
}
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;
}
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;
}
* 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;
}
}
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;
}
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;
}
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;
}
}
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;
}
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;
}
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;
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;
}
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;
}
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;
}
}
assign = njs_parser_node_new(vm, parser, parent);
- if (nxt_slow_path(assign == NULL)) {
+ if (njs_slow_path(assign == NULL)) {
return NJS_TOKEN_ERROR;
}
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;
}
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;
}
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;
}
}
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;
}
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;
}
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;
}
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;
}
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;
}
}
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;
}
}
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;
}
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;
}
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;
}
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;
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;
}
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;
}
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;
}
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;
}
}
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;
}
}
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;
}
}
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;
}
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;
}
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;
}
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;
}
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;
}
{
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;
}
}
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;
}
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;
}
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;
}
}
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;
}
* 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;
}
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;
}
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;
}
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;
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;
}
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;
}
}
token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+ if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
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;
}
}
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;
}
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;
}
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;
}
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;
}
}
-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;
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);
node->left = njs_parser_chain_top(parser);
njs_parser_chain_top_set(parser, node);
- return NXT_OK;
+ return NJS_OK;
}
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;
}
}
-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;
}
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;
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;
}
}
}
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;
}
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;
}
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;
}
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;
}
}
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;
}
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;
}
}
-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;
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);
}
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;
njs_lexer_t *lexer;
njs_parser_t *parser;
- size = nxt_length("InternalError: ");
+ size = njs_length("InternalError: ");
memcpy(start, "InternalError: ", size);
p = start + size;
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);
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 */
njs_parser_node_t *object;
} u;
- nxt_str_t name;
+ njs_str_t name;
njs_index_t index;
};
-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);
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,
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, ...);
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;
}
}
-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;
}
}
-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);
}
}
-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)
{
}
-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)
{
}
-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;
}
-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
}
-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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
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.
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;
}
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;
}
node = njs_parser_node_new(vm, parser, token);
- if (nxt_slow_path(node == NULL)) {
+ if (njs_slow_path(node == NULL)) {
return NJS_TOKEN_ERROR;
}
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;
}
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;
}
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
}
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;
}
}
node = njs_parser_node_new(vm, parser, token);
- if (nxt_slow_path(node == NULL)) {
+ if (njs_slow_path(node == NULL)) {
return NJS_TOKEN_ERROR;
}
}
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;
}
}
node = njs_parser_node_new(vm, parser, token);
- if (nxt_slow_path(node == NULL)) {
+ if (njs_slow_path(node == NULL)) {
return NJS_TOKEN_ERROR;
}
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;
}
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;
}
}
node = njs_parser_node_new(vm, parser, token);
- if (nxt_slow_path(node == NULL)) {
+ if (njs_slow_path(node == NULL)) {
return NJS_TOKEN_ERROR;
}
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;
}
}
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;
}
}
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;
}
* 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;
}
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;
}
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;
}
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;
}
} 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;
}
}
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;
}
}
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;
}
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;
}
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;
}
}
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;
}
} 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;
}
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;
}
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_regexp.h>
#include <string.h>
static njs_parser_node_t *njs_parser_reference(njs_vm_t *vm,
- njs_parser_t *parser, njs_token_t token, nxt_str_t *name, uint32_t hash,
+ njs_parser_t *parser, njs_token_t token, njs_str_t *name, uint32_t hash,
uint32_t token_line);
-static nxt_int_t njs_parser_builtin(njs_vm_t *vm, njs_parser_t *parser,
- njs_parser_node_t *node, njs_value_type_t type, nxt_str_t *name,
+static njs_int_t njs_parser_builtin(njs_vm_t *vm, njs_parser_t *parser,
+ njs_parser_node_t *node, njs_value_type_t type, njs_str_t *name,
uint32_t hash);
static njs_token_t njs_parser_object(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *obj);
-static nxt_int_t njs_parser_object_property(njs_vm_t *vm, njs_parser_t *parser,
+static njs_int_t njs_parser_object_property(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *parent, njs_parser_node_t *property,
njs_parser_node_t *value);
static njs_token_t njs_parser_array(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *array);
-static nxt_int_t njs_parser_array_item(njs_vm_t *vm, njs_parser_t *parser,
+static njs_int_t njs_parser_array_item(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *array, njs_parser_node_t *value);
-static nxt_int_t njs_parser_template_expression(njs_vm_t *vm,
+static njs_int_t njs_parser_template_expression(njs_vm_t *vm,
njs_parser_t *parser);
-static nxt_int_t njs_parser_template_string(njs_vm_t *vm,
+static njs_int_t njs_parser_template_string(njs_vm_t *vm,
njs_parser_t *parser);
static njs_ret_t njs_parser_escape_string_calc_length(njs_vm_t *vm,
njs_parser_t *parser, size_t *out_size, size_t *out_length);
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
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);
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;
}
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;
}
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);
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;
}
break;
case NJS_TOKEN_NAME:
- nxt_thread_log_debug("JS: %V", name);
+ njs_thread_log_debug("JS: %V", name);
node->token_line = token_line;
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;
}
}
-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 */
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;
}
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;
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;
}
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) {
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;
}
}
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;
}
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;
}
}
property = njs_parser_node_string(vm, parser);
- if (nxt_slow_path(property == NULL)) {
+ if (njs_slow_path(property == NULL)) {
return NJS_TOKEN_ERROR;
}
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;
}
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;
}
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;
}
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;
}
}
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;
}
break;
}
- if (nxt_slow_path(token != NJS_TOKEN_COMMA)) {
+ if (njs_slow_path(token != NJS_TOKEN_COMMA)) {
return NJS_TOKEN_ILLEGAL;
}
}
}
-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)
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;
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;
}
}
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;
}
break;
}
- if (nxt_slow_path(token != NJS_TOKEN_COMMA)) {
+ if (njs_slow_path(token != NJS_TOKEN_COMMA)) {
return NJS_TOKEN_ILLEGAL;
}
}
}
-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;
}
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;
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;
}
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;
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;
}
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;
}
} 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;
}
}
}
-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;
}
}
- 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;
}
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;
}
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;
}
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;
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));
{
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;
}
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;
hex_end = src + hex_length;
- if (nxt_slow_path(hex_end > end)) {
+ if (njs_slow_path(hex_end > end)) {
goto invalid;
}
}
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++;
}
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:
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_stub.h>
-#include <nxt_trace.h>
-#include <nxt_string.h>
-#include <nxt_regex.h>
-#include <nxt_pcre.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_stub.h>
+#include <njs_trace.h>
+#include <njs_str.h>
+#include <njs_regex.h>
+#include <njs_pcre.h>
#include <string.h>
-static void *nxt_pcre_malloc(size_t size);
-static void nxt_pcre_free(void *p);
-static void *nxt_pcre_default_malloc(size_t size, void *memory_data);
-static void nxt_pcre_default_free(void *p, void *memory_data);
+static void *njs_pcre_malloc(size_t size);
+static void njs_pcre_free(void *p);
+static void *njs_pcre_default_malloc(size_t size, void *memory_data);
+static void njs_pcre_default_free(void *p, void *memory_data);
-static nxt_regex_context_t *regex_context;
+static njs_regex_context_t *regex_context;
-nxt_regex_context_t *
-nxt_regex_context_create(nxt_pcre_malloc_t private_malloc,
- nxt_pcre_free_t private_free, void *memory_data)
+njs_regex_context_t *
+njs_regex_context_create(njs_pcre_malloc_t private_malloc,
+ njs_pcre_free_t private_free, void *memory_data)
{
- nxt_regex_context_t *ctx;
+ njs_regex_context_t *ctx;
if (private_malloc == NULL) {
- private_malloc = nxt_pcre_default_malloc;
- private_free = nxt_pcre_default_free;
+ private_malloc = njs_pcre_default_malloc;
+ private_free = njs_pcre_default_free;
}
- ctx = private_malloc(sizeof(nxt_regex_context_t), memory_data);
+ ctx = private_malloc(sizeof(njs_regex_context_t), memory_data);
- if (nxt_fast_path(ctx != NULL)) {
+ if (njs_fast_path(ctx != NULL)) {
ctx->private_malloc = private_malloc;
ctx->private_free = private_free;
ctx->memory_data = memory_data;
}
-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;
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) {
} else {
pattern = ctx->private_malloc(len + 1, ctx->memory_data);
- if (nxt_slow_path(pattern == NULL)) {
+ if (njs_slow_path(pattern == NULL)) {
goto done;
}
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;
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);
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);
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;
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;
}
}
- ret = NXT_OK;
+ ret = NJS_OK;
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;
}
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;
/* 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;
}
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;
/* 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;
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;
}
* Copyright (C) NGINX, Inc.
*/
-#ifndef _NXT_PCRE_H_INCLUDED_
-#define _NXT_PCRE_H_INCLUDED_
+#ifndef _NJS_PCRE_H_INCLUDED_
+#define _NJS_PCRE_H_INCLUDED_
#include <pcre.h>
-#define NXT_REGEX_NOMATCH PCRE_ERROR_NOMATCH
+#define NJS_REGEX_NOMATCH PCRE_ERROR_NOMATCH
-struct nxt_regex_s {
+struct njs_regex_s {
pcre *code;
pcre_extra *extra;
int ncaptures;
};
-struct nxt_regex_match_data_s {
+struct njs_regex_match_data_s {
int ncaptures;
/*
* Each capture is stored in 3 "int" vector elements.
};
-#endif /* _NXT_PCRE_H_INCLUDED_ */
+#endif /* _NJS_PCRE_H_INCLUDED_ */
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_queue.h>
+
+
+/*
+ * Find the middle queue element if the queue has odd number of elements,
+ * or the first element of the queue's second part otherwise.
+ */
+
+njs_queue_link_t *
+njs_queue_middle(njs_queue_t *queue)
+{
+ njs_queue_link_t *middle, *next;
+
+ middle = njs_queue_first(queue);
+
+ if (middle == njs_queue_last(queue)) {
+ return middle;
+ }
+
+ next = middle;
+
+ for ( ;; ) {
+ middle = njs_queue_next(middle);
+
+ next = njs_queue_next(next);
+
+ if (next == njs_queue_last(queue)) {
+ return middle;
+ }
+
+ next = njs_queue_next(next);
+
+ if (next == njs_queue_last(queue)) {
+ return middle;
+ }
+ }
+}
+
+
+/*
+ * njs_queue_sort() provides a stable sort because it uses the insertion
+ * sort algorithm. Its worst and average computational complexity is O^2.
+ */
+
+void
+njs_queue_sort(njs_queue_t *queue,
+ njs_int_t (*compare)(const void *data, const njs_queue_link_t *,
+ const njs_queue_link_t *), const void *data)
+{
+ njs_queue_link_t *link, *prev, *next;
+
+ link = njs_queue_first(queue);
+
+ if (link == njs_queue_last(queue)) {
+ return;
+ }
+
+ for (link = njs_queue_next(link);
+ link != njs_queue_tail(queue);
+ link = next)
+ {
+ prev = njs_queue_prev(link);
+ next = njs_queue_next(link);
+
+ njs_queue_remove(link);
+
+ do {
+ if (compare(data, prev, link) <= 0) {
+ break;
+ }
+
+ prev = njs_queue_prev(prev);
+
+ } while (prev != njs_queue_head(queue));
+
+ njs_queue_insert_after(prev, link);
+ }
+}
* 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); \
/*
* 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); \
} 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); \
} 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); \
} while (0)
-#define nxt_queue_insert_before(target, link) \
+#define njs_queue_insert_before(target, link) \
do { \
(link)->next = (target); \
(link)->prev = (target)->prev; \
} 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; \
#else
-#define nxt_queue_remove(link) \
+#define njs_queue_remove(link) \
do { \
(link)->next->prev = (link)->prev; \
(link)->prev->next = (link)->next; \
* 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; \
/* 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; \
/* 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; \
} 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_ */
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_random.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_random.h>
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h>
-#if (NXT_HAVE_GETRANDOM)
+#if (NJS_HAVE_GETRANDOM)
#include <sys/random.h>
-#elif (NXT_HAVE_LINUX_SYS_GETRANDOM)
+#elif (NJS_HAVE_LINUX_SYS_GETRANDOM)
#include <sys/syscall.h>
#include <linux/random.h>
-#elif (NXT_HAVE_GETENTROPY_SYS_RANDOM)
+#elif (NJS_HAVE_GETENTROPY_SYS_RANDOM)
#include <sys/random.h>
#endif
/*
* The pseudorandom generator based on OpenBSD arc4random. Although
* it is usually stated that arc4random uses RC4 pseudorandom generation
- * algorithm they are actually different in nxt_random_add().
+ * algorithm they are actually different in njs_random_add().
*/
-#define NXT_RANDOM_KEY_SIZE 128
+#define NJS_RANDOM_KEY_SIZE 128
-nxt_inline uint8_t nxt_random_byte(nxt_random_t *r);
+njs_inline uint8_t njs_random_byte(njs_random_t *r);
void
-nxt_random_init(nxt_random_t *r, nxt_pid_t pid)
+njs_random_init(njs_random_t *r, njs_pid_t pid)
{
- nxt_uint_t i;
+ njs_uint_t i;
r->count = 0;
r->pid = pid;
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
#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. */
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. */
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;
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;
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;
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_rbtree.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_rbtree.h>
/*
*/
-static void nxt_rbtree_insert_fixup(nxt_rbtree_node_t *node);
-static void nxt_rbtree_delete_fixup(nxt_rbtree_t *tree,
- nxt_rbtree_node_t *node);
-nxt_inline void nxt_rbtree_left_rotate(nxt_rbtree_node_t *node);
-nxt_inline void nxt_rbtree_right_rotate(nxt_rbtree_node_t *node);
-nxt_inline void nxt_rbtree_parent_relink(nxt_rbtree_node_t *subst,
- nxt_rbtree_node_t *node);
+static void njs_rbtree_insert_fixup(njs_rbtree_node_t *node);
+static void njs_rbtree_delete_fixup(njs_rbtree_t *tree,
+ njs_rbtree_node_t *node);
+njs_inline void njs_rbtree_left_rotate(njs_rbtree_node_t *node);
+njs_inline void njs_rbtree_right_rotate(njs_rbtree_node_t *node);
+njs_inline void njs_rbtree_parent_relink(njs_rbtree_node_t *subst,
+ njs_rbtree_node_t *node);
-#define NXT_RBTREE_BLACK 0
-#define NXT_RBTREE_RED 1
+#define NJS_RBTREE_BLACK 0
+#define NJS_RBTREE_RED 1
-#define nxt_rbtree_comparison_callback(tree) \
- ((nxt_rbtree_compare_t) (tree)->sentinel.right)
+#define njs_rbtree_comparison_callback(tree) \
+ ((njs_rbtree_compare_t) (tree)->sentinel.right)
void
-nxt_rbtree_init(nxt_rbtree_t *tree, nxt_rbtree_compare_t compare)
+njs_rbtree_init(njs_rbtree_t *tree, njs_rbtree_compare_t compare)
{
/*
* The sentinel is used as a leaf node sentinel and as a tree root
* sentinel: it is a parent of a root node and the root node is
* the left child of the sentinel. Combining two sentinels in one
* entry and the fact that the sentinel's left child is a root node
- * simplifies nxt_rbtree_node_successor() and eliminates explicit
- * root node test before or inside nxt_rbtree_min().
+ * simplifies njs_rbtree_node_successor() and eliminates explicit
+ * root node test before or inside njs_rbtree_min().
*/
/* The root is empty. */
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;
}
*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
* 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;
}
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.
*/
} 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);
}
-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);
}
-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);
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;
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;
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.
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
* 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.
*/
}
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;
}
/* 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;
/*
}
-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);
--- /dev/null
+
+/*
+ * 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_ */
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_regexp.h>
#include <njs_regexp_pattern.h>
struct njs_regexp_group_s {
- nxt_str_t name;
+ njs_str_t name;
uint32_t hash;
uint32_t capture;
};
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);
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);
}
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;
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;
}
}
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;
}
}
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;
}
}
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;
}
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;
}
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;
}
}
}
-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)
{
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 {
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;
}
* 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;
}
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;
/* Fall through. */
case '\0':
- dst = nxt_cpymem(dst, "\\u0000", 6);
+ dst = njs_cpymem(dst, "\\u0000", 6);
continue;
}
text->length = dst - text->start;
- return NXT_OK;
+ return NJS_OK;
}
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;
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);
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;
}
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;
goto invalid;
}
- if (nxt_slow_path((flags & flag) != 0)) {
+ if (njs_slow_path((flags & flag) != 0)) {
goto invalid;
}
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;
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;
}
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");
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 {
*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;
}
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++;
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;
}
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;
}
-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;
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;
{
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;
index = njs_string_index(&string, regexp->last_index);
njs_set_number(retval, index);
- return NXT_OK;
+ return NJS_OK;
}
*retval = pattern->global ? njs_value_true : njs_value_false;
njs_release(vm, value);
- return NXT_OK;
+ return NJS_OK;
}
*retval = pattern->ignore_case ? njs_value_true : njs_value_false;
njs_release(vm, value);
- return NXT_OK;
+ return NJS_OK;
}
*retval = pattern->multiline ? njs_value_true : njs_value_false;
njs_release(vm, value);
- return NXT_OK;
+ return NJS_OK;
}
/* 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);
}
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]);
njs_type_error(vm, "\"this\" argument is not a regexp");
- return NXT_ERROR;
+ return NJS_ERROR;
}
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;
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;
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);
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,
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;
}
}
}
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;
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;
}
}
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;
}
}
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;
}
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;
}
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;
}
njs_set_array(&vm->retval, array);
- ret = NXT_OK;
+ ret = NJS_OK;
goto done;
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;
}
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),
};
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),
};
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);
#ifndef _NJS_REGEXP_PATTERN_H_INCLUDED_
#define _NJS_REGEXP_PATTERN_H_INCLUDED_
-#include <nxt_pcre.h>
-#include <nxt_regex.h>
+#include <njs_pcre.h>
+#include <njs_regex.h>
typedef enum {
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
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_sha1.h>
-#include <nxt_string.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_sha1.h>
+#include <njs_str.h>
#include <string.h>
-static const u_char *nxt_sha1_body(nxt_sha1_t *ctx, const u_char *data,
+static const u_char *njs_sha1_body(njs_sha1_t *ctx, const u_char *data,
size_t size);
void
-nxt_sha1_init(nxt_sha1_t *ctx)
+njs_sha1_init(njs_sha1_t *ctx)
{
ctx->a = 0x67452301;
ctx->b = 0xefcdab89;
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;
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;
}
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;
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);
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);
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));
}
*/
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;
--- /dev/null
+
+/*
+ * 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_ */
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_sha2.h>
-#include <nxt_string.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_sha2.h>
+#include <njs_str.h>
#include <string.h>
-static const u_char *nxt_sha2_body(nxt_sha2_t *ctx, const u_char *data,
+static const u_char *njs_sha2_body(njs_sha2_t *ctx, const u_char *data,
size_t size);
void
-nxt_sha2_init(nxt_sha2_t *ctx)
+njs_sha2_init(njs_sha2_t *ctx)
{
ctx->a = 0x6a09e667;
ctx->b = 0xbb67ae85;
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;
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;
}
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;
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);
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);
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));
}
*/
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;
--- /dev/null
+
+/*
+ * 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_ */
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_builtin.h>
#include <time.h>
#include <errno.h>
#include <locale.h>
#include <stdio.h>
-#if (NXT_HAVE_EDITLINE)
+#if (NJS_HAVE_EDITLINE)
#include <editline/readline.h>
-#elif (NXT_HAVE_EDIT_READLINE)
+#elif (NJS_HAVE_EDIT_READLINE)
#include <edit/readline/readline.h>
#else
#include <readline/readline.h>
-#if (NXT_HAVE_GNU_READLINE)
+#if (NJS_HAVE_GNU_READLINE)
#include <readline/history.h>
#endif
#endif
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,
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;
} 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,
njs_ext_console_log,
0 },
- { nxt_string("dump"),
+ { njs_str("dump"),
NJS_EXTERN_METHOD,
NULL,
0,
njs_ext_console_dump,
0 },
- { nxt_string("help"),
+ { njs_str("help"),
NJS_EXTERN_METHOD,
NULL,
0,
njs_ext_console_help,
0 },
- { nxt_string("time"),
+ { njs_str("time"),
NJS_EXTERN_METHOD,
NULL,
0,
njs_ext_console_time,
0 },
- { nxt_string("timeEnd"),
+ { njs_str("timeEnd"),
NJS_EXTERN_METHOD,
NULL,
0,
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,
};
-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,
{
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;
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);
}
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"
" -v print njs version and exit.\n"
" <filename> | - run code from a file or stdin.\n";
- ret = NXT_DONE;
+ ret = NJS_DONE;
for (i = 1; i < argc; i++) {
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':
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;
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;
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;
opts->module = 1;
} else if (strcmp(argv[i], "script") != 0) {
- nxt_error("option \"-t\" unexpected source type: %s\n",
- argv[i]);
- return NXT_ERROR;
+ njs_stderror("option \"-t\" unexpected source type: %s\n",
+ argv[i]);
+ return NJS_ERROR;
}
break;
}
- nxt_error("option \"-t\" requires source type\n");
- return NXT_ERROR;
+ njs_stderror("option \"-t\" requires source type\n");
+ return NJS_ERROR;
case 'v':
case 'V':
opts->version = 1;
break;
default:
- nxt_error("Unknown argument: \"%s\" "
- "try \"%s -h\" for available options\n", argv[i],
- argv[0]);
- return NXT_ERROR;
+ njs_stderror("Unknown argument: \"%s\" "
+ "try \"%s -h\" for available options\n", argv[i],
+ argv[0]);
+ return NJS_ERROR;
}
}
- return NXT_OK;
+ return NJS_OK;
}
-static nxt_int_t
+static njs_int_t
njs_console_init(njs_vm_t *vm, njs_console_t *console)
{
console->vm = vm;
- nxt_lvlhsh_init(&console->events);
- nxt_queue_init(&console->posted_events);
+ njs_lvlhsh_init(&console->events);
+ njs_queue_init(&console->posted_events);
console->time = UINT64_MAX;
console->completion.completions = njs_vm_completions(vm, NULL);
if (console->completion.completions == NULL) {
- return NXT_ERROR;
+ return NJS_ERROR;
}
- return NXT_OK;
+ return NJS_OK;
}
-static nxt_int_t
+static njs_int_t
njs_externals_init(njs_vm_t *vm, njs_console_t *console)
{
- nxt_uint_t ret;
+ njs_uint_t ret;
njs_value_t *value;
const njs_extern_t *proto;
- static const nxt_str_t name = nxt_string("console");
+ static const njs_str_t name = njs_str("console");
proto = njs_vm_external_prototype(vm, &njs_externals[0]);
if (proto == NULL) {
- nxt_error("failed to add console proto\n");
- return NXT_ERROR;
+ njs_stderror("failed to add console proto\n");
+ return NJS_ERROR;
}
- value = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_opaque_value_t));
+ value = njs_mp_zalloc(vm->mem_pool, sizeof(njs_opaque_value_t));
if (value == NULL) {
- return NXT_ERROR;
+ return NJS_ERROR;
}
ret = njs_vm_external_create(vm, value, proto, console);
- if (ret != NXT_OK) {
- return NXT_ERROR;
+ if (ret != NJS_OK) {
+ return NJS_ERROR;
}
ret = njs_vm_external_bind(vm, &name, value);
- if (ret != NXT_OK) {
- return NXT_ERROR;
+ if (ret != NJS_OK) {
+ return NJS_ERROR;
}
ret = njs_console_init(vm, console);
- if (ret != NXT_OK) {
- return NXT_ERROR;
+ if (ret != NJS_OK) {
+ return NJS_ERROR;
}
- return NXT_OK;
+ return NJS_OK;
}
-static nxt_int_t
+static njs_int_t
njs_interactive_shell(njs_opts_t *opts, njs_vm_opt_t *vm_options)
{
njs_vm_t *vm;
- nxt_str_t line;
+ njs_str_t line;
- if (njs_editline_init() != NXT_OK) {
- nxt_error("failed to init completions\n");
- return NXT_ERROR;
+ if (njs_editline_init() != NJS_OK) {
+ njs_stderror("failed to init completions\n");
+ return NJS_ERROR;
}
vm = njs_create_vm(opts, vm_options);
if (vm == NULL) {
- return NXT_ERROR;
+ return NJS_ERROR;
}
if (!opts->quiet) {
- nxt_printf("interactive njs %s\n\n", NJS_VERSION);
+ njs_printf("interactive njs %s\n\n", NJS_VERSION);
- nxt_printf("v.<Tab> -> the properties and prototype methods of v.\n");
- nxt_printf("type console.help() for more information\n\n");
+ njs_printf("v.<Tab> -> the properties and prototype methods of v.\n");
+ njs_printf("type console.help() for more information\n\n");
}
for ( ;; ) {
break;
}
- line.length = nxt_strlen(line.start);
+ line.length = njs_strlen(line.start);
if (line.length == 0) {
continue;
}
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;
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;
} 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;
}
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;
}
}
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;
}
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;
}
vm = njs_create_vm(opts, vm_options);
if (vm == NULL) {
- ret = NXT_ERROR;
+ ret = NJS_ERROR;
goto done;
}
/* 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);
}
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:
{
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;
}
}
}
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;
}
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);
}
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;
}
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;
}
}
-static nxt_int_t
+static njs_int_t
njs_editline_init(void)
{
rl_completion_append_character = '\0';
setlocale(LC_ALL, "");
- return NXT_OK;
+ return NJS_OK;
}
/* 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; \
{
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;
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:
}
for ( ;; ) {
- var = nxt_lvlhsh_each(&vm->parser->scope->variables,
+ var = njs_lvlhsh_each(&vm->parser->scope->variables,
&cmpl->lhe);
if (var == NULL) {
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);
}
}
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;
}
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;
}
continue;
}
- if (nxt_strncmp(text, suffix->start, cmpl->length) == 0) {
+ if (njs_strncmp(text, suffix->start, cmpl->length) == 0) {
return njs_editline(suffix);
}
}
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;
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;
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;
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;
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;
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;
}
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;
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");
}
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;
{
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;
}
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;
}
{
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;
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);
}
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_stub.h>
-#include <nxt_string.h>
-#include <nxt_sprintf.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_stub.h>
+#include <njs_str.h>
+#include <njs_sprintf.h>
#include <math.h>
#include <float.h>
/*
* Supported formats:
*
- * %[0][width][x][X]O nxt_off_t
- * %[0][width]T nxt_time_t
+ * %[0][width][x][X]O njs_off_t
+ * %[0][width]T njs_time_t
* %[0][width][u][x|X]z ssize_t/size_t
* %[0][width][u][x|X]d int/u_int
* %[0][width][u][x|X]l long
- * %[0][width|m][u][x|X]i nxt_int_t/nxt_uint_t
+ * %[0][width|m][u][x|X]i njs_int_t/njs_uint_t
* %[0][width][u][x|X]D int32_t/uint32_t
* %[0][width][u][x|X]L int64_t/uint64_t
* %[0][width][.width]f double, max valid number fits to %18.15f
* %*s length and string
*
* %p void *
- * %b nxt_bool_t
- * %V nxt_str_t *
+ * %b njs_bool_t
+ * %V njs_str_t *
* %Z '\0'
* %n '\n'
* %c char
u_char *
-nxt_sprintf(u_char *buf, u_char *end, const char *fmt, ...)
+njs_sprintf(u_char *buf, u_char *end, const char *fmt, ...)
{
u_char *p;
va_list args;
va_start(args, fmt);
- p = nxt_vsprintf(buf, end, fmt, args);
+ p = njs_vsprintf(buf, end, fmt, args);
va_end(args);
return p;
/*
- * 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 {
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;
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";
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;
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++;
}
fmt++;
p = va_arg(args, u_char *);
- if (nxt_fast_path(p != NULL)) {
+ if (njs_fast_path(p != NULL)) {
goto copy;
}
}
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;
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;
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;
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;
}
}
}
- buf = nxt_number(&spf, buf, i);
+ buf = njs_number(&spf, buf, i);
if (spf.frac_width > 0) {
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';
sign = 0;
spf.hex = HEXADECIMAL;
/*
- * spf.width = NXT_PTR_SIZE * 2;
+ * spf.width = NJS_PTR_SIZE * 2;
* spf.padding = '0';
*/
goto number;
}
}
- 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;
}
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;
ui64 /= 1000000000;
}
-#else /* NXT_64BIT */
+#else /* NJS_64BIT */
do {
*(--p) = (u_char) (ui64 % 10 + '0');
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;
/* 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++;
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;
/* 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++;
}
-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;
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#ifndef _NXT_STRING_H_INCLUDED_
-#define _NXT_STRING_H_INCLUDED_
+#ifndef _NJS_STR_H_INCLUDED_
+#define _NJS_STR_H_INCLUDED_
typedef struct {
size_t length;
u_char *start;
-} nxt_str_t;
+} njs_str_t;
/*
* C99 allows to assign struct as compound literal with struct name cast only.
* SunC however issues error on the cast in struct static initialization:
* non-constant initializer: op "NAME"
- * So a separate nxt_string_value() macro is intended to use in assignment.
+ * So a separate njs_str_value() macro is intended to use in assignment.
*/
-#define nxt_length(s) (sizeof(s) - 1)
-#define nxt_string(s) { nxt_length(s), (u_char *) s }
-#define nxt_null_string { 0, NULL }
-#define nxt_string_value(s) (nxt_str_t) nxt_string(s)
+#define njs_length(s) (sizeof(s) - 1)
+#define njs_str(s) { njs_length(s), (u_char *) s }
+#define njs_null_str { 0, NULL }
+#define njs_str_value(s) (njs_str_t) njs_str(s)
-nxt_inline u_char
-nxt_lower_case(u_char c)
+njs_inline u_char
+njs_lower_case(u_char c)
{
return (u_char) ((c >= 'A' && c <= 'Z') ? c | 0x20 : c);
}
-nxt_inline u_char
-nxt_upper_case(u_char c)
+njs_inline u_char
+njs_upper_case(u_char c)
{
return (u_char) ((c >= 'a' && c <= 'z') ? c & 0xDF : c);
}
-nxt_inline nxt_bool_t
-nxt_is_whitespace(u_char c)
+njs_inline njs_bool_t
+njs_is_whitespace(u_char c)
{
switch (c) {
case 0x09: /* <TAB> */
}
-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) {
#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;
#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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_regexp.h>
#include <njs_regexp_pattern.h>
#include <string.h>
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,
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,
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);
while (size != 0) {
/* The maximum size is just 14 bytes. */
- nxt_pragma_loop_disable_vectorization;
+ njs_pragma_loop_disable_vectorization;
*dst++ = *src++;
size--;
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;
string->retain = 1;
}
- return NXT_OK;
+ return NJS_OK;
}
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;
}
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;
}
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);
while (size != 0) {
/* The maximum size is just 14 bytes. */
- nxt_pragma_loop_disable_vectorization;
+ njs_pragma_loop_disable_vectorization;
*dst++ = *src++;
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";
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+/";
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-_";
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;
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;
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;
}
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;
}
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;
}
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);
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;
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);
vm->retval = *value;
}
- return NXT_OK;
+ return NJS_OK;
}
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),
};
*/
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;
}
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;
}
-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;
start2 = v2->long_string.data->start;
}
- size = nxt_min(size1, size2);
+ size = njs_min(size1, size2);
ret = memcmp(start1, start2, size);
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;
} 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_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;
}
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;
}
(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;
}
*/
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;
}
}
if (nargs == 1) {
njs_string_copy(&vm->retval, &args[0]);
- return NXT_OK;
+ return NJS_OK;
}
size = 0;
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;
p += string.size;
}
- return NXT_OK;
+ return NJS_OK;
}
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;
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,
vm->retval = njs_value_null;
- return NXT_OK;
+ return NJS_OK;
}
*/
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;
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;
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);
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;
}
*/
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;
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. */
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;
memcpy(p, string.start + slice.start, slice.length);
}
- return NXT_OK;
+ return NJS_OK;
}
- return NXT_ERROR;
+ return NJS_ERROR;
}
*/
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;
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;
*/
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;
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;
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]);
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;
n = length;
while (n != 0 && p < end) {
- p = nxt_utf8_next(p, end);
+ p = njs_utf8_next(p, end);
n--;
}
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;
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;
}
/* 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;
njs_set_number(&vm->retval, num);
- return NXT_OK;
+ return NJS_OK;
}
*/
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;
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;
}
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;
}
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;
}
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;
}
}
}
- 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);
}
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,
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,
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;
}
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;
}
*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;
}
}
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;
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;
}
}
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;
}
index++;
- p = nxt_utf8_next(p, end);
+ p = njs_utf8_next(p, end);
}
}
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;
}
if (search_length == 0) {
- index = nxt_min(index, length);
+ index = njs_min(index, length);
goto done;
}
while (p > end) {
index--;
- p = nxt_utf8_prev(p);
+ p = njs_utf8_prev(p);
}
for ( ;; ) {
break;
}
- p = nxt_utf8_prev(p);
+ p = njs_utf8_prev(p);
}
}
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;
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);
}
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);
}
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;
vm->retval = *retval;
- return NXT_OK;
+ return NJS_OK;
}
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);
}
for (skip = index % NJS_STRING_MAP_STRIDE; skip != 0; skip--) {
- start = nxt_utf8_next(start, end);
+ start = njs_utf8_next(start, end);
}
return start;
while (p < start) {
index++;
- p = nxt_utf8_next(p, end);
+ p = njs_utf8_next(p, end);
}
return index;
{
size_t offset;
uint32_t *map;
- nxt_uint_t n;
+ njs_uint_t n;
const u_char *p, *end;
end = start + 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--;
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;
/* 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--;
}
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;
}
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;
/* 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--;
}
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);
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);
}
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;
goto empty;
}
- if (nxt_is_whitespace(*start)) {
+ if (njs_is_whitespace(*start)) {
start++;
trim++;
continue;
end--;
- if (nxt_is_whitespace(*end)) {
+ if (njs_is_whitespace(*end)) {
trim++;
continue;
}
}
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;
}
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;
}
/* GC: retain. */
vm->retval = *value;
- return NXT_OK;
+ return NJS_OK;
}
length = (string.length != 0) ? string.length - trim : 0;
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;
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;
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);
}
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;
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;
}
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;
}
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) {
*/
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;
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;
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;
}
}
}
njs_set_number(&vm->retval, index);
- return NXT_OK;
+ return NJS_OK;
}
*/
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;
}
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;
}
}
}
- 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;
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;
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;
}
njs_set_array(&vm->retval, array);
}
- return NXT_OK;
+ return NJS_OK;
}
*/
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;
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) {
/* 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;
}
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;
}
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;
}
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;
}
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;
}
njs_set_array(&vm->retval, array);
- return NXT_OK;
+ return NJS_OK;
}
*/
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;
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;
}
/* 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;
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;
}
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);
njs_string_copy(&vm->retval, &args[0]);
- return NXT_OK;
+ return NJS_OK;
}
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;
}
}
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;
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;
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;
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;
}
}
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;
}
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);
}
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);
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;
}
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;
}
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);
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;
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;
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;
}
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];
/* 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];
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;
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;
r->part = part;
- return NXT_OK;
+ return NJS_OK;
}
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;
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;
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;
/* 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;
}
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;
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;
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),
};
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),
};
*/
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[] = {
vm->retval = njs_string_undefined;
- return NXT_OK;
+ return NJS_OK;
}
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 */
vm->retval = njs_string_undefined;
- return NXT_OK;
+ return NJS_OK;
}
{
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);
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;
} while (size != 0);
- return NXT_OK;
+ return NJS_OK;
}
*/
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[] = {
vm->retval = njs_string_undefined;
- return NXT_OK;
+ return NJS_OK;
}
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 */
vm->retval = njs_string_undefined;
- return NXT_OK;
+ return NJS_OK;
}
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,
-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);
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;
} while (size != 0);
if (utf8) {
- length = nxt_utf8_length(start, n);
+ length = njs_utf8_length(start, n);
if (length < 0) {
length = 0;
}
}
- 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;
}
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,
*/
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;
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 {
}
}
- 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;
}
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;
}
}
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),
};
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),
};
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),
};
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),
};
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),
};
#ifndef _NJS_STRING_H_INCLUDED_
#define _NJS_STRING_H_INCLUDED_
-#include <nxt_utf8.h>
+#include <njs_utf8.h>
/*
* nJSVM supports two string variants:
*/
#define NJS_STRING_MAP_STRIDE 32
-#define njs_string_map_offset(size) nxt_align_size((size), sizeof(uint32_t))
+#define njs_string_map_offset(size) njs_align_size((size), sizeof(uint32_t))
#define njs_string_map_start(p) \
- ((uint32_t *) nxt_align_ptr((p), sizeof(uint32_t)))
+ ((uint32_t *) njs_align_ptr((p), sizeof(uint32_t)))
#define njs_string_map_size(length) \
(((length - 1) / NJS_STRING_MAP_STRIDE) * sizeof(uint32_t))
} 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;
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;
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,
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;
* that can be found in the LICENSE file.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_diyfp.h>
-#include <nxt_strtod.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_diyfp.h>
+#include <njs_strtod.h>
/*
* Max double: 1.7976931348623157 x 10^308
* will be read as non-zero (equal to the min non-zero double).
*/
-#define NXT_DECIMAL_POWER_MAX 309
-#define NXT_DECIMAL_POWER_MIN (-324)
+#define NJS_DECIMAL_POWER_MAX 309
+#define NJS_DECIMAL_POWER_MIN (-324)
-#define NXT_UINT64_MAX nxt_uint64(0xFFFFFFFF, 0xFFFFFFFF)
-#define NXT_UINT64_DECIMAL_DIGITS_MAX 19
+#define NJS_UINT64_MAX njs_uint64(0xFFFFFFFF, 0xFFFFFFFF)
+#define NJS_UINT64_DECIMAL_DIGITS_MAX 19
/*
* 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;
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;
}
/*
- * 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. */
*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);
}
}
* 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;
* 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;
/*
* 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;
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];
/* Values less than '0' become >= 208. */
c = *p - '0';
- if (nxt_slow_path(c > 9)) {
+ if (njs_slow_path(c > 9)) {
break;
}
/* Values less than '0' become >= 208. */
c = *p - '0';
- if (nxt_slow_path(c > 9)) {
+ if (njs_slow_path(c > 9)) {
break;
}
/* 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;
}
exponent += insignf;
- return nxt_strtod_internal(data, pos - data, exponent);
+ return njs_strtod_internal(data, pos - data, exponent);
}
--- /dev/null
+
+/*
+ * 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_ */
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_STUB_H_INCLUDED_
+#define _NJS_STUB_H_INCLUDED_
+
+
+#define njs_max(val1, val2) \
+ ((val1 < val2) ? (val2) : (val1))
+
+#define njs_min(val1, val2) \
+ ((val1 < val2) ? (val1) : (val2))
+
+
+#define NJS_OK 0
+#define NJS_ERROR (-1)
+#define NJS_AGAIN (-2)
+#define NJS_DECLINED (-3)
+#define NJS_DONE (-4)
+
+
+typedef struct {
+ void *(*alloc)(void *mem, size_t size);
+ void *(*zalloc)(void *mem, size_t size);
+ void *(*align)(void *mem, size_t alignment, size_t size);
+ void *(*zalign)(void *mem, size_t alignment, size_t size);
+ void (*free)(void *mem, void *p);
+ void (*alert)(void *trace, const char *fmt, ...);
+ void njs_cdecl (*trace)(void *trace, const char *fmt, ...);
+} njs_mem_proto_t;
+
+
+#define njs_thread_log_alert(...)
+#define njs_thread_log_error(...)
+#define njs_log_error(...)
+#define njs_thread_log_debug(...)
+
+#include <unistd.h>
+#define njs_pagesize() getpagesize()
+
+
+#endif /* _NJS_STUB_H_INCLUDED_ */
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_time.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_time.h>
#include <time.h>
#include <sys/time.h>
uint64_t
-nxt_time(void)
+njs_time(void)
{
-#if (NXT_HAVE_CLOCK_MONOTONIC)
+#if (NJS_HAVE_CLOCK_MONOTONIC)
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
--- /dev/null
+
+/*
+ * 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
-#include <njs_time.h>
+#include <njs_main.h>
+#include <njs_timer.h>
#include <string.h>
static njs_ret_t
-njs_set_timer(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
- njs_index_t unused, nxt_bool_t immediate)
+njs_set_timer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+ njs_index_t unused, njs_bool_t immediate)
{
- nxt_uint_t n;
+ njs_uint_t n;
uint64_t delay;
njs_event_t *event;
njs_vm_ops_t *ops;
- if (nxt_slow_path(nargs < 2)) {
+ if (njs_slow_path(nargs < 2)) {
njs_type_error(vm, "too few arguments");
return NJS_ERROR;
}
- if (nxt_slow_path(!njs_is_function(&args[1]))) {
+ if (njs_slow_path(!njs_is_function(&args[1]))) {
njs_type_error(vm, "first arg must be a function");
return NJS_ERROR;
}
ops = vm->options.ops;
- if (nxt_slow_path(ops == NULL)) {
+ if (njs_slow_path(ops == NULL)) {
njs_internal_error(vm, "not supported by host environment");
return NJS_ERROR;
}
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;
}
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;
}
}
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;
}
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);
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);
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);
}
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,
};
* 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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_malloc.h>
-#include <nxt_sprintf.h>
-#include <nxt_trace.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_malloc.h>
+#include <njs_sprintf.h>
+#include <njs_trace.h>
static u_char *
-nxt_last_handler(nxt_trace_t *trace, nxt_trace_data_t *td, u_char *start)
+njs_last_handler(njs_trace_t *trace, njs_trace_data_t *td, u_char *start)
{
u_char *p;
ssize_t size;
size = td->end - start;
- p = nxt_vsprintf(start, start + size, td->fmt, td->args);
+ p = njs_vsprintf(start, start + size, td->fmt, td->args);
if (p - start < size) {
start = p;
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;
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) {
* 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 {
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_ */
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NJS_TYPES_H_INCLUDED_
+#define _NJS_TYPES_H_INCLUDED_
+
+
+/*
+ * off_t is 32 bit on Linux, Solaris and HP-UX by default.
+ * Must be before <sys/types.h>.
+ */
+#define _FILE_OFFSET_BITS 64
+
+/* u_char, u_int, int8_t, int32_t, int64_t, size_t, off_t. */
+#include <sys/types.h>
+#include <inttypes.h>
+
+
+#if (__LP64__)
+#define NJS_64BIT 1
+#define NJS_PTR_SIZE 8
+#else
+#define NJS_64BIT 0
+#define NJS_PTR_SIZE 4
+#endif
+
+
+/*
+ * njs_int_t corresponds to the most efficient integer type, an architecture
+ * word. It is usually the long type, however on Win64 the long is int32_t,
+ * so pointer size suits better. njs_int_t must be no less than int32_t.
+ */
+
+#if (__amd64__)
+/*
+ * AMD64 64-bit multiplication and division operations are slower and 64-bit
+ * instructions are longer.
+ */
+#define NJS_INT_T_SIZE 4
+typedef int njs_int_t;
+typedef u_int njs_uint_t;
+
+#else
+#define NJS_INT_T_SIZE NJS_PTR_SIZE
+typedef intptr_t njs_int_t;
+typedef uintptr_t njs_uint_t;
+#endif
+
+
+#if (NJS_HAVE_UNSIGNED_INT128)
+typedef unsigned __int128 njs_uint128_t;
+#endif
+
+
+#if (NJS_INT_T_SIZE == 8)
+#define NJS_INT_T_LEN NJS_INT64_T_LEN
+#define NJS_INT_T_HEXLEN NJS_INT64_T_HEXLEN
+#define NJS_INT_T_MAX NJS_INT64_T_MAX
+
+#else
+#define NJS_INT_T_LEN NJS_INT32_T_LEN
+#define NJS_INT_T_HEXLEN NJS_INT32_T_HEXLEN
+#define NJS_INT_T_MAX NJS_INT32_T_MAX
+#endif
+
+
+typedef njs_uint_t njs_bool_t;
+typedef int njs_err_t;
+
+
+/*
+ * njs_off_t corresponds to OS's off_t, a file offset type. Although Linux,
+ * Solaris, and HP-UX define both off_t and off64_t, setting _FILE_OFFSET_BITS
+ * to 64 defines off_t as off64_t.
+ */
+#if (NJS_WINDOWS)
+/* Windows defines off_t as a 32-bit "long". */
+typedef __int64 njs_off_t;
+
+#else
+typedef off_t njs_off_t;
+#endif
+
+
+/*
+ * njs_time_t corresponds to OS's time_t, time in seconds. njs_time_t is
+ * a signed integer. OS's time_t may be an integer or real-floating type,
+ * though it is usually a signed 32-bit or 64-bit integer depending on
+ * platform bits length. There are however exceptions, e.g., time_t is:
+ * 32-bit on 64-bit NetBSD prior to 6.0 version;
+ * 64-bit on 32-bit NetBSD 6.0;
+ * 32-bit on 64-bit OpenBSD;
+ * 64-bit in Linux x32 ABI;
+ * 64-bit in 32-bit Visual Studio C++ 2005.
+ *
+ * Besides, QNX defines time_t as uint32_t.
+ */
+#if (NJS_QNX)
+/* Y2038 fix: "typedef int64_t njs_time_t". */
+typedef int32_t njs_time_t;
+
+#else
+/* Y2038, if time_t is 32-bit integer. */
+typedef time_t njs_time_t;
+#endif
+
+
+typedef pid_t njs_pid_t;
+
+
+#define NJS_INT32_T_LEN njs_length("-2147483648")
+#define NJS_INT64_T_LEN njs_length("-9223372036854775808")
+
+#define NJS_DOUBLE_LEN (1 + DBL_MAX_10_EXP)
+
+#define NJS_MAX_ERROR_STR 2048
+
+
+#endif /* _NJS_TYPES_H_INCLUDED_ */
* 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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
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,
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,
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,
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,
NULL,
NULL,
NULL,
- nxt_unicode_lower_case_block_1fe,
+ njs_unicode_lower_case_block_1fe,
NULL,
NULL,
NULL,
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,
NULL,
NULL,
NULL,
- nxt_unicode_lower_case_block_219,
+ njs_unicode_lower_case_block_219,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
- nxt_unicode_lower_case_block_231,
+ njs_unicode_lower_case_block_231,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
- nxt_unicode_lower_case_block_2dc,
+ njs_unicode_lower_case_block_2dc,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
- nxt_unicode_lower_case_block_3d2,
+ njs_unicode_lower_case_block_3d2,
};
($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);
}
-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";
* 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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
};
-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,
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,
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,
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,
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,
NULL,
NULL,
NULL,
- nxt_unicode_upper_case_block_1fe,
+ njs_unicode_upper_case_block_1fe,
NULL,
NULL,
NULL,
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,
NULL,
NULL,
NULL,
- nxt_unicode_upper_case_block_219,
+ njs_unicode_upper_case_block_219,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
- nxt_unicode_upper_case_block_231,
+ njs_unicode_upper_case_block_231,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
- nxt_unicode_upper_case_block_2dc,
+ njs_unicode_upper_case_block_2dc,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
- nxt_unicode_upper_case_block_3d2,
+ njs_unicode_upper_case_block_3d2,
};
($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);
}
-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";
*/
-#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
/*
#undef _FORTIFY_SOURCE
#endif
-#endif /* NXT_LINUX */
+#endif /* NJS_LINUX */
-#endif /* _NXT_UNIX_H_INCLUDED_ */
+#endif /* _NJS_UNIX_H_INCLUDED_ */
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_utf8.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_utf8.h>
/*
- * The nxt_unicode_lower_case.h and nxt_unicode_upper_case.h files are
+ * The njs_unicode_lower_case.h and njs_unicode_upper_case.h files are
* files auto-generated from the UnicodeData.txt file version 12.1.0 (May 2019)
* provided by Unicode, Inc.:
*
- * ./nxt_unicode_lower_case.pl UnicodeData.txt
- * ./nxt_unicode_upper_case.pl UnicodeData.txt
+ * ./njs_unicode_lower_case.pl UnicodeData.txt
+ * ./njs_unicode_upper_case.pl UnicodeData.txt
*
* Only common and simple case foldings are supported. Full case foldings
* are not supported. Combined characters are also not supported.
*/
-#include <nxt_unicode_lower_case.h>
-#include <nxt_unicode_upper_case.h>
+#include <njs_unicode_lower_case.h>
+#include <njs_unicode_upper_case.h>
u_char *
-nxt_utf8_encode(u_char *p, uint32_t u)
+njs_utf8_encode(u_char *p, uint32_t u)
{
if (u < 0x80) {
*p++ = (u_char) (u & 0xFF);
/*
- * 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;
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;
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.
p++;
- if (nxt_fast_path(p + n <= end)) {
+ if (njs_fast_path(p + n <= end)) {
do {
c = *p++;
*/
c = c - 0x80;
- if (nxt_slow_path(c > 0x3F)) {
+ if (njs_slow_path(c > 0x3F)) {
return 0xFFFFFFFF;
}
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;
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;
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.
*/
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;
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;
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;
}
}
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];
}
}
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];
}
}
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;
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;
}
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;
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++;
}
}
-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;
}
}
* Copyright (C) NGINX, Inc.
*/
-#ifndef _NXT_UTF8_H_INCLUDED_
-#define _NXT_UTF8_H_INCLUDED_
+#ifndef _NJS_UTF8_H_INCLUDED_
+#define _NJS_UTF8_H_INCLUDED_
/*
* difference between Unicode characters is lesser 0x0010FFFF and
* 0x0EEE0EEE can be used as value to indicate UTF-8 encoding error.
*/
-#define NXT_UTF8_SORT_INVALID 0x0EEE0EEE
+#define NJS_UTF8_SORT_INVALID 0x0EEE0EEE
-#define NXT_UTF8_REPLACEMENT 0xFFFD
+#define NJS_UTF8_REPLACEMENT 0xFFFD
-NXT_EXPORT u_char *nxt_utf8_encode(u_char *p, uint32_t u);
-NXT_EXPORT uint32_t nxt_utf8_decode(const u_char **start, const u_char *end);
-NXT_EXPORT uint32_t nxt_utf8_decode2(const u_char **start, const u_char *end);
-NXT_EXPORT uint32_t nxt_utf8_safe_decode(const u_char **start,
+NJS_EXPORT u_char *njs_utf8_encode(u_char *p, uint32_t u);
+NJS_EXPORT uint32_t njs_utf8_decode(const u_char **start, const u_char *end);
+NJS_EXPORT uint32_t njs_utf8_decode2(const u_char **start, const u_char *end);
+NJS_EXPORT uint32_t njs_utf8_safe_decode(const u_char **start,
const u_char *end);
-NXT_EXPORT uint32_t nxt_utf8_safe_decode2(const u_char **start,
+NJS_EXPORT uint32_t njs_utf8_safe_decode2(const u_char **start,
const u_char *end);
-NXT_EXPORT nxt_int_t nxt_utf8_casecmp(const u_char *start1,
+NJS_EXPORT njs_int_t njs_utf8_casecmp(const u_char *start1,
const u_char *start2, size_t len1, size_t len2);
-NXT_EXPORT uint32_t nxt_utf8_lower_case(const u_char **start,
+NJS_EXPORT uint32_t njs_utf8_lower_case(const u_char **start,
const u_char *end);
-NXT_EXPORT uint32_t nxt_utf8_upper_case(const u_char **start,
+NJS_EXPORT uint32_t njs_utf8_upper_case(const u_char **start,
const u_char *end);
-NXT_EXPORT ssize_t nxt_utf8_length(const u_char *p, size_t len);
-NXT_EXPORT ssize_t nxt_utf8_safe_length(const u_char *p, size_t len,
+NJS_EXPORT ssize_t njs_utf8_length(const u_char *p, size_t len);
+NJS_EXPORT ssize_t njs_utf8_safe_length(const u_char *p, size_t len,
ssize_t *out_size);
-NXT_EXPORT nxt_bool_t nxt_utf8_is_valid(const u_char *p, size_t len);
+NJS_EXPORT njs_bool_t njs_utf8_is_valid(const u_char *p, size_t len);
/*
- * nxt_utf8_next() and nxt_utf8_prev() expect a valid UTF-8 string.
+ * njs_utf8_next() and njs_utf8_prev() expect a valid UTF-8 string.
*
* The leading UTF-8 byte is either 0xxxxxxx or 11xxxxxx.
* The continuation UTF-8 bytes are 10xxxxxx.
*/
-nxt_inline const u_char *
-nxt_utf8_next(const u_char *p, const u_char *end)
+njs_inline const u_char *
+njs_utf8_next(const u_char *p, const u_char *end)
{
u_char c;
}
-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;
}
-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;
}
-#define nxt_utf8_size(u) \
+#define njs_utf8_size(u) \
((u < 0x80) ? 1 : ((u < 0x0800) ? 2 : ((u < 0x10000) ? 3 : 4)))
-#define nxt_utf8_size_uint16(u) \
+#define njs_utf8_size_uint16(u) \
((u < 0x80) ? 1 : ((u < 0x0800) ? 2 : 3))
-nxt_inline nxt_bool_t
-nxt_utf8_is_whitespace(uint32_t c)
+njs_inline njs_bool_t
+njs_utf8_is_whitespace(uint32_t c)
{
switch (c) {
case 0x0009: /* <TAB> */
}
-#endif /* _NXT_UTF8_H_INCLUDED_ */
+#endif /* _NJS_UTF8_H_INCLUDED_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
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) {
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) {
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
}
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++;
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;
}
continue;
}
- /* NXT_ERROR */
+ /* NJS_ERROR */
return ret;
}
*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;
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;
}
-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)
}
-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);
#define _NJS_VALUE_H_INCLUDED_
-#include <nxt_trace.h>
-#include <nxt_queue.h>
-#include <nxt_regex.h>
-#include <nxt_random.h>
-#include <nxt_djb_hash.h>
-#include <nxt_mp.h>
+#include <njs_trace.h>
+#include <njs_queue.h>
+#include <njs_regex.h>
+#include <njs_random.h>
+#include <njs_djb_hash.h>
+#include <njs_mp.h>
#include <math.h>
* 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;
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
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__;
} u;
njs_value_t *bound;
-#if (NXT_SUNC)
+#if (NJS_SUNC)
njs_closure_t *closures[1];
#else
njs_closure_t *closures[];
#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, \
} \
}
.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), \
} \
} \
}
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;
}
-nxt_inline void
+njs_inline void
njs_set_number(njs_value_t *value, double num)
{
value->data.u.number = num;
}
-nxt_inline void
+njs_inline void
njs_set_int32(njs_value_t *value, int32_t num)
{
value->data.u.number = num;
}
-nxt_inline void
+njs_inline void
njs_set_uint32(njs_value_t *value, uint32_t num)
{
value->data.u.number = num;
}
-nxt_inline void
+njs_inline void
njs_set_data(njs_value_t *value, void *data)
{
value->data.u.data = data;
}
-nxt_inline void
+njs_inline void
njs_set_object(njs_value_t *value, njs_object_t *object)
{
value->data.u.object = 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;
}
-nxt_inline void
+njs_inline void
njs_set_array(njs_value_t *value, njs_array_t *array)
{
value->data.u.array = array;
}
-nxt_inline void
+njs_inline void
njs_set_function(njs_value_t *value, njs_function_t *function)
{
value->data.u.function = function;
}
-nxt_inline void
+njs_inline void
njs_set_date(njs_value_t *value, njs_date_t *date)
{
value->data.u.date = date;
}
-nxt_inline void
+njs_inline void
njs_set_regexp(njs_value_t *value, njs_regexp_t *regexp)
{
value->data.u.regexp = 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;
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)) {
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;
}
}
-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) {
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <string.h>
static njs_variable_t *njs_variable_scope_add(njs_vm_t *vm,
- njs_parser_scope_t *scope, nxt_lvlhsh_query_t *lhq,
+ njs_parser_scope_t *scope, njs_lvlhsh_query_t *lhq,
njs_variable_type_t type);
static njs_ret_t njs_variable_reference_resolve(njs_vm_t *vm,
njs_variable_reference_t *vr, njs_parser_scope_t *node_scope);
-static njs_variable_t *njs_variable_alloc(njs_vm_t *vm, nxt_str_t *name,
+static njs_variable_t *njs_variable_alloc(njs_vm_t *vm, njs_str_t *name,
njs_variable_type_t type);
-static nxt_int_t
-njs_variables_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
+static njs_int_t
+njs_variables_hash_test(njs_lvlhsh_query_t *lhq, void *data)
{
njs_variable_t *var;
var = data;
- if (nxt_strstr_eq(&lhq->key, &var->name)) {
- return NXT_OK;
+ if (njs_strstr_eq(&lhq->key, &var->name)) {
+ return NJS_OK;
}
- return NXT_DECLINED;
+ return NJS_DECLINED;
}
-const nxt_lvlhsh_proto_t njs_variables_hash_proto
- nxt_aligned(64) =
+const njs_lvlhsh_proto_t njs_variables_hash_proto
+ njs_aligned(64) =
{
- NXT_LVLHSH_DEFAULT,
+ NJS_LVLHSH_DEFAULT,
njs_variables_hash_test,
njs_lvlhsh_alloc,
njs_lvlhsh_free,
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;
}
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;
}
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) {
}
var = njs_variable_alloc(vm, &lhq->key, type);
- if (nxt_slow_path(var == NULL)) {
+ if (njs_slow_path(var == NULL)) {
return NULL;
}
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");
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;
}
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");
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");
}
-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,
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;
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;
}
}
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;
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;
}
}
}
- return NXT_OK;
+ return NJS_OK;
}
*/
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) {
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;
}
var = njs_variable_resolve(vm, node);
- if (nxt_fast_path(var != NULL)) {
+ if (njs_fast_path(var != NULL)) {
return var->index;
}
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;
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;
}
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;
}
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;
}
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;
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
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;
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)) {
/*
* 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;
}
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;
}
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;
}
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);
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;
}
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;
typedef struct {
- nxt_str_t name;
+ njs_str_t name;
njs_variable_type_t type:8; /* 3 bits */
uint8_t argument;
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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_regexp.h>
#include <string.h>
-static nxt_int_t njs_vm_init(njs_vm_t *vm);
-static nxt_int_t njs_vm_handle_events(njs_vm_t *vm);
+static njs_int_t njs_vm_init(njs_vm_t *vm);
+static njs_int_t njs_vm_handle_events(njs_vm_t *vm);
-const nxt_str_t njs_entry_main = nxt_string("main");
-const nxt_str_t njs_entry_module = nxt_string("module");
-const nxt_str_t njs_entry_native = nxt_string("native");
-const nxt_str_t njs_entry_unknown = nxt_string("unknown");
-const nxt_str_t njs_entry_anonymous = nxt_string("anonymous");
+const njs_str_t njs_entry_main = njs_str("main");
+const njs_str_t njs_entry_module = njs_str("module");
+const njs_str_t njs_entry_native = njs_str("native");
+const njs_str_t njs_entry_unknown = njs_str("unknown");
+const njs_str_t njs_entry_anonymous = njs_str("anonymous");
static void *
njs_alloc(void *mem, size_t size)
{
- return nxt_malloc(size);
+ return njs_malloc(size);
}
{
void *p;
- p = nxt_malloc(size);
+ p = njs_malloc(size);
if (p != NULL) {
- nxt_memzero(p, size);
+ njs_memzero(p, size);
}
return p;
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,
};
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,
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;
}
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;
}
if (options->accumulative) {
ret = njs_vm_init(vm);
- if (nxt_slow_path(ret != NXT_OK)) {
+ if (njs_slow_path(ret != NJS_OK)) {
return NULL;
}
}
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;
}
}
- 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;
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;
}
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;
}
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;
}
*/
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;
}
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;
}
}
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;
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;
}
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;
}
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;
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;
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;
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;
}
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;
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;
}
}
-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;
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;
}
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;
}
}
-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);
}
-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;
}
}
-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);
}
}
-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;
}
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);
} 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");
}
}
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;
} 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");
}
}
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;
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) {
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. */
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. */
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;
}
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;
}
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;
}
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;
}
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;
}
}
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);
}
-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;
case NJS_STRING:
if (*next != 0) {
- return NXT_DECLINED;
+ return NJS_DECLINED;
}
*next = 1;
n = (*next)++;
if (n == array->length) {
- return NXT_DECLINED;
+ return NJS_DECLINED;
}
value = &array->start[n];
break;
default:
- return NXT_ERROR;
+ return NJS_ERROR;
}
return njs_vm_value_to_string(vm, retval, value);
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;
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;
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);
}
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;
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;
/* 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;
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;
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;
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
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
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];
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_ */
* Copyright (C) NGINX, Inc.
*/
-#include <njs_core.h>
+#include <njs_main.h>
#include <njs_regexp.h>
#include <string.h>
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);
/*
* 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;
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;
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++;
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;
}
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;
}
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;
}
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)
}
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;
}
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;
}
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;
}
* 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)));
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;
}
goto error;
}
- if (nxt_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
+ if (njs_slow_path(ret < 0 && ret >= NJS_PREEMPT)) {
break;
}
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;
}
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;
}
(uintptr_t) value2,
function_frame->ctor);
- if (nxt_slow_path(ret != NXT_OK)) {
+ if (njs_slow_path(ret != NJS_OK)) {
goto error;
}
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;
}
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;
}
}
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;
}
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;
}
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;
}
error:
- ret = NXT_ERROR;
+ ret = NJS_ERROR;
for ( ;; ) {
frame = (njs_frame_t *) vm->top_frame;
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;
}
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) {
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;
}
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,,]. */
return sizeof(njs_vmcode_array_t);
}
- return NXT_ERROR;
+ return NJS_ERROR;
}
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);
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;
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;
}
}
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;
}
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;
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;
}
}
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;
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;
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;
}
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;
}
}
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;
"while property initialization",
njs_type_string(object->type));
- return NXT_ERROR;
+ return NJS_ERROR;
}
return sizeof(njs_vmcode_prop_set_t);
switch (ret) {
- case NXT_OK:
+ case NJS_OK:
prop = pq.lhq.value;
if (!njs_is_valid(&prop->value)) {
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;
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);
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;
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;
}
"while deleting",
njs_prop_type_string(prop->type));
- return NXT_ERROR;
+ return NJS_ERROR;
}
/* GC: release value. */
break;
- case NXT_DECLINED:
+ case NJS_DECLINED:
break;
- case NXT_ERROR:
+ case NJS_ERROR:
default:
return ret;
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;
}
}
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;
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;
}
return code->offset;
}
- nxt_mp_free(vm->mem_pool, next);
+ njs_mp_free(vm->mem_pool, next);
return sizeof(njs_vmcode_prop_next_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;
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;
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);
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);
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;
/* "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;
}
{
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 {
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);
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);
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;
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;
}
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;
switch (ret) {
- case NXT_OK:
+ case NJS_OK:
prop = pq.lhq.value;
switch (prop->type) {
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;
}
"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;
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);
}
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;
} 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;
if (njs_is_valid(exception_value)) {
vm->retval = *exception_value;
- return NXT_ERROR;
+ return NJS_ERROR;
}
finally = (njs_vmcode_finally_t *) pc;
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;
* 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.
*/
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_ */
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_sprintf.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_malloc.h>
+#include <njs_lvlhsh.h>
+#include <njs_murmur_hash.h>
+#include <njs_mp.h>
+#include <string.h>
+
+
+static njs_int_t
+lvlhsh_unit_test_key_test(njs_lvlhsh_query_t *lhq, void *data)
+{
+ if (*(uintptr_t *) lhq->key.start == (uintptr_t) data) {
+ return NJS_OK;
+ }
+
+ return NJS_DECLINED;
+}
+
+
+static void *
+lvlhsh_unit_test_pool_alloc(void *pool, size_t size)
+{
+ return njs_mp_align(pool, size, size);
+}
+
+
+static void
+lvlhsh_unit_test_pool_free(void *pool, void *p, size_t size)
+{
+ njs_mp_free(pool, p);
+}
+
+
+static const njs_lvlhsh_proto_t lvlhsh_proto njs_aligned(64) = {
+ NJS_LVLHSH_LARGE_SLAB,
+ lvlhsh_unit_test_key_test,
+ lvlhsh_unit_test_pool_alloc,
+ lvlhsh_unit_test_pool_free,
+};
+
+
+static njs_int_t
+lvlhsh_unit_test_add(njs_lvlhsh_t *lh, const njs_lvlhsh_proto_t *proto,
+ void *pool, uintptr_t key)
+{
+ njs_lvlhsh_query_t lhq;
+
+ lhq.key_hash = key;
+ lhq.replace = 0;
+ lhq.key.length = sizeof(uintptr_t);
+ lhq.key.start = (u_char *) &key;
+ lhq.value = (void *) key;
+ lhq.proto = proto;
+ lhq.pool = pool;
+
+ switch (njs_lvlhsh_insert(lh, &lhq)) {
+
+ case NJS_OK:
+ return NJS_OK;
+
+ case NJS_DECLINED:
+ njs_printf("lvlhsh unit test failed: key %08Xl is already in hash\n",
+ (long) key);
+ /* Fall through. */
+
+ default:
+ return NJS_ERROR;
+ }
+}
+
+
+static njs_int_t
+lvlhsh_unit_test_get(njs_lvlhsh_t *lh, const njs_lvlhsh_proto_t *proto,
+ uintptr_t key)
+{
+ njs_lvlhsh_query_t lhq;
+
+ lhq.key_hash = key;
+ lhq.key.length = sizeof(uintptr_t);
+ lhq.key.start = (u_char *) &key;
+ lhq.proto = proto;
+
+ if (njs_lvlhsh_find(lh, &lhq) == NJS_OK) {
+
+ if (key == (uintptr_t) lhq.value) {
+ return NJS_OK;
+ }
+ }
+
+ njs_printf("lvlhsh unit test failed: key %08Xl not found in hash\n",
+ (long) key);
+
+ return NJS_ERROR;
+}
+
+
+static njs_int_t
+lvlhsh_unit_test_delete(njs_lvlhsh_t *lh, const njs_lvlhsh_proto_t *proto,
+ void *pool, uintptr_t key)
+{
+ njs_int_t ret;
+ njs_lvlhsh_query_t lhq;
+
+ lhq.key_hash = key;
+ lhq.key.length = sizeof(uintptr_t);
+ lhq.key.start = (u_char *) &key;
+ lhq.proto = proto;
+ lhq.pool = pool;
+
+ ret = njs_lvlhsh_delete(lh, &lhq);
+
+ if (ret != NJS_OK) {
+ njs_printf("lvlhsh unit test failed: key %08lX not found in hash\n",
+ (long) key);
+ }
+
+ return ret;
+}
+
+
+static void *
+lvlhsh_malloc(void *mem, size_t size)
+{
+ return njs_malloc(size);
+}
+
+
+static void *
+lvlhsh_zalloc(void *mem, size_t size)
+{
+ void *p;
+
+ p = njs_malloc(size);
+
+ if (p != NULL) {
+ njs_memzero(p, size);
+ }
+
+ return p;
+}
+
+
+static void *
+lvlhsh_align(void *mem, size_t alignment, size_t size)
+{
+ return njs_memalign(alignment, size);
+}
+
+
+static void
+lvlhsh_free(void *mem, void *p)
+{
+ njs_free(p);
+}
+
+
+static void
+lvlhsh_alert(void *mem, const char *fmt, ...)
+{
+ u_char buf[1024], *p;
+ va_list args;
+
+ va_start(args, fmt);
+ p = njs_sprintf(buf, buf + sizeof(buf), fmt, args);
+ va_end(args);
+
+ (void) njs_stderror("alert: \"%*s\"\n", p - buf, buf);
+}
+
+
+static const njs_mem_proto_t lvl_mp_proto = {
+ lvlhsh_malloc,
+ lvlhsh_zalloc,
+ lvlhsh_align,
+ NULL,
+ lvlhsh_free,
+ lvlhsh_alert,
+ NULL,
+};
+
+
+static njs_int_t
+lvlhsh_unit_test(njs_uint_t n)
+{
+ njs_mp_t *pool;
+ uint32_t key;
+ njs_uint_t i;
+ njs_lvlhsh_t lh;
+ njs_lvlhsh_each_t lhe;
+
+ const size_t min_chunk_size = 32;
+ const size_t page_size = 1024;
+ const size_t page_alignment = 128;
+ const size_t cluster_size = 4096;
+
+ pool = njs_mp_create(&lvl_mp_proto, NULL, NULL, cluster_size,
+ page_alignment, page_size, min_chunk_size);
+ if (pool == NULL) {
+ return NJS_ERROR;
+ }
+
+ njs_printf("lvlhsh unit test started: %l items\n", (long) n);
+
+ njs_memzero(&lh, sizeof(njs_lvlhsh_t));
+
+ key = 0;
+ for (i = 0; i < n; i++) {
+ key = njs_murmur_hash2(&key, sizeof(uint32_t));
+
+ if (lvlhsh_unit_test_add(&lh, &lvlhsh_proto, pool, key) != NJS_OK) {
+ njs_printf("lvlhsh add unit test failed at %l\n", (long) i);
+ return NJS_ERROR;
+ }
+ }
+
+ key = 0;
+ for (i = 0; i < n; i++) {
+ key = njs_murmur_hash2(&key, sizeof(uint32_t));
+
+ if (lvlhsh_unit_test_get(&lh, &lvlhsh_proto, key) != NJS_OK) {
+ return NJS_ERROR;
+ }
+ }
+
+ njs_lvlhsh_each_init(&lhe, &lvlhsh_proto);
+
+ for (i = 0; i < n + 1; i++) {
+ if (njs_lvlhsh_each(&lh, &lhe) == NULL) {
+ break;
+ }
+ }
+
+ if (i != n) {
+ njs_printf("lvlhsh each unit test failed at %l of %l\n",
+ (long) i, (long) n);
+ return NJS_ERROR;
+ }
+
+ key = 0;
+ for (i = 0; i < n; i++) {
+ key = njs_murmur_hash2(&key, sizeof(uint32_t));
+
+ if (lvlhsh_unit_test_delete(&lh, &lvlhsh_proto, pool, key) != NJS_OK) {
+ return NJS_ERROR;
+ }
+ }
+
+ if (!njs_mp_is_empty(pool)) {
+ njs_printf("mem cache pool is not empty\n");
+ return NJS_ERROR;
+ }
+
+ njs_mp_destroy(pool);
+
+ njs_printf("lvlhsh unit test passed\n");
+
+ return NJS_OK;
+}
+
+
+int
+main(void)
+{
+ return lvlhsh_unit_test(1000 * 1000);
+}
#include <njs.h>
#include <string.h>
#include <stdlib.h>
-#include <nxt_sprintf.h>
+#include <njs_sprintf.h>
#include <sys/resource.h>
#include <time.h>
-static nxt_int_t
-njs_unit_test_benchmark(nxt_str_t *script, nxt_str_t *result, const char *msg,
- nxt_uint_t n)
+static njs_int_t
+njs_unit_test_benchmark(njs_str_t *script, njs_str_t *result, const char *msg,
+ njs_uint_t n)
{
u_char *start;
njs_vm_t *vm, *nvm;
uint64_t us;
- nxt_int_t ret, rc;
- nxt_str_t s;
- nxt_uint_t i;
- nxt_bool_t success;
+ njs_int_t ret, rc;
+ njs_str_t s;
+ njs_uint_t i;
+ njs_bool_t success;
njs_vm_opt_t options;
struct rusage usage;
- nxt_memzero(&options, sizeof(njs_vm_opt_t));
+ njs_memzero(&options, sizeof(njs_vm_opt_t));
vm = NULL;
nvm = NULL;
- rc = NXT_ERROR;
+ rc = NJS_ERROR;
vm = njs_vm_create(&options);
if (vm == NULL) {
- nxt_printf("njs_vm_create() failed\n");
+ njs_printf("njs_vm_create() failed\n");
goto done;
}
start = script->start;
ret = njs_vm_compile(vm, &start, start + script->length);
- if (ret != NXT_OK) {
- nxt_printf("njs_vm_compile() failed\n");
+ if (ret != NJS_OK) {
+ njs_printf("njs_vm_compile() failed\n");
goto done;
}
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;
}
+ 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:
}
-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);"
"}"
"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);"
"}"
"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)"
"}"
"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);"
"}"
"fibo(32).length");
- static nxt_str_t fibo_result = nxt_string("3524578");
+ static njs_str_t fibo_result = njs_str("3524578");
if (argc > 1) {
}
}
- nxt_printf("unknown agrument\n");
+ njs_printf("unknown agrument\n");
return EXIT_FAILURE;
}
#include <njs.h>
#include <string.h>
-#include <nxt_sprintf.h>
+#include <njs_sprintf.h>
#include <sys/resource.h>
#include <time.h>
typedef struct {
- nxt_str_t script;
- nxt_str_t ret;
+ njs_str_t script;
+ njs_str_t ret;
} njs_interactive_test_t;
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;
}
end = NULL;
for ( ;; ) {
- start = (end != NULL) ? end + nxt_length(ENTER) : start;
+ start = (end != NULL) ? end + njs_length(ENTER) : start;
if (start >= last) {
break;
}
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:
}
-int nxt_cdecl
+int njs_cdecl
main(int argc, char **argv)
{
- nxt_bool_t verbose;
+ njs_bool_t verbose;
verbose = 0;
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+
+#include <njs_main.h>
+#include <njs_lvlhsh.h>
+#include <njs_djb_hash.h>
+#include <njs_pcre.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/resource.h>
+#include <time.h>
+
+
+typedef struct {
+ njs_str_t script;
+ njs_str_t ret;
+} njs_unit_test_t;
+
+
+static njs_unit_test_t njs_test[] =
+{
+ { njs_str("@"),
+ njs_str("SyntaxError: Unexpected token \"@\" in 1") },
+
+ { njs_str("}"),
+ njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+ { njs_str("1}"),
+ njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+ { njs_str("/***/1/*\n**/"),
+ njs_str("1") },
+
+ /* Variable declarations. */
+
+ { njs_str("var x"),
+ njs_str("undefined") },
+
+ { njs_str("var x;"),
+ njs_str("undefined") },
+
+ { njs_str("var x;;"),
+ njs_str("undefined") },
+
+ { njs_str("var x = 0"),
+ njs_str("undefined") },
+
+ { njs_str("var x = 0;"),
+ njs_str("undefined") },
+
+ { njs_str("var x = 0;;"),
+ njs_str("undefined") },
+
+ { njs_str("var; a"),
+ njs_str("SyntaxError: Unexpected token \";\" in 1") },
+
+ { njs_str("var + a"),
+ njs_str("SyntaxError: Unexpected token \"+\" in 1") },
+
+ { njs_str("//\r\n; var + a"),
+ njs_str("SyntaxError: Unexpected token \"+\" in 2") },
+
+ { njs_str("/*\n*/; var + a"),
+ njs_str("SyntaxError: Unexpected token \"+\" in 2") },
+
+ { njs_str("var \n a \n = 1; a"),
+ njs_str("1") },
+
+ { njs_str("var \n a, \n b; b"),
+ njs_str("undefined") },
+
+ { njs_str("var a = 1; var b; a"),
+ njs_str("1") },
+
+ { njs_str("a = 1;for(;a;a--)var a; a"),
+ njs_str("0") },
+
+ { njs_str("if(1)if(0){0?0:0}else\nvar a\nelse\nvar b"),
+ njs_str("undefined") },
+
+ { njs_str("var a = 1; var a; a"),
+ njs_str("1") },
+
+ { njs_str("(function (x) {if (x) { var a = 3; return a} else { var a = 4; return a}})(1)"),
+ njs_str("3") },
+
+ { njs_str("(function (x) {if (x) { var a = 3; return a} else { var a = 4; return a}})(0)"),
+ njs_str("4") },
+
+ { njs_str("function f(){return 2}; var f; f()"),
+ njs_str("2") },
+
+ { njs_str("function f(){return 2}; var f = 1; f()"),
+ njs_str("TypeError: number is not a function") },
+
+ { njs_str("function f(){return 1}; function f(){return 2}; f()"),
+ njs_str("2") },
+
+ { njs_str("var f = 1; function f() {}; f"),
+ njs_str("1") },
+
+#if 0 /* TODO */
+ { njs_str("var a; Object.getOwnPropertyDescriptor(this, 'a').value"),
+ njs_str("undefined") },
+
+ { njs_str("this.a = 1; a"),
+ njs_str("1") },
+#endif
+
+ { njs_str("f() = 1"),
+ njs_str("ReferenceError: Invalid left-hand side in assignment in 1") },
+
+ { njs_str("f.a() = 1"),
+ njs_str("ReferenceError: Invalid left-hand side in assignment in 1") },
+
+ { njs_str("++f()"),
+ njs_str("ReferenceError: Invalid left-hand side in prefix operation in 1") },
+
+ { njs_str("f()++"),
+ njs_str("ReferenceError: Invalid left-hand side in postfix operation in 1") },
+
+ /* Numbers. */
+
+ { njs_str("0"),
+ njs_str("0") },
+
+ { njs_str("-0"),
+ njs_str("-0") },
+
+ { njs_str(".0"),
+ njs_str("0") },
+
+ { njs_str("0.1"),
+ njs_str("0.1") },
+
+ { njs_str(".9"),
+ njs_str("0.9") },
+
+ { njs_str("-.01"),
+ njs_str("-0.01") },
+
+ { njs_str("0.000001"),
+ njs_str("0.000001") },
+
+ { njs_str("0.00000123456"),
+ njs_str("0.00000123456") },
+
+ { njs_str("0.0000001"),
+ njs_str("1e-7") },
+
+ { njs_str("1.1000000"),
+ njs_str("1.1") },
+
+ { njs_str("99999999999999999999"),
+ njs_str("100000000000000000000") },
+
+ { njs_str("99999999999999999999.111"),
+ njs_str("100000000000000000000") },
+
+ { njs_str("999999999999999999999"),
+ njs_str("1e+21") },
+
+ { njs_str("9223372036854775808"),
+ njs_str("9223372036854776000") },
+
+ { njs_str("18446744073709551616"),
+ njs_str("18446744073709552000") },
+
+ { njs_str("1.7976931348623157E+308"),
+ njs_str("1.7976931348623157e+308") },
+
+ { njs_str("+1"),
+ njs_str("1") },
+
+ { njs_str("+1\n"),
+ njs_str("1") },
+
+ { njs_str("."),
+ njs_str("SyntaxError: Unexpected token \".\" in 1") },
+
+ /* Octal Numbers. */
+
+ { njs_str("0o0"),
+ njs_str("0") },
+
+ { njs_str("0O10"),
+ njs_str("8") },
+
+ { njs_str("0o011"),
+ njs_str("9") },
+
+ { njs_str("-0O777"),
+ njs_str("-511") },
+
+ { njs_str("0o"),
+ njs_str("SyntaxError: Unexpected token \"0o\" in 1") },
+
+ { njs_str("0O778"),
+ njs_str("SyntaxError: Unexpected token \"0O778\" in 1") },
+
+ /* Legacy Octal Numbers are deprecated. */
+
+ { njs_str("00"),
+ njs_str("SyntaxError: Unexpected token \"00\" in 1") },
+
+ { njs_str("08"),
+ njs_str("SyntaxError: Unexpected token \"08\" in 1") },
+
+ { njs_str("09"),
+ njs_str("SyntaxError: Unexpected token \"09\" in 1") },
+
+ { njs_str("0011"),
+ njs_str("SyntaxError: Unexpected token \"00\" in 1") },
+
+ /* Binary Numbers. */
+
+ { njs_str("0b0"),
+ njs_str("0") },
+
+ { njs_str("0B10"),
+ njs_str("2") },
+
+ { njs_str("0b0101"),
+ njs_str("5") },
+
+ { njs_str("-0B11111111"),
+ njs_str("-255") },
+
+ { njs_str("0b"),
+ njs_str("SyntaxError: Unexpected token \"0b\" in 1") },
+
+ { njs_str("0B12"),
+ njs_str("SyntaxError: Unexpected token \"0B12\" in 1") },
+
+ /* Hex Numbers. */
+
+ { njs_str("0x0"),
+ njs_str("0") },
+
+ { njs_str("-0x1"),
+ njs_str("-1") },
+
+ { njs_str("0xffFF"),
+ njs_str("65535") },
+
+ { njs_str("0X0000BEEF"),
+ njs_str("48879") },
+
+ { njs_str("0x"),
+ njs_str("SyntaxError: Unexpected token \"0x\" in 1") },
+
+ { njs_str("0xffff."),
+ njs_str("SyntaxError: Unexpected token \"\" in 1") },
+
+ { njs_str("0x12g"),
+ njs_str("SyntaxError: Unexpected token \"g\" in 1") },
+
+ { njs_str(""),
+ njs_str("undefined") },
+
+ { njs_str("\n"),
+ njs_str("undefined") },
+
+ { njs_str(";"),
+ njs_str("undefined") },
+
+ { njs_str("\n +1"),
+ njs_str("1") },
+
+ /* Scientific notation. */
+
+ { njs_str("0e0"),
+ njs_str("0") },
+
+ { njs_str("0.0e0"),
+ njs_str("0") },
+
+ { njs_str("1e0"),
+ njs_str("1") },
+
+ { njs_str("1e1"),
+ njs_str("10") },
+
+ { njs_str("1.e01"),
+ njs_str("10") },
+
+ { njs_str("5.7e1"),
+ njs_str("57") },
+
+ { njs_str("5.7e-1"),
+ njs_str("0.57") },
+
+ { njs_str("-5.7e-1"),
+ njs_str("-0.57") },
+
+ { njs_str("1.1e-01"),
+ njs_str("0.11") },
+
+ { njs_str("5.7e-2"),
+ njs_str("0.057") },
+
+ { njs_str("1.1e+01"),
+ njs_str("11") },
+
+ { njs_str("-.01e-01"),
+ njs_str("-0.001") },
+
+ { njs_str("1e9"),
+ njs_str("1000000000") },
+
+ { njs_str("1.0e308"),
+ njs_str("1e+308") },
+
+ { njs_str("0e309"),
+ njs_str("0") },
+
+ { njs_str("0e-309"),
+ njs_str("0") },
+
+ { njs_str("1e309"),
+ njs_str("Infinity") },
+
+ { njs_str("-1e309"),
+ njs_str("-Infinity") },
+
+ { njs_str("1e"),
+ njs_str("SyntaxError: Unexpected token \"e\" in 1") },
+
+ { njs_str("1.e"),
+ njs_str("SyntaxError: Unexpected token \"e\" in 1") },
+
+ { njs_str("1e+"),
+ njs_str("SyntaxError: Unexpected token \"e\" in 1") },
+
+ { njs_str("1.e-"),
+ njs_str("SyntaxError: Unexpected token \"e\" in 1") },
+
+ { njs_str("1eZ"),
+ njs_str("SyntaxError: Unexpected token \"eZ\" in 1") },
+
+ { njs_str(".e1"),
+ njs_str("SyntaxError: Unexpected token \".\" in 1") },
+
+ { njs_str("Number.prototype.X = function(){return 123;};"
+ "(1).X()"),
+ njs_str("123") },
+
+ /* Indexes. */
+
+ { njs_str("var a = []; a[-1] = 2; a[-1] == a['-1']"),
+ njs_str("true") },
+
+ { njs_str("var a = []; a[Infinity] = 2; a[Infinity] == a['Infinity']"),
+ njs_str("true") },
+
+ { njs_str("var a = []; a[NaN] = 2; a[NaN] == a['NaN']"),
+ njs_str("true") },
+
+ /* Number.toString(radix) method. */
+
+ { njs_str("0..toString(2)"),
+ njs_str("0") },
+
+ { njs_str("240..toString(2)"),
+ njs_str("11110000") },
+
+ { njs_str("Math.pow(-2, 1023).toString(2).length"),
+ njs_str("1025") },
+
+ { njs_str("8.0625.toString(2)"),
+ njs_str("1000.0001") },
+
+ { njs_str("(1/3).toString(2)"),
+ njs_str("0.010101010101010101010101010101010101010101010101010101") },
+
+ { njs_str("9999..toString(3)"),
+ njs_str("111201100") },
+
+ { njs_str("-9999..toString(3)"),
+ njs_str("-111201100") },
+
+ { njs_str("81985529216486895..toString(16)"),
+ njs_str("123456789abcdf0") },
+
+ { njs_str("0xffff.toString(16)"),
+ njs_str("ffff") },
+
+ { njs_str("30520..toString(36)"),
+ njs_str("njs") },
+
+ { njs_str("Infinity.toString()"),
+ njs_str("Infinity") },
+
+ { njs_str("Infinity.toString(2)"),
+ njs_str("Infinity") },
+
+ { njs_str("Infinity.toString(10)"),
+ njs_str("Infinity") },
+
+ { njs_str("Infinity.toString(NaN)"),
+ njs_str("RangeError") },
+
+ { njs_str("Infinity.toString({})"),
+ njs_str("RangeError") },
+
+ { njs_str("Infinity.toString(Infinity)"),
+ njs_str("RangeError") },
+
+ { njs_str("NaN.toString()"),
+ njs_str("NaN") },
+
+ { njs_str("NaN.toString(2)"),
+ njs_str("NaN") },
+
+ { njs_str("NaN.toString(10)"),
+ njs_str("NaN") },
+
+ { njs_str("NaN.toString(Infinity)"),
+ njs_str("RangeError") },
+
+ { njs_str("NaN.toString({})"),
+ njs_str("RangeError") },
+
+ { njs_str("NaN.toString(NaN)"),
+ njs_str("RangeError") },
+
+ /* An object "valueOf/toString" methods. */
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; +a"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } }; +a"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: 2,"
+ " toString: function() { return '1' } }; +a"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; ''+a"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return [] },"
+ " toString: function() { return '1' } }; +a"),
+ njs_str("1") },
+
+ { njs_str("var a = { toString: function() { return 'a' } };"
+ "var b = { toString: function() { return a+'b' } }; '0'+b"),
+ njs_str("0ab") },
+
+ { njs_str("({valueOf:()=>'4'}) / ({valueOf:()=>2})"),
+ njs_str("2") },
+
+ { njs_str("({valueOf:()=>{throw 'x'}}) / ({valueOf:()=>{throw 'y'}});"
+ "var e; try { x/y } catch(ex) {e = ex}; ex"),
+ njs_str("x") },
+
+ { njs_str("({valueOf:()=>{ try {throw 'x'} catch (ex) {return 6} } }) / 2"),
+ njs_str("3") },
+
+ { njs_str("({valueOf:()=>2}) / ({valueOf:()=>{throw 'y'}});"
+ "var e; try { x/y } catch(ex) {e = ex}; ex"),
+ njs_str("y") },
+
+ { njs_str("({valueOf:()=>'4'}) % ({valueOf:()=>3})"),
+ njs_str("1") },
+
+ { njs_str("({valueOf:()=>9}) >>> ({valueOf:()=>2})"),
+ njs_str("2") },
+
+ { njs_str("({valueOf:()=>0x1f}) & ({valueOf:()=>0xf})"),
+ njs_str("15") },
+
+ { njs_str("({valueOf:()=>0x1f}) ^ ({valueOf:()=>0xf})"),
+ njs_str("16") },
+
+ { njs_str("({valueOf:()=>0xf}) == ({valueOf:()=>0xf})"),
+ njs_str("false") },
+
+ { njs_str("var e; try {({valueOf: String.prototype.valueOf}) == 1} "
+ "catch (ex) { e = ex}; e"),
+ njs_str("TypeError: unexpected value type:object") },
+
+ { njs_str("({valueOf:()=>0xf}) == 0xf"),
+ njs_str("true") },
+
+ { njs_str("0xf == ({valueOf:()=>0xf})"),
+ njs_str("true") },
+
+ { njs_str("({valueOf:()=>'0xf'}) == 0xf"),
+ njs_str("true") },
+
+ { njs_str("0xf == ({valueOf:()=>'0xf'})"),
+ njs_str("true") },
+
+ { njs_str("({valueOf:()=>0xf}) == '0xf'"),
+ njs_str("true") },
+
+ { njs_str("'0xf' == ({valueOf:()=>0xf})"),
+ njs_str("true") },
+ /**/
+
+ { njs_str("1 + undefined"),
+ njs_str("NaN") },
+
+ { njs_str("1 + ''"),
+ njs_str("1") },
+
+ { njs_str("0xA + ''"),
+ njs_str("10") },
+
+ { njs_str("undefined + undefined"),
+ njs_str("NaN") },
+
+ { njs_str("1.2 + 5.7"),
+ njs_str("6.9") },
+
+ { njs_str("0xf + 1"),
+ njs_str("16") },
+
+ { njs_str("1 + 1 + '2' + 1 + 1"),
+ njs_str("2211") },
+
+ { njs_str("'gg' + -0"),
+ njs_str("gg0") },
+
+ { njs_str("1.2 - '5.7'"),
+ njs_str("-4.5") },
+
+ { njs_str("1.2 + -'5.7'"),
+ njs_str("-4.5") },
+
+ { njs_str("1.2 - '-5.7'"),
+ njs_str("6.9") },
+
+ { njs_str("5 - ' \t 12 \t'"),
+ njs_str("-7") },
+
+ { njs_str("5 - '12zz'"),
+ njs_str("NaN") },
+
+ { njs_str("5 - '0x2'"),
+ njs_str("3") },
+
+ { njs_str("5 - '-0x2'"),
+ njs_str("7") },
+
+ { njs_str("5 - '\t 0x2 \t'"),
+ njs_str("3") },
+
+ { njs_str("5 - '0x2 z'"),
+ njs_str("NaN") },
+
+ { njs_str("12 - '5.7e1'"),
+ njs_str("-45") },
+
+ { njs_str("12 - '5.e1'"),
+ njs_str("-38") },
+
+ { njs_str("12 - '5.7e+01'"),
+ njs_str("-45") },
+
+ { njs_str("12 - '5.7e-01'"),
+ njs_str("11.43") },
+
+ { njs_str("12 - ' 5.7e1 '"),
+ njs_str("-45") },
+
+ { njs_str("12 - '5.7e'"),
+ njs_str("NaN") },
+
+ { njs_str("12 - '5.7e+'"),
+ njs_str("NaN") },
+
+ { njs_str("12 - '5.7e-'"),
+ njs_str("NaN") },
+
+ { njs_str("12 - ' 5.7e1 z'"),
+ njs_str("NaN") },
+
+ { njs_str("5 - '0x'"),
+ njs_str("NaN") },
+
+ { njs_str("1 + +'3'"),
+ njs_str("4") },
+
+ { njs_str("1 - undefined"),
+ njs_str("NaN") },
+
+ { njs_str("1 - ''"),
+ njs_str("1") },
+
+ { njs_str("undefined - undefined"),
+ njs_str("NaN") },
+
+ /* String.toString() method. */
+
+ { njs_str("'A'.toString()"),
+ njs_str("A") },
+
+ { njs_str("'A'.toString('hex')"),
+ njs_str("TypeError: argument must be a byte string") },
+
+ { njs_str("'A'.toBytes().toString('latin1')"),
+ njs_str("TypeError: Unknown encoding: \"latin1\"") },
+
+ { njs_str("'ABCD'.toBytes().toString('hex')"),
+ njs_str("41424344") },
+
+ { njs_str("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('hex')"),
+ njs_str("00aabbff") },
+
+ { njs_str("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('base64')"),
+ njs_str("AKq7/w==") },
+
+ { njs_str("'ABCD'.toBytes().toString('base64')"),
+ njs_str("QUJDRA==") },
+
+ { njs_str("'ABC'.toBytes().toString('base64')"),
+ njs_str("QUJD") },
+
+ { njs_str("'AB'.toBytes().toString('base64')"),
+ njs_str("QUI=") },
+
+ { njs_str("'A'.toBytes().toString('base64')"),
+ njs_str("QQ==") },
+
+ { njs_str("''.toBytes().toString('base64')"),
+ njs_str("") },
+
+ { njs_str("'\\x00\\xAA\\xBB\\xFF'.toBytes().toString('base64url')"),
+ njs_str("AKq7_w") },
+
+ { njs_str("'ABCD'.toBytes().toString('base64url')"),
+ njs_str("QUJDRA") },
+
+ { njs_str("'ABC'.toBytes().toString('base64url')"),
+ njs_str("QUJD") },
+
+ { njs_str("'AB'.toBytes().toString('base64url')"),
+ njs_str("QUI") },
+
+ { njs_str("'A'.toBytes().toString('base64url')"),
+ njs_str("QQ") },
+
+ { njs_str("''.toBytes().toString('base64url')"),
+ njs_str("") },
+
+ /* Assignment. */
+
+ { njs_str("var a, b = (a = [2]) * (3 * 4); a +' '+ b"),
+ njs_str("2 24") },
+
+ { njs_str("var a = 1; var b = a += 1; b"),
+ njs_str("2") },
+
+ { njs_str("var a = 1; var b = a -= 1; b"),
+ njs_str("0") },
+
+ { njs_str("var a = 1; var b = a <<= 1; b"),
+ njs_str("2") },
+
+ /* 3 address operation and side effect. */
+
+ { njs_str("var a = 1; function f(x) { a = x; return 2 }; a+f(5)+' '+a"),
+ njs_str("3 5") },
+
+ { njs_str("var a = 1; function f(x) { a = x; return 2 }; a += f(5)"),
+ njs_str("3") },
+
+ { njs_str("var x; x in (x = 1, [1, 2, 3])"),
+ njs_str("false") },
+
+ /* Exponentiation. */
+
+ { njs_str("2 ** 3 ** 2"),
+ njs_str("512") },
+
+ { njs_str("2 ** (3 ** 2)"),
+ njs_str("512") },
+
+ { njs_str("(2 ** 3) ** 2"),
+ njs_str("64") },
+
+ { njs_str("3 ** 2 - 9"),
+ njs_str("0") },
+
+ { njs_str("-9 + 3 ** 2"),
+ njs_str("0") },
+
+ { njs_str("-3 ** 2"),
+ njs_str("SyntaxError: Either left-hand side or entire exponentiation "
+ "must be parenthesized in 1") },
+
+ { njs_str("-(3) ** 2"),
+ njs_str("SyntaxError: Either left-hand side or entire exponentiation "
+ "must be parenthesized in 1") },
+
+ { njs_str("-(3 ** 2)"),
+ njs_str("-9") },
+
+ { njs_str("(-3) ** 2"),
+ njs_str("9") },
+
+ { njs_str("1 ** NaN"),
+ njs_str("NaN") },
+
+ { njs_str("'a' ** -0"),
+ njs_str("1") },
+
+ { njs_str("1.1 ** Infinity"),
+ njs_str("Infinity") },
+
+ { njs_str("(-1.1) ** -Infinity"),
+ njs_str("0") },
+
+ { njs_str("(-1) ** Infinity"),
+ njs_str("NaN") },
+
+ { njs_str("1 ** -Infinity"),
+ njs_str("NaN") },
+
+ { njs_str("(-0.9) ** Infinity"),
+ njs_str("0") },
+
+ { njs_str("0.9 ** -Infinity"),
+ njs_str("Infinity") },
+
+ { njs_str("'Infinity' ** 0.1"),
+ njs_str("Infinity") },
+
+ { njs_str("Infinity ** '-0.1'"),
+ njs_str("0") },
+
+ { njs_str("(-Infinity) ** 3"),
+ njs_str("-Infinity") },
+
+ { njs_str("'-Infinity' ** '3.1'"),
+ njs_str("Infinity") },
+
+ { njs_str("(-Infinity) ** '-3'"),
+ njs_str("-0") },
+
+ { njs_str("'-Infinity' ** -2"),
+ njs_str("0") },
+
+ { njs_str("'0' ** 0.1"),
+ njs_str("0") },
+
+#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
+ { njs_str("0 ** '-0.1'"),
+ njs_str("Infinity") },
+#endif
+
+ { njs_str("(-0) ** 3"),
+ njs_str("-0") },
+
+ { njs_str("'-0' ** '3.1'"),
+ njs_str("0") },
+
+ { njs_str("(-0) ** '-3'"),
+ njs_str("-Infinity") },
+
+#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
+ { njs_str("'-0' ** -2"),
+ njs_str("Infinity") },
+#endif
+
+ { njs_str("(-3) ** 0.1"),
+ njs_str("NaN") },
+
+ { njs_str("var a = 0.1; a **= -2"),
+ njs_str("99.99999999999999") },
+
+ { njs_str("var a = 1; a **= NaN"),
+ njs_str("NaN") },
+
+ { njs_str("var a = 'a'; a **= -0"),
+ njs_str("1") },
+
+ { njs_str("var a = 1.1; a **= Infinity"),
+ njs_str("Infinity") },
+
+ { njs_str("var a = -1.1; a **= -Infinity"),
+ njs_str("0") },
+
+ { njs_str("var a = -1; a **= Infinity"),
+ njs_str("NaN") },
+
+ { njs_str("var a = 1; a **= -Infinity"),
+ njs_str("NaN") },
+
+ { njs_str("var a = -0.9; a **= Infinity"),
+ njs_str("0") },
+
+ { njs_str("var a = 0.9; a **= -Infinity"),
+ njs_str("Infinity") },
+
+ { njs_str("var a = 'Infinity'; a **= 0.1"),
+ njs_str("Infinity") },
+
+ { njs_str("var a = Infinity; a **= '-0.1'"),
+ njs_str("0") },
+
+ { njs_str("var a = -Infinity; a **= 3"),
+ njs_str("-Infinity") },
+
+ { njs_str("var a = '-Infinity'; a **= '3.1'"),
+ njs_str("Infinity") },
+
+ { njs_str("var a = -Infinity; a **= '-3'"),
+ njs_str("-0") },
+
+ { njs_str("var a = '-Infinity'; a **= -2"),
+ njs_str("0") },
+
+ { njs_str("var a = '0'; a **= 0.1"),
+ njs_str("0") },
+
+#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
+ { njs_str("var a = 0; a **= '-0.1'"),
+ njs_str("Infinity") },
+#endif
+
+ { njs_str("var a = -0; a **= 3"),
+ njs_str("-0") },
+
+ { njs_str("var a = '-0'; a **= '3.1'"),
+ njs_str("0") },
+
+ { njs_str("var a = -0; a **= '-3'"),
+ njs_str("-Infinity") },
+
+#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
+ { njs_str("var a = '-0'; a **= -2"),
+ njs_str("Infinity") },
+#endif
+
+ { njs_str("var a = -3; a **= 0.1"),
+ njs_str("NaN") },
+
+ /**/
+
+ { njs_str("12 | 6"),
+ njs_str("14") },
+
+ { njs_str("12 | 'abc'"),
+ njs_str("12") },
+
+ { njs_str("-1 | 0"),
+ njs_str("-1") },
+
+ { njs_str("-2147483648 | 0"),
+ njs_str("-2147483648") },
+
+ { njs_str("1024.9 | 0"),
+ njs_str("1024") },
+
+ { njs_str("-1024.9 | 0"),
+ njs_str("-1024") },
+
+ { njs_str("9007199254740991 | 0"),
+ njs_str("-1") },
+
+ { njs_str("9007199254740992 | 0"),
+ njs_str("0") },
+
+ { njs_str("9007199254740993 | 0"),
+ njs_str("0") },
+
+#if 0
+ { njs_str("9223372036854775808 | 0"),
+ njs_str("0") },
+#endif
+
+ { njs_str("9223372036854777856 | 0"),
+ njs_str("2048") },
+
+ { njs_str("-9223372036854777856 | 0"),
+ njs_str("-2048") },
+
+ { njs_str("NaN | 0"),
+ njs_str("0") },
+
+ { njs_str("-NaN | 0"),
+ njs_str("0") },
+
+ { njs_str("Infinity | 0"),
+ njs_str("0") },
+
+ { njs_str("-Infinity | 0"),
+ njs_str("0") },
+
+ { njs_str("+0 | 0"),
+ njs_str("0") },
+
+ { njs_str("-0 | 0"),
+ njs_str("0") },
+
+ { njs_str("32.5 << 2.4"),
+ njs_str("128") },
+
+ { njs_str("32.5 << 'abc'"),
+ njs_str("32") },
+
+ { njs_str("'abc' << 2"),
+ njs_str("0") },
+
+ { njs_str("-1 << 0"),
+ njs_str("-1") },
+
+ { njs_str("-1 << -1"),
+ njs_str("-2147483648") },
+
+ { njs_str("-2147483648 << 0"),
+ njs_str("-2147483648") },
+
+#if 0
+ { njs_str("9223372036854775808 << 0"),
+ njs_str("0") },
+#endif
+
+ { njs_str("9223372036854777856 << 0"),
+ njs_str("2048") },
+
+ { njs_str("-9223372036854777856 << 0"),
+ njs_str("-2048") },
+
+ { njs_str("NaN << 0"),
+ njs_str("0") },
+
+ { njs_str("32.5 >> 2.4"),
+ njs_str("8") },
+
+ { njs_str("-1 >> 30"),
+ njs_str("-1") },
+
+ { njs_str("'abc' >> 2"),
+ njs_str("0") },
+
+ { njs_str("-1 >> 0"),
+ njs_str("-1") },
+
+ { njs_str("-1 >> -1"),
+ njs_str("-1") },
+
+ { njs_str("-2147483648 >> 0"),
+ njs_str("-2147483648") },
+
+ { njs_str("-2147483648 >> -1"),
+ njs_str("-1") },
+
+#if 0
+ { njs_str("9223372036854775808 >> 0"),
+ njs_str("0") },
+#endif
+
+ { njs_str("9223372036854777856 >> 0"),
+ njs_str("2048") },
+
+ { njs_str("-9223372036854777856 >> 0"),
+ njs_str("-2048") },
+
+ { njs_str("NaN >> 0"),
+ njs_str("0") },
+
+ { njs_str("-1 >>> 30"),
+ njs_str("3") },
+
+ { njs_str("NaN >>> 1"),
+ njs_str("0") },
+
+#if 0
+ { njs_str("9223372036854775808 >>> 1"),
+ njs_str("0") },
+#endif
+
+ { njs_str("-1 >>> 0"),
+ njs_str("4294967295") },
+
+ { njs_str("-1 >>> -1"),
+ njs_str("1") },
+
+ { njs_str("-2147483648 >>> 0"),
+ njs_str("2147483648") },
+
+ { njs_str("-2147483648 >>> -1"),
+ njs_str("1") },
+
+#if 0
+ { njs_str("9223372036854775808 >>> 0"),
+ njs_str("0") },
+#endif
+
+ { njs_str("9223372036854777856 >>> 0"),
+ njs_str("2048") },
+
+ { njs_str("-9223372036854777856 >>> 0"),
+ njs_str("4294965248") },
+
+ { njs_str("NaN >>> 0"),
+ njs_str("0") },
+
+ { njs_str("!2"),
+ njs_str("false") },
+
+ /**/
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; ~a"),
+ njs_str("-2") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } }; ~a"),
+ njs_str("-2") },
+
+ /**/
+
+ { njs_str("1 || 2"),
+ njs_str("1") },
+
+ { njs_str("var a = 1; 1 || (a = 2); a"),
+ njs_str("1") },
+
+ { njs_str("var x; x = 0 || x; x"),
+ njs_str("undefined") },
+
+ { njs_str("var x; x = 1 && x; x"),
+ njs_str("undefined") },
+
+ { njs_str("1 || 2 || 3"),
+ njs_str("1") },
+
+ { njs_str("1 || (2 + 2) || 3"),
+ njs_str("1") },
+
+ { njs_str("1 && 2"),
+ njs_str("2") },
+
+ { njs_str("1 && 2 && 3"),
+ njs_str("3") },
+
+ { njs_str("var a = 1; 0 && (a = 2); a"),
+ njs_str("1") },
+
+ { njs_str("false && true || true"),
+ njs_str("true") },
+
+ { njs_str("false && (true || true)"),
+ njs_str("false") },
+
+ { njs_str("var a = true; a = -~!a"),
+ njs_str("1") },
+
+ { njs_str("12 & 6"),
+ njs_str("4") },
+
+ { njs_str("-1 & 65536"),
+ njs_str("65536") },
+
+ { njs_str("-2147483648 & 65536"),
+ njs_str("0") },
+
+#if 0
+ { njs_str("9223372036854775808 & 65536"),
+ njs_str("0") },
+#endif
+
+ { njs_str("NaN & 65536"),
+ njs_str("0") },
+
+ { njs_str("12 ^ 6"),
+ njs_str("10") },
+
+ { njs_str("-1 ^ 65536"),
+ njs_str("-65537") },
+
+ { njs_str("-2147483648 ^ 65536"),
+ njs_str("-2147418112") },
+
+#if 0
+ { njs_str("9223372036854775808 ^ 65536"),
+ njs_str("65536") },
+#endif
+
+ { njs_str("NaN ^ 65536"),
+ njs_str("65536") },
+
+ { njs_str("var x = '1'; +x + 2"),
+ njs_str("3") },
+
+ /* Weird things. */
+
+ { njs_str("'3' -+-+-+ '1' + '1' / '3' * '6' + '2'"),
+ njs_str("42") },
+
+ { njs_str("((+!![])+(+!![])+(+!![])+(+!![])+[])+((+!![])+(+!![])+[])"),
+ njs_str("42") },
+
+ { njs_str("1+[[]+[]]-[]+[[]-[]]-1"),
+ njs_str("9") },
+
+ { njs_str("[[]+[]]-[]+[[]-[]]"),
+ njs_str("00") },
+
+ { njs_str("!--[][1]"),
+ njs_str("true") },
+
+ { njs_str("[].concat[1,2,3]"),
+ njs_str("undefined") },
+
+ /**/
+
+ { njs_str("'true' == true"),
+ njs_str("false") },
+
+ { njs_str("null == false"),
+ njs_str("false") },
+
+ { njs_str("0 == null"),
+ njs_str("false") },
+
+ { njs_str("!null"),
+ njs_str("true") },
+
+ { njs_str("0 === -0"),
+ njs_str("true") },
+
+ { njs_str("1/-0"),
+ njs_str("-Infinity") },
+
+ { njs_str("1/0 === 1/-0"),
+ njs_str("false") },
+
+ { njs_str("1 == true"),
+ njs_str("true") },
+
+ { njs_str("NaN === NaN"),
+ njs_str("false") },
+
+ { njs_str("NaN !== NaN"),
+ njs_str("true") },
+
+ { njs_str("NaN == NaN"),
+ njs_str("false") },
+
+ { njs_str("NaN != NaN"),
+ njs_str("true") },
+
+ { njs_str("NaN == false"),
+ njs_str("false") },
+
+ { njs_str("Infinity == Infinity"),
+ njs_str("true") },
+
+ { njs_str("-Infinity == -Infinity"),
+ njs_str("true") },
+
+ { njs_str("-Infinity < Infinity"),
+ njs_str("true") },
+
+ { njs_str("Infinity - Infinity"),
+ njs_str("NaN") },
+
+ { njs_str("Infinity - -Infinity"),
+ njs_str("Infinity") },
+
+ { njs_str("undefined == 0"),
+ njs_str("false") },
+
+ { njs_str("undefined == null"),
+ njs_str("true") },
+
+ { njs_str("'1' == 1"),
+ njs_str("true") },
+
+ { njs_str("'1a' == '1'"),
+ njs_str("false") },
+
+ { njs_str("'abc' == 'abc'"),
+ njs_str("true") },
+
+ { njs_str("'abc' < 'abcde'"),
+ njs_str("true") },
+
+ { njs_str("0 == ''"),
+ njs_str("true") },
+
+ { njs_str("0 == ' '"),
+ njs_str("true") },
+
+ { njs_str("0 == ' '"),
+ njs_str("true") },
+
+ { njs_str("0 == '0'"),
+ njs_str("true") },
+
+ { njs_str("0 == ' 0 '"),
+ njs_str("true") },
+
+ { njs_str("0 == '000'"),
+ njs_str("true") },
+
+ { njs_str("'0' == ''"),
+ njs_str("false") },
+
+ { njs_str("1 < 2"),
+ njs_str("true") },
+
+ { njs_str("NaN < NaN"),
+ njs_str("false") },
+
+ { njs_str("NaN > NaN"),
+ njs_str("false") },
+
+ { njs_str("undefined < 1"),
+ njs_str("false") },
+
+ { njs_str("[] == false"),
+ njs_str("true") },
+
+ { njs_str("[0] == false"),
+ njs_str("true") },
+
+ { njs_str("[0,0] == false"),
+ njs_str("false") },
+
+ { njs_str("({}) == false"),
+ njs_str("false") },
+
+ { njs_str("new Number(1) == new String('1')"),
+ njs_str("false") },
+
+ { njs_str("var a = Object; a == Object"),
+ njs_str("true") },
+
+ { njs_str("'1' == new Number(1)"),
+ njs_str("true") },
+
+ { njs_str("new String('abc') == 'abc'"),
+ njs_str("true") },
+
+ { njs_str("false == new String('0')"),
+ njs_str("true") },
+
+ { njs_str("var a = { valueOf: function() { return 5 } }; a == 5"),
+ njs_str("true") },
+
+ { njs_str("var a = { valueOf: function() { return '5' } }; a == 5"),
+ njs_str("true") },
+
+ { njs_str("var a = { valueOf: function() { return '5' } }; a == '5'"),
+ njs_str("true") },
+
+ { njs_str("var a = { valueOf: function() { return 5 } }; a == '5'"),
+ njs_str("true") },
+
+ { njs_str("var a = { toString: function() { return true } }; '1' == a"),
+ njs_str("true") },
+
+ { njs_str("var a = { valueOf: function() { return 'b' },"
+ " toString: function() { return 'a' } }; a == 'a'"),
+ njs_str("false") },
+
+ /* Comparisions. */
+
+ { njs_str("1 < 2"),
+ njs_str("true") },
+
+ { njs_str("1 < 1"),
+ njs_str("false") },
+
+ { njs_str("1 <= 1"),
+ njs_str("true") },
+
+ { njs_str("1 <= 2"),
+ njs_str("true") },
+
+ { njs_str("2 > 1"),
+ njs_str("true") },
+
+ { njs_str("1 > 2"),
+ njs_str("false") },
+
+ { njs_str("1 > 1"),
+ njs_str("false") },
+
+ { njs_str("1 >= 1"),
+ njs_str("true") },
+
+ { njs_str("2 >= 1"),
+ njs_str("true") },
+
+ { njs_str("1 >= 2"),
+ njs_str("false") },
+
+ /**/
+
+ { njs_str("null === null"),
+ njs_str("true") },
+
+ { njs_str("null !== null"),
+ njs_str("false") },
+
+ { njs_str("null == null"),
+ njs_str("true") },
+
+ { njs_str("null != null"),
+ njs_str("false") },
+
+ { njs_str("null < null"),
+ njs_str("false") },
+
+ { njs_str("null > null"),
+ njs_str("false") },
+
+ { njs_str("null <= null"),
+ njs_str("true") },
+
+ { njs_str("null >= null"),
+ njs_str("true") },
+
+ /**/
+
+ { njs_str("null === undefined"),
+ njs_str("false") },
+
+ { njs_str("null !== undefined"),
+ njs_str("true") },
+
+ { njs_str("null == undefined"),
+ njs_str("true") },
+
+ { njs_str("null != undefined"),
+ njs_str("false") },
+
+ { njs_str("null < undefined"),
+ njs_str("false") },
+
+ { njs_str("null > undefined"),
+ njs_str("false") },
+
+ { njs_str("null <= undefined"),
+ njs_str("false") },
+
+ { njs_str("null >= undefined"),
+ njs_str("false") },
+
+ /**/
+
+ { njs_str("null === false"),
+ njs_str("false") },
+
+ { njs_str("null !== false"),
+ njs_str("true") },
+
+ { njs_str("null == false"),
+ njs_str("false") },
+
+ { njs_str("null != false"),
+ njs_str("true") },
+
+ { njs_str("null < false"),
+ njs_str("false") },
+
+ { njs_str("null > false"),
+ njs_str("false") },
+
+ { njs_str("null <= false"),
+ njs_str("true") },
+
+ { njs_str("null >= false"),
+ njs_str("true") },
+
+ /**/
+
+ { njs_str("null === true"),
+ njs_str("false") },
+
+ { njs_str("null !== true"),
+ njs_str("true") },
+
+ { njs_str("null == true"),
+ njs_str("false") },
+
+ { njs_str("null != true"),
+ njs_str("true") },
+
+ { njs_str("null < true"),
+ njs_str("true") },
+
+ { njs_str("null > true"),
+ njs_str("false") },
+
+ { njs_str("null <= true"),
+ njs_str("true") },
+
+ { njs_str("null >= true"),
+ njs_str("false") },
+
+ /**/
+
+ { njs_str("Infinity === Infinity"),
+ njs_str("true") },
+
+ { njs_str("Infinity !== Infinity"),
+ njs_str("false") },
+
+ { njs_str("Infinity == Infinity"),
+ njs_str("true") },
+
+ { njs_str("Infinity != Infinity"),
+ njs_str("false") },
+
+ { njs_str("Infinity < Infinity"),
+ njs_str("false") },
+
+ { njs_str("Infinity > Infinity"),
+ njs_str("false") },
+
+ { njs_str("Infinity <= Infinity"),
+ njs_str("true") },
+
+ { njs_str("Infinity >= Infinity"),
+ njs_str("true") },
+
+ /**/
+
+ { njs_str("-Infinity === Infinity"),
+ njs_str("false") },
+
+ { njs_str("-Infinity !== Infinity"),
+ njs_str("true") },
+
+ { njs_str("-Infinity == Infinity"),
+ njs_str("false") },
+
+ { njs_str("-Infinity != Infinity"),
+ njs_str("true") },
+
+ { njs_str("-Infinity < Infinity"),
+ njs_str("true") },
+
+ { njs_str("-Infinity > Infinity"),
+ njs_str("false") },
+
+ { njs_str("-Infinity <= Infinity"),
+ njs_str("true") },
+
+ { njs_str("-Infinity >= Infinity"),
+ njs_str("false") },
+
+ /**/
+
+ { njs_str("NaN === NaN"),
+ njs_str("false") },
+
+ { njs_str("NaN !== NaN"),
+ njs_str("true") },
+
+ { njs_str("NaN == NaN"),
+ njs_str("false") },
+
+ { njs_str("NaN != NaN"),
+ njs_str("true") },
+
+ { njs_str("NaN < NaN"),
+ njs_str("false") },
+
+ { njs_str("NaN > NaN"),
+ njs_str("false") },
+
+ { njs_str("NaN >= NaN"),
+ njs_str("false") },
+
+ { njs_str("NaN <= NaN"),
+ njs_str("false") },
+
+ /**/
+
+ { njs_str("null < 0"),
+ njs_str("false") },
+
+ { njs_str("null < 1"),
+ njs_str("true") },
+
+ { njs_str("null < NaN"),
+ njs_str("false") },
+
+ { njs_str("null < -Infinity"),
+ njs_str("false") },
+
+ { njs_str("null < Infinity"),
+ njs_str("true") },
+
+ { njs_str("null < 'null'"),
+ njs_str("false") },
+
+ { njs_str("null < '1'"),
+ njs_str("true") },
+
+ { njs_str("null < [1]"),
+ njs_str("true") },
+
+ { njs_str("null < ({})"),
+ njs_str("false") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; null < a"),
+ njs_str("true") },
+
+ { njs_str("var a = { valueOf: function() { return 'null' } };null < a"),
+ njs_str("false") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } }; null < a"),
+ njs_str("true") },
+
+ { njs_str("1 < {valueOf: ()=>{throw 'x'}}"),
+ njs_str("x") },
+
+ { njs_str("({valueOf: ()=>{throw 'x'}}) <= ({valueOf:()=>{throw 'y'}})"),
+ njs_str("x") },
+
+ { njs_str("({valueOf:()=>{throw 'x'}}) > ({valueOf:()=>{throw 'y'}})"),
+ njs_str("x") },
+
+ /**/
+
+ { njs_str("undefined == undefined"),
+ njs_str("true") },
+
+ { njs_str("undefined != undefined"),
+ njs_str("false") },
+
+ { njs_str("undefined === undefined"),
+ njs_str("true") },
+
+ { njs_str("undefined !== undefined"),
+ njs_str("false") },
+
+ { njs_str("undefined < undefined"),
+ njs_str("false") },
+
+ { njs_str("undefined < null"),
+ njs_str("false") },
+
+ { njs_str("undefined < false"),
+ njs_str("false") },
+
+ { njs_str("undefined < true"),
+ njs_str("false") },
+
+ { njs_str("undefined < 0"),
+ njs_str("false") },
+
+ { njs_str("undefined < 1"),
+ njs_str("false") },
+
+ { njs_str("undefined < NaN"),
+ njs_str("false") },
+
+ { njs_str("undefined < -Infinity"),
+ njs_str("false") },
+
+ { njs_str("undefined < Infinity"),
+ njs_str("false") },
+
+ { njs_str("undefined < 'undefined'"),
+ njs_str("false") },
+
+ { njs_str("undefined < '1'"),
+ njs_str("false") },
+
+ { njs_str("undefined < [1]"),
+ njs_str("false") },
+
+ { njs_str("undefined < ({})"),
+ njs_str("false") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; undefined < a"),
+ njs_str("false") },
+
+ { njs_str("var a = { valueOf: function() { return 'undefined' } };"
+ "undefined < a"),
+ njs_str("false") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } };"
+ "undefined < a"),
+ njs_str("false") },
+
+ /**/
+
+ { njs_str("false < 1"),
+ njs_str("true") },
+
+ { njs_str("true < 1"),
+ njs_str("false") },
+
+ { njs_str("-1 < 1"),
+ njs_str("true") },
+
+ { njs_str("-1 < '1'"),
+ njs_str("true") },
+
+ { njs_str("NaN < NaN"),
+ njs_str("false") },
+
+ { njs_str("-Infinity < Infinity"),
+ njs_str("true") },
+
+ { njs_str("Infinity < -Infinity"),
+ njs_str("false") },
+
+ { njs_str("1 < 'abc'"),
+ njs_str("false") },
+
+ /**/
+
+ { njs_str("[] === []"),
+ njs_str("false") },
+
+ { njs_str("[] !== []"),
+ njs_str("true") },
+
+ { njs_str("[] == []"),
+ njs_str("false") },
+
+ { njs_str("[] != []"),
+ njs_str("true") },
+
+ { njs_str("[] < []"),
+ njs_str("false") },
+
+ { njs_str("[] > []"),
+ njs_str("false") },
+
+ { njs_str("[] >= []"),
+ njs_str("true") },
+
+ { njs_str("[] <= []"),
+ njs_str("true") },
+
+ /**/
+
+ { njs_str("({}) === ({})"),
+ njs_str("false") },
+
+ { njs_str("({}) !== ({})"),
+ njs_str("true") },
+
+ { njs_str("({}) == ({})"),
+ njs_str("false") },
+
+ { njs_str("({}) != ({})"),
+ njs_str("true") },
+
+ { njs_str("({}) > ({})"),
+ njs_str("false") },
+
+ { njs_str("({}) <= ({})"),
+ njs_str("true") },
+
+ { njs_str("({}) >= ({})"),
+ njs_str("true") },
+
+ /**/
+
+ { njs_str("[0] == ({})"),
+ njs_str("false") },
+
+ { njs_str("[0] != ({})"),
+ njs_str("true") },
+
+ { njs_str("[0] <= ({})"),
+ njs_str("true") },
+
+ { njs_str("[0] >= ({})"),
+ njs_str("false") },
+
+ /**/
+ { njs_str("new String('1') > new Number(1)"),
+ njs_str("false") },
+
+ { njs_str("new Boolean(true) > '1'"),
+ njs_str("false") },
+
+ { njs_str("'0' >= new Number(1)"),
+ njs_str("false") },
+
+ { njs_str("'1' >= new Number(1)"),
+ njs_str("true") },
+
+ { njs_str("new String('1') < new Number(1)"),
+ njs_str("false") },
+
+ { njs_str("new Boolean(true) < '1'"),
+ njs_str("false") },
+
+ { njs_str("new String('1') <= new Number(1)"),
+ njs_str("true") },
+
+ { njs_str("new Boolean(true) <= '1'"),
+ njs_str("true") },
+
+ { njs_str("'-1' < {valueOf: function() {return -2}}"),
+ njs_str("false") },
+
+ { njs_str("new 0[isNaN]"),
+ njs_str("TypeError: (intermediate value)[\"[object Function]\"] is not a function") },
+
+ { njs_str("new 0[undefined]"),
+ njs_str("TypeError: (intermediate value)[\"undefined\"] is not a function") },
+
+ /**/
+
+ { njs_str("var a; a = 1 ? 2 : 3"),
+ njs_str("2") },
+
+ { njs_str("var a; a = 1 ? 2 : 3 ? 4 : 5"),
+ njs_str("2") },
+
+ { njs_str("var a; a = 0 ? 2 : 3 ? 4 : 5"),
+ njs_str("4") },
+
+ { njs_str("0 ? 2 ? 3 : 4 : 5"),
+ njs_str("5") },
+
+ { njs_str("1 ? 2 ? 3 : 4 : 5"),
+ njs_str("3") },
+
+ { njs_str("1 ? 0 ? 3 : 4 : 5"),
+ njs_str("4") },
+
+ { njs_str("(1 ? 0 : 3) ? 4 : 5"),
+ njs_str("5") },
+
+ { njs_str("var a; a = (1 + 2) ? 2 ? 3 + 4 : 5 : 6"),
+ njs_str("7") },
+
+ { njs_str("var a; a = (1 ? 2 : 3) + 4"),
+ njs_str("6") },
+
+ { njs_str("var a, b; a = 1 ? b = 2 + 4 : b = 3"),
+ njs_str("6") },
+
+ { njs_str("var a; a = 1 ? [1,2] : []"),
+ njs_str("1,2") },
+
+ /**/
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; +a"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } }; +a"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; -a"),
+ njs_str("-1") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } }; -a"),
+ njs_str("-1") },
+
+ /* Increment. */
+
+ { njs_str("var a = 1; ++a"),
+ njs_str("2") },
+
+ { njs_str("var a = '1'; ++a"),
+ njs_str("2") },
+
+ { njs_str("var a = [1]; ++a"),
+ njs_str("2") },
+
+ { njs_str("var a = {}; ++a"),
+ njs_str("NaN") },
+
+ { njs_str("var a = [1,2,3]; var b = 1; b = ++a[b]; b + ' '+ a"),
+ njs_str("3 1,3,3") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } };"
+ "++a +' '+ a +' '+ typeof a"),
+ njs_str("2 2 number") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } };"
+ "++a +' '+ a +' '+ typeof a"),
+ njs_str("2 2 number") },
+
+ { njs_str("var a = { valueOf: function() { return [1] } };"
+ "++a +' '+ a +' '+ typeof a"),
+ njs_str("NaN NaN number") },
+
+ { njs_str("var a = { valueOf: function() { return {} } };"
+ "++a +' '+ a +' '+ typeof a"),
+ njs_str("NaN NaN number") },
+
+ /**/
+
+ { njs_str("var a = 1; a = ++a"),
+ njs_str("2") },
+
+ { njs_str("var a = '1'; a = ++a"),
+ njs_str("2") },
+
+ { njs_str("var a = [1]; a = ++a"),
+ njs_str("2") },
+
+ { njs_str("var a = {}; a = ++a"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; a = ++a"),
+ njs_str("2") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } }; a = ++a"),
+ njs_str("2") },
+
+ { njs_str("var a = { valueOf: function() { return [1] } }; a = ++a"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } }; a = ++a"),
+ njs_str("NaN") },
+
+ /**/
+
+ { njs_str("var a = 1; var b = ++a; a +' '+ b"),
+ njs_str("2 2") },
+
+ { njs_str("var a = '1'; var b = ++a; a +' '+ b"),
+ njs_str("2 2") },
+
+ { njs_str("var a = [1]; var b = ++a; a +' '+ b"),
+ njs_str("2 2") },
+
+ { njs_str("var a = {}; var b = ++a; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } };"
+ "var b = ++a; a +' '+ b"),
+ njs_str("2 2") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } };"
+ "var b = ++a; a +' '+ b"),
+ njs_str("2 2") },
+
+ { njs_str("var a = { valueOf: function() { return [1] } };"
+ "var b = ++a; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } };"
+ "var b = ++a; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ /* Post increment. */
+
+ { njs_str("var a = 1; a++"),
+ njs_str("1") },
+
+ { njs_str("var a = '1'; a++"),
+ njs_str("1") },
+
+ { njs_str("var a = [1]; a++"),
+ njs_str("1") },
+
+ { njs_str("var a = {}; a++"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; a++"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } }; a++"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return [1] } }; a++"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } }; a++"),
+ njs_str("NaN") },
+
+ /**/
+
+ { njs_str("var a = 1; a = a++"),
+ njs_str("1") },
+
+ { njs_str("var a = '1'; a = a++"),
+ njs_str("1") },
+
+ { njs_str("var a = [1]; a = a++"),
+ njs_str("1") },
+
+ { njs_str("var a = {}; a = a++"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; a = a++"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } }; a = a++"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return [1] } }; a = a++"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } }; a = a++"),
+ njs_str("NaN") },
+
+ /**/
+
+ { njs_str("var a = 1; var b = a++; a +' '+ b"),
+ njs_str("2 1") },
+
+ { njs_str("var a = '1'; var b = a++; a +' '+ b"),
+ njs_str("2 1") },
+
+ { njs_str("var a = [1]; var b = a++; a +' '+ b"),
+ njs_str("2 1") },
+
+ { njs_str("var a = {}; var b = a++; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } };"
+ "var b = a++; a +' '+ b"),
+ njs_str("2 1") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } };"
+ "var b = a++; a +' '+ b"),
+ njs_str("2 1") },
+
+ { njs_str("var a = { valueOf: function() { return [1] } };"
+ "var b = a++; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } };"
+ "var b = a++; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ /* Decrement. */
+
+ { njs_str("var a = 1; --a"),
+ njs_str("0") },
+
+ { njs_str("var a = '1'; --a"),
+ njs_str("0") },
+
+ { njs_str("var a = [1]; --a"),
+ njs_str("0") },
+
+ { njs_str("var a = {}; --a"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1} }; --a"),
+ njs_str("0") },
+
+ { njs_str("var a = { valueOf: function() { return '1'} }; --a"),
+ njs_str("0") },
+
+ { njs_str("var a = { valueOf: function() { return [1]} }; --a"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } }; --a"),
+ njs_str("NaN") },
+
+ /**/
+
+ { njs_str("var a = 1; a = --a"),
+ njs_str("0") },
+
+ { njs_str("var a = '1'; a = --a"),
+ njs_str("0") },
+
+ { njs_str("var a = [1]; a = --a"),
+ njs_str("0") },
+
+ { njs_str("var a = {}; a = --a"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1} }; a = --a"),
+ njs_str("0") },
+
+ { njs_str("var a = { valueOf: function() { return '1'} }; a = --a"),
+ njs_str("0") },
+
+ { njs_str("var a = { valueOf: function() { return [1]} }; a = --a"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } }; a = --a"),
+ njs_str("NaN") },
+
+ /**/
+
+ { njs_str("var a = 1; var b = --a; a +' '+ b"),
+ njs_str("0 0") },
+
+ { njs_str("var a = '1'; var b = --a; a +' '+ b"),
+ njs_str("0 0") },
+
+ { njs_str("var a = [1]; var b = --a; a +' '+ b"),
+ njs_str("0 0") },
+
+ { njs_str("var a = {}; var b = --a; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } };"
+ "var b = --a; a +' '+ b"),
+ njs_str("0 0") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } };"
+ "var b = --a; a +' '+ b"),
+ njs_str("0 0") },
+
+ { njs_str("var a = { valueOf: function() { return [1] } };"
+ "var b = --a; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } };"
+ "var b = --a; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ /* Post decrement. */
+
+ { njs_str("var a = 1; a--"),
+ njs_str("1") },
+
+ { njs_str("var a = '1'; a--"),
+ njs_str("1") },
+
+ { njs_str("var a = [1]; a--"),
+ njs_str("1") },
+
+ { njs_str("var a = {}; a--"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; a--"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } }; a--"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return [1] } }; a--"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } }; a--"),
+ njs_str("NaN") },
+
+ /**/
+
+ { njs_str("var a = 1; a = a--"),
+ njs_str("1") },
+
+ { njs_str("var a = '1'; a = a--"),
+ njs_str("1") },
+
+ { njs_str("var a = [1]; a = a--"),
+ njs_str("1") },
+
+ { njs_str("var a = {}; a = a--"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; a = a--"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } }; a = a--"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return [1] } }; a = a--"),
+ njs_str("NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } }; a = a--"),
+ njs_str("NaN") },
+
+ /**/
+
+ { njs_str("var a = 1; var b = a--; a +' '+ b"),
+ njs_str("0 1") },
+
+ { njs_str("var a = '1'; var b = a--; a +' '+ b"),
+ njs_str("0 1") },
+
+ { njs_str("var a = [1]; var b = a--; a +' '+ b"),
+ njs_str("0 1") },
+
+ { njs_str("var a = {}; var b = a--; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } };"
+ "var b = a--; a +' '+ b"),
+ njs_str("0 1") },
+
+ { njs_str("var a = { valueOf: function() { return '1' } };"
+ "var b = a--; a +' '+ b"),
+ njs_str("0 1") },
+
+ { njs_str("var a = { valueOf: function() { return [1] } };"
+ "var b = a--; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ { njs_str("var a = { valueOf: function() { return {} } };"
+ "var b = a--; a +' '+ b"),
+ njs_str("NaN NaN") },
+
+ /**/
+
+ { njs_str("var a, b; a = 2; b = ++a + ++a; a + ' ' + b"),
+ njs_str("4 7") },
+
+ { njs_str("var a, b; a = 2; b = a++ + a++; a + ' ' + b"),
+ njs_str("4 5") },
+
+ { njs_str("var a, b; a = b = 7; a +' '+ b"),
+ njs_str("7 7") },
+
+ { njs_str("var a, b, c; a = b = c = 5; a +' '+ b +' '+ c"),
+ njs_str("5 5 5") },
+
+ { njs_str("var a, b, c; a = b = (c = 5) + 2; a +' '+ b +' '+ c"),
+ njs_str("7 7 5") },
+
+ { njs_str("1, 2 + 5, 3"),
+ njs_str("3") },
+
+ { njs_str("var a, b; a = 1 /* YES */\n b = a + 2 \n \n + 1 \n + 3"),
+ njs_str("7") },
+
+ { njs_str("var a, b; a = 1 // YES \n b = a + 2 \n \n + 1 \n + 3"),
+ njs_str("7") },
+
+ { njs_str("var a; a = 0; ++ \n a"),
+ njs_str("1") },
+
+ { njs_str("var a; a = 0\n ++a"),
+ njs_str("1") },
+
+ { njs_str("a = 0; a \n ++"),
+ njs_str("SyntaxError: Unexpected end of input in 2") },
+
+ { njs_str("a = 0; a \n --"),
+ njs_str("SyntaxError: Unexpected end of input in 2") },
+
+ { njs_str("var a = 0; a \n + 1"),
+ njs_str("1") },
+
+ { njs_str("var a = 0; a \n +\n 1"),
+ njs_str("1") },
+
+ { njs_str("var a; a = 1 ? 2 \n : 3"),
+ njs_str("2") },
+
+ { njs_str("var a, b, c;"
+ "a = 0 / 0; b = 1 / 0; c = -1 / 0; a +' '+ b +' '+ c"),
+ njs_str("NaN Infinity -Infinity") },
+
+ { njs_str("var a, b; a = (b = 7) + 5; var c; a +' '+ b +' '+ c"),
+ njs_str("12 7 undefined") },
+
+ { njs_str("var a, b = 1, c; a +' '+ b +' '+ c"),
+ njs_str("undefined 1 undefined") },
+
+ { njs_str("var a = 1, b = a + 1; a +' '+ b"),
+ njs_str("1 2") },
+
+ { njs_str("var a; a = a = 1"),
+ njs_str("1") },
+
+ { njs_str("var a = 1, \n b; a +' '+ b"),
+ njs_str("1 undefined") },
+
+ { njs_str("var a; a = b + 1; var b; a +' '+ b"),
+ njs_str("NaN undefined") },
+
+ { njs_str("var a += 1"),
+ njs_str("SyntaxError: Unexpected token \"+=\" in 1") },
+
+ { njs_str("var a = a + 1"),
+ njs_str("undefined") },
+
+ { njs_str("var a; a = b + 1; var b = 1; a +' '+ b"),
+ njs_str("NaN 1") },
+
+ { njs_str("var a; (a) = 1"),
+ njs_str("1") },
+
+ { njs_str("a"),
+ njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+ { njs_str("\na"),
+ njs_str("ReferenceError: \"a\" is not defined in 2") },
+
+ { njs_str("\n\na"),
+ njs_str("ReferenceError: \"a\" is not defined in 3") },
+
+ { njs_str("a + a"),
+ njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+ { njs_str("a = b + 1"),
+ njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+ { njs_str("a = a + 1"),
+ njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+ { njs_str("a += 1"),
+ njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+ { njs_str("a += 1; var a = 2"),
+ njs_str("undefined") },
+
+ { njs_str("var a = 1"),
+ njs_str("undefined") },
+
+ { njs_str("var a = 1; a = (a = 2) + a"),
+ njs_str("4") },
+
+ { njs_str("var a = 1; a = a + (a = 2)"),
+ njs_str("3") },
+
+ { njs_str("var a = 1; a += (a = 2)"),
+ njs_str("3") },
+
+ { njs_str("var a = b = 1; var b; a +' '+ b"),
+ njs_str("1 1") },
+
+ { njs_str("var a \n if (!a) a = 3; a"),
+ njs_str("3") },
+
+ /* automatic semicolon insertion. */
+
+ { njs_str("(a\n--"),
+ njs_str("SyntaxError: Unexpected token \"--\" in 2") },
+
+ { njs_str("(a\n++"),
+ njs_str("SyntaxError: Unexpected token \"++\" in 2") },
+
+ { njs_str("var x = 0, y = 2; x\n--\ny; [x,y]"),
+ njs_str("0,1") },
+
+ /* if. */
+
+ { njs_str("if (0);"),
+ njs_str("undefined") },
+
+ { njs_str("if (0) {}"),
+ njs_str("undefined") },
+
+ { njs_str("if (0);else;"),
+ njs_str("undefined") },
+
+ { njs_str("var a = 1; if (true); else a = 2; a"),
+ njs_str("1") },
+
+ { njs_str("var a = 1; if (false); else a = 2; a"),
+ njs_str("2") },
+
+ { njs_str("var a = 1; if (true) a = 2; else a = 3; a"),
+ njs_str("2") },
+
+ { njs_str("var a = 3; if (true) if (false); else a = 2; a"),
+ njs_str("2") },
+
+ { njs_str("var a = 3; if (true) if (false); else; a = 2; a"),
+ njs_str("2") },
+
+ { njs_str("var a = [3], b; if (1==1||2==2) { b = '1'+'2'+a[0] }; b"),
+ njs_str("123") },
+
+ { njs_str("(function(){ if(true) return 1 else return 0; })()"),
+ njs_str("SyntaxError: Unexpected token \"else\" in 1") },
+
+ { njs_str("(function(){ if(true) return 1; else return 0; })()"),
+ njs_str("1") },
+
+ { njs_str("(function(){ if(true) return 1;; else return 0; })()"),
+ njs_str("SyntaxError: Unexpected token \"else\" in 1") },
+
+ { njs_str("(function(){ if(true) return 1\n else return 0; })()"),
+ njs_str("1") },
+
+ { njs_str("(function(){ if(true) return 1\n;\n else return 0; })()"),
+ njs_str("1") },
+
+ { njs_str("function f(n) {if (n) throw 'foo' else return 1}; f(0)"),
+ njs_str("SyntaxError: Unexpected token \"else\" in 1") },
+
+ { njs_str("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(0)"),
+ njs_str("1") },
+
+ { njs_str("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(1)"),
+ njs_str("foo") },
+
+ { njs_str("function f(n) {if (n == 1) throw 'foo'\nelse if (n == 2) return 1}; f(2)"),
+ njs_str("1") },
+
+ { njs_str("(function(){ for (var p in [1] ){ if (1) break else return 0; }})()"),
+ njs_str("SyntaxError: Unexpected token \"else\" in 1") },
+
+ { njs_str("(function(){ for (var p in [1] ){ if (1) break\n else return 0; }})()"),
+ njs_str("undefined") },
+
+ { njs_str("(function(){ for (var p in [1] ){ if (1) break; else return 0; }})()"),
+ njs_str("undefined") },
+
+ { njs_str("(function(){ for (var p in [1] ){ if (1) continue else return 0; }})()"),
+ njs_str("SyntaxError: Unexpected token \"else\" in 1") },
+
+ { njs_str("(function(){ for (var p in [1] ){ if (1) continue\n else return 0; }})()"),
+ njs_str("undefined") },
+
+ { njs_str("(function(){ for (var p in [1] ){ if (1) continue; else return 0; }})()"),
+ njs_str("undefined") },
+
+ { njs_str("(function(x){ if\n(x) return -1; else return 0; })(0)"),
+ njs_str("0") },
+
+ { njs_str("(function(x){ if\n(\nx) return -1; else return 0; })(0)"),
+ njs_str("0") },
+
+ { njs_str("(function(x){ if\n(\nx)\nreturn -1; else return 0; })(0)"),
+ njs_str("0") },
+
+ { njs_str("(function(x){ if\n(\nx)\nreturn -1\n else return 0; })(0)"),
+ njs_str("0") },
+
+ { njs_str("(function(x){ if\n(\nx)\nreturn -1\n else\nreturn 0; })(0)"),
+ njs_str("0") },
+
+ /* do while. */
+
+ { njs_str("do { break } if (false)"),
+ njs_str("SyntaxError: Unexpected token \"if\" in 1") },
+
+ /* for in. */
+
+ { njs_str("for (null in undefined);"),
+ njs_str("ReferenceError: Invalid left-hand side \"null\" in for-in statement in 1") },
+
+ { njs_str("for (var a, b in []);"),
+ njs_str("SyntaxError: Unexpected token \"in\" in 1") },
+
+ { njs_str("var s = ''; for (var p in [1,2]) {s += p}; s"),
+ njs_str("01") },
+
+ { njs_str("var s; for (var p in [1]) {s = typeof(p)}; s"),
+ njs_str("string") },
+
+ { njs_str("var s = ''; for (var p in {a:1, b:2}) {s += p}; s"),
+ njs_str("ab") },
+
+ { njs_str("var s = '';"
+ "var o = Object.defineProperty({}, 'x', {value:1});"
+ "Object.defineProperty(o, 'y', {value:2, enumerable:true});"
+ "for (var p in o) {s += p}; s"),
+ njs_str("y") },
+
+ { njs_str("var o = {a:1, b:2}; var arr = []; "
+ "for (var a in o) {arr.push(a)}; arr"),
+ njs_str("a,b") },
+
+ { njs_str("var o = {a:1, b:2}; var arr = []; delete o.a; "
+ "for (var a in o) {arr.push(a)}; arr"),
+ njs_str("b") },
+
+ /* switch. */
+
+ { njs_str("switch"),
+ njs_str("SyntaxError: Unexpected end of input in 1") },
+
+ { njs_str("switch (1);"),
+ njs_str("SyntaxError: Unexpected token \";\" in 1") },
+
+ { njs_str("switch (1) { do { } while (1) }"),
+ njs_str("SyntaxError: Unexpected token \"do\" in 1") },
+
+ { njs_str("switch (1) {}"),
+ njs_str("undefined") },
+
+ { njs_str("switch (1) {default:}"),
+ njs_str("undefined") },
+
+ { njs_str("switch (1) {case 0:}"),
+ njs_str("undefined") },
+
+ { njs_str("switch (1) {default:;}"),
+ njs_str("undefined") },
+
+ { njs_str("switch (1) {default:; default:}"),
+ njs_str("SyntaxError: More than one default clause in switch statement in 1") },
+
+ { njs_str("switch (1) {case 0:;}"),
+ njs_str("undefined") },
+
+ { njs_str("var a = 'A'; switch (a) {"
+ "case 0: a += '0';"
+ "case 1: a += '1';"
+ "}; a"),
+ njs_str("A") },
+
+ { njs_str("var a = 'A'; switch (0) {"
+ "case 0: a += '0';"
+ "case 1: a += '1';"
+ "}; a"),
+ njs_str("A01") },
+
+ { njs_str("var a = 'A'; switch (0) {"
+ "case 0: a += '0'; break;"
+ "case 1: a += '1';"
+ "}; a"),
+ njs_str("A0") },
+
+ { njs_str("var a = 'A'; switch (1) {"
+ "case 0: a += '0';"
+ "case 1: a += '1';"
+ "}; a"),
+ njs_str("A1") },
+
+ { njs_str("var a = 'A'; switch (2) {"
+ "case 0: a += '0';"
+ "case 1: a += '1';"
+ "default: a += 'D';"
+ "}; a"),
+ njs_str("AD") },
+
+ { njs_str("var a = 'A'; switch (2) {"
+ "case 0: a += '0';"
+ "default: a += 'D';"
+ "case 1: a += '1';"
+ "}; a"),
+ njs_str("AD1") },
+
+ { njs_str("var a = 'A'; function f(x) { a += x; return 0 }"
+ "switch (a) {"
+ "case f(1):"
+ "default:"
+ "case f(2): a += 'D';"
+ "case f(3): a += 'T';"
+ "} a"),
+ njs_str("A123DT") },
+
+ { njs_str("var t; "
+ "switch ($r3.uri) {"
+ "case 'abc': "
+ " t='A'; "
+ " break; "
+ "default: "
+ " t='F'; "
+ "}; t"),
+ njs_str("A") },
+
+ /* continue. */
+
+ { njs_str("continue"),
+ njs_str("SyntaxError: Illegal continue statement in 1") },
+
+ { njs_str("\n{\ncontinue;\n}"),
+ njs_str("SyntaxError: Illegal continue statement in 3") },
+
+ { njs_str("do continue while (false)"),
+ njs_str("SyntaxError: Unexpected token \"while\" in 1") },
+
+ { njs_str("do continue; while (false)"),
+ njs_str("undefined") },
+
+ { njs_str("do { continue } while (false)"),
+ njs_str("undefined") },
+
+ { njs_str("var i = 0; do if (i++ > 9) continue; while (i < 100); i"),
+ njs_str("100") },
+
+ { njs_str("while (false) continue"),
+ njs_str("undefined") },
+
+ { njs_str("while (false) continue;"),
+ njs_str("undefined") },
+
+ { njs_str("while (false) { continue }"),
+ njs_str("undefined") },
+
+ { njs_str("var i = 0; while (i < 100) if (i++ > 9) continue; i"),
+ njs_str("100") },
+
+ { njs_str("for ( ;null; ) continue"),
+ njs_str("undefined") },
+
+ { njs_str("for ( ;null; ) continue;"),
+ njs_str("undefined") },
+
+ { njs_str("for ( ;null; ) { continue }"),
+ njs_str("undefined") },
+
+ { njs_str("var i; for (i = 0; i < 100; i++) if (i > 9) continue; i"),
+ njs_str("100") },
+
+ { njs_str("var a = [], i; for (i in a) continue"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [], i; for (i in a) continue;"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [], i; for (i in a) { continue }"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [1,2,3,4,5]; var s = 0, i;"
+ "for (i in a) { if (a[i] > 4) continue; else s += a[i] } s"),
+ njs_str("10") },
+
+ { njs_str("var a = [1,2,3,4,5]; var s = 0, i;"
+ "for (i in a) { if (a[i] > 4) continue; s += a[i] } s"),
+ njs_str("10") },
+
+ { njs_str("var a; for (a = 1; a; a--) switch (a) { case 0: continue }"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [1,2,3], i; for (i in a) {Object.seal({})}"),
+ njs_str("undefined") },
+
+ { njs_str("var i; for (i in [1,2,3]) {Object.seal({});}"),
+ njs_str("undefined") },
+
+ /* break. */
+
+ { njs_str("break"),
+ njs_str("SyntaxError: Illegal break statement in 1") },
+
+ { njs_str("{break}"),
+ njs_str("SyntaxError: Illegal break statement in 1") },
+
+ { njs_str("\nbreak"),
+ njs_str("SyntaxError: Illegal break statement in 2") },
+
+ { njs_str("do break while (true)"),
+ njs_str("SyntaxError: Unexpected token \"while\" in 1") },
+
+ { njs_str("do break; while (true)"),
+ njs_str("undefined") },
+
+ { njs_str("do { break } while (true)"),
+ njs_str("undefined") },
+
+ { njs_str("var i = 0; do if (i++ > 9) break; while (i < 100); i"),
+ njs_str("11") },
+
+ { njs_str("while (true) break"),
+ njs_str("undefined") },
+
+ { njs_str("while (true) break;"),
+ njs_str("undefined") },
+
+ { njs_str("while (true) { break }"),
+ njs_str("undefined") },
+
+ { njs_str("var i = 0; while (i < 100) if (i++ > 9) break; i"),
+ njs_str("11") },
+
+ { njs_str("for ( ;; ) break"),
+ njs_str("undefined") },
+
+ { njs_str("for ( ;; ) break;"),
+ njs_str("undefined") },
+
+ { njs_str("for ( ;; ) { break }"),
+ njs_str("undefined") },
+
+ { njs_str("var i; for (i = 0; i < 100; i++) if (i > 9) break; i"),
+ njs_str("10") },
+
+ { njs_str("var a = [], i; for (i in a) break"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [], i; for (i in a) break;"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [], i; for (i in a) { break }"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [1,2,3,4,5]; var s = 0, i;"
+ "for (i in a) { if (a[i] > 4) break; else s += a[i] } s"),
+ njs_str("10") },
+
+ { njs_str("var a = [1,2,3,4,5]; var s = 0, i;"
+ "for (i in a) { if (a[i] > 4) break; s += a[i] } s"),
+ njs_str("10") },
+
+ { njs_str("var a = [1,2,3,4,5]; var s = 0, i;"
+ "for (i in a) if (a[i] > 4) break; s += a[i]; s"),
+ njs_str("5") },
+
+ /* Labels. */
+
+ { njs_str("var n = 0; a:{n++}; a:{n++}; n"),
+ njs_str("2") },
+
+ { njs_str("a: throw 'a'"),
+ njs_str("a") },
+
+ { njs_str("a\n:\n1"),
+ njs_str("1") },
+
+ { njs_str("a\n\n:1"),
+ njs_str("1") },
+
+ { njs_str("a:\n\n1"),
+ njs_str("1") },
+
+ { njs_str("a:\n\n"),
+ njs_str("SyntaxError: Unexpected end of input in 3") },
+
+ { njs_str("a : var n = 0; b :++n"),
+ njs_str("1") },
+
+ { njs_str("a:{a:1}"),
+ njs_str("SyntaxError: Label \"a\" has already been declared in 1") },
+
+ { njs_str("for (var i in [1]) {break b}"),
+ njs_str("SyntaxError: Undefined label \"b\" in 1") },
+
+ { njs_str("for (var i in [1]) {continue b}"),
+ njs_str("SyntaxError: Undefined label \"b\" in 1") },
+
+ { njs_str("a:{break b}"),
+ njs_str("SyntaxError: Undefined label \"b\" in 1") },
+
+ { njs_str("a:{continue b}"),
+ njs_str("SyntaxError: Undefined label \"b\" in 1") },
+
+#if 0 /* TODO */
+ { njs_str("a:{1; break a}"),
+ njs_str("1") },
+#endif
+
+ { njs_str("var a = 0; a:{a++}; a"),
+ njs_str("1") },
+
+ { njs_str("var a = 0; a:{break a; a++}; a"),
+ njs_str("0") },
+
+ { njs_str("var r = 0; "
+ "out: for (var i in [1,2,3]) { if (i == 2) {break out;}; r++}; r"),
+ njs_str("2") },
+
+ { njs_str("var r = 0; "
+ "out: for (var i = 0; i < 5; i++) { if (i == 2) {break out;}; r++}; r"),
+ njs_str("2") },
+
+ { njs_str("var l1 = 0, l2 = 0; "
+ "out: "
+ "for (var i in [1,2,3]) { "
+ " for (var j in [1,2,3]) { "
+ " if (i == 1 && j == 1) {break;}"
+ " l2++;"
+ " }"
+ " l1++;"
+ "}; [l1, l2]"),
+ njs_str("3,7") },
+
+ { njs_str("var l1 = 0, l2 = 0; "
+ "out: "
+ "for (var i in [1,2,3]) { "
+ " for (var j in [1,2,3]) { "
+ " if (i == 1 && j == 1) {break out;}"
+ " l2++;"
+ " }"
+ " l1++;"
+ "}; [l1, l2]"),
+ njs_str("1,4") },
+
+ { njs_str("var l1 = 0, l2 = 0; "
+ "out: "
+ "for (var i in [1,2,3]) { "
+ " for (var j in [1,2,3]) { "
+ " if (i == 1 && j == 1) {continue out;}"
+ " l2++;"
+ " }"
+ " l1++;"
+ "}; [l1, l2]"),
+ njs_str("2,7") },
+
+ { njs_str("var l1 = 0, l2 = 0; "
+ "out: "
+ "for (var i in [1,2,3]) { "
+ " l1++;"
+ " switch (i) { "
+ " case '1':"
+ " break out;"
+ " default:"
+ " }"
+ " l2++;"
+ "}; [l1, l2]"),
+ njs_str("2,1") },
+
+ { njs_str("var l1 = 0, l2 = 0; "
+ "out: "
+ "for (var i in [1,2,3]) { "
+ " l1++;"
+ " switch (i) { "
+ " case '1':"
+ " continue out;"
+ " default:"
+ " }"
+ " l2++;"
+ "}; [l1, l2]"),
+ njs_str("3,2") },
+
+ { njs_str("var l1 = 0, l2 = 0, i = 0, j; "
+ "out: "
+ "while (i < 3) { "
+ " j = 0;"
+ " while (j < 3) { "
+ " if (i == 1 && j == 1) {break out;}"
+ " l2++;"
+ " j++;"
+ " }"
+ " l1++;"
+ " i++;"
+ "}; [l1, l2]"),
+ njs_str("1,4") },
+
+ { njs_str("var l1 = 0, l2 = 0, i = 0, j; "
+ "out: "
+ "while (i < 3) { "
+ " j = 0;"
+ " while (j < 3) { "
+ " if (i == 1 && j == 1) {i++; continue out;}"
+ " l2++;"
+ " j++;"
+ " }"
+ " l1++;"
+ " i++;"
+ "}; [l1, l2]"),
+ njs_str("2,7") },
+
+ { njs_str("var l1 = 0, l2 = 0, i = 0, j; "
+ "out: "
+ "do { "
+ " j = 0;"
+ " do { "
+ " if (i == 1 && j == 1) {break out;}"
+ " l2++;"
+ " j++;"
+ " } while (j < 3)"
+ " l1++;"
+ " i++;"
+ "} while (i < 3); [l1, l2]"),
+ njs_str("1,4") },
+
+ { njs_str("var l1 = 0, l2 = 0, i = 0, j; "
+ "out: "
+ "do { "
+ " j = 0;"
+ " do { "
+ " if (i == 1 && j == 1) {i++; continue out;}"
+ " l2++;"
+ " j++;"
+ " } while (j < 3)"
+ " l1++;"
+ " i++;"
+ "} while (i < 3); [l1, l2]"),
+ njs_str("2,7") },
+
+ { njs_str("out1: while (1) { out2: while (1) { "
+ " try { break out1; break out2; } catch (e) {}"
+ "}}"),
+ njs_str("InternalError: break/return instructions with different labels "
+ "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+ { njs_str("out1: while (1) { out2: while (1) { "
+ " try { } catch (e) {break out1; break out2;} finally {}"
+ "}}"),
+ njs_str("InternalError: break/return instructions with different labels "
+ "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+ { njs_str("out1: while (1) { out2: while (1) { "
+ " try { break out1; } catch (e) {break out2;} finally {}"
+ "}}"),
+ njs_str("InternalError: try break/return instructions with different labels "
+ "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+ { njs_str("out1: while (1) { out2: while (1) { "
+ " try { break out1; break out2; } finally {}"
+ "}}"),
+ njs_str("InternalError: break/return instructions with different labels "
+ "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+ { njs_str("out1: while (1) { out2: while (1) { "
+ " try { continue out1; continue out2; } catch (e) {}"
+ "}}"),
+ njs_str("InternalError: continue instructions with different labels "
+ "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+ { njs_str("out1: while (1) { out2: while (1) { "
+ " try { continue out1; } catch (e) {continue out2;} finally {}"
+ "}}"),
+ njs_str("InternalError: try continue instructions with different labels "
+ "(\"out1\" vs \"out2\") from try-catch block are not supported") },
+
+ { njs_str("function f() {"
+ " a:{ try { try { return 'a'; } catch (e) {break a;} finally {} } "
+ " catch (e) {} finally {}; }"
+ "}"),
+ njs_str("InternalError: try break/return instructions with different labels "
+ "(\"@return\" vs \"a\") from try-catch block are not supported") },
+
+ { njs_str("a:{ try { try { continue a; } catch (e) {} finally {} } "
+ " catch (e) {} finally {}; "
+ "}"),
+ njs_str("SyntaxError: Illegal continue statement in 1") },
+
+ { njs_str("var i = 0, j = 0, r = 0;"
+ "out1: while (i < 3) "
+ "{ "
+ " i++;"
+ " out2: while (j < 3) { "
+ " j++; try { break out1; } catch (e) {} finally {r++}"
+ " }"
+ "}; [i, j, r]"),
+ njs_str("1,1,1") },
+
+ { njs_str("var i = 0, j = 0, r = 0;"
+ "out1: while (i < 3) "
+ "{ "
+ " i++;"
+ " out2: while (j < 3) { "
+ " j++; try { continue out1; } catch (e) {} finally {r++}"
+ " }"
+ "}; [i, j, r]"),
+ njs_str("3,3,3") },
+
+ { njs_str("var c=0,fin=0;"
+ "try {"
+ " while (c < 2) {"
+ " try { c += 1; throw 'e';}"
+ " finally { fin = 1; break;}"
+ " fin = -1;"
+ " c += 2;"
+ " }"
+ "} catch(e) {c = 10;}; [c, fin]"),
+ njs_str("1,1") },
+
+ /* jumping out of a nested try-catch block. */
+
+ { njs_str("var r = 0; "
+ "function f () { try { try {return 'a';} finally { r++; }} "
+ " finally { r++; } }; "
+ "[f(), r]"),
+ njs_str("a,2") },
+
+ { njs_str("function f(n) { "
+ " var r1 = 0, r2 = 0, r3 = 0;"
+ " a:{ try { try { "
+ " if (n == 0) { break a; } "
+ " if (n == 1) { throw 'a'; } "
+ " } "
+ " catch (e) { break a; } finally { r1++; } } "
+ " catch (e) {} "
+ " finally { r2++; } "
+ " r3++; "
+ " }; "
+ "return [r1, r2, r3]"
+ "}; njs.dump([f(0), f(1), f(3)])"),
+ njs_str("[[1,1,0],[1,1,0],[1,1,1]]") },
+
+ /**/
+
+ { njs_str("var i; for (i = 0; i < 10; i++) { i += 1 } i"),
+ njs_str("10") },
+
+ /* Factorial. */
+
+ { njs_str("var n = 5, f = 1; while (n--) f *= n + 1; f"),
+ njs_str("120") },
+
+ { njs_str("var n = 5, f = 1; while (n) { f *= n; n-- } f"),
+ njs_str("120") },
+
+ /* Fibonacci. */
+
+ { njs_str("var n = 50, x, i, j, k;"
+ "for(i=0,j=1,k=0; k<n; i=j,j=x,k++ ){ x=i+j } x"),
+ njs_str("20365011074") },
+
+ { njs_str("3 + 'abc' + 'def' + null + true + false + undefined"),
+ njs_str("3abcdefnulltruefalseundefined") },
+
+ { njs_str("var a = 0; do a++; while (a < 5) if (a == 5) a = 7.33 \n"
+ "else a = 8; while (a < 10) a++; a"),
+ njs_str("10.33") },
+
+ /* typeof. */
+
+ { njs_str("typeof null"),
+ njs_str("object") },
+
+ { njs_str("typeof undefined"),
+ njs_str("undefined") },
+
+ { njs_str("typeof false"),
+ njs_str("boolean") },
+
+ { njs_str("typeof true"),
+ njs_str("boolean") },
+
+ { njs_str("typeof 0"),
+ njs_str("number") },
+
+ { njs_str("typeof -1"),
+ njs_str("number") },
+
+ { njs_str("typeof Infinity"),
+ njs_str("number") },
+
+ { njs_str("typeof NaN"),
+ njs_str("number") },
+
+ { njs_str("typeof 'a'"),
+ njs_str("string") },
+
+ { njs_str("typeof {}"),
+ njs_str("object") },
+
+ { njs_str("typeof Object()"),
+ njs_str("object") },
+
+ { njs_str("typeof []"),
+ njs_str("object") },
+
+ { njs_str("typeof function(){}"),
+ njs_str("function") },
+
+ { njs_str("typeof Object"),
+ njs_str("function") },
+
+ { njs_str("typeof /./i"),
+ njs_str("object") },
+
+ { njs_str("typeof Date.prototype"),
+ njs_str("object") },
+
+ { njs_str("typeof a"),
+ njs_str("undefined") },
+
+ { njs_str("typeof a; var a"),
+ njs_str("undefined") },
+
+ { njs_str("typeof a; var a; a"),
+ njs_str("undefined") },
+
+ { njs_str("var a = 5; typeof a"),
+ njs_str("number") },
+
+ { njs_str("function f() { return typeof a } ; f()"),
+ njs_str("undefined") },
+
+ { njs_str("typeof a; a"),
+ njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+ { njs_str("typeof a; a = 1"),
+ njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+ /**/
+
+ { njs_str("void 0"),
+ njs_str("undefined") },
+
+ { njs_str("null = 1"),
+ njs_str("ReferenceError: Invalid left-hand side in assignment in 1") },
+
+ { njs_str("undefined = 1"),
+ njs_str("ReferenceError: Invalid left-hand side in assignment in 1") },
+
+ { njs_str("null++"),
+ njs_str("ReferenceError: Invalid left-hand side in postfix operation in 1") },
+
+ { njs_str("++null"),
+ njs_str("ReferenceError: Invalid left-hand side in prefix operation in 1") },
+
+ { njs_str("var a, b; b = a; a = 1; a +' '+ b"),
+ njs_str("1 undefined") },
+
+ { njs_str("a = 1"),
+ njs_str("ReferenceError: \"a\" is not defined in 1") },
+
+ { njs_str("var a; a = 1; a"),
+ njs_str("1") },
+
+ { njs_str("var a = {}; typeof a +' '+ a"),
+ njs_str("object [object Object]") },
+
+ { njs_str("var a = {}; a.b"),
+ njs_str("undefined") },
+
+ { njs_str("var a = {}; a.b = 1 + 2; a.b"),
+ njs_str("3") },
+
+ { njs_str("var a = {}; a['b']"),
+ njs_str("undefined") },
+
+ { njs_str("var a = {}; a.b.c"),
+ njs_str("TypeError: cannot get property \"c\" of undefined") },
+
+ { njs_str("'a'[0]"),
+ njs_str("a") },
+
+ { njs_str("'a'[undefined]"),
+ njs_str("undefined") },
+
+ { njs_str("'a'[null]"),
+ njs_str("undefined") },
+
+ { njs_str("'a'[false]"),
+ njs_str("undefined") },
+
+ { njs_str("'a'.b = 1"),
+ njs_str("TypeError: property set on primitive string type") },
+
+ { njs_str("'a'[2] = 1"),
+ njs_str("TypeError: property set on primitive string type") },
+
+ { njs_str("var a = {}; a.b = 1; a.b"),
+ njs_str("1") },
+
+ { njs_str("var a = {}; a.b = 1; a.b += 2"),
+ njs_str("3") },
+
+ { njs_str("var a = {}; a.b = 1; a.b += a.b"),
+ njs_str("2") },
+
+ { njs_str("var a = {}; a.b = 1; var x = {}; x.b = 3; a.b += (x.b = 2)"),
+ njs_str("3") },
+
+ { njs_str("var a = {}; a.b = 1; a.b += (a.b = 2)"),
+ njs_str("3") },
+
+ { njs_str("var a = {}; a.b += 1"),
+ njs_str("NaN") },
+
+ { njs_str("var a = 1; var b = 2; a = b += 1"),
+ njs_str("3") },
+
+ { njs_str("var a = 1; var b = { x:2 }; a = b.x += 1"),
+ njs_str("3") },
+
+ { njs_str("var a = 1; var b = { x:2 }; a = b.x += (a = 1)"),
+ njs_str("3") },
+
+ { njs_str("var a = undefined; a.b++; a.b"),
+ njs_str("TypeError: cannot get property \"b\" of undefined") },
+
+ { njs_str("var a = null; a.b++; a.b"),
+ njs_str("TypeError: cannot get property \"b\" of undefined") },
+
+ { njs_str("var a = true; a.b++; a.b"),
+ njs_str("TypeError: property set on primitive boolean type") },
+
+ { njs_str("var a = 1; a.b++; a.b"),
+ njs_str("TypeError: property set on primitive number type") },
+
+ { njs_str("var n = 1, o = { p: n += 1 }; o.p"),
+ njs_str("2") },
+
+ { njs_str("var a = {}; a.b = {}; a.b.c = 1; a.b['c']"),
+ njs_str("1") },
+
+ { njs_str("var a = {}; a.b = {}; a.b.c = 1; a['b']['c']"),
+ njs_str("1") },
+
+ { njs_str("var a = {}; a.b = {}; var c = 'd'; a.b.d = 1; a['b'][c]"),
+ njs_str("1") },
+
+ { njs_str("var a = {}; a.b = 1; var c = a.b++; a.b +' '+ c"),
+ njs_str("2 1") },
+
+ { njs_str("var a = 2; a.b = 1; var c = a.b++; a +' '+ a.b +' '+ c"),
+ njs_str("TypeError: property set on primitive number type") },
+
+ { njs_str("var x = { a: 1 }; x.a"),
+ njs_str("1") },
+
+ { njs_str("var a = { x:1 }; var b = { y:2 }; a.x = b.y; a.x"),
+ njs_str("2") },
+
+ { njs_str("var a = { x:1 }; var b = { y:2 }; var c; c = a.x = b.y"),
+ njs_str("2") },
+
+ { njs_str("var a = { x:1 }; var b = { y:2 }; var c = a.x = b.y; c"),
+ njs_str("2") },
+
+ { njs_str("var a = { x:1 }; var b = { y:2 }; a.x = b.y"),
+ njs_str("2") },
+
+ { njs_str("var a = { x:1 }; var b = a.x = 1 + 2; a.x +' '+ b"),
+ njs_str("3 3") },
+
+ { njs_str("var a = { x:1 }; var b = { y:2 }; var c = {};"
+ "c.x = a.x = b.y; c.x"),
+ njs_str("2") },
+
+ { njs_str("var y = 2, x = { a:1, b: y + 5, c:3 };"
+ "x.a +' '+ x.b +' '+ x.c"),
+ njs_str("1 7 3") },
+
+ { njs_str("var x = { a: 1, b: { a:2, c:5 } };"
+ "x.a +' '+ x.b.a +' '+ x.b.c"),
+ njs_str("1 2 5") },
+
+ { njs_str("var y = 5, x = { a:y }; x.a"),
+ njs_str("5") },
+
+ { njs_str("var x = { a: 1; b: 2 }"),
+ njs_str("SyntaxError: Unexpected token \";\" in 1") },
+
+ { njs_str("var x = { a: 1, b: x.a }"),
+ njs_str("TypeError: cannot get property \"a\" of undefined") },
+
+ { njs_str("var a = { b: 2 }; a.b += 1"),
+ njs_str("3") },
+
+ { njs_str("var o = {a:1}, c = o; o.a = o = {b:5};"
+ "o.a +' '+ o.b +' '+ c.a.b"),
+ njs_str("undefined 5 5") },
+
+ { njs_str("var y = { a: 2 }, x = { a: 1, b: y.a }; x.a +' '+ x.b"),
+ njs_str("1 2") },
+
+ { njs_str("var y = { a: 1 }, x = { a: y.a++, b: y.a++ }\n"
+ "x.a +' '+ x.b +' '+ y.a"),
+ njs_str("1 2 3") },
+
+ { njs_str("var a='', o = {a:1, b:2}, p;"
+ "for (p in o) { a += p +':'+ o[p] +',' } a"),
+ njs_str("a:1,b:2,") },
+
+ { njs_str("var x = { a: 1 }, b = delete x.a; x.a +' '+ b"),
+ njs_str("undefined true") },
+
+ /* Object shorthand property. */
+
+ { njs_str("var a = 1; njs.dump({a})"),
+ njs_str("{a:1}") },
+
+ { njs_str("var a = 1, b; njs.dump({a,b})"),
+ njs_str("{a:1,b:undefined}") },
+
+ { njs_str("var a = 1, b = 2; ({a,b,c})"),
+ njs_str("ReferenceError: \"c\" is not defined in 1") },
+
+ { njs_str("var a = 1, b = 2; njs.dump({a,b,c:3})"),
+ njs_str("{a:1,b:2,c:3}") },
+
+ { njs_str("var b = 2, c = 3; njs.dump({a:1,b,c})"),
+ njs_str("{a:1,b:2,c:3}") },
+
+ { njs_str("({1})"),
+ njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+ { njs_str("({default})"),
+ njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+ { njs_str("({var})"),
+ njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+ { njs_str("({this})"),
+ njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+ { njs_str("typeof ({Number}).Number"),
+ njs_str("function") },
+
+ { njs_str("typeof ({eval}).eval"),
+ njs_str("function") },
+
+ { njs_str("typeof ({Math}).Math.sin"),
+ njs_str("function") },
+
+ { njs_str("delete null"),
+ njs_str("true") },
+
+ { njs_str("var a; delete a"),
+ njs_str("SyntaxError: Delete of an unqualified identifier in 1") },
+
+ { njs_str("delete undefined"),
+ njs_str("SyntaxError: Delete of an unqualified identifier in 1") },
+
+ /* Object shorthand methods. */
+
+ { njs_str("var o = {m(){}}; new o.m();"),
+ njs_str("TypeError: function is not a constructor") },
+
+ { njs_str("var o = {sum(a, b){return a + b;}}; o.sum(1, 2)"),
+ njs_str("3") },
+
+ /* Object computed property. */
+
+ { njs_str("var o = { [0]: 1, [-0]: 2 }; o[0];"),
+ njs_str("2") },
+
+ { njs_str("var k = 'abc'.split('');var o = {[k[0]]: 'baz'}; o.a"),
+ njs_str("baz") },
+
+ { njs_str("var k = {}; var o = {[k]() {return 'baz'}}; o[k]()"),
+ njs_str("baz") },
+
+ { njs_str("njs.dump({[{toString(){return 'xx'}}]:1})"),
+ njs_str("{xx:1}") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'toString', {value:()=>'xx'});"
+ "njs.dump({[o]:1})"),
+ njs_str("{xx:1}") },
+
+ { njs_str("({[{toString(){return {}}}]:1})"),
+ njs_str("TypeError: Cannot convert object to primitive value") },
+
+ { njs_str("var o = { [new Number(12345)]: 1000 }; o[12345]"),
+ njs_str("1000") },
+
+ /* ES5FIX: "SyntaxError". */
+
+ { njs_str("delete NaN"),
+ njs_str("true") },
+
+ /* ES5FIX: "SyntaxError". */
+
+ { njs_str("delete Infinity"),
+ njs_str("true") },
+
+ { njs_str("delete -Infinity"),
+ njs_str("true") },
+
+ { njs_str("delete (1/0)"),
+ njs_str("true") },
+
+ { njs_str("delete 1"),
+ njs_str("true") },
+
+ { njs_str("var a = []; delete a[1]"),
+ njs_str("true") },
+
+ { njs_str("var o = {}; [delete o.m, delete o.m]"),
+ njs_str("true,true") },
+
+ { njs_str("[delete Array.nonexistent, delete Array.Array]"),
+ njs_str("true,true") },
+
+ { njs_str("var a; delete (a = 1); a"),
+ njs_str("1") },
+
+ { njs_str("delete a"),
+ njs_str("SyntaxError: Delete of an unqualified identifier in 1") },
+
+ { njs_str("var a = 1; delete a"),
+ njs_str("SyntaxError: Delete of an unqualified identifier in 1") },
+
+ { njs_str("function f(){} delete f"),
+ njs_str("SyntaxError: Delete of an unqualified identifier in 1") },
+
+ { njs_str("var a = { x:1 }; ('x' in a) +' '+ (1 in a)"),
+ njs_str("true false") },
+
+ { njs_str("delete --[][1]"),
+ njs_str("true") },
+
+ { njs_str("var a = [1,2]; delete a.length"),
+ njs_str("TypeError: Cannot delete property \"length\" of array") },
+
+ { njs_str("var a = [1,2,3]; a.x = 10; delete a[1]"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.create({a:1}); o.a = 2; delete o.a; o.a"),
+ njs_str("1") },
+
+ { njs_str("delete Array.name"),
+ njs_str("true") },
+
+ { njs_str("delete Math.max"),
+ njs_str("true") },
+
+ { njs_str("delete Math.max.length"),
+ njs_str("true") },
+
+ { njs_str("function f(a,b) {} "
+ "[f.length, delete f.length, f.length, delete f.length]"),
+ njs_str("2,true,0,true") },
+
+ { njs_str("njs.dump({break:1,3:2,'a':4,\"b\":2,true:1,null:0})"),
+ njs_str("{break:1,3:2,a:4,b:2,true:1,null:0}") },
+
+ { njs_str("var o1 = {a:1,b:2}, o2 = {c:3}; o1.a + o2.c"),
+ njs_str("4") },
+
+ { njs_str("({[]:1})"),
+ njs_str("SyntaxError: Unexpected token \"]\" in 1") },
+
+ { njs_str("({'AB\\ncd':1})['AB\\ncd']"),
+ njs_str("1") },
+
+ /* Inheritance. */
+
+ { njs_str("function Foo() {this.bar = 10;}; Foo.prototype.bar = 42; "
+ "var v = new Foo(); delete v.bar; v.bar"),
+ njs_str("42") },
+
+ { njs_str("function Cl(x,y) {this.x = x; this.y = y}; "
+ "var c = new Cl('a', 'b'); Cl.prototype.z = 1; c.z"),
+ njs_str("1") },
+
+ /**/
+
+ { njs_str("delete Math.E"),
+ njs_str("TypeError: Cannot delete property \"E\" of object") },
+
+ { njs_str("Math.E = 1"),
+ njs_str("TypeError: Cannot assign to read-only property \"E\" of object") },
+
+ { njs_str("var o = { 'a': 1, 'b': 2 }; var i; "
+ "for (i in o) { delete o.a; delete o.b; }; njs.dump(o)"),
+ njs_str("{}") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', {value:1, configurable:1}); "
+ "delete o.a; o.a=2; o.a"),
+ njs_str("2") },
+
+ { njs_str("var a = {}; 1 in a"),
+ njs_str("false") },
+
+ { njs_str("'a' in {a:1}"),
+ njs_str("true") },
+
+ { njs_str("'a' in Object.create({a:1})"),
+ njs_str("true") },
+
+ { njs_str("var a = 1; 1 in a"),
+ njs_str("TypeError: property in on a primitive value") },
+
+ { njs_str("var a = true; 1 in a"),
+ njs_str("TypeError: property in on a primitive value") },
+
+ { njs_str("var n = { toString: function() { return 'a' } };"
+ "var o = { a: 5 }; o[n]"),
+ njs_str("5") },
+
+ { njs_str("var n = { valueOf: function() { return 'a' } };"
+ "var o = { a: 5, '[object Object]': 7 }; o[n]"),
+ njs_str("7") },
+
+ { njs_str("var o = {}; o.new = 'OK'; o.new"),
+ njs_str("OK") },
+
+ { njs_str("var o = { new: 'OK'}; o.new"),
+ njs_str("OK") },
+
+ /* Arrays */
+
+ /* Empty array to primitive. */
+
+ { njs_str("3 + []"),
+ njs_str("3") },
+
+ { njs_str("3 * []"),
+ njs_str("0") },
+
+ /* Single element array to primitive. */
+
+ { njs_str("3 + [5]"),
+ njs_str("35") },
+
+ { njs_str("3 * [5]"),
+ njs_str("15") },
+
+ /* Array to primitive. */
+
+ { njs_str("3 + [5,7]"),
+ njs_str("35,7") },
+
+ { njs_str("3 * [5,7]"),
+ njs_str("NaN") },
+
+ { njs_str("var a = [ 1, 2, 3 ]; a[0] + a[1] + a[2]"),
+ njs_str("6") },
+
+ { njs_str("var a = [ 1, 2, 3 ]; a[-1] = 4; a + a[-1]"),
+ njs_str("1,2,34") },
+
+ { njs_str("var a = [ 1, 2, 3 ]; a[4294967295] = 4; a + a[4294967295]"),
+ njs_str("1,2,34") },
+
+ { njs_str("var a = [ 1, 2, 3 ]; a[4294967296] = 4; a + a[4294967296]"),
+ njs_str("1,2,34") },
+
+ { njs_str("delete[]['4e9']"),
+ njs_str("true") },
+
+ { njs_str("var n = 1, a = [ n += 1 ]; a"),
+ njs_str("2") },
+
+ { njs_str("var a = [ 1, 2; 3 ]; a[0] + a[1] + a[2]"),
+ njs_str("SyntaxError: Unexpected token \";\" in 1") },
+
+ { njs_str("var a = [ 1, 2, 3 ]; a[0] +' '+ a[1] +' '+ a[2] +' '+ a[3]"),
+ njs_str("1 2 3 undefined") },
+
+ { njs_str("var a = [ 5, 6, 7 ]; a['1']"),
+ njs_str("6") },
+
+ { njs_str("var a = [ 5, 6, 7 ]; a['01']"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [ 5, 6, 7 ]; a[0x1]"),
+ njs_str("6") },
+
+ { njs_str("var a = [ 5, 6, 7 ]; a['0x1']"),
+ njs_str("undefined") },
+
+ { njs_str("[] - 2"),
+ njs_str("-2") },
+
+ { njs_str("[1] - 2"),
+ njs_str("-1") },
+
+ { njs_str("[[1]] - 2"),
+ njs_str("-1") },
+
+ { njs_str("[[[1]]] - 2"),
+ njs_str("-1") },
+
+ { njs_str("var a = []; a - 2"),
+ njs_str("-2") },
+
+ { njs_str("var a = [1]; a - 2"),
+ njs_str("-1") },
+
+ { njs_str("var a = []; a[0] = 1; a - 2"),
+ njs_str("-1") },
+
+ { njs_str("[] + 2 + 3"),
+ njs_str("23") },
+
+ { njs_str("[1] + 2 + 3"),
+ njs_str("123") },
+
+ { njs_str("var a = []; a + 2 + 3"),
+ njs_str("23") },
+
+ { njs_str("var a = [1]; a + 2 + 3"),
+ njs_str("123") },
+
+ { njs_str("var a = [1,2], i = 0; a[i++] += a[0] = 5 + i;"
+ "a[0] +' '+ a[1]"),
+ njs_str("7 2") },
+
+ { njs_str("var a = []; a[0] = 1; a + 2 + 3"),
+ njs_str("123") },
+
+ { njs_str("var a = []; a['0'] = 1; a + 2 + 3"),
+ njs_str("123") },
+
+ { njs_str("var a = []; a[2] = 1; a[2]"),
+ njs_str("1") },
+
+ { njs_str("var a = [1, 2]; 1 in a"),
+ njs_str("true") },
+
+ { njs_str("var a = [1, 2]; 2 in a"),
+ njs_str("false") },
+
+ { njs_str("var a = [1, 2]; delete a[0]; 0 in a"),
+ njs_str("false") },
+
+ { njs_str("var a = [ function(a) {return a + 1} ]; a[0](5)"),
+ njs_str("6") },
+
+ { njs_str("var s = '', a = [5,1,2], i;"
+ "a[null] = null;"
+ "a[undefined] = 'defined';"
+ "a[false] = false;"
+ "a[true] = true;"
+ "a[-0] = 0;"
+ "a[Infinity] = Infinity;"
+ "a[-Infinity] = -Infinity;"
+ "a[NaN] = NaN;"
+ "a[-NaN] = -NaN;"
+ "for (i in a) { s += i +':'+ a[i] +',' } s"),
+ njs_str("0:0,1:1,2:2,null:null,undefined:defined,false:false,"
+ "true:true,Infinity:Infinity,-Infinity:-Infinity,NaN:NaN,") },
+
+ { njs_str("--[][3e9]"),
+ njs_str("MemoryError") },
+
+ { njs_str("[].length"),
+ njs_str("0") },
+
+ { njs_str("[1,2].length"),
+ njs_str("2") },
+
+ { njs_str("var a = [1,2]; a.length"),
+ njs_str("2") },
+
+ { njs_str("[\n1]"),
+ njs_str("1") },
+
+ { njs_str("\n[\n1\n]"),
+ njs_str("1") },
+
+ { njs_str("\n[\n1\n,\n2]\n[\n0]"),
+ njs_str("1") },
+
+ { njs_str("Object.create([1,2]).length"),
+ njs_str("2") },
+
+ { njs_str("Object.create(['α','β'])[1]"),
+ njs_str("β") },
+
+ { njs_str("Object.create(['α','β'])[false]"),
+ njs_str("undefined") },
+
+ { njs_str("var a = ['abc']; var o = Object.create(a); o[0] = 32;"
+ "[a,o[0]]"),
+ njs_str("abc,32") },
+
+ /* Array.length setter */
+
+ { njs_str("[].length = {}"),
+ njs_str("RangeError: Invalid array length") },
+
+ { njs_str("[].length = 2**32 - 1"),
+ njs_str("MemoryError") },
+
+ { njs_str("[].length = 3e9"),
+ njs_str("MemoryError") },
+
+ { njs_str("Object.defineProperty([], 'length',{value: 2**32 - 1})"),
+ njs_str("MemoryError") },
+
+ { njs_str("[].length = 2**32"),
+ njs_str("RangeError: Invalid array length") },
+
+ { njs_str("[].length = 2**32 + 1"),
+ njs_str("RangeError: Invalid array length") },
+
+ { njs_str("[].length = -1"),
+ njs_str("RangeError: Invalid array length") },
+
+ { njs_str("var a = [1];"
+ "typeof (a.length = '') == 'string' && a.length == 0"),
+ njs_str("true") },
+
+ { njs_str("var a = [1]; "
+ "typeof (a.length = Object(2)) == 'object' && a.length == 2"),
+ njs_str("true") },
+
+ { njs_str("var a = [1]; "
+ "typeof (a.length = Object('2')) == 'object'"),
+ njs_str("true") },
+
+ { njs_str("var a = [1]; "
+ "a.length = { valueOf: () => 2 }; a.length == 2"),
+ njs_str("true") },
+
+ { njs_str("var a = [1]; "
+ "a.length = { toString: () => '2' }; a.length == 2"),
+ njs_str("true") },
+
+ { njs_str("var a = []; a.length = 0; JSON.stringify(a)"),
+ njs_str("[]") },
+
+ { njs_str("var a = []; a.length = 1; JSON.stringify(a)"),
+ njs_str("[null]") },
+
+ { njs_str("var a = [1]; a.length = 1; JSON.stringify(a)"),
+ njs_str("[1]") },
+
+ { njs_str("var a = [1]; a.length = 2; JSON.stringify(a)"),
+ njs_str("[1,null]") },
+
+ { njs_str("var a = [1]; a.length = 4; a.length = 0; JSON.stringify(a)"),
+ njs_str("[]") },
+
+ { njs_str("var a = [1,2,3]; a.length = 2; JSON.stringify(a)"),
+ njs_str("[1,2]") },
+
+ { njs_str("var a = [1,2,3]; a.length = 3; a"),
+ njs_str("1,2,3") },
+
+ { njs_str("var a = [1,2,3]; a.length = 16; a"),
+ njs_str("1,2,3,,,,,,,,,,,,,") },
+
+ { njs_str("var a = [1,2,3]; a.join()"),
+ njs_str("1,2,3") },
+
+ { njs_str("var a = [1,2,3]; a.join(':')"),
+ njs_str("1:2:3") },
+
+ { njs_str("var a = []; a[5] = 5; a.join()"),
+ njs_str(",,,,,5") },
+
+ { njs_str("var a = [,null,undefined,false,true,0,1]; a.join()"),
+ njs_str(",,,false,true,0,1") },
+
+ { njs_str("var o = { toString: function() { return null } };"
+ "[o].join()"),
+ njs_str("null") },
+
+ { njs_str("var o = { toString: function() { return undefined } };"
+ "[o].join()"),
+ njs_str("undefined") },
+
+ { njs_str("var a = []; a[5] = 5; a"),
+ njs_str(",,,,,5") },
+
+ { njs_str("var a = []; a.concat([])"),
+ njs_str("") },
+
+ { njs_str("var s = { toString: function() { return 'S' } };"
+ "var v = { toString: 8, valueOf: function() { return 'V' } };"
+ "var o = [9]; o.join = function() { return 'O' };"
+ "var a = [1,2,3,[4,5,6],s,v,o]; a.join('')"),
+ njs_str("1234,5,6SVO") },
+
+ { njs_str("var s = { toString: function() { return 'S' } };"
+ "var v = { toString: 8, valueOf: function() { return 'V' } };"
+ "var o = [9]; o.join = function() { return 'O' };"
+ "var a = [1,2,3,[4,5,6],s,v,o]; a"),
+ njs_str("1,2,3,4,5,6,S,V,O") },
+
+ /* Array.toString(). */
+
+ { njs_str("var a = [1,2,3]; a.join = 'NO';"
+ "Object.prototype.toString = function () { return 'A' }; a"),
+ njs_str("[object Array]") },
+
+ { njs_str("Array.prototype.toString.call(1)"),
+ njs_str("[object Number]") },
+
+ { njs_str("Array.prototype.toString.call('abc')"),
+ njs_str("[object String]") },
+
+ /* Empty array elements. */
+
+ { njs_str("[,,]"),
+ njs_str(",") },
+
+ { njs_str("[,,,]"),
+ njs_str(",,") },
+
+ { njs_str("[1,2,]"),
+ njs_str("1,2") },
+
+ { njs_str("[1,2,,3]"),
+ njs_str("1,2,,3") },
+
+ { njs_str("[,,].length"),
+ njs_str("2") },
+
+ { njs_str("[,,,].length"),
+ njs_str("3") },
+
+ { njs_str("[1,2,,3].length"),
+ njs_str("4") },
+
+ /**/
+
+ { njs_str("var n = { toString: function() { return 1 } }; [1,2][n]"),
+ njs_str("2") },
+
+ { njs_str("var n = { toString: function() { return '1' } }; [1,2][n]"),
+ njs_str("2") },
+
+ { njs_str("var n = { toString: function() { return 1 },"
+ " valueOf: function() { return 0 } }; [1,2][n]"),
+ njs_str("2") },
+
+ { njs_str("var n = { toString: function() { return 1.5 } };"
+ "var a = [1,2]; a[1.5] = 5; a[n]"),
+ njs_str("5") },
+
+ { njs_str("var n = { toString: function() { return 1.5 } };"
+ "var a = [1,2]; a[n] = 5; a[1.5]"),
+ njs_str("5") },
+
+ { njs_str("var n = { toString: function() { return '1.5' } };"
+ "var a = [1,2]; a[1.5] = 5; a[n]"),
+ njs_str("5") },
+
+ { njs_str("var n = { toString: function() { return '1.5' } };"
+ "var a = [1,2]; a[n] = 5; a[1.5]"),
+ njs_str("5") },
+
+ { njs_str("var n = { toString: function() { return 1.5 } };"
+ "var a = [1,2]; a[1.5] = 5; n in a"),
+ njs_str("true") },
+
+ { njs_str("var n = { toString: function() { return '1.5' } };"
+ "var a = [1,2]; a[1.5] = 5; '' + (n in a) + (delete a[n])"),
+ njs_str("truetrue") },
+
+ /**/
+
+ { njs_str("Array.isArray()"),
+ njs_str("false") },
+
+ { njs_str("Array.isArray(1)"),
+ njs_str("false") },
+
+ { njs_str("Array.isArray(1) ? 'true' : 'false'"),
+ njs_str("false") },
+
+ { njs_str("Array.isArray([])"),
+ njs_str("true") },
+
+ { njs_str("Array.isArray([]) ? 'true' : 'false'"),
+ njs_str("true") },
+
+ { njs_str("Array.of()"),
+ njs_str("") },
+
+ { njs_str("Array.of(1,2,3)"),
+ njs_str("1,2,3") },
+
+ { njs_str("Array.of(undefined,1)"),
+ njs_str(",1") },
+
+ { njs_str("Array.of(NaN,-1,{})"),
+ njs_str("NaN,-1,[object Object]") },
+
+ { njs_str("var a = [1,2,3]; a.concat(4, [5, 6, 7], 8)"),
+ njs_str("1,2,3,4,5,6,7,8") },
+
+ { njs_str("var a = []; a[100] = a.length; a[100] +' '+ a.length"),
+ njs_str("0 101") },
+
+ { njs_str("var a = [1,2]; a[100] = 100; a[100] +' '+ a.length"),
+ njs_str("100 101") },
+
+ { njs_str("Array.prototype.slice(1)"),
+ njs_str("") },
+
+ { njs_str("Array.prototype.slice(1,2)"),
+ njs_str("") },
+
+ { njs_str("Array.prototype.slice.call(undefined)"),
+ njs_str("TypeError: cannot convert undefined to object") },
+
+ { njs_str("Array.prototype.slice.call(1)"),
+ njs_str("") },
+
+ { njs_str("Array.prototype.slice.call(false)"),
+ njs_str("") },
+
+ { njs_str("Array.prototype.slice.call({'0':'a', '1':'b', length:1})"),
+ njs_str("a") },
+
+ { njs_str("Array.prototype.slice.call({'0':'a', '1':'b', length:2})"),
+ njs_str("a,b") },
+
+ { njs_str("Array.prototype.slice.call({'0':'a', '1':'b', length:4})"),
+ njs_str("a,b,,") },
+
+ { njs_str("Array.prototype.slice.call({'0':'a', '1':'b', length:2}, 1)"),
+ njs_str("b") },
+
+ { njs_str("Array.prototype.slice.call({'0':'a', '1':'b', length:2}, 1, 2)"),
+ njs_str("b") },
+
+ { njs_str("Array.prototype.slice.call({length:'2'})"),
+ njs_str(",") },
+
+ { njs_str("njs.dump(Array.prototype.slice.call({length: 3, 1: undefined }))"),
+ njs_str("[<empty>,undefined,<empty>]") },
+
+ { njs_str("Array.prototype.slice.call({length:new Number(3)})"),
+ njs_str(",,") },
+
+ { njs_str("Array.prototype.slice.call({length: { valueOf: function() { return 2; } }})"),
+ njs_str(",") },
+
+ { njs_str("Array.prototype.slice.call({ length: Object.create(null) })"),
+ njs_str("TypeError: Cannot convert object to primitive value") },
+
+ { njs_str("Array.prototype.slice.call({length:-1})"),
+ njs_str("") },
+
+ { njs_str("Array.prototype.slice.call('αβZγ')"),
+ njs_str("α,β,Z,γ") },
+
+ { njs_str("Array.prototype.slice.call(String.bytesFrom(Array(16).fill(0x9d)))[0].charCodeAt(0)"),
+ njs_str("157") },
+
+ { njs_str("Array.prototype.slice.call('αβZγ', 1)"),
+ njs_str("β,Z,γ") },
+
+ { njs_str("Array.prototype.slice.call('αβZγ', 2)"),
+ njs_str("Z,γ") },
+
+ { njs_str("Array.prototype.slice.call('αβZγ', 3)"),
+ njs_str("γ") },
+
+ { njs_str("Array.prototype.slice.call('αβZγ', 4)"),
+ njs_str("") },
+
+ { njs_str("Array.prototype.slice.call('αβZγ', 0, 1)"),
+ njs_str("α") },
+
+ { njs_str("Array.prototype.slice.call('αβZγ', 1, 2)"),
+ njs_str("β") },
+
+ { njs_str("Array.prototype.slice.call('αβZγ').length"),
+ njs_str("4") },
+
+ { njs_str("Array.prototype.slice.call('αβZγ')[1].length"),
+ njs_str("1") },
+
+ { njs_str("Array.prototype.slice.call(new String('αβZγ'))"),
+ njs_str("α,β,Z,γ") },
+
+ { njs_str("1..__proto__.length = '2';"
+ "Array.prototype.slice.call(1, 0, 2)"),
+ njs_str(",") },
+
+ { njs_str("Array.prototype.pop()"),
+ njs_str("undefined") },
+
+ { njs_str("Array.prototype.shift()"),
+ njs_str("undefined") },
+
+ { njs_str("[0,1].slice()"),
+ njs_str("0,1") },
+
+ { njs_str("[0,1].slice(undefined)"),
+ njs_str("0,1") },
+
+ { njs_str("[0,1].slice(undefined, undefined)"),
+ njs_str("0,1") },
+
+ { njs_str("[0,1,2,3,4].slice(1,4)"),
+ njs_str("1,2,3") },
+
+ { njs_str("[0,1,2,3,4].slice(6,7)"),
+ njs_str("") },
+
+ { njs_str("var a = [1,2,3,4,5], b = a.slice(3);"
+ "b[0] +' '+ b[1] +' '+ b[2]"),
+ njs_str("4 5 undefined") },
+
+ { njs_str("var a = [1,2]; a.pop() +' '+ a.length +' '+ a"),
+ njs_str("2 1 1") },
+
+ { njs_str("var a = [1,2], len = a.push(3); len +' '+ a.pop() +' '+ a"),
+ njs_str("3 3 1,2") },
+
+ { njs_str("var a = [1,2], len = a.push(3,4,5);"
+ "len +' '+ a.pop() +' '+ a"),
+ njs_str("5 5 1,2,3,4") },
+
+ { njs_str("var a = [1,2,3]; a.shift() +' '+ a[0] +' '+ a.length"),
+ njs_str("1 2 2") },
+
+ { njs_str("var a = [1,2], len = a.unshift(3);"
+ "len +' '+ a +' '+ a.shift()"),
+ njs_str("3 3,1,2 3") },
+
+ { njs_str("var a = [1,2], len = a.unshift(3,4,5);"
+ "len +' '+ a +' '+ a.shift()"),
+ njs_str("5 3,4,5,1,2 3") },
+
+ { njs_str("var a=[0], n = 64; while(--n) {a.push(n); a.shift()}; a"),
+ njs_str("1") },
+
+ { njs_str("var a = []; a.splice()"),
+ njs_str("") },
+
+ { njs_str("[].splice(0,5,0)"),
+ njs_str("") },
+
+ { njs_str("[1,2,3,4,5].splice(-2,3,0)"),
+ njs_str("4,5") },
+
+ { njs_str("[].__proto__.splice(0,1,0)"),
+ njs_str("") },
+
+ { njs_str("var a = [];"
+ "a.splice(9,0,1,2).join(':') + '|' + a"),
+ njs_str("|1,2") },
+
+ { njs_str("var a = [0,1,2,3,4,5,6,7];"
+ "a.splice(3).join(':') + '|' + a"),
+ njs_str("3:4:5:6:7|0,1,2") },
+
+ { njs_str("var a = [0,1,2,3,4,5,6,7];"
+ "a.splice(3, 2).join(':') + '|' + a"),
+ njs_str("3:4|0,1,2,5,6,7") },
+
+ { njs_str("var a = [0,1,2,3,4,5,6,7];"
+ "a.splice(3, 2, 8, 9, 10, 11 ).join(':') + '|' + a"),
+ njs_str("3:4|0,1,2,8,9,10,11,5,6,7") },
+
+ { njs_str("var a = []; a.reverse()"),
+ njs_str("") },
+
+ { njs_str("var a = [1]; a.reverse()"),
+ njs_str("1") },
+
+ { njs_str("var a = [1,2]; a.reverse()"),
+ njs_str("2,1") },
+
+ { njs_str("var a = [1,2,3]; a.reverse()"),
+ njs_str("3,2,1") },
+
+ { njs_str("var a = [1,2,3,4]; a.reverse()"),
+ njs_str("4,3,2,1") },
+
+ { njs_str("var a = [1,2,3,4]; a.indexOf()"),
+ njs_str("-1") },
+
+ { njs_str("var a = [1,2,3,4]; a.indexOf(5)"),
+ njs_str("-1") },
+
+ { njs_str("var a = [1,2,3,4]; a.indexOf(4, 3)"),
+ njs_str("3") },
+
+ { njs_str("var a = [1,2,3,4]; a.indexOf(4, 4)"),
+ njs_str("-1") },
+
+ { njs_str("var a = [1,2,3,4,3,4]; a.indexOf(3, '2')"),
+ njs_str("2") },
+
+ { njs_str("var a = [1,2,3,4,3,4]; a.indexOf(4, -1)"),
+ njs_str("5") },
+
+ { njs_str("var a = [1,2,3,4,3,4]; a.indexOf(3, -10)"),
+ njs_str("2") },
+
+ { njs_str("[].indexOf.bind(0)(0, 0)"),
+ njs_str("-1") },
+
+ { njs_str("[].lastIndexOf(1, -1)"),
+ njs_str("-1") },
+
+ { njs_str("[undefined].lastIndexOf()"),
+ njs_str("0") },
+
+ { njs_str("[undefined].lastIndexOf(undefined)"),
+ njs_str("0") },
+
+ { njs_str("var a = [1,2,3,4]; a.lastIndexOf()"),
+ njs_str("-1") },
+
+ { njs_str("var a = [1,2,3,4]; a.lastIndexOf(5)"),
+ njs_str("-1") },
+
+ { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(1, 0)"),
+ njs_str("0") },
+
+ { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, '2')"),
+ njs_str("2") },
+
+ { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(1, 6)"),
+ njs_str("0") },
+
+ { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(2, 6)"),
+ njs_str("1") },
+
+ { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(4, -1)"),
+ njs_str("5") },
+
+ { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(4, -6)"),
+ njs_str("-1") },
+
+ { njs_str("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, -10)"),
+ njs_str("-1") },
+
+ { njs_str("[1,2,1].lastIndexOf(2,undefined)"),
+ njs_str("-1") },
+
+ { njs_str("[1,2,1].lastIndexOf(1,undefined)"),
+ njs_str("0") },
+
+ { njs_str("[1,2,1].lastIndexOf(1)"),
+ njs_str("2") },
+
+ { njs_str("[1,2,3,4].includes()"),
+ njs_str("false") },
+
+ { njs_str("[1,2,3,4].includes(5)"),
+ njs_str("false") },
+
+ { njs_str("[1,2,3,4].includes(4, 3)"),
+ njs_str("true") },
+
+ { njs_str("[1,2,3,4].includes(4, 4)"),
+ njs_str("false") },
+
+ { njs_str("[1,2,3,4,3,4].includes(3, '2')"),
+ njs_str("true") },
+
+ { njs_str("[1,2,3,4,3,4].includes(4, -1)"),
+ njs_str("true") },
+
+ { njs_str("[1,2,3,4,3,4].includes(3, -10)"),
+ njs_str("true") },
+
+ { njs_str("[1,2,3,NaN,3,4].includes(NaN)"),
+ njs_str("true") },
+
+ { njs_str("[1,2,3,4,5].includes(NaN)"),
+ njs_str("false") },
+
+ { njs_str("[].includes.bind(0)(0, 0)"),
+ njs_str("false") },
+
+ { njs_str("var a = []; var s = { sum: 0 };"
+ "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
+ njs_str("0") },
+
+ { njs_str("var a = new Array(3); var s = { sum: 0 };"
+ "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
+ njs_str("0") },
+
+ { njs_str("var a = [,,,]; var s = { sum: 0 };"
+ "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
+ njs_str("0") },
+
+ { njs_str("var a = [1,2,3]; var s = { sum: 0 };"
+ "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
+ njs_str("6") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.forEach(function(v, i, a) { a[i+3] = a.length }); a"),
+ njs_str("1,2,3,3,4,5") },
+
+ { njs_str("function f() { var c; [1].forEach(function(v) { c })}; f()"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [1,2,3]; var s = { sum: 0 };"
+ "[].forEach.call(a, function(v, i, a) { this.sum += v }, s);"
+ "s.sum"),
+ njs_str("6") },
+
+ { njs_str("var a = [1,2,3]; var s = { sum: 0 };"
+ "[].forEach.apply(a,"
+ "[ function(v, i, a) { this.sum += v }, s ]);"
+ "s.sum"),
+ njs_str("6") },
+
+ { njs_str("var a = []; var c = 0;"
+ "a.forEach(function(v, i, a) { c++ }); c"),
+ njs_str("0") },
+
+ { njs_str("var a = [,,,,]; var c = 0;"
+ "a.forEach(function(v, i, a) { c++ }); c"),
+ njs_str("0") },
+
+ { njs_str("var a = [];"
+ "a.some(function(v, i, a) { return v > 1 })"),
+ njs_str("false") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.some(function(v, i, a) { return v > 1 })"),
+ njs_str("true") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.some(function(v, i, a) { return v > 2 })"),
+ njs_str("true") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.some(function(v, i, a) { return v > 3 })"),
+ njs_str("false") },
+
+ { njs_str("var a = [];"
+ "a.every(function(v, i, a) { return v > 1 })"),
+ njs_str("true") },
+
+ { njs_str("var a = [3,2,1];"
+ "a.every(function(v, i, a) { return v > 3 })"),
+ njs_str("false") },
+
+ { njs_str("var a = [3,2,1];"
+ "a.every(function(v, i, a) { return v > 2 })"),
+ njs_str("false") },
+
+ { njs_str("var a = [3,2,1];"
+ "a.every(function(v, i, a) { return v > 0 })"),
+ njs_str("true") },
+
+ { njs_str("[].fill(1);"),
+ njs_str("") },
+
+ { njs_str("[1,2,3].fill(5);"),
+ njs_str("5,5,5") },
+
+ { njs_str("[1,2,3].fill(5, 0);"),
+ njs_str("5,5,5") },
+
+ { njs_str("[1,2,3].fill(5, 1);"),
+ njs_str("1,5,5") },
+
+ { njs_str("[1,2,3].fill(5, 4);"),
+ njs_str("1,2,3") },
+
+ { njs_str("[1,2,3].fill(5, -2);"),
+ njs_str("1,5,5") },
+
+ { njs_str("[1,2,3].fill(5, -3);"),
+ njs_str("5,5,5") },
+
+ { njs_str("[1,2,3].fill(5, -4);"),
+ njs_str("5,5,5") },
+
+ { njs_str("[1,2,3].fill(5, 1, 0);"),
+ njs_str("1,2,3") },
+
+ { njs_str("[1,2,3].fill(5, 1, 1);"),
+ njs_str("1,2,3") },
+
+ { njs_str("[1,2,3].fill(5, 1, 2);"),
+ njs_str("1,5,3") },
+
+ { njs_str("[1,2,3].fill(5, 1, 3);"),
+ njs_str("1,5,5") },
+
+ { njs_str("[1,2,3].fill(5, 1, 4);"),
+ njs_str("1,5,5") },
+
+ { njs_str("[1,2,3].fill(5, 1, -1);"),
+ njs_str("1,5,3") },
+
+ { njs_str("[1,2,3].fill(5, 1, -3);"),
+ njs_str("1,2,3") },
+
+ { njs_str("[1,2,3].fill(5, 1, -4);"),
+ njs_str("1,2,3") },
+
+ { njs_str("[1,2,3].fill(\"a\", 1, 2);"),
+ njs_str("1,a,3") },
+
+ { njs_str("[1,2,3].fill({a:\"b\"}, 1, 2);"),
+ njs_str("1,[object Object],3") },
+
+ { njs_str("Array(3).fill().reduce(function(a, x)"
+ "{ return a + (x === undefined); }, 0)"),
+ njs_str("3") },
+
+ { njs_str("var a = Array.prototype.fill.apply("
+ "Object({length: 40}), [\"a\", 1, 20]); Object.values(a)"),
+ njs_str("a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,40,a,a,a,a") },
+
+ { njs_str("var a = Array.prototype.fill.apply({length: "
+ "{ valueOf: function() { return 40 }}}, [\"a\", 1, 20]);"
+ "Object.values(a)"),
+ njs_str("a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,[object Object],a,a,a,a") },
+
+ { njs_str("[NaN, false, ''].map("
+ "(x) => Array.prototype.fill.call(x)"
+ ").every((x) => typeof x == 'object')"),
+ njs_str("true") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'length', {get:()=>2}); "
+ "Array.prototype.slice.call(Array.prototype.fill.call(o, 1))"),
+ njs_str("1,1") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'length', {get:()=> {throw TypeError('Boom')}}); "
+ "Array.prototype.fill.call(o, 1)"),
+ njs_str("TypeError: Boom") },
+
+ { njs_str("var o = Object({length: 3});"
+ "Object.defineProperty(o, '0', {set: ()=>{throw TypeError('Boom')}});"
+ "Array.prototype.fill.call(o, 1)"),
+ njs_str("TypeError: Boom") },
+
+ { njs_str("var o = Object({length: 3});"
+ "Object.defineProperty(o, '0', {set: function(v){this.a = 2 * v}});"
+ "Array.prototype.fill.call(o, 2).a"),
+ njs_str("4") },
+
+ { njs_str("var o = Object({length: 3});"
+ "Object.defineProperty(o, '0', {set: function(v){this[0] = 2 * v}});"
+ "Array.prototype.fill.call(o, 2)"),
+ njs_str("RangeError: Maximum call stack size exceeded") },
+
+ { njs_str("var a = [];"
+ "a.filter(function(v, i, a) { return v > 1 })"),
+ njs_str("") },
+
+ { njs_str("var a = [1,2,3,-1,5];"
+ "a.filter(function(v, i, a) { return v > 1 })"),
+ njs_str("2,3,5") },
+
+ { njs_str("var a = [1,2,3,4,5,6,7,8];"
+ "a.filter(function(v, i, a) { a.pop(); return v > 1 })"),
+ njs_str("2,3,4") },
+
+ { njs_str("var a = [1,2,3,4,5,6,7,8];"
+ "a.filter(function(v, i, a) { a.shift(); return v > 1 })"),
+ njs_str("3,5,7") },
+
+ { njs_str("var a = [1,2,3,4,5,6,7];"
+ "a.filter(function(v, i, a) { a.pop(); return v > 1 })"),
+ njs_str("2,3,4") },
+
+ { njs_str("var a = [1,2,3,4,5,6,7];"
+ "a.filter(function(v, i, a) { a.shift(); return v > 1 })"),
+ njs_str("3,5,7") },
+
+ { njs_str("var a = [1,2,3,4,5,6,7];"
+ "a.filter(function(v, i, a) { a[i] = v + 1; return true })"),
+ njs_str("1,2,3,4,5,6,7") },
+
+ { njs_str("var a = [1,2,3,4,5,6,7];"
+ "a.filter(function(v, i, a) { a[i+1] = v+10; return true })"),
+ njs_str("1,11,21,31,41,51,61") },
+
+ { njs_str("var a = [];"
+ "a.find(function(v, i, a) { return v > 1 })"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [,NaN,0,-1];"
+ "a.find(function(v, i, a) { return v > 1 })"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [,NaN,0,-1,2];"
+ "a.find(function(v, i, a) { return v > 1 })"),
+ njs_str("2") },
+
+ { njs_str("var a = [1,2,3,-1,5];"
+ "a.find(function(v, i, a) { return v > 1 })"),
+ njs_str("2") },
+
+ { njs_str("var a = [,1,,-1,5];"
+ "a.find(function(v, i, a) { return v > 1 })"),
+ njs_str("5") },
+
+ { njs_str("var a = [,1,,-1,5,6];"
+ "a.find(function(v, i, a) { return v > 1 })"),
+ njs_str("5") },
+
+ { njs_str("[].find(function(v) { return (v === undefined) })"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [,3];"
+ "a.find(function(v) { return (v === 3 || v === undefined) })"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [1,,3];"
+ "a.find(function(v) { return (v === 3 || v === undefined) })"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [1,2,3,4,5,6];"
+ "a.find(function(v, i, a) { a.shift(); return v == 3 })"),
+ njs_str("3") },
+
+ { njs_str("var a = [1,2,3,4,5,6];"
+ "a.find(function(v, i, a) { a.shift(); return v == 4 })"),
+ njs_str("undefined") },
+
+ { njs_str("var a = [];"
+ "a.findIndex(function(v, i, a) { return v > 1 })"),
+ njs_str("-1") },
+
+ { njs_str("var a = [,NaN,0,-1];"
+ "a.findIndex(function(v, i, a) { return v > 1 })"),
+ njs_str("-1") },
+
+ { njs_str("var a = [,NaN,0,-1,2];"
+ "a.findIndex(function(v, i, a) { return v > 1 })"),
+ njs_str("4") },
+
+ { njs_str("var a = [1,2,3,-1,5];"
+ "a.findIndex(function(v, i, a) { return v > 1 })"),
+ njs_str("1") },
+
+ { njs_str("var a = [,1,,-1,5];"
+ "a.findIndex(function(v, i, a) { return v > 1 })"),
+ njs_str("4") },
+
+ { njs_str("var a = [,1,,-1,5,6];"
+ "a.findIndex(function(v, i, a) { return v > 1 })"),
+ njs_str("4") },
+
+ { njs_str("[].findIndex(function(v) { return (v === undefined) })"),
+ njs_str("-1") },
+
+ { njs_str("[,].findIndex(function(v) { return (v === undefined) })"),
+ njs_str("0") },
+
+ { njs_str("[1,2,,3].findIndex(function(el){return el === undefined})"),
+ njs_str("2") },
+
+ { njs_str("[,2,,3].findIndex(function(el){return el === undefined})"),
+ njs_str("0") },
+
+ { njs_str("var a = [1,2,3,4,5,6];"
+ "a.findIndex(function(v, i, a) { a.shift(); return v == 3 })"),
+ njs_str("1") },
+
+ { njs_str("var a = [1,2,3,4,5,6];"
+ "a.findIndex(function(v, i, a) { a.shift(); return v == 4 })"),
+ njs_str("-1") },
+
+ { njs_str("var a = [];"
+ "a.map(function(v, i, a) { return v + 1 })"),
+ njs_str("") },
+
+ { njs_str("var a = [,,,];"
+ "a.map(function(v, i, a) { return v + 1 })"),
+ njs_str(",,") },
+
+ { njs_str("var a = [,,,1];"
+ "a.map(function(v, i, a) { return v + 1 })"),
+ njs_str(",,,2") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.map(function(v, i, a) { return v + 1 })"),
+ njs_str("2,3,4") },
+
+ { njs_str("var a = [1,2,3,4,5,6];"
+ "a.map(function(v, i, a) { a.pop(); return v + 1 })"),
+ njs_str("2,3,4,,,") },
+
+ { njs_str("var a = [1,2,3,4,5,6];"
+ "a.map(function(v, i, a) { a.shift(); return v + 1 })"),
+ njs_str("2,4,6,,,") },
+
+ { njs_str("var a = [];"
+ "a.reduce(function(p, v, i, a) { return p + v })"),
+ njs_str("TypeError: invalid index") },
+
+ { njs_str("var a = [];"
+ "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
+ njs_str("10") },
+
+ { njs_str("var a = [,,];"
+ "a.reduce(function(p, v, i, a) { return p + v })"),
+ njs_str("TypeError: invalid index") },
+
+ { njs_str("var a = [,,];"
+ "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
+ njs_str("10") },
+
+ { njs_str("var a = [1];"
+ "a.reduce(function(p, v, i, a) { return p + v })"),
+ njs_str("1") },
+
+ { njs_str("var a = [1];"
+ "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
+ njs_str("11") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.reduce(function(p, v, i, a) { return p + v })"),
+ njs_str("6") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.reduce(function(p, v, i, a) { return p + v }, 10)"),
+ njs_str("16") },
+
+ { njs_str("[[0, 1], [2, 3], [4, 5]].reduce(function(a, b)"
+ " { return a.concat(b) }, [])"),
+ njs_str("0,1,2,3,4,5") },
+
+ { njs_str("var a = [];"
+ "a.reduceRight(function(p, v, i, a) { return p + v })"),
+ njs_str("TypeError: invalid index") },
+
+ { njs_str("var a = [];"
+ "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
+ njs_str("10") },
+
+ { njs_str("var a = [,,];"
+ "a.reduceRight(function(p, v, i, a) { return p + v })"),
+ njs_str("TypeError: invalid index") },
+
+ { njs_str("var a = [,,];"
+ "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
+ njs_str("10") },
+
+ { njs_str("var a = [1];"
+ "a.reduceRight(function(p, v, i, a) { return p + v })"),
+ njs_str("1") },
+
+ { njs_str("var a = [1];"
+ "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
+ njs_str("11") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.reduceRight(function(p, v, i, a) { return p + v })"),
+ njs_str("6") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.reduceRight(function(p, v, i, a) { return p + v }, 10)"),
+ njs_str("16") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.reduceRight(function(p, v, i, a)"
+ " { a.shift(); return p + v })"),
+ njs_str("7") },
+
+ { njs_str("var a = [1,2,3];"
+ "a.reduceRight(function(p, v, i, a)"
+ " { a.shift(); return p + v }, 10)"),
+ njs_str("19") },
+
+ { njs_str("var a = ['1','2','3','4','5','6']; a.sort()"),
+ njs_str("1,2,3,4,5,6") },
+
+ { njs_str("var o = { toString: function() { return 5 } };"
+ "var a = [6,o,4,3,2,1]; a.sort()"),
+ njs_str("1,2,3,4,5,6") },
+
+ { njs_str("var a = [1,2,3,4,5,6];"
+ "a.sort(function(x, y) { return x - y })"),
+ njs_str("1,2,3,4,5,6") },
+
+ { njs_str("var a = [6,5,4,3,2,1];"
+ "a.sort(function(x, y) { return x - y })"),
+ njs_str("1,2,3,4,5,6") },
+
+ { njs_str("var a = [2,2,2,1,1,1];"
+ "a.sort(function(x, y) { return x - y })"),
+ njs_str("1,1,1,2,2,2") },
+
+ { njs_str("var a = [,,,2,2,2,1,1,1];"
+ "a.sort(function(x, y) { return x - y })"),
+ njs_str("1,1,1,2,2,2,,,") },
+
+ { njs_str("var a = [,,,,];"
+ "a.sort(function(x, y) { return x - y })"),
+ njs_str(",,,") },
+
+ { njs_str("var a = [1,,];"
+ "a.sort(function(x, y) { return x - y })"),
+ njs_str("1,") },
+
+ /* Template literal. */
+
+ { njs_str("`"),
+ njs_str("SyntaxError: Unterminated template literal in 1") },
+
+ { njs_str("`$"),
+ njs_str("SyntaxError: Unterminated template literal in 1") },
+
+ { njs_str("`${"),
+ njs_str("SyntaxError: Unexpected end of input in 1") },
+
+ { njs_str("`${a"),
+ njs_str("SyntaxError: Missing \"}\" in template expression in 1") },
+
+ { njs_str("`${}"),
+ njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+ { njs_str("`${a}"),
+ njs_str("SyntaxError: Unterminated template literal in 1") },
+
+ { njs_str("`${a}bc"),
+ njs_str("SyntaxError: Unterminated template literal in 1") },
+
+ { njs_str("`\\"),
+ njs_str("SyntaxError: Unterminated template literal in 1") },
+
+ { njs_str("`\\${a}bc"),
+ njs_str("SyntaxError: Unterminated template literal in 1") },
+
+ { njs_str("`text1\ntext2`;"),
+ njs_str("text1\ntext2") },
+
+ { njs_str("var o = 1; `o = \\`${o}\\``"),
+ njs_str("o = `1`") },
+
+ { njs_str("`\\unicode`"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\unicode\" in 1") },
+
+ { njs_str("var a = 5; var b = 10;"
+ "`Fifteen is ${a + b} and \nnot ${2 * a + b}.`;"),
+ njs_str("Fifteen is 15 and \nnot 20.") },
+
+ { njs_str("var s = `1undefined`; s;"),
+ njs_str("1undefined") },
+
+ { njs_str("var s = '0'; s = `x${s += '1'}`;"),
+ njs_str("x01") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+ "var something = 'test'; var one = 1; var two = 2;"
+ "`[${d.toISOString()}] the message contents ${something} ${one + two}`"),
+ njs_str("[2011-06-24T18:45:12.625Z] the message contents test 3") },
+
+ { njs_str("function isLargeScreen() { return false; }"
+ "var item = { isCollapsed: true };"
+ "`header ${ isLargeScreen() ? '' : `icon-${item.isCollapsed ? 'expander' : 'collapser'}` }`;"),
+ njs_str("header icon-expander") },
+
+ { njs_str("function foo(strings, person, age) { return `${strings[0]}${strings[1]}${person}${age}` };"
+ "var person = 'Mike'; var age = 21;"
+ "foo`That ${person} is a ${age}`;"),
+ njs_str("That is a Mike21") },
+
+ /* Strings. */
+
+ { njs_str("var a = '0123456789' + '012345';"
+ "var b = 'abcdefghij' + 'klmnop';"
+ " a = b"),
+ njs_str("abcdefghijklmnop") },
+
+ { njs_str("String.prototype.my = function f() {return 7}; 'a'.my()"),
+ njs_str("7") },
+
+ { njs_str("'a'.my"),
+ njs_str("undefined") },
+
+ { njs_str("var a = '123'\n[2].toString();a"),
+ njs_str("3") },
+
+ { njs_str("'\xE5\x96\x9C\xE3\x81\xB6'"),
+ njs_str("喜ぶ") },
+
+ /* Broken UTF-8 literals.*/
+
+ { njs_str("'\x96\xE5\x9C\xE3\x81\xB6'"),
+ njs_str("��ぶ") },
+
+ { njs_str("'\x96\xE5\x9C'"),
+ njs_str("��") },
+
+ { njs_str("'\x96\xE5'"),
+ njs_str("��") },
+
+ { njs_str("'\x96'"),
+ njs_str("�") },
+
+ { njs_str("'\xF3'"),
+ njs_str("�") },
+
+ { njs_str("'\xF3\xFF'"),
+ njs_str("��") },
+
+ { njs_str("'\x96\x96\xE5\x9C\xE3\x81\xB6'"),
+ njs_str("���ぶ") },
+
+ { njs_str("'\x9C\x96\xE5\xE3\x81\xB6'"),
+ njs_str("���ぶ") },
+
+ { njs_str("'\xE5\x9C\xE3\x81\xB6'"),
+ njs_str("�ぶ") },
+
+ { njs_str("'\xEF\xBF\xBD\xE3\x81\xB6'"),
+ njs_str("�ぶ") },
+
+ { njs_str("'\xE5\xF6\x9C\xE3\x81\xB6'"),
+ njs_str("���ぶ") },
+
+ { njs_str("var a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xF3'; "
+ "[a.length, a[33], a[34]]"),
+ njs_str("35,a,�") },
+
+ /* Escape strings. */
+
+ { njs_str("'\\a \\' \\\" \\\\ \\0 \\b \\f \\n \\r \\t \\v'"),
+ njs_str("a ' \" \\ \0 \b \f \n \r \t \v") },
+
+ { njs_str("'\\\n'"),
+ njs_str("") },
+
+ { njs_str("'\\\r'"),
+ njs_str("") },
+
+ { njs_str("'\\\r\n'"),
+ njs_str("") },
+
+ { njs_str("'a\\\nb'"),
+ njs_str("ab") },
+
+ { njs_str("'a\\\rb'"),
+ njs_str("ab") },
+
+ { njs_str("'a\\\r\nb'"),
+ njs_str("ab") },
+
+ { njs_str("'a\\\n\rb'"),
+ njs_str("SyntaxError: Unterminated string \"'a\\\n\r\" in 1") },
+
+ { njs_str("'a\\\nb\nc'"),
+ njs_str("SyntaxError: Unterminated string \"'a\\\nb\n\" in 1") },
+
+ { njs_str("'abcde"),
+ njs_str("SyntaxError: Unterminated string \"'abcde\" in 1") },
+
+ { njs_str("'\\"),
+ njs_str("SyntaxError: Unterminated string \"'\\\" in 1") },
+
+ { njs_str("'\\\r\n"),
+ njs_str("SyntaxError: Unterminated string \"'\\\r\n\" in 1") },
+
+ { njs_str("'\\'"),
+ njs_str("SyntaxError: Unterminated string \"'\\'\" in 1") },
+
+ { njs_str("'a\n"),
+ njs_str("SyntaxError: Unterminated string \"'a\n\" in 1") },
+
+ { njs_str("'a\r"),
+ njs_str("SyntaxError: Unterminated string \"'a\r\" in 1") },
+
+ { njs_str("\"a\n"),
+ njs_str("SyntaxError: Unterminated string \"\"a\n\" in 1") },
+
+ { njs_str("'\\u03B1'"),
+ njs_str("α") },
+
+ { njs_str("'\\u'"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
+
+ { njs_str("'\\uzzzz'"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\uzzzz\" in 1") },
+
+ { njs_str("'\\u03B'"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\u03B\" in 1") },
+
+ { njs_str("'\\u03BG'"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\u03BG\" in 1") },
+
+ { njs_str("'\\u03B '"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\u03B \" in 1") },
+
+ { njs_str("'\\u{61}\\u{3B1}\\u{20AC}'"),
+ njs_str("aα€") },
+
+ { njs_str("'\\u'"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
+
+ { njs_str("'\\u{'"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\u{\" in 1") },
+
+ { njs_str("'\\u{}'"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\u{}\" in 1") },
+
+ { njs_str("'\\u{1234567}'"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\u{1234567}\" in 1") },
+
+ { njs_str("'\\u{a00000}'"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\u{a00000}\" in 1") },
+
+ { njs_str("'\\x61'"),
+ njs_str("a") },
+
+ { njs_str("''.length"),
+ njs_str("0") },
+
+ { njs_str("'abc'.length"),
+ njs_str("3") },
+
+ { njs_str("'привет\\n'.length"),
+ njs_str("7") },
+
+ { njs_str("'привет\\n\\u{61}\\u{3B1}\\u{20AC}'.length"),
+ njs_str("10") },
+
+ { njs_str("'\\ud83d\\udc4d'"),
+ njs_str("\xf0\x9f\x91\x8d") },
+
+ { njs_str("'\\ud83d\\udc4d'.length"),
+ njs_str("1") },
+
+ { njs_str("'\\ud83d abc \\udc4d'"),
+ njs_str("� abc �") },
+
+ { njs_str("'\\ud83d'"),
+ njs_str("�") },
+
+ { njs_str("'\\ud83d\\uabcd'"),
+ njs_str("�ꯍ") },
+
+ { njs_str("'\\u{d800}\\u{dB00}'"),
+ njs_str("��") },
+
+ { njs_str("'\\u{d800}\\u{d7ff}'"),
+ njs_str("�") },
+
+ { njs_str("'\\u{d800}['"),
+ njs_str("�[") },
+
+ { njs_str("'\\u{D800}\\u{'"),
+ njs_str("SyntaxError: Invalid Unicode code point \"\\u{D800}\\u{\" in 1") },
+
+ { njs_str("'α' !== '\\α'"),
+ njs_str("false") },
+
+ { njs_str("'r' !== '\\r'"),
+ njs_str("true") },
+
+ /* Broken UTF-8 literals.*/
+
+ { njs_str("'\\a\x96\xE5\x9C\xE3\x81\xB6'"),
+ njs_str("a��ぶ") },
+
+ { njs_str("'\x96\\a\xE5\x9C'"),
+ njs_str("�a�") },
+
+ { njs_str("'\x96\xE5\\a'"),
+ njs_str("��a") },
+
+ { njs_str("'\\a\x96\\a'"),
+ njs_str("a�a") },
+
+ { njs_str("'\xF3\\a'"),
+ njs_str("�a") },
+
+ { njs_str("'\xF3\\a\xFF'"),
+ njs_str("�a�") },
+
+ { njs_str("'\\a\x96\x96\xE5\x9C\xE3\x81\xB6'"),
+ njs_str("a���ぶ") },
+
+ { njs_str("'\\a\x9C\x96\xE5\xE3\x81\xB6'"),
+ njs_str("a���ぶ") },
+
+ { njs_str("'\\a\xE5\x9C\xE3\x81\xB6'"),
+ njs_str("a�ぶ") },
+
+ { njs_str("'\\a\xEF\xBF\xBD\xE3\x81\xB6'"),
+ njs_str("a�ぶ") },
+
+ { njs_str("'\\a\xE5\xF6\x9C\xE3\x81\xB6'"),
+ njs_str("a���ぶ") },
+
+ { njs_str("var a = '\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xF3'; "
+ "[a.length, a[34], a[35]]"),
+ njs_str("36,a,�") },
+
+ { njs_str("''.hasOwnProperty('length')"),
+ njs_str("true") },
+
+ { njs_str("'abc'.hasOwnProperty('length')"),
+ njs_str("true") },
+
+ { njs_str("(new String('abc')).hasOwnProperty('length')"),
+ njs_str("true") },
+
+ { njs_str("'abc'.toUTF8().length"),
+ njs_str("3") },
+
+ { njs_str("'абв'.length"),
+ njs_str("3") },
+
+ { njs_str("'абв'.toUTF8().length"),
+ njs_str("6") },
+
+ { njs_str("'αβγ'.length"),
+ njs_str("3") },
+
+ { njs_str("'αβγ'.toUTF8().length"),
+ njs_str("6") },
+
+ { njs_str("'絵文字'.length"),
+ njs_str("3") },
+
+ { njs_str("'絵文字'.toUTF8().length"),
+ njs_str("9") },
+
+ { njs_str("'えもじ'.length"),
+ njs_str("3") },
+
+ { njs_str("'えもじ'.toUTF8().length"),
+ njs_str("9") },
+
+ { njs_str("'囲碁織'.length"),
+ njs_str("3") },
+
+ { njs_str("'囲碁織'.toUTF8().length"),
+ njs_str("9") },
+
+ { njs_str("var a = 'abc'; a.length"),
+ njs_str("3") },
+
+ { njs_str("var a = 'abc'; a['length']"),
+ njs_str("3") },
+
+ { njs_str("var a = 'абв'; a.length"),
+ njs_str("3") },
+
+ { njs_str("var a = 'abc' + 'абв'; a.length"),
+ njs_str("6") },
+
+ { njs_str("var a = 'abc' + 1 + 'абв'; a +' '+ a.length"),
+ njs_str("abc1абв 7") },
+
+ { njs_str("var a = 1; a.length"),
+ njs_str("undefined") },
+
+ { njs_str("var a = 'abc'; a.concat('абв', 123)"),
+ njs_str("abcабв123") },
+
+ { njs_str("''.concat.call(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)"),
+ njs_str("0123456789") },
+
+ { njs_str("''.concat.apply(0, [1, 2, 3, 4, 5, 6, 7, 8, 9])"),
+ njs_str("0123456789") },
+
+ { njs_str("var f = ''.concat.bind(0, 1, 2, 3, 4); f(5, 6, 7, 8, 9)"),
+ njs_str("0123456789") },
+
+ { njs_str("var f = ''.concat.bind(0, 1, 2, 3, 4); f(Math.sqrt(25))"),
+ njs_str("012345") },
+
+ { njs_str("var f = String.prototype.concat.bind(0, 1); f(2)"),
+ njs_str("012") },
+
+ { njs_str("var f = Function.prototype.call.bind"
+ " (String.prototype.concat, 0, 1);"
+ "f(2)"),
+ njs_str("012") },
+
+ { njs_str("var f = String.prototype.concat.bind(0, 1);"
+ "var o = { toString: f }; o"),
+ njs_str("01") },
+
+ { njs_str("''.concat.bind(0, 1, 2, 3, 4).call(5, 6, 7, 8, 9)"),
+ njs_str("012346789") },
+
+ { njs_str("''.concat.bind(0, 1, 2, 3, 4).apply(5,[6, 7, 8, 9])"),
+ njs_str("012346789") },
+
+ { njs_str("var f = Array.prototype.join.bind([0, 1, 2]); f()"),
+ njs_str("0,1,2") },
+
+ { njs_str("var f = Array.prototype.join.bind([0, 1, 2]);"
+ "var o = { toString: f }; o"),
+ njs_str("0,1,2") },
+
+ { njs_str("var f = Array.prototype.join.bind([0, 1, 2]); f('.')"),
+ njs_str("0.1.2") },
+
+ { njs_str("var f = Array.prototype.join.bind([0, 1, 2], '.');"
+ "var o = { toString: f }; o"),
+ njs_str("0.1.2") },
+
+ { njs_str("var f = Array.prototype.toString.bind([0, 1, 2]); f()"),
+ njs_str("0,1,2") },
+
+ { njs_str("var f = Array.prototype.toString.bind([0, 1, 2]);"
+ "var o = { toString: f }; o"),
+ njs_str("0,1,2") },
+
+ { njs_str("var s = { toString: function() { return '123' } };"
+ "var a = 'abc'; a.concat('абв', s)"),
+ njs_str("abcабв123") },
+
+ { njs_str("'\\u00CE\\u00B1'.toBytes() == 'α'"),
+ njs_str("true") },
+
+ { njs_str("'\\u00CE\\u00B1'.toBytes() === 'α'"),
+ njs_str("true") },
+
+ { njs_str("var b = '\\u00C2\\u00B6'.toBytes(), u = b.fromUTF8();"
+ "b.length +' '+ b +' '+ u.length +' '+ u"),
+ njs_str("2 ¶ 1 ¶") },
+
+ { njs_str("'α'.toBytes()"),
+ njs_str("null") },
+
+ { njs_str("'α'.toUTF8()[0]"),
+ njs_str("\xCE") },
+
+ { njs_str("var r = /^\\x80$/; r.source + r.source.length"),
+ njs_str("^\\x80$6") },
+
+ { njs_str("var r = /^\\\\x80$/; r.source + r.source.length"),
+ njs_str("^\\\\x80$7") },
+
+ { njs_str("/^\\x80$/.test('\\x80'.toBytes())"),
+ njs_str("true") },
+
+ { njs_str("/^\\xC2\\x80$/.test('\\x80'.toUTF8())"),
+ njs_str("true") },
+
+ { njs_str("'α'.toUTF8().toBytes()"),
+ njs_str("α") },
+
+ { njs_str("var a = 'a'.toBytes() + 'α'; a + a.length"),
+ njs_str("aα3") },
+
+ { njs_str("var a = 'µ§±®'.toBytes(); a"),
+ njs_str("\xB5\xA7\xB1\xAE") },
+
+ { njs_str("var a = 'µ§±®'.toBytes(2); a"),
+ njs_str("\xB1\xAE") },
+
+ { njs_str("var a = 'µ§±®'.toBytes(1,3); a"),
+ njs_str("\xA7\xB1") },
+
+ { njs_str("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes()"),
+ njs_str("µ§±®") },
+
+ { njs_str("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(2)"),
+ njs_str("±®") },
+
+ { njs_str("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(1, 3)"),
+ njs_str("§±") },
+
+ { njs_str("'A'.repeat(8).toBytes() === 'A'.repeat(8)"),
+ njs_str("true") },
+
+ { njs_str("'A'.repeat(16).toBytes() === 'A'.repeat(16)"),
+ njs_str("true") },
+
+ { njs_str("'A'.repeat(38).toBytes(-5) === 'AAAAA'"),
+ njs_str("true") },
+
+ { njs_str("('α' + 'A'.repeat(32)).toBytes()"),
+ njs_str("null") },
+
+ { njs_str("('α' + 'A'.repeat(32)).toBytes(1) === 'A'.repeat(32)"),
+ njs_str("true") },
+
+ { njs_str("('α' + 'A'.repeat(40)).toBytes(-3,-1)"),
+ njs_str("AA") },
+
+ { njs_str("var s = 'x'.repeat(2**10).repeat(2**14);"
+ "var a = Array(200).fill(s);"
+ "String.prototype.concat.apply(s, a.slice(1))"),
+ njs_str("RangeError: invalid string length") },
+
+ { njs_str("var a = 'abcdefgh'; a.substr(3, 15)"),
+ njs_str("defgh") },
+
+ { njs_str("'abcdefgh'.substr(3, 15)"),
+ njs_str("defgh") },
+
+ { njs_str("'abcdefghijklmno'.substr(3, 4)"),
+ njs_str("defg") },
+
+ { njs_str("'abcdefghijklmno'.substr(-3, 2)"),
+ njs_str("mn") },
+
+ { njs_str("'abcdefgh'.substr(100, 120)"),
+ njs_str("") },
+
+ { njs_str("('abc' + 'defgh').substr(1, 4)"),
+ njs_str("bcde") },
+
+ { njs_str("'abcdefghijklmno'.substring(3, 5)"),
+ njs_str("de") },
+
+ { njs_str("'abcdefgh'.substring(3)"),
+ njs_str("defgh") },
+
+ { njs_str("'abcdefgh'.substring(5, 3)"),
+ njs_str("de") },
+
+ { njs_str("'abcdefgh'.substring(100, 120)"),
+ njs_str("") },
+
+ { njs_str("'α'.repeat(32).substring(32)"),
+ njs_str("") },
+
+ { njs_str("'α'.repeat(32).substring(32,32)"),
+ njs_str("") },
+
+ { njs_str("'abcdefghijklmno'.slice(NaN, 5)"),
+ njs_str("abcde") },
+
+ { njs_str("'abcdefghijklmno'.slice(NaN, Infinity)"),
+ njs_str("abcdefghijklmno") },
+
+ { njs_str("'abcdefghijklmno'.slice(-Infinity, Infinity)"),
+ njs_str("abcdefghijklmno") },
+
+ { njs_str("'abcdefghijklmno'.slice('0', '5')"),
+ njs_str("abcde") },
+
+ { njs_str("'abcdefghijklmno'.slice(3, 5)"),
+ njs_str("de") },
+
+ { njs_str("'abcdefgh'.slice(3)"),
+ njs_str("defgh") },
+
+ { njs_str("'abcdefgh'.slice(undefined, undefined)"),
+ njs_str("abcdefgh") },
+
+ { njs_str("'abcdefgh'.slice(undefined)"),
+ njs_str("abcdefgh") },
+
+ { njs_str("'abcdefgh'.slice(undefined, 1)"),
+ njs_str("a") },
+
+ { njs_str("'abcdefgh'.slice(3, undefined)"),
+ njs_str("defgh") },
+
+ { njs_str("'abcde'.slice(50)"),
+ njs_str("") },
+
+ { njs_str("'abcde'.slice(1, 50)"),
+ njs_str("bcde") },
+
+ { njs_str("'abcdefgh'.slice(3, -2)"),
+ njs_str("def") },
+
+ { njs_str("'abcdefgh'.slice(5, 3)"),
+ njs_str("") },
+
+ { njs_str("'abcdefgh'.slice(100, 120)"),
+ njs_str("") },
+
+ { njs_str("String.prototype.substring(1, 5)"),
+ njs_str("") },
+
+ { njs_str("String.prototype.substr.call({toString:()=>{throw new Error('Oops')}})"),
+ njs_str("Error: Oops") },
+
+ { njs_str("String.prototype.slice(1, 5)"),
+ njs_str("") },
+
+ { njs_str("String.prototype.toBytes(1, 5)"),
+ njs_str("") },
+
+ { njs_str("'abc'.charAt(1 + 1)"),
+ njs_str("c") },
+
+ { njs_str("'abc'.charAt(3)"),
+ njs_str("") },
+
+ { njs_str("'abc'.charAt(undefined)"),
+ njs_str("a") },
+
+ { njs_str("'abc'.charAt(null)"),
+ njs_str("a") },
+
+ { njs_str("'abc'.charAt(false)"),
+ njs_str("a") },
+
+ { njs_str("'abc'.charAt(true)"),
+ njs_str("b") },
+
+ { njs_str("'abc'.charAt(NaN)"),
+ njs_str("a") },
+
+ { njs_str("'abc'.charAt(Infinity)"),
+ njs_str("") },
+
+ { njs_str("'abc'.charAt(-Infinity)"),
+ njs_str("") },
+
+ { njs_str("var o = { valueOf: function() {return 2} };"
+ "'abc'.charAt(o)"),
+ njs_str("c") },
+
+ { njs_str("var o = { toString: function() {return '2'} };"
+ "'abc'.charAt(o)"),
+ njs_str("c") },
+
+ { njs_str("'abc'.charCodeAt(1 + 1)"),
+ njs_str("99") },
+
+ { njs_str("'abc'.charCodeAt(3)"),
+ njs_str("NaN") },
+
+ { njs_str("'abc'.charCodeAt(undefined)"),
+ njs_str("97") },
+
+ { njs_str("var a = 'abcdef'; a.3"),
+ njs_str("SyntaxError: Unexpected token \".3\" in 1") },
+
+ { njs_str("'abcdef'[3]"),
+ njs_str("d") },
+
+ { njs_str("'abcdef'[0]"),
+ njs_str("a") },
+
+ { njs_str("'abcdef'[-1]"),
+ njs_str("undefined") },
+
+ { njs_str("'abcdef'[NaN]"),
+ njs_str("undefined") },
+
+ { njs_str("'abcdef'[3.5]"),
+ njs_str("undefined") },
+
+ { njs_str("'abcdef'[8]"),
+ njs_str("undefined") },
+
+ { njs_str("'abcdef'['1']"),
+ njs_str("b") },
+
+ { njs_str("'abcdef'[' 1']"),
+ njs_str("undefined") },
+
+ { njs_str("'abcdef'['1 ']"),
+ njs_str("undefined") },
+
+ { njs_str("'abcdef'['']"),
+ njs_str("undefined") },
+
+ { njs_str("'abcdef'['-']"),
+ njs_str("undefined") },
+
+ { njs_str("'abcdef'['-1']"),
+ njs_str("undefined") },
+
+ { njs_str("'abcdef'['01']"),
+ njs_str("undefined") },
+
+ { njs_str("'abcdef'['0x01']"),
+ njs_str("undefined") },
+
+ { njs_str("var a = 'abcdef', b = 1 + 2; a[b]"),
+ njs_str("d") },
+
+ /**/
+
+ { njs_str("'abc'.toString()"),
+ njs_str("abc") },
+
+ { njs_str("''.toString.call('abc')"),
+ njs_str("abc") },
+
+ { njs_str("String.prototype.toString.call('abc')"),
+ njs_str("abc") },
+
+ { njs_str("String.prototype.toString.call(new String('abc'))"),
+ njs_str("abc") },
+
+ { njs_str("String.prototype.toString.call(1)"),
+ njs_str("TypeError: unexpected value type:number") },
+
+ { njs_str("'abc'.valueOf()"),
+ njs_str("abc") },
+
+ /**/
+
+ { njs_str("var n = { toString: function() { return 1 } }; '12'[n]"),
+ njs_str("2") },
+
+ { njs_str("var n = { toString: function() { return '1' } }; '12'[n]"),
+ njs_str("2") },
+
+ { njs_str("var n = { toString: function() { return 1 },"
+ " valueOf: function() { return 0 } }; '12'[n]"),
+ njs_str("2") },
+
+ /* Externals. */
+
+ { njs_str("typeof $r"),
+ njs_str("external") },
+
+ { njs_str("var a = $r.uri, s = a.fromUTF8(); s.length +' '+ s"),
+ njs_str("3 АБВ") },
+
+ { njs_str("var a = $r.uri, b = $r2.uri, c = $r3.uri; a+b+c"),
+ njs_str("АБВαβγabc") },
+
+ { njs_str("var a = $r.uri; $r.uri = $r2.uri; $r2.uri = a; $r2.uri+$r.uri"),
+ njs_str("АБВαβγ") },
+
+ { njs_str("var a = $r.uri, s = a.fromUTF8(2); s.length +' '+ s"),
+ njs_str("2 БВ") },
+
+ { njs_str("var a = $r.uri, s = a.fromUTF8(2, 4); s.length +' '+ s"),
+ njs_str("1 Б") },
+
+ { njs_str("var a = $r.uri; a +' '+ a.length +' '+ a"),
+ njs_str("АБВ 6 АБВ") },
+
+ { njs_str("$r.uri = 'αβγ'; var a = $r.uri; a.length +' '+ a"),
+ njs_str("6 αβγ") },
+
+ { njs_str("$r.uri.length +' '+ $r.uri"),
+ njs_str("6 АБВ") },
+
+ { njs_str("$r.uri = $r.uri.substr(2); $r.uri.length +' '+ $r.uri"),
+ njs_str("4 БВ") },
+
+ { njs_str("'' + $r.props.a + $r2.props.a + $r.props.a"),
+ njs_str("121") },
+
+ { njs_str("var p1 = $r.props, p2 = $r2.props; '' + p2.a + p1.a"),
+ njs_str("21") },
+
+ { njs_str("var p1 = $r.props, p2 = $r2.props; '' + p1.a + p2.a"),
+ njs_str("12") },
+
+ { njs_str("var p = $r3.props; p.a = 1"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of external") },
+ { njs_str("var p = $r3.props; delete p.a"),
+ njs_str("TypeError: Cannot delete property \"a\" of external") },
+
+ { njs_str("$r.vars.p + $r2.vars.q + $r3.vars.k"),
+ njs_str("pvalqvalkval") },
+
+ { njs_str("$r.vars.unset"),
+ njs_str("undefined") },
+
+ { njs_str("var v = $r3.vars; v.k"),
+ njs_str("kval") },
+
+ { njs_str("var v = $r3.vars; v.unset = 1; v.unset"),
+ njs_str("1") },
+
+ { njs_str("$r.vars.unset = 'a'; $r2.vars.unset = 'b';"
+ "$r.vars.unset + $r2.vars.unset"),
+ njs_str("ab") },
+
+ { njs_str("$r.vars.unset = 1; $r2.vars.unset = 2;"
+ "$r.vars.unset + $r2.vars.unset"),
+ njs_str("12") },
+
+ { njs_str("$r3.vars.p = 'a'; $r3.vars.p2 = 'b';"
+ "$r3.vars.p + $r3.vars.p2"),
+ njs_str("ab") },
+
+ { njs_str("$r3.vars.p = 'a'; delete $r3.vars.p; $r3.vars.p"),
+ njs_str("undefined") },
+
+ { njs_str("$r3.vars.p = 'a'; delete $r3.vars.p; $r3.vars.p = 'b'; $r3.vars.p"),
+ njs_str("b") },
+
+ { njs_str("$r3.vars.error = 1"),
+ njs_str("Error: cannot set \"error\" prop") },
+
+ { njs_str("delete $r3.vars.error"),
+ njs_str("Error: cannot delete \"error\" prop") },
+
+ { njs_str("delete $r3.vars.e"),
+ njs_str("true") },
+
+ { njs_str("$r3.consts.k"),
+ njs_str("kval") },
+
+ { njs_str("$r3.consts.k = 1"),
+ njs_str("TypeError: Cannot assign to read-only property \"k\" of external") },
+
+ { njs_str("delete $r3.consts.k"),
+ njs_str("TypeError: Cannot delete property \"k\" of external") },
+
+ { njs_str("delete $r3.vars.p; $r3.vars.p"),
+ njs_str("undefined") },
+
+ { njs_str("var a = $r.host; a +' '+ a.length +' '+ a"),
+ njs_str("АБВГДЕЁЖЗИЙ 22 АБВГДЕЁЖЗИЙ") },
+
+ { njs_str("var a = $r.host; a.substr(2, 2)"),
+ njs_str("Б") },
+
+ { njs_str("var a = $r.header['User-Agent']; a +' '+ a.length +' '+ a"),
+ njs_str("User-Agent|АБВ 17 User-Agent|АБВ") },
+
+ { njs_str("var a='', p;"
+ "for (p in $r.header) { a += p +':'+ $r.header[p] +',' }"
+ "a"),
+ njs_str("01:01|АБВ,02:02|АБВ,03:03|АБВ,") },
+
+ { njs_str("$r.some_method('YES')"),
+ njs_str("АБВ") },
+
+ { njs_str("$r.create('XXX').uri"),
+ njs_str("XXX") },
+
+ { njs_str("var sr = $r.create('XXX'); sr.uri = 'YYY'; sr.uri"),
+ njs_str("YYY") },
+
+ { njs_str("var sr = $r.create('XXX'), sr2 = $r.create('YYY');"
+ "sr.uri = 'ZZZ'; "
+ "sr.uri + sr2.uri"),
+ njs_str("ZZZYYY") },
+
+ { njs_str("var sr = $r.create('XXX'); sr.vars.p = 'a'; sr.vars.p"),
+ njs_str("a") },
+
+ { njs_str("var p; for (p in $r.some_method);"),
+ njs_str("undefined") },
+
+ { njs_str("'uri' in $r"),
+ njs_str("true") },
+
+ { njs_str("'one' in $r"),
+ njs_str("false") },
+
+ { njs_str("'a' in $r.props"),
+ njs_str("true") },
+
+ { njs_str("delete $r.uri"),
+ njs_str("TypeError: Cannot delete property \"uri\" of external") },
+
+ { njs_str("delete $r.one"),
+ njs_str("TypeError: Cannot delete property \"one\" of external") },
+
+ { njs_str("$r.some_method.call($r, 'YES')"),
+ njs_str("АБВ") },
+
+ { njs_str("var f = $r.some_method.bind($r); f('YES')"),
+ njs_str("АБВ") },
+
+ { njs_str("function f(fn, arg) {return fn(arg);}; f($r.some_method.bind($r), 'YES')"),
+ njs_str("АБВ") },
+
+ { njs_str("$r.some_method.apply($r, ['YES'])"),
+ njs_str("АБВ") },
+
+ { njs_str("$r.some_method.call([], 'YES')"),
+ njs_str("TypeError: external value is expected") },
+
+ { njs_str("$r.nonexistent"),
+ njs_str("undefined") },
+
+ { njs_str("$r.error = 'OK'"),
+ njs_str("TypeError: Cannot assign to read-only property \"error\" of external") },
+
+ { njs_str("var a = { toString: function() { return 1 } }; a"),
+ njs_str("1") },
+
+ { njs_str("var a = { valueOf: function() { return 1 } }; a"),
+ njs_str("[object Object]") },
+
+ { njs_str("var a = { toString: 2,"
+ " valueOf: function() { return 1 } }; a"),
+ njs_str("1") },
+
+ { njs_str("var a = { toString: function() { return [] },"
+ " valueOf: function() { return 1 } }; a"),
+ njs_str("1") },
+
+ { njs_str("var a = { toString: function() { return [] },"
+ " valueOf: function() { return 1 } };"
+ "var o = {}; o[a] = 'test'"),
+ njs_str("test") },
+
+ { njs_str("({})[{}] = 'test'"),
+ njs_str("test") },
+
+ { njs_str("var o = {b:$r.props.b}; o.b"),
+ njs_str("42") },
+
+ { njs_str("$r2.uri == 'αβγ' && $r2.uri === 'αβγ'"),
+ njs_str("true") },
+
+ /**/
+
+ { njs_str("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(5)"),
+ njs_str("1077") },
+
+ { njs_str("'12345абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(35)"),
+ njs_str("1101") },
+
+ { njs_str("'12345абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.substring(35)"),
+ njs_str("эюя") },
+
+ { njs_str("'abcdef'.substr(-5, 4).substring(3, 1).charAt(1)"),
+ njs_str("d") },
+
+ { njs_str("'abcdef'.substr(2, 4).charAt(2)"),
+ njs_str("e") },
+
+ { njs_str("var a = 'abcdef'.substr(2, 4).charAt(2).length; a"),
+ njs_str("1") },
+
+ { njs_str("var a = 'abcdef'.substr(2, 4).charAt(2) + '1234'; a"),
+ njs_str("e1234") },
+
+ { njs_str("var a = ('abcdef'.substr(2, 5 * 2 - 6).charAt(2) + '1234')"
+ " .length; a"),
+ njs_str("5") },
+
+ { njs_str("String.fromCharCode('_').charCodeAt(0)"),
+ njs_str("0") },
+
+ { njs_str("String.fromCodePoint('_')"),
+ njs_str("RangeError") },
+
+ { njs_str("String.fromCharCode(65.14)"),
+ njs_str("A") },
+
+ { njs_str("String.fromCodePoint(3.14)"),
+ njs_str("RangeError") },
+
+ { njs_str("String.fromCharCode(65.14 + 65536)"),
+ njs_str("A") },
+
+ { njs_str("String.fromCodePoint(65 + 65536)"),
+ njs_str("𐁁") },
+
+ { njs_str("String.fromCharCode(2**53 + 10)"),
+ njs_str("\n") },
+
+ { njs_str("String.fromCodePoint(1114111 + 1)"),
+ njs_str("RangeError") },
+
+ { njs_str("String.fromCharCode(65, 90) + String.fromCodePoint(65, 90)"),
+ njs_str("AZAZ") },
+
+ { njs_str("String.fromCharCode(945, 946, 947) + String.fromCodePoint(945, 946, 947)"),
+ njs_str("αβγαβγ") },
+
+ { njs_str("(function() {"
+ " var n;"
+ " for (n = 0; n <= 65536; n++) {"
+ " if (String.fromCharCode(n).charCodeAt(0) !== n)"
+ " return n;"
+ " }"
+ " return -1"
+ "})()"),
+ njs_str("65536") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* very long test under MSAN */
+ { njs_str("(function() {"
+ " var n;"
+ " for (n = 0; n <= 1114111; n++) {"
+ " if (String.fromCodePoint(n).codePointAt(0) !== n)"
+ " return n;"
+ " }"
+ " return -1"
+ "})()"),
+ njs_str("-1") },
+#endif
+
+ { njs_str("var a = 'abcdef'; function f(a) {"
+ "return a.slice(a.indexOf('cd')) } f(a)"),
+ njs_str("cdef") },
+
+ { njs_str("var a = 'abcdef'; a.slice(a.indexOf('cd'))"),
+ njs_str("cdef") },
+
+ { njs_str("'abcdef'.indexOf('de', 2)"),
+ njs_str("3") },
+
+ { njs_str("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.indexOf('лмно', 10)"),
+ njs_str("12") },
+
+ { njs_str("'abcdef'.indexOf('a', 10)"),
+ njs_str("-1") },
+
+ { njs_str("'abcdef'.indexOf('q', 0)"),
+ njs_str("-1") },
+
+ { njs_str("'abcdef'.indexOf('', 10)"),
+ njs_str("6") },
+
+ { njs_str("'abcdef'.indexOf('', 3)"),
+ njs_str("3") },
+
+ { njs_str("'12345'.indexOf()"),
+ njs_str("-1") },
+
+ { njs_str("''.indexOf('')"),
+ njs_str("0") },
+
+ { njs_str("'12345'.indexOf(45, '0')"),
+ njs_str("3") },
+
+ { njs_str("'12'.indexOf('12345')"),
+ njs_str("-1") },
+
+ { njs_str("''.indexOf.call(12345, 45, '0')"),
+ njs_str("3") },
+
+ { njs_str("'abc'.lastIndexOf('abcdef')"),
+ njs_str("-1") },
+
+ { njs_str("'abc abc abc abc'.lastIndexOf('abc')"),
+ njs_str("12") },
+
+ { njs_str("'abc abc abc abc'.lastIndexOf('abc', 11)"),
+ njs_str("8") },
+
+ { njs_str("'abc abc abc abc'.lastIndexOf('abc', 0)"),
+ njs_str("0") },
+
+ { njs_str("'abc abc abc abc'.lastIndexOf('', 0)"),
+ njs_str("0") },
+
+ { njs_str("'abc abc abc abc'.lastIndexOf('', 5)"),
+ njs_str("5") },
+
+ { njs_str("'abc abc абвгд abc'.lastIndexOf('абвгд')"),
+ njs_str("8") },
+
+ { njs_str("'abc abc абвгд abc'.lastIndexOf('абвгд', undefined)"),
+ njs_str("8") },
+
+ { njs_str("'abc abc абвгд abc'.lastIndexOf('абвгд', NaN)"),
+ njs_str("8") },
+
+ { njs_str("'abc abc абвгд abc'.lastIndexOf('абвгд', {})"),
+ njs_str("8") },
+
+ { njs_str("String.prototype.lastIndexOf.call({toString:()=>'abc abc абвгд abc'}, 'абвгд')"),
+ njs_str("8") },
+
+ { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд')"),
+ njs_str("8") },
+
+ { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд', 11)"),
+ njs_str("8") },
+
+ { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд', 12)"),
+ njs_str("8") },
+
+ { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд', 13)"),
+ njs_str("8") },
+
+ { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд', 14)"),
+ njs_str("8") },
+
+ { njs_str("'abc abc абвгдежз'.lastIndexOf('абвгд', 15)"),
+ njs_str("8") },
+
+ { njs_str("'abc abc абвгдежз'.lastIndexOf('')"),
+ njs_str("16") },
+
+ { njs_str("'abc abc абвгдежз'.lastIndexOf('', 12)"),
+ njs_str("12") },
+
+ { njs_str("''.lastIndexOf('')"),
+ njs_str("0") },
+
+ { njs_str("''.lastIndexOf()"),
+ njs_str("-1") },
+
+ { njs_str("''.lastIndexOf(undefined)"),
+ njs_str("-1") },
+
+ { njs_str("'β'.repeat(32).lastIndexOf('β')"),
+ njs_str("31") },
+
+ { njs_str("'β'.repeat(32).lastIndexOf``"),
+ njs_str("32") },
+
+ { njs_str("JSON.stringify(Array(24).fill(true).map((v,i) => 'abc abc ab abc абвгдежзab'.lastIndexOf('abc', i)))"
+ "== JSON.stringify([].concat(Array(4).fill(0), Array(7).fill(4), Array(13).fill(11)))"),
+ njs_str("true") },
+
+ { njs_str("''.includes('')"),
+ njs_str("true") },
+
+ { njs_str("'12345'.includes()"),
+ njs_str("false") },
+
+ { njs_str("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.includes('лмно', 10)"),
+ njs_str("true") },
+
+ { njs_str("'абв абв абвгдежз'.includes('абвгд', 7)"),
+ njs_str("true") },
+
+ { njs_str("'абв абв абвгдежз'.includes('абвгд', 8)"),
+ njs_str("true") },
+
+ { njs_str("'абв абв абвгдежз'.includes('абвгд', 9)"),
+ njs_str("false") },
+
+ { njs_str("''.startsWith('')"),
+ njs_str("true") },
+
+ { njs_str("'12345'.startsWith()"),
+ njs_str("false") },
+
+ { njs_str("'abc'.startsWith('abc')"),
+ njs_str("true") },
+
+ { njs_str("'abc'.startsWith('abc', 1)"),
+ njs_str("false") },
+
+ { njs_str("'abc'.startsWith('abc', -1)"),
+ njs_str("true") },
+
+ { njs_str("'абв абв абвгдежз'.startsWith('абвгд', 8)"),
+ njs_str("true") },
+
+ { njs_str("'абв абв абвгдежз'.startsWith('абвгд', 9)"),
+ njs_str("false") },
+
+ { njs_str("''.endsWith('')"),
+ njs_str("true") },
+
+ { njs_str("'12345'.endsWith()"),
+ njs_str("false") },
+
+ { njs_str("'abc'.endsWith('abc')"),
+ njs_str("true") },
+
+ { njs_str("'abc'.endsWith('abc', 4)"),
+ njs_str("true") },
+
+ { njs_str("'abc'.endsWith('abc', 1)"),
+ njs_str("false") },
+
+ { njs_str("'abc'.endsWith('abc', -1)"),
+ njs_str("true") },
+
+ { njs_str("'абв абв абвгдежз'.endsWith('абвгд', 13)"),
+ njs_str("true") },
+
+ { njs_str("'абв абв абвгдежз'.endsWith('абвгд', 14)"),
+ njs_str("false") },
+
+ { njs_str("'\x00АБВГДЕЁЖЗ'.toLowerCase().length"),
+ njs_str("10") },
+
+ { njs_str("'ΑΒΓ'.toLowerCase()"),
+ njs_str("αβγ") },
+
+ { njs_str("'АБВ'.toLowerCase()"),
+ njs_str("абв") },
+
+ { njs_str("'Ȿ'.repeat(256).toLowerCase() === 'ȿ'.repeat(256)"),
+ njs_str("true") },
+
+ { njs_str("'abc'.toUpperCase()"),
+ njs_str("ABC") },
+
+ { njs_str("'αβγ'.toUpperCase()"),
+ njs_str("ΑΒΓ") },
+
+ { njs_str("'ȿ'.repeat(256).toUpperCase() === 'Ȿ'.repeat(256)"),
+ njs_str("true") },
+
+ { njs_str("'\x00абвгдеёжз'.toUpperCase().length"),
+ njs_str("10") },
+
+ { njs_str("['ȿ', 'Ȿ', 'ȿ'.toUpperCase(), 'Ȿ'.toLowerCase()].map((v)=>v.toUTF8().length)"),
+ njs_str("2,3,3,2") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* very long tests under MSAN */
+ { njs_str("var a = [], code;"
+ "for (code = 0; code <= 1114111; code++) {"
+ " var s = String.fromCodePoint(code);"
+ " var n = s.toUpperCase();"
+ " if (s != n && s != n.toLowerCase())"
+ " a.push(code);"
+ "} a"),
+ njs_str("181,305,383,453,456,459,498,837,962,976,977,981,982,1008,1009,1013,7296,7297,7298,7299,7300,7301,7302,7303,7304,7835,8126") },
+
+ { njs_str("var a = [], code;"
+ "for (code = 0; code <= 1114111; code++) {"
+ " var s = String.fromCodePoint(code);"
+ " var n = s.toLowerCase();"
+ " if (s != n && s != n.toUpperCase())"
+ " a.push(code);"
+ "} a"),
+ njs_str("304,453,456,459,498,1012,7838,8486,8490,8491") },
+#endif
+
+ { njs_str("'abc'.trimStart().trim().trimEnd()"),
+ njs_str("abc") },
+
+ { njs_str("''.trim()"),
+ njs_str("") },
+
+ { njs_str("' '.trim()"),
+ njs_str("") },
+
+ { njs_str("'abc '.trimEnd()"),
+ njs_str("abc") },
+
+ { njs_str("' abc'.trimStart()"),
+ njs_str("abc") },
+
+ { njs_str("' abc '.trim()"),
+ njs_str("abc") },
+
+ { njs_str("'абв '.trimEnd()"),
+ njs_str("абв") },
+
+ { njs_str("' абв'.trimStart()"),
+ njs_str("абв") },
+
+ { njs_str("' абв '.trimStart().trimEnd()"),
+ njs_str("абв") },
+
+ { njs_str("'\\u2029abc\\uFEFF\\u2028'.trim()"),
+ njs_str("abc") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* very long test under MSAN */
+ { njs_str("var a = [], code;"
+ "for (code = 0; code <= 1114111; code++) {"
+ " var ws = String.fromCodePoint(code);"
+ " if ((ws + '-' + ws).trim() === '-')"
+ " a.push(code);"
+ "} a"),
+ njs_str("9,10,11,12,13,32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288,65279") },
+#endif
+
+ { njs_str("'abcdefgh'.search()"),
+ njs_str("0") },
+
+ { njs_str("'abcdefgh'.search('')"),
+ njs_str("0") },
+
+ { njs_str("'abcdefgh'.search(undefined)"),
+ njs_str("0") },
+
+ { njs_str("'abcdefgh'.search(/def/)"),
+ njs_str("3") },
+
+ { njs_str("'abcdefgh'.search('def')"),
+ njs_str("3") },
+
+ { njs_str("'123456'.search('45')"),
+ njs_str("3") },
+
+ { njs_str("'123456'.search(45)"),
+ njs_str("3") },
+
+ { njs_str("'123456'.search(String(45))"),
+ njs_str("3") },
+
+ { njs_str("'123456'.search(Number('45'))"),
+ njs_str("3") },
+
+ { njs_str("var r = { toString: function() { return '45' } };"
+ "'123456'.search(r)"),
+ njs_str("3") },
+
+ { njs_str("var r = { toString: function() { return 45 } };"
+ "'123456'.search(r)"),
+ njs_str("3") },
+
+ { njs_str("var r = { toString: function() { return /45/ } };"
+ "'123456'.search(r)"),
+ njs_str("TypeError: Cannot convert object to primitive value") },
+
+ { njs_str("var r = { toString: function() { return /34/ },"
+ " valueOf: function() { return 45 } };"
+ "'123456'.search(r)"),
+ njs_str("3") },
+
+ { njs_str("'abcdefgh'.replace()"),
+ njs_str("abcdefgh") },
+
+ { njs_str("'abcdefgh'.replace('d')"),
+ njs_str("abcundefinedefgh") },
+
+ { njs_str("'abcdefgh'.replace('d', undefined)"),
+ njs_str("abcundefinedefgh") },
+
+ { njs_str("'a'.repeat(16).replace('a'.repeat(17)) === 'a'.repeat(16)"),
+ njs_str("true") },
+
+ { njs_str("'abcdefgh'.replace('d', null)"),
+ njs_str("abcnullefgh") },
+
+ { njs_str("'abcdefgh'.replace('d', 1)"),
+ njs_str("abc1efgh") },
+
+ { njs_str("'abcdefghdijklm'.replace('d', 'X')"),
+ njs_str("abcXefghdijklm") },
+
+ { njs_str("'абвгдежгийклм'.replace('г', 'Г')"),
+ njs_str("абвГдежгийклм") },
+
+ { njs_str("'abcdefghdijklm'.replace('d',"
+ " function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
+ njs_str("abc|abcdefghdijklm|3|d|efghdijklm") },
+
+ { njs_str("'abcdefgh'.replace('', 'X')"),
+ njs_str("Xabcdefgh") },
+
+ { njs_str("'abcdefghdijklm'.replace(/d/, 'X')"),
+ njs_str("abcXefghdijklm") },
+
+ { njs_str("'abcdefghdijklm'.replace(/d/,"
+ " function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
+ njs_str("abc|abcdefghdijklm|3|d|efghdijklm") },
+
+ { njs_str("'abcdefghdijklm'.replace(/(d)/,"
+ " function(m, p, o, s)"
+ "{ return '|'+s+'|'+o+'|'+m+'|'+p+'|' })"),
+ njs_str("abc|abcdefghdijklm|3|d|d|efghdijklm") },
+
+ { njs_str("'abcdefghdijklm'.replace(/x/, 'X')"),
+ njs_str("abcdefghdijklm") },
+
+ { njs_str("'abcdefghdijklm'.replace(/x/,"
+ " function(m, o, s) { return '|'+s+'|'+o+'|'+m+'|' })"),
+ njs_str("abcdefghdijklm") },
+
+ { njs_str("'абвгдежгийклм'.replace(/г/, 'Г')"),
+ njs_str("абвГдежгийклм") },
+
+ { njs_str("'abcdefghdijklm'.replace(/d/g, 'X')"),
+ njs_str("abcXefghXijklm") },
+
+ { njs_str("'абвгдежгийклм'.replace(/г/g, 'Г')"),
+ njs_str("абвГдежГийклм") },
+
+ { njs_str("'abc12345#$*%'.replace(/([^\\d]*)(\\d*)([^\\w]*)/,"
+ " function(match, p1, p2, p3) {"
+ " return [p1, p2, p3].join('-')})"),
+ njs_str("abc-12345-#$*%") },
+
+ { njs_str("'ABCDEFGHDIJKLM'.replace(/[A-Z]/g,"
+ " function(match) { return '-' + match.toLowerCase() })"),
+ njs_str("-a-b-c-d-e-f-g-h-d-i-j-k-l-m") },
+
+ { njs_str("'abcdbe'.replace(/(b)/g, '$')"),
+ njs_str("a$cd$e") },
+
+ { njs_str("'abcdbe'.replace(/(b)/g, '$2$23')"),
+ njs_str("a$2$23cd$2$23e") },
+
+ { njs_str("'abcdbe'.replace(/(b)/g, '$2$23X$$Y')"),
+ njs_str("a$2$23X$Ycd$2$23X$Ye") },
+
+ { njs_str("'abcdbe'.replace('b', '|$`X$\\'|')"),
+ njs_str("a|aXcdbe|cdbe") },
+
+ { njs_str("'abcdbe'.replace(/b/, '|$`X$\\'|')"),
+ njs_str("a|aXcdbe|cdbe") },
+
+ { njs_str("'abcdbefbgh'.replace(/b/g, '|$`X$\\'|')"),
+ njs_str("a|aXcdbefbgh|cd|abcdXefbgh|ef|abcdbefXgh|gh") },
+
+ { njs_str("'abc12345#$*%'.replace(/([^\\d]*)(\\d*)([^\\w]*)/,"
+ " '$1-$2-$3')"),
+ njs_str("abc-12345-#$*%") },
+
+ { njs_str("'$1,$2'.replace(/(\\$(\\d))/g, '$$1-$1$2')"),
+ njs_str("$1-$11,$1-$22") },
+
+ { njs_str("('β' + 'α'.repeat(33)+'β').replace(/(α+)(β+)/, function(m, p1) { return p1[32]; })"),
+ njs_str("βα") },
+
+ { njs_str("'abc'.replace(/(h*)(z*)(g*)/g, '$1nn$2zz$3')"),
+ njs_str("nnzzannzzbnnzzcnnzz") },
+
+ { njs_str("'abc'.replace(/(h*)(z*)/g, '$1nn$2zz$3yy')"),
+ njs_str("nnzz$3yyannzz$3yybnnzz$3yycnnzz$3yy") },
+
+ { njs_str("'ъ'.replace(/(h*)/g, '$1ЮЙ')"),
+ njs_str("ЮЙъЮЙ") },
+
+ { njs_str("'ъg'.replace(/(h*)/g, '$1ЮЙ')"),
+ njs_str("ЮЙъЮЙgЮЙ") },
+
+ { njs_str("'ъg'.replace(/(ъ*)/g, '$1ЮЙ')"),
+ njs_str("ъЮЙЮЙgЮЙ") },
+
+ { njs_str("'ъg'.replace(/(h*)/g, 'fg$1ЮЙ')"),
+ njs_str("fgЮЙъfgЮЙgfgЮЙ") },
+
+ { njs_str("'юgёfя'.replace(/(gё)/g, 'n$1i')"),
+ njs_str("юngёifя") },
+
+ { njs_str("'aabbccaa'.replace(/a*/g, '')"),
+ njs_str("bbcc") },
+
+ { njs_str("'aabbccaab'.replace(/z*/g, '')"),
+ njs_str("aabbccaab") },
+
+ { njs_str("'αβγ'.replace(/z*/g, '|')"),
+ njs_str("|α|β|γ|") },
+
+ { njs_str("''.replace(/a*/g, '')"),
+ njs_str("") },
+
+ { njs_str("'12345'.replace(3, () => 0)"),
+ njs_str("12045") },
+
+ { njs_str("'123'.replace(3, function() { return {toString: ()=>({})}; })"),
+ njs_str("TypeError: Cannot convert object to primitive value") },
+
+ { njs_str("'12345'.replace(3, () => ({toString: () => 'aaaa'}))"),
+ njs_str("12aaaa45") },
+
+ { njs_str("'abc'.replace(/(z*)/g, function v0() {return '124'})"),
+ njs_str("124a124b124c124") },
+
+ { njs_str("'abc'.replace(/(a*)/g, function v0() {return '124'})"),
+ njs_str("124124b124c124") },
+
+ { njs_str("'abc'.replace(/b/g, '$0')"),
+ njs_str("a$0c") },
+
+ { njs_str("typeof String.bytesFrom(Array(15).fill(0xE3)).replace(/^/g, 1)"),
+ njs_str("string") },
+
+#if 0 /* FIXME: PCRE limitation */
+ { njs_str("'abc'.replace(/^/g, '|$&|')"),
+ njs_str("||abc") },
+#endif
+
+ { njs_str("'abc'.replace(/b/g, '|$&|')"),
+ njs_str("a|b|c") },
+
+ { njs_str("'ABC'.replace(/((A)B)/g, '($1|$&|$2)')"),
+ njs_str("(AB|AB|A)C") },
+
+ { njs_str("/]/"),
+ njs_str("/\\]/") },
+
+ { njs_str("RegExp(']')"),
+ njs_str("/\\]/") },
+
+ { njs_str("RegExp('[\\\\\\\\]]')"),
+ njs_str("/[\\\\]\\]/") },
+
+ { njs_str("/[\\\\]]/"),
+ njs_str("/[\\\\]\\]/") },
+
+ { njs_str("/\\]/"),
+ njs_str("/\\]/") },
+
+ { njs_str("RegExp('\\]')"),
+ njs_str("/\\]/") },
+
+ { njs_str("/ab]cd/"),
+ njs_str("/ab\\]cd/") },
+
+ { njs_str("/ab]/"),
+ njs_str("/ab\\]/") },
+
+ { njs_str("/]cd/"),
+ njs_str("/\\]cd/") },
+
+ { njs_str("RegExp('\\\\0').source[1]"),
+ njs_str("0") },
+
+ { njs_str("']'.match(/]/)"),
+ njs_str("]") },
+
+ { njs_str("'ab]cd'.match(/]/)"),
+ njs_str("]") },
+
+ { njs_str("'ab]'.match(/]/)"),
+ njs_str("]") },
+
+ { njs_str("']cd'.match(/]/)"),
+ njs_str("]") },
+
+ { njs_str("'ab]cd'.match(/\\]/)"),
+ njs_str("]") },
+
+ { njs_str("'abc'.match(/a*/g)"),
+ njs_str("a,,,") },
+
+ { njs_str("'abc'.match(/z*/g)"),
+ njs_str(",,,") },
+
+ { njs_str("'abc'.match(/.?/g)"),
+ njs_str("a,b,c,") },
+
+ { njs_str("''.match(/a*/g)"),
+ njs_str("") },
+
+ { njs_str("''.match(/.?/g)"),
+ njs_str("") },
+
+ { njs_str("'абв'.match(/я?/g)"),
+ njs_str(",,,") },
+
+ { njs_str("'αβγ'.match(/z*/g)"),
+ njs_str(",,,") },
+
+ { njs_str("'囲碁織'.match(/z*/g)"),
+ njs_str(",,,") },
+
+ { njs_str("'𝟘𝟙𝟚𝟛'.match(/z*/g)"),
+ njs_str(",,,,") },
+
+ { njs_str("'abcdefgh'.match()"),
+ njs_str("") },
+
+ { njs_str("'abcdefgh'.match('')"),
+ njs_str("") },
+
+ { njs_str("'abcdefgh'.match(undefined)"),
+ njs_str("") },
+
+ { njs_str("'abcdefgh'.match(/def/)"),
+ njs_str("def") },
+
+ { njs_str("'abcdefgh'.match('def')"),
+ njs_str("def") },
+
+ { njs_str("'123456'.match('45')"),
+ njs_str("45") },
+
+ { njs_str("'123456'.match(45)"),
+ njs_str("45") },
+
+ { njs_str("'123456'.match(String(45))"),
+ njs_str("45") },
+
+ { njs_str("'123456'.match(Number('45'))"),
+ njs_str("45") },
+
+ { njs_str("var r = { toString: function() { return '45' } };"
+ "'123456'.match(r)"),
+ njs_str("45") },
+
+ { njs_str("var r = { toString: function() { return 45 } };"
+ "'123456'.match(r)"),
+ njs_str("45") },
+
+ { njs_str("var r = { toString: function() { return /45/ } };"
+ "'123456'.match(r)"),
+ njs_str("TypeError: Cannot convert object to primitive value") },
+
+ { njs_str("var r = { toString: function() { return /34/ },"
+ " valueOf: function() { return 45 } };"
+ "'123456'.match(r)"),
+ njs_str("45") },
+
+ { njs_str("''.match(/^$/)"),
+ njs_str("") },
+
+ { njs_str("''.match(/^$/g)"),
+ njs_str("") },
+
+ { njs_str("'abcdefgh'.match(/def/)"),
+ njs_str("def") },
+
+ { njs_str("'abc abc abc'.match('abc')"),
+ njs_str("abc") },
+
+ { njs_str("'abc abc abc'.match(/abc/)"),
+ njs_str("abc") },
+
+ { njs_str("'abc abc abc'.match(/abc/g)"),
+ njs_str("abc,abc,abc") },
+
+ { njs_str("'abc ABC aBc'.match(/abc/ig)"),
+ njs_str("abc,ABC,aBc") },
+
+ { njs_str("var a = 'α'.match(/α/g)[0] + 'α';"
+ "a +' '+ a.length"),
+ njs_str("αα 2") },
+
+ { njs_str("('β' + 'α'.repeat(33) +'β').match(/α+/g)[0][32]"),
+ njs_str("α") },
+
+ { njs_str("var a = '\\u00CE\\u00B1'.toBytes().match(/α/g)[0] + 'α';"
+ "a +' '+ a.length"),
+ njs_str("αα 4") },
+
+ { njs_str("typeof String.bytesFrom(Array(15).fill(0xE3)).match(/^/g)"),
+ njs_str("object") },
+
+ { njs_str("'abc'.split()"),
+ njs_str("abc") },
+
+ { njs_str("'abc'.split(undefined)"),
+ njs_str("abc") },
+
+ { njs_str("''.split('').length"),
+ njs_str("1") },
+
+ { njs_str("'abc'.split('')"),
+ njs_str("a,b,c") },
+
+ { njs_str("'αβγ'.split('')"),
+ njs_str("α,β,γ") },
+
+ { njs_str("'囲碁織'.split('')"),
+ njs_str("囲,碁,織") },
+
+ { njs_str("'𝟘𝟙𝟚𝟛'.split('')"),
+ njs_str("𝟘,𝟙,𝟚,𝟛") },
+
+ { njs_str("'囲α碁α織'.split('α')"),
+ njs_str("囲,碁,織") },
+
+ { njs_str("'a'.repeat(16).split('a'.repeat(15))"),
+ njs_str(",a") },
+
+ { njs_str("('α'+'β'.repeat(33)).repeat(2).split('α')[1][32]"),
+ njs_str("β") },
+
+ { njs_str("'abc'.split('abc')"),
+ njs_str(",") },
+
+ { njs_str("'a bc def'.split(' ')"),
+ njs_str("a,bc,def") },
+
+ { njs_str("'a bc def'.split(' ')"),
+ njs_str("a,bc,,def") },
+
+ { njs_str("'a bc def'.split(' ', 3)"),
+ njs_str("a,bc,") },
+
+ { njs_str("'abc'.split('abc')"),
+ njs_str(",") },
+
+ { njs_str("'ab'.split('123')"),
+ njs_str("ab") },
+
+ { njs_str("''.split(/0/).length"),
+ njs_str("1") },
+
+ { njs_str("'abc'.split(/(?:)/)"),
+ njs_str("a,b,c") },
+
+ { njs_str("'a bc def'.split(/ /)"),
+ njs_str("a,bc,def") },
+
+ { njs_str("'a bc def'.split(/ /)"),
+ njs_str("a,bc,,def") },
+
+ { njs_str("'abc'.split(/abc/)"),
+ njs_str(",") },
+
+ { njs_str("'0123456789'.split('').reverse().join('')"),
+ njs_str("9876543210") },
+
+ { njs_str("'abc'.repeat(3)"),
+ njs_str("abcabcabc") },
+
+ { njs_str("'абв'.repeat(3)"),
+ njs_str("абвабвабв") },
+
+ { njs_str("''.repeat(3)"),
+ njs_str("") },
+
+ { njs_str("'abc'.repeat(0)"),
+ njs_str("") },
+
+ { njs_str("'abc'.repeat(NaN)"),
+ njs_str("") },
+
+ { njs_str("'abc'.repeat(Infinity)"),
+ njs_str("RangeError") },
+
+ { njs_str("'abc'.repeat(-1)"),
+ njs_str("RangeError") },
+
+ { njs_str("''.repeat(-1)"),
+ njs_str("RangeError") },
+
+ { njs_str("'a'.repeat(2147483647)"),
+ njs_str("RangeError") },
+
+ { njs_str("'a'.repeat(2147483648)"),
+ njs_str("RangeError") },
+
+ { njs_str("'a'.repeat(Infinity)"),
+ njs_str("RangeError") },
+
+ { njs_str("'a'.repeat(NaN)"),
+ njs_str("") },
+
+ { njs_str("''.repeat(2147483646)"),
+ njs_str("") },
+
+ /* ES6: "". */
+ { njs_str("''.repeat(2147483647)"),
+ njs_str("RangeError") },
+
+ { njs_str("''.repeat(2147483648)"),
+ njs_str("RangeError") },
+
+ { njs_str("''.repeat(Infinity)"),
+ njs_str("RangeError") },
+
+ { njs_str("''.repeat(NaN)"),
+ njs_str("") },
+
+ { njs_str("'abc'.padStart(7)"),
+ njs_str(" abc") },
+
+ { njs_str("'абв'.padStart(7)"),
+ njs_str(" абв") },
+
+ { njs_str("'abc'.padStart(3)"),
+ njs_str("abc") },
+
+ { njs_str("'абв'.padStart(0)"),
+ njs_str("абв") },
+
+ { njs_str("'abc'.padStart(NaN)"),
+ njs_str("abc") },
+
+ { njs_str("'abc'.padStart(2147483647)"),
+ njs_str("RangeError") },
+
+ { njs_str("'abc'.padStart(2147483646, '')"),
+ njs_str("abc") },
+
+ { njs_str("''.padStart(0, '')"),
+ njs_str("") },
+
+ { njs_str("'1'.padStart(5, 0)"),
+ njs_str("00001") },
+
+ { njs_str("''.padStart(1, 'я')"),
+ njs_str("я") },
+
+ { njs_str("'abc'.padStart(6, NaN)"),
+ njs_str("NaNabc") },
+
+ { njs_str("'abc'.padStart(11, 123)"),
+ njs_str("12312312abc") },
+
+ { njs_str("'abc'.padStart(6, 12345)"),
+ njs_str("123abc") },
+
+ { njs_str("'абв'.padStart(6, 'эюя')"),
+ njs_str("эюяабв") },
+
+ { njs_str("'абв'.padStart(4, 'эюя')"),
+ njs_str("эабв") },
+
+ { njs_str("'абв'.padStart(7, 'эюя')"),
+ njs_str("эюяэабв") },
+
+ { njs_str("'абв'.padStart(10, 'эю')"),
+ njs_str("эюэюэюэабв") },
+
+ { njs_str("'1234'.padEnd(4)"),
+ njs_str("1234") },
+
+ { njs_str("'1234'.padEnd(-1)"),
+ njs_str("1234") },
+
+ { njs_str("'я'.padEnd(1)"),
+ njs_str("я") },
+
+ { njs_str("'1234'.padEnd(5)"),
+ njs_str("1234 ") },
+
+ { njs_str("'я'.padEnd(6)"),
+ njs_str("я ") },
+
+ { njs_str("'я'.padEnd(2147483647)"),
+ njs_str("RangeError") },
+
+ { njs_str("'я'.padEnd(2147483646, '')"),
+ njs_str("я") },
+
+ { njs_str("''.padEnd(0, '')"),
+ njs_str("") },
+
+ { njs_str("'эю'.padEnd(3, 'я')"),
+ njs_str("эюя") },
+
+ { njs_str("''.padEnd(1, 0)"),
+ njs_str("0") },
+
+ { njs_str("'1234'.padEnd(8, 'abcd')"),
+ njs_str("1234abcd") },
+
+ { njs_str("'1234'.padEnd(10, 'abcd')"),
+ njs_str("1234abcdab") },
+
+ { njs_str("'1234'.padEnd(7, 'abcd')"),
+ njs_str("1234abc") },
+
+ { njs_str("'абв'.padEnd(5, 'ГД')"),
+ njs_str("абвГД") },
+
+ { njs_str("'абв'.padEnd(4, 'ГДУ')"),
+ njs_str("абвГ") },
+
+ { njs_str("'абвг'.padEnd(10, 'ДЕЖЗ')"),
+ njs_str("абвгДЕЖЗДЕ") },
+
+ { njs_str("String.bytesFrom({})"),
+ njs_str("TypeError: value must be a string or array") },
+
+ { njs_str("String.bytesFrom([1, 2, 0.23, '5', 'A']).toString('hex')"),
+ njs_str("0102000500") },
+
+ { njs_str("String.bytesFrom([NaN, Infinity]).toString('hex')"),
+ njs_str("0000") },
+
+ { njs_str("String.bytesFrom('', 'hex')"),
+ njs_str("") },
+
+ { njs_str("String.bytesFrom('00aabbcc', 'hex').toString('hex')"),
+ njs_str("00aabbcc") },
+
+ { njs_str("String.bytesFrom('deadBEEF##', 'hex').toString('hex')"),
+ njs_str("deadbeef") },
+
+ { njs_str("String.bytesFrom('aa0', 'hex').toString('hex')"),
+ njs_str("aa") },
+
+ { njs_str("String.bytesFrom('', 'base64')"),
+ njs_str("") },
+
+ { njs_str("String.bytesFrom('#', 'base64')"),
+ njs_str("") },
+
+ { njs_str("String.bytesFrom('QQ==', 'base64')"),
+ njs_str("A") },
+
+ { njs_str("String.bytesFrom('QQ', 'base64')"),
+ njs_str("A") },
+
+ { njs_str("String.bytesFrom('QUI=', 'base64')"),
+ njs_str("AB") },
+
+ { njs_str("String.bytesFrom('QUI', 'base64')"),
+ njs_str("AB") },
+
+ { njs_str("String.bytesFrom('QUJD', 'base64')"),
+ njs_str("ABC") },
+
+ { njs_str("String.bytesFrom('QUJDRA==', 'base64')"),
+ njs_str("ABCD") },
+
+ { njs_str("String.bytesFrom('', 'base64url')"),
+ njs_str("") },
+
+ { njs_str("String.bytesFrom('QQ', 'base64url')"),
+ njs_str("A") },
+
+ { njs_str("String.bytesFrom('QUI', 'base64url')"),
+ njs_str("AB") },
+
+ { njs_str("String.bytesFrom('QUJD', 'base64url')"),
+ njs_str("ABC") },
+
+ { njs_str("String.bytesFrom('QUJDRA', 'base64url')"),
+ njs_str("ABCD") },
+
+ { njs_str("String.bytesFrom('QUJDRA#', 'base64url')"),
+ njs_str("ABCD") },
+
+ { njs_str("encodeURI.name"),
+ njs_str("encodeURI")},
+
+ { njs_str("encodeURI.length"),
+ njs_str("1")},
+
+ { njs_str("encodeURI()"),
+ njs_str("undefined")},
+
+ { njs_str("encodeURI('012абв')"),
+ njs_str("012%D0%B0%D0%B1%D0%B2")},
+
+ { njs_str("encodeURI('~}|{`_^]\\\\[@?>=<;:/.-,+*)(\\\'&%$#\"! ')"),
+ njs_str("~%7D%7C%7B%60_%5E%5D%5C%5B@?%3E=%3C;:/.-,+*)('&%25$#%22!%20")},
+
+ { njs_str("encodeURIComponent.name"),
+ njs_str("encodeURIComponent")},
+
+ { njs_str("encodeURIComponent.length"),
+ njs_str("1")},
+
+ { njs_str("encodeURIComponent('~}|{`_^]\\\\[@?>=<;:/.-,+*)(\\\'&%$#\"! ')"),
+ njs_str("~%7D%7C%7B%60_%5E%5D%5C%5B%40%3F%3E%3D%3C%3B%3A%2F.-%2C%2B*)('%26%25%24%23%22!%20")},
+
+ { njs_str("decodeURI.name"),
+ njs_str("decodeURI")},
+
+ { njs_str("decodeURI.length"),
+ njs_str("1")},
+
+ { njs_str("decodeURI()"),
+ njs_str("undefined")},
+
+ { njs_str("decodeURI('%QQ')"),
+ njs_str("URIError")},
+
+ { njs_str("decodeURI('%')"),
+ njs_str("URIError")},
+
+ { njs_str("decodeURI('%0')"),
+ njs_str("URIError")},
+
+ { njs_str("decodeURI('%00')"),
+ njs_str("\0")},
+
+ { njs_str("decodeURI('%3012%D0%B0%D0%B1%D0%B2')"),
+ njs_str("012абв")},
+
+ { njs_str("decodeURI('%7e%7d%7c%7b%60%5f%5e%5d%5c%5b%40%3f%3e%3d%3c%3b%3a%2f%2e%2c%2b%2a%29%28%27%26%25%24%23%22%21%20')"),
+ njs_str("~}|{`_^]\\[%40%3f>%3d<%3b%3a%2f.%2c%2b*)('%26%%24%23\"! ")},
+
+ { njs_str("decodeURIComponent.name"),
+ njs_str("decodeURIComponent")},
+
+ { njs_str("decodeURIComponent.length"),
+ njs_str("1")},
+
+ { njs_str("decodeURIComponent('%7e%7d%7c%7b%60%5f%5e%5d%5c%5b%40%3f%3e%3d%3c%3b%3a%2f%2e%2c%2b%2a%29%28%27%26%25%24%23%22%21%20')"),
+ njs_str("~}|{`_^]\\[@?>=<;:/.,+*)('&%$#\"! ")},
+
+ { njs_str("decodeURI('%41%42%43').length"),
+ njs_str("3")},
+
+ { njs_str("decodeURI('%D0%B0%D0%B1%D0%B2').length"),
+ njs_str("3")},
+
+ { njs_str("decodeURI('%80%81%82').length"),
+ njs_str("3")},
+
+ /* Functions. */
+
+ { njs_str("return"),
+ njs_str("SyntaxError: Illegal return statement in 1") },
+
+ { njs_str("{return}"),
+ njs_str("SyntaxError: Illegal return statement in 1") },
+
+ { njs_str("\n{\nreturn;\n}"),
+ njs_str("SyntaxError: Illegal return statement in 3") },
+
+ { njs_str("if (1) function f(){}"),
+ njs_str("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+ { njs_str("if (1) { function f(){}}"),
+ njs_str("undefined") },
+
+ { njs_str("while (1) function f() { }"),
+ njs_str("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+ { njs_str("while (1) { break; function f(){}}"),
+ njs_str("undefined") },
+
+ { njs_str("for (;;) function f() { }"),
+ njs_str("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+ { njs_str("for (;;) { break; function f(){}}"),
+ njs_str("undefined") },
+
+ { njs_str("do function f() { } while (0)"),
+ njs_str("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+ { njs_str("function f() { return 1; } { function f() { return 2; } } f()"),
+ njs_str("1") },
+
+ { njs_str("function f() { return 1; } { function f() { return 2; } { function f() { return 3; } }} f()"),
+ njs_str("1") },
+
+ { njs_str("{function f() {} {} f() }"),
+ njs_str("undefined") },
+
+ { njs_str("{ var f; function f() {} }"),
+ njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+ { njs_str("{ function f() {} var f; }"),
+ njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+ { njs_str("{ function f() {} { var f }}"),
+ njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+ { njs_str("function f() { return f() } f()"),
+ njs_str("RangeError: Maximum call stack size exceeded") },
+
+ { njs_str("function () { } f()"),
+ njs_str("SyntaxError: Unexpected token \"(\" in 1") },
+
+ { njs_str("function f() { }"),
+ njs_str("undefined") },
+
+ { njs_str("function f() { }; f.length"),
+ njs_str("0") },
+
+ { njs_str("function f() { }; f.length = 1"),
+ njs_str("TypeError: Cannot assign to read-only property \"length\" of function") },
+
+ { njs_str("function f(...rest) { }; f.length"),
+ njs_str("0") },
+
+ { njs_str("function f(...rest) { }; var binded = f.bind(this, [1,2]);"
+ "binded.length"),
+ njs_str("0") },
+
+ { njs_str("function f(a,a) { };"),
+ njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+ { njs_str("function f(a,b,a) { };"),
+ njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+ { njs_str("function f(a, ...a) { };"),
+ njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+ { njs_str("(function(a,a) { })"),
+ njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+ { njs_str("(function(a,...a) { })"),
+ njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+ { njs_str("(function f(a,a) { })"),
+ njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+ { njs_str("(function f(a,...a) { })"),
+ njs_str("SyntaxError: Duplicate parameter names in 1") },
+
+ { njs_str("function f(a,b) { }; f.length"),
+ njs_str("2") },
+
+ { njs_str("function f(a,...rest) { }; f.length"),
+ njs_str("1") },
+
+ { njs_str("function f(a,b) { }; var ff = f.bind(f, 1); ff.length"),
+ njs_str("1") },
+
+ { njs_str("Object((new Date(0)).toJSON())+0"),
+ njs_str("1970-01-01T00:00:00.000Z0") },
+
+ { njs_str("Object((new Array(0)).toString())+0"),
+ njs_str("0") },
+
+ { njs_str("JSON.parse.length"),
+ njs_str("2") },
+
+ { njs_str("JSON.parse.bind(JSON, '[]').length"),
+ njs_str("1") },
+
+ { njs_str("var o = {}; o.hasOwnProperty.length"),
+ njs_str("1") },
+
+ { njs_str("var x; function f() { }"),
+ njs_str("undefined") },
+
+ { njs_str("function f() { } f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f() { ; } f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f() { ;; } f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f() { return } f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f() { return; } f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f() { return;; } f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f() { return 1 } f()"),
+ njs_str("1") },
+
+ { njs_str("function f() { return 1; } f()"),
+ njs_str("1") },
+
+ { njs_str("function f() { return 1;; } f()"),
+ njs_str("1") },
+
+ { njs_str("function f() { return 1\n 2 } f()"),
+ njs_str("1") },
+
+ { njs_str("function f() { return 1\n 2 } f()"),
+ njs_str("1") },
+
+ { njs_str("(function f() { return 2.toString(); })()"),
+ njs_str("SyntaxError: Unexpected token \"toString\" in 1") },
+
+ { njs_str("(function f() { return 2..toString(); })()"),
+ njs_str("2") },
+
+ { njs_str("function f(a) { if (a) return 'OK' } f(1)+f(0)"),
+ njs_str("OKundefined") },
+
+ { njs_str("function f(a) { if (a) return 'OK'; } f(1)+f(0)"),
+ njs_str("OKundefined") },
+
+ { njs_str("function f(a) { if (a) return 'OK';; } f(1)+f(0)"),
+ njs_str("OKundefined") },
+
+ { njs_str("var a = 1; a()"),
+ njs_str("TypeError: number is not a function") },
+
+ { njs_str("var o = {a:1}; o.a()"),
+ njs_str("TypeError: (intermediate value)[\"a\"] is not a function") },
+
+ { njs_str("(function(){})()"),
+ njs_str("undefined") },
+
+ { njs_str("var q = 1; function x(a, b, c) { q = a } x(5); q"),
+ njs_str("5") },
+
+ { njs_str("function x(a) { while (a < 2) a++; return a + 1 } x(1) "),
+ njs_str("3") },
+
+ { njs_str("(function(){(function(){(function(){(function(){"
+ "(function(){(function(){(function(){})})})})})})})"),
+ njs_str("SyntaxError: The maximum function nesting level is \"5\" in 1") },
+
+ { njs_str("Function.prototype.toString = function () {return 'X'};"
+ "eval"),
+ njs_str("X") },
+
+ { njs_str("var o = {f:function(x){ return x**2}}; o.f\n(2)"),
+ njs_str("4") },
+
+ { njs_str("var o = {f:function(x){ return x**2}}; o\n.f\n(2)"),
+ njs_str("4") },
+
+ { njs_str("var o = {f:function(x){ return x**2}}; o\n.\nf\n(2)"),
+ njs_str("4") },
+
+ { njs_str("function f(x){ return x**2}; [f(2)\n, f\n(2),\nf\n(\n2),\nf\n(\n2\n)]"),
+ njs_str("4,4,4,4") },
+
+ { njs_str("function f (x){ return x**2}; f\n(2)"),
+ njs_str("4") },
+
+ { njs_str("function f (x){ return x**2}; f\n(\n2)"),
+ njs_str("4") },
+
+ { njs_str("function f (x){ return x**2}; f\n(\n2\n)"),
+ njs_str("4") },
+
+ { njs_str("function f (x){ return x**2}; f\n(2\n)"),
+ njs_str("4") },
+
+ { njs_str("function f (x){ return x**2}; f(2\n)"),
+ njs_str("4") },
+
+ { njs_str("var fn = Function.prototype.call; fn.call(() => 1)"),
+ njs_str("1") },
+
+ { njs_str("var fn = Function.prototype.call; fn.call(fn, () => 1)"),
+ njs_str("1") },
+
+ { njs_str("var fn = Function.prototype.call; fn.call(fn, fn, () => 1)"),
+ njs_str("1") },
+
+ { njs_str("eval.call.call(Number)"),
+ njs_str("0") },
+
+ { njs_str("URIError.apply.apply(RegExp)"),
+ njs_str("/(?:)/") },
+
+ { njs_str("[0].some(function(){return Array.call.bind(isNaN)}())"),
+ njs_str("false") },
+
+ /* Recursive factorial. */
+
+ { njs_str("function f(a) {"
+ " if (a > 1)"
+ " return a * f(a - 1)\n"
+ " return 1"
+ "}"
+ "f(10)"),
+ njs_str("3628800") },
+
+ /* Recursive factorial. */
+
+ { njs_str("function f(a) { return (a > 1) ? a * f(a - 1) : 1 } f(10)"),
+ njs_str("3628800") },
+
+ { njs_str("var g = function f(a) { return (a > 1) ? a * f(a - 1) : 1 };"
+ "g(10)"),
+ njs_str("3628800") },
+
+ { njs_str("(function f(a) { return (a > 1) ? a * f(a - 1) : 1 })(10)"),
+ njs_str("3628800") },
+
+ /* Nested functions and closures. */
+
+ { njs_str("function f() { var x = 4; "
+ "function g() { return x }; return g(); } f()"),
+ njs_str("4") },
+
+ { njs_str("function f(a) { function g(b) { return a + b } return g }"
+ "var k = f('a'); k('b')"),
+ njs_str("ab") },
+
+ { njs_str("function f(a) { return function(b) { return a + b } }"
+ "var k = f('a'); k('b')"),
+ njs_str("ab") },
+
+ { njs_str("function f(a) { return function(b) { return a + b } }"
+ "var k = f('a'), m = f('b'); k('c') + m('d')"),
+ njs_str("acbd") },
+
+ { njs_str("function f(a) { return "
+ "function(b) { return function(c) { return a + b + c } } }"
+ "var g = f('a'), k = g('b'), m = g('c'); k('d') + m('e')"),
+ njs_str("abdace") },
+
+ { njs_str("function f(a) {"
+ "function g() { return a }; return g; }"
+ "var y = f(4); y()"),
+ njs_str("4") },
+
+ { njs_str("function f() { var x = 4; "
+ "return function() { return x } }"
+ "var y = f(); y()"),
+ njs_str("4") },
+
+ { njs_str("function f() { var x = 4;"
+ "function g() { if (1) { return 2 + x; } }; return g }"
+ "var y = f(); y()"),
+ njs_str("6") },
+
+ { njs_str("var x; var y = 4;"
+ "function f() { function h() { x = 3; return y; } }"),
+ njs_str("undefined") },
+
+ { njs_str("function f() {"
+ " var a = 'a';"
+ " if (0) { a = 'b' };"
+ " function f2() { return a };"
+ " return f2"
+ "};"
+ "f()()"),
+ njs_str("a") },
+
+ { njs_str("function f() {"
+ " var a = 'a'; "
+ " if (0) { if (0) {a = 'b'} };"
+ " function f2() { return a };"
+ " return f2"
+ "};"
+ "f()()"),
+ njs_str("a") },
+
+ { njs_str("function f() { var a = f2(); }"),
+ njs_str("undefined") },
+
+ { njs_str("function f() { var a = f2(); } f();"),
+ njs_str("ReferenceError: \"f2\" is not defined in 1") },
+
+ { njs_str("typeof Buffer !== 'undefined' ? Buffer : function Buffer(){}"),
+ njs_str("[object Function]") },
+
+ { njs_str("1 == 2 ? func() : '123'"),
+ njs_str("123") },
+
+ { njs_str("1 == 1 ? func() : '123'"),
+ njs_str("ReferenceError: \"func\" is not defined in 1") },
+
+ { njs_str("function f(){ if (1 == 1) { 1 == 2 ? some_var : '123' } }; f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f(){ if (1 == 1) { 1 == 1 ? some_var : '123' } }; f()"),
+ njs_str("ReferenceError: \"some_var\" is not defined in 1") },
+
+ { njs_str("function f(){ if (1 == 1) { 1 == 2 ? some_func() : '123' } }; f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f(){ if (1 == 1) { 1 == 1 ? some_func() : '123' } }; f()"),
+ njs_str("ReferenceError: \"some_func\" is not defined in 1") },
+
+ { njs_str("(function(){ function f() {return f}; return f()})()"),
+ njs_str("[object Function]") },
+
+ { njs_str("function f() {}; f.toString = ()=> 'F'; ({'F':1})[f]"),
+ njs_str("1") },
+
+ { njs_str("var a = ''; "
+ "function f(list) {"
+ " function add(v) {a+=v};"
+ " list.forEach(function(v) {add(v)});"
+ "};"
+ "f(['a', 'b', 'c']); a"),
+ njs_str("abc") },
+
+ { njs_str("var l = [];"
+ "var f = function() { "
+ " function f2() { l.push(f); l.push(f2); }; "
+ " l.push(f); l.push(f2); "
+ " f2(); "
+ "}; "
+ "f(); "
+ "l.every(function(v) {return typeof v == 'function'})"),
+ njs_str("true") },
+
+ { njs_str("var l = [];"
+ "function baz() {"
+ " function foo(v) {"
+ " function bar() { foo(0); }"
+ " l.push(v);"
+ " if (v === 1) { bar(); }"
+ " }"
+ " foo(1);"
+ "}; baz(); l"),
+ njs_str("1,0") },
+
+ { njs_str("var gen = (function(){ "
+ " var s = 0; "
+ " return { inc: function() {s++}, "
+ " s: function() {return s} };});"
+ "var o1 = gen(); var o2 = gen();"
+ "[o1.s(),o2.s(),o1.inc(),o1.s(),o2.s(),o2.inc(),o1.s(),o2.s()]"),
+ njs_str("0,0,,1,0,,1,1") },
+
+ /* Recursive fibonacci. */
+
+ { njs_str("function fibo(n) {"
+ " if (n > 1)"
+ " return fibo(n-1) + fibo(n-2)\n"
+ " return 1"
+ "}"
+ "fibo(10)"),
+ njs_str("89") },
+
+ { njs_str("function fibo(n) {"
+ " if (n > 1)"
+ " return fibo(n-1) + fibo(n-2)\n"
+ " return '.'"
+ "}"
+ "fibo(10).length"),
+ njs_str("89") },
+
+ { njs_str("function fibo(n) {"
+ " if (n > 1)"
+ " return fibo(n-1) + fibo(n-2)\n"
+ " return 1"
+ "}"
+ "fibo('10')"),
+ njs_str("89") },
+
+ { njs_str("function add(a, b) { return a + b }"
+ "function mul(a, b) { return a * b }"
+ "function f(a, b) {"
+ " return a + mul(add(1, 2), add(2, 3)) + b"
+ "}"
+ "f(30, 70)"),
+ njs_str("115") },
+
+ { njs_str("function a(x, y) { return x + y }"
+ "function b(x, y) { return x * y }"
+ "a(3, b(4, 5))"),
+ njs_str("23") },
+
+ { njs_str("function x(n) { return n }; x('12'.substr(1))"),
+ njs_str("2") },
+
+ { njs_str("function f(a) { a *= 2 } f(10)"),
+ njs_str("undefined") },
+
+ { njs_str("function f() { return 5 } f()"),
+ njs_str("5") },
+
+ { njs_str("function g(x) { return x + 1 }"
+ "function f(x) { return x } f(g)(2)"),
+ njs_str("3") },
+
+ { njs_str("function f() { return 5 } f(1)"),
+ njs_str("5") },
+
+ { njs_str("function f() {} f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f() {;} f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f(){return} f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f(){return;} f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f(){return\n1} f()"),
+ njs_str("undefined") },
+
+ { njs_str("function f(a) { return a + 1 } var b = f(2); b"),
+ njs_str("3") },
+
+ { njs_str("var f = function(a) { a *= 2; return a }; f(10)"),
+ njs_str("20") },
+
+ { njs_str("var f = function b(a) { a *= 2; return a }; f(10)"),
+ njs_str("20") },
+
+ { njs_str("var f = function b(a) { a *= 2; return a }; b(10)"),
+ njs_str("ReferenceError: \"b\" is not defined in 1") },
+
+ { njs_str("var f; f = function(a) { a *= 2; return a }; f(10)"),
+ njs_str("20") },
+
+ { njs_str("var f; f = function b(a) { a *= 2; return a }; f(10)"),
+ njs_str("20") },
+
+ { njs_str("var a, f = a = function(a) { a *= 2; return a }; f(10)"),
+ njs_str("20") },
+
+ { njs_str("var a, f = a = function(a) { a *= 2; return a }; a(10)"),
+ njs_str("20") },
+
+ { njs_str("var f = function b(a) { a *= 2; return a } = 5"),
+ njs_str("ReferenceError: Invalid left-hand side in assignment in 1") },
+
+ { njs_str("function a() { return { x:2} }; var b = a(); b.x"),
+ njs_str("2") },
+
+ { njs_str("var a = {}; function f(a) { return a + 1 } a.b = f(2); a.b"),
+ njs_str("3") },
+
+ { njs_str("(function(x) { return x + 1 })(2)"),
+ njs_str("3") },
+
+ { njs_str("(function(x) { return x + 1 }(2))"),
+ njs_str("3") },
+
+ { njs_str("var a = function() { return 1 }(); a"),
+ njs_str("1") },
+
+ { njs_str("var a = (function() { return 1 })(); a"),
+ njs_str("1") },
+
+ { njs_str("var a = (function(a) { return a + 1 })(2); a"),
+ njs_str("3") },
+
+ { njs_str("var a = (function(a) { return a + 1 }(2)); a"),
+ njs_str("3") },
+
+ { njs_str("var a = +function(a) { return a + 1 }(2); a"),
+ njs_str("3") },
+
+ { njs_str("var a = -function(a) { return a + 1 }(2); a"),
+ njs_str("-3") },
+
+ { njs_str("var a = !function(a) { return a + 1 }(2); a"),
+ njs_str("false") },
+
+ { njs_str("var a = ~function(a) { return a + 1 }(2); a"),
+ njs_str("-4") },
+
+ { njs_str("var a = void function(a) { return a + 1 }(2); a"),
+ njs_str("undefined") },
+
+ { njs_str("var a = true && function(a) { return a + 1 }(2); a"),
+ njs_str("3") },
+
+ { njs_str("var a; a = 0, function(a) { return a + 1 }(2); a"),
+ njs_str("0") },
+
+ { njs_str("var a = (0, function(a) { return a + 1 }(2)); a"),
+ njs_str("3") },
+
+ { njs_str("var a = 0, function(a) { return a + 1 }(2); a"),
+ njs_str("SyntaxError: Unexpected token \"function\" in 1") },
+
+ { njs_str("var a = (0, function(a) { return a + 1 }(2)); a"),
+ njs_str("3") },
+
+ { njs_str("var a = +function f(a) { return a + 1 }(2);"
+ "var b = f(5); a"),
+ njs_str("ReferenceError: \"f\" is not defined in 1") },
+
+ { njs_str("var o = { f: function(a) { return a * 2 } }; o.f(5)"),
+ njs_str("10") },
+
+ { njs_str("var o = {}; o.f = function(a) { return a * 2 }; o.f(5)"),
+ njs_str("10") },
+
+ { njs_str("var o = { x: 1, f: function() { return this.x } }; o.f()"),
+ njs_str("1") },
+
+ { njs_str("var o = { x: 1, f: function(a) { return this.x += a } };"
+ "o.f(5) +' '+ o.x"),
+ njs_str("6 6") },
+
+ { njs_str("var f = function(a) { return 3 }; f.call()"),
+ njs_str("3") },
+
+ { njs_str("var f = function(a) { return this }; f.call(5)"),
+ njs_str("5") },
+
+ { njs_str("var f = function(a, b) { return this + a }; f.call(5, 1)"),
+ njs_str("6") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "f.call(5, 1, 2)"),
+ njs_str("8") },
+
+ { njs_str("var f = function(a) { return 3 }; f.apply()"),
+ njs_str("3") },
+
+ { njs_str("var f = function(a) { return this }; f.apply(5)"),
+ njs_str("5") },
+
+ { njs_str("var f = function(a) { return this + a }; f.apply(5, 1)"),
+ njs_str("TypeError: second argument is not an array-like object") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "f.apply(5, [1, 2])"),
+ njs_str("8") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "f.apply(5, [1, 2], 3)"),
+ njs_str("8") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "f.apply(5, {'length':2, '0':1, '1':2})"),
+ njs_str("8") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "f.apply(5, {'length':2, '0':1, '1':2, '2':3})"),
+ njs_str("8") },
+
+ { njs_str("var f = function(a, b, c) { return this + a + b + c};"
+ "f.apply(\"a\", {'length':2, '0':1, '1':2, '2':3})"),
+ njs_str("a12undefined") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "f.apply(5, {'length':3, '0':1, '1':2, '2':3})"),
+ njs_str("8") },
+
+ { njs_str("var f = function(a) { return this + a };"
+ "f.apply(5, {'nolength':3, '0':1, '1':2})"),
+ njs_str("NaN") },
+
+ { njs_str("var f = function(a) { return this };"
+ "f.apply(5, {'nolength':3, '0':1, '1':2})"),
+ njs_str("5") },
+
+ { njs_str("var f = function(a, b, c) { return this + a + b + c };"
+ "f.apply(\"a\", {'length':3, '0':1, '1':2})"),
+ njs_str("a12undefined") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "f.apply(\"a\", {'length':2, '0':undefined, '1':null})"),
+ njs_str("aundefinednull") },
+
+ { njs_str("var f = function() { return this };"
+ "f.apply(123, {})"),
+ njs_str("123") },
+
+ { njs_str("String.prototype.concat.apply('a', "
+ "{length:2, 0:{toString:function() {return 'b'}}, 1:'c'})"),
+ njs_str("abc") },
+
+#if 0
+ /* TODO: non-primitive length values are not supported yet. */
+ { njs_str("String.prototype.concat.apply('a',"
+ "{length:{valueOf:function() {return 2}}, 0:'b', 1:'c'})"),
+ njs_str("abc") },
+#else
+ { njs_str("String.prototype.concat.apply('a',"
+ "{length:{valueOf:function() {return 2}}, 0:'b', 1:'c'})"),
+ njs_str("TypeError: non-primitive length values are not supported") },
+#endif
+
+ { njs_str("var a = function() { return 1 } + ''; a"),
+ njs_str("[object Function]") },
+
+ { njs_str("''.concat.call()"),
+ njs_str("TypeError: \"this\" argument is null or undefined") },
+
+ { njs_str("''.concat.call('a', 'b', 'c')"),
+ njs_str("abc") },
+
+ { njs_str("''.concat.call('a')"),
+ njs_str("a") },
+
+ { njs_str("''.concat.call('a', [ 'b', 'c' ])"),
+ njs_str("ab,c") },
+
+ { njs_str("''.concat.call('a', [ 'b', 'c' ], 'd')"),
+ njs_str("ab,cd") },
+
+ { njs_str("''.concat.apply()"),
+ njs_str("TypeError: \"this\" argument is null or undefined") },
+
+ { njs_str("''.concat.apply('a')"),
+ njs_str("a") },
+
+ { njs_str("''.concat.apply('a', 'b')"),
+ njs_str("TypeError: second argument is not an array-like object") },
+
+ { njs_str("''.concat.apply('a', [ 'b', 'c' ])"),
+ njs_str("abc") },
+
+ { njs_str("''.concat.apply('a', [ 'b', 'c' ], 'd')"),
+ njs_str("abc") },
+
+ { njs_str("[].join.call([1,2,3])"),
+ njs_str("1,2,3") },
+
+ { njs_str("[].join.call([1,2,3], ':')"),
+ njs_str("1:2:3") },
+
+ { njs_str("[].join.call([1,2,3], 55)"),
+ njs_str("1552553") },
+
+ { njs_str("[].join.call()"),
+ njs_str("TypeError: cannot convert undefined to object") },
+
+ { njs_str("[].slice.call()"),
+ njs_str("TypeError: cannot convert undefined to object") },
+
+ { njs_str("function f(a) {} ; var a = f; var b = f; a === b"),
+ njs_str("true") },
+
+ { njs_str("function f() {} ; f.toString()"),
+ njs_str("[object Function]") },
+
+ { njs_str("function f() {}; f"),
+ njs_str("[object Function]") },
+
+ { njs_str("function f() {}; f = f + 1; f"),
+ njs_str("[object Function]1") },
+
+ { njs_str("function a() { return 1 }"
+ "function b() { return a }"
+ "function c() { return b }"
+ "c()()()"),
+ njs_str("1") },
+
+#if 0
+ { njs_str("function f() {}; f += 1; f"),
+ njs_str("[object Function]1") },
+#endif
+
+ { njs_str("function f() {}; function g() { return f }; g()"),
+ njs_str("[object Function]") },
+
+ { njs_str("function f(a) { return this+a }; var a = f; a.call('0', 1)"),
+ njs_str("01") },
+
+ { njs_str("function f(a) { return this+a }; f.call('0', 1)"),
+ njs_str("01") },
+
+ { njs_str("function f(a) { return this+a };"
+ "function g(f, a, b) { return f.call(a, b) }; g(f, '0', 1)"),
+ njs_str("01") },
+
+ { njs_str("function f(a) { return this+a };"
+ "var o = { g: function (f, a, b) { return f.call(a, b) } };"
+ "o.g(f, '0', 1)"),
+ njs_str("01") },
+
+ { njs_str("var concat = ''.concat; concat(1,2,3)"),
+ njs_str("TypeError: \"this\" argument is null or undefined") },
+
+ { njs_str("var concat = ''.concat; concat.call(1,2,3)"),
+ njs_str("123") },
+
+ { njs_str("var concat = ''.concat; concat.yes = 'OK';"
+ "concat.call(1,2,3, concat.yes)"),
+ njs_str("123OK") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1'); b('2', '3')"),
+ njs_str("123") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1', '2'); b('3')"),
+ njs_str("123") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1', 2, '3'); b()"),
+ njs_str("123") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1'); b.call('0', '2', '3')"),
+ njs_str("123") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1', '2'); b.call('0', '3')"),
+ njs_str("123") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1', '2', '3'); b.call('0')"),
+ njs_str("123") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1', '2', '3'); b.call()"),
+ njs_str("123") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1'); b.apply('0', ['2', '3'])"),
+ njs_str("123") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1', '2'); b.apply('0', ['3'])"),
+ njs_str("123") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1', '2', '3'); b.apply('0')"),
+ njs_str("123") },
+
+ { njs_str("var f = function(a, b) { return this + a + b };"
+ "var b = f.bind('1', '2', '3'); b.apply()"),
+ njs_str("123") },
+
+ { njs_str("function f(a, b) { return this + a + b }"
+ "var b = f.bind('1', '2', '3'); b.apply()"),
+ njs_str("123") },
+
+ { njs_str("function f() { var a; return (function() { a = 1; return a; }).bind()() } f()"),
+ njs_str("1") },
+
+ { njs_str("function f() { var a; function baz() { a = 1; return a; } return baz.bind()(); } f()"),
+ njs_str("1") },
+
+ { njs_str("(function(){ var a = 1; return (function() { return a; })})().bind()()"),
+ njs_str("1") },
+
+ { njs_str("function f() { var a = 1; function baz() { return a; } return baz; } f().bind()()"),
+ njs_str("1") },
+
+ { njs_str("function f() { var t = 1; function baz() { return t; } return baz; }"
+ "f().bind()();"),
+ njs_str("1") },
+
+ { njs_str("(function(a) { var s = typeof g, q = g; var g = 1; s += typeof g; function g(b) { return a + b }; return q; })(1)(2)"),
+ njs_str("3")},
+
+ { njs_str("(function(a) { var g = f; var f = 1; function f() { return a; } return g; })(42)()"),
+ njs_str("42") },
+
+ { njs_str("function f(a, b) { return a + b }"
+ "f(3,4) === f.bind()(3,4)"),
+ njs_str("true") },
+
+ { njs_str("var obj = {prop:'abc'}; "
+ "var func = function(x) { "
+ " return this === obj && x === 1 && arguments[0] === 1 "
+ " && arguments.length === 1 && this.prop === 'abc';"
+ "};"
+ "Function.prototype.bind.call(func, obj, 1)()"),
+ njs_str("true") },
+
+ { njs_str("function F(a, b) { this.a = a + b }"
+ "var o = new F(1, 2);"
+ "o.a"),
+ njs_str("3") },
+
+ { njs_str("function F(a, b) { this.a = a + b; return { a: 7 } }"
+ "var o = new F(1, 2);"
+ "o.a"),
+ njs_str("7") },
+
+ { njs_str("function F(a, b) { return }"
+ "F.prototype.constructor === F"),
+ njs_str("true") },
+
+ { njs_str("function F() { return }"
+ "F.prototype.ok = 'OK';"
+ "var o = new F(); o.ok"),
+ njs_str("OK") },
+
+ { njs_str("function F() { return }"
+ "var o = new F();"
+ "o.constructor === F"),
+ njs_str("true") },
+
+ { njs_str("function F() { return }"
+ "var o = new F();"
+ "o.__proto__ === F.prototype"),
+ njs_str("true") },
+
+ { njs_str("var f = { F: function(){} }; var o = new f.F();"
+ "o.__proto__ === f.F.prototype"),
+ njs_str("true") },
+
+ { njs_str("function F(){}; typeof F.prototype"),
+ njs_str("object") },
+
+ { njs_str("var F = function (){}; typeof F.prototype"),
+ njs_str("object") },
+
+ { njs_str("new decodeURI('%00')"),
+ njs_str("TypeError: function is not a constructor")},
+
+ { njs_str("new ''.toString"),
+ njs_str("TypeError: function is not a constructor")},
+
+ { njs_str("function F() { return Number }"
+ "var o = new (F())(5);"
+ "typeof o +' '+ o"),
+ njs_str("object 5") },
+
+ { njs_str("function F() { return Number }"
+ "var o = new (F());"
+ "typeof o +' '+ o"),
+ njs_str("object 0") },
+
+ { njs_str("var o = new function F() { return Number }()(5);"
+ "typeof o +' '+ o"),
+ njs_str("number 5") },
+
+ { njs_str("var o = new (function F() { return Number }())(5);"
+ "typeof o +' '+ o"),
+ njs_str("object 5") },
+
+ { njs_str("var o = new (new function F() { return Number }())(5);"
+ "typeof o +' '+ o"),
+ njs_str("object 5") },
+
+ { njs_str("var o = new new function F() { return Number }()(5);"
+ "typeof o +' '+ o"),
+ njs_str("object 5") },
+
+ { njs_str("var b; function F(x) { return {a:x} }"
+ "function G(y) { b = y; return F }"
+ "var o = new G(3)(5);"
+ "b + ' ' + o.a"),
+ njs_str("3 5") },
+
+ { njs_str("var b; function F(x) { return {a:x} }"
+ "function G(y) { b = y; return F }"
+ "var o = new (new G(3))(5);"
+ "b + ' ' + o.a"),
+ njs_str("3 5") },
+
+ { njs_str("var b; function F(x) { return {a:x} }"
+ "function G(y) { b = y; return F }"
+ "var o = new new G(3)(5);"
+ "b + ' ' + o.a"),
+ njs_str("3 5") },
+
+ { njs_str("var b; function F(x) { return {a:x} }"
+ "var g = { G: function (y) { b = y; return F } };"
+ "var o = new new g.G(3)(5);"
+ "b + ' ' + o.a"),
+ njs_str("3 5") },
+
+ { njs_str("function a() { return function(x) { return x + 1 } }"
+ "var b = a(); b(2)"),
+ njs_str("3") },
+
+ /* arguments object. */
+
+ { njs_str("arguments"),
+ njs_str("SyntaxError: \"arguments\" object in global scope in 1") },
+
+ { njs_str("{arguments}"),
+ njs_str("SyntaxError: \"arguments\" object in global scope in 1") },
+
+ { njs_str("var arguments"),
+ njs_str("SyntaxError: Identifier \"arguments\" is forbidden in var declaration in 1") },
+
+ { njs_str("for (var arguments in []) {}"),
+ njs_str("SyntaxError: Identifier \"arguments\" is forbidden in var declaration in 1") },
+
+ { njs_str("function arguments(){}"),
+ njs_str("SyntaxError: Identifier \"arguments\" is forbidden in function declaration in 1") },
+
+ { njs_str("(function () {arguments = [];})"),
+ njs_str("SyntaxError: Identifier \"arguments\" is forbidden as left-hand in assignment in 1") },
+
+ { njs_str("(function(){return arguments[0];})(1,2,3)"),
+ njs_str("1") },
+
+ { njs_str("(function(){return arguments[2];})(1,2,3)"),
+ njs_str("3") },
+
+ { njs_str("(function(){return arguments[3];})(1,2,3)"),
+ njs_str("undefined") },
+
+ { njs_str("(function(a,b,c){return a;})(1,2,3)"),
+ njs_str("1") },
+
+ { njs_str("(function(a,b,c){arguments[0] = 4; return a;})(1,2,3)"),
+ njs_str("1") },
+
+ { njs_str("(function(a,b,c){a = 4; return arguments[0];})(1,2,3)"),
+ njs_str("1") },
+
+ { njs_str("function check(v) {if (v == false) {throw TypeError('Too few arguments')}}; "
+ "function f() {check(arguments.length > 1); return 1}; f()"),
+ njs_str("TypeError: Too few arguments") },
+
+ { njs_str("function check(v) {if (v == false) {throw TypeError('Too few arguments')}}; "
+ "function f() {check(arguments.length > 1); return 1}; f(1,2)"),
+ njs_str("1") },
+
+ { njs_str("(function(a,b){delete arguments[0]; return arguments[0]})(1,1)"),
+ njs_str("undefined") },
+
+ { njs_str("(function(){return arguments.length;})()"),
+ njs_str("0") },
+
+ { njs_str("(function(){return arguments.length;})(1,2,3)"),
+ njs_str("3") },
+
+ { njs_str("(function(){arguments.length = 1; return arguments.length;})(1,2,3)"),
+ njs_str("1") },
+
+ { njs_str("(function(){return arguments[3];}).bind(null, 0)('a','b','c')"),
+ njs_str("c") },
+
+ { njs_str("(function(){return arguments.callee;})()"),
+ njs_str("TypeError: \"caller\", \"callee\" properties may not be accessed") },
+
+ { njs_str("(function(){return arguments.caller;})()"),
+ njs_str("TypeError: \"caller\", \"callee\" properties may not be accessed") },
+
+ { njs_str("function sum() { var args = Array.prototype.slice.call(arguments); "
+ "return args.reduce(function(prev, curr) {return prev + curr})};"
+ "[sum(1), sum(1,2), sum(1,2,3), sum(1,2,3,4)]"),
+ njs_str("1,3,6,10") },
+
+ { njs_str("function concat(sep) { var args = Array.prototype.slice.call(arguments, 1); "
+ "return args.join(sep)};"
+ "[concat('.',1,2,3), concat('+',1,2,3,4)]"),
+ njs_str("1.2.3,1+2+3+4") },
+
+ /* rest parameters. */
+
+ { njs_str("function myFoo(a,b,...other) { return other };"
+ "myFoo(1,2,3,4,5);" ),
+ njs_str("3,4,5") },
+
+ { njs_str("function myFoo(a,b,...other, c) { return other };"),
+ njs_str("SyntaxError: Unexpected token \"c\" in 1") },
+
+ { njs_str("function sum(a, b, c, ...other) { return a+b+c+other[2] };"
+ "sum(\"one \",2,\" three \",\"four \",\"five \",\"the long enough sixth argument \");"),
+ njs_str("one 2 three the long enough sixth argument ") },
+
+ { njs_str("function myFoo1(a,...other) { return other };"
+ "function myFoo2(a,b,...other) { return other };"
+ "myFoo1(1,2,3,4,5,myFoo2(1,2,3,4));"),
+ njs_str("2,3,4,5,3,4") },
+
+ { njs_str("function myFoo(...other) { return (other instanceof Array) };"
+ "myFoo(1);" ),
+ njs_str("true") },
+
+ { njs_str("function myFoo(a,...other) { return other.length };"
+ "myFoo(1,2,3,4,5);" ),
+ njs_str("4") },
+
+ { njs_str("function myFoo(a,b,...other) { return other };"
+ "myFoo(1,2);" ),
+ njs_str("") },
+
+ /* arrow functions. */
+
+ { njs_str("()"),
+ njs_str("SyntaxError: Unexpected token \")\" in 1") },
+
+ { njs_str("() => "),
+ njs_str("SyntaxError: Unexpected end of input in 1") },
+
+ { njs_str("() => {"),
+ njs_str("SyntaxError: Unexpected end of input in 1") },
+
+ { njs_str("a\n => 1"),
+ njs_str("SyntaxError: Unexpected token \"=>\" in 2") },
+
+ { njs_str("new (()=>1)"),
+ njs_str("TypeError: function is not a constructor")},
+
+ { njs_str("(\n) => {}"),
+ njs_str("[object Function]") },
+
+ { njs_str("a => 1"),
+ njs_str("[object Function]") },
+
+ { njs_str("({f:()=>1, g:()=>2}).f()"),
+ njs_str("1") },
+
+ { njs_str("var f = f => {return 1;}; f()"),
+ njs_str("1") },
+
+ { njs_str("var f = (f) => {return 1;}; f()"),
+ njs_str("1") },
+
+ { njs_str("var f = (f, a, b) => {return 1;}; f()"),
+ njs_str("1") },
+
+ { njs_str("var f = () => {return 1;}; f()"),
+ njs_str("1") },
+
+ { njs_str("(f => {return 1;})()"),
+ njs_str("1") },
+
+ { njs_str("((f) => {return 1;})()"),
+ njs_str("1") },
+
+ { njs_str("(((f) => {return 1;}))()"),
+ njs_str("1") },
+
+ { njs_str("var f = f => 1; f()"),
+ njs_str("1") },
+
+ { njs_str("() => 1"),
+ njs_str("[object Function]") },
+
+ { njs_str("var f = ()=>{}; f()"),
+ njs_str("undefined") },
+
+ { njs_str("var f = ()=>({}); f()"),
+ njs_str("[object Object]") },
+
+ { njs_str("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
+ "materials.map(material => { return material.length; });"),
+ njs_str("8,6,7,9") },
+
+ { njs_str("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
+ "materials.map(material => material.length);"),
+ njs_str("8,6,7,9") },
+
+ { njs_str("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];"
+ "materials.map(material => { material.length });"),
+ njs_str(",,,") },
+
+ { njs_str("function f(a, b, c) {a = 1; return () => { return arguments[1]; };};"
+ "f(1, 2, 3)('a', 'b');"),
+ njs_str("2") },
+
+ { njs_str("var f = (...c) => { return (function() { return arguments.length; }).bind(null, c); };"
+ "var x = f(1,'a',false, {}); x()"),
+ njs_str("1") },
+
+ { njs_str("var f = (...c) => { return (function() { return arguments.length; }).bind(null, c); };"
+ "var x = f(1,'a',false, {}); x(1,2,3)"),
+ njs_str("4") },
+
+ { njs_str("function Car(){ this.age = 0; (() => { this.age++;})();}"
+ "(new Car()).age"),
+ njs_str("1") },
+
+ { njs_str("function Car(){ this.age = 0; (function(){ this.age++;})();}"
+ "(new Car()).age"),
+ njs_str("TypeError: cannot get property \"age\" of undefined") },
+
+ /* arrow functions + global this. */
+
+ { njs_str("(() => this)()"),
+ njs_str("[object Object]") },
+
+ { njs_str("(() => this).call('abc')"),
+ njs_str("[object Object]") },
+
+ { njs_str("(() => this).apply('abc')"),
+ njs_str("[object Object]") },
+
+ { njs_str("(() => this).bind('abc')()"),
+ njs_str("[object Object]") },
+
+ { njs_str("(function() { return (() => this); })()()"),
+ njs_str("undefined") },
+
+ { njs_str("(function() { return (() => this); }).call('abc')()"),
+ njs_str("abc") },
+
+ { njs_str("(function() { return (() => this); }).bind('abc')()()"),
+ njs_str("abc") },
+
+ { njs_str("(function() { return (() => this); })"
+ ".call('abc').call('bca')"),
+ njs_str("abc") },
+
+ { njs_str("(function() { return (() => this); })"
+ ".call('abc').bind('bca')()"),
+ njs_str("abc") },
+
+ { njs_str("(function() { return function() { return () => this; }; })"
+ ".call('bca').call('abc')()"),
+ njs_str("abc") },
+
+ { njs_str("var f = () => 1; f.prototype"),
+ njs_str("undefined") },
+
+ { njs_str("var f = (a,b) => 0; f.length"),
+ njs_str("2") },
+
+ { njs_str("var o = Object.create(f => 1); o.length = 3"),
+ njs_str("TypeError: Cannot assign to read-only property \"length\" of object") },
+
+ /* Scopes. */
+
+ { njs_str("function f(x) { a = x } var a; f(5); a"),
+ njs_str("5") },
+
+ { njs_str("function f(x) { var a = x } var a = 2; f(5); a"),
+ njs_str("2") },
+
+ { njs_str("function f(a) { return a } var a = '2'; a + f(5)"),
+ njs_str("25") },
+
+ { njs_str("for (var i = 0; i < 5; i++); i"),
+ njs_str("5") },
+
+ { njs_str("for (var i = 0, j; i < 5; i++); j"),
+ njs_str("undefined") },
+
+ { njs_str("for (var i = 0, j, k = 3; i < 5; i++); k"),
+ njs_str("3") },
+
+ { njs_str("var o = { a: 1, b: 2, c: 3 }, s = ''; "
+ "for (var i in o) { s += i }; s"),
+ njs_str("abc") },
+
+ { njs_str("var o = { a: 1, b: 2, c: 3 }; for (var i in o); i"),
+ njs_str("c") },
+
+ { njs_str("var o = {}; i = 7; for (var i in o); i"),
+ njs_str("7") },
+
+ { njs_str("var a = [1,2,3]; for (var i in a); i"),
+ njs_str("2") },
+
+ /* RegExp. */
+
+ { njs_str("/./x"),
+ njs_str("SyntaxError: Invalid RegExp flags \"x\" in 1") },
+
+ { njs_str("/"),
+ njs_str("SyntaxError: Unterminated RegExp \"/\" in 1") },
+
+ { njs_str("/a\n/"),
+ njs_str("SyntaxError: Unterminated RegExp \"/a\" in 1") },
+
+ { njs_str("/a\r/"),
+ njs_str("SyntaxError: Unterminated RegExp \"/a\" in 1") },
+
+ { njs_str("/a\\q/"),
+ njs_str("/a\\q/") },
+
+ { njs_str("/\\\\/"),
+ njs_str("/\\\\/") },
+
+ { njs_str("/\\\\\\/"),
+ njs_str("SyntaxError: Unterminated RegExp \"/\\\\\\/\" in 1") },
+
+ { njs_str("/\\\\\\\\/"),
+ njs_str("/\\\\\\\\/") },
+
+ { njs_str("/\\\\\\//"),
+ njs_str("/\\\\\\//") },
+
+ { njs_str("/[A-Z/]/"),
+ njs_str("/[A-Z/]/") },
+
+ { njs_str("/[A-Z\n]/"),
+ njs_str("SyntaxError: Unterminated RegExp \"/[A-Z\" in 1") },
+
+ { njs_str("/[A-Z\\\n]/"),
+ njs_str("SyntaxError: Unterminated RegExp \"/[A-Z\\\" in 1") },
+
+ { njs_str("/\\\n/"),
+ njs_str("SyntaxError: Unterminated RegExp \"/\\\" in 1") },
+
+ { njs_str("/^[A-Za-z0-9+/]{4}$/.test('////')"),
+ njs_str("true") },
+
+ { njs_str("'[]!\"#$%&\\'()*+,.\\/:;<=>?@\\^_`{|}-'.split('')"
+ ".every(ch=>/[\\]\\[!\"#$%&'()*+,.\\/:;<=>?@\\^_`{|}-]/.test(ch))"),
+ njs_str("true") },
+
+ { njs_str("/a\\q/.test('a\\q')"),
+ njs_str("true") },
+
+ { njs_str("/(\\.(?!com|org)|\\/)/.test('ah.info')"),
+ njs_str("true") },
+
+ { njs_str("/(/.test('')"),
+ njs_str("SyntaxError: pcre_compile(\"(\") failed: missing ) in 1") },
+
+ { njs_str("/+/.test('')"),
+ njs_str("SyntaxError: pcre_compile(\"+\") failed: nothing to repeat at \"+\" in 1") },
+
+ { njs_str("/^$/.test('')"),
+ njs_str("true") },
+
+ { njs_str("var a = /\\d/; a.test('123')"),
+ njs_str("true") },
+
+ { njs_str("var a = /\\d/; a.test('abc')"),
+ njs_str("false") },
+
+ { njs_str("/\\d/.test('123')"),
+ njs_str("true") },
+
+ { njs_str("/\\d/.test(123)"),
+ njs_str("true") },
+
+ { njs_str("/undef/.test()"),
+ njs_str("true") },
+
+ { njs_str("var s = { toString: function() { return 123 } };"
+ "/\\d/.test(s)"),
+ njs_str("true") },
+
+ { njs_str("/\\d/.test('abc')"),
+ njs_str("false") },
+
+ { njs_str("/abc/i.test('ABC')"),
+ njs_str("true") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* FIXME */
+ { njs_str("/абв/i.test('АБВ')"),
+ njs_str("true") },
+#endif
+
+ { njs_str("/\\x80/.test('\\u0080')"),
+ njs_str("true") },
+
+ { njs_str("/\\x80/.test('\\u0080'.toBytes())"),
+ njs_str("true") },
+
+ { njs_str("/α/.test('\\u03B1')"),
+ njs_str("true") },
+
+ { njs_str("/α/.test('\\u00CE\\u00B1'.toBytes())"),
+ njs_str("true") },
+
+ { njs_str("/\\d/.exec('123')"),
+ njs_str("1") },
+
+ { njs_str("/\\d/.exec(123)"),
+ njs_str("1") },
+
+ { njs_str("/undef/.exec()"),
+ njs_str("undef") },
+
+ { njs_str("var s = { toString: function() { return 123 } };"
+ "/\\d/.exec(s)"),
+ njs_str("1") },
+
+ { njs_str("var a = /^$/.exec(''); a.length +' '+ a"),
+ njs_str("1 ") },
+
+ { njs_str("var r = /3/g; r.exec('123') +' '+ r.exec('3')"),
+ njs_str("3 null") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* FIXME */
+ { njs_str("var r = /бв/ig;"
+ "var a = r.exec('АБВ');"
+ "r.lastIndex +' '+ a +' '+ "
+ "r.source +' '+ r.source.length +' '+ r"),
+ njs_str("3 БВ бв 2 /бв/gi") },
+#endif
+
+ { njs_str("var r = /\\x80/g; r.exec('\\u0081\\u0080'.toBytes());"
+ "r.lastIndex +' '+ r.source +' '+ r.source.length +' '+ r"),
+ njs_str("1 \\x80 4 /\\x80/g") },
+
+ /*
+ * It seems that "/стоп/ig" fails on early PCRE versions.
+ * It fails at least in 8.1 and works at least in 8.31.
+ */
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* FIXME */
+ { njs_str("var r = /Стоп/ig;"
+ "var a = r.exec('АБВДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯСТОП');"
+ "r.lastIndex +' '+ a +' '+ r.source +' '+ r"),
+ njs_str("35 СТОП Стоп /Стоп/gi") },
+#endif
+
+ { njs_str("var r = /quick\\s(brown).+?(jumps)/ig;"
+ "var a = r.exec('The Quick Brown Fox Jumps Over The Lazy Dog');"
+ "a[0] +' '+ a[1] +' '+ a[2] +' '+ a[3] +' '+ "
+ "a.index +' '+ r.lastIndex +' '+ a.input"),
+ njs_str("Quick Brown Fox Jumps Brown Jumps undefined "
+ "4 25 The Quick Brown Fox Jumps Over The Lazy Dog") },
+
+ { njs_str("var r = /a/.exec('a'); ['groups' in r, typeof r.groups]"),
+ njs_str("true,undefined") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* PCRE bug in groups code */
+ { njs_str("var r = /(?<m>[0-9]{2})\\/(?<d>[0-9]{2})\\/(?<y>[0-9]{4})/;"
+ "var g = r.exec('12/31/1986').groups;"
+ "g.d + '.' + g.m + '.' + g.y"),
+ njs_str("31.12.1986") },
+
+ { njs_str("var g = /(?<r>(?<no>no)?(?<yes>yes)?)/.exec('yes').groups;"
+ "[Object.keys(g).length,'no' in g, typeof g.no, g.yes, g.r]"),
+ njs_str("3,true,undefined,yes,yes") },
+#endif
+
+ { njs_str("var s; var r = /./g; while (s = r.exec('abc')); s"),
+ njs_str("null") },
+
+ { njs_str("var r = /LS/i.exec(false); r[0]"),
+ njs_str("ls") },
+
+ { njs_str("var r = (/^.+$/mg), s = 'ab\\nc'; [r.exec(s), r.exec(s)]"),
+ njs_str("ab,c") },
+
+ { njs_str("var r = (/^.+$/mg); [r.global, r.multiline, r.ignoreCase]"),
+ njs_str("true,true,false") },
+
+ { njs_str("var r = /./; r"),
+ njs_str("/./") },
+
+ { njs_str("var r = new RegExp(); r"),
+ njs_str("/(?:)/") },
+
+ { njs_str("var r = new RegExp('.'); r"),
+ njs_str("/./") },
+
+ { njs_str("var r = new RegExp('.', 'ig'); r"),
+ njs_str("/./gi") },
+
+ { njs_str("var r = new RegExp('abc'); r.test('00abc11')"),
+ njs_str("true") },
+
+ { njs_str("var r = new RegExp('abc', 'i'); r.test('00ABC11')"),
+ njs_str("true") },
+
+ { njs_str("RegExp('α'.repeat(33)).toString()[32]"),
+ njs_str("α") },
+
+ { njs_str("new RegExp('', 'x')"),
+ njs_str("SyntaxError: Invalid RegExp flags \"x\"") },
+
+ { njs_str("RegExp({})"),
+ njs_str("/[object Object]/") },
+
+ { njs_str("RegExp(true)"),
+ njs_str("/true/") },
+
+ { njs_str("RegExp(undefined)"),
+ njs_str("/(?:)/") },
+
+ { njs_str("RegExp('abc', undefined)"),
+ njs_str("/abc/") },
+
+ { njs_str("RegExp('abc', {})"),
+ njs_str("SyntaxError: Invalid RegExp flags \"[object Object]\"") },
+
+ { njs_str("RegExp(/expr/)"),
+ njs_str("/expr/") },
+
+ { njs_str("RegExp(/expr/i).ignoreCase"),
+ njs_str("true") },
+
+ { njs_str("RegExp(/expr/, 'x')"),
+ njs_str("SyntaxError: Invalid RegExp flags \"x\"") },
+
+ { njs_str("RegExp(new RegExp('expr'))"),
+ njs_str("/expr/") },
+
+ { njs_str("RegExp(new RegExp('expr')).multiline"),
+ njs_str("false") },
+
+ { njs_str("RegExp(new RegExp('expr'), 'm').multiline"),
+ njs_str("true") },
+
+ { njs_str("new RegExp('[')"),
+ njs_str("SyntaxError: pcre_compile(\"[\") failed: missing terminating ] for character class") },
+
+ { njs_str("new RegExp('\\\\')"),
+ njs_str("SyntaxError: pcre_compile(\"\\\") failed: \\ at end of pattern") },
+
+ { njs_str("[0].map(RegExp().toString)"),
+ njs_str("TypeError: \"this\" argument is not a regexp") },
+
+ /* Non-standard ECMA-262 features. */
+
+ /* 0x10400 is not a surrogate pair of 0xD801 and 0xDC00. */
+
+ { njs_str("var chars = '𐐀'; chars.length +' '+ chars.charCodeAt(0)"),
+ njs_str("1 66560") },
+
+ /* es5id: 6.1, 0x104A0 is not a surrogate pair of 0xD801 and 0xDCA0. */
+
+ { njs_str("var chars = '𐒠'; chars.length +' '+ chars.charCodeAt(0)"),
+ njs_str("1 66720") },
+
+ /* Error object. */
+
+ { njs_str("Error()"),
+ njs_str("Error") },
+
+ { njs_str("new Error()"),
+ njs_str("Error") },
+
+ { njs_str("Error('e')"),
+ njs_str("Error: e") },
+
+ { njs_str("var e = Error('e'); e.name = 'E'; e"),
+ njs_str("E: e") },
+
+ { njs_str("var e = Error('e'); e.name = ''; e"),
+ njs_str("e") },
+
+ { njs_str("var e = Error(); e.name = ''; e"),
+ njs_str("") },
+
+ { njs_str("var e = Error(); e.name = ''; e.message = 'e'; e"),
+ njs_str("e") },
+
+ { njs_str("Error('e').name + ': ' + Error('e').message"),
+ njs_str("Error: e") },
+
+ { njs_str("Error(1)"),
+ njs_str("Error: 1") },
+
+ { njs_str("Error.__proto__ == Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("Error.prototype.name"),
+ njs_str("Error") },
+
+ { njs_str("Error.prototype.message"),
+ njs_str("") },
+
+ { njs_str("Error.prototype.constructor == Error"),
+ njs_str("true") },
+
+ { njs_str("Error.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("Error().__proto__ == Error.prototype"),
+ njs_str("true") },
+
+ { njs_str("Error().__proto__.__proto__ == Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("EvalError('e')"),
+ njs_str("EvalError: e") },
+
+ { njs_str("InternalError('e')"),
+ njs_str("InternalError: e") },
+
+ { njs_str("RangeError('e')"),
+ njs_str("RangeError: e") },
+
+ { njs_str("ReferenceError('e')"),
+ njs_str("ReferenceError: e") },
+
+ { njs_str("SyntaxError('e')"),
+ njs_str("SyntaxError: e") },
+
+ { njs_str("TypeError('e')"),
+ njs_str("TypeError: e") },
+
+ { njs_str("URIError('e')"),
+ njs_str("URIError: e") },
+
+ { njs_str("MemoryError('e')"),
+ njs_str("MemoryError") },
+
+ { njs_str("EvalError('e').name + ': ' + EvalError('e').message"),
+ njs_str("EvalError: e") },
+
+ { njs_str("InternalError('e').name + ': ' + InternalError('e').message"),
+ njs_str("InternalError: e") },
+
+ { njs_str("RangeError('e').name + ': ' + RangeError('e').message"),
+ njs_str("RangeError: e") },
+
+ { njs_str("ReferenceError('e').name + ': ' + ReferenceError('e').message"),
+ njs_str("ReferenceError: e") },
+
+ { njs_str("SyntaxError('e').name + ': ' + SyntaxError('e').message"),
+ njs_str("SyntaxError: e") },
+
+ { njs_str("TypeError('e').name + ': ' + TypeError('e').message"),
+ njs_str("TypeError: e") },
+
+ { njs_str("URIError('e').name + ': ' + URIError('e').message"),
+ njs_str("URIError: e") },
+
+ { njs_str("var e = EvalError('e'); e.name = 'E'; e"),
+ njs_str("E: e") },
+
+ { njs_str("var e = InternalError('e'); e.name = 'E'; e"),
+ njs_str("E: e") },
+
+ { njs_str("var e = RangeError('e'); e.name = 'E'; e"),
+ njs_str("E: e") },
+
+ { njs_str("var e = ReferenceError('e'); e.name = 'E'; e"),
+ njs_str("E: e") },
+
+ { njs_str("var e = SyntaxError('e'); e.name = 'E'; e"),
+ njs_str("E: e") },
+
+ { njs_str("var e = TypeError('e'); e.name = 'E'; e"),
+ njs_str("E: e") },
+
+ { njs_str("var e = URIError('e'); e.name = 'E'; e"),
+ njs_str("E: e") },
+
+ /* Memory object is immutable. */
+
+ { njs_str("var e = MemoryError('e'); e.name = 'E'"),
+ njs_str("TypeError: Cannot add property \"name\", object is not extensible") },
+
+ { njs_str("EvalError.prototype.name"),
+ njs_str("EvalError") },
+
+ { njs_str("InternalError.prototype.name"),
+ njs_str("InternalError") },
+
+ { njs_str("RangeError.prototype.name"),
+ njs_str("RangeError") },
+
+ { njs_str("ReferenceError.prototype.name"),
+ njs_str("ReferenceError") },
+
+ { njs_str("SyntaxError.prototype.name"),
+ njs_str("SyntaxError") },
+
+ { njs_str("TypeError.prototype.name"),
+ njs_str("TypeError") },
+
+ { njs_str("URIError.prototype.name"),
+ njs_str("URIError") },
+
+ { njs_str("MemoryError.prototype.name"),
+ njs_str("InternalError") },
+
+ { njs_str("EvalError.prototype.message"),
+ njs_str("") },
+
+ { njs_str("InternalError.prototype.message"),
+ njs_str("") },
+
+ { njs_str("RangeError.prototype.message"),
+ njs_str("") },
+
+ { njs_str("ReferenceError.prototype.message"),
+ njs_str("") },
+
+ { njs_str("SyntaxError.prototype.message"),
+ njs_str("") },
+
+ { njs_str("TypeError.prototype.message"),
+ njs_str("") },
+
+ { njs_str("URIError.prototype.message"),
+ njs_str("") },
+
+ { njs_str("MemoryError.prototype.message"),
+ njs_str("") },
+
+ { njs_str("EvalError.prototype.constructor == EvalError"),
+ njs_str("true") },
+
+ { njs_str("RangeError.prototype.constructor == RangeError"),
+ njs_str("true") },
+
+ { njs_str("ReferenceError.prototype.constructor == ReferenceError"),
+ njs_str("true") },
+
+ { njs_str("SyntaxError.prototype.constructor == SyntaxError"),
+ njs_str("true") },
+
+ { njs_str("TypeError.prototype.constructor == TypeError"),
+ njs_str("true") },
+
+ { njs_str("URIError.prototype.constructor == URIError"),
+ njs_str("true") },
+
+ { njs_str("EvalError.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("RangeError.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("ReferenceError.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("SyntaxError.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("TypeError.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("URIError.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("EvalError().__proto__ == EvalError.prototype"),
+ njs_str("true") },
+
+ { njs_str("RangeError().__proto__ == RangeError.prototype"),
+ njs_str("true") },
+
+ { njs_str("ReferenceError().__proto__ == ReferenceError.prototype"),
+ njs_str("true") },
+
+ { njs_str("SyntaxError().__proto__ == SyntaxError.prototype"),
+ njs_str("true") },
+
+ { njs_str("TypeError().__proto__ == TypeError.prototype"),
+ njs_str("true") },
+
+ { njs_str("URIError().__proto__ == URIError.prototype"),
+ njs_str("true") },
+
+ { njs_str("EvalError().__proto__.__proto__ == Error.prototype"),
+ njs_str("true") },
+
+ { njs_str("RangeError().__proto__.__proto__ == Error.prototype"),
+ njs_str("true") },
+
+ { njs_str("ReferenceError().__proto__.__proto__ == Error.prototype"),
+ njs_str("true") },
+
+ { njs_str("SyntaxError().__proto__.__proto__ == Error.prototype"),
+ njs_str("true") },
+
+ { njs_str("TypeError().__proto__.__proto__ == Error.prototype"),
+ njs_str("true") },
+
+ { njs_str("URIError().__proto__.__proto__ == Error.prototype"),
+ njs_str("true") },
+
+ { njs_str("MemoryError().__proto__ == MemoryError.prototype"),
+ njs_str("true") },
+
+ { njs_str("MemoryError().__proto__.__proto__ == Error.prototype"),
+ njs_str("true") },
+
+ { njs_str("typeof Error()"),
+ njs_str("object") },
+
+ { njs_str("typeof EvalError()"),
+ njs_str("object") },
+
+ { njs_str("typeof InternalError()"),
+ njs_str("object") },
+
+ { njs_str("typeof RangeError()"),
+ njs_str("object") },
+
+ { njs_str("typeof ReferenceError()"),
+ njs_str("object") },
+
+ { njs_str("typeof SyntaxError()"),
+ njs_str("object") },
+
+ { njs_str("typeof TypeError()"),
+ njs_str("object") },
+
+ { njs_str("typeof URIError()"),
+ njs_str("object") },
+
+ { njs_str("typeof MemoryError()"),
+ njs_str("object") },
+
+ /* Exceptions. */
+
+ { njs_str("throw null"),
+ njs_str("null") },
+
+ { njs_str("var a; try { throw null } catch (e) { a = e } a"),
+ njs_str("null") },
+
+ { njs_str("var a; try { throw Error('e') } catch (e) { a = e.message } a"),
+ njs_str("e") },
+
+ { njs_str("var a; try { NaN.toString(NaN) } catch (e) { a = e.name } a"),
+ njs_str("RangeError") },
+
+ { njs_str("try { throw null } catch (e) { throw e }"),
+ njs_str("null") },
+
+ { njs_str("try { throw Error('e') } catch (e) { throw Error(e.message + '2') }"),
+ njs_str("Error: e2") },
+
+ { njs_str("try { throw null } catch (null) { throw e }"),
+ njs_str("SyntaxError: Unexpected token \"null\" in 1") },
+
+ { njs_str("'a'.f()"),
+ njs_str("TypeError: (intermediate value)[\"f\"] is not a function") },
+
+ { njs_str("1..f()"),
+ njs_str("TypeError: (intermediate value)[\"f\"] is not a function") },
+
+ { njs_str("try {}"),
+ njs_str("SyntaxError: Missing catch or finally after try in 1") },
+
+ { njs_str("try{}catch(a[]"),
+ njs_str("SyntaxError: Unexpected token \"[\" in 1") },
+
+ { njs_str("function f(a) {return a;}; "
+ "function thrower() {throw TypeError('Oops')}; "
+ "f(thrower())"),
+ njs_str("TypeError: Oops") },
+
+ { njs_str("var a = 0; try { a = 5 }"
+ "catch (e) { a = 9 } finally { a++ } a"),
+ njs_str("6") },
+
+ { njs_str("var a = 0; try { throw 3 }"
+ "catch (e) { a = e } finally { a++ } a"),
+ njs_str("4") },
+
+ { njs_str("var a = 0; try { throw 3 }"
+ "catch (e) { throw e + 1 } finally { a++ }"),
+ njs_str("4") },
+
+ { njs_str("var a = 0; try { throw 3 }"
+ "catch (e) { a = e } finally { throw a }"),
+ njs_str("3") },
+
+ { njs_str("try { throw null } catch (e) { } finally { }"),
+ njs_str("undefined") },
+
+ { njs_str("var a = 0; try { throw 3 }"
+ "catch (e) { throw 4 } finally { throw a }"),
+ njs_str("0") },
+
+ { njs_str("var a = 0; try { a = 5 } finally { a++ } a"),
+ njs_str("6") },
+
+ { njs_str("var a = 0; try { throw 5 } finally { a++ }"),
+ njs_str("5") },
+
+ { njs_str("var a = 0; try { a = 5 } finally { throw 7 }"),
+ njs_str("7") },
+
+ { njs_str("function f(a) {"
+ " if (a > 1) return f(a - 1);"
+ " throw 9; return a }"
+ "var a = 0; try { a = f(5); a++ } catch(e) { a = e } a"),
+ njs_str("9") },
+
+ { njs_str("var a; try { try { throw 5 } catch (e) { a = e } throw 3 }"
+ " catch(x) { a += x } a"),
+ njs_str("8") },
+
+ { njs_str("throw\nnull"),
+ njs_str("SyntaxError: Illegal newline after throw in 2") },
+
+ { njs_str("for (var x in [1,2]) { try{ continue; } catch(e) {} } throw 1"),
+ njs_str("1") },
+
+ { njs_str("for (var x in [1,2]) { try{ break; } catch(e) {} } throw 1"),
+ njs_str("1") },
+
+ { njs_str("try\n {\n continue; } catch(e) {}"),
+ njs_str("SyntaxError: Illegal continue statement in 3") },
+
+ { njs_str("var a = 1; "
+ "switch (a) {"
+ "default:"
+ " try\n {\n continue; } "
+ " catch(e) {}"
+ "}"),
+ njs_str("SyntaxError: Illegal continue statement in 3") },
+
+ { njs_str("try\n {\n break; } catch(e) {}"),
+ njs_str("SyntaxError: Illegal break statement in 3") },
+
+ { njs_str("try\n { }\n catch(e) {continue;}"),
+ njs_str("SyntaxError: Illegal continue statement in 3") },
+
+ { njs_str("try { } catch(e) {break;}"),
+ njs_str("SyntaxError: Illegal break statement in 1") },
+
+ { njs_str("try { continue; } finally {}"),
+ njs_str("SyntaxError: Illegal continue statement in 1") },
+
+ { njs_str("try { break; } finally {}"),
+ njs_str("SyntaxError: Illegal break statement in 1") },
+
+ { njs_str("try\n {\n try\n {\n continue; } finally {} } finally {}"),
+ njs_str("SyntaxError: Illegal continue statement in 5") },
+
+ /* break from try in try/catch. */
+
+ { njs_str("function f(n) {"
+ " var pre = 0; var post = 0;"
+ " for (var x in [1, 2, 3]) {"
+ " pre++;"
+ " try { "
+ " if (n == 'b') {break;}"
+ " }"
+ " catch (e) {};"
+ " post++"
+ " }"
+ " return [pre, post];"
+ "}; njs.dump([f(),f('b')])"),
+ njs_str("[[3,3],"
+ "[1,0]]") },
+
+ { njs_str("function f(v, n) {"
+ " var pre = 0; var post = 0; var case2 = 0;"
+ " switch (v) {"
+ " case 1: "
+ " pre++;"
+ " try { "
+ " if (n == 'b') {break;}"
+ " }"
+ " catch (e) {};"
+ " post++;"
+ " break;"
+ " default:"
+ " case2++;"
+ " }"
+ " return [pre, post, case2];"
+ "}; njs.dump([f(),f(1)])"),
+ njs_str("[[0,0,1],"
+ "[1,1,0]]") },
+
+ /* continue from try in try/catch. */
+
+ { njs_str("function f(n) {"
+ " var pre = 0; var post = 0;"
+ " for (var x in [1, 2, 3]) {"
+ " pre++;"
+ " try { "
+ " if (n == 'c') {continue;}"
+ " }"
+ " catch (e) {};"
+ " post++"
+ " }"
+ " return [pre, post];"
+ "}; njs.dump([f(),f('c')])"),
+ njs_str("[[3,3],"
+ "[3,0]]") },
+
+ /* Multiple break/continue from try in try/catch. */
+
+ { njs_str("function f(n) {"
+ " var pre = 0; var mid = 0; var post = 0;"
+ " for (var x in [1, 2, 3]) {"
+ " pre++;"
+ " try { "
+ " if (n == 'c') {continue;}"
+ " if (n == 'b') {break;}"
+ " mid++;"
+ " if (n == 'c2') {continue;}"
+ " if (n == 'b2') {break;}"
+ " }"
+ " catch (e) {};"
+ " post++"
+ " }"
+ " return [pre, mid, post];"
+ "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
+ njs_str("[[3,3,3],"
+ "[3,0,0],"
+ "[1,0,0],"
+ "[3,3,0],"
+ "[1,1,0]]") },
+
+ /* Multiple break/continue from catch in try/catch. */
+
+ { njs_str("function f(t, n) {"
+ " var pre = 0; var mid = 0; var post = 0;"
+ " for (var x in [1, 2, 3]) {"
+ " pre++;"
+ " try { "
+ " if (t) {throw 'a'}"
+ " }"
+ " catch (e) {"
+ " if (n == 'c') {continue;}"
+ " if (n == 'b') {break;}"
+ " mid++;"
+ " if (n == 'c2') {continue;}"
+ " if (n == 'b2') {break;}"
+ " };"
+ " post++"
+ " }"
+ " return [pre, mid, post];"
+ "}; njs.dump([f(), f(1), f(1, 'c'), f(1, 'b'), f(1, 'c2'), f(1, 'b2')])"),
+ njs_str("[[3,0,3],"
+ "[3,3,3],"
+ "[3,0,0],"
+ "[1,0,0],"
+ "[3,3,0],"
+ "[1,1,0]]") },
+
+ /* break from try in try/finally. */
+
+ { njs_str("function f(n) {"
+ " var pre = 0; var mid = 0; var fin = 0; var post = 0;"
+ " for (var x in [1, 2, 3]) {"
+ " pre++;"
+ " try { "
+ " if (n == 'c') {continue;}"
+ " if (n == 'b') {break;}"
+ " mid++;"
+ " if (n == 'c2') {continue;}"
+ " if (n == 'b2') {break;}"
+ " }"
+ " finally {fin++};"
+ " post++"
+ " }"
+ " return [pre, mid, fin, post];"
+ "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
+ njs_str("[[3,3,3,3],"
+ "[3,0,3,0],"
+ "[1,0,1,0],"
+ "[3,3,3,0],"
+ "[1,1,1,0]]") },
+
+ /* Multiple break/continue from try in try/catch/finally. */
+
+ { njs_str("function f(n) {"
+ " var pre = 0; var mid = 0; var fin = 0; var post = 0;"
+ " for (var x in [1, 2, 3]) {"
+ " pre++;"
+ " try { "
+ " if (n == 'c') {continue;}"
+ " if (n == 'b') {break;}"
+ " mid++;"
+ " if (n == 'c2') {continue;}"
+ " if (n == 'b2') {break;}"
+ " }"
+ " catch (e) {}"
+ " finally {fin++};"
+ " post++"
+ " }"
+ " return [pre, mid, fin, post];"
+ "}; njs.dump([f(),f('c'),f('b'),f('c2'),f('b2')])"),
+ njs_str("[[3,3,3,3],"
+ "[3,0,3,0],"
+ "[1,0,1,0],"
+ "[3,3,3,0],"
+ "[1,1,1,0]]") },
+
+ /* Multiple break/continue from catch in try/catch/finally. */
+
+ { njs_str("function f(t, n) {"
+ " var pre = 0; var mid = 0; var fin = 0; var post = 0;"
+ " for (var x in [1, 2, 3]) {"
+ " pre++;"
+ " try {if (t) {throw 'a'}}"
+ " catch (e) { "
+ " if (n == 'c') {continue;}"
+ " if (n == 'b') {break;}"
+ " mid++;"
+ " if (n == 'c2') {continue;}"
+ " if (n == 'b2') {break;}"
+ " }"
+ " finally {fin++};"
+ " post++"
+ " }"
+ " return [pre, mid, fin, post];"
+ "}; njs.dump([f(), f(1), f(1, 'c'), f(1, 'b'), f(1, 'c2'), f(1, 'b2')])"),
+ njs_str("[[3,0,3,3],"
+ "[3,3,3,3],"
+ "[3,0,3,0],"
+ "[1,0,1,0],"
+ "[3,3,3,0],"
+ "[1,1,1,0]]") },
+
+ /* Multiple return from try. */
+
+ { njs_str("var r = 0; "
+ "function f(i, n) {"
+ " try { "
+ " var a = 'x'; "
+ " if (i != 0) {"
+ " return a.repeat(n);"
+ " } else {"
+ " return;"
+ " }"
+ " }"
+ " catch (e) { } "
+ " finally { r++; }};"
+ "[f(1,1), f(1,2), f(0), r]"),
+ njs_str("x,xx,,3") },
+
+ { njs_str("var r = 0; "
+ "function f(i) {"
+ " try { "
+ " return i;"
+ " }"
+ " catch (e) { } "
+ " finally { r++; }};"
+ "[f(true), f(false), r]"),
+ njs_str("true,false,2") },
+
+ /* Multiple return from catch. */
+
+ { njs_str("var r = 0; "
+ "function f(i, n) {"
+ " try { "
+ " throw 1;"
+ " }"
+ " catch (e) { "
+ " var a = 'x'; "
+ " if (i != 0) {"
+ " return a.repeat(n);"
+ " } else {"
+ " return;"
+ " }"
+ " } "
+ " finally { r++; }};"
+ "[f(1,1), f(1,2), f(0), r]"),
+ njs_str("x,xx,,3") },
+
+ /* return overrun by finally. */
+
+ { njs_str("function f() {"
+ " try { "
+ " return 'a';"
+ " }"
+ " catch (e) { "
+ " } "
+ " finally { "
+ " return 'b'; "
+ " }}; "
+ "f()"),
+ njs_str("b") },
+
+ { njs_str("(function (f, val) { "
+ " try { return f(val); } "
+ " finally { return val; }"
+ "})(function () {throw 'a'}, 'v')"),
+ njs_str("v") },
+
+ { njs_str("(function() { try { return ['a'];} finally {} } )()"),
+ njs_str("a") },
+
+ { njs_str("function f(){}; try {f((new RegExp('a**')))} catch (e) { }"),
+ njs_str("undefined") },
+
+ { njs_str("function f(){}; try {f(f((new RegExp('a**'))))} catch (e) { }"),
+ njs_str("undefined") },
+
+ { njs_str("function f(){}; (function(){try {f(f((new RegExp('a**'))))} catch (e) { return 1}})()"),
+ njs_str("1") },
+
+ { njs_str("var o = { valueOf: function() { return '3' } }; --o"),
+ njs_str("2") },
+
+ { njs_str("var o = { valueOf: function() { return [3] } }; --o"),
+ njs_str("NaN") },
+
+ { njs_str("var o = { valueOf: function() { return '3' } }; 10 - o"),
+ njs_str("7") },
+
+ { njs_str("var o = { valueOf: function() { return [3] } }; 10 - o"),
+ njs_str("NaN") },
+
+ { njs_str("var o = { toString: function() { return 'OK' } }; 'o:' + o"),
+ njs_str("o:OK") },
+
+ { njs_str("var o = { toString: function() { return [1] } }; o"),
+ njs_str("TypeError: Cannot convert object to primitive value") },
+
+ { njs_str("var o = { toString: function() { return [1] } }; 'o:' + o"),
+ njs_str("TypeError: Cannot convert object to primitive value") },
+
+ { njs_str("var a = { valueOf: function() { return '3' } };"
+ "var b = { toString: function() { return 10 - a + 'OK' } };"
+ "var c = { toString: function() { return b + 'YES' } };"
+ "'c:' + c"),
+ njs_str("c:7OKYES") },
+
+ { njs_str("[1,2,3].valueOf()"),
+ njs_str("1,2,3") },
+
+ { njs_str("var o = { valueOf: function() { return 'OK' } };"
+ "o.valueOf()"),
+ njs_str("OK") },
+
+ { njs_str("false.__proto__ === true.__proto__"),
+ njs_str("true") },
+
+ { njs_str("0..__proto__ === 1..__proto__"),
+ njs_str("true") },
+
+ { njs_str("[].__proto__ === [1,2].__proto__"),
+ njs_str("true") },
+
+ { njs_str("/./.__proto__ === /a/.__proto__"),
+ njs_str("true") },
+
+ { njs_str("''.__proto__ === 'abc'.__proto__"),
+ njs_str("true") },
+
+ { njs_str("[].__proto__.join.call([1,2,3], ':')"),
+ njs_str("1:2:3") },
+
+ { njs_str("''.__proto__.concat.call('a', 'b', 'c')"),
+ njs_str("abc") },
+
+ { njs_str("/./.__proto__.test.call(/a{2}/, 'aaa')"),
+ njs_str("true") },
+
+ { njs_str("true instanceof Boolean"),
+ njs_str("false") },
+
+ { njs_str("1 instanceof Number"),
+ njs_str("false") },
+
+ { njs_str("'' instanceof String"),
+ njs_str("false") },
+
+ { njs_str("({}) instanceof Object"),
+ njs_str("true") },
+
+ { njs_str("[] instanceof []"),
+ njs_str("TypeError: right argument is not a function") },
+
+ { njs_str("[] instanceof Array"),
+ njs_str("true") },
+
+ { njs_str("[] instanceof Object"),
+ njs_str("true") },
+
+ { njs_str("/./ instanceof RegExp"),
+ njs_str("true") },
+
+ { njs_str("/./ instanceof Object"),
+ njs_str("true") },
+
+ { njs_str("Object.defineProperty(Function.prototype, \"prototype\", {get: ()=>Array.prototype});"
+ "[] instanceof Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("Object.defineProperty(Function.prototype, \"prototype\", {get: ()=>{throw Error('Oops')}});"
+ "[] instanceof Function.prototype"),
+ njs_str("Error: Oops") },
+
+ /* global this. */
+
+ { njs_str("this"),
+ njs_str("[object Object]") },
+
+ { njs_str("this.a = 1; this.a"),
+ njs_str("1") },
+
+ { njs_str("this.undefined = 42"),
+ njs_str("TypeError: Cannot assign to read-only property \"undefined\" of object") },
+
+ { njs_str("this.Infinity = 42"),
+ njs_str("TypeError: Cannot assign to read-only property \"Infinity\" of object") },
+
+ { njs_str("this.NaN = 42"),
+ njs_str("TypeError: Cannot assign to read-only property \"NaN\" of object") },
+
+ { njs_str("typeof this.undefined"),
+ njs_str("undefined") },
+
+ { njs_str("typeof this.Infinity"),
+ njs_str("number") },
+
+ { njs_str("this.Infinity + 1"),
+ njs_str("Infinity") },
+
+ { njs_str("typeof this.NaN"),
+ njs_str("number") },
+
+ { njs_str("this.NaN + 1"),
+ njs_str("NaN") },
+
+ { njs_str("{this}"),
+ njs_str("undefined") },
+
+ { njs_str("if (1) {new this}"),
+ njs_str("TypeError: object is not a function") },
+
+ { njs_str("if (1) {this()}"),
+ njs_str("TypeError: object is not a function") },
+
+ { njs_str("var ex; try {new this} catch (e) {ex = e}; ex"),
+ njs_str("TypeError: object is not a function") },
+
+ { njs_str("var ex; try {({}) instanceof this} catch (e) {ex = e}; ex"),
+ njs_str("TypeError: right argument is not a function") },
+
+ { njs_str("Function.call(this, 'var x / = 1;')"),
+ njs_str("InternalError: Not implemented") },
+
+ { njs_str("njs"),
+ njs_str("[object Object]") },
+
+ { njs_str("var o = Object(); o"),
+ njs_str("[object Object]") },
+
+ { njs_str("var o = new Object(); o"),
+ njs_str("[object Object]") },
+
+ { njs_str("var o = new Object(1); o"),
+ njs_str("1") },
+
+ { njs_str("var o = {}; o === Object(o)"),
+ njs_str("true") },
+
+ { njs_str("var o = {}; o === new Object(o)"),
+ njs_str("true") },
+
+ { njs_str("var o = Object([]); Object.prototype.toString.call(o)"),
+ njs_str("[object Array]") },
+
+ { njs_str("Object.name"),
+ njs_str("Object") },
+
+ { njs_str("Object.length"),
+ njs_str("1") },
+
+ { njs_str("Object.__proto__ === Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.constructor === Object"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.__proto__ === null"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.__proto__ = {}"),
+ njs_str("TypeError: Cyclic __proto__ value") },
+
+ { njs_str("var o = {}; var o2 = Object.create(o); o.__proto__ = o2"),
+ njs_str("TypeError: Cyclic __proto__ value") },
+
+ { njs_str("Object.prototype.__proto__.f()"),
+ njs_str("TypeError: cannot get property \"f\" of undefined") },
+
+ { njs_str("var obj = Object.create(null); obj.one = 1;"
+ "var res = [];"
+ "for (var val in obj) res.push(val); res"),
+ njs_str("one") },
+
+ { njs_str("var o1 = Object.create(null); o1.one = 1;"
+ "var o2 = Object.create(o1); o2.two = 2;"
+ "var o3 = Object.create(o2); o3.three = 3;"
+ "var res = [];"
+ "for (var val in o3) res.push(val); res"),
+ njs_str("three,two,one") },
+
+ { njs_str("var o1 = Object.create(null); o1.one = 1;"
+ "var o2 = Object.create(o1);"
+ "var o3 = Object.create(o2); o3.three = 3;"
+ "var res = [];"
+ "for (var val in o3) res.push(val); res"),
+ njs_str("three,one") },
+
+ { njs_str("var o1 = Object.create(null); o1.one = 1;"
+ "var o2 = Object.create(o1);"
+ "var o3 = Object.create(o2);"
+ "var res = [];"
+ "for (var val in o3) res.push(val); res"),
+ njs_str("one") },
+
+ { njs_str("var o1 = Object.create(null); o1.one = 1;"
+ "var o2 = Object.create(o1); o2.two = 2;"
+ "var o3 = Object.create(o2); o3.three = 3;"
+ "o3.two = -2; o3.one = -1;"
+ "var res = [];"
+ "for (var val in o3) res.push(val); res"),
+ njs_str("three,two,one") },
+
+ { njs_str("var a = []; for(var p in 'abc') a.push(p); a"),
+ njs_str("0,1,2") },
+
+ { njs_str("var a = []; for(var p in Object('abc')) a.push(p); a"),
+ njs_str("0,1,2") },
+
+ { njs_str("var o = Object('abc'); var x = Object.create(o);"
+ "x.a = 1; x.b = 2;"
+ "var a = []; for(var p in x) a.push(p); a"),
+ njs_str("a,b,0,1,2") },
+
+ { njs_str("var o = Object.create(Math); o.abs = -5; Math.abs(o.abs)"),
+ njs_str("5") },
+
+ { njs_str("Object.prototype.toString.call(Object.prototype)"),
+ njs_str("[object Object]") },
+
+ { njs_str("Object.prototype.toString.call(new Array)"),
+ njs_str("[object Array]") },
+
+ { njs_str("Object.prototype.toString.call(new URIError)"),
+ njs_str("[object Error]") },
+
+ { njs_str("Object.prototype"),
+ njs_str("[object Object]") },
+
+ { njs_str("Object.prototype.valueOf.prototype"),
+ njs_str("undefined") },
+
+ { njs_str("Object.constructor === Function"),
+ njs_str("true") },
+
+ { njs_str("({}).__proto__ === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("({}).__proto__ = 1"),
+ njs_str("1") },
+
+ { njs_str("({}).__proto__ = null"),
+ njs_str("null") },
+
+ { njs_str("({__proto__: []}) instanceof Array"),
+ njs_str("true") },
+
+ { njs_str("({}).__proto__.constructor === Object"),
+ njs_str("true") },
+
+ { njs_str("({}).constructor === Object"),
+ njs_str("true") },
+
+ { njs_str("({}).constructor()"),
+ njs_str("[object Object]") },
+
+ { njs_str("var a = Object.__proto__; a()"),
+ njs_str("undefined") },
+
+ { njs_str("Object.__proto__()"),
+ njs_str("undefined") },
+
+ { njs_str("var a = Array(3); a"),
+ njs_str(",,") },
+
+ { njs_str("var a = Array(); a.length"),
+ njs_str("0") },
+
+ { njs_str("var a = Array(0); a.length"),
+ njs_str("0") },
+
+ { njs_str("var a = Array(true); a"),
+ njs_str("true") },
+
+ { njs_str("var a = Array(1,'two',3); a"),
+ njs_str("1,two,3") },
+
+ { njs_str("var a = Array(-1)"),
+ njs_str("RangeError: Invalid array length") },
+
+ { njs_str("var a = Array(2.5)"),
+ njs_str("RangeError: Invalid array length") },
+
+ { njs_str("var a = Array(NaN)"),
+ njs_str("RangeError: Invalid array length") },
+
+ { njs_str("var a = Array(Infinity)"),
+ njs_str("RangeError: Invalid array length") },
+
+ { njs_str("var a = Array(1111111111)"),
+ njs_str("MemoryError") },
+
+ { njs_str("var x = Array(2**32)"),
+ njs_str("RangeError: Invalid array length") },
+
+ { njs_str("var x = Array(2**28)"),
+ njs_str("MemoryError") },
+
+ { njs_str("var x = Array(2**20), y = Array(2**12).fill(x);"
+ "Array.prototype.concat.apply(y[0], y.slice(1))"),
+ njs_str("RangeError: Invalid array length") },
+
+ { njs_str("var a = new Array(3); a"),
+ njs_str(",,") },
+
+ { njs_str("Array.name"),
+ njs_str("Array") },
+
+ { njs_str("Array.length"),
+ njs_str("1") },
+
+ { njs_str("Array.__proto__ === Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("Array.prototype.constructor === Array"),
+ njs_str("true") },
+
+ { njs_str("Array.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("Array.prototype.__proto__ === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.toString.call(Array.prototype)"),
+ njs_str("[object Array]") },
+
+ { njs_str("Array.prototype"),
+ njs_str("") },
+
+ { njs_str("Array.prototype.length"),
+ njs_str("0") },
+
+ { njs_str("Array.prototype.length = 3, Array.prototype"),
+ njs_str(",,") },
+
+ { njs_str("var o = Object.create(Array.prototype); o.length = 3;"
+ "[Array.prototype, Array.prototype.length, o.length]"),
+ njs_str(",0,3") },
+
+ { njs_str("var o = Object.create(Array.prototype);"
+ "Object.defineProperty(o, 'length', {value: 3});"
+ "[Array.prototype, Array.prototype.length, o.length]"),
+ njs_str(",0,3") },
+
+ { njs_str("Array.constructor === Function"),
+ njs_str("true") },
+
+ { njs_str("var a = []; a.join = 'OK'; a"),
+ njs_str("[object Array]") },
+
+ { njs_str("[].__proto__ === Array.prototype"),
+ njs_str("true") },
+
+ { njs_str("[].__proto__.constructor === Array"),
+ njs_str("true") },
+
+ { njs_str("[].constructor === Array"),
+ njs_str("true") },
+
+ { njs_str("([]).constructor()"),
+ njs_str("") },
+
+ { njs_str("Boolean()"),
+ njs_str("false") },
+
+ { njs_str("new Boolean()"),
+ njs_str("false") },
+
+ { njs_str("new Boolean"),
+ njs_str("false") },
+
+ { njs_str("Boolean(0)"),
+ njs_str("false") },
+
+ { njs_str("Boolean('')"),
+ njs_str("false") },
+
+ { njs_str("Boolean(1)"),
+ njs_str("true") },
+
+ { njs_str("Boolean('a')"),
+ njs_str("true") },
+
+ { njs_str("Boolean({})"),
+ njs_str("true") },
+
+ { njs_str("Boolean([])"),
+ njs_str("true") },
+
+ { njs_str("typeof Boolean(1)"),
+ njs_str("boolean") },
+
+ { njs_str("typeof new Boolean(1)"),
+ njs_str("object") },
+
+ { njs_str("typeof new Boolean"),
+ njs_str("object") },
+
+ { njs_str("Boolean.name"),
+ njs_str("Boolean") },
+
+ { njs_str("Boolean.length"),
+ njs_str("1") },
+
+ { njs_str("Boolean.__proto__ === Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("Boolean.prototype.constructor === Boolean"),
+ njs_str("true") },
+
+ { njs_str("Boolean.prototype.constructor = 1;"
+ "Boolean.prototype.constructor"),
+ njs_str("1") },
+
+ { njs_str("var c = Boolean.prototype.constructor;"
+ "Boolean.prototype.constructor = 1;"
+ "[c(0), Boolean.prototype.constructor]"),
+ njs_str("false,1") },
+
+ { njs_str("Boolean.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("Boolean.prototype.__proto__ === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.toString.call(Boolean.prototype)"),
+ njs_str("[object Boolean]") },
+
+ { njs_str("Boolean.prototype"),
+ njs_str("false") },
+
+ { njs_str("Boolean.constructor === Function"),
+ njs_str("true") },
+
+ { njs_str("true.__proto__ === Boolean.prototype"),
+ njs_str("true") },
+
+ { njs_str("false.__proto__ === Boolean.prototype"),
+ njs_str("true") },
+
+ { njs_str("var b = Boolean(1); b.__proto__ === Boolean.prototype"),
+ njs_str("true") },
+
+ { njs_str("var b = new Boolean(1); b.__proto__ === Boolean.prototype"),
+ njs_str("true") },
+
+ { njs_str("Number()"),
+ njs_str("0") },
+
+ { njs_str("new Number()"),
+ njs_str("0") },
+
+ { njs_str("new Number"),
+ njs_str("0") },
+
+ { njs_str("new Number(undefined)"),
+ njs_str("NaN") },
+
+ { njs_str("new Number(null)"),
+ njs_str("0") },
+
+ { njs_str("new Number(true)"),
+ njs_str("1") },
+
+ { njs_str("new Number(false)"),
+ njs_str("0") },
+
+ { njs_str("Number(undefined)"),
+ njs_str("NaN") },
+
+ { njs_str("Number(null)"),
+ njs_str("0") },
+
+ { njs_str("Number(true)"),
+ njs_str("1") },
+
+ { njs_str("Number(false)"),
+ njs_str("0") },
+
+ { njs_str("Number(123)"),
+ njs_str("123") },
+
+ { njs_str("Number('123')"),
+ njs_str("123") },
+
+ { njs_str("Number('0.'+'1'.repeat(128))"),
+ njs_str("0.1111111111111111") },
+
+ { njs_str("Number('1'.repeat(128))"),
+ njs_str("1.1111111111111113e+127") },
+
+ { njs_str("Number('1'.repeat(129))"),
+ njs_str("1.1111111111111112e+128") },
+
+ { njs_str("Number('1'.repeat(129))"),
+ njs_str("1.1111111111111112e+128") },
+
+ { njs_str("Number('1'.repeat(129)+'e-100')"),
+ njs_str("1.1111111111111112e+28") },
+
+ { njs_str("Number('1'.repeat(310))"),
+ njs_str("Infinity") },
+
+ { njs_str("var o = { valueOf: function() { return 123 } };"
+ "Number(o)"),
+ njs_str("123") },
+
+ { njs_str("var o = { valueOf: function() { return 123 } };"
+ "new Number(o)"),
+ njs_str("123") },
+
+ { njs_str("typeof Number(1)"),
+ njs_str("number") },
+
+ { njs_str("typeof new Number(1)"),
+ njs_str("object") },
+
+ { njs_str("typeof new Number"),
+ njs_str("object") },
+
+ { njs_str("Number.name"),
+ njs_str("Number") },
+
+ { njs_str("Number.length"),
+ njs_str("1") },
+
+ { njs_str("Number.__proto__ === Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("Number.prototype.constructor === Number"),
+ njs_str("true") },
+
+ { njs_str("Number.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("Number.prototype.__proto__ === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.toString.call(Number.prototype)"),
+ njs_str("[object Number]") },
+
+ { njs_str("Number.prototype"),
+ njs_str("0") },
+
+ { njs_str("Number.constructor === Function"),
+ njs_str("true") },
+
+ { njs_str("0..__proto__ === Number.prototype"),
+ njs_str("true") },
+
+ { njs_str("var n = Number(1); n.__proto__ === Number.prototype"),
+ njs_str("true") },
+
+ { njs_str("var n = new Number(1); n.__proto__ === Number.prototype"),
+ njs_str("true") },
+
+ { njs_str("Number.isFinite()"),
+ njs_str("false") },
+
+ { njs_str("Number.isFinite(123)"),
+ njs_str("true") },
+
+ { njs_str("Number.isFinite('123')"),
+ njs_str("false") },
+
+ { njs_str("Number.isFinite(Infinity)"),
+ njs_str("false") },
+
+ { njs_str("Number.isFinite(NaN)"),
+ njs_str("false") },
+
+ { njs_str("Number.isInteger()"),
+ njs_str("false") },
+
+ { njs_str("Number.isInteger('123')"),
+ njs_str("false") },
+
+ { njs_str("Number.isInteger(123)"),
+ njs_str("true") },
+
+ { njs_str("Number.isInteger(-123.0)"),
+ njs_str("true") },
+
+ { njs_str("Number.isInteger(123.4)"),
+ njs_str("false") },
+
+ { njs_str("Number.isInteger(Infinity)"),
+ njs_str("false") },
+
+ { njs_str("Number.isInteger(NaN)"),
+ njs_str("false") },
+
+ { njs_str("Number.isSafeInteger()"),
+ njs_str("false") },
+
+ { njs_str("Number.isSafeInteger('123')"),
+ njs_str("false") },
+
+ { njs_str("Number.isSafeInteger(9007199254740991)"),
+ njs_str("true") },
+
+ { njs_str("Number.isSafeInteger(-9007199254740991.0)"),
+ njs_str("true") },
+
+ { njs_str("Number.isSafeInteger(9007199254740992)"),
+ njs_str("false") },
+
+ { njs_str("Number.isSafeInteger(-9007199254740992.0)"),
+ njs_str("false") },
+
+ { njs_str("Number.isSafeInteger(123.4)"),
+ njs_str("false") },
+
+ { njs_str("Number.isSafeInteger(Infinity)"),
+ njs_str("false") },
+
+ { njs_str("Number.isSafeInteger(-Infinity)"),
+ njs_str("false") },
+
+ { njs_str("Number.isSafeInteger(NaN)"),
+ njs_str("false") },
+
+ { njs_str("Number.isNaN()"),
+ njs_str("false") },
+
+ { njs_str("Number.isNaN('NaN')"),
+ njs_str("false") },
+
+ { njs_str("Number.isNaN(NaN)"),
+ njs_str("true") },
+
+ { njs_str("Number.isNaN(123)"),
+ njs_str("false") },
+
+ { njs_str("Number.isNaN(Infinity)"),
+ njs_str("false") },
+
+#if 0
+ { njs_str("parseFloat === Number.parseFloat"),
+ njs_str("true") },
+
+ { njs_str("parseInt === Number.parseInt"),
+ njs_str("true") },
+#endif
+
+ { njs_str("String()"),
+ njs_str("") },
+
+ { njs_str("new String()"),
+ njs_str("") },
+
+ { njs_str("new String"),
+ njs_str("") },
+
+ { njs_str("String(123)"),
+ njs_str("123") },
+
+ { njs_str("new String(123)"),
+ njs_str("123") },
+
+ { njs_str("Object('123').length"),
+ njs_str("3") },
+
+ { njs_str("new String(123).length"),
+ njs_str("3") },
+
+ { njs_str("new String(123).toString()"),
+ njs_str("123") },
+
+ { njs_str("String([1,2,3])"),
+ njs_str("1,2,3") },
+
+ { njs_str("new String([1,2,3])"),
+ njs_str("1,2,3") },
+
+ { njs_str("var s = new String('αβ'); s.one = 1; 'one' in s"),
+ njs_str("true") },
+
+ { njs_str("var s = new String('αβ'); 'one' in s"),
+ njs_str("false") },
+
+ { njs_str("var s = new String('αβ'); s.one = 1; '1' in s"),
+ njs_str("true") },
+
+ { njs_str("var s = new String('αβ'); s.one = 1; 1 in s"),
+ njs_str("true") },
+
+ { njs_str("var s = new String('αβ'); s.one = 1; 2 in s"),
+ njs_str("false") },
+
+ { njs_str("var s = new String('αβ'); s[1]"),
+ njs_str("β") },
+
+ { njs_str("Object.create(new String('αβ'))[1]"),
+ njs_str("β") },
+
+ { njs_str("var s = new String('αβ'); s[1] = 'b'"),
+ njs_str("TypeError: Cannot assign to read-only property \"1\" of object string") },
+
+ { njs_str("var o = Object.create(new String('αβ')); o[1] = 'a'"),
+ njs_str("TypeError: Cannot assign to read-only property \"1\" of object") },
+
+ { njs_str("var s = new String('αβ'); s[4] = 'ab'; s[4]"),
+ njs_str("ab") },
+
+ { njs_str("Object.create(new String('αβ')).length"),
+ njs_str("2") },
+
+ { njs_str("var s = new String('αβ'); s.valueOf()[1]"),
+ njs_str("β") },
+
+ { njs_str("var o = { toString: function() { return 'OK' } };"
+ "String(o)"),
+ njs_str("OK") },
+
+ { njs_str("var o = { toString: function() { return 'OK' } };"
+ "new String(o)"),
+ njs_str("OK") },
+
+ { njs_str("typeof String('abc')"),
+ njs_str("string") },
+
+ { njs_str("typeof new String('abc')"),
+ njs_str("object") },
+
+ { njs_str("typeof new String"),
+ njs_str("object") },
+
+ { njs_str("String.name"),
+ njs_str("String") },
+
+ { njs_str("String.length"),
+ njs_str("1") },
+
+ { njs_str("String.__proto__ === Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.toString.call(String.prototype)"),
+ njs_str("[object String]") },
+
+ { njs_str("String.prototype"),
+ njs_str("") },
+
+ { njs_str("String.prototype.length"),
+ njs_str("0") },
+
+ { njs_str("String.prototype.constructor === String"),
+ njs_str("true") },
+
+ { njs_str("String.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("String.prototype.__proto__ === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("''.__proto__ === String.prototype"),
+ njs_str("true") },
+
+ { njs_str("String.constructor === Function"),
+ njs_str("true") },
+
+ { njs_str("'test'.__proto__ === String.prototype"),
+ njs_str("true") },
+
+ { njs_str("var s = String('abc'); s.__proto__ === String.prototype"),
+ njs_str("true") },
+
+ { njs_str("var s = new String('abc'); s.__proto__ === String.prototype"),
+ njs_str("true") },
+
+ { njs_str("'test'.constructor === String"),
+ njs_str("true") },
+
+ { njs_str("'test'.constructor.prototype === String.prototype"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.create(String.prototype); o.length = 1"),
+ njs_str("TypeError: Cannot assign to read-only property \"length\" of object") },
+
+ { njs_str("Function.name"),
+ njs_str("Function") },
+
+ { njs_str("Function.length"),
+ njs_str("1") },
+
+ { njs_str("Function.__proto__ === Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("Function.prototype.constructor === Function"),
+ njs_str("true") },
+
+ { njs_str("Function.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("Function.prototype.__proto__ === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.toString.call(Function.prototype)"),
+ njs_str("[object Function]") },
+
+ { njs_str("Function.prototype"),
+ njs_str("[object Function]") },
+
+ { njs_str("Function.prototype.length"),
+ njs_str("0") },
+
+ { njs_str("Function.constructor === Function"),
+ njs_str("true") },
+
+ { njs_str("function f() {} f.__proto__ === Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("Function()"),
+ njs_str("InternalError: Not implemented") },
+
+ { njs_str("RegExp()"),
+ njs_str("/(?:)/") },
+
+ { njs_str("RegExp('')"),
+ njs_str("/(?:)/") },
+
+ { njs_str("RegExp(123)"),
+ njs_str("/123/") },
+
+ { njs_str("RegExp.name"),
+ njs_str("RegExp") },
+
+ { njs_str("RegExp.length"),
+ njs_str("2") },
+
+ { njs_str("RegExp.__proto__ === Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("RegExp.prototype.constructor === RegExp"),
+ njs_str("true") },
+
+ { njs_str("RegExp.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("RegExp.prototype.__proto__ === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.toString.call(RegExp.prototype)"),
+ njs_str("[object RegExp]") },
+
+ { njs_str("RegExp.prototype"),
+ njs_str("/(?:)/") },
+
+ { njs_str("RegExp.constructor === Function"),
+ njs_str("true") },
+
+ { njs_str("/./.__proto__ === RegExp.prototype"),
+ njs_str("true") },
+
+ { njs_str("toString()"),
+ njs_str("[object Undefined]") },
+
+ { njs_str("toString() + Object.prototype.toString"),
+ njs_str("[object Undefined][object Function]") },
+
+#if 0
+ { njs_str("toString === Object.prototype.toString"),
+ njs_str("true") },
+
+ { njs_str("Object.prototype.toString.yes = 'OK'; toString.yes"),
+ njs_str("OK") },
+#endif
+
+ { njs_str("Object.prototype.toString.call()"),
+ njs_str("[object Undefined]") },
+
+ { njs_str("Object.prototype.toString.call(undefined)"),
+ njs_str("[object Undefined]") },
+
+ { njs_str("Object.prototype.toString.call(null)"),
+ njs_str("[object Null]") },
+
+ { njs_str("Object.prototype.toString.call(true)"),
+ njs_str("[object Boolean]") },
+
+ { njs_str("Object.prototype.toString.call(1)"),
+ njs_str("[object Number]") },
+
+ { njs_str("Object.prototype.toString.call('')"),
+ njs_str("[object String]") },
+
+ { njs_str("Object.prototype.toString.call({})"),
+ njs_str("[object Object]") },
+
+ { njs_str("Object.prototype.toString.call([])"),
+ njs_str("[object Array]") },
+
+ { njs_str("Object.prototype.toString.call(new Object(true))"),
+ njs_str("[object Boolean]") },
+
+ { njs_str("Object.prototype.toString.call(new Number(1))"),
+ njs_str("[object Number]") },
+
+ { njs_str("Object.prototype.toString.call(new Object(1))"),
+ njs_str("[object Number]") },
+
+ { njs_str("Object.prototype.toString.call(new Object(''))"),
+ njs_str("[object String]") },
+
+ { njs_str("Object.prototype.toString.call(function(){})"),
+ njs_str("[object Function]") },
+
+ { njs_str("Object.prototype.toString.call(/./)"),
+ njs_str("[object RegExp]") },
+
+ { njs_str("var p = { a:5 }; var o = Object.create(p); o.a"),
+ njs_str("5") },
+
+ { njs_str("var p = { a:5 }; var o = Object.create(p);"
+ "o.__proto__ === p"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.create(Object.prototype);"
+ "o.__proto__ === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.create(null); '__proto__' in o"),
+ njs_str("false") },
+
+ { njs_str("Object.create()"),
+ njs_str("TypeError: prototype may only be an object or null: undefined") },
+
+ { njs_str("Object.create(1)"),
+ njs_str("TypeError: prototype may only be an object or null: number") },
+
+ { njs_str("var o = {a:1, b:2, c:3};"
+ "Object.keys(o)"),
+ njs_str("a,b,c") },
+
+ { njs_str("var a = []; a.one = 7; Object.keys(a)"),
+ njs_str("one") },
+
+ { njs_str("var a = [,,]; a.one = 7; Object.keys(a)"),
+ njs_str("one") },
+
+ { njs_str("var a = [,6,,3]; a.one = 7; Object.keys(a)"),
+ njs_str("1,3,one") },
+
+ { njs_str("var o = {a:1,b:2}; delete o.a; Object.keys(o)"),
+ njs_str("b") },
+
+ { njs_str("Object.keys()"),
+ njs_str("TypeError: cannot convert undefined argument to object") },
+
+ { njs_str("Object.keys('αβZ')"),
+ njs_str("0,1,2") },
+
+ { njs_str("Object.keys(new String('αβZ'))"),
+ njs_str("0,1,2") },
+
+ { njs_str("var s = new String('αβZ'); s.a = 1; Object.keys(s)"),
+ njs_str("0,1,2,a") },
+
+ { njs_str("var r = new RegExp('αbc'); r.a = 1; Object.keys(r)"),
+ njs_str("a") },
+
+ { njs_str("Object.keys(Object.create(new String('abc')))"),
+ njs_str("") },
+
+ { njs_str("Object.keys(1)"),
+ njs_str("") },
+
+ { njs_str("Object.keys(true)"),
+ njs_str("") },
+
+ { njs_str("var o = {a:3, b:2, c:1}; Object.values(o)"),
+ njs_str("3,2,1") },
+
+ { njs_str("Object.values('s')"),
+ njs_str("s") },
+
+ { njs_str("Object.values('абв abc')"),
+ njs_str("а,б,в, ,a,b,c") },
+
+ { njs_str("var s = new String('abc'); s.three = 3; Object.values(s)"),
+ njs_str("a,b,c,3") },
+
+ { njs_str("var a = [,,5,,4,,,3,2]; a.one = 1; Object.values(a)"),
+ njs_str("5,4,3,2,1") },
+
+ { njs_str("Object.values([{}, null, false, NaN, function() {}])"),
+ njs_str("[object Object],,false,NaN,[object Function]") },
+
+ { njs_str("Object.values(1)"),
+ njs_str("") },
+
+ { njs_str("Object.values(njs)[0] === njs.version"),
+ njs_str("true") },
+
+ { njs_str("Object.values(process)"),
+ njs_str("") },
+
+ { njs_str("Object.values()"),
+ njs_str("TypeError: cannot convert undefined argument to object") },
+
+ { njs_str("Object.entries('abc')"),
+ njs_str("0,a,1,b,2,c") },
+
+ { njs_str("JSON.stringify(Object.entries('эюя'))"),
+ njs_str("[[\"0\",\"э\"],[\"1\",\"ю\"],[\"2\",\"я\"]]") },
+
+ { njs_str("var o = {a:\"а\", b:\"б\", c:\"ц\"};"
+ "JSON.stringify(Object.entries(o))"),
+ njs_str("[[\"a\",\"а\"],[\"b\",\"б\"],[\"c\",\"ц\"]]") },
+
+ { njs_str("JSON.stringify(Object.entries([0]))"),
+ njs_str("[[\"0\",0]]") },
+
+ { njs_str("var s = new String('αβ'); s.two = null; s[3] = true;"
+ "Object.entries(s)"),
+ njs_str("0,α,1,β,two,,3,true") },
+
+ { njs_str("Object.entries(true)"),
+ njs_str("") },
+
+ { njs_str("Object.entries(njs)[0][1] === njs.version"),
+ njs_str("true") },
+
+ { njs_str("Object.entries()"),
+ njs_str("TypeError: cannot convert undefined argument to object") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', {}); o.a"),
+ njs_str("undefined") },
+
+ { njs_str("Object.defineProperty({}, 'a', {value:1})"),
+ njs_str("[object Object]") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', {value:1}); o.a"),
+ njs_str("1") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', Object.create({value:1})); o.a"),
+ njs_str("1") },
+
+ { njs_str("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
+ "Object.keys(o)"),
+ njs_str("a,c") },
+
+ { njs_str("var o = {a:1, c:2};"
+ "Object.defineProperty(o, 'b', {enumerable:false});"
+ "Object.keys(o)"),
+ njs_str("a,c") },
+
+ { njs_str("var o = {a:1, c:3};"
+ "Object.defineProperty(o, 'b', {enumerable:true});"
+ "Object.keys(o)"),
+ njs_str("a,c,b") },
+
+ { njs_str("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
+ "Object.values(o)"),
+ njs_str("1,2") },
+
+ { njs_str("var o = {a:1, c:2};"
+ "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
+ "Object.values(o)"),
+ njs_str("1,2") },
+
+ { njs_str("var o = {a:1, c:3};"
+ "Object.defineProperty(o, 'b', {enumerable:true, value:2});"
+ "Object.values(o)"),
+ njs_str("1,3,2") },
+
+ { njs_str("var o = {a:1, c:2}; Object.defineProperty(o, 'b', {});"
+ "Object.entries(o)"),
+ njs_str("a,1,c,2") },
+
+ { njs_str("var o = {a:1, c:2};"
+ "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
+ "Object.entries(o)"),
+ njs_str("a,1,c,2") },
+
+ { njs_str("var o = {a:1, c:3};"
+ "Object.defineProperty(o, 'b', {enumerable:true, value:2});"
+ "Object.entries(o)"),
+ njs_str("a,1,c,3,b,2") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', {}); o.a = 1"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', {writable:false}); o.a = 1"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', {writable:true});"
+ "o.a = 1; o.a"),
+ njs_str("1") },
+
+ { njs_str("Object.defineProperty(Object.prototype, 'a', {writable:false});"
+ "var o = {a: 1}; [o.a++, o.a]"),
+ njs_str("1,2") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(Object.prototype, 'a', {writable:false});"
+ "o.a = 1"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(Object.prototype, 'a', {writable:true});"
+ "o.a = 1; o.a"),
+ njs_str("1") },
+
+ { njs_str("var p = Object.create(Function);"
+ "Object.defineProperty(p, 'length', {writable: true});"
+ "p.length = 32; p.length"),
+ njs_str("32") },
+
+ { njs_str("var p = Object.create(Math.abs);"
+ "Object.defineProperty(p, 'length', {writable: true});"
+ "p.length = 23; p.length"),
+ njs_str("23") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {value:1}); delete o.a"),
+ njs_str("TypeError: Cannot delete property \"a\" of object") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {value:1, configurable:true});"
+ "delete o.a; o.a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {value:1, configurable:false});"
+ "delete o.a"),
+ njs_str("TypeError: Cannot delete property \"a\" of object") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', Object.create({value:2})); o.a"),
+ njs_str("2") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {configurable:false});"
+ "Object.defineProperty(o, 'a', {configurable:true})"),
+ njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {configurable:false});"
+ "Object.defineProperty(o, 'a', {enumerable:true})"),
+ njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {configurable:false});"
+ "Object.defineProperty(o, 'a', {writable:true})"),
+ njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {configurable:false});"
+ "Object.defineProperty(o, 'a', {enumerable:false}).a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {configurable:false});"
+ "Object.defineProperty(o, 'a', {}).a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {configurable:false, writable:true});"
+ "Object.defineProperty(o, 'a', {writable:false}).a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {configurable:true, writable:false});"
+ "Object.defineProperty(o, 'a', {writable:true}).a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {});"
+ "Object.defineProperty(o, 'a', {}).a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {value:1});"
+ "Object.defineProperty(o, 'a', {value:1}).a"),
+ njs_str("1") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {value:1});"
+ "Object.defineProperty(o, 'a', {value:2}).a"),
+ njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {configurable:true});"
+ "Object.defineProperty(o, 'a', {value:1}).a"),
+ njs_str("1") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {configurable:true, get:()=>1});"
+ "Object.defineProperty(o, 'a', {value:1});"
+ "var d = Object.getOwnPropertyDescriptor(o, 'a'); "
+ "[d.value, d.writable, d.enumerable, d.configurable, d.get, d.set]"),
+ njs_str("1,false,false,true,,") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {configurable:true, value:1});"
+ "Object.defineProperty(o, 'a', {set:()=>1});"
+ "var d = Object.getOwnPropertyDescriptor(o, 'a'); "
+ "[d.value, d.writable, d.enumerable, d.configurable, d.get, d.set]"),
+ njs_str(",,false,true,,[object Function]") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', {get: ()=>1, configurable:true}); "
+ "Object.defineProperty(o, 'a', {value:123}); o.a =2"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', {get: ()=>1, configurable:true}); "
+ "Object.defineProperty(o, 'a', {writable:false}); o.a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', {value: 1, configurable:true}); "
+ "Object.defineProperty(o, 'a', {get:()=>1}); o.a = 2"),
+ njs_str("TypeError: Cannot set property \"a\" of object which has only a getter") },
+
+ { njs_str("var o = Object.create(Object.defineProperty({}, 'x', { set: function(v) { this.y = v; }})); "
+ "o.x = 123; Object.getOwnPropertyDescriptor(o, 'y').value"),
+ njs_str("123") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', { configurable: true, value: 0 });"
+ "Object.defineProperty(o, 'a', { value: 1 });"
+ "Object.defineProperty(o, 'a', { configurable: false, value: 2 }).a"),
+ njs_str("2") },
+
+ { njs_str("var o = {}; Object.defineProperty()"),
+ njs_str("TypeError: cannot convert undefined argument to object") },
+
+ { njs_str("var o = {}; Object.defineProperty(o)"),
+ njs_str("TypeError: descriptor is not an object") },
+
+ { njs_str("Object.defineProperty(Function.prototype, 'name', {value:'x'}).name"),
+ njs_str("x") },
+
+ { njs_str("Object.defineProperty(Function.prototype, 'xxx', {value:'x'}).xxx"),
+ njs_str("x") },
+
+ { njs_str("Object.defineProperty(Object, 'name', {value:'x'}).name"),
+ njs_str("x") },
+
+ { njs_str("Object.defineProperty(Object.prototype, 'toString', {value:1}).toString"),
+ njs_str("1") },
+
+ { njs_str("var o = Object.defineProperties({}, {a:{value:1}}); o.a"),
+ njs_str("1") },
+
+ { njs_str("var o = Object.defineProperties({}, {a:{enumerable:true}, b:{enumerable:true}});"
+ "Object.keys(o)"),
+ njs_str("a,b") },
+
+ { njs_str("var desc = Object.defineProperty({b:{value:1, enumerable:true}}, 'a', {});"
+ "var o = Object.defineProperties({}, desc);"
+ "Object.keys(o)"),
+ njs_str("b") },
+
+ { njs_str("var o = {a:1}; delete o.a;"
+ "Object.defineProperty(o, 'a', { value: 1 }); o.a"),
+ njs_str("1") },
+
+ { njs_str("var o = {a:1}; delete o.a;"
+ "Object.defineProperty(o, 'a', { value: 1 }); o.a = 2; o.a"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+ { njs_str("var o = {a:1}; delete o.a;"
+ "Object.defineProperty(o, 'a', { value: 1, writable:1 }); o.a = 2; o.a"),
+ njs_str("2") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, new String('a'), { value: 1}); o.a"),
+ njs_str("1") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, {toString:function(){return 'a'}}, { value: 1}); o.a"),
+ njs_str("1") },
+
+ { njs_str("var a = [1, 2];"
+ "Object.defineProperty(a, '1', {value: 5}); a[1]"),
+ njs_str("5") },
+
+ { njs_str("var a = [1, 2];"
+ "Object.defineProperty(a, '3', {}); njs.dump(a)"),
+ njs_str("[1,2,<empty>,undefined]") },
+
+ { njs_str("var a = [1, 2];"
+ "Object.defineProperty(a, 'length', {}); a"),
+ njs_str("1,2") },
+
+ { njs_str("var a = [1, 2];"
+ "Object.defineProperty(a, 'length', {value: 1}); a"),
+ njs_str("1") },
+
+ { njs_str("var a = [1, 2];"
+ "Object.defineProperty(a, 'length', {value: 5}); a"),
+ njs_str("1,2,,,") },
+
+ { njs_str("var o = Object.defineProperties({a:1}, {}); o.a"),
+ njs_str("1") },
+
+ { njs_str("var arr = [0, 1]; Object.defineProperty(arr, 'length', {value:3}); arr.length"),
+ njs_str("3") },
+
+ { njs_str("Object.defineProperties()"),
+ njs_str("TypeError: cannot convert undefined argument to object") },
+
+ { njs_str("Object.defineProperties(1, {})"),
+ njs_str("TypeError: cannot convert number argument to object") },
+
+ { njs_str("Object.defineProperties({}, 1)"),
+ njs_str("TypeError: descriptor is not an object") },
+
+ { njs_str("var o = {a:1}; o.hasOwnProperty('a')"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.create({a:2}); o.hasOwnProperty('a')"),
+ njs_str("false") },
+
+ { njs_str("var o = {a:1}; o.hasOwnProperty('b')"),
+ njs_str("false") },
+
+ { njs_str("var a = []; a.hasOwnProperty('0')"),
+ njs_str("false") },
+
+ { njs_str("var a = [,,]; a.hasOwnProperty('0')"),
+ njs_str("false") },
+
+ { njs_str("var a = [3,,]; a.hasOwnProperty('0')"),
+ njs_str("true") },
+
+ { njs_str("var a = [,4]; a.hasOwnProperty('1')"),
+ njs_str("true") },
+
+ { njs_str("var a = [3,4]; a.hasOwnProperty('2')"),
+ njs_str("false") },
+
+ { njs_str("var a = [3,4]; a.one = 1; a.hasOwnProperty('one')"),
+ njs_str("true") },
+
+ { njs_str("var o = {a:1}; o.hasOwnProperty(o)"),
+ njs_str("false") },
+
+ { njs_str("var o = {a:1}; o.hasOwnProperty(1)"),
+ njs_str("false") },
+
+ { njs_str("var o = {a:1}; o.hasOwnProperty()"),
+ njs_str("false") },
+
+ { njs_str("[,].hasOwnProperty()"),
+ njs_str("false") },
+
+ { njs_str("[1,2].hasOwnProperty('len')"),
+ njs_str("false") },
+
+ { njs_str("[1,2].hasOwnProperty('0')"),
+ njs_str("true") },
+
+ { njs_str("[1,2].hasOwnProperty('2')"),
+ njs_str("false") },
+
+ { njs_str("[].hasOwnProperty('length')"),
+ njs_str("true") },
+
+ { njs_str("[1,2].hasOwnProperty('length')"),
+ njs_str("true") },
+
+ { njs_str("(new Array()).hasOwnProperty('length')"),
+ njs_str("true") },
+
+ { njs_str("(new Array(10)).hasOwnProperty('length')"),
+ njs_str("true") },
+
+ { njs_str("Object.valueOf.hasOwnProperty()"),
+ njs_str("false") },
+
+ { njs_str("1..hasOwnProperty('b')"),
+ njs_str("false") },
+
+ { njs_str("'s'.hasOwnProperty('b')"),
+ njs_str("false") },
+
+ { njs_str("'s'.hasOwnProperty('0')"),
+ njs_str("true") },
+
+ { njs_str("'s'.hasOwnProperty('1')"),
+ njs_str("false") },
+
+ { njs_str("Object.hasOwnProperty('hasOwnProperty')"),
+ njs_str("false") },
+
+ { njs_str("Object.prototype.hasOwnProperty('hasOwnProperty')"),
+ njs_str("true") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:undefined, set:undefined}).a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:1})"),
+ njs_str("TypeError: Getter must be a function") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:undefined}).a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:function(){return 1}}).a"),
+ njs_str("1") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {set:1})"),
+ njs_str("TypeError: Setter must be a function") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {set:undefined}); o.a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {set:undefined}); o.a = 4;"),
+ njs_str("TypeError: Cannot set property \"a\" of object which has only a getter") },
+
+ { njs_str("var o = {a: 0};"
+ "Object.defineProperty(o, 'b', {set:function(x){this.a = x / 2;}}); o.b = 4; o.a;"),
+ njs_str("2") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {value:undefined});"
+ "Object.defineProperty(o, 'a', {get:undefined})"),
+ njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {});"
+ "Object.defineProperty(o, 'a', {get:undefined})"),
+ njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:undefined});"
+ "Object.defineProperty(o, 'a', {get:undefined}).a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:undefined});"
+ "Object.defineProperty(o, 'a', {set:undefined}).a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:undefined});"
+ "Object.defineProperty(o, 'a', {}); o.a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:undefined});"
+ "Object.defineProperty(o, 'a', {set:function(){}})"),
+ njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:undefined});"
+ "Object.defineProperty(o, 'a', {get:function(){}})"),
+ njs_str("TypeError: Cannot redefine property: \"a\"") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
+ "Object.defineProperty(o, 'a', {get:()=>2}); o.a"),
+ njs_str("2") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {set:function(v){this.aa=v;}, configurable:true});"
+ "Object.defineProperty(o, 'a', {get:function(){return this.aa}}); o.a = 1; o.a"),
+ njs_str("1") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
+ "Object.defineProperty(o, 'a', {value:2}).a"),
+ njs_str("2") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {get:()=>1, configurable:true});"
+ "Object.defineProperty(o, 'a', {value:2});"
+ "var d = Object.getOwnPropertyDescriptor(o, 'a');"
+ "d.get === undefined && d.set === undefined"),
+ njs_str("true") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'a', {value:1, configurable:true});"
+ "Object.defineProperty(o, 'a', {get:()=>2});"
+ "var d = Object.getOwnPropertyDescriptor(o, 'a');"
+ "d.writable === undefined && d.value === undefined"),
+ njs_str("true") },
+
+ { njs_str("Object.defineProperty(Date.prototype, 'year', {get: function() { return this.getFullYear();}});"
+ "var d = new Date(0); d.year"),
+ njs_str("1970") },
+
+ { njs_str("var o = [];"
+ "Object.defineProperty(o, 'fill', {get:undefined}).fill"),
+ njs_str("undefined") },
+
+ { njs_str("var o = [];"
+ "Object.defineProperty(o, 'length', {get:undefined})"),
+ njs_str("TypeError: Cannot redefine property: \"length\"") },
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'foo', {get:()=>10});"
+ "Object.preventExtensions(o);Object.isFrozen(o)"),
+ njs_str("true"), },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'r', { get: function() { return this.r_value; } }); o.r_value = 1; o.r;"),
+ njs_str("1") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'rw', { get: function() { return this.rw_value; }, set: function(x) { this.rw_value = x / 2; } }); o.rw = 10; o.rw"),
+ njs_str("5") },
+
+ { njs_str("var o = {}; function foo() {}; Object.defineProperty(o, 'a', {get: foo});"
+ "Object.getOwnPropertyDescriptor(o, 'a').get === foo"),
+ njs_str("true") },
+
+ { njs_str("var o = {}; Object.defineProperty(o, 'a', {get: undefined});"
+ "JSON.stringify(Object.getOwnPropertyDescriptor(o, 'a')).set"),
+ njs_str("undefined") },
+
+ { njs_str("var p = { a:5 }; var o = Object.create(p);"
+ "Object.getPrototypeOf(o) === p"),
+ njs_str("true") },
+
+ { njs_str("var p = { a:5 }; var o = Object.create(p);"
+ "Object.getPrototypeOf(o) === o.__proto__"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.create(Object.prototype);"
+ "Object.getPrototypeOf(o) === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("Object.getPrototypeOf(1)"),
+ njs_str("TypeError: cannot convert number argument to object") },
+
+ { njs_str("Object.getPrototypeOf('a')"),
+ njs_str("TypeError: cannot convert string argument to object") },
+
+ { njs_str("var p = {}; var o = Object.create(p);"
+ "p.isPrototypeOf(o)"),
+ njs_str("true") },
+
+ { njs_str("var pp = {}; var p = Object.create(pp);"
+ "var o = Object.create(p);"
+ "pp.isPrototypeOf(o)"),
+ njs_str("true") },
+
+ { njs_str("var p = {}; var o = Object.create(p);"
+ "o.isPrototypeOf(p)"),
+ njs_str("false") },
+
+ { njs_str("var p = {}; var o = Object.create(p);"
+ "o.isPrototypeOf()"),
+ njs_str("false") },
+
+ { njs_str("Object.valueOf.isPrototypeOf()"),
+ njs_str("false") },
+
+ { njs_str("var p = {}; var o = Object.create(p);"
+ "o.isPrototypeOf(1)"),
+ njs_str("false") },
+
+ { njs_str("var p = {}; var o = Object.create(p);"
+ "1..isPrototypeOf(p)"),
+ njs_str("false") },
+
+ { njs_str("Object.create(new String('asdf')).length"),
+ njs_str("4") },
+
+ { njs_str("Object.create(Object('123')).length"),
+ njs_str("3") },
+
+ { njs_str("Object.create([1,2]).length"),
+ njs_str("2") },
+
+ { njs_str("Object.create(function(a,b,c){}).length"),
+ njs_str("3") },
+
+ { njs_str("Object.create(Math).hasOwnProperty('abs')"),
+ njs_str("false") },
+
+ { njs_str("var m = Object.create(Math); m.abs = 3;"
+ "[m.hasOwnProperty('abs'), m.abs]"),
+ njs_str("true,3") },
+
+ { njs_str("var m = Object.create(Math); m.abs = Math.floor;"
+ "[m.hasOwnProperty('abs'), delete m.abs, m.abs(-1)]"),
+ njs_str("true,true,1") },
+
+ { njs_str("Object.getOwnPropertyDescriptor({a:1}, 'a').value"),
+ njs_str("1") },
+
+ { njs_str("Object.getOwnPropertyDescriptor({a:1}, 'a').configurable"),
+ njs_str("true") },
+
+ { njs_str("Object.getOwnPropertyDescriptor({a:1}, 'a').enumerable"),
+ njs_str("true") },
+
+ { njs_str("Object.getOwnPropertyDescriptor({a:1}, 'a').writable"),
+ njs_str("true") },
+
+ { njs_str("Object.getOwnPropertyDescriptor({a:1}, 'b')"),
+ njs_str("undefined") },
+
+ { njs_str("Object.getOwnPropertyDescriptor({}, 'a')"),
+ njs_str("undefined") },
+
+ { njs_str("Object.getOwnPropertyDescriptor(Object.create({a:1}), 'a')"),
+ njs_str("undefined") },
+
+ { njs_str("Object.getOwnPropertyDescriptor([3,4], '1').value"),
+ njs_str("4") },
+
+ { njs_str("Object.getOwnPropertyDescriptor([3,4], 1).value"),
+ njs_str("4") },
+
+ { njs_str("Object.getOwnPropertyDescriptor([], 'length').value"),
+ njs_str("0") },
+
+ { njs_str("Object.getOwnPropertyDescriptor([], '0')"),
+ njs_str("undefined") },
+
+ { njs_str("Object.getOwnPropertyDescriptor([1,2], '1').value"),
+ njs_str("2") },
+
+ { njs_str("Object.getOwnPropertyDescriptor([1,2], new String('1')).value"),
+ njs_str("2") },
+
+ { njs_str("Object.getOwnPropertyDescriptor({undefined:1}, void 0).value"),
+ njs_str("1") },
+
+ { njs_str("Object.getOwnPropertyDescriptor([1,2], 1).value"),
+ njs_str("2") },
+
+ { njs_str("Object.getOwnPropertyDescriptor([1,,,3], '1')"),
+ njs_str("undefined") },
+
+ { njs_str("Object.getOwnPropertyDescriptor([1,2], '3')"),
+ njs_str("undefined") },
+
+ { njs_str("JSON.stringify(Object.getOwnPropertyDescriptor([3,4], 'length'))"),
+ njs_str("{\"value\":2,\"writable\":true,\"enumerable\":false,\"configurable\":false}") },
+
+ { njs_str("Object.getOwnPropertyDescriptor(Array.of, 'length').value"),
+ njs_str("0") },
+
+ { njs_str("Object.getOwnPropertyDescriptor('αβγδ', '1').value"),
+ njs_str("β") },
+
+ { njs_str("Object.getOwnPropertyDescriptor(new String('αβγδ'), '1').value"),
+ njs_str("β") },
+
+ { njs_str("var s = new String('αβγδ'); s.a = 1;"
+ "Object.getOwnPropertyDescriptor(s, 'a').value"),
+ njs_str("1") },
+
+ { njs_str("JSON.stringify(Object.getOwnPropertyDescriptor('αβγδ', '2'))"),
+ njs_str("{\"value\":\"γ\",\"writable\":false,\"enumerable\":true,\"configurable\":false}") },
+
+ { njs_str("JSON.stringify(Object.getOwnPropertyDescriptor(new String('abc'), 'length'))"),
+ njs_str("{\"value\":3,\"writable\":false,\"enumerable\":false,\"configurable\":false}") },
+
+ { njs_str("Object.getOwnPropertyDescriptor(1, '0')"),
+ njs_str("undefined") },
+
+ { njs_str("'αβγδ'.propertyIsEnumerable('0')"),
+ njs_str("true") },
+
+ { njs_str("({a:1}).propertyIsEnumerable({toString:function () {return 'a';}})"),
+ njs_str("true") },
+
+ { njs_str("'αβγδ'.propertyIsEnumerable('a')"),
+ njs_str("false") },
+
+ { njs_str("'αβγδ'.propertyIsEnumerable('length')"),
+ njs_str("false") },
+
+ { njs_str("var min = Object.getOwnPropertyDescriptor(Math, 'min').value;"
+ "[min(1,2), min(2,1), min(-1,1)]"),
+ njs_str("1,1,-1") },
+
+ { njs_str("Object.getOwnPropertyDescriptor()"),
+ njs_str("TypeError: cannot convert undefined argument to object") },
+
+ { njs_str("Object.getOwnPropertyDescriptor(undefined)"),
+ njs_str("TypeError: cannot convert undefined argument to object") },
+
+ { njs_str("var o = {}; o[void 0] = 'a'; Object.getOwnPropertyDescriptor(o).value"),
+ njs_str("a") },
+
+ { njs_str("var o = {}; o[void 0] = 'a'; Object.getOwnPropertyDescriptor(o, undefined).value"),
+ njs_str("a") },
+
+ { njs_str("Object.getOwnPropertyDescriptors()"),
+ njs_str("TypeError: cannot convert undefined argument to object") },
+
+ { njs_str("typeof Object.getOwnPropertyDescriptors(1)"),
+ njs_str("object") },
+
+ { njs_str("Object.keys(Object.getOwnPropertyDescriptors([]))"),
+ njs_str("length") },
+
+ { njs_str("Object.getOwnPropertyDescriptors(function(a,b,c) {}).length.value"),
+ njs_str("3") },
+
+ { njs_str("Object.values(Object.getOwnPropertyDescriptors('abc'))"
+ ".reduce(function(a, x) { return a += x.value; }, '')"),
+ njs_str("abc3") },
+
+ { njs_str("Object.getOwnPropertyNames()"),
+ njs_str("TypeError: cannot convert undefined argument to object") },
+
+ { njs_str("Array.isArray(Object.getOwnPropertyNames({}))"),
+ njs_str("true") },
+
+ { njs_str("Object.getOwnPropertyNames({a:1, b:1, c:1})"),
+ njs_str("a,b,c") },
+
+ { njs_str("Object.getOwnPropertyNames(Object.defineProperty({a:1}, 'b', {}))"),
+ njs_str("a,b") },
+
+ { njs_str("Object.getOwnPropertyNames(Object.defineProperty([], 'b', {}))"),
+ njs_str("b,length") },
+
+ { njs_str("Object.getOwnPropertyNames(Object.defineProperty(new String(), 'b', {}))"),
+ njs_str("b,length") },
+
+ { njs_str("Object.getOwnPropertyNames([1,2,3])"),
+ njs_str("0,1,2,length") },
+
+ { njs_str("Object.getOwnPropertyNames('abc')"),
+ njs_str("0,1,2,length") },
+
+ { njs_str("Object.getOwnPropertyNames(function() {})"),
+ njs_str("length,prototype") },
+
+ { njs_str("Object.getOwnPropertyNames(Array)"),
+ njs_str("name,length,prototype,isArray,of") },
+
+ { njs_str("Object.getOwnPropertyNames(Array.isArray)"),
+ njs_str("name,length") },
+
+ { njs_str("Object.defineProperty(Object.freeze({}), 'b', {})"),
+ njs_str("TypeError: object is not extensible") },
+
+ { njs_str("Object.defineProperties(Object.freeze({}), {b:{}})"),
+ njs_str("TypeError: object is not extensible") },
+
+ { njs_str("Object.freeze()"),
+ njs_str("undefined") },
+
+ { njs_str("var o = Object.freeze({a:1}); o.a = 2"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of object") },
+
+ { njs_str("var o = Object.freeze({a:1}); delete o.a"),
+ njs_str("TypeError: Cannot delete property \"a\" of object") },
+
+ { njs_str("var o = Object.freeze({a:1}); o.b = 1; o.b"),
+ njs_str("TypeError: Cannot add property \"b\", object is not extensible") },
+
+ { njs_str("var o = Object.freeze(Object.create({a:1})); o.a = 2; o.a"),
+ njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+ { njs_str("var o = Object.freeze({a:{b:1}}); o.a.b = 2; o.a.b"),
+ njs_str("2") },
+
+ { njs_str("Object.defineProperty([1,2], 'a', {value:1}).a"),
+ njs_str("1") },
+
+ { njs_str("var a = Object.freeze([1,2]);"
+ "Object.defineProperty(a, 'a', {value:1}).a"),
+ njs_str("TypeError: object is not extensible") },
+
+ { njs_str("var a = [1,2]; a.a = 1; Object.freeze(a); delete a.a"),
+ njs_str("TypeError: Cannot delete property \"a\" of array") },
+
+ { njs_str("var a = [1,2]; a.a = 1; Object.freeze(a); a.a = 2"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of array") },
+
+ { njs_str("var a = Object.freeze([1,2]); a.a = 1"),
+ njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+ { njs_str("Object.defineProperty(function() {}, 'a', {value:1}).a"),
+ njs_str("1") },
+
+ { njs_str("var f = Object.freeze(function() {});"
+ "Object.defineProperty(f, 'a', {value:1}).a"),
+ njs_str("TypeError: object is not extensible") },
+
+ { njs_str("var f = function() {}; f.a = 1; Object.freeze(f); delete f.a"),
+ njs_str("TypeError: Cannot delete property \"a\" of function") },
+
+ { njs_str("var f = function() {}; f.a = 1; Object.freeze(f); f.a = 2"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of function") },
+
+ { njs_str("var f = Object.freeze(function() {}); f.a = 1"),
+ njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+ { njs_str("Object.defineProperty(new Date(''), 'a', {value:1}).a"),
+ njs_str("1") },
+
+ { njs_str("var d = Object.freeze(new Date(''));"
+ "Object.defineProperty(d, 'a', {value:1}).a"),
+ njs_str("TypeError: object is not extensible") },
+
+ { njs_str("var d = new Date(''); d.a = 1; Object.freeze(d);"
+ "delete d.a"),
+ njs_str("TypeError: Cannot delete property \"a\" of date") },
+
+ { njs_str("var d = new Date(''); d.a = 1; Object.freeze(d); d.a = 2"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of date") },
+
+ { njs_str("var d = Object.freeze(new Date('')); d.a = 1"),
+ njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+ { njs_str("Object.defineProperty(new RegExp(''), 'a', {value:1}).a"),
+ njs_str("1") },
+
+ { njs_str("var r = Object.freeze(new RegExp(''));"
+ "Object.defineProperty(r, 'a', {value:1}).a"),
+ njs_str("TypeError: object is not extensible") },
+
+ { njs_str("var r = new RegExp(''); r.a = 1; Object.freeze(r); delete r.a"),
+ njs_str("TypeError: Cannot delete property \"a\" of regexp") },
+
+ { njs_str("var r = new RegExp(''); r.a = 1; Object.freeze(r); r.a = 2"),
+ njs_str("TypeError: Cannot assign to read-only property \"a\" of regexp") },
+
+ { njs_str("var r = Object.freeze(new RegExp('')); r.a = 1"),
+ njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+ { njs_str("Object.isFrozen({a:1})"),
+ njs_str("false") },
+
+ { njs_str("Object.isFrozen([1,2])"),
+ njs_str("false") },
+
+ { njs_str("Object.isFrozen(function() {})"),
+ njs_str("false") },
+
+ { njs_str("Object.isFrozen(new Date(''))"),
+ njs_str("false") },
+
+ { njs_str("Object.isFrozen(new RegExp(''))"),
+ njs_str("false") },
+
+ { njs_str("Object.isFrozen()"),
+ njs_str("true") },
+
+ { njs_str("Object.isFrozen(1)"),
+ njs_str("true") },
+
+ { njs_str("Object.isFrozen('')"),
+ njs_str("true") },
+
+ { njs_str("Object.isFrozen(Object.defineProperties({}, {a:{value:1}}))"),
+ njs_str("false") },
+
+ { njs_str("var o = Object.defineProperties({}, {a:{}, b:{}});"
+ "o = Object.preventExtensions(o);"
+ "Object.isFrozen(o)"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.defineProperties({}, {a:{}, b:{writable:1}});"
+ "o = Object.preventExtensions(o);"
+ "Object.isFrozen(o)"),
+ njs_str("false") },
+
+ { njs_str("var o = Object.defineProperties({}, {a:{writable:1}});"
+ "o = Object.preventExtensions(o);"
+ "Object.isFrozen(o)"),
+ njs_str("false") },
+
+ { njs_str("var o = Object.defineProperties({}, {a:{configurable:1}});"
+ "o = Object.preventExtensions(o);"
+ "Object.isFrozen(o)"),
+ njs_str("false") },
+
+ { njs_str("var o = Object.preventExtensions({a:1});"
+ "Object.isFrozen(o)"),
+ njs_str("false") },
+
+ { njs_str("var o = Object.freeze({a:1}); Object.isFrozen(o)"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.seal({a:1}); o.a = 2; o.a"),
+ njs_str("2") },
+
+ { njs_str("var o = Object.seal({a:1}); delete o.a"),
+ njs_str("TypeError: Cannot delete property \"a\" of object") },
+
+ { njs_str("var o = Object.seal({a:1}); o.b = 1; o.b"),
+ njs_str("TypeError: Cannot add property \"b\", object is not extensible") },
+
+ { njs_str("var o = Object.seal(Object.create({a:1})); o.a = 2; o.a"),
+ njs_str("TypeError: Cannot add property \"a\", object is not extensible") },
+
+ { njs_str("var o = Object.seal({a:{b:1}}); o.a.b = 2; o.a.b"),
+ njs_str("2") },
+
+ { njs_str("Object.seal()"),
+ njs_str("undefined") },
+
+ { njs_str("Object.seal(1)"),
+ njs_str("1") },
+
+ { njs_str("Object.seal('')"),
+ njs_str("") },
+
+ { njs_str("Object.isSealed({a:1})"),
+ njs_str("false") },
+
+ { njs_str("Object.isSealed([1,2])"),
+ njs_str("false") },
+
+ { njs_str("Object.isSealed(function() {})"),
+ njs_str("false") },
+
+ { njs_str("Object.isSealed(new Date(''))"),
+ njs_str("false") },
+
+ { njs_str("Object.isSealed(new RegExp(''))"),
+ njs_str("false") },
+
+ { njs_str("Object.isSealed()"),
+ njs_str("true") },
+
+ { njs_str("Object.isSealed(1)"),
+ njs_str("true") },
+
+ { njs_str("Object.isSealed('')"),
+ njs_str("true") },
+
+ { njs_str("Object.isSealed(Object.defineProperties({}, {a:{value:1}}))"),
+ njs_str("false") },
+
+ { njs_str("var o = Object.defineProperties({}, {a:{}, b:{}});"
+ "o = Object.preventExtensions(o);"
+ "Object.isSealed(o)"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.defineProperties({}, {a:{}, b:{writable:1}});"
+ "o = Object.preventExtensions(o);"
+ "Object.isSealed(o)"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.defineProperties({}, {a:{writable:1}});"
+ "o = Object.preventExtensions(o);"
+ "Object.isSealed(o)"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.defineProperties({}, {a:{configurable:1}});"
+ "o = Object.preventExtensions(o);"
+ "Object.isSealed(o)"),
+ njs_str("false") },
+
+ { njs_str("var o = Object.preventExtensions({a:1});"
+ "Object.isFrozen(o)"),
+ njs_str("false") },
+
+ { njs_str("var o = Object.freeze({a:1}); Object.isFrozen(o)"),
+ njs_str("true") },
+
+ { njs_str("var o = Object.preventExtensions({a:1});"
+ "Object.defineProperty(o, 'b', {value:1})"),
+ njs_str("TypeError: object is not extensible") },
+
+ { njs_str("var o = Object.preventExtensions({a:1});"
+ "Object.defineProperties(o, {b:{value:1}})"),
+ njs_str("TypeError: object is not extensible") },
+
+ { njs_str("var o = Object.preventExtensions({a:1}); o.a = 2; o.a"),
+ njs_str("2") },
+
+ { njs_str("var o = Object.preventExtensions({a:1}); delete o.a; o.a"),
+ njs_str("undefined") },
+
+ { njs_str("var o = Object.preventExtensions({a:1}); o.b = 1; o.b"),
+ njs_str("TypeError: Cannot add property \"b\", object is not extensible") },
+
+ { njs_str("Object.preventExtensions()"),
+ njs_str("undefined") },
+
+ { njs_str("Object.preventExtensions(1)"),
+ njs_str("1") },
+
+ { njs_str("Object.preventExtensions('')"),
+ njs_str("") },
+
+ { njs_str("Object.isExtensible({})"),
+ njs_str("true") },
+
+ { njs_str("Object.isExtensible([])"),
+ njs_str("true") },
+
+ { njs_str("Object.isExtensible(function() {})"),
+ njs_str("true") },
+
+ { njs_str("Object.isExtensible(new Date(''))"),
+ njs_str("true") },
+
+ { njs_str("Object.isExtensible(new RegExp(''))"),
+ njs_str("true") },
+
+ { njs_str("Object.isExtensible()"),
+ njs_str("false") },
+
+ { njs_str("Object.isExtensible(1)"),
+ njs_str("false") },
+
+ { njs_str("Object.isExtensible('')"),
+ njs_str("false") },
+
+ { njs_str("Object.isExtensible(Object.preventExtensions({}))"),
+ njs_str("false") },
+
+ { njs_str("Object.isExtensible(Object.preventExtensions([]))"),
+ njs_str("false") },
+
+ { njs_str("Object.isExtensible(Object.freeze({}))"),
+ njs_str("false") },
+
+ { njs_str("Object.isExtensible(Object.freeze([]))"),
+ njs_str("false") },
+
+ { njs_str(
+ "var fail;"
+ "function isConfigurableMethods(o) {"
+ " var except = ["
+ " 'prototype',"
+ " ];"
+ " return Object.getOwnPropertyNames(o)"
+ " .filter(v => !except.includes(v)"
+ " && typeof o[v] == 'function')"
+ " .every(v => Object.getOwnPropertyDescriptor(o, v)"
+ " .configurable"
+ " || !(fail = `${o.name}.${v}`));"
+ "}"
+ "["
+ " Boolean, Boolean.prototype,"
+ " Number, Number.prototype,"
+ " String, String.prototype,"
+ " Object, Object.prototype,"
+ " Array, Array.prototype,"
+ " Function, Function.prototype,"
+ " RegExp, RegExp.prototype,"
+ " Date, Date.prototype,"
+ " Error, Error.prototype,"
+ " Math,"
+ " JSON,"
+ "].every(obj => isConfigurableMethods(obj)) || fail"),
+
+ njs_str("true") },
+
+ { njs_str(
+ "var fail;"
+ "function isWritableMethods(o) {"
+ " var except = ["
+ " 'prototype',"
+ " ];"
+ " return Object.getOwnPropertyNames(o)"
+ " .filter(v => !except.includes(v)"
+ " && typeof o[v] == 'function')"
+ " .every(v => Object.getOwnPropertyDescriptor(o, v)"
+ " .writable"
+ " || !(fail = `${o.name}.${v}`));"
+ "}"
+ "["
+ " Boolean, Boolean.prototype,"
+ " Number, Number.prototype,"
+ " String, String.prototype,"
+ " Object, Object.prototype,"
+ " Array, Array.prototype,"
+ " Function, Function.prototype,"
+ " RegExp, RegExp.prototype,"
+ " Date, Date.prototype,"
+ " Error, Error.prototype,"
+ " Math,"
+ " JSON,"
+ "].every(obj => isWritableMethods(obj)) || fail"),
+
+ njs_str("true") },
+
+ { njs_str("new Date(undefined)"),
+ njs_str("Invalid Date") },
+
+ { njs_str("new Date(Infinity)"),
+ njs_str("Invalid Date") },
+
+ { njs_str("new Date(NaN)"),
+ njs_str("Invalid Date") },
+
+ { njs_str("new Date(8.65e15)"),
+ njs_str("Invalid Date") },
+
+ { njs_str("new Date(0e0.o0)"),
+ njs_str("Invalid Date") },
+
+ { njs_str("(new Date(8.639e15)).getTime()"),
+ njs_str("8639000000000000") },
+
+ { njs_str("new Date(8.641e15)"),
+ njs_str("Invalid Date") },
+
+ { njs_str("(new Date(null)).getTime()"),
+ njs_str("0") },
+
+ { njs_str("(new Date(86400)).getTime()"),
+ njs_str("86400") },
+
+ { njs_str("var d = new Date(''); d +' '+ d.getTime()"),
+ njs_str("Invalid Date NaN") },
+
+ { njs_str("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
+ njs_str("Thu Jan 01 1970 00:00:00 GMT+0000") },
+
+ { njs_str("var d = new Date({valueOf:()=>86400000}); d = d + ''; d.slice(0, 33)"),
+ njs_str("Fri Jan 02 1970 00:00:00 GMT+0000") },
+
+ { njs_str("(new Date({toString:()=>'2011'})).getTime()"),
+ njs_str("1293840000000") },
+
+ { njs_str("(new Date({valueOf: ()=>86400, toString:()=>'2011'})).getTime()"),
+ njs_str("86400") },
+
+ { njs_str("var d = new Date(1308895200000); d.getTime()"),
+ njs_str("1308895200000") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getTime()"),
+ njs_str("1308941100000") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.valueOf()"),
+ njs_str("1308941100000") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45);"
+ "d.toString().slice(0, 33)"),
+ njs_str("Fri Jun 24 2011 18:45:00 GMT+0000") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.toDateString()"),
+ njs_str("Fri Jun 24 2011") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45);"
+ "d.toTimeString().slice(0, 17)"),
+ njs_str("18:45:00 GMT+0000") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.toUTCString()"),
+ njs_str("Fri Jun 24 2011 18:45:00 GMT") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+ "d.toISOString()"),
+ njs_str("2011-06-24T18:45:12.625Z") },
+
+#if 0
+ /* These tests fail on Solaris: gmtime_r() returns off by one day. */
+
+ { njs_str("var d = new Date(-62167219200000); d.toISOString()"),
+ njs_str("0000-01-01T00:00:00.000Z") },
+
+ { njs_str("var d = new Date(-62135596800000); d.toISOString()"),
+ njs_str("0001-01-01T00:00:00.000Z") },
+
+ { njs_str("var d = new Date(-62198755200000); d.toISOString()"),
+ njs_str("-000001-01-01T00:00:00.000Z") },
+#endif
+
+ { njs_str("Date.UTC(2011, 5, 24, 6, 0)"),
+ njs_str("1308895200000") },
+
+ { njs_str("Date.UTC({valueOf:()=>2011}, 5, 24, 6, 0)"),
+ njs_str("1308895200000") },
+
+ { njs_str("Date.parse()"),
+ njs_str("NaN") },
+
+ { njs_str("Date.parse('2011')"),
+ njs_str("1293840000000") },
+
+ { njs_str("Date.parse('+002011')"),
+ njs_str("1293840000000") },
+
+ { njs_str("Date.parse('2011-06')"),
+ njs_str("1306886400000") },
+
+ { njs_str("Date.parse('2011-06-24')"),
+ njs_str("1308873600000") },
+
+ { njs_str("Date.parse('2011-06-24T06')"),
+ njs_str("NaN") },
+
+ { njs_str("Date.parse('2011-06-24T06:')"),
+ njs_str("NaN") },
+
+ { njs_str("Date.parse('2011-06-24T06:01:')"),
+ njs_str("NaN") },
+
+ { njs_str("Date.parse('2011-06-24T06:01Z')"),
+ njs_str("1308895260000") },
+
+ { njs_str("Date.parse('2011-06-24T06:01:02:')"),
+ njs_str("NaN") },
+
+ { njs_str("Date.parse('2011-06-24T06:01:02Z')"),
+ njs_str("1308895262000") },
+
+ { njs_str("Date.parse('2011-06-24T06:01:02.Z')"),
+ njs_str("NaN") },
+
+ { njs_str("Date.parse('2011-06-24T06:01:02.6Z')"),
+ njs_str("1308895262600") },
+
+ { njs_str("Date.parse('2011-06-24T06:01:02.62Z')"),
+ njs_str("1308895262620") },
+
+ { njs_str("Date.parse('2011-06-24T06:01:02:625Z')"),
+ njs_str("NaN") },
+
+ { njs_str("Date.parse('2011-06-24T06:01:02.625Z')"),
+ njs_str("1308895262625") },
+
+ { njs_str("Date.parse('2011-06-24T06:01:02.6255555Z')"),
+ njs_str("1308895262625") },
+
+ { njs_str("Date.parse('2011-06-24T06:01:02.625555Z5')"),
+ njs_str("NaN") },
+
+ { njs_str("var d = new Date(); var str = d.toISOString();"
+ "var diff = Date.parse(str) - Date.parse(str.substring(0, str.length - 1));"
+ "d.getTimezoneOffset() == -diff/1000/60"),
+ njs_str("true") },
+
+ { njs_str("Date.parse('24 Jun 2011')"),
+ njs_str("1308873600000") },
+
+ { njs_str("Date.parse('Fri, 24 Jun 2011 18:48')"),
+ njs_str("1308941280000") },
+
+ { njs_str("Date.parse('Fri, 24 Jun 2011 18:48:02')"),
+ njs_str("1308941282000") },
+
+ { njs_str("Date.parse('Fri, 24 Jun 2011 18:48:02 GMT')"),
+ njs_str("1308941282000") },
+
+ { njs_str("Date.parse('Fri, 24 Jun 2011 18:48:02 +1245')"),
+ njs_str("1308895382000") },
+
+ { njs_str("Date.parse('Jun 24 2011')"),
+ njs_str("1308873600000") },
+
+ { njs_str("Date.parse('Fri Jun 24 2011 18:48')"),
+ njs_str("1308941280000") },
+
+ { njs_str("Date.parse('Fri Jun 24 2011 18:48:02')"),
+ njs_str("1308941282000") },
+
+ { njs_str("Date.parse('Fri Jun 24 2011 18:48:02 GMT+1245')"),
+ njs_str("1308895382000") },
+
+ /* Jan 1, 1. */
+ { njs_str("Date.parse('+000001-01-01T00:00:00.000Z')"),
+ njs_str("-62135596800000") },
+
+ /* Mar 2, 1 BCE. */
+ { njs_str("Date.parse('+000000-03-02T00:00:00.000Z')"),
+ njs_str("-62161948800000") },
+
+ /* Mar 1, 1 BCE. */
+ { njs_str("Date.parse('+000000-03-01T00:00:00.000Z')"),
+ njs_str("-62162035200000") },
+
+ /* Feb 29, 1 BCE. */
+ { njs_str("Date.parse('+000000-02-29T00:00:00.000Z')"),
+ njs_str("-62162121600000") },
+
+ /* Feb 28, 1 BCE. */
+ { njs_str("Date.parse('+000000-02-28T00:00:00.000Z')"),
+ njs_str("-62162208000000") },
+
+ /* Jan 1, 1 BCE. */
+ { njs_str("Date.parse('+000000-01-01T00:00:00.000Z')"),
+ njs_str("-62167219200000") },
+
+ /* Jan 1, 2 BCE. */
+ { njs_str("Date.parse('-000001-01-01T00:00:00.000Z')"),
+ njs_str("-62198755200000") },
+
+ { njs_str("var d = new Date(); d == Date.parse(d.toISOString())"),
+ njs_str("true") },
+
+ { njs_str("var s = Date(); s === Date(Date.parse(s))"),
+ njs_str("true") },
+
+ { njs_str("var n = Date.now(); n == new Date(n)"),
+ njs_str("true") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getFullYear()"),
+ njs_str("2011") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCFullYear()"),
+ njs_str("2011") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getMonth()"),
+ njs_str("5") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMonth()"),
+ njs_str("5") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getDate()"),
+ njs_str("24") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCDate()"),
+ njs_str("24") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getDay()"),
+ njs_str("5") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCDay()"),
+ njs_str("5") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getHours()"),
+ njs_str("18") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCHours()"),
+ njs_str("18") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getMinutes()"),
+ njs_str("45") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMinutes()"),
+ njs_str("45") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12);"
+ "d.getSeconds()"),
+ njs_str("12") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12);"
+ "d.getUTCSeconds()"),
+ njs_str("12") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+ "d.getMilliseconds()"),
+ njs_str("625") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+ "d.getUTCMilliseconds()"),
+ njs_str("625") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+ "d.getTimezoneOffset()"),
+ njs_str("0") },
+
+ { njs_str("var d = new Date(); d.setTime(1308895200000); d.getTime()"),
+ njs_str("1308895200000") },
+
+ { njs_str("var d = new Date(1308895201625); d.setMilliseconds(5003);"
+ "d.getTime()"),
+ njs_str("1308895206003") },
+
+ { njs_str("var d = new Date(1308895201625); d.setSeconds(2, 5003);"
+ "d.getTime()"),
+ njs_str("1308895207003") },
+
+ { njs_str("var d = new Date(1308895201625); d.setSeconds(2);"
+ "d.getTime()"),
+ njs_str("1308895202625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setMinutes(3, 2, 5003);"
+ "d.getTime()"),
+ njs_str("1308895387003") },
+
+ { njs_str("var d = new Date(1308895323625); d.setMinutes(3, 2);"
+ "d.getTime()"),
+ njs_str("1308895382625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setMinutes(3);"
+ "d.getTime()"),
+ njs_str("1308895383625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCMinutes(3, 2, 5003);"
+ "d.getTime()"),
+ njs_str("1308895387003") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCMinutes(3, 2);"
+ "d.getTime()"),
+ njs_str("1308895382625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCMinutes(3);"
+ "d.getTime()"),
+ njs_str("1308895383625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setHours(20, 3, 2, 5003);"
+ "d.getTime()"),
+ njs_str("1308945787003") },
+
+ { njs_str("var d = new Date(1308895323625); d.setHours(20, 3, 2);"
+ "d.getTime()"),
+ njs_str("1308945782625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setHours(20, 3);"
+ "d.getTime()"),
+ njs_str("1308945783625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setHours(20);"
+ "d.getTime()"),
+ njs_str("1308945723625") },
+
+ { njs_str("var d = new Date(1308895323625);"
+ "d.setUTCHours(20, 3, 2, 5003); d.getTime()"),
+ njs_str("1308945787003") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCHours(20, 3, 2);"
+ "d.getTime()"),
+ njs_str("1308945782625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCHours(20, 3);"
+ "d.getTime()"),
+ njs_str("1308945783625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCHours(20);"
+ "d.getTime()"),
+ njs_str("1308945723625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setDate(10);"
+ "d.getTime()"),
+ njs_str("1307685723625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCDate(10);"
+ "d.getTime()"),
+ njs_str("1307685723625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setMonth(2, 10);"
+ "d.getTime()"),
+ njs_str("1299736923625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCMonth(2, 10);"
+ "d.getTime()"),
+ njs_str("1299736923625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setMonth(2);"
+ "d.getTime()"),
+ njs_str("1300946523625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCMonth(2);"
+ "d.getTime()"),
+ njs_str("1300946523625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setFullYear(2010, 2, 10);"
+ "d.getTime()"),
+ njs_str("1268200923625") },
+
+ { njs_str("var d = new Date(1308895323625);"
+ "d.setUTCFullYear(2010, 2, 10); d.getTime()"),
+ njs_str("1268200923625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setFullYear(2010, 2);"
+ "d.getTime()"),
+ njs_str("1269410523625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCFullYear(2010, 2);"
+ "d.getTime()"),
+ njs_str("1269410523625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setFullYear(2010);"
+ "d.getTime()"),
+ njs_str("1277359323625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setUTCFullYear(2010);"
+ "d.getTime()"),
+ njs_str("1277359323625") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+ "d.toJSON(1)"),
+ njs_str("2011-06-24T18:45:12.625Z") },
+
+ { njs_str("var o = { toISOString: function() { return 'OK' } };"
+ "Date.prototype.toJSON.call(o, 1)"),
+ njs_str("OK") },
+
+ { njs_str("var d = new Date; d.__proto__"),
+ njs_str("Invalid Date") },
+
+ { njs_str("var d = new Date(); d.__proto__"),
+ njs_str("Invalid Date") },
+
+ { njs_str("var d = new Date(); d.__proto__ === Date.prototype"),
+ njs_str("true") },
+
+ { njs_str("new Date(NaN)"),
+ njs_str("Invalid Date") },
+
+ { njs_str("[0].map(new Date().getDate)"),
+ njs_str("TypeError: cannot convert undefined to date") },
+
+ { njs_str("new Date(eval)"),
+ njs_str("Invalid Date") },
+
+ { njs_str("Date.UTC(eval)"),
+ njs_str("NaN") },
+
+ { njs_str("Date.name"),
+ njs_str("Date") },
+
+ { njs_str("Date.length"),
+ njs_str("7") },
+
+ { njs_str("Date.__proto__ === Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("Date.prototype.constructor === Date"),
+ njs_str("true") },
+
+ { njs_str("Date.prototype.hasOwnProperty('constructor')"),
+ njs_str("true") },
+
+ { njs_str("Date.prototype.__proto__ === Object.prototype"),
+ njs_str("true") },
+
+ { njs_str("Date.prototype"),
+ njs_str("Invalid Date") },
+
+ { njs_str("Date.prototype.valueOf()"),
+ njs_str("NaN") },
+
+ { njs_str("Date.constructor === Function"),
+ njs_str("true") },
+
+ /* eval(). */
+
+ { njs_str("eval.name"),
+ njs_str("eval") },
+
+ { njs_str("eval.length"),
+ njs_str("1") },
+
+ { njs_str("eval.prototype"),
+ njs_str("undefined") },
+
+ { njs_str("eval.__proto__ === Function.prototype"),
+ njs_str("true") },
+
+ { njs_str("eval.constructor === Function"),
+ njs_str("true") },
+
+ { njs_str("eval()"),
+ njs_str("InternalError: Not implemented") },
+
+ /* Math. */
+
+ { njs_str("Math.PI"),
+ njs_str("3.141592653589793") },
+
+ { njs_str("Math.abs()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.abs(5)"),
+ njs_str("5") },
+
+ { njs_str("Math.abs(-5)"),
+ njs_str("5") },
+
+ { njs_str("Math.abs('5.0')"),
+ njs_str("5") },
+
+ { njs_str("Math.abs('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.acos()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.acos(NaN)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.acos('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.acos(1.1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.acos(-1.1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.acos('1')"),
+ njs_str("0") },
+
+ { njs_str("Math.acos(0) - Math.PI/2"),
+ njs_str("0") },
+
+ { njs_str("Math.acosh()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.acosh('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.acosh(0.9)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.acosh(1)"),
+ njs_str("0") },
+
+ { njs_str("Math.acosh('Infinity')"),
+ njs_str("Infinity") },
+
+ /*
+ * The difference is Number.EPSILON on Linux/i686
+ * and zero on other platforms.
+ */
+ { njs_str("Math.abs(Math.acosh((1/Math.E + Math.E)/2) - 1)"
+ " <= Number.EPSILON"),
+ njs_str("true") },
+
+ { njs_str("Math.asin()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.asin(NaN)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.asin('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.asin(1.1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.asin(-1.1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.asin(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.asin('-0')"),
+ njs_str("-0") },
+
+ { njs_str("Math.asin(1) - Math.PI/2"),
+ njs_str("0") },
+
+ { njs_str("Math.asinh()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.asinh('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.asinh(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.asinh('-0')"),
+ njs_str("-0") },
+
+ { njs_str("Math.asinh(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.asinh(-Infinity)"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.asinh((Math.E - 1/Math.E)/2)"),
+ njs_str("1") },
+
+ { njs_str("Math.atan()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.atan(NaN)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.atan('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.atan('Infinity') - Math.PI/2"),
+ njs_str("0") },
+
+ { njs_str("Math.atan(-Infinity) + Math.PI/2"),
+ njs_str("0") },
+
+ { njs_str("Math.atan(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.atan('-0')"),
+ njs_str("-0") },
+
+ { njs_str("Math.atan(1) - Math.PI/4"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.atan2(1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.atan2('abc', 1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.atan2(1, 0) - Math.PI/2"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2('1', -0) - Math.PI/2"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(0, '1')"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(0, 0)"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(0, -0) - Math.PI"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2('0', -1) - Math.PI"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(-0, '0.1')"),
+ njs_str("-0") },
+
+ { njs_str("Math.atan2(-0, 0)"),
+ njs_str("-0") },
+
+ { njs_str("Math.atan2(-0, -0) + Math.PI"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2('-0', '-1') + Math.PI"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(-0.1, 0) + Math.PI/2"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(-1, -0) + Math.PI/2"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(1, 'Infinity')"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(0.1, -Infinity) - Math.PI"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(-1, Infinity)"),
+ njs_str("-0") },
+
+ { njs_str("Math.atan2('-0.1', -Infinity) + Math.PI"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(Infinity, -5) - Math.PI/2"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(-Infinity, 5) + Math.PI/2"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2('Infinity', 'Infinity') - Math.PI/4"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(Infinity, -Infinity) - 3*Math.PI/4"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(-Infinity, 'Infinity') + Math.PI/4"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2('-Infinity', -Infinity) + 3*Math.PI/4"),
+ njs_str("0") },
+
+ { njs_str("Math.atan2(1, 1) - Math.atan2(-5, -5) - Math.PI"),
+ njs_str("0") },
+
+ { njs_str("Math.atanh()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.atanh('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.atanh(-1.1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.atanh(1.1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.atanh(1)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.atanh('-1')"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.atanh(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.atanh(-0)"),
+ njs_str("-0") },
+
+ /*
+ * The difference is Number.EPSILON on Linux/i686
+ * and zero on other platforms.
+ */
+ { njs_str("Math.abs(1 - Math.atanh((Math.E - 1)/(Math.E + 1)) * 2)"
+ " <= Number.EPSILON"),
+ njs_str("true") },
+
+ { njs_str("Math.cbrt()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.cbrt('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.cbrt(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.cbrt('-0')"),
+ njs_str("-0") },
+
+ { njs_str("Math.cbrt(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.cbrt(-Infinity)"),
+ njs_str("-Infinity") },
+
+ { njs_str("(Math.cbrt('27') - 3) < 1e-15"),
+ njs_str("true") },
+
+ { njs_str("Math.cbrt(-1)"),
+ njs_str("-1") },
+
+ { njs_str("Math.ceil()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.ceil('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.ceil(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.ceil('-0')"),
+ njs_str("-0") },
+
+ { njs_str("Math.ceil('Infinity')"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.ceil(-Infinity)"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.ceil(-0.9)"),
+ njs_str("-0") },
+
+ { njs_str("Math.ceil(3.1)"),
+ njs_str("4") },
+
+ { njs_str("Math.clz32()"),
+ njs_str("32") },
+
+ { njs_str("Math.clz32('abc')"),
+ njs_str("32") },
+
+ { njs_str("Math.clz32(NaN)"),
+ njs_str("32") },
+
+ { njs_str("Math.clz32(Infinity)"),
+ njs_str("32") },
+
+ { njs_str("Math.clz32('1')"),
+ njs_str("31") },
+
+ { njs_str("Math.clz32(0)"),
+ njs_str("32") },
+
+ { njs_str("Math.clz32('65535')"),
+ njs_str("16") },
+
+ { njs_str("Math.clz32(-1)"),
+ njs_str("0") },
+
+ { njs_str("Math.clz32(4294967298)"),
+ njs_str("30") },
+
+ { njs_str("Math.cos()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.cos('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.cos('0')"),
+ njs_str("1") },
+
+ { njs_str("Math.cos(-0)"),
+ njs_str("1") },
+
+ { njs_str("Math.cos(Infinity)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.cos(-Infinity)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.cos(Math.PI*2)"),
+ njs_str("1") },
+
+ { njs_str("Math.cosh()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.cosh('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.cosh('0')"),
+ njs_str("1") },
+
+ { njs_str("Math.cosh(-0)"),
+ njs_str("1") },
+
+ { njs_str("Math.cosh(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.cosh(-Infinity)"),
+ njs_str("Infinity") },
+
+ /*
+ * The difference is Number.EPSILON on FreeBSD
+ * and zero on other platforms.
+ */
+ { njs_str("Math.abs(Math.cosh(1) - (1/Math.E + Math.E)/2)"
+ " <= Number.EPSILON"),
+ njs_str("true") },
+
+ { njs_str("Math.exp()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.exp('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.exp('0')"),
+ njs_str("1") },
+
+ { njs_str("Math.exp(-0)"),
+ njs_str("1") },
+
+ { njs_str("Math.exp(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.exp(-Infinity)"),
+ njs_str("0") },
+
+ /*
+ * The difference is 2 * Number.EPSILON on FreeBSD
+ * and zero on other platforms.
+ */
+ { njs_str("Math.abs(Math.exp(1) - Math.E) <= 2 * Number.EPSILON"),
+ njs_str("true") },
+
+ { njs_str("Math.expm1()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.expm1('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.expm1('0')"),
+ njs_str("0") },
+
+ { njs_str("Math.expm1(-0)"),
+ njs_str("-0") },
+
+ { njs_str("Math.expm1(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.expm1(-Infinity)"),
+ njs_str("-1") },
+
+ /*
+ * The difference is 2 * Number.EPSILON on FreeBSD, Solaris,
+ * and MacOSX and zero on other platforms.
+ */
+ { njs_str("Math.abs(1 + Math.expm1(1) - Math.E) <= 2 * Number.EPSILON"),
+ njs_str("true") },
+
+ { njs_str("Math.floor()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.floor('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.floor(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.floor('-0')"),
+ njs_str("-0") },
+
+ { njs_str("Math.floor('Infinity')"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.floor(-Infinity)"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.floor(0.9)"),
+ njs_str("0") },
+
+ { njs_str("Math.floor(-3.1)"),
+ njs_str("-4") },
+
+ { njs_str("Math.fround()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.fround('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.fround(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.fround('-0')"),
+ njs_str("-0") },
+
+ { njs_str("Math.fround('Infinity')"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.fround(-Infinity)"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.fround('-1.5')"),
+ njs_str("-1.5") },
+
+ { njs_str("Math.fround(16777216)"),
+ njs_str("16777216") },
+
+ { njs_str("Math.fround(-16777217)"),
+ njs_str("-16777216") },
+
+ { njs_str("Math.hypot()"),
+ njs_str("0") },
+
+ { njs_str("Math.hypot(1, 2, 'abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.hypot(1, NaN, 3)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.hypot(1, NaN, -Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.hypot(-42)"),
+ njs_str("42") },
+
+ { njs_str("Math.hypot(8, -15)"),
+ njs_str("17") },
+
+ { njs_str("Math.hypot(3, -4, 12.0, '84', 132)"),
+ njs_str("157") },
+
+ { njs_str("Math.imul()"),
+ njs_str("0") },
+
+ { njs_str("Math.imul(1)"),
+ njs_str("0") },
+
+ { njs_str("Math.imul('a', 1)"),
+ njs_str("0") },
+
+ { njs_str("Math.imul(1, NaN)"),
+ njs_str("0") },
+
+ { njs_str("Math.imul(2, '3')"),
+ njs_str("6") },
+
+ { njs_str("Math.imul('3.9', -2.1)"),
+ njs_str("-6") },
+
+ { njs_str("Math.imul(2, 2147483647)"),
+ njs_str("-2") },
+
+ { njs_str("Math.imul(Number.MAX_SAFE_INTEGER, 2)"),
+ njs_str("-2") },
+
+ { njs_str("Math.imul(1, Number.MAX_SAFE_INTEGER + 1)"),
+ njs_str("0") },
+
+ { njs_str("Math.imul(2, Number.MIN_SAFE_INTEGER)"),
+ njs_str("2") },
+
+ { njs_str("Math.imul(Number.MIN_SAFE_INTEGER - 1, 1)"),
+ njs_str("0") },
+
+ { njs_str("Math.imul(2, 4294967297)"),
+ njs_str("2") },
+
+ { njs_str("Math.imul(-4294967297, 4294967297)"),
+ njs_str("-1") },
+
+ { njs_str("Math.imul(4294967297, -4294967298)"),
+ njs_str("-2") },
+
+ { njs_str("Math.imul(-4294967290, 4294967290)"),
+ njs_str("-36") },
+
+ { njs_str("Math.imul(-Infinity, 1)"),
+ njs_str("0") },
+
+ { njs_str("Math.imul(1, Infinity)"),
+ njs_str("0") },
+
+ { njs_str("Math.imul(Number.MAX_VALUE, 1)"),
+ njs_str("0") },
+
+ { njs_str("Math.imul(1, -Number.MAX_VALUE)"),
+ njs_str("0") },
+
+ { njs_str("Math.log()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log(-1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log(0)"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.log('-0')"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.log(1)"),
+ njs_str("0") },
+
+ { njs_str("Math.log(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.log(Math.E)"),
+ njs_str("1") },
+
+ { njs_str("Math.log10()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log10('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log10(-1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log10(0)"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.log10('-0')"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.log10(1)"),
+ njs_str("0") },
+
+ { njs_str("Math.log10(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.log10(1000)"),
+ njs_str("3") },
+
+ { njs_str("Math.log1p()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log1p('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log1p(-2)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log1p('-1')"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.log1p(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.log1p(-0)"),
+ njs_str("-0") },
+
+ { njs_str("Math.log1p(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.log1p(Math.E - 1)"),
+ njs_str("1") },
+
+ { njs_str("Math.log2()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log2('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log2(-1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.log2(0)"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.log2('-0')"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.log2(1)"),
+ njs_str("0") },
+
+ { njs_str("Math.log2(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.log2(128)"),
+ njs_str("7") },
+
+ { njs_str("Math.max()"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.max(null)"),
+ njs_str("0") },
+
+ { njs_str("Math.max(undefined)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.max('1', '2', '5')"),
+ njs_str("5") },
+
+ { njs_str("Math.max(5, {valueOf: function () {return 10}}, 6)"),
+ njs_str("10") },
+
+ { njs_str("Math.max(5, {valueOf: function () {return 10}}, 20)"),
+ njs_str("20") },
+
+ { njs_str("Math.max(5, undefined, 20)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.max(-10, null, -30)"),
+ njs_str("0") },
+
+ { njs_str("Math.min()"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.min(null)"),
+ njs_str("0") },
+
+ { njs_str("Math.min(undefined)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.min('1', '2', '5')"),
+ njs_str("1") },
+
+ { njs_str("Math.pow(2, 5)"),
+ njs_str("32") },
+
+ { njs_str("Math.pow(2)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.pow()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.pow(1, NaN)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.pow(3, NaN)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.pow('a', -0)"),
+ njs_str("1") },
+
+ { njs_str("Math.pow(1.1, Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.pow(-1.1, -Infinity)"),
+ njs_str("0") },
+
+ { njs_str("Math.pow(-1, Infinity)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.pow(1, -Infinity)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.pow(-0.9, Infinity)"),
+ njs_str("0") },
+
+ { njs_str("Math.pow(0.9, -Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.pow('Infinity', 0.1)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.pow(Infinity, '-0.1')"),
+ njs_str("0") },
+
+ { njs_str("Math.pow(-Infinity, 3)"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.pow('-Infinity', '3.1')"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.pow(-Infinity, '-3')"),
+ njs_str("-0") },
+
+ { njs_str("Math.pow('-Infinity', -2)"),
+ njs_str("0") },
+
+ { njs_str("Math.pow('0', 0.1)"),
+ njs_str("0") },
+
+#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
+ { njs_str("Math.pow(0, '-0.1')"),
+ njs_str("Infinity") },
+#endif
+
+ { njs_str("Math.pow(-0, 3)"),
+ njs_str("-0") },
+
+ { njs_str("Math.pow('-0', '3.1')"),
+ njs_str("0") },
+
+ { njs_str("Math.pow(-0, '-3')"),
+ njs_str("-Infinity") },
+
+#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
+ { njs_str("Math.pow('-0', -2)"),
+ njs_str("Infinity") },
+#endif
+
+ { njs_str("Math.pow(-3, 0.1)"),
+ njs_str("NaN") },
+
+#if (!NJS_HAVE_MEMORY_SANITIZER) /* intentional use of uninitialized stack */
+ { njs_str("var a = Math.random(); a >= 0 && a < 1"),
+ njs_str("true") },
+#endif
+
+ { njs_str("Math.round()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.round('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.round(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.round('-0')"),
+ njs_str("-0") },
+
+ { njs_str("Math.round('Infinity')"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.round(-Infinity)"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.round(0.4)"),
+ njs_str("0") },
+
+ { njs_str("Math.round('0.5')"),
+ njs_str("1") },
+
+ { njs_str("Math.round('-0.4')"),
+ njs_str("-0") },
+
+ { njs_str("Math.round(-0.5)"),
+ njs_str("-1") },
+
+ { njs_str("Math.sign(5)"),
+ njs_str("1") },
+
+ { njs_str("Math.sign(-5)"),
+ njs_str("-1") },
+
+ { njs_str("Math.sign(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.sign(-0.0)"),
+ njs_str("-0") },
+
+ { njs_str("Math.sign(NaN)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sign()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sin()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sin('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sin('0')"),
+ njs_str("0") },
+
+ { njs_str("Math.sin(-0)"),
+ njs_str("-0") },
+
+ { njs_str("Math.sin(Infinity)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sin(-Infinity)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sin(-Math.PI/2)"),
+ njs_str("-1") },
+
+ { njs_str("Math.sinh()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sinh('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sinh('0')"),
+ njs_str("0") },
+
+ { njs_str("Math.sinh(-0)"),
+ njs_str("-0") },
+
+ { njs_str("Math.sinh(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.sinh(-Infinity)"),
+ njs_str("-Infinity") },
+
+ /*
+ * The difference is Number.EPSILON on Solaris
+ * and zero on other platforms.
+ */
+ { njs_str("Math.abs(Math.sinh(1) - (Math.E - 1/Math.E)/2)"
+ " <= Number.EPSILON"),
+ njs_str("true") },
+
+ { njs_str("Math.sqrt()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sqrt('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sqrt('0')"),
+ njs_str("0") },
+
+ { njs_str("Math.sqrt(-0)"),
+ njs_str("-0") },
+
+ { njs_str("Math.sqrt(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.sqrt(-0.1)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.sqrt('9.0')"),
+ njs_str("3") },
+
+ { njs_str("Math.tan()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.tan('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.tan('0')"),
+ njs_str("0") },
+
+ { njs_str("Math.tan(-0)"),
+ njs_str("-0") },
+
+ { njs_str("Math.tan(Infinity)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.tan(-Infinity)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.tan(Math.PI/3) + Math.tan(-Math.PI/3)"),
+ njs_str("0") },
+
+ { njs_str("Math.tanh()"),
+ njs_str("NaN") },
+
+ { njs_str("Math.tanh('abc')"),
+ njs_str("NaN") },
+
+ { njs_str("Math.tanh('0')"),
+ njs_str("0") },
+
+ { njs_str("Math.tanh(-0)"),
+ njs_str("-0") },
+
+ { njs_str("Math.tanh(Infinity)"),
+ njs_str("1") },
+
+ { njs_str("Math.tanh(-Infinity)"),
+ njs_str("-1") },
+
+ { njs_str("Math.tanh(0.5) - (Math.E - 1)/(Math.E + 1)"),
+ njs_str("0") },
+
+ { njs_str("Math.trunc(3.9)"),
+ njs_str("3") },
+
+ { njs_str("Math.trunc(-3.9)"),
+ njs_str("-3") },
+
+ { njs_str("Math.trunc(0)"),
+ njs_str("0") },
+
+ { njs_str("Math.trunc(-0)"),
+ njs_str("-0") },
+
+ { njs_str("Math.trunc(0.9)"),
+ njs_str("0") },
+
+ { njs_str("Math.trunc(-0.9)"),
+ njs_str("-0") },
+
+ { njs_str("Math.trunc(Infinity)"),
+ njs_str("Infinity") },
+
+ { njs_str("Math.trunc(-Infinity)"),
+ njs_str("-Infinity") },
+
+ { njs_str("Math.trunc(NaN)"),
+ njs_str("NaN") },
+
+ { njs_str("Math.trunc()"),
+ njs_str("NaN") },
+
+ /* ES5FIX: "[object Math]". */
+
+ { njs_str("Math"),
+ njs_str("[object Object]") },
+
+ { njs_str("Math.x = function (x) {return 2*x;}; Math.x(3)"),
+ njs_str("6") },
+
+ { njs_str("isNaN"),
+ njs_str("[object Function]") },
+
+ { njs_str("isNaN.name"),
+ njs_str("isNaN") },
+
+ { njs_str("isNaN.length"),
+ njs_str("1") },
+
+ { njs_str("isNaN()"),
+ njs_str("true") },
+
+ { njs_str("isNaN(123)"),
+ njs_str("false") },
+
+ { njs_str("isNaN('123')"),
+ njs_str("false") },
+
+ { njs_str("isNaN('Infinity')"),
+ njs_str("false") },
+
+ { njs_str("isNaN('abc')"),
+ njs_str("true") },
+
+ { njs_str("isFinite"),
+ njs_str("[object Function]") },
+
+ { njs_str("isFinite.name"),
+ njs_str("isFinite") },
+
+ { njs_str("isFinite.length"),
+ njs_str("1") },
+
+ { njs_str("isFinite()"),
+ njs_str("false") },
+
+ { njs_str("isFinite(123)"),
+ njs_str("true") },
+
+ { njs_str("isFinite('123')"),
+ njs_str("true") },
+
+ { njs_str("isFinite('Infinity')"),
+ njs_str("false") },
+
+ { njs_str("isFinite('abc')"),
+ njs_str("false") },
+
+ { njs_str("parseInt.name"),
+ njs_str("parseInt") },
+
+ { njs_str("parseInt.length"),
+ njs_str("2") },
+
+ { njs_str("parseInt('12345abc')"),
+ njs_str("12345") },
+
+ { njs_str("parseInt('123', 0)"),
+ njs_str("123") },
+
+ { njs_str("parseInt('0XaBc', 0)"),
+ njs_str("2748") },
+
+ { njs_str("parseInt(' 123')"),
+ njs_str("123") },
+
+ { njs_str("parseInt('1010', 2)"),
+ njs_str("10") },
+
+ { njs_str("parseInt('aBc', 16)"),
+ njs_str("2748") },
+
+ { njs_str("parseInt('0XaBc')"),
+ njs_str("2748") },
+
+ { njs_str("parseInt('-0xabc')"),
+ njs_str("-2748") },
+
+ { njs_str("parseInt('njscript', 36)"),
+ njs_str("1845449130881") },
+
+ { njs_str("parseInt('0x')"),
+ njs_str("NaN") },
+
+ { njs_str("parseInt('z')"),
+ njs_str("NaN") },
+
+ { njs_str("parseInt('0xz')"),
+ njs_str("NaN") },
+
+ { njs_str("parseInt('0x', 16)"),
+ njs_str("NaN") },
+
+ { njs_str("parseInt('0x', 33)"),
+ njs_str("0") },
+
+ { njs_str("parseInt('0x', 34)"),
+ njs_str("33") },
+
+ { njs_str("parseInt('0', 1)"),
+ njs_str("NaN") },
+
+ { njs_str("parseInt('0', 37)"),
+ njs_str("NaN") },
+
+ { njs_str("1/parseInt('-0')"),
+ njs_str("-Infinity") },
+
+ { njs_str("parseFloat.name"),
+ njs_str("parseFloat") },
+
+ { njs_str("parseFloat.length"),
+ njs_str("1") },
+
+ { njs_str("parseFloat('12345abc')"),
+ njs_str("12345") },
+
+ { njs_str("parseFloat('0x')"),
+ njs_str("0") },
+
+ { njs_str("parseFloat('0xff')"),
+ njs_str("0") },
+
+ { njs_str("parseFloat('Infinity')"),
+ njs_str("Infinity") },
+
+ { njs_str("parseFloat(' Infinityzz')"),
+ njs_str("Infinity") },
+
+ { njs_str("parseFloat('Infinit')"),
+ njs_str("NaN") },
+
+ { njs_str("parseFloat('5.7e1')"),
+ njs_str("57") },
+
+ { njs_str("parseFloat('-5.7e-1')"),
+ njs_str("-0.57") },
+
+ { njs_str("parseFloat('-5.e-1')"),
+ njs_str("-0.5") },
+
+ { njs_str("parseFloat('5.7e+01')"),
+ njs_str("57") },
+
+ { njs_str("parseFloat(' 5.7e+01abc')"),
+ njs_str("57") },
+
+ { njs_str("parseFloat('-5.7e-1abc')"),
+ njs_str("-0.57") },
+
+ { njs_str("parseFloat('-5.7e')"),
+ njs_str("-5.7") },
+
+ { njs_str("parseFloat('-5.7e+')"),
+ njs_str("-5.7") },
+
+ { njs_str("parseFloat('-5.7e+abc')"),
+ njs_str("-5.7") },
+
+ /* JSON.parse() */
+
+ { njs_str("JSON.parse('null')"),
+ njs_str("null") },
+
+ { njs_str("JSON.parse('true')"),
+ njs_str("true") },
+
+ { njs_str("JSON.parse('false')"),
+ njs_str("false") },
+
+ { njs_str("JSON.parse('0')"),
+ njs_str("0") },
+
+ { njs_str("JSON.parse('-1234.56e2')"),
+ njs_str("-123456") },
+
+ { njs_str("typeof(JSON.parse('true'))"),
+ njs_str("boolean") },
+
+ { njs_str("typeof(JSON.parse('false'))"),
+ njs_str("boolean") },
+
+ { njs_str("typeof(JSON.parse('1'))"),
+ njs_str("number") },
+
+ { njs_str("typeof(JSON.parse('\"\"'))"),
+ njs_str("string") },
+
+ { njs_str("typeof(JSON.parse('{}'))"),
+ njs_str("object") },
+
+ { njs_str("typeof(JSON.parse('[]'))"),
+ njs_str("object") },
+
+ { njs_str("JSON.parse('\"abc\"')"),
+ njs_str("abc") },
+
+ { njs_str("JSON.parse('\"\\\\\"\"')"),
+ njs_str("\"") },
+
+ { njs_str("JSON.parse('\"\\\\n\"')"),
+ njs_str("\n") },
+
+ { njs_str("JSON.parse('\"\\\\t\"')"),
+ njs_str("\t") },
+
+ { njs_str("JSON.parse('\"ab\\\\\"c\"')"),
+ njs_str("ab\"c") },
+
+ { njs_str("JSON.parse('\"abcdefghijklmopqr\\\\\"s\"')"),
+ njs_str("abcdefghijklmopqr\"s") },
+
+ { njs_str("JSON.parse('\"ab\\\\\"c\"').length"),
+ njs_str("4") },
+
+ { njs_str("JSON.parse('\"аб\\\\\"в\"')"),
+ njs_str("аб\"в") },
+
+ { njs_str("JSON.parse('\"аб\\\\\"в\"').length"),
+ njs_str("4") },
+
+ { njs_str("JSON.parse('\"абвгдеёжзийкл\"').length"),
+ njs_str("13") },
+
+ { njs_str("JSON.parse('[\"' + 'α'.repeat(33) + '\"]')[0][32]"),
+ njs_str("α") },
+
+ { njs_str("JSON.parse('\"\\\\u03B1\"')"),
+ njs_str("α") },
+
+ { njs_str("JSON.parse('\"\\\\uD801\\\\uDC00\"')"),
+ njs_str("𐐀") },
+
+ { njs_str("JSON.parse('\"\\\\u03B1\"') == JSON.parse('\"\\\\u03b1\"')"),
+ njs_str("true") },
+
+ { njs_str("JSON.parse('\"\\\\u03B1\"').length"),
+ njs_str("1") },
+
+ { njs_str("JSON.parse('{\"a\":1}').a"),
+ njs_str("1") },
+
+ { njs_str("JSON.parse('{\"a\":1,\"a\":2}').a"),
+ njs_str("2") },
+
+ { njs_str("JSON.parse('{ \"a\" : \"b\" }').a"),
+ njs_str("b") },
+
+ { njs_str("JSON.parse('{\"a\":{\"b\":1}}').a.b"),
+ njs_str("1") },
+
+ { njs_str("JSON.parse('[{}, true ,1.1e2, {\"a\":[3,\"b\"]}]')[3].a[1]"),
+ njs_str("b") },
+
+ { njs_str("var o = JSON.parse('{\"a\":2}');"
+ "Object.getOwnPropertyDescriptor(o, 'a').configurable"),
+ njs_str("true") },
+
+ { njs_str("var o = JSON.parse('{\"a\":2}');"
+ "Object.getOwnPropertyDescriptor(o, 'a').writable"),
+ njs_str("true") },
+
+ { njs_str("var o = JSON.parse('{\"a\":2}');"
+ "Object.getOwnPropertyDescriptor(o, 'a').enumerable"),
+ njs_str("true") },
+
+ { njs_str("var o = JSON.parse('{\"a\":2}');"
+ "o.a = 3; o.a"),
+ njs_str("3") },
+
+ { njs_str("var o = JSON.parse('{\"a\":2}');"
+ "o.b = 3; o.b"),
+ njs_str("3") },
+
+ { njs_str("JSON.parse('2') || 10"),
+ njs_str("2") },
+
+ { njs_str("JSON.parse('0') || 10"),
+ njs_str("10") },
+
+ { njs_str("JSON.parse('-0') || 10"),
+ njs_str("10") },
+
+ { njs_str("JSON.parse('\"a\"') || 10"),
+ njs_str("a") },
+
+ { njs_str("JSON.parse('\"\"') || 10"),
+ njs_str("10") },
+
+ { njs_str("JSON.parse('true') || 10"),
+ njs_str("true") },
+
+ { njs_str("JSON.parse('false') || 10"),
+ njs_str("10") },
+
+ { njs_str("JSON.parse('null') || 10"),
+ njs_str("10") },
+
+ { njs_str("var o = JSON.parse('{}', function(k, v) {return v;}); o"),
+ njs_str("[object Object]") },
+
+ { njs_str("var o = JSON.parse('{\"a\":2, \"b\":4, \"a\":{}}',"
+ " function(k, v) {return undefined;});"
+ "o"),
+ njs_str("undefined") },
+
+ { njs_str("var o = JSON.parse('{\"a\":2, \"c\":4, \"b\":\"x\"}',"
+ " function(k, v) {if (k === '' || typeof v === 'number') return v });"
+ "Object.keys(o)"),
+ njs_str("a,c") },
+
+ { njs_str("var o = JSON.parse('{\"a\":2, \"b\":{}}',"
+ " function(k, v) {return k;});"
+ "o+typeof(o)"),
+ njs_str("string") },
+
+ { njs_str("var o = JSON.parse('[\"a\", \"b\"]',"
+ " function(k, v) {return v;});"
+ "o"),
+ njs_str("a,b") },
+
+ { njs_str("var o = JSON.parse('{\"a\":[1,{\"b\":1},3]}',"
+ " function(k, v) {return v;});"
+ "o.a[1].b"),
+ njs_str("1") },
+
+ { njs_str("var o = JSON.parse('{\"a\":[1,2]}',"
+ " function(k, v) {if (k === '' || k === 'a') {return v;}});"
+ "o.a"),
+ njs_str(",") },
+
+ { njs_str("var o = JSON.parse('{\"a\":[1,2]}',"
+ " function(k, v) {return (k === '' || k === 'a') ? v : v*2});"
+ "o.a"),
+ njs_str("2,4") },
+
+ { njs_str("var o = JSON.parse('{\"a\":2, \"b\":{\"c\":[\"xx\"]}}',"
+ " function(k, v) {return typeof v === 'number' ? v * 2 : v;});"
+ "o.a+o.b.c[0]"),
+ njs_str("4xx") },
+
+ { njs_str("var o = JSON.parse('{\"aa\":{\"b\":1}, \"abb\":1, \"c\":1}',"
+ " function(k, v) {return (k === '' || /^a/.test(k)) ? v : undefined;});"
+ "Object.keys(o)"),
+ njs_str("aa,abb") },
+
+ { njs_str("var o = JSON.parse('{\"a\":\"x\"}',"
+ " function(k, v) {if (k === 'a') {this.b='y';} return v});"
+ "o.a+o.b"),
+ njs_str("xy") },
+
+ { njs_str("var o = JSON.parse('{\"a\":\"x\"}',"
+ " function(k, v) {return (k === 'a' ? {x:1} : v)});"
+ "o.a.x"),
+ njs_str("1") },
+
+ { njs_str("var keys = []; var o = JSON.parse('{\"a\":2, \"b\":{\"c\":\"xx\"}}',"
+ " function(k, v) {keys.push(k); return v;});"
+ "keys"),
+ njs_str("a,c,b,") },
+
+ { njs_str("var args = []; var o = JSON.parse('[2,{\"a\":3}]',"
+ " function(k, v) {args.push(k+\":\"+v); return v;});"
+ "args.join('|')"),
+ njs_str("0:2|a:3|1:[object Object]|:2,[object Object]") },
+
+ { njs_str("JSON.parse()"),
+ njs_str("SyntaxError: Unexpected token at position 0") },
+
+ { njs_str("JSON.parse([])"),
+ njs_str("SyntaxError: Unexpected end of input at position 0") },
+
+ { njs_str("JSON.parse('')"),
+ njs_str("SyntaxError: Unexpected end of input at position 0") },
+
+ { njs_str("JSON.parse('fals')"),
+ njs_str("SyntaxError: Unexpected token at position 0") },
+
+ { njs_str("JSON.parse(' t')"),
+ njs_str("SyntaxError: Unexpected token at position 1") },
+
+ { njs_str("JSON.parse('nu')"),
+ njs_str("SyntaxError: Unexpected token at position 0") },
+
+ { njs_str("JSON.parse('-')"),
+ njs_str("SyntaxError: Unexpected number at position 0") },
+
+ { njs_str("JSON.parse('--')"),
+ njs_str("SyntaxError: Unexpected number at position 1") },
+
+ { njs_str("JSON.parse('1-')"),
+ njs_str("SyntaxError: Unexpected token at position 1") },
+
+ { njs_str("JSON.parse('1ee1')"),
+ njs_str("SyntaxError: Unexpected token at position 1") },
+
+ { njs_str("JSON.parse('1eg')"),
+ njs_str("SyntaxError: Unexpected token at position 1") },
+
+ { njs_str("JSON.parse('0x01')"),
+ njs_str("SyntaxError: Unexpected token at position 1") },
+
+ { njs_str("JSON.parse('\"абв')"),
+ njs_str("SyntaxError: Unexpected end of input at position 4") },
+
+ { njs_str("JSON.parse('\"\b')"),
+ njs_str("SyntaxError: Forbidden source char at position 1") },
+
+ { njs_str("JSON.parse('\"\\\\u')"),
+ njs_str("SyntaxError: Unexpected end of input at position 3") },
+
+ { njs_str("JSON.parse('\"\\\\q\"')"),
+ njs_str("SyntaxError: Unknown escape char at position 2") },
+
+ { njs_str("JSON.parse('\"\\\\uDC01\"')"),
+ njs_str("�") },
+
+ { njs_str("JSON.parse('\"\\\\uD801\\\\uE000\"')"),
+ njs_str("�") },
+
+ { njs_str("JSON.parse('\"\\\\uD83D\"')"),
+ njs_str("�") },
+
+ { njs_str("JSON.parse('\"\\\\uD800\\\\uDB00\"')"),
+ njs_str("��") },
+
+ { njs_str("JSON.parse('\"\\\\ud800[\"')"),
+ njs_str("�[") },
+
+ { njs_str("JSON.parse('{')"),
+ njs_str("SyntaxError: Unexpected end of input at position 1") },
+
+ { njs_str("JSON.parse('{{')"),
+ njs_str("SyntaxError: Unexpected token at position 1") },
+
+ { njs_str("JSON.parse('{[')"),
+ njs_str("SyntaxError: Unexpected token at position 1") },
+
+ { njs_str("JSON.parse('{\"a\"')"),
+ njs_str("SyntaxError: Unexpected token at position 4") },
+
+ { njs_str("JSON.parse('{\"a\":')"),
+ njs_str("SyntaxError: Unexpected end of input at position 5") },
+
+ { njs_str("JSON.parse('{\"a\":{')"),
+ njs_str("SyntaxError: Unexpected end of input at position 6") },
+
+ { njs_str("JSON.parse('{\"a\":{}')"),
+ njs_str("SyntaxError: Unexpected end of input at position 7") },
+
+ { njs_str("JSON.parse('{\"a\":{}g')"),
+ njs_str("SyntaxError: Unexpected token at position 7") },
+
+ { njs_str("JSON.parse('{\"a\":{},')"),
+ njs_str("SyntaxError: Unexpected end of input at position 8") },
+
+ { njs_str("JSON.parse('{\"a\":{},}')"),
+ njs_str("SyntaxError: Trailing comma at position 7") },
+
+ { njs_str("JSON.parse('{\"a\":{},,')"),
+ njs_str("SyntaxError: Unexpected token at position 8") },
+
+ { njs_str("JSON.parse('{\"a\":{},,}')"),
+ njs_str("SyntaxError: Unexpected token at position 8") },
+
+ { njs_str("JSON.parse('[')"),
+ njs_str("SyntaxError: Unexpected end of input at position 1") },
+
+ { njs_str("JSON.parse('[q')"),
+ njs_str("SyntaxError: Unexpected token at position 1") },
+
+ { njs_str("JSON.parse('[\"a')"),
+ njs_str("SyntaxError: Unexpected end of input at position 3") },
+
+ { njs_str("JSON.parse('[1 ')"),
+ njs_str("SyntaxError: Unexpected end of input at position 3") },
+
+ { njs_str("JSON.parse('[1,]')"),
+ njs_str("SyntaxError: Trailing comma at position 2") },
+
+ { njs_str("JSON.parse('[1 , 5 ')"),
+ njs_str("SyntaxError: Unexpected end of input at position 7") },
+
+ { njs_str("JSON.parse('{\"a\":'.repeat(32))"),
+ njs_str("SyntaxError: Nested too deep at position 155") },
+
+ { njs_str("JSON.parse('['.repeat(32))"),
+ njs_str("SyntaxError: Nested too deep at position 31") },
+
+ { njs_str("var o = JSON.parse('{', function(k, v) {return v;});o"),
+ njs_str("SyntaxError: Unexpected end of input at position 1") },
+
+ { njs_str("var o = JSON.parse('{\"a\":1}', "
+ " function(k, v) {return v.a.a;}); o"),
+ njs_str("TypeError: cannot get property \"a\" of undefined") },
+
+ /* JSON.stringify() */
+
+ { njs_str("JSON.stringify()"),
+ njs_str("undefined") },
+
+ { njs_str("JSON.stringify('')"),
+ njs_str("\"\"") },
+
+ { njs_str("JSON.stringify('abc')"),
+ njs_str("\"abc\"") },
+
+ { njs_str("JSON.stringify(new String('abc'))"),
+ njs_str("\"abc\"") },
+
+ { njs_str("JSON.stringify(123)"),
+ njs_str("123") },
+
+ { njs_str("JSON.stringify(-0)"),
+ njs_str("0") },
+
+ { njs_str("JSON.stringify(0.00000123)"),
+ njs_str("0.00000123") },
+
+ { njs_str("JSON.stringify(new Number(123))"),
+ njs_str("123") },
+
+ { njs_str("JSON.stringify(true)"),
+ njs_str("true") },
+
+ { njs_str("JSON.stringify(false)"),
+ njs_str("false") },
+
+ { njs_str("JSON.stringify(new Boolean(1))"),
+ njs_str("true") },
+
+ { njs_str("JSON.stringify(new Boolean(0))"),
+ njs_str("false") },
+
+ { njs_str("JSON.stringify(null)"),
+ njs_str("null") },
+
+ { njs_str("JSON.stringify(undefined)"),
+ njs_str("undefined") },
+
+ { njs_str("JSON.stringify({})"),
+ njs_str("{}") },
+
+ { njs_str("JSON.stringify([])"),
+ njs_str("[]") },
+
+ { njs_str("var a = [1]; a[2] = 'x'; JSON.stringify(a)"),
+ njs_str("[1,null,\"x\"]") },
+
+ { njs_str("JSON.stringify({a:\"b\",c:19,e:null,t:true,f:false})"),
+ njs_str("{\"a\":\"b\",\"c\":19,\"e\":null,\"t\":true,\"f\":false}") },
+
+ { njs_str("JSON.stringify({a:1, b:undefined})"),
+ njs_str("{\"a\":1}") },
+
+ { njs_str("var o = {a:1, c:2};"
+ "Object.defineProperty(o, 'b', {enumerable:false, value:3});"
+ "JSON.stringify(o)"),
+ njs_str("{\"a\":1,\"c\":2}") },
+
+ { njs_str("JSON.stringify({a:{}, b:[function(v){}]})"),
+ njs_str("{\"a\":{},\"b\":[null]}") },
+
+ { njs_str("JSON.stringify(RegExp())"),
+ njs_str("{}") },
+
+ { njs_str("JSON.stringify(SyntaxError('e'))"),
+ njs_str("{}") },
+
+ { njs_str("JSON.stringify(URIError('e'))"),
+ njs_str("{}") },
+
+ { njs_str("var e = URIError('e'); e.name = 'E'; JSON.stringify(e)"),
+ njs_str("{\"name\":\"E\"}") },
+
+ { njs_str("var e = URIError('e'); e.message = 'E'; JSON.stringify(e)"),
+ njs_str("{}") },
+
+ { njs_str("var e = URIError('e'); e.foo = 'E'; JSON.stringify(e)"),
+ njs_str("{\"foo\":\"E\"}") },
+
+ { njs_str("JSON.stringify([$r])"),
+ njs_str("[null]") },
+
+ /* Ignoring named properties of an array. */
+
+ { njs_str("var a = [1,2]; a.a = 1;"
+ "JSON.stringify(a)"),
+ njs_str("[1,2]") },
+
+ { njs_str("JSON.stringify({a:{b:{c:{d:1}, e:function(v){}}}})"),
+ njs_str("{\"a\":{\"b\":{\"c\":{\"d\":1}}}}") },
+
+ { njs_str("JSON.stringify([[\"b\",undefined],1,[5],{a:1}])"),
+ njs_str("[[\"b\",null],1,[5],{\"a\":1}]") },
+
+ { njs_str("var json = '{\"a\":{\"b\":{\"c\":{\"d\":1},\"e\":[true]}}}';"
+ "json == JSON.stringify(JSON.parse(json))"),
+ njs_str("true") },
+
+ { njs_str("var json = '{\"a\":\"абв\",\"b\":\"α\"}';"
+ "json == JSON.stringify(JSON.parse(json))"),
+ njs_str("true") },
+
+ /* Multibyte characters: z - 1 byte, α - 2 bytes, 𐐀 - 4 bytes */
+
+ { njs_str("JSON.stringify('α𐐀z'.repeat(10))"),
+ njs_str("\"α𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀zα𐐀z\"") },
+
+ { njs_str("JSON.stringify('α𐐀z'.repeat(10)).length"),
+ njs_str("32") },
+
+ { njs_str("JSON.stringify('α'.repeat(33))[32]"),
+ njs_str("α") },
+
+ { njs_str("JSON.stringify('a\\nbc')"),
+ njs_str("\"a\\nbc\"") },
+
+ { njs_str("JSON.stringify('а\tбв')"),
+ njs_str("\"а\\tбв\"") },
+
+ { njs_str("JSON.stringify('\\n\\t\\r\\\"\\f\\b')"),
+ njs_str("\"\\n\\t\\r\\\"\\f\\b\"") },
+
+ { njs_str("JSON.stringify('\x00\x01\x02\x1f')"),
+ njs_str("\"\\u0000\\u0001\\u0002\\u001F\"") },
+
+ { njs_str("JSON.stringify('abc\x00')"),
+ njs_str("\"abc\\u0000\"") },
+
+ { njs_str("JSON.stringify('\x00zz')"),
+ njs_str("\"\\u0000zz\"") },
+
+ { njs_str("JSON.stringify('\x00')"),
+ njs_str("\"\\u0000\"") },
+
+ { njs_str("JSON.stringify('a\x00z')"),
+ njs_str("\"a\\u0000z\"") },
+
+ { njs_str("JSON.stringify('\x00z\x00')"),
+ njs_str("\"\\u0000z\\u0000\"") },
+
+ { njs_str("var i, s, r = true;"
+ " for (i = 0; i < 128; i++) {"
+ " s = 'α𐐀z'.repeat(i);"
+ " r &= (JSON.stringify(s) == ('\"' + s + '\"'));"
+ "}; r"),
+ njs_str("1") },
+
+ { njs_str("JSON.stringify('\\u0000'.repeat(10)) == ('\"' + '\\\\u0000'.repeat(10) + '\"')"),
+ njs_str("true") },
+
+ { njs_str("JSON.stringify('abc'.repeat(100)).length"),
+ njs_str("302") },
+
+ { njs_str("JSON.stringify('абв'.repeat(100)).length"),
+ njs_str("302") },
+
+ /* Byte strings. */
+
+ { njs_str("JSON.stringify('\\u00CE\\u00B1\\u00C2\\u00B6'.toBytes())"),
+ njs_str("\"α¶\"") },
+
+ { njs_str("JSON.stringify('µ§±®'.toBytes())"),
+ njs_str("\"\xB5\xA7\xB1\xAE\"") },
+
+ /* Optional arguments. */
+
+ { njs_str("JSON.stringify(undefined, undefined, 1)"),
+ njs_str("undefined") },
+
+ { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, 0)"),
+ njs_str("[{\"a\":1,\"b\":{\"c\":2}},1]") },
+
+ { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, 1)"),
+ njs_str("[\n {\n \"a\": 1,\n \"b\": {\n \"c\": 2\n }\n },\n 1\n]") },
+
+ { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, ' ')"),
+ njs_str("[\n {\n \"a\": 1,\n \"b\": {\n \"c\": 2\n }\n },\n 1\n]") },
+
+ { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, '#')"),
+ njs_str("[\n#{\n##\"a\": 1,\n##\"b\": {\n###\"c\": 2\n##}\n#},\n#1\n]") },
+
+ { njs_str("JSON.stringify([1], undefined, 'AAAAABBBBBC')"),
+ njs_str("[\nAAAAABBBBB1\n]") },
+
+ { njs_str("JSON.stringify([1], undefined, 11)"),
+ njs_str("[\n 1\n]") },
+
+ { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, -1)"),
+ njs_str("[{\"a\":1,\"b\":{\"c\":2}},1]") },
+
+ { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, new Date())"),
+ njs_str("[{\"a\":1,\"b\":{\"c\":2}},1]") },
+
+ { njs_str("JSON.stringify({toJSON:function(k){}})"),
+ njs_str("undefined") },
+
+ { njs_str("JSON.stringify({toJSON:function(k){return k}})"),
+ njs_str("\"\"") },
+
+ { njs_str("JSON.stringify(new Date(1308895323625))"),
+ njs_str("\"2011-06-24T06:02:03.625Z\"") },
+
+ { njs_str("JSON.stringify({a:new Date(1308895323625)})"),
+ njs_str("{\"a\":\"2011-06-24T06:02:03.625Z\"}") },
+
+ { njs_str("JSON.stringify({b:{toJSON:function(k){return undefined}}})"),
+ njs_str("{}") },
+
+ { njs_str("JSON.stringify({b:{toJSON:function(k){}},c:1})"),
+ njs_str("{\"c\":1}") },
+
+ { njs_str("JSON.stringify({b:{toJSON:function(k){return k}}})"),
+ njs_str("{\"b\":\"b\"}") },
+
+ { njs_str("JSON.stringify({a:1,b:new Date(1308895323625),c:2})"),
+ njs_str("{\"a\":1,\"b\":\"2011-06-24T06:02:03.625Z\",\"c\":2}") },
+
+ { njs_str("JSON.stringify({a:{b:new Date(1308895323625)}})"),
+ njs_str("{\"a\":{\"b\":\"2011-06-24T06:02:03.625Z\"}}") },
+
+ { njs_str("function key(k){return k}; function und(k){}"
+ "JSON.stringify([{toJSON:key},{toJSON:und},{toJSON:key}])"),
+ njs_str("[\"0\",null,\"2\"]") },
+
+ { njs_str("JSON.stringify({b:{a:1,c:[2]}}, function(k,v){return v})"),
+ njs_str("{\"b\":{\"a\":1,\"c\":[2]}}") },
+
+ { njs_str("JSON.stringify([{a:1}, 2], function(k,v){return v})"),
+ njs_str("[{\"a\":1},2]") },
+
+ { njs_str("JSON.stringify({a:{toJSON:function(k){}}}, function(k,v){return v})"),
+ njs_str("{}") },
+
+ { njs_str("JSON.stringify({a:{toJSON:function(k){return 1}}}, function(k,v){return v})"),
+ njs_str("{\"a\":1}") },
+
+ { njs_str("JSON.stringify([{toJSON:function(k){}}], function(k,v){return v})"),
+ njs_str("[null]") },
+
+ { njs_str("JSON.stringify([{toJSON:function(k){return 1}}], function(k,v){return v})"),
+ njs_str("[1]") },
+
+ { njs_str("JSON.stringify({a:new Date(1308895323625)}, function(k,v){return v})"),
+ njs_str("{\"a\":\"2011-06-24T06:02:03.625Z\"}") },
+
+ { njs_str("JSON.stringify([new Date(1308895323625)], function(k,v){return v})"),
+ njs_str("[\"2011-06-24T06:02:03.625Z\"]") },
+
+ { njs_str("JSON.stringify([new Date(1308895323625)], "
+ " function(k,v){return (typeof v === 'string') ? v.toLowerCase() : v})"),
+ njs_str("[\"2011-06-24t06:02:03.625z\"]") },
+
+ { njs_str("JSON.stringify([new Date(1308895323625)], "
+ " function(k,v){return (typeof v === 'string') ? v.toLowerCase() : v}, '#')"),
+ njs_str("[\n#\"2011-06-24t06:02:03.625z\"\n]") },
+
+ { njs_str("JSON.stringify({a:new Date(1308895323625),b:1,c:'a'}, "
+ " function(k,v){return (typeof v === 'string') ? undefined : v})"),
+ njs_str("{\"b\":1}") },
+
+ { njs_str("JSON.stringify({a:new Date(1308895323625),b:1,c:'a'}, "
+ " function(k,v){return (typeof v === 'string') ? undefined : v}, '#')"),
+ njs_str("{\n#\"b\": 1\n}") },
+
+ { njs_str("JSON.stringify([new Date(1308895323625),1,'a'], "
+ " function(k,v){return (typeof v === 'string') ? undefined : v})"),
+ njs_str("[null,1,null]") },
+
+ { njs_str("var keys = []; var o = JSON.stringify({a:2, b:{c:1}},"
+ " function(k, v) {keys.push(k); return v;});"
+ "keys"),
+ njs_str(",a,b,c") },
+
+ { njs_str("JSON.stringify(['a', 'b', 'c'], "
+ " function(i, v) { if (i === '0') {return undefined} "
+ " else if (i == 1) {return 2} "
+ " else {return v}})"),
+ njs_str("[null,2,\"c\"]") },
+
+ { njs_str("JSON.stringify({a:2, b:{c:1}},"
+ " function(k, v) {delete this['b']; return v;})"),
+ njs_str("{\"a\":2}") },
+
+ { njs_str("JSON.stringify(JSON.parse('{\"a\":1,\"b\":2}', "
+ " function(k, v) {delete this['b']; return v;}))"),
+ njs_str("{\"a\":1}") },
+
+ { njs_str("var keys = []; var o = JSON.stringify([[1,2],{a:3}, 4],"
+ " function(k, v) {keys.push(k); return v;});"
+ "keys"),
+ njs_str(",0,0,1,1,a,2") },
+
+ { njs_str("JSON.stringify({b:{a:1,c:[2]}}, ['a', undefined, 'b', {}, 'a'])"),
+ njs_str("{\"b\":{\"a\":1}}") },
+
+ { njs_str("JSON.stringify({b:{a:1,c:[2]}}, [new String('a'), new String('b')])"),
+ njs_str("{\"b\":{\"a\":1}}") },
+
+ { njs_str("JSON.stringify({'1':1,'2':2,'3':3}, [1, new Number(2)])"),
+ njs_str("{\"1\":1,\"2\":2}") },
+
+ { njs_str("var objs = []; var o = JSON.stringify({a:1},"
+ " function(k, v) {objs.push(this); return v});"
+ "JSON.stringify(objs)"),
+ njs_str("[{\"\":{\"a\":1}},{\"a\":1}]") },
+
+ { njs_str("var a = []; a[0] = a; JSON.stringify(a)"),
+ njs_str("TypeError: Nested too deep or a cyclic structure") },
+
+ { njs_str("var a = {}; a.a = a; JSON.stringify(a)"),
+ njs_str("TypeError: Nested too deep or a cyclic structure") },
+
+ /* njs.dump(). */
+
+ { njs_str("njs.dump({a:1, b:[1,,2,{c:new Boolean(1)}]})"),
+ njs_str("{a:1,b:[1,<empty>,2,{c:[Boolean: true]}]}") },
+
+ { njs_str("njs.dump(Array.prototype.slice.call({'1':'b', length:2}))"),
+ njs_str("[<empty>,'b']") },
+
+ { njs_str("njs.dump($r.props)"),
+ njs_str("{a:{type:\"property\",props:[\"getter\"]},b:{type:\"property\",props:[\"getter\"]}}") },
+
+ { njs_str("njs.dump($r.header)"),
+ njs_str("{type:\"object\",props:[\"getter\",\"foreach\",\"next\"]}") },
+
+ { njs_str("njs.dump(njs) == `{version:'${njs.version}'}`"),
+ njs_str("true") },
+
+ { njs_str("njs.dump(-0)"),
+ njs_str("-0") },
+
+ { njs_str("njs.dump(Object(-0))"),
+ njs_str("[Number: -0]") },
+
+ { njs_str("njs.dump([0, -0])"),
+ njs_str("[0,-0]") },
+
+ /* Built-in methods name. */
+
+ { njs_str(
+ "var fail;"
+ "function isMethodsHaveName(o) {"
+ " var except = ["
+ " 'prototype',"
+ " 'constructor',"
+ " ];"
+ " return Object.getOwnPropertyNames(o)"
+ " .filter(v => !except.includes(v)"
+ " && typeof o[v] == 'function')"
+ " .every(v => o[v].name == v"
+ " || !(fail = `${o.name}.${v}: ${o[v].name}`));"
+ "}"
+ "["
+ " Boolean, Boolean.prototype,"
+ " Number, Number.prototype,"
+ " String, String.prototype,"
+ " Object, Object.prototype,"
+ " Array, Array.prototype,"
+ " Function, Function.prototype,"
+ " RegExp, RegExp.prototype,"
+ " Date, Date.prototype,"
+ " Error, Error.prototype,"
+ " Math,"
+ " JSON,"
+ "].every(obj => isMethodsHaveName(obj)) || fail"),
+
+ njs_str("true") },
+
+ /* require(). */
+
+ { njs_str("require('unknown_module')"),
+ njs_str("Error: Cannot find module \"unknown_module\"") },
+
+ { njs_str("require()"),
+ njs_str("TypeError: missing path") },
+
+ { njs_str("var fs = require('fs'); typeof fs"),
+ njs_str("object") },
+
+ /* require('fs').readFile() */
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFile()"),
+ njs_str("TypeError: too few arguments") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFile('/njs_unknown_path')"),
+ njs_str("TypeError: too few arguments") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFile('/njs_unknown_path', {flag:'xx'})"),
+ njs_str("TypeError: callback must be a function") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFile('/njs_unknown_path', {flag:'xx'}, 1)"),
+ njs_str("TypeError: callback must be a function") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFile('/njs_unknown_path', {flag:'xx'}, function () {})"),
+ njs_str("TypeError: Unknown file open flags: \"xx\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFile('/njs_unknown_path', {encoding:'ascii'}, function () {})"),
+ njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFile('/njs_unknown_path', 'ascii', function () {})"),
+ njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+ /* require('fs').readFileSync() */
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFileSync()"),
+ njs_str("TypeError: too few arguments") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFileSync({})"),
+ njs_str("TypeError: path must be a string") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFileSync('/njs_unknown_path', {flag:'xx'})"),
+ njs_str("TypeError: Unknown file open flags: \"xx\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFileSync('/njs_unknown_path', {encoding:'ascii'})"),
+ njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFileSync('/njs_unknown_path', 'ascii')"),
+ njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.readFileSync('/njs_unknown_path', true)"),
+ njs_str("TypeError: Unknown options type (a string or object required)") },
+
+
+ /* require('fs').writeFile() */
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFile()"),
+ njs_str("TypeError: too few arguments") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFile('/njs_unknown_path')"),
+ njs_str("TypeError: too few arguments") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFile('/njs_unknown_path', '')"),
+ njs_str("TypeError: too few arguments") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFile({}, '', function () {})"),
+ njs_str("TypeError: path must be a string") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFile('/njs_unknown_path', '', 'utf8')"),
+ njs_str("TypeError: callback must be a function") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFile('/njs_unknown_path', '', {flag:'xx'}, function () {})"),
+ njs_str("TypeError: Unknown file open flags: \"xx\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFile('/njs_unknown_path', '', {encoding:'ascii'}, function () {})"),
+ njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFile('/njs_unknown_path', '', 'ascii', function () {})"),
+ njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFile('/njs_unknown_path', '', true, function () {})"),
+ njs_str("TypeError: Unknown options type (a string or object required)") },
+
+ /* require('fs').writeFileSync() */
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFileSync()"),
+ njs_str("TypeError: too few arguments") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFileSync('/njs_unknown_path')"),
+ njs_str("TypeError: too few arguments") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFileSync({}, '')"),
+ njs_str("TypeError: path must be a string") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFileSync('/njs_unknown_path', '', {flag:'xx'})"),
+ njs_str("TypeError: Unknown file open flags: \"xx\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFileSync('/njs_unknown_path', '', {encoding:'ascii'})"),
+ njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFileSync('/njs_unknown_path', '', 'ascii')"),
+ njs_str("TypeError: Unknown encoding: \"ascii\"") },
+
+ { njs_str("var fs = require('fs');"
+ "fs.writeFileSync('/njs_unknown_path', '', true)"),
+ njs_str("TypeError: Unknown options type (a string or object required)") },
+
+ /* require('crypto').createHash() */
+
+ { njs_str("require('crypto').createHash('sha1')"),
+ njs_str("[object Hash]") },
+
+ { njs_str("Object.prototype.toString.call(require('crypto').createHash('sha1'))"),
+ njs_str("[object Object]") },
+
+ { njs_str("var h = require('crypto').createHash('md5');"
+ "h.update('AB').digest('hex')"),
+ njs_str("b86fc6b051f63d73de262d4c34e3a0a9") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update('A').update('B').digest('hex')"),
+ njs_str("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update('AB').digest('hex')"),
+ njs_str("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update('AB').digest().toString('hex')"),
+ njs_str("06d945942aa26a61be18c3e22bf19bbca8dd2b5d") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update('AB').digest('base64')"),
+ njs_str("BtlFlCqiamG+GMPiK/GbvKjdK10=") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update('AB').digest('base64url')"),
+ njs_str("BtlFlCqiamG-GMPiK_GbvKjdK10") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update('AB').digest().toString('base64')"),
+ njs_str("BtlFlCqiamG+GMPiK/GbvKjdK10=") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update('abc'.repeat(100)).digest('hex')"),
+ njs_str("c95466320eaae6d19ee314ae4f135b12d45ced9a") },
+
+ { njs_str("var h = require('crypto').createHash('sha256');"
+ "h.update('A').update('B').digest('hex')"),
+ njs_str("38164fbd17603d73f696b8b4d72664d735bb6a7c88577687fd2ae33fd6964153") },
+
+ { njs_str("var h = require('crypto').createHash('sha256');"
+ "h.update('AB').digest('hex')"),
+ njs_str("38164fbd17603d73f696b8b4d72664d735bb6a7c88577687fd2ae33fd6964153") },
+
+ { njs_str("var h = require('crypto').createHash('sha256');"
+ "h.update('abc'.repeat(100)).digest('hex')"),
+ njs_str("d9f5aeb06abebb3be3f38adec9a2e3b94228d52193be923eb4e24c9b56ee0930") },
+
+ { njs_str("var h = require('crypto').createHash()"),
+ njs_str("TypeError: algorithm must be a string") },
+
+ { njs_str("var h = require('crypto').createHash([])"),
+ njs_str("TypeError: algorithm must be a string") },
+
+ { njs_str("var h = require('crypto').createHash('sha512')"),
+ njs_str("TypeError: not supported algorithm: \"sha512\"") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update()"),
+ njs_str("TypeError: data must be a string") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update({})"),
+ njs_str("TypeError: data must be a string") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update('A').digest('latin1')"),
+ njs_str("TypeError: Unknown digest encoding: \"latin1\"") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update('A').digest('hex'); h.digest('hex')"),
+ njs_str("Error: Digest already called") },
+
+ { njs_str("var h = require('crypto').createHash('sha1');"
+ "h.update('A').digest('hex'); h.update('B')"),
+ njs_str("Error: Digest already called") },
+
+ { njs_str("typeof require('crypto').createHash('md5')"),
+ njs_str("object") },
+
+ /* require('crypto').createHmac() */
+
+ { njs_str("require('crypto').createHmac('sha1', '')"),
+ njs_str("[object Hmac]") },
+
+ { njs_str("var h = require('crypto').createHmac('md5', '');"
+ "h.digest('hex')"),
+ njs_str("74e6f7298a9c2d168935f58c001bad88") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', '');"
+ "h.digest('hex')"),
+ njs_str("fbdb1d1b18aa6c08324b7d64b71fb76370690e1d") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', '');"
+ "h.digest().toString('hex')"),
+ njs_str("fbdb1d1b18aa6c08324b7d64b71fb76370690e1d") },
+
+ { njs_str("var h = require('crypto').createHmac('md5', 'secret key');"
+ "h.update('AB').digest('hex')"),
+ njs_str("9c72728915eb26620a5caeafd0063b29") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+ "h.update('A').update('B').digest('hex')"),
+ njs_str("adc60e03459c4bae7cf4eb6d9730003e9490b22f") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+ "h.update('AB').digest('hex')"),
+ njs_str("adc60e03459c4bae7cf4eb6d9730003e9490b22f") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+ "h.update('AB').digest('base64')"),
+ njs_str("rcYOA0WcS6589OttlzAAPpSQsi8=") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+ "h.update('AB').digest('base64url')"),
+ njs_str("rcYOA0WcS6589OttlzAAPpSQsi8") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+ "h.update('AB').digest().toString('base64')"),
+ njs_str("rcYOA0WcS6589OttlzAAPpSQsi8=") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+ "h.update('abc'.repeat(100)).digest('hex')"),
+ njs_str("b105ad6921e4c54d3fa0a9ec3f7f0ee9bd2c659d") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'A'.repeat(40));"
+ "h.update('AB').digest('hex')"),
+ njs_str("0b84f78ca5275d76d4b7dafb5845ee2b6a79c4c2") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'A'.repeat(64));"
+ "h.update('AB').digest('hex')"),
+ njs_str("400ce530816c6b3247e2959f3982a12aaf58c0c9") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'A'.repeat(100));"
+ "h.update('AB').digest('hex')"),
+ njs_str("670e7cdebae6392797e000e79e51d3b6589d8fad") },
+
+ { njs_str("var h = require('crypto').createHmac('sha256', '');"
+ "h.digest('hex')"),
+ njs_str("b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad") },
+
+ { njs_str("var h = require('crypto').createHmac('sha256', 'secret key');"
+ "h.update('A').update('B').digest('hex')"),
+ njs_str("46085184b3b45a13d838bf71a0ce03675dab30931e0f1f68fa636ea65fdb286d") },
+
+ { njs_str("var h = require('crypto').createHmac('sha256', 'secret key');"
+ "h.update('AB').digest('hex')"),
+ njs_str("46085184b3b45a13d838bf71a0ce03675dab30931e0f1f68fa636ea65fdb286d") },
+
+ { njs_str("var h = require('crypto').createHmac('sha256', 'A'.repeat(64));"
+ "h.update('AB').digest('hex')"),
+ njs_str("ee9dce43b12eb3e865614ad9c1a8d4fad4b6eac2b64647bd24cd192888d3f367") },
+
+ { njs_str("var h = require('crypto').createHmac('sha256', 'A'.repeat(100));"
+ "h.update('AB').digest('hex')"),
+ njs_str("5647b6c429701ff512f0f18232b4507065d2376ca8899a816a0a6e721bf8ddcc") },
+
+ { njs_str("var h = require('crypto').createHmac('md5', 'secret key');"
+ "h.update('abc'.repeat(100)).digest('hex')"),
+ njs_str("5dd706af43536f8c9c83e7ea55b1a5a2") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+ "h.update('abc'.repeat(100)).digest('hex')"),
+ njs_str("b105ad6921e4c54d3fa0a9ec3f7f0ee9bd2c659d") },
+
+ { njs_str("var h = require('crypto').createHmac('sha256', 'secret key');"
+ "h.update('abc'.repeat(100)).digest('hex')"),
+ njs_str("f6550d398ce350ee8d94a0f44f2cf6b9bc8d316ae4625fb4434f22980a276bac") },
+
+ { njs_str("var h = require('crypto').createHmac()"),
+ njs_str("TypeError: algorithm must be a string") },
+
+ { njs_str("var h = require('crypto').createHmac([])"),
+ njs_str("TypeError: algorithm must be a string") },
+
+ { njs_str("var h = require('crypto').createHmac('sha512', '')"),
+ njs_str("TypeError: not supported algorithm: \"sha512\"") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', [])"),
+ njs_str("TypeError: key must be a string") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+ "h.update('A').digest('hex'); h.digest('hex')"),
+ njs_str("Error: Digest already called") },
+
+ { njs_str("var h = require('crypto').createHmac('sha1', 'secret key');"
+ "h.update('A').digest('hex'); h.update('B')"),
+ njs_str("Error: Digest already called") },
+
+ { njs_str("typeof require('crypto').createHmac('md5', 'a')"),
+ njs_str("object") },
+
+ /* setTimeout(). */
+
+ { njs_str("setTimeout()"),
+ njs_str("TypeError: too few arguments") },
+
+ { njs_str("setTimeout(function(){})"),
+ njs_str("InternalError: not supported by host environment") },
+
+ { njs_str("setTimeout(function(){}, 12)"),
+ njs_str("InternalError: not supported by host environment") },
+
+ /* clearTimeout(). */
+
+ { njs_str("clearTimeout()"),
+ njs_str("undefined") },
+
+ { njs_str("clearTimeout(123)"),
+ njs_str("undefined") },
+
+ /* Trick: number to boolean. */
+
+ { njs_str("var a = 0; !!a"),
+ njs_str("false") },
+
+ { njs_str("var a = 5; !!a"),
+ njs_str("true") },
+
+ /* Trick: flooring. */
+
+ { njs_str("var n = -10.12345; ~~n"),
+ njs_str("-10") },
+
+ { njs_str("var n = 10.12345; ~~n"),
+ njs_str("10") },
+
+ /* es5id: 8.2_A1_T1 */
+ /* es5id: 8.2_A1_T2 */
+
+ { njs_str("var x = null;"),
+ njs_str("undefined") },
+
+ /* es5id: 8.2_A2 */
+
+ { njs_str("var null;"),
+ njs_str("SyntaxError: Unexpected token \"null\" in 1") },
+
+ /* es5id: 8.2_A3 */
+
+ { njs_str("typeof(null) === \"object\""),
+ njs_str("true") },
+
+ /* Module. */
+
+ { njs_str("import;"),
+ njs_str("SyntaxError: Non-default import is not supported in 1") },
+
+ { njs_str("import {x} from y"),
+ njs_str("SyntaxError: Non-default import is not supported in 1") },
+
+ { njs_str("import x from y"),
+ njs_str("SyntaxError: Unexpected token \"y\" in 1") },
+
+ { njs_str("import x from {"),
+ njs_str("SyntaxError: Unexpected token \"{\" in 1") },
+
+ { njs_str("import x from ''"),
+ njs_str("SyntaxError: Cannot find module \"\" in 1") },
+
+ { njs_str("import x from 'crypto'"),
+ njs_str("undefined") },
+
+ { njs_str("import x from 'crypto' 1"),
+ njs_str("SyntaxError: Unexpected token \"1\" in 1") },
+
+ { njs_str("if (1) {import x from 'crypto'}"),
+ njs_str("SyntaxError: Illegal import statement in 1") },
+
+ { njs_str("export"),
+ njs_str("SyntaxError: Illegal export statement in 1") },
+
+};
+
+
+static njs_unit_test_t njs_module_test[] =
+{
+ { njs_str("function f(){return 2}; var f; f()"),
+ njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+ { njs_str("function f(){return 2}; var f = 1; f()"),
+ njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+ { njs_str("function f(){return 1}; function f(){return 2}; f()"),
+ njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+ { njs_str("var f = 1; function f() {};"),
+ njs_str("SyntaxError: \"f\" has already been declared in 1") },
+
+ { njs_str("{ var f = 1; } function f() {};"),
+ njs_str("SyntaxError: \"f\" has already been declared in 1") },
+};
+
+
+static njs_unit_test_t njs_tz_test[] =
+{
+ { njs_str("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
+ njs_str("Thu Jan 01 1970 12:45:00 GMT+1245") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getTime()"),
+ njs_str("1308895200000") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.valueOf()"),
+ njs_str("1308895200000") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45);"
+ "d.toString().slice(0, 33)"),
+ njs_str("Fri Jun 24 2011 18:45:00 GMT+1245") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45);"
+ "d.toTimeString().slice(0, 17)"),
+ njs_str("18:45:00 GMT+1245") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.toUTCString()"),
+ njs_str("Fri Jun 24 2011 06:00:00 GMT") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+ "d.toISOString()"),
+ njs_str("2011-06-24T06:00:12.625Z") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCHours()"),
+ njs_str("6") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45); d.getUTCMinutes()"),
+ njs_str("0") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+ "d.getTimezoneOffset()"),
+ njs_str("-765") },
+
+ { njs_str("var d = new Date(1308895323625); d.setMinutes(3, 2, 5003);"
+ "d.getTime()"),
+ njs_str("1308892687003") },
+
+ { njs_str("var d = new Date(1308895323625); d.setMinutes(3, 2);"
+ "d.getTime()"),
+ njs_str("1308892682625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setMinutes(3);"
+ "d.getTime()"),
+ njs_str("1308892683625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setHours(20, 3, 2, 5003);"
+ "d.getTime()"),
+ njs_str("1308899887003") },
+
+ { njs_str("var d = new Date(1308895323625); d.setHours(20, 3, 2);"
+ "d.getTime()"),
+ njs_str("1308899882625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setHours(20, 3);"
+ "d.getTime()"),
+ njs_str("1308899883625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setHours(20);"
+ "d.getTime()"),
+ njs_str("1308902523625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setMonth(2, 10);"
+ "d.getTime()"),
+ njs_str("1299733323625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setMonth(2);"
+ "d.getTime()"),
+ njs_str("1300942923625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setFullYear(2010, 2, 10);"
+ "d.getTime()"),
+ njs_str("1268197323625") },
+
+ { njs_str("var d = new Date(1308895323625); d.setFullYear(2010, 2);"
+ "d.getTime()"),
+ njs_str("1269406923625") },
+
+ { njs_str("var d = new Date(2011, 5, 24, 18, 45, 12, 625);"
+ "d.toJSON(1)"),
+ njs_str("2011-06-24T06:00:12.625Z") },
+};
+
+
+static njs_unit_test_t njs_regexp_test[] =
+{
+ { njs_str("/[\\\\u02E0-\\\\u02E4]/"),
+ njs_str("/[\\\\u02E0-\\\\u02E4]/") },
+
+ { njs_str("/[\\u02E0-\\u02E4]/"),
+ njs_str("/[\\u02E0-\\u02E4]/") },
+
+ { njs_str("RegExp('[\\\\u02E0-\\\\u02E4]')"),
+ njs_str("/[\\u02E0-\\u02E4]/") },
+
+ { njs_str("/[\\u0430-\\u044f]+/.test('тест')"),
+ njs_str("true") },
+
+ { njs_str("RegExp('[\\\\u0430-\\\\u044f]+').test('тест')"),
+ njs_str("true") },
+
+ { njs_str("RegExp('[\\\\u0430-\\\\u044f]+').exec('тест')[0]"),
+ njs_str("тест") },
+
+ { njs_str("/[\\uFDE0-\\uFFFD]/g; export default 1"),
+ njs_str("SyntaxError: Illegal export statement in 1") },
+
+ { njs_str("RegExp(RegExp('\x00]]')).test('\x00]]')"),
+ njs_str("true") },
+
+ { njs_str("RegExp('\0').test('\0')"),
+ njs_str("true") },
+
+ { njs_str("RegExp('\x00').test('\0')"),
+ njs_str("true") },
+
+ { njs_str("RegExp('\x00\\\\x00').source"),
+ njs_str("\\u0000\\x00") },
+
+ { njs_str("/\\\0/"),
+ njs_str("/\\\\u0000/") },
+
+ { njs_str("RegExp('\\\\\\0').source"),
+ njs_str("\\\\u0000") },
+
+ { njs_str("RegExp('[\0]').test('\0')"),
+ njs_str("true") },
+};
+
+
+typedef struct {
+ njs_lvlhsh_t hash;
+ const njs_extern_t *proto;
+ njs_mp_t *pool;
+
+ uint32_t a;
+ njs_str_t uri;
+
+ njs_opaque_value_t value;
+} njs_unit_test_req_t;
+
+
+typedef struct {
+ njs_value_t name;
+ njs_value_t value;
+} njs_unit_test_prop_t;
+
+
+static njs_int_t
+lvlhsh_unit_test_key_test(njs_lvlhsh_query_t *lhq, void *data)
+{
+ njs_str_t name;
+ njs_unit_test_prop_t *prop;
+
+ prop = data;
+ njs_string_get(&prop->name, &name);
+
+ if (name.length != lhq->key.length) {
+ return NJS_DECLINED;
+ }
+
+ if (memcmp(name.start, lhq->key.start, lhq->key.length) == 0) {
+ return NJS_OK;
+ }
+
+ return NJS_DECLINED;
+}
+
+
+static void *
+lvlhsh_unit_test_pool_alloc(void *pool, size_t size)
+{
+ return njs_mp_align(pool, size, size);
+}
+
+
+static void
+lvlhsh_unit_test_pool_free(void *pool, void *p, size_t size)
+{
+ njs_mp_free(pool, p);
+}
+
+
+static const njs_lvlhsh_proto_t lvlhsh_proto njs_aligned(64) = {
+ NJS_LVLHSH_LARGE_SLAB,
+ lvlhsh_unit_test_key_test,
+ lvlhsh_unit_test_pool_alloc,
+ lvlhsh_unit_test_pool_free,
+};
+
+
+static njs_unit_test_prop_t *
+lvlhsh_unit_test_alloc(njs_mp_t *pool, const njs_value_t *name,
+ const njs_value_t *value)
+{
+ njs_unit_test_prop_t *prop;
+
+ prop = njs_mp_alloc(pool, sizeof(njs_unit_test_prop_t));
+ if (prop == NULL) {
+ return NULL;
+ }
+
+ prop->name = *name;
+ prop->value = *value;
+
+ return prop;
+}
+
+
+static njs_int_t
+lvlhsh_unit_test_add(njs_unit_test_req_t *r, njs_unit_test_prop_t *prop)
+{
+ njs_lvlhsh_query_t lhq;
+
+ njs_string_get(&prop->name, &lhq.key);
+ lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
+
+ lhq.replace = 1;
+ lhq.value = (void *) prop;
+ lhq.proto = &lvlhsh_proto;
+ lhq.pool = r->pool;
+
+ switch (njs_lvlhsh_insert(&r->hash, &lhq)) {
+
+ case NJS_OK:
+ return NJS_OK;
+
+ case NJS_DECLINED:
+ default:
+ return NJS_ERROR;
+ }
+}
+
+
+static njs_ret_t
+njs_unit_test_r_get_uri_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+ uintptr_t data)
+{
+ char *p = obj;
+
+ njs_str_t *field;
+
+ field = (njs_str_t *) (p + data);
+
+ return njs_vm_value_string_set(vm, value, field->start, field->length);
+}
+
+
+static njs_ret_t
+njs_unit_test_r_set_uri_external(njs_vm_t *vm, void *obj, uintptr_t data,
+ njs_str_t *value)
+{
+ char *p = obj;
+
+ njs_str_t *field;
+
+ field = (njs_str_t *) (p + data);
+
+ *field = *value;
+
+ return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_r_get_a_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+ uintptr_t data)
+{
+ u_char buf[16], *p;
+ njs_unit_test_req_t *r;
+
+ r = (njs_unit_test_req_t *) obj;
+
+ p = njs_sprintf(buf, buf + njs_length(buf), "%uD", r->a);
+
+ return njs_vm_value_string_set(vm, value, buf, p - buf);
+}
+
+
+static njs_ret_t
+njs_unit_test_r_get_b_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+ uintptr_t data)
+{
+ njs_value_number_set(value, data);
+
+ return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_host_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+ uintptr_t data)
+{
+ return njs_vm_value_string_set(vm, value, (u_char *) "АБВГДЕЁЖЗИЙ", 22);
+}
+
+
+static njs_ret_t
+njs_unit_test_r_get_vars(njs_vm_t *vm, njs_value_t *value, void *obj,
+ uintptr_t data)
+{
+ njs_int_t ret;
+ njs_str_t *key;
+ njs_lvlhsh_query_t lhq;
+ njs_unit_test_req_t *r;
+ njs_unit_test_prop_t *prop;
+
+ r = (njs_unit_test_req_t *) obj;
+ key = (njs_str_t *) data;
+
+ lhq.key = *key;
+ lhq.key_hash = njs_djb_hash(key->start, key->length);
+ lhq.proto = &lvlhsh_proto;
+
+ ret = njs_lvlhsh_find(&r->hash, &lhq);
+
+ prop = lhq.value;
+
+ if (ret == NJS_OK && njs_is_valid(&prop->value)) {
+ *value = prop->value;
+ return NJS_OK;
+ }
+
+ njs_value_undefined_set(value);
+
+ return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_r_set_vars(njs_vm_t *vm, void *obj, uintptr_t data,
+ njs_str_t *value)
+{
+ njs_int_t ret;
+ njs_str_t *key;
+ njs_value_t name, val;
+ njs_unit_test_req_t *r;
+ njs_unit_test_prop_t *prop;
+
+ r = (njs_unit_test_req_t *) obj;
+ key = (njs_str_t *) data;
+
+ if (key->length == 5 && memcmp(key->start, "error", 5) == 0) {
+ njs_vm_error(vm, "cannot set \"error\" prop");
+ return NJS_ERROR;
+ }
+
+ njs_vm_value_string_set(vm, &name, key->start, key->length);
+ njs_vm_value_string_set(vm, &val, value->start, value->length);
+
+ prop = lvlhsh_unit_test_alloc(vm->mem_pool, &name, &val);
+ if (prop == NULL) {
+ njs_memory_error(vm);
+ return NJS_ERROR;
+ }
+
+ ret = lvlhsh_unit_test_add(r, prop);
+ if (ret != NJS_OK) {
+ njs_vm_error(vm, "lvlhsh_unit_test_add() failed");
+ return NJS_ERROR;
+ }
+
+ return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_r_del_vars(njs_vm_t *vm, void *obj, uintptr_t data,
+ njs_bool_t delete)
+{
+ njs_int_t ret;
+ njs_str_t *key;
+ njs_lvlhsh_query_t lhq;
+ njs_unit_test_req_t *r;
+ njs_unit_test_prop_t *prop;
+
+ r = (njs_unit_test_req_t *) obj;
+ key = (njs_str_t *) data;
+
+ if (key->length == 5 && memcmp(key->start, "error", 5) == 0) {
+ njs_vm_error(vm, "cannot delete \"error\" prop");
+ return NJS_ERROR;
+ }
+
+ lhq.key = *key;
+ lhq.key_hash = njs_djb_hash(key->start, key->length);
+ lhq.proto = &lvlhsh_proto;
+
+ ret = njs_lvlhsh_find(&r->hash, &lhq);
+
+ prop = lhq.value;
+
+ if (ret == NJS_OK) {
+ njs_set_invalid(&prop->value);
+ }
+
+ return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_header_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+ uintptr_t data)
+{
+ u_char *p;
+ uint32_t size;
+ njs_str_t *h;
+
+ h = (njs_str_t *) data;
+
+ size = 7 + h->length;
+
+ p = njs_vm_value_string_alloc(vm, value, size);
+ if (p == NULL) {
+ return NJS_ERROR;
+ }
+
+ p = njs_cpymem(p, h->start, h->length);
+ *p++ = '|';
+ memcpy(p, "АБВ", 6);
+
+ return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_header_foreach_external(njs_vm_t *vm, void *obj, void *next)
+{
+ u_char *s;
+
+ s = next;
+ s[0] = '0';
+ s[1] = '0';
+
+ return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_header_next_external(njs_vm_t *vm, njs_value_t *value, void *obj,
+ void *next)
+{
+ u_char *s;
+
+ s = next;
+ s[1]++;
+
+ if (s[1] == '4') {
+ return NJS_DONE;
+ }
+
+ return njs_vm_value_string_set(vm, value, s, 2);
+}
+
+
+static njs_ret_t
+njs_unit_test_method_external(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+ njs_index_t unused)
+{
+ njs_int_t ret;
+ njs_str_t s;
+ njs_unit_test_req_t *r;
+
+ r = njs_vm_external(vm, njs_arg(args, nargs, 0));
+ if (njs_slow_path(r == NULL)) {
+ return NJS_ERROR;
+ }
+
+ ret = njs_vm_value_to_string(vm, &s, njs_arg(args, nargs, 1));
+ if (ret == NJS_OK && s.length == 3 && memcmp(s.start, "YES", 3) == 0) {
+ return njs_vm_value_string_set(vm, njs_vm_retval(vm), r->uri.start,
+ r->uri.length);
+ }
+
+ vm->retval = njs_value_undefined;
+
+ return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_unit_test_create_external(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+ njs_index_t unused)
+{
+ njs_int_t ret;
+ njs_str_t uri;
+ njs_value_t *value;
+ njs_unit_test_req_t *r, *sr;
+
+ r = njs_vm_external(vm, njs_arg(args, nargs, 0));
+ if (njs_slow_path(r == NULL)) {
+ return NJS_ERROR;
+ }
+
+ if (njs_vm_value_to_string(vm, &uri, njs_arg(args, nargs, 1)) != NJS_OK) {
+ return NJS_ERROR;
+ }
+
+ value = njs_mp_zalloc(r->pool, sizeof(njs_opaque_value_t));
+ if (value == NULL) {
+ goto memory_error;
+ }
+
+ sr = njs_mp_zalloc(r->pool, sizeof(njs_unit_test_req_t));
+ if (sr == NULL) {
+ goto memory_error;
+ }
+
+ sr->uri = uri;
+ sr->pool = r->pool;
+ sr->proto = r->proto;
+
+ ret = njs_vm_external_create(vm, value, sr->proto, sr);
+ if (ret != NJS_OK) {
+ return NJS_ERROR;
+ }
+
+ njs_vm_retval_set(vm, value);
+
+ return NJS_OK;
+
+memory_error:
+
+ njs_memory_error(vm);
+
+ return NJS_ERROR;
+}
+
+
+static njs_external_t njs_unit_test_r_props[] = {
+
+ { njs_str("a"),
+ NJS_EXTERN_PROPERTY,
+ NULL,
+ 0,
+ njs_unit_test_r_get_a_external,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0 },
+
+ { njs_str("b"),
+ NJS_EXTERN_PROPERTY,
+ NULL,
+ 0,
+ njs_unit_test_r_get_b_external,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 42 },
+};
+
+
+static njs_external_t njs_unit_test_r_external[] = {
+
+ { njs_str("uri"),
+ NJS_EXTERN_PROPERTY,
+ NULL,
+ 0,
+ njs_unit_test_r_get_uri_external,
+ njs_unit_test_r_set_uri_external,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ offsetof(njs_unit_test_req_t, uri) },
+
+ { njs_str("host"),
+ NJS_EXTERN_PROPERTY,
+ NULL,
+ 0,
+ njs_unit_test_host_external,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0 },
+
+ { njs_str("props"),
+ NJS_EXTERN_OBJECT,
+ njs_unit_test_r_props,
+ njs_nitems(njs_unit_test_r_props),
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0 },
+
+ { njs_str("vars"),
+ NJS_EXTERN_OBJECT,
+ NULL,
+ 0,
+ njs_unit_test_r_get_vars,
+ njs_unit_test_r_set_vars,
+ njs_unit_test_r_del_vars,
+ NULL,
+ NULL,
+ NULL,
+ 0 },
+
+ { njs_str("consts"),
+ NJS_EXTERN_OBJECT,
+ NULL,
+ 0,
+ njs_unit_test_r_get_vars,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0 },
+
+ { njs_str("header"),
+ NJS_EXTERN_OBJECT,
+ NULL,
+ 0,
+ njs_unit_test_header_external,
+ NULL,
+ NULL,
+ njs_unit_test_header_foreach_external,
+ njs_unit_test_header_next_external,
+ NULL,
+ 0 },
+
+ { njs_str("some_method"),
+ NJS_EXTERN_METHOD,
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ njs_unit_test_method_external,
+ 0 },
+
+ { njs_str("create"),
+ NJS_EXTERN_METHOD,
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ njs_unit_test_create_external,
+ 0 },
+
+};
+
+
+static njs_external_t njs_test_external[] = {
+
+ { njs_str("request.proto"),
+ NJS_EXTERN_OBJECT,
+ njs_unit_test_r_external,
+ njs_nitems(njs_unit_test_r_external),
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0 },
+
+};
+
+
+typedef struct {
+ njs_str_t name;
+ njs_unit_test_req_t request;
+ njs_unit_test_prop_t props[2];
+} njs_unit_test_req_t_init_t;
+
+
+static const njs_unit_test_req_t_init_t njs_test_requests[] = {
+
+ { njs_str("$r"),
+ {
+ .uri = njs_str("АБВ"),
+ .a = 1
+ },
+ {
+ { njs_string("p"), njs_string("pval") },
+ { njs_string("p2"), njs_string("p2val") },
+ }
+ },
+
+ { njs_str("$r2"),
+ {
+ .uri = njs_str("αβγ"),
+ .a = 2
+ },
+ {
+ { njs_string("q"), njs_string("qval") },
+ { njs_string("q2"), njs_string("q2val") },
+ }
+ },
+
+ { njs_str("$r3"),
+ {
+ .uri = njs_str("abc"),
+ .a = 3
+ },
+ {
+ { njs_string("k"), njs_string("kval") },
+ { njs_string("k2"), njs_string("k2val") },
+ }
+ },
+};
+
+
+static njs_int_t
+njs_externals_init(njs_vm_t *vm)
+{
+ njs_int_t ret;
+ njs_uint_t i, j;
+ const njs_extern_t *proto;
+ njs_unit_test_req_t *requests;
+ njs_unit_test_prop_t *prop;
+
+ proto = njs_vm_external_prototype(vm, &njs_test_external[0]);
+ if (proto == NULL) {
+ njs_printf("njs_vm_external_prototype() failed\n");
+ return NJS_ERROR;
+ }
+
+ requests = njs_mp_zalloc(vm->mem_pool,
+ njs_nitems(njs_test_requests)
+ * sizeof(njs_unit_test_req_t));
+ if (requests == NULL) {
+ return NJS_ERROR;
+ }
+
+ for (i = 0; i < njs_nitems(njs_test_requests); i++) {
+
+ requests[i] = njs_test_requests[i].request;
+ requests[i].pool = vm->mem_pool;
+ requests[i].proto = proto;
+
+ ret = njs_vm_external_create(vm, njs_value_arg(&requests[i].value),
+ proto, &requests[i]);
+ if (ret != NJS_OK) {
+ njs_printf("njs_vm_external_create() failed\n");
+ return NJS_ERROR;
+ }
+
+ ret = njs_vm_external_bind(vm, &njs_test_requests[i].name,
+ njs_value_arg(&requests[i].value));
+ if (ret != NJS_OK) {
+ njs_printf("njs_vm_external_bind() failed\n");
+ return NJS_ERROR;
+ }
+
+ for (j = 0; j < njs_nitems(njs_test_requests[i].props); j++) {
+ prop = lvlhsh_unit_test_alloc(vm->mem_pool,
+ &njs_test_requests[i].props[j].name,
+ &njs_test_requests[i].props[j].value);
+
+ if (prop == NULL) {
+ njs_printf("lvlhsh_unit_test_alloc() failed\n");
+ return NJS_ERROR;
+ }
+
+ ret = lvlhsh_unit_test_add(&requests[i], prop);
+ if (ret != NJS_OK) {
+ njs_printf("lvlhsh_unit_test_add() failed\n");
+ return NJS_ERROR;
+ }
+ }
+ }
+
+ return NJS_OK;
+}
+
+
+typedef struct {
+ njs_bool_t disassemble;
+ njs_bool_t verbose;
+ njs_bool_t module;
+} njs_opts_t;
+
+
+typedef struct {
+ njs_uint_t passed;
+ njs_uint_t failed;
+} njs_stat_t;
+
+
+static void
+njs_unit_test_report(const char *msg, njs_stat_t *prev, njs_stat_t *current)
+{
+ njs_stat_t stat;
+
+ stat.failed = current->failed - prev->failed;
+ stat.passed = current->passed - prev->passed;
+
+ njs_printf("%s: %s [%d/%d]\n", msg, stat.failed ? "FAILED" : "PASSED",
+ stat.passed, stat.passed + stat.failed);
+}
+
+
+static njs_int_t
+njs_unit_test(njs_unit_test_t tests[], size_t num, const char *name,
+ njs_opts_t *opts, njs_stat_t *stat)
+{
+ u_char *start;
+ njs_vm_t *vm, *nvm;
+ njs_int_t ret, rc;
+ njs_str_t s;
+ njs_uint_t i;
+ njs_stat_t prev;
+ njs_bool_t success;
+ njs_vm_opt_t options;
+
+ vm = NULL;
+ nvm = NULL;
+
+ prev = *stat;
+
+ rc = NJS_ERROR;
+
+ for (i = 0; i < num; i++) {
+
+ if (opts->verbose) {
+ njs_printf("\"%V\"\n", &tests[i].script);
+ }
+
+ njs_memzero(&options, sizeof(njs_vm_opt_t));
+
+ options.module = opts->module;
+
+ vm = njs_vm_create(&options);
+ if (vm == NULL) {
+ njs_printf("njs_vm_create() failed\n");
+ goto done;
+ }
+
+ ret = njs_externals_init(vm);
+ if (ret != NJS_OK) {
+ goto done;
+ }
+
+ start = tests[i].script.start;
+
+ ret = njs_vm_compile(vm, &start, start + tests[i].script.length);
+
+ if (ret == NJS_OK) {
+ if (opts->disassemble) {
+ njs_disassembler(vm);
+ }
+
+ nvm = njs_vm_clone(vm, NULL);
+ if (nvm == NULL) {
+ njs_printf("njs_vm_clone() failed\n");
+ goto done;
+ }
+
+ ret = njs_vm_start(nvm);
+
+ if (njs_vm_retval_string(nvm, &s) != NJS_OK) {
+ njs_printf("njs_vm_retval_string() failed\n");
+ goto done;
+ }
+
+ } else {
+ if (njs_vm_retval_string(vm, &s) != NJS_OK) {
+ njs_printf("njs_vm_retval_string() failed\n");
+ goto done;
+ }
+ }
+
+ success = njs_strstr_eq(&tests[i].ret, &s);
+
+ if (!success) {
+ njs_printf("njs(\"%V\")\nexpected: \"%V\"\n got: \"%V\"\n",
+ &tests[i].script, &tests[i].ret, &s);
+
+ stat->failed++;
+
+ } else {
+ stat->passed++;
+ }
+
+ if (nvm != NULL) {
+ njs_vm_destroy(nvm);
+ nvm = NULL;
+ }
+
+ njs_vm_destroy(vm);
+ vm = NULL;
+ }
+
+ rc = NJS_OK;
+
+done:
+
+ if (nvm != NULL) {
+ njs_vm_destroy(nvm);
+ }
+
+ if (vm != NULL) {
+ njs_vm_destroy(vm);
+ }
+
+ njs_unit_test_report(name, &prev, stat);
+
+ return rc;
+}
+
+
+static njs_int_t
+njs_timezone_optional_test(njs_opts_t *opts, njs_stat_t *stat)
+{
+ size_t size;
+ u_char buf[16];
+ time_t clock;
+ struct tm tm;
+ njs_int_t ret;
+
+ /*
+ * Chatham Islands NZ-CHAT time zone.
+ * Standard time: UTC+12:45, Daylight Saving time: UTC+13:45.
+ */
+ (void) putenv((char *) "TZ=Pacific/Chatham");
+ tzset();
+
+ clock = 0;
+ localtime_r(&clock, &tm);
+
+ size = strftime((char *) buf, sizeof(buf), "%z", &tm);
+
+ if (memcmp(buf, "+1245", size) == 0) {
+ ret = njs_unit_test(njs_tz_test, njs_nitems(njs_tz_test),
+ "timezone tests", opts, stat);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
+ } else {
+ njs_printf("njs timezone tests skipped, timezone is unavailable\n");
+ }
+
+ return NJS_OK;
+}
+
+
+static njs_int_t
+njs_regexp_optional_test(njs_opts_t *opts, njs_stat_t *stat)
+{
+ int erroff;
+ pcre *re1, *re2;
+ njs_ret_t ret;
+ const char *errstr;
+
+ /*
+ * pcre-8.21 crashes when it compiles unicode escape codes inside
+ * square brackets when PCRE_UTF8 option is provided.
+ * Catching it in runtime by compiling it without PCRE_UTF8. Normally it
+ * should return NULL and "character value in \u.... sequence is too large"
+ * error string.
+ */
+ re1 = pcre_compile("/[\\u0410]/", PCRE_JAVASCRIPT_COMPAT, &errstr, &erroff,
+ NULL);
+
+ /*
+ * pcre-7.8 fails to compile unicode escape codes inside square brackets
+ * even when PCRE_UTF8 option is provided.
+ */
+ re2 = pcre_compile("/[\\u0410]/", PCRE_JAVASCRIPT_COMPAT | PCRE_UTF8,
+ &errstr, &erroff, NULL);
+
+ if (re1 == NULL && re2 != NULL) {
+ ret = njs_unit_test(njs_regexp_test, njs_nitems(njs_regexp_test),
+ "unicode regexp tests", opts, stat);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
+ } else {
+ njs_printf("njs unicode regexp tests skipped, libpcre fails\n");
+ }
+
+ if (re1 != NULL) {
+ pcre_free(re1);
+ }
+
+ if (re2 != NULL) {
+ pcre_free(re2);
+ }
+
+ return NJS_OK;
+}
+
+
+static njs_int_t
+njs_vm_json_test(njs_opts_t *opts, njs_stat_t *stat)
+{
+ njs_vm_t *vm;
+ njs_int_t ret, rc;
+ njs_str_t s, *script;
+ njs_uint_t i;
+ njs_bool_t success;
+ njs_stat_t prev;
+ njs_value_t args[3];
+ njs_vm_opt_t options;
+
+ static const njs_str_t fname = njs_str("replacer");
+ static const njs_str_t iname = njs_str("indent");
+
+ static njs_unit_test_t tests[] = {
+ { njs_str("'[1, true, \"x\", {\"a\": {}}]'"),
+ njs_str("[1,true,\"x\",{\"a\":{}}]") },
+ { njs_str("'{\"a\":{\"b\":1}}'"),
+ njs_str("{\"a\":{\"b\":1}}") },
+ { njs_str("'[[[],{}]]'"),
+ njs_str("[[[],{}]]") },
+ { njs_str("var indent = 1; '[]'"),
+ njs_str("[\n \n]") },
+ { njs_str("function replacer(k, v) {return v}; '{\"a\":{\"b\":1}}'"),
+ njs_str("{\"a\":{\"b\":1}}") },
+ { njs_str("function replacer(k, v) {"
+ " return (typeof v === 'string') ? undefined : v};"
+ "'{\"a\":1, \"b\":\"x\"}'"),
+ njs_str("{\"a\":1}") },
+ };
+
+ vm = NULL;
+
+ prev = *stat;
+
+ rc = NJS_ERROR;
+
+ for (i = 0; i < njs_nitems(tests); i++) {
+
+ memset(&options, 0, sizeof(njs_vm_opt_t));
+ options.init = 1;
+
+ vm = njs_vm_create(&options);
+ if (vm == NULL) {
+ njs_printf("njs_vm_create() failed\n");
+ goto done;
+ }
+
+ script = &tests[i].script;
+
+ ret = njs_vm_compile(vm, &script->start,
+ script->start + script->length);
+
+ if (ret != NJS_OK) {
+ njs_printf("njs_vm_compile() failed\n");
+ goto done;
+ }
+
+ ret = njs_vm_start(vm);
+ if (ret != NJS_OK) {
+ njs_printf("njs_vm_run() failed\n");
+ goto done;
+ }
+
+ args[0] = *njs_vm_retval(vm);
+
+ ret = njs_vm_json_parse(vm, args, 1);
+ if (ret != NJS_OK) {
+ njs_printf("njs_vm_json_parse() failed\n");
+ goto done;
+ }
+
+ args[0] = vm->retval;
+ args[1] = *njs_vm_value(vm, &fname);
+ args[2] = *njs_vm_value(vm, &iname);
+
+ ret = njs_vm_json_stringify(vm, args, 3);
+ if (ret != NJS_OK) {
+ njs_printf("njs_vm_json_stringify() failed\n");
+ goto done;
+ }
+
+ if (njs_vm_retval_string(vm, &s) != NJS_OK) {
+ njs_printf("njs_vm_retval_string() failed\n");
+ goto done;
+ }
+
+ success = njs_strstr_eq(&tests[i].ret, &s);
+
+ if (!success) {
+ njs_printf("njs_vm_json_test(\"%V\")\n"
+ "expected: \"%V\"\n got: \"%V\"\n", script,
+ &tests[i].ret, &s);
+
+ stat->failed++;
+
+ } else {
+ stat->passed++;
+ }
+
+ njs_vm_destroy(vm);
+ vm = NULL;
+
+ }
+
+ rc = NJS_OK;
+
+done:
+
+ if (rc != NJS_OK) {
+ if (njs_vm_retval_string(vm, &s) != NJS_OK) {
+ njs_printf("njs_vm_retval_string() failed\n");
+
+ } else {
+ njs_printf("%V\n", &s);
+ }
+ }
+
+ njs_unit_test_report("VM json API tests", &prev, stat);
+
+ if (vm != NULL) {
+ njs_vm_destroy(vm);
+ }
+
+ return rc;
+}
+
+
+static njs_int_t
+njs_vm_object_alloc_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
+{
+ njs_ret_t ret;
+ njs_value_t args[2], obj;
+
+ static const njs_value_t num_key = njs_string("num");
+ static const njs_value_t bool_key = njs_string("bool");
+
+ njs_value_number_set(njs_argument(&args, 0), 1);
+ njs_value_boolean_set(njs_argument(&args, 1), 0);
+
+ ret = njs_vm_object_alloc(vm, &obj, NULL);
+ if (ret != NJS_OK) {
+ return NJS_ERROR;
+ }
+
+ ret = njs_vm_object_alloc(vm, &obj, &num_key, NULL);
+ if (ret == NJS_OK) {
+ return NJS_ERROR;
+ }
+
+ ret = njs_vm_object_alloc(vm, &obj, &num_key, &args[0], NULL);
+ if (ret != NJS_OK) {
+ return NJS_ERROR;
+ }
+
+ ret = njs_vm_object_alloc(vm, &obj, &num_key, &args[0], &bool_key,
+ &args[1], NULL);
+ if (ret != NJS_OK) {
+ stat->failed++;
+ return NJS_OK;
+ }
+
+ stat->passed++;
+
+ return NJS_OK;
+}
+
+
+static njs_int_t
+njs_file_basename_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
+{
+ njs_str_t name;
+ njs_bool_t success;
+ njs_uint_t i;
+
+ static const struct {
+ njs_str_t path;
+ njs_str_t expected;
+ } tests[] = {
+ { njs_str(""), njs_str("") },
+ { njs_str("/"), njs_str("") },
+ { njs_str("/a"), njs_str("a") },
+ { njs_str("///"), njs_str("") },
+ { njs_str("///a"), njs_str("a") },
+ { njs_str("///a/"), njs_str("") },
+ { njs_str("a"), njs_str("a") },
+ { njs_str("a/"), njs_str("") },
+ { njs_str("a//"), njs_str("") },
+ { njs_str("path/name"), njs_str("name") },
+ { njs_str("/path/name"), njs_str("name") },
+ { njs_str("/path/name/"), njs_str("") },
+ };
+
+ for (i = 0; i < njs_nitems(tests); i++) {
+ njs_file_basename(&tests[i].path, &name);
+
+ success = njs_strstr_eq(&tests[i].expected, &name);
+
+ if (!success) {
+ njs_printf("njs_file_basename_test(\"%V\"):\n"
+ "expected: \"%V\"\n got: \"%V\"\n",
+ &tests[i].path, &tests[i].expected, &name);
+
+ stat->failed++;
+
+ } else {
+ stat->passed++;
+ }
+ }
+
+ return NJS_OK;
+}
+
+
+static njs_int_t
+njs_file_dirname_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat)
+{
+ njs_str_t name;
+ njs_bool_t success;
+ njs_uint_t i;
+
+ static const struct {
+ njs_str_t path;
+ njs_str_t expected;
+ } tests[] = {
+ { njs_str(""), njs_str(".") },
+ { njs_str("/"), njs_str("/") },
+ { njs_str("/a"), njs_str("/") },
+ { njs_str("///"), njs_str("///") },
+ { njs_str("///a"), njs_str("///") },
+ { njs_str("///a/"), njs_str("///a") },
+ { njs_str("a"), njs_str(".") },
+ { njs_str("a/"), njs_str("a") },
+ { njs_str("a//"), njs_str("a") },
+ { njs_str("p1/p2/name"), njs_str("p1/p2") },
+ { njs_str("/p1/p2/name"), njs_str("/p1/p2") },
+ { njs_str("/p1/p2///name"), njs_str("/p1/p2") },
+ { njs_str("/p1/p2/name/"), njs_str("/p1/p2/name") },
+ };
+
+ for (i = 0; i < njs_nitems(tests); i++) {
+ njs_file_dirname(&tests[i].path, &name);
+
+ success = njs_strstr_eq(&tests[i].expected, &name);
+
+ if (!success) {
+ njs_printf("njs_file_dirname_test(\"%V\"):\n"
+ "expected: \"%V\"\n got: \"%V\"\n",
+ &tests[i].path, &tests[i].expected, &name);
+
+ stat->failed++;
+ } else {
+ stat->passed++;
+ }
+
+ }
+
+ return NJS_OK;
+}
+
+
+static njs_int_t
+njs_api_test(njs_opts_t *opts, njs_stat_t *stat)
+{
+ njs_vm_t *vm;
+ njs_int_t ret, rc;
+ njs_uint_t i;
+ njs_stat_t prev;
+ njs_vm_opt_t options;
+
+ static const struct {
+ njs_int_t (*test)(njs_vm_t *, njs_opts_t *, njs_stat_t *stat);
+ njs_str_t name;
+ } tests[] = {
+ { njs_vm_object_alloc_test,
+ njs_str("njs_vm_object_alloc_test") },
+ { njs_file_basename_test,
+ njs_str("njs_file_basename_test") },
+ { njs_file_dirname_test,
+ njs_str("njs_file_dirname_test") },
+ };
+
+ vm = NULL;
+ njs_memzero(&options, sizeof(njs_vm_opt_t));
+
+ prev = *stat;
+
+ rc = NJS_ERROR;
+
+ for (i = 0; i < njs_nitems(tests); i++) {
+ vm = njs_vm_create(&options);
+ if (vm == NULL) {
+ njs_printf("njs_vm_create() failed\n");
+ goto done;
+ }
+
+ ret = tests[i].test(vm, opts, stat);
+ if (njs_slow_path(ret != NJS_OK)) {
+ njs_printf("njs_api_test: \"%V\" test failed\n", &tests[i].name);
+ goto done;
+ }
+
+ njs_vm_destroy(vm);
+ vm = NULL;
+ }
+
+ rc = NJS_OK;
+
+done:
+
+ njs_unit_test_report("API tests", &prev, stat);
+
+ if (vm != NULL) {
+ njs_vm_destroy(vm);
+ }
+
+ return rc;
+}
+
+
+int njs_cdecl
+main(int argc, char **argv)
+{
+ njs_int_t ret;
+ njs_opts_t opts;
+ njs_stat_t stat;
+
+ njs_memzero(&opts, sizeof(njs_opts_t));
+
+ if (argc > 1) {
+ switch (argv[1][0]) {
+
+ case 'd':
+ opts.disassemble = 1;
+ break;
+
+ case 'v':
+ opts.verbose = 1;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ (void) putenv((char *) "TZ=UTC");
+ tzset();
+
+ njs_memzero(&stat, sizeof(njs_stat_t));
+
+ ret = njs_unit_test(njs_test, njs_nitems(njs_test), "script tests",
+ &opts, &stat);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
+ ret = njs_timezone_optional_test(&opts, &stat);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
+ ret = njs_regexp_optional_test(&opts, &stat);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
+ ret = njs_vm_json_test(&opts, &stat);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
+ ret = njs_api_test(&opts, &stat);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
+ opts.module = 1;
+
+ ret = njs_unit_test(njs_module_test, njs_nitems(njs_module_test),
+ "module tests", &opts, &stat);
+ if (ret != NJS_OK) {
+ return ret;
+ }
+
+ njs_printf("TOTAL: %s [%ui/%ui]\n", stat.failed ? "FAILED" : "PASSED",
+ stat.passed, stat.passed + stat.failed);
+
+ return stat.failed ? EXIT_FAILURE : EXIT_SUCCESS;
+}
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_sprintf.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_random.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+static njs_int_t
+random_unit_test(void)
+{
+ njs_uint_t n;
+ njs_random_t r;
+
+ njs_random_init(&r, -1);
+
+ r.count = 400000;
+
+ njs_random_add(&r, (u_char *) "arc4random", njs_length("arc4random"));
+
+ /*
+ * Test arc4random() numbers.
+ * RC4 pseudorandom numbers would be 0x4642AFC3 and 0xBAF0FFF0.
+ */
+
+ if (njs_random(&r) == 0xD6270B27) {
+
+ for (n = 100000; n != 0; n--) {
+ (void) njs_random(&r);
+ }
+
+ if (njs_random(&r) == 0x6FCAE186) {
+ njs_printf("random unit test passed\n");
+
+ njs_random_stir(&r, getpid());
+
+ njs_printf("random unit test: 0x%08uXD\n", njs_random(&r));
+
+ return NJS_OK;
+ }
+ }
+
+ njs_printf("random unit test failed\n");
+
+ return NJS_ERROR;
+}
+
+
+int
+main(void)
+{
+ return random_unit_test();
+}
--- /dev/null
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_stub.h>
+#include <njs_sprintf.h>
+#include <njs_str.h>
+#include <njs_rbtree.h>
+#include <njs_murmur_hash.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+typedef struct {
+ NJS_RBTREE_NODE (node);
+ uint32_t key;
+} njs_rbtree_test_t;
+
+
+static intptr_t rbtree_unit_test_comparison(njs_rbtree_node_t *node1,
+ njs_rbtree_node_t *node2);
+static njs_int_t rbtree_unit_test_compare(uint32_t key1, uint32_t key2);
+static int njs_cdecl rbtree_unit_test_sort_cmp(const void *one,
+ const void *two);
+
+
+static njs_int_t
+rbtree_unit_test(njs_uint_t n)
+{
+ void *mark;
+ uint32_t key, *keys;
+ njs_uint_t i;
+ njs_rbtree_t tree;
+ njs_rbtree_node_t *node;
+ njs_rbtree_test_t *items, *item;
+
+ njs_printf("rbtree unit test started: %l nodes\n", (long) n);
+
+ njs_rbtree_init(&tree, rbtree_unit_test_comparison);
+
+ mark = tree.sentinel.right;
+
+ items = malloc(n * sizeof(njs_rbtree_test_t));
+ if (items == NULL) {
+ return NJS_ERROR;
+ }
+
+ keys = malloc(n * sizeof(uint32_t));
+ if (keys == NULL) {
+ free(items);
+ return NJS_ERROR;
+ }
+
+ key = 0;
+
+ for (i = 0; i < n; i++) {
+ key = njs_murmur_hash2(&key, sizeof(uint32_t));
+ keys[i] = key;
+ items[i].key = key;
+ }
+
+ qsort(keys, n, sizeof(uint32_t), rbtree_unit_test_sort_cmp);
+
+ for (i = 0; i < n; i++) {
+ njs_rbtree_insert(&tree, &items[i].node);
+ }
+
+ for (i = 0; i < n; i++) {
+ node = njs_rbtree_find(&tree, &items[i].node);
+
+ if (node != (njs_rbtree_node_t *) &items[i].node) {
+ njs_printf("rbtree unit test failed: %08uXD not found\n",
+ items[i].key);
+ goto fail;
+ }
+ }
+
+ i = 0;
+ node = njs_rbtree_min(&tree);
+
+ while (njs_rbtree_is_there_successor(&tree, node)) {
+
+ item = (njs_rbtree_test_t *) node;
+
+ if (keys[i] != item->key) {
+ njs_printf("rbtree unit test failed: %l: %08uXD %08uXD\n",
+ (long) i, keys[i], item->key);
+ goto fail;
+ }
+
+ i++;
+ node = njs_rbtree_node_successor(&tree, node);
+ }
+
+ if (i != n) {
+ njs_printf("rbtree unit test failed: %l\n", (long) i);
+ goto fail;
+ }
+
+ for (i = 0; i < n; i++) {
+ njs_rbtree_delete(&tree, &items[i].node);
+ njs_memset(&items[i], 0xA5, sizeof(njs_rbtree_test_t));
+ }
+
+ if (!njs_rbtree_is_empty(&tree)) {
+ njs_printf("rbtree unit test failed: tree is not empty\n");
+ goto fail;
+ }
+
+ /* Check that the sentinel callback was not modified. */
+
+ if (mark != tree.sentinel.right) {
+ njs_printf("rbtree sentinel unit test failed\n");
+ goto fail;
+ }
+
+ free(keys);
+ free(items);
+
+ njs_printf("rbtree unit test passed\n");
+
+ return NJS_OK;
+
+fail:
+
+ free(keys);
+ free(items);
+
+ return NJS_ERROR;
+}
+
+
+static intptr_t
+rbtree_unit_test_comparison(njs_rbtree_node_t *node1, njs_rbtree_node_t *node2)
+{
+ njs_rbtree_test_t *item1, *item2;
+
+ item1 = (njs_rbtree_test_t *) node1;
+ item2 = (njs_rbtree_test_t *) node2;
+
+ return rbtree_unit_test_compare(item1->key, item2->key);
+}
+
+
+/*
+ * Subtraction cannot be used in these comparison functions because
+ * the key values are spread uniform in whole 0 .. 2^32 range but are
+ * not grouped around some value as timeout values are.
+ */
+
+static njs_int_t
+rbtree_unit_test_compare(uint32_t key1, uint32_t key2)
+{
+ if (key1 < key2) {
+ return -1;
+ }
+
+ if (key1 == key2) {
+ return 0;
+ }
+
+ return 1;
+}
+
+
+static int njs_cdecl
+rbtree_unit_test_sort_cmp(const void *one, const void *two)
+{
+ const uint32_t *first, *second;
+
+ first = one;
+ second = two;
+
+ if (*first < *second) {
+ return -1;
+ }
+
+ if (*first == *second) {
+ return 0;
+ }
+
+ return 1;
+}
+
+
+int
+main(void)
+{
+ return rbtree_unit_test(1000 * 1000);
+}
* Copyright (C) NGINX, Inc.
*/
-#include <nxt_auto_config.h>
-#include <nxt_types.h>
-#include <nxt_clang.h>
-#include <nxt_sprintf.h>
-#include <nxt_string.h>
-#include <nxt_stub.h>
-#include <nxt_utf8.h>
+#include <njs_auto_config.h>
+#include <njs_types.h>
+#include <njs_clang.h>
+#include <njs_sprintf.h>
+#include <njs_str.h>
+#include <njs_stub.h>
+#include <njs_utf8.h>
#include <string.h>
-#define NXT_UTF8_START_TEST 0xC2
-//#define NXT_UTF8_START_TEST 0
+#define NJS_UTF8_START_TEST 0xC2
+//#define NJS_UTF8_START_TEST 0
static u_char invalid[] = {
};
-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;
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;
}
}
pp = utf8;
- d = nxt_utf8_decode(&pp, utf8 + len);
+ d = njs_utf8_decode(&pp, utf8 + len);
if (d != 0xFFFFFFFF) {
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;
}
}
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;
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>> "}
}
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>> "}
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"}
}
# 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
"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