latest njs
This commit is contained in:
parent
4f9707fe8a
commit
aa5f13475f
440 changed files with 4 additions and 141268 deletions
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/bash
|
||||
./configure \
|
||||
--with-cc-opt="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -D_FORTIFY_SOURCE=2" \
|
||||
--with-ld-opt="-Wl,-z,relro -Wl,-z,now -fPIC" \
|
||||
--with-cc-opt="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -D_FORTIFY_SOURCE=2 -I/tmp/build/quickjs/" \
|
||||
--with-ld-opt="-Wl,-z,relro -Wl,-z,now -fPIC -L/tmp/build/quickjs/" \
|
||||
--sbin-path=/usr/local/sbin/nginx \
|
||||
--conf-path=/video_server/nginx/nginx.conf \
|
||||
--error-log-path=/var/log/nginx/error.log \
|
||||
|
|
@ -51,7 +51,7 @@
|
|||
--add-dynamic-module=./modules_deb/libnginx-mod-http-subs-filter-0.6.4 \
|
||||
--add-dynamic-module=./modules_deb/libnginx-mod-http-upstream-fair-0.0~git20120408.a18b409 \
|
||||
--add-dynamic-module=./modules_deb/libnginx-mod-nchan-1.3.6+dfsg \
|
||||
--add-dynamic-module=./modules_deb/libnginx-mod-js-0.7.9/nginx \
|
||||
--add-dynamic-module=./modules/njs/nginx \
|
||||
--add-module=./modules/media-framework/nginx-common \
|
||||
--add-dynamic-module=./modules/nginx-stream-preread-str-module \
|
||||
--add-dynamic-module=./modules/media-framework/nginx-kmp-in-module \
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@
|
|||
--add-dynamic-module=./modules_deb/libnginx-mod-http-subs-filter-0.6.4 \
|
||||
--add-dynamic-module=./modules_deb/libnginx-mod-http-upstream-fair-0.0~git20120408.a18b409 \
|
||||
--add-dynamic-module=./modules_deb/libnginx-mod-nchan-1.3.6+dfsg \
|
||||
--add-dynamic-module=./modules_deb/libnginx-mod-js-0.7.9/nginx \
|
||||
--add-dynamic-module=./modules/njs/nginx \
|
||||
--add-module=./modules/media-framework/nginx-common \
|
||||
--add-dynamic-module=./modules/nginx-stream-preread-str-module \
|
||||
--add-dynamic-module=./modules/media-framework/nginx-kmp-in-module \
|
||||
|
|
|
|||
4
modules_deb/libnginx-mod-js-0.7.9/.gitignore
vendored
4
modules_deb/libnginx-mod-js-0.7.9/.gitignore
vendored
|
|
@ -1,4 +0,0 @@
|
|||
node_modules/
|
||||
package-lock.json
|
||||
/build/
|
||||
/Makefile
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
/node_modules/
|
||||
package-lock.json
|
||||
^build/
|
||||
^Makefile$
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
cdb8d20935ee96f1fa0c99d994d4b11cefcbc119 0.1.0
|
||||
0039a747d25a3e08792c23c43b75768896724031 0.1.1
|
||||
5b066b4db54c17dc0a9a72948474f36957462e87 0.1.2
|
||||
360449773d51e7f451e5396e27021badc6b86085 0.1.3
|
||||
508689c1fb94c23f6b24be087c1dc63b2f9e6654 0.1.4
|
||||
9c813c2bb2acfd5b6e9d1e9b6699af928baea15a 0.1.5
|
||||
44b524f7e313369cd062a387511ea6fdc427875f 0.1.6
|
||||
15dc54100400f99c3ec044d8fb0175dd3d69adcb 0.1.7
|
||||
a29f29d481125db6101ecdc23dc20187c143cdc9 0.1.8
|
||||
5bd2833988222900f60ad9b330ebc44df3b30662 0.1.9
|
||||
b1456ef3e002376d9d146a8a02acf6a4a21748e9 0.1.10
|
||||
fc5df33f4e6b02a673daf3728ff690fb1e09b95e 0.1.11
|
||||
c07b060396be3622ca97b037a86076b61b850847 0.1.12
|
||||
d548b78eb881ca799aa6fc8ba459d076f7db5ac8 0.1.13
|
||||
d89d06dc638e78f8635c0bfbcd02469ac1a08748 0.1.14
|
||||
215ca47b9167d513fd58ac88de97659377e45275 0.1.15
|
||||
ddd1b2c9c64b2d459e9c399554dfaadcaabcc364 0.2.0
|
||||
2a0a59728b5f197379ca62a334a516fabd4ea392 0.2.1
|
||||
4adbb035caa39dae58611a061d78bc974652231e 0.2.2
|
||||
e83f41520613987542472275d49633a9aa5955d1 0.2.3
|
||||
3e6c38f64bdbc53e783813541559034ed6890aee 0.2.4
|
||||
3315f6aa6000ce6d2dbc74c73660becf4178a549 0.2.5
|
||||
0709b8b4f11ebec95dd4f72d5bb38044682f77e6 0.2.6
|
||||
4624ba4f6497a3d10fe1c0a6f45fb453579502f5 0.2.7
|
||||
ee190d3ace005f8eb063d4763b578f44d3028c68 0.2.8
|
||||
1935ab4643fdaec5b4a8c36070f4d2cb8e3799d7 0.3.0
|
||||
ebfbdb8d8fe2f640d880359575657cb53e38328f 0.3.1
|
||||
82101d50fff6e4c7a92c0542a3d6026ff7e462fb 0.3.2
|
||||
c65a4be9867d434ca449a18d868305d5dcd5b91b 0.3.3
|
||||
8eadbb3a7c7b7c3426f73adabfa251cd9d296752 0.3.4
|
||||
b7fa83f27f1b64443b88c990e1851f59583b2182 0.3.5
|
||||
7b302775917b72537e1abdbd5dc9d04e55a7d582 0.3.6
|
||||
9e5ef927c7eaed003de3e5e4a16fa3eab08de7f7 0.3.7
|
||||
1abb97e9d9dc07dcff2616d4c75132e6d189a6aa 0.3.8
|
||||
fc4eeaaf0dfe7dc7d41232f1b643bd364f1efe82 0.3.9
|
||||
6144aafa1472fbdf79bc9d1f858555938ee08452 0.4.0
|
||||
9400790bf53843001f94c77b47bc99b05518af78 0.4.1
|
||||
b409e86fd02a6f2cb3d741a41b6562471e1b66ef 0.4.2
|
||||
1ada1061a040e5cd5ec55744bfa916dfc6744e4c 0.4.3
|
||||
fdfd580b0dd617a884ed9287d98341ebef03ee9f 0.4.4
|
||||
69f07c6151628880bf7d5ac28bd8287ce96d8a36 0.5.0
|
||||
d355071f55ef4612d89db0ba72e7aaeaa99deef7 0.5.1
|
||||
e5de01378b1a8ab0a94dd3a8c4c6bb7a235f4b9c 0.5.2
|
||||
282b9412976ceee31eb12876f1499fe975e6f08c 0.5.3
|
||||
742ebceef2b5d15febc093172fe6174e427b26c8 0.6.0
|
||||
4adbe67b292af2adc0a6fde4ec6cb95dbba9470a 0.6.1
|
||||
dfba7f61745c7454ffdd55303a793206d0a9a84a 0.6.2
|
||||
8418bd4a4ce3114d57b4d75f913e8c4912bf4b5d 0.7.0
|
||||
35aca5cc5ea7582b80947caa1e3f4a4fb8ee232d 0.7.1
|
||||
3dd315b80bab10b6ac475ee25dd207d2eb759881 0.7.2
|
||||
f15d039cf625fb92e061f21c9f28a788032a0faa 0.7.3
|
||||
b5198f7f11a3b5e174f9e75a7bd50394fa354fb0 0.7.4
|
||||
63c258c456ca018385b13f352faefdf25c7bd3bb 0.7.5
|
||||
461dfb0bb60e531d361319f30993f29860c19f55 0.7.6
|
||||
1592d46d9076aa832b2d37d50b90f5edfca67030 0.7.7
|
||||
3308415d7de83c3c0c7c65405bec4836685a71de 0.7.8
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,28 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2022 NGINX, Inc.
|
||||
* Copyright (C) 2015-2021 Igor Sysoev
|
||||
* Copyright (C) 2017-2022 Dmitry Volyntsev
|
||||
* Copyright (C) 2019-2022 Alexander Borisov
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
|
||||
NGINX JavaScript (njs)
|
||||
----------------------
|
||||
|
||||
njs is a subset of the JavaScript language that allows extending nginx
|
||||
functionality. njs is created in compliance with ECMAScript 5.1 (strict mode)
|
||||
with some ECMAScript 6 and later extensions. The compliance is still evolving.
|
||||
|
||||
The documentation is available online:
|
||||
|
||||
https://nginx.org/en/docs/njs/
|
||||
|
||||
Additional examples and howtos can be found here:
|
||||
|
||||
https://github.com/nginx/njs-examples
|
||||
|
||||
Please ask questions, report issues, and send patches to the mailing list:
|
||||
|
||||
nginx-devel@nginx.org (https://mailman.nginx.org/mailman/listinfo/nginx-devel)
|
||||
|
||||
or via Github:
|
||||
|
||||
https://github.com/nginx/njs
|
||||
|
||||
--
|
||||
NGINX, Inc., https://nginx.com
|
||||
|
||||
|
|
@ -1,193 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
echo checking for C compiler: $CC
|
||||
cat << END >> $NJS_AUTOCONF_ERR
|
||||
----------------------------------------
|
||||
checking for C compiler: $CC
|
||||
END
|
||||
|
||||
|
||||
# Allow error exit status.
|
||||
set +e
|
||||
|
||||
if [ -z `which $CC` ]; then
|
||||
echo
|
||||
echo $0: error: $CC not found.
|
||||
echo
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
|
||||
if `/bin/sh -c "($CC -v)" 2>&1 | grep "gcc version" >> $NJS_AUTOCONF_ERR 2>&1`
|
||||
then
|
||||
NJS_CC_NAME=gcc
|
||||
echo " + using GNU C compiler"
|
||||
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" >> $NJS_AUTOCONF_ERR 2>&1`
|
||||
then
|
||||
NJS_CC_NAME=clang
|
||||
echo " + using Clang C compiler"
|
||||
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" >> $NJS_AUTOCONF_ERR 2>&1`
|
||||
then
|
||||
NJS_CC_NAME=clang
|
||||
echo " + using Clang C compiler"
|
||||
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" >> $NJS_AUTOCONF_ERR 2>&1`
|
||||
then
|
||||
NJS_CC_NAME=SunC
|
||||
echo " + using Sun C compiler"
|
||||
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 # clang
|
||||
fi # gcc
|
||||
|
||||
|
||||
case $NJS_CC_NAME in
|
||||
|
||||
gcc)
|
||||
njs_define=NJS_GCC . auto/define
|
||||
|
||||
NJS_CFLAGS="$NJS_CFLAGS -pipe"
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fPIC"
|
||||
|
||||
# Do not export symbols except explicitly marked with NJS_EXPORT.
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fvisibility=hidden"
|
||||
|
||||
# c99/gnu99 conflict with Solaris XOPEN.
|
||||
#NJS_CFLAGS="$NJS_CFLAGS -std=gnu99"
|
||||
|
||||
NJS_CFLAGS="$NJS_CFLAGS -O"
|
||||
#NJS_CFLAGS="$NJS_CFLAGS -O0"
|
||||
NJS_CFLAGS="$NJS_CFLAGS -W -Wall -Wextra"
|
||||
|
||||
#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.
|
||||
#NJS_CFLAGS="$NJS_CFLAGS -O2"
|
||||
#NJS_CFLAGS="$NJS_CFLAGS -Wno-strict-aliasing"
|
||||
|
||||
#NJS_CFLAGS="$NJS_CFLAGS -fomit-frame-pointer"
|
||||
#NJS_CFLAGS="$NJS_CFLAGS -momit-leaf-frame-pointer"
|
||||
|
||||
# -Wstrict-overflow is supported by GCC 4.2+.
|
||||
#NJS_CFLAGS="$NJS_CFLAGS -Wstrict-overflow=5"
|
||||
|
||||
NJS_CFLAGS="$NJS_CFLAGS -Wmissing-prototypes"
|
||||
|
||||
# Stop on warning.
|
||||
NJS_CFLAGS="$NJS_CFLAGS -Werror"
|
||||
|
||||
# Debug.
|
||||
NJS_CFLAGS="$NJS_CFLAGS -g"
|
||||
|
||||
if [ "$NJS_ADDRESS_SANITIZER" = "YES" ]; then
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fsanitize=address"
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fno-omit-frame-pointer"
|
||||
fi
|
||||
;;
|
||||
|
||||
clang)
|
||||
njs_define=NJS_CLANG . auto/define
|
||||
|
||||
NJS_CFLAGS="$NJS_CFLAGS -pipe"
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fPIC"
|
||||
|
||||
# Do not export symbols except explicitly marked with NJS_EXPORT.
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fvisibility=hidden"
|
||||
|
||||
NJS_CFLAGS="$NJS_CFLAGS -O"
|
||||
#NJS_CFLAGS="$NJS_CFLAGS -O0"
|
||||
NJS_CFLAGS="$NJS_CFLAGS -W -Wall -Wextra"
|
||||
|
||||
#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"
|
||||
|
||||
NJS_CFLAGS="$NJS_CFLAGS -Wmissing-prototypes"
|
||||
|
||||
# Stop on warning.
|
||||
NJS_CFLAGS="$NJS_CFLAGS -Werror"
|
||||
|
||||
# Debug.
|
||||
|
||||
if [ "$NJS_SYSTEM_PLATFORM" != "powerpc" ]; then
|
||||
# "-g" flag causes the "unknown pseudo-op: `.cfi_sections'"
|
||||
# error on PowerPC Clang.
|
||||
NJS_CFLAGS="$NJS_CFLAGS -g"
|
||||
fi
|
||||
|
||||
if [ "$NJS_ADDRESS_SANITIZER" = "YES" ]; then
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fsanitize=address"
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fno-omit-frame-pointer"
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fsanitize-address-use-after-scope"
|
||||
fi
|
||||
;;
|
||||
|
||||
SunC)
|
||||
njs_define=NJS_SUNC . auto/define
|
||||
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fPIC"
|
||||
# Optimization.
|
||||
NJS_CFLAGS="$NJS_CFLAGS -O -fast"
|
||||
# Stop on warning.
|
||||
NJS_CFLAGS="$NJS_CFLAGS -errwarn=%all"
|
||||
# Debug.
|
||||
NJS_CFLAGS="$NJS_CFLAGS -g"
|
||||
|
||||
if [ "$NJS_ADDRESS_SANITIZER" = "YES" ]; then
|
||||
echo " - Address sanitizer is not supported by $NJS_CC_NAME"
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
if [ "$NJS_DEBUG" = "YES" ]; then
|
||||
njs_define=NJS_DEBUG . auto/define
|
||||
fi
|
||||
|
||||
if [ "$NJS_DEBUG_MEMORY" = "YES" ]; then
|
||||
njs_define=NJS_DEBUG_MEMORY . auto/define
|
||||
fi
|
||||
|
||||
if [ "$NJS_DEBUG_OPCODE" = "YES" ]; then
|
||||
njs_define=NJS_DEBUG_OPCODE . auto/define
|
||||
fi
|
||||
|
||||
if [ "$NJS_DEBUG_GENERATOR" = "YES" ]; then
|
||||
njs_define=NJS_DEBUG_GENERATOR . auto/define
|
||||
fi
|
||||
|
||||
if [ "$NJS_TEST262" = "YES" ]; then
|
||||
njs_define=NJS_TEST262 . auto/define
|
||||
fi
|
||||
|
||||
# Stop on error exit status again.
|
||||
set -e
|
||||
|
|
@ -1,207 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
# C language features.
|
||||
|
||||
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
|
||||
|
||||
|
||||
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;
|
||||
return 1;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
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__));
|
||||
|
||||
void *f(void) {
|
||||
return malloc(1);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
if (f() != NULL) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
njs_feature="GCC __attribute__ packed"
|
||||
njs_feature_name=NJS_HAVE_GCC_ATTRIBUTE_PACKED
|
||||
njs_feature_run=no
|
||||
njs_feature_path=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="struct __attribute__((packed)) s { char v; };
|
||||
|
||||
int main(void) {
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
njs_feature="GCC __attribute__ fallthrough"
|
||||
njs_feature_name=NJS_HAVE_GCC_ATTRIBUTE_FALLTHROUGH
|
||||
njs_feature_run=no
|
||||
njs_feature_path=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="int main(int argc, char *argv[]) {
|
||||
switch (argc) {
|
||||
case 0:
|
||||
argc++;
|
||||
__attribute__((fallthrough));
|
||||
default:
|
||||
argc++;
|
||||
}
|
||||
|
||||
return argc;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
njs_feature="Address sanitizer"
|
||||
njs_feature_name=NJS_HAVE_ADDRESS_SANITIZER
|
||||
njs_feature_run=no
|
||||
njs_feature_path=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="int main(void) {
|
||||
return
|
||||
#ifdef __SANITIZE_ADDRESS__
|
||||
0;
|
||||
#else
|
||||
#if defined(__has_feature)
|
||||
#if __has_feature(address_sanitizer)
|
||||
0;
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
njs_feature="_mm_setcsr()"
|
||||
njs_feature_name=NJS_HAVE_DENORMALS_CONTROL
|
||||
njs_feature_run=no
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <xmmintrin.h>
|
||||
int main(void) {
|
||||
_mm_setcsr(_mm_getcsr());
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
|
||||
# Copyright (C) Vadim Zhestikov
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
NJS_HAVE_COMPUTED_GOTO=NO
|
||||
|
||||
|
||||
if [ $NJS_TRY_GOTO = YES ]; then
|
||||
|
||||
njs_feature="Computed goto"
|
||||
njs_feature_name=NJS_HAVE_COMPUTED_GOTO
|
||||
njs_feature_run=no
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="int main(void) {
|
||||
void *ptr;
|
||||
ptr = &&label;
|
||||
goto *ptr;
|
||||
label:
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
fi
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
cat << END >> $NJS_AUTO_CONFIG_H
|
||||
|
||||
#ifndef $njs_define
|
||||
#define $njs_define 1
|
||||
#endif
|
||||
|
||||
END
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
case "$NJS_CC_NAME" in
|
||||
|
||||
SunC):
|
||||
njs_gen_dep_flags() {
|
||||
echo "-xMMD -xMF $NJS_BUILD_DIR/$1.tmp"
|
||||
}
|
||||
|
||||
njs_gen_dep_post() {
|
||||
printf "@sed -e 's#^.*:#$NJS_BUILD_DIR/$2:#' "
|
||||
printf "$NJS_BUILD_DIR/$1.tmp > $NJS_BUILD_DIR/$1"
|
||||
echo " && rm -f $NJS_BUILD_DIR/$1.tmp"
|
||||
}
|
||||
;;
|
||||
|
||||
*)
|
||||
njs_gen_dep_flags() {
|
||||
echo "-MMD -MF $NJS_BUILD_DIR/$1 -MT $NJS_BUILD_DIR/$2"
|
||||
}
|
||||
|
||||
njs_gen_dep_post() {
|
||||
echo ""
|
||||
}
|
||||
;;
|
||||
esac
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
|
||||
# Copyright (C) Dmitry Volyntsev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
njs_found=no
|
||||
|
||||
njs_feature="system byte ordering"
|
||||
njs_feature_name=NJS_BYTE_ORDER
|
||||
njs_feature_run=value
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=-lm
|
||||
njs_feature_test="#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
int main(void) {
|
||||
uint16_t x = 1; /* 0x0001 */
|
||||
printf(\"%s\n\", (*((uint8_t *) &x) == 0) ? \"big\" : \"little\");
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
echo
|
||||
echo "$0: error: cannot detect system byte ordering"
|
||||
echo
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
if [ $njs_feature_value = big ]; then
|
||||
njs_define=NJS_HAVE_BIG_ENDIAN . auto/define
|
||||
|
||||
else
|
||||
njs_define=NJS_HAVE_LITTLE_ENDIAN . auto/define
|
||||
|
||||
fi
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
|
||||
# Copyright (C) Dmitry Volyntsev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
njs_found=no
|
||||
printf "checking for expect ..."
|
||||
|
||||
if /bin/sh -c "(expect -v)" >> $NJS_AUTOCONF_ERR 2>&1; then
|
||||
njs_found=yes
|
||||
fi
|
||||
|
||||
if [ $njs_found = yes ]; then
|
||||
echo " found"
|
||||
echo " + Expect version: `expect -v`"
|
||||
|
||||
else
|
||||
echo " not found"
|
||||
fi
|
||||
|
||||
if [ $njs_found = yes -a $NJS_HAVE_READLINE = YES ]; then
|
||||
cat << END >> $NJS_MAKEFILE
|
||||
|
||||
shell_test: njs test/shell_test.exp
|
||||
INPUTRC=test/inputrc PATH=$NJS_BUILD_DIR:\$(PATH) \
|
||||
expect -f test/shell_test.exp
|
||||
END
|
||||
|
||||
else
|
||||
echo " - expect tests are disabled"
|
||||
|
||||
cat << END >> $NJS_MAKEFILE
|
||||
|
||||
shell_test:
|
||||
@echo "Skipping expect tests"
|
||||
END
|
||||
|
||||
fi
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
# Linux (glibc and musl from 1.1.20), OpenBSD and FreeBSD.
|
||||
|
||||
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) {
|
||||
int r;
|
||||
|
||||
explicit_bzero(&r, sizeof(r));
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
# NetBSD has explicit_memset instead.
|
||||
|
||||
njs_feature="explicit_memset()"
|
||||
njs_feature_name=NJS_HAVE_EXPLICIT_MEMSET
|
||||
njs_feature_test="#include <string.h>
|
||||
|
||||
int main(void) {
|
||||
int r;
|
||||
|
||||
explicit_memset(&r, 0, sizeof(r));
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
fi
|
||||
|
|
@ -1,112 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
printf "checking for $njs_feature ..."
|
||||
|
||||
cat << END >> $NJS_AUTOCONF_ERR
|
||||
----------------------------------------
|
||||
checking for $njs_feature
|
||||
END
|
||||
|
||||
|
||||
njs_found=no
|
||||
njs_feature_value=
|
||||
njs_feature_inc_path=
|
||||
|
||||
if test -n "$njs_feature_incs"; then
|
||||
case "$njs_feature_incs" in
|
||||
-*)
|
||||
njs_feature_inc_path="$njs_feature_incs"
|
||||
;;
|
||||
|
||||
*)
|
||||
for njs_temp in $njs_feature_incs; do
|
||||
njs_feature_inc_path="$njs_feature_inc_path -I $njs_temp"
|
||||
done
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
|
||||
cat << END > $NJS_AUTOTEST.c
|
||||
$njs_feature_test
|
||||
END
|
||||
|
||||
|
||||
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 "($njs_test || true)" >> $NJS_AUTOCONF_ERR 2>&1
|
||||
|
||||
|
||||
if [ -x $NJS_AUTOTEST ]; then
|
||||
|
||||
case "$njs_feature_run" in
|
||||
|
||||
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
|
||||
fi
|
||||
else
|
||||
echo " not found"
|
||||
fi
|
||||
;;
|
||||
|
||||
yes)
|
||||
if /bin/sh -c "($NJS_AUTOTEST)" >> $NJS_AUTOCONF_ERR 2>&1; then
|
||||
echo " found"
|
||||
njs_found=yes
|
||||
cat << END >> $NJS_AUTO_CONFIG_H
|
||||
|
||||
#ifndef $njs_feature_name
|
||||
#define $njs_feature_name 1
|
||||
#endif
|
||||
|
||||
END
|
||||
else
|
||||
echo " found but is not working"
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
echo " found"
|
||||
njs_found=yes
|
||||
cat << END >> $NJS_AUTO_CONFIG_H
|
||||
|
||||
#ifndef $njs_feature_name
|
||||
#define $njs_feature_name 1
|
||||
#endif
|
||||
|
||||
END
|
||||
;;
|
||||
esac
|
||||
|
||||
else
|
||||
echo " not found"
|
||||
|
||||
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 $NJS_AUTOTEST*
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
# Linux 3.17 with glibc 2.25, FreeBSD 12, Solaris 11.3.
|
||||
|
||||
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) {
|
||||
char buf[4];
|
||||
|
||||
if (getrandom(buf, 4, 0) < 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
# Linux 3.17 SYS_getrandom.
|
||||
|
||||
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>
|
||||
|
||||
int main(void) {
|
||||
char buf[4];
|
||||
|
||||
if (syscall(SYS_getrandom, buf, 4, 0) < 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
fi
|
||||
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
# OpenBSD 5.6 lacks <sys/random.h>.
|
||||
|
||||
njs_feature="getentropy()"
|
||||
njs_feature_name=NJS_HAVE_GETENTROPY
|
||||
njs_feature_test="#include <unistd.h>
|
||||
|
||||
int main(void) {
|
||||
char buf[4];
|
||||
|
||||
if (getentropy(buf, 4) == -1) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
fi
|
||||
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
# macOS 10.12.
|
||||
|
||||
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) {
|
||||
char buf[4];
|
||||
|
||||
if (getentropy(buf, 4) == -1) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
fi
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
cat << END
|
||||
|
||||
./configure options:
|
||||
|
||||
--cc=FILE set C compiler filename, default: "$CC"
|
||||
--cc-opt=OPTIONS set additional C compiler options, \
|
||||
default: "$NJS_CC_OPT"
|
||||
--ld-opt=OPTIONS set additional linker options, \
|
||||
default: "$NJS_LD_OPT"
|
||||
--ar=FILE set static linking program, default: "$AR"
|
||||
|
||||
--build-dir=DIR set build directory, default: "$NJS_BUILD_DIR"
|
||||
|
||||
--no-pcre disables PCRE/PCRE2 discovery for RegExp
|
||||
backend. This flag allows to build PCRE/PCRE2
|
||||
outside of libnjs.a. When this option is enabled
|
||||
functions described in njs_regex.h are not built.
|
||||
Instead this functions are expected to be provided
|
||||
while linking.
|
||||
|
||||
--no-pcre2 disables PCRE2 discovery for RegExp backend.
|
||||
When this option is enabled only PCRE library
|
||||
is discovered.
|
||||
|
||||
--no-goto disables computed goto discovery.
|
||||
When this option is enabled 'switch' statement
|
||||
will be always used in instead of computed goto.
|
||||
|
||||
--no-openssl disables OpenSSL discovery. When this option is
|
||||
enabled OpenSSL dependant code is not built as a
|
||||
part of libnjs.a.
|
||||
|
||||
--address-sanitizer=YES enables build with address sanitizer, \
|
||||
default: "$NJS_ADDRESS_SANITIZER"
|
||||
--addr2line=YES enables native function symbolization, \
|
||||
default: "$NJS_ADDR2LINE"
|
||||
--debug=YES enables additional runtime checks, \
|
||||
default: "$NJS_DEBUG"
|
||||
--debug-memory=YES enables memory alloc debug, \
|
||||
default: "$NJS_DEBUG_MEMORY"
|
||||
--debug-opcode=YES enables runtime function tracing, \
|
||||
default: "$NJS_DEBUG_OPCODE"
|
||||
--debug-generator=YES enables generator debug, \
|
||||
default: "$NJS_DEBUG_GENERATOR"
|
||||
--test262=YES enables test262 extentions, \
|
||||
default: "$NJS_TEST262"
|
||||
END
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
|
||||
# Copyright (C) Dmitry Volyntsev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
# Initialize variables with null values if they are not defined.
|
||||
CFLAGS=${CFLAGS=}
|
||||
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}
|
||||
NJS_CFLAGS=${NJS_CFLAGS=}
|
||||
|
||||
NJS_BUILD_DIR=${NJS_BUILD_DIR:-build}
|
||||
|
||||
NJS_LIB_MODULES=
|
||||
|
||||
NJS_LIBRT=
|
||||
|
||||
njs_regex_cont=' \\\
|
||||
'
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
# Copyright (C) Dmitry Volyntsev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
NJS_HAVE_LIBBFD=NO
|
||||
|
||||
if [ $NJS_ADDR2LINE = YES ]; then
|
||||
njs_found=no
|
||||
|
||||
njs_feature="BFD library"
|
||||
njs_feature_name=NJS_HAVE_LIBBFD
|
||||
njs_feature_run=yes
|
||||
njs_feature_incs=
|
||||
njs_feature_libs="-lbfd"
|
||||
njs_feature_test="#include <bfd.h>
|
||||
|
||||
int main() {
|
||||
bfd_init();
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
njs_feature="OpenSSL library -lcrypto"
|
||||
njs_feature_libs="-lcrypto"
|
||||
|
||||
. auto/feature
|
||||
fi
|
||||
|
||||
|
||||
if [ $njs_found = yes ]; then
|
||||
NJS_HAVE_LIBBFD=YES
|
||||
NJS_LIB_AUX_LIBS="$NJS_LIB_AUX_LIBS $njs_feature_libs"
|
||||
fi
|
||||
fi
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
|
||||
# Copyright (C) Dmitry Volyntsev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
NJS_HAVE_DL_ITERATE_PHDR=NO
|
||||
|
||||
if [ $NJS_ADDR2LINE = YES ]; then
|
||||
njs_feature="dl_iterate_phdr()"
|
||||
njs_feature_name=NJS_HAVE_DL_ITERATE_PHDR
|
||||
njs_feature_run=yes
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#define _GNU_SOURCE
|
||||
#include <link.h>
|
||||
|
||||
static int
|
||||
cb(struct dl_phdr_info *info, size_t size, void *data) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main() {
|
||||
dl_iterate_phdr(cb, 0);
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
if [ $njs_found = yes ]; then
|
||||
NJS_HAVE_DL_ITERATE_PHDR=YES
|
||||
fi
|
||||
fi
|
||||
|
|
@ -1,343 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
. auto/deps
|
||||
|
||||
echo "creating $NJS_MAKEFILE"
|
||||
|
||||
mkdir -p $NJS_BUILD_DIR/src
|
||||
mkdir -p $NJS_BUILD_DIR/external
|
||||
mkdir -p $NJS_BUILD_DIR/$NJS_BUILD_DIR
|
||||
mkdir -p $NJS_BUILD_DIR/test
|
||||
|
||||
njs_modules_c=$NJS_BUILD_DIR/njs_modules.c
|
||||
|
||||
NJS_LIB_SRCS="$NJS_LIB_SRCS $njs_modules_c"
|
||||
|
||||
njs_incs=`echo $NJS_LIB_INCS \
|
||||
| sed -e "s# *\([^ ]*\)#$njs_regex_cont-I\1#g"`
|
||||
njs_objs=`echo $NJS_LIB_SRCS \
|
||||
| sed -e "s# *\([^ ]*\.\)c#$NJS_BUILD_DIR/\1o$njs_regex_cont#g"`
|
||||
|
||||
cat << END > $njs_modules_c
|
||||
|
||||
#include <njs_main.h>
|
||||
|
||||
END
|
||||
|
||||
for mod in $NJS_LIB_MODULES
|
||||
do
|
||||
echo "extern njs_module_t $mod;" >> $njs_modules_c
|
||||
done
|
||||
|
||||
echo >> $njs_modules_c
|
||||
echo 'njs_module_t *njs_modules[] = {' >> $njs_modules_c
|
||||
|
||||
for mod in $NJS_LIB_MODULES
|
||||
do
|
||||
echo " &$mod," >> $njs_modules_c
|
||||
done
|
||||
|
||||
cat << END >> $njs_modules_c
|
||||
NULL
|
||||
};
|
||||
|
||||
END
|
||||
|
||||
cat << END > $NJS_MAKEFILE
|
||||
|
||||
# This file is auto-generated by configure
|
||||
|
||||
NJS_CC = ${CC}
|
||||
NJS_STATIC_LINK = ${AR} -r -c
|
||||
NJS_LINK = ${CC} ${NJS_LD_OPT}
|
||||
NJS_CFLAGS = ${NJS_CFLAGS} ${NJS_CC_OPT} ${CFLAGS}
|
||||
|
||||
NJS_VER = $(grep NJS_VERSION src/njs.h | sed -e 's/.*"\(.*\)".*/\1/')
|
||||
NJS_TYPES_VER = \$(NJS_VER)
|
||||
|
||||
NPM = npm
|
||||
|
||||
default: njs
|
||||
|
||||
NJS_LIB_INCS = $njs_incs
|
||||
NJS_LIB_OBJS = $njs_objs
|
||||
|
||||
libnjs: $NJS_BUILD_DIR/libnjs.a pc
|
||||
|
||||
$NJS_BUILD_DIR/libnjs.a: \\
|
||||
$NJS_BUILD_DIR/njs_auto_config.h \\
|
||||
\$(NJS_LIB_OBJS)
|
||||
|
||||
\$(NJS_STATIC_LINK) $NJS_BUILD_DIR/libnjs.a \\
|
||||
\$(NJS_LIB_OBJS)
|
||||
END
|
||||
|
||||
# object files.
|
||||
|
||||
for njs_src in $NJS_LIB_SRCS
|
||||
do
|
||||
njs_obj="${njs_src%.c}.o"
|
||||
njs_dep="${njs_src%.c}.dep"
|
||||
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 $NJS_BUILD_DIR/$njs_dep
|
||||
|
||||
END
|
||||
|
||||
done
|
||||
|
||||
# njs cli.
|
||||
|
||||
cat << END >> $NJS_MAKEFILE
|
||||
|
||||
$NJS_BUILD_DIR/njs: \\
|
||||
$NJS_BUILD_DIR/libnjs.a \\
|
||||
src/njs_shell.c
|
||||
\$(NJS_LINK) -o $NJS_BUILD_DIR/njs \$(NJS_CFLAGS) \\
|
||||
$NJS_LIB_AUX_CFLAGS \$(NJS_LIB_INCS) -Injs \\
|
||||
src/njs_shell.c \\
|
||||
$NJS_BUILD_DIR/libnjs.a \\
|
||||
$NJS_LD_OPT -lm $NJS_LIBS $NJS_LIB_AUX_LIBS $NJS_READLINE_LIB
|
||||
|
||||
END
|
||||
|
||||
# njs fuzzer.
|
||||
|
||||
cat << END >> $NJS_MAKEFILE
|
||||
|
||||
$NJS_BUILD_DIR/njs_process_script_fuzzer.o: \\
|
||||
src/njs_shell.c
|
||||
\$(NJS_CC) -c \$(CFLAGS) $NJS_LIB_AUX_CFLAGS \\
|
||||
\$(NJS_LIB_INCS) -Injs \\
|
||||
-DNJS_FUZZER_TARGET \\
|
||||
-o $NJS_BUILD_DIR/njs_process_script_fuzzer.o \\
|
||||
src/njs_shell.c
|
||||
|
||||
$NJS_BUILD_DIR/njs_process_script_fuzzer: \\
|
||||
$NJS_BUILD_DIR/libnjs.a \\
|
||||
$NJS_BUILD_DIR/njs_process_script_fuzzer.o
|
||||
\$(CXX) \$(CXXFLAGS) -o $NJS_BUILD_DIR/njs_process_script_fuzzer \\
|
||||
$NJS_LIB_AUX_CFLAGS \$(NJS_LIB_INCS) -Injs \\
|
||||
\$(LIB_FUZZING_ENGINE) \\
|
||||
$NJS_BUILD_DIR/njs_process_script_fuzzer.o \\
|
||||
$NJS_BUILD_DIR/libnjs.a \\
|
||||
-lm $NJS_LIBS $NJS_LIB_AUX_LIBS
|
||||
|
||||
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_LINK) -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 $NJS_LD_OPT
|
||||
|
||||
-include $NJS_BUILD_DIR/$njs_dep
|
||||
|
||||
END
|
||||
|
||||
done
|
||||
|
||||
|
||||
# njs tests.
|
||||
|
||||
njs_src="src/test/njs_externals_test.c"
|
||||
fname=$(basename $njs_src)
|
||||
njs_externals_obj="test/${fname%.c}.o"
|
||||
njs_dep="test/${fname%.c}.dep"
|
||||
njs_dep_flags=`njs_gen_dep_flags $njs_dep $njs_externals_obj`
|
||||
njs_dep_post=`njs_gen_dep_post $njs_dep $njs_externals_obj`
|
||||
|
||||
cat << END >> $NJS_MAKEFILE
|
||||
|
||||
$NJS_BUILD_DIR/$njs_externals_obj: \\
|
||||
$njs_src
|
||||
\$(NJS_CC) -c \$(NJS_CFLAGS) $NJS_LIB_AUX_CFLAGS \\
|
||||
\$(NJS_LIB_INCS) -Injs \\
|
||||
-o $NJS_BUILD_DIR/$njs_externals_obj \\
|
||||
$njs_dep_flags \\
|
||||
$njs_src
|
||||
$njs_dep_post
|
||||
|
||||
-include $NJS_BUILD_DIR/$njs_dep
|
||||
|
||||
END
|
||||
|
||||
for njs_src in $NJS_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_BUILD_DIR/$njs_externals_obj
|
||||
\$(NJS_LINK) -o $NJS_BUILD_DIR/$njs_bin \$(NJS_CFLAGS) \\
|
||||
$NJS_LIB_AUX_CFLAGS \$(NJS_LIB_INCS) \\
|
||||
$njs_dep_flags \\
|
||||
$NJS_BUILD_DIR/$njs_externals_obj \\
|
||||
-Injs $njs_src $NJS_BUILD_DIR/libnjs.a \\
|
||||
$NJS_LD_OPT -lm $NJS_LIBS $NJS_LIB_AUX_LIBS
|
||||
$njs_dep_post
|
||||
|
||||
-include $NJS_BUILD_DIR/$njs_dep
|
||||
|
||||
END
|
||||
|
||||
done
|
||||
|
||||
# main targets.
|
||||
|
||||
cat << END >> $NJS_MAKEFILE
|
||||
|
||||
$NJS_BUILD_DIR/njs_auto_config.h:
|
||||
@echo
|
||||
@echo " Please run ./configure before make"
|
||||
@echo
|
||||
@exit 1
|
||||
|
||||
all: $NJS_BUILD_DIR/njs_auto_config.h \\
|
||||
njs ts test lib_test benchmark
|
||||
|
||||
njs: $NJS_BUILD_DIR/njs_auto_config.h $NJS_BUILD_DIR/njs
|
||||
njs_fuzzer: $NJS_BUILD_DIR/njs_auto_config.h \\
|
||||
$NJS_BUILD_DIR/njs_process_script_fuzzer
|
||||
|
||||
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/unicode_unit_test
|
||||
|
||||
$NJS_BUILD_DIR/random_unit_test
|
||||
$NJS_BUILD_DIR/rbtree_unit_test
|
||||
$NJS_BUILD_DIR/lvlhsh_unit_test
|
||||
$NJS_BUILD_DIR/unicode_unit_test
|
||||
|
||||
test262: njs
|
||||
|
||||
test/test262 --binary=$NJS_BUILD_DIR/njs
|
||||
|
||||
unit_test: $NJS_BUILD_DIR/njs_auto_config.h \\
|
||||
$NJS_BUILD_DIR/njs_unit_test
|
||||
|
||||
$NJS_BUILD_DIR/njs_unit_test
|
||||
|
||||
test: shell_test unit_test test262
|
||||
|
||||
benchmark: $NJS_BUILD_DIR/njs_auto_config.h \\
|
||||
$NJS_BUILD_DIR/njs_benchmark
|
||||
|
||||
$NJS_BUILD_DIR/njs_benchmark
|
||||
|
||||
dist:
|
||||
rm -rf njs-\$(NJS_VER) \\
|
||||
&& hg archive njs-\$(NJS_VER).tar.gz \\
|
||||
-p njs-\$(NJS_VER) \\
|
||||
-X ".hg*" \\
|
||||
&& echo njs-\$(NJS_VER).tar.gz done
|
||||
END
|
||||
|
||||
njs_ts_deps=`echo $NJS_TS_SRCS \
|
||||
| sed -e "s# *\([^ ][^ ]*\)#\1$njs_regex_cont#g"`
|
||||
|
||||
njs_test_ts_deps=`echo $NJS_TEST_TS_SRCS \
|
||||
| sed -e "s# *\([^ ][^ ]*\)#\1$njs_regex_cont#g"`
|
||||
|
||||
cat << END >> $NJS_MAKEFILE
|
||||
|
||||
$NJS_BUILD_DIR/ts/package.json: $njs_ts_deps
|
||||
cp -fr ts $NJS_BUILD_DIR/
|
||||
cp LICENSE $NJS_BUILD_DIR/ts/
|
||||
sed 's/__VERSION__/"\$(NJS_TYPES_VER)"/' \\
|
||||
ts/package.json > $NJS_BUILD_DIR/ts/package.json
|
||||
|
||||
$NJS_BUILD_DIR/ts/node_modules: $NJS_BUILD_DIR/ts/package.json
|
||||
cd $NJS_BUILD_DIR/ts && \$(NPM) install
|
||||
touch $NJS_BUILD_DIR/ts/node_modules
|
||||
|
||||
$NJS_BUILD_DIR/njs-types-\$(NJS_TYPES_VER).tgz: $NJS_BUILD_DIR/ts/package.json
|
||||
hg id -i > $NJS_BUILD_DIR/ts/COMMITHASH || true
|
||||
cd $NJS_BUILD_DIR && \$(NPM) pack ./ts
|
||||
|
||||
.PHONY: ts
|
||||
ts: $NJS_BUILD_DIR/ts/package.json
|
||||
|
||||
ts_lint: $NJS_BUILD_DIR/ts/node_modules
|
||||
cd $NJS_BUILD_DIR/ts && \$(NPM) run lint
|
||||
|
||||
$NJS_BUILD_DIR/test/ts/package.json: $njs_test_ts_deps
|
||||
mkdir -p $NJS_BUILD_DIR/test
|
||||
cp -fr test/ts $NJS_BUILD_DIR/test/
|
||||
|
||||
$NJS_BUILD_DIR/test/ts/node_modules: \\
|
||||
$NJS_BUILD_DIR/njs-types-\$(NJS_TYPES_VER).tgz \\
|
||||
$NJS_BUILD_DIR/test/ts/package.json
|
||||
cd $NJS_BUILD_DIR/test/ts && \$(NPM) install \\
|
||||
--save-dev file:../../njs-types-\$(NJS_TYPES_VER).tgz
|
||||
cd $NJS_BUILD_DIR/test/ts && \$(NPM) install
|
||||
touch $NJS_BUILD_DIR/test/ts/node_modules
|
||||
|
||||
ts_test: $NJS_BUILD_DIR/test/ts/node_modules
|
||||
cd $NJS_BUILD_DIR/test/ts && \$(NPM) test
|
||||
|
||||
ts_publish: ts_clean $NJS_BUILD_DIR/njs-types-\$(NJS_TYPES_VER).tgz
|
||||
cd $NJS_BUILD_DIR/ && \$(NPM) publish njs-types-\$(NJS_TYPES_VER).tgz
|
||||
|
||||
ts_clean:
|
||||
rm -rf $NJS_BUILD_DIR/ts
|
||||
END
|
||||
|
||||
# pkg-config file
|
||||
cat << END >> $NJS_MAKEFILE
|
||||
|
||||
pc: $NJS_BUILD_DIR/njs.pc
|
||||
|
||||
$NJS_BUILD_DIR/njs.pc: $NJS_BUILD_DIR/njs_auto_config.h
|
||||
sed -e "s,@PREFIX@,$(pwd)/$NJS_BUILD_DIR," \\
|
||||
-e "s,@LIBDIR@,$(pwd)/$NJS_BUILD_DIR," \\
|
||||
-e "s,@CFLAGS@,-I$(pwd)/$NJS_BUILD_DIR -I$(pwd)/src," \\
|
||||
-e "s,@VERSION@,\$(NJS_VER)," \\
|
||||
-e "s,@EXTRA_LIBS@,-lm $NJS_LIBS $NJS_LIB_AUX_LIBS," \\
|
||||
src/njs.pc.in > \$@
|
||||
END
|
||||
|
||||
# Makefile.
|
||||
|
||||
cat << END > Makefile
|
||||
|
||||
# This file is auto-generated by configure
|
||||
|
||||
include $NJS_MAKEFILE
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -rf $NJS_BUILD_DIR Makefile
|
||||
|
||||
END
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
# Linux glibc 2.1.91, FreeBSD 7.0, Solaris 11,
|
||||
# MacOSX 10.6 (Snow Leopard), NetBSD 5.0.
|
||||
|
||||
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;
|
||||
|
||||
if (posix_memalign(&p, 4096, 4096) != 0)
|
||||
return 1;
|
||||
|
||||
free(p);
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
# Solaris, HP-UX.
|
||||
|
||||
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;
|
||||
|
||||
p = memalign(4096, 4096);
|
||||
if (p == NULL)
|
||||
return 1;
|
||||
|
||||
free(p);
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
fi
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
# Copyright (C) Dmitry Volyntsev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
NJS_LIB_MODULES="$NJS_LIB_MODULES $njs_module_name"
|
||||
NJS_LIB_SRCS="$NJS_LIB_SRCS $njs_module_srcs"
|
||||
NJS_LIB_INCS="$NJS_LIB_INCS $njs_module_incs"
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
# Copyright (C) Dmitry Volyntsev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
njs_module_name=njs_buffer_module
|
||||
njs_module_incs=
|
||||
njs_module_srcs=src/njs_buffer.c
|
||||
|
||||
. auto/module
|
||||
|
||||
njs_module_name=njs_crypto_module
|
||||
njs_module_incs=
|
||||
njs_module_srcs=external/njs_crypto_module.c
|
||||
|
||||
. auto/module
|
||||
|
||||
if [ $NJS_OPENSSL = YES -a $NJS_HAVE_OPENSSL = YES ]; then
|
||||
njs_module_name=njs_webcrypto_module
|
||||
njs_module_incs=
|
||||
njs_module_srcs=external/njs_webcrypto_module.c
|
||||
|
||||
. auto/module
|
||||
fi
|
||||
|
||||
njs_module_name=njs_fs_module
|
||||
njs_module_incs=
|
||||
njs_module_srcs=external/njs_fs_module.c
|
||||
|
||||
. auto/module
|
||||
|
||||
njs_module_name=njs_query_string_module
|
||||
njs_module_incs=
|
||||
njs_module_srcs=external/njs_query_string_module.c
|
||||
|
||||
. auto/module
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
|
||||
# Copyright (C) Dmitry Volyntsev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
NJS_OPENSSL_LIB=
|
||||
NJS_HAVE_OPENSSL=NO
|
||||
|
||||
if [ $NJS_OPENSSL = YES ]; then
|
||||
njs_found=no
|
||||
|
||||
njs_feature="OpenSSL library"
|
||||
njs_feature_name=NJS_HAVE_OPENSSL
|
||||
njs_feature_run=yes
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=""
|
||||
njs_feature_test="#include <openssl/evp.h>
|
||||
|
||||
int main() {
|
||||
EVP_CIPHER_CTX *ctx;
|
||||
ctx = EVP_CIPHER_CTX_new();
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
njs_feature="OpenSSL library -lcrypto"
|
||||
njs_feature_libs="-lcrypto"
|
||||
|
||||
. auto/feature
|
||||
fi
|
||||
|
||||
|
||||
if [ $njs_found = yes ]; then
|
||||
njs_feature="OpenSSL version"
|
||||
njs_feature_name=NJS_OPENSSL_VERSION
|
||||
njs_feature_run=value
|
||||
njs_feature_test="#include <openssl/ssl.h>
|
||||
|
||||
int main() {
|
||||
printf(\"\\\"%s\\\"\", OPENSSL_VERSION_TEXT);
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
NJS_HAVE_OPENSSL=YES
|
||||
NJS_OPENSSL_LIB="$njs_feature_libs"
|
||||
NJS_LIB_AUX_LIBS="$NJS_LIB_AUX_LIBS $njs_feature_libs"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
NJS_CC_OPT=${NJS_CC_OPT:--O}
|
||||
NJS_LD_OPT=${NJS_CC_OPT:--O}
|
||||
|
||||
NJS_DEBUG=NO
|
||||
NJS_DEBUG_MEMORY=NO
|
||||
NJS_DEBUG_OPCODE=NO
|
||||
NJS_DEBUG_GENERATOR=NO
|
||||
|
||||
NJS_ADDRESS_SANITIZER=NO
|
||||
NJS_ADDR2LINE=NO
|
||||
NJS_TEST262=YES
|
||||
|
||||
NJS_OPENSSL=YES
|
||||
|
||||
NJS_PCRE=YES
|
||||
NJS_TRY_PCRE2=YES
|
||||
|
||||
NJS_TRY_GOTO=YES
|
||||
|
||||
NJS_CONFIGURE_OPTIONS=
|
||||
|
||||
for njs_option
|
||||
do
|
||||
case "$njs_option" in
|
||||
-*=*) value=`echo "$njs_option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) value="" ;;
|
||||
esac
|
||||
|
||||
case "$njs_option" in
|
||||
--cc=*) CC="$value" ;;
|
||||
--cc-opt=*) NJS_CC_OPT="$value" ;;
|
||||
--ld-opt=*) NJS_LD_OPT="$value" ;;
|
||||
--ar=*) AR="$value" ;;
|
||||
|
||||
--build-dir=*) NJS_BUILD_DIR="$value" ;;
|
||||
|
||||
--address-sanitizer=*) NJS_ADDRESS_SANITIZER="$value" ;;
|
||||
--addr2line=*) NJS_ADDR2LINE="$value" ;;
|
||||
--debug=*) NJS_DEBUG="$value" ;;
|
||||
--debug-memory=*) NJS_DEBUG_MEMORY="$value" ;;
|
||||
--debug-opcode=*) NJS_DEBUG_OPCODE="$value" ;;
|
||||
--debug-generator=*) NJS_DEBUG_GENERATOR="$value" ;;
|
||||
--test262=*) NJS_TEST262="$value" ;;
|
||||
|
||||
--no-openssl) NJS_OPENSSL=NO ;;
|
||||
|
||||
--no-pcre) NJS_PCRE=NO ;;
|
||||
--no-pcre2) NJS_TRY_PCRE2=NO ;;
|
||||
|
||||
--no-goto) NJS_TRY_GOTO=NO ;;
|
||||
|
||||
--help)
|
||||
. auto/help
|
||||
exit 0
|
||||
;;
|
||||
|
||||
*)
|
||||
echo
|
||||
echo $0: error: invalid option \"$njs_option\".
|
||||
echo Run \"$0 --help\" to see available options.
|
||||
echo
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
njs_opt=`echo $njs_option | sed -e "s/\(--[^=]*=\)\(.* .*\)/\1'\2'/"`
|
||||
|
||||
NJS_CONFIGURE_OPTIONS="$NJS_CONFIGURE_OPTIONS $njs_opt"
|
||||
|
||||
done
|
||||
|
||||
if [ "$NJS_DEBUG_MEMORY" = "YES" ]; then
|
||||
NJS_DEBUG=YES
|
||||
fi
|
||||
|
||||
if [ "$NJS_DEBUG_OPCODE" = "YES" ]; then
|
||||
NJS_ADDR2LINE=YES
|
||||
fi
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
NJS_SYSTEM=`uname -s 2>/dev/null`
|
||||
|
||||
|
||||
case "$NJS_SYSTEM" in
|
||||
|
||||
Linux)
|
||||
njs_define=NJS_LINUX . auto/define
|
||||
NJS_SYSTEM_VERSION=`uname -r 2>/dev/null`
|
||||
# Linux uname -p can return "unknown".
|
||||
NJS_SYSTEM_PLATFORM=`uname -m 2>/dev/null`
|
||||
CC=${CC:-cc}
|
||||
;;
|
||||
|
||||
FreeBSD | NetBSD | OpenBSD)
|
||||
NJS_SYSTEM_VERSION=`uname -r 2>/dev/null`
|
||||
NJS_SYSTEM_PLATFORM=`uname -m 2>/dev/null`
|
||||
CC=${CC:-cc}
|
||||
;;
|
||||
|
||||
SunOS)
|
||||
njs_define=NJS_SOLARIS . auto/define
|
||||
NJS_SYSTEM_VERSION=`uname -r 2>/dev/null`
|
||||
NJS_SYSTEM_PLATFORM=`uname -p 2>/dev/null`
|
||||
CC=${CC:-gcc}
|
||||
;;
|
||||
|
||||
Darwin)
|
||||
NJS_SYSTEM_VERSION=`uname -r 2>/dev/null`
|
||||
NJS_SYSTEM_PLATFORM=`uname -m 2>/dev/null`
|
||||
CC=${CC:-cc}
|
||||
;;
|
||||
|
||||
*)
|
||||
NJS_SYSTEM_VERSION=`uname -r 2>/dev/null`
|
||||
NJS_SYSTEM_PLATFORM=`uname -p 2>/dev/null`
|
||||
CC=${CC:-gcc}
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
echo configuring for $NJS_SYSTEM $NJS_SYSTEM_VERSION $NJS_SYSTEM_PLATFORM
|
||||
|
|
@ -1,139 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
NJS_PCRE_CFLAGS=
|
||||
NJS_PCRE_LIB=
|
||||
|
||||
NJS_HAVE_PCRE=NO
|
||||
|
||||
if [ $NJS_PCRE = YES ]; then
|
||||
|
||||
njs_found=no
|
||||
|
||||
if [ $NJS_TRY_PCRE2 = YES ]; then
|
||||
|
||||
njs_feature="PCRE2 library"
|
||||
njs_feature_name=NJS_HAVE_PCRE2
|
||||
njs_feature_run=no
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#define PCRE2_CODE_UNIT_WIDTH 8
|
||||
#include <pcre2.h>
|
||||
|
||||
int main(void) {
|
||||
pcre2_code *re;
|
||||
|
||||
re = pcre2_compile((PCRE2_SPTR)\"\",
|
||||
PCRE2_ZERO_TERMINATED, 0,
|
||||
NULL, NULL, NULL);
|
||||
return (re == NULL);
|
||||
}"
|
||||
|
||||
. auto/feature
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
# pcre2-config
|
||||
|
||||
if /bin/sh -c "(pcre2-config --version)" >> $NJS_AUTOCONF_ERR 2>&1; then
|
||||
|
||||
NJS_PCRE_CFLAGS=`pcre2-config --cflags`
|
||||
NJS_PCRE_LIB=`pcre2-config --libs8`
|
||||
|
||||
njs_feature="PCRE2 library in `pcre2-config --prefix 2>/dev/null`"
|
||||
njs_feature_incs=$NJS_PCRE_CFLAGS
|
||||
njs_feature_libs=$NJS_PCRE_LIB
|
||||
|
||||
. auto/feature
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
if [ $njs_found = yes ]; then
|
||||
njs_feature="PCRE2 version"
|
||||
njs_feature_name=NJS_PCRE2_VERSION
|
||||
njs_feature_run=value
|
||||
njs_feature_test="#define PCRE2_CODE_UNIT_WIDTH 8
|
||||
#include <pcre2.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void) {
|
||||
printf(\"%d.%d\", PCRE2_MAJOR, PCRE2_MINOR);
|
||||
return 0;
|
||||
}"
|
||||
|
||||
. auto/feature
|
||||
|
||||
NJS_HAVE_PCRE=YES
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
njs_feature="PCRE library"
|
||||
njs_feature_name=NJS_HAVE_PCRE
|
||||
njs_feature_run=no
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <pcre.h>
|
||||
|
||||
int main(void) {
|
||||
pcre *re;
|
||||
|
||||
re = pcre_compile(NULL, 0, NULL, 0, NULL);
|
||||
if (re == NULL)
|
||||
return 1;
|
||||
return 0;
|
||||
}"
|
||||
|
||||
. auto/feature
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
# pcre-config
|
||||
|
||||
njs_pcre_prefix=`pcre-config --prefix 2>/dev/null`
|
||||
|
||||
if [ -n "$njs_pcre_prefix" ]; then
|
||||
|
||||
NJS_PCRE_CFLAGS=`pcre-config --cflags`
|
||||
NJS_PCRE_LIB=`pcre-config --libs`
|
||||
|
||||
njs_feature="PCRE library in $njs_pcre_prefix"
|
||||
njs_feature_incs="$NJS_PCRE_CFLAGS"
|
||||
njs_feature_libs=$NJS_PCRE_LIB
|
||||
|
||||
. auto/feature
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $njs_found = yes ]; then
|
||||
njs_feature="PCRE version"
|
||||
njs_feature_name=NJS_PCRE_VERSION
|
||||
njs_feature_run=value
|
||||
njs_feature_test="#include <pcre.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void) {
|
||||
printf(\"%d.%d\", PCRE_MAJOR, PCRE_MINOR);
|
||||
return 0;
|
||||
}"
|
||||
|
||||
. auto/feature
|
||||
|
||||
NJS_HAVE_PCRE=YES
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
echo
|
||||
echo $0: error: no PCRE library found.
|
||||
echo
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
NJS_LIB_AUX_CFLAGS="$NJS_LIB_AUX_CFLAGS $NJS_PCRE_CFLAGS"
|
||||
NJS_LIB_AUX_LIBS="$NJS_LIB_AUX_LIBS $NJS_PCRE_LIB"
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
# Copyright (C) Dmitry Volyntsev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
NJS_READLINE_LIB=
|
||||
|
||||
njs_found=no
|
||||
|
||||
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>
|
||||
|
||||
int main(void) {
|
||||
add_history(NULL);
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
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) {
|
||||
add_history(NULL);
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
fi
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
# FreeBSD port
|
||||
|
||||
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) {
|
||||
add_history(NULL);
|
||||
return 0;
|
||||
}"
|
||||
|
||||
. auto/feature
|
||||
fi
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
# NetBSD
|
||||
|
||||
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) {
|
||||
add_history(NULL);
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
fi
|
||||
|
||||
if [ $njs_found = yes ]; then
|
||||
NJS_HAVE_READLINE=YES
|
||||
njs_define=NJS_HAVE_READLINE . auto/define
|
||||
NJS_READLINE_LIB=$njs_feature_libs
|
||||
|
||||
else
|
||||
NJS_HAVE_READLINE=NO
|
||||
echo " - njs CLI is built without interactive shell support"
|
||||
fi
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
NJS_LIB_SRCS=" \
|
||||
src/njs_diyfp.c \
|
||||
src/njs_dtoa.c \
|
||||
src/njs_dtoa_fixed.c \
|
||||
src/njs_str.c \
|
||||
src/njs_strtod.c \
|
||||
src/njs_murmur_hash.c \
|
||||
src/njs_djb_hash.c \
|
||||
src/njs_utf8.c \
|
||||
src/njs_utf16.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_time.c \
|
||||
src/njs_file.c \
|
||||
src/njs_malloc.c \
|
||||
src/njs_mp.c \
|
||||
src/njs_sprintf.c \
|
||||
src/njs_utils.c \
|
||||
src/njs_chb.c \
|
||||
src/njs_value.c \
|
||||
src/njs_vm.c \
|
||||
src/njs_vmcode.c \
|
||||
src/njs_boolean.c \
|
||||
src/njs_number.c \
|
||||
src/njs_symbol.c \
|
||||
src/njs_string.c \
|
||||
src/njs_object.c \
|
||||
src/njs_object_prop.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_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_generator.c \
|
||||
src/njs_disassembler.c \
|
||||
src/njs_array_buffer.c \
|
||||
src/njs_typed_array.c \
|
||||
src/njs_promise.c \
|
||||
src/njs_encoding.c \
|
||||
src/njs_iterator.c \
|
||||
src/njs_scope.c \
|
||||
src/njs_async.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/unicode_unit_test.c \
|
||||
"
|
||||
|
||||
NJS_TEST_SRCS=" \
|
||||
src/test/njs_unit_test.c \
|
||||
src/test/njs_benchmark.c \
|
||||
"
|
||||
|
||||
if [ "$NJS_PCRE" = "YES" ]; then
|
||||
NJS_LIB_SRCS="$NJS_LIB_SRCS external/njs_regex.c"
|
||||
fi
|
||||
|
||||
if [ "$NJS_HAVE_LIBBFD" = "YES" -a "$NJS_HAVE_DL_ITERATE_PHDR" = "YES" ]; then
|
||||
NJS_LIB_SRCS="$NJS_LIB_SRCS src/njs_addr2line.c"
|
||||
fi
|
||||
|
||||
NJS_TS_SRCS=$(find ts/ -name "*.d.ts" -o -name "*.json")
|
||||
|
||||
NJS_TEST_TS_SRCS=$(find test/ts/ -name "*.ts" -o -name "*.json")
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
|
||||
# Copyright (C) Dmitry Volyntsev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
njs_feature="stat.st_atimespec"
|
||||
njs_feature_name=NJS_HAVE_STAT_ATIMESPEC
|
||||
njs_feature_run=no
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <sys/stat.h>
|
||||
|
||||
int main(void) {
|
||||
struct stat st;
|
||||
|
||||
if (fstat(0, &st) != 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return (int) st.st_atimespec.tv_sec;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
njs_feature="stat.st_birthtim"
|
||||
njs_feature_name=NJS_HAVE_STAT_BIRTHTIM
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <sys/stat.h>
|
||||
|
||||
int main(void) {
|
||||
struct stat st;
|
||||
|
||||
if (fstat(0, &st) != 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return (int) st.st_birthtim.tv_sec;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
njs_feature="stat.st_atim"
|
||||
njs_feature_name=NJS_HAVE_STAT_ATIM
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <sys/stat.h>
|
||||
|
||||
int main(void) {
|
||||
struct stat st;
|
||||
|
||||
if (fstat(0, &st) != 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return (int) st.st_atim.tv_sec;
|
||||
}"
|
||||
. auto/feature
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
echo
|
||||
echo "NJS configuration summary:"
|
||||
echo
|
||||
echo " + using CC: \"$CC\""
|
||||
echo " + using CFLAGS: \"$NJS_CFLAGS $NJS_CC_OPT $CFLAGS\""
|
||||
echo
|
||||
|
||||
if [ $NJS_HAVE_PCRE = YES ]; then
|
||||
echo " + using PCRE library: $NJS_PCRE_LIB"
|
||||
fi
|
||||
|
||||
if [ $NJS_HAVE_READLINE = YES ]; then
|
||||
echo " + using readline library: $NJS_READLINE_LIB"
|
||||
fi
|
||||
|
||||
if [ $NJS_HAVE_OPENSSL = YES ]; then
|
||||
echo " + using OpenSSL library: $NJS_OPENSSL_LIB"
|
||||
fi
|
||||
|
||||
if [ $NJS_HAVE_COMPUTED_GOTO = YES ]; then
|
||||
echo " + using computed goto"
|
||||
fi
|
||||
|
||||
|
||||
echo
|
||||
echo " njs build dir: $NJS_BUILD_DIR"
|
||||
echo " njs CLI: $NJS_BUILD_DIR/njs"
|
||||
|
||||
echo
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
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;
|
||||
|
||||
if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1)
|
||||
return 1;
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
if [ $njs_found = no ]; then
|
||||
|
||||
# Linux and Solaris 10 clock_gettime() are in librt.
|
||||
|
||||
njs_feature="clock_gettime(CLOCK_MONOTONIC) in librt"
|
||||
njs_feature_libs="-lrt"
|
||||
. auto/feature
|
||||
|
||||
if [ $njs_found = yes ]; then
|
||||
NJS_LIBRT="-lrt"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Linux, FreeBSD, MacOSX.
|
||||
|
||||
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;
|
||||
struct tm tm;
|
||||
|
||||
t = 0;
|
||||
localtime_r(&t, &tm);
|
||||
return tm.tm_gmtoff;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
# Solaris
|
||||
|
||||
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;
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
|
@ -1,174 +0,0 @@
|
|||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
# Sizes of C types.
|
||||
|
||||
# "-Wall -Werror" or similar constraints in default CFLAGS may require
|
||||
# to use "%zu" format to printf() result of sizeof(). But "%zu" may
|
||||
# be unavailable, so the "(int)" cast is a simple and portable solution:
|
||||
# printf("%d", (int) sizeof(TYPE));
|
||||
|
||||
|
||||
njs_feature="sizeof(int)"
|
||||
njs_feature_name=NJS_INT_SIZE
|
||||
njs_feature_run=value
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf(\"%d\", (int) sizeof(int));
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
njs_feature="sizeof(u_int)"
|
||||
njs_feature_name=NJS_UINT_SIZE
|
||||
njs_feature_run=value
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf(\"%d\", (int) sizeof(u_int));
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
njs_feature="sizeof(void *)"
|
||||
njs_feature_name=NJS_PTR_SIZE
|
||||
njs_feature_run=value
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf(\"%d\", (int) sizeof(void *));
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
njs_feature="sizeof(uintptr_t)"
|
||||
njs_feature_name=NJS_UINTPTR_T_SIZE
|
||||
njs_feature_run=value
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf(\"%d\", (int) sizeof(uintptr_t));
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
case "$njs_feature_value" in
|
||||
8) NJS_64BIT=1 ;;
|
||||
*) NJS_64BIT=0 ;;
|
||||
esac
|
||||
|
||||
|
||||
njs_feature="sizeof(size_t)"
|
||||
njs_feature_name=NJS_SIZE_T_SIZE
|
||||
njs_feature_run=value
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf(\"%d\", (int) sizeof(size_t));
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
njs_feature="sizeof(off_t)"
|
||||
njs_feature_name=NJS_OFF_T_SIZE
|
||||
njs_feature_run=value
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#define _FILE_OFFSET_BITS 64
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf(\"%d\", (int) sizeof(off_t));
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
njs_feature="sizeof(time_t)"
|
||||
njs_feature_name=NJS_TIME_T_SIZE
|
||||
njs_feature_run=value
|
||||
njs_feature_incs=
|
||||
njs_feature_libs=
|
||||
njs_feature_test="#include <time.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void) {
|
||||
printf(\"%d\", (int) sizeof(time_t));
|
||||
return 0;
|
||||
}"
|
||||
. auto/feature
|
||||
|
||||
|
||||
# Ensuring that double type is always evaluated at standard
|
||||
# precision required by njs_diyfp_t
|
||||
|
||||
|
||||
case $NJS_CC_NAME in
|
||||
|
||||
gcc)
|
||||
NJS_CFLAGS="$NJS_CFLAGS -fexcess-precision=standard"
|
||||
;;
|
||||
|
||||
clang)
|
||||
|
||||
njs_found=no
|
||||
|
||||
njs_feature="flag -ffp-eval-method=double"
|
||||
njs_feature_name=NJS_HAVE_FP_EVAL_METHOD
|
||||
njs_feature_run=no
|
||||
njs_feature_incs="-ffp-eval-method=double"
|
||||
njs_feature_libs=
|
||||
njs_feature_test="int main(void) {
|
||||
return 0;
|
||||
}"
|
||||
|
||||
. auto/feature
|
||||
|
||||
if [ $njs_found = yes ]; then
|
||||
NJS_CFLAGS="$NJS_CFLAGS -ffp-eval-method=double"
|
||||
fi
|
||||
|
||||
;;
|
||||
|
||||
SunC)
|
||||
|
||||
njs_found=no
|
||||
|
||||
njs_feature="flag -xarch=sse2"
|
||||
njs_feature_name=NJS_HAVE_XARCH_SSE2
|
||||
njs_feature_run=no
|
||||
njs_feature_incs="-xarch=sse2"
|
||||
njs_feature_libs=
|
||||
njs_feature_test="int main(void) {
|
||||
return 0;
|
||||
}"
|
||||
|
||||
. auto/feature
|
||||
|
||||
if [ $njs_found = yes ]; then
|
||||
NJS_CFLAGS="$NJS_CFLAGS -xarch=sse2"
|
||||
fi
|
||||
;;
|
||||
|
||||
esac
|
||||
61
modules_deb/libnginx-mod-js-0.7.9/configure
vendored
61
modules_deb/libnginx-mod-js-0.7.9/configure
vendored
|
|
@ -1,61 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Copyright (C) Igor Sysoev
|
||||
# Copyright (C) NGINX, Inc.
|
||||
|
||||
|
||||
# Disable localized program messages.
|
||||
LC_ALL=C
|
||||
export LC_ALL
|
||||
|
||||
# Stop on error exit status.
|
||||
set -e
|
||||
# Stop on uninitialized variable.
|
||||
set -u
|
||||
|
||||
. auto/init
|
||||
. auto/options
|
||||
|
||||
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
|
||||
|
||||
NJS_LIB_INCS="src $NJS_BUILD_DIR"
|
||||
|
||||
test -d $NJS_BUILD_DIR || mkdir $NJS_BUILD_DIR
|
||||
|
||||
> $NJS_AUTOCONF_ERR
|
||||
|
||||
cat << END > $NJS_AUTO_CONFIG_H
|
||||
|
||||
/* This file is auto-generated by configure */
|
||||
|
||||
END
|
||||
|
||||
NJS_LIBS="$NJS_LIBRT"
|
||||
NJS_LIB_AUX_CFLAGS=
|
||||
NJS_LIB_AUX_LIBS=
|
||||
|
||||
. auto/os
|
||||
. auto/cc
|
||||
. auto/types
|
||||
. auto/endianness
|
||||
. auto/clang
|
||||
. auto/time
|
||||
. auto/memalign
|
||||
. auto/getrandom
|
||||
. auto/stat
|
||||
. auto/computed_goto
|
||||
. auto/explicit_bzero
|
||||
. auto/pcre
|
||||
. auto/readline
|
||||
. auto/openssl
|
||||
. auto/libbfd
|
||||
. auto/link
|
||||
|
||||
. auto/sources
|
||||
. auto/modules
|
||||
. auto/make
|
||||
. auto/expect
|
||||
. auto/summary
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
libnginx-mod-js (0.7.9-2) unstable; urgency=medium
|
||||
|
||||
* Team upload.
|
||||
* d/rules: configure: remove --no-pcre2
|
||||
* d/control: bump Standards-Version: 4.6.2, no changes
|
||||
* d/gbb.conf: switched to debian branch main (debian-branch = main)
|
||||
* d/copyright: updated to be compatible with 'cme update dpkg-copyright'
|
||||
* NEW ABI: rebuild with nginx-abi-1.22.1-7
|
||||
|
||||
-- Jan Mojžíš <jan.mojzis@gmail.com> Mon, 13 Feb 2023 12:56:52 +0100
|
||||
|
||||
libnginx-mod-js (0.7.9-1) unstable; urgency=medium
|
||||
|
||||
* Initial release. (Closes: 1025998)
|
||||
|
||||
-- Jérémy Lal <kapouer@melix.org> Tue, 20 Dec 2022 17:21:11 +0100
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
Source: libnginx-mod-js
|
||||
Section: httpd
|
||||
Priority: optional
|
||||
Maintainer: Debian Nginx Maintainers <pkg-nginx-maintainers@alioth-lists.debian.net>
|
||||
Uploaders: Jérémy Lal <kapouer@melix.org>,
|
||||
Build-Depends: debhelper-compat (= 13),
|
||||
dh-sequence-nginx,
|
||||
help2man,
|
||||
libnginx-mod-stream (<<1.22.1.1~),
|
||||
libnginx-mod-stream (>=1.22.1),
|
||||
nginx-abi-1.22.1-7,
|
||||
Standards-Version: 4.6.2
|
||||
Homepage: https://nginx.org/en/docs/njs/
|
||||
Vcs-Git: https://salsa.debian.org/nginx-team/libnginx-mod-js.git
|
||||
Vcs-Browser: https://salsa.debian.org/nginx-team/libnginx-mod-js
|
||||
Rules-Requires-Root: no
|
||||
|
||||
Package: libnginx-mod-http-js
|
||||
Architecture: any
|
||||
Depends: ${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Recommends: nginx,
|
||||
Description: JavaScript HTTP module for Nginx
|
||||
This module extends Nginx with configuration directives
|
||||
that allows one to run a subset of ECMAScript 5.1 (and later
|
||||
extensions) language.
|
||||
It features integration with
|
||||
- response body filter
|
||||
- location content handler
|
||||
- http, server, location variables
|
||||
|
||||
Package: libnginx-mod-stream-js
|
||||
Architecture: any
|
||||
Depends: libnginx-mod-stream (<<1.22.1.1~),
|
||||
libnginx-mod-stream (>=1.22.1),
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Recommends: nginx,
|
||||
Description: JavaScript Stream module for Nginx
|
||||
This module extends Nginx with configuration directives
|
||||
that allows one to run a subset of ECMAScript 5.1 (and later
|
||||
extensions) language.
|
||||
It features integration with
|
||||
- the access phase
|
||||
- the content phase
|
||||
- stream, server variables
|
||||
|
||||
Package: njs
|
||||
Architecture: any
|
||||
Depends: ${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Description: JavaScript for Nginx command-line utility
|
||||
Run and debug scripts written for libnginx-mod-stream-js and
|
||||
libnginx-mod-http-js Nginx modules.
|
||||
This command is independent of Nginx and does not run inside it,
|
||||
in consequence, HTTP and Stream objects are not available.
|
||||
|
|
@ -1,378 +0,0 @@
|
|||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
|
||||
Files: *
|
||||
Copyright: 2019-2022, Alexander Borisov
|
||||
2017-2022, Dmitry Volyntsev
|
||||
2015-2022, NGINX, Inc.
|
||||
2015-2021, Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: auto/*
|
||||
Copyright: NGINX, Inc.
|
||||
Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: auto/computed_goto
|
||||
Copyright: Vadim Zhestikov
|
||||
NGINX, Inc.
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: auto/endianness
|
||||
auto/expect
|
||||
auto/init
|
||||
auto/libbfd
|
||||
auto/link
|
||||
auto/module
|
||||
auto/modules
|
||||
auto/openssl
|
||||
auto/readline
|
||||
auto/stat
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: auto/sources
|
||||
Copyright: 2019-2022, Alexander Borisov
|
||||
2017-2022, Dmitry Volyntsev
|
||||
2015-2022, NGINX, Inc.
|
||||
2015-2021, Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: configure
|
||||
Copyright: NGINX, Inc.
|
||||
Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: external/*
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: external/njs_query_string_module.c
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
Alexander Borisov
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: external/njs_regex.c
|
||||
Copyright: NGINX, Inc.
|
||||
Igor Sysoev
|
||||
Dmitry Volyntsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: nginx/*
|
||||
Copyright: Roman Arutyunyan
|
||||
NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: nginx/config
|
||||
Copyright: Roman Arutyunyan
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: nginx/ngx_js_fetch.c
|
||||
Copyright: hongzhidao
|
||||
NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
Antoine Bonavita
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: nginx/ngx_js_fetch.h
|
||||
nginx/ngx_js_regex.c
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/*
|
||||
Copyright: NGINX, Inc.
|
||||
Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs.pc.in
|
||||
src/njs_md5.c
|
||||
src/njs_unicode_lower_case.h
|
||||
src/njs_unicode_lower_case.pl
|
||||
src/njs_unicode_upper_case.h
|
||||
src/njs_unicode_upper_case.pl
|
||||
Copyright: 2019-2022, Alexander Borisov
|
||||
2017-2022, Dmitry Volyntsev
|
||||
2015-2022, NGINX, Inc.
|
||||
2015-2021, Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_addr2line.c
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
License: GPL-2+
|
||||
|
||||
Files: src/njs_addr2line.h
|
||||
src/njs_dtoa.h
|
||||
src/njs_dtoa_fixed.h
|
||||
src/njs_strtod.h
|
||||
Copyright: Nginx, Inc.
|
||||
Dmitry Volyntsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_assert.h
|
||||
src/njs_chb.c
|
||||
src/njs_chb.h
|
||||
src/njs_diyfp.c
|
||||
src/njs_diyfp.h
|
||||
src/njs_error.c
|
||||
src/njs_error.h
|
||||
src/njs_event.c
|
||||
src/njs_event.h
|
||||
src/njs_generator.h
|
||||
src/njs_json.c
|
||||
src/njs_json.h
|
||||
src/njs_main.h
|
||||
src/njs_module.c
|
||||
src/njs_object_prop_declare.h
|
||||
src/njs_sha2.c
|
||||
src/njs_sha2.h
|
||||
src/njs_shell.c
|
||||
src/njs_str.c
|
||||
src/njs_timer.c
|
||||
src/njs_timer.h
|
||||
src/njs_unix.h
|
||||
src/njs_utils.c
|
||||
src/njs_utils.h
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_async.c
|
||||
src/njs_async.h
|
||||
src/njs_promise.c
|
||||
Copyright: Nginx, Inc.
|
||||
Alexander Borisov
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_buffer.c
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
Alexander Borisov
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_buffer.h
|
||||
src/njs_encoding.c
|
||||
src/njs_encoding.h
|
||||
src/njs_scope.c
|
||||
src/njs_scope.h
|
||||
src/njs_unicode.h
|
||||
src/njs_utf16.c
|
||||
src/njs_utf16.h
|
||||
Copyright: NGINX, Inc.
|
||||
Alexander Borisov
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_builtin.c
|
||||
src/njs_typed_array.c
|
||||
src/njs_variable.c
|
||||
Copyright: NGINX, Inc.
|
||||
Igor Sysoev
|
||||
Dmitry Volyntsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_dtoa.c
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
License: Expat
|
||||
|
||||
Files: src/njs_dtoa_fixed.c
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
2011, the V8 project authors.
|
||||
License: BSD-3-clause
|
||||
|
||||
Files: src/njs_generator.c
|
||||
Copyright: NGINX, Inc.
|
||||
Igor Sysoev
|
||||
Dmitry Volyntsev
|
||||
Alexander Borisov
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_iterator.c
|
||||
src/njs_iterator.h
|
||||
Copyright: NGINX, Inc.
|
||||
Artem S. Povalyukhin
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_lexer_keyword.c
|
||||
Copyright: NGINX, Inc.
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_lexer_tables.h
|
||||
src/njs_promise.h
|
||||
Copyright: Nginx, Inc.
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_md5.h
|
||||
Copyright: Nginx, Inc.
|
||||
Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_module.h
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volynsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_murmur_hash.c
|
||||
Copyright: Austin Appleby
|
||||
License: public-domain
|
||||
The code is based on the code by Austin Appleby,
|
||||
released to the public domain.
|
||||
|
||||
Files: src/njs_parser.c
|
||||
src/njs_parser.h
|
||||
Copyright: NGINX, Inc.
|
||||
Igor Sysoev
|
||||
Alexander Borisov
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_sha1.c
|
||||
Copyright: NGINX, Inc.
|
||||
Maxim Dounin
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: src/njs_strtod.c
|
||||
Copyright: 2012, the V8 project authors.
|
||||
License: BSD-3-clause
|
||||
|
||||
Files: src/test/njs_externals_test.c
|
||||
src/test/njs_externals_test.h
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: test/*
|
||||
Copyright: NGINX, Inc.
|
||||
Dmitry Volyntsev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: test/fs/*
|
||||
Copyright: 2019-2022, Alexander Borisov
|
||||
2017-2022, Dmitry Volyntsev
|
||||
2015-2022, NGINX, Inc.
|
||||
2015-2021, Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: test/harness/*
|
||||
Copyright: 2012, 2017, Ecma International.
|
||||
License: BSD-3-clause
|
||||
|
||||
Files: test/inputrc
|
||||
test/script_args.js
|
||||
Copyright: 2019-2022, Alexander Borisov
|
||||
2017-2022, Dmitry Volyntsev
|
||||
2015-2022, NGINX, Inc.
|
||||
2015-2021, Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: test/js/*
|
||||
Copyright: 2019-2022, Alexander Borisov
|
||||
2017-2022, Dmitry Volyntsev
|
||||
2015-2022, NGINX, Inc.
|
||||
2015-2021, Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: test/ts/*
|
||||
Copyright: 2019-2022, Alexander Borisov
|
||||
2017-2022, Dmitry Volyntsev
|
||||
2015-2022, NGINX, Inc.
|
||||
2015-2021, Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: test/webcrypto/*
|
||||
Copyright: 2019-2022, Alexander Borisov
|
||||
2017-2022, Dmitry Volyntsev
|
||||
2015-2022, NGINX, Inc.
|
||||
2015-2021, Igor Sysoev
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: utils/*
|
||||
Copyright: Nginx, Inc.
|
||||
License: BSD-2-clause
|
||||
|
||||
License: BSD-2-clause
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
.
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
|
||||
License: BSD-3-clause
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
.
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
* Neither the name of Google Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
.
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
License: Expat
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to
|
||||
whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
.
|
||||
The above copyright notice and this permission notice shall
|
||||
be included in all copies or substantial portions of the
|
||||
Software.
|
||||
.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT
|
||||
WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
License: GPL-2+
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 dated June, 1991, or (at
|
||||
your option) any later version.
|
||||
On Debian systems, the complete text of version 2 of the GNU General
|
||||
Public License can be found in '/usr/share/common-licenses/GPL-2'.
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
[DEFAULT]
|
||||
debian-branch = main
|
||||
upstream-branch = upstream
|
||||
upstream-tag = upstream/%(version)s
|
||||
pristine-tar = True
|
||||
sign-tags = True
|
||||
|
||||
[import-orig]
|
||||
merge-mode = replace
|
||||
|
|
@ -1 +0,0 @@
|
|||
/usr/lib/nginx/modules/ngx_http_js_module.so
|
||||
|
|
@ -1 +0,0 @@
|
|||
/usr/lib/nginx/modules/ngx_stream_js_module.so
|
||||
|
|
@ -1 +0,0 @@
|
|||
./build/njs /usr/bin
|
||||
|
|
@ -1 +0,0 @@
|
|||
build/njs.1
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
#!/usr/bin/make -f
|
||||
|
||||
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||
|
||||
# nginx_mod needs to find the modules source dir using sourcedirectory
|
||||
# nginx_mod calls doit_in_builddir but without builddirectory,
|
||||
# it tries to chdir from sourcedirectory and fails
|
||||
|
||||
%:
|
||||
dh $@ --sourcedirectory=nginx --builddirectory=build-modules
|
||||
|
||||
|
||||
override_dh_auto_configure:
|
||||
./configure \
|
||||
--cc-opt="$(shell dpkg-buildflags --get CFLAGS) -fPIC $(shell dpkg-buildflags --get CPPFLAGS)" \
|
||||
--ld-opt="$(shell dpkg-buildflags --get LDFLAGS)"
|
||||
dh_auto_configure --buildsystem=nginx_mod -- --with-stream
|
||||
|
||||
override_dh_auto_build-arch:
|
||||
make
|
||||
dh_auto_build --buildsystem=nginx_mod
|
||||
help2man --no-info --version-option=-v --help-option=-h --name='JavaScript for Nginx' ./build/njs -o build/njs.1
|
||||
|
||||
override_dh_auto_test:
|
||||
dh_auto_test --buildsystem=nginx_mod -- ngx_stream_module.so
|
||||
|
||||
override_dh_auto_clean:
|
||||
rm -f Makefile
|
||||
rm -rf build
|
||||
rm -rf build-modules
|
||||
|
|
@ -1 +0,0 @@
|
|||
3.0 (quilt)
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
# false positive
|
||||
source-is-missing [test/js/import_very_long_path.t.js]
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
Tests: generic
|
||||
Restrictions: allow-stderr isolation-container needs-root
|
||||
Depends: curl,
|
||||
nginx,
|
||||
nginx-core,
|
||||
@,
|
||||
|
||||
Tests: helloworld
|
||||
Restrictions: allow-stderr isolation-container needs-root
|
||||
Depends: curl,
|
||||
nginx,
|
||||
nginx-core,
|
||||
@,
|
||||
|
||||
Test-Command: njs -v
|
||||
Depends: njs,
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
#!/bin/sh
|
||||
# version 20221215
|
||||
|
||||
# generic test that only verifies that nginx is running with the given
|
||||
# libnginx-... module
|
||||
# - after installation
|
||||
# - after nginx reload
|
||||
# - after nginx restart
|
||||
|
||||
EX=0
|
||||
CURL_CMD="curl --max-time 60 --silent --fail -o /dev/null"
|
||||
|
||||
#change directory to $AUTOPKGTEST_TMP
|
||||
cd "${AUTOPKGTEST_TMP}"
|
||||
|
||||
echo -n "curl after installation: http status="
|
||||
if $CURL_CMD -w "response_code: %{http_code}, ... " http://127.0.0.1/; then
|
||||
echo "OK"
|
||||
else
|
||||
EX=1
|
||||
echo "FAILED"
|
||||
fi
|
||||
|
||||
echo -n "nginx reload ... "
|
||||
if invoke-rc.d nginx reload; then
|
||||
echo "OK"
|
||||
else
|
||||
EX=1
|
||||
echo "FAILED"
|
||||
fi
|
||||
sleep 5
|
||||
|
||||
|
||||
echo -n "curl after reload: http status="
|
||||
if $CURL_CMD -w "response_code: %{http_code}, ... " http://127.0.0.1/; then
|
||||
echo "OK"
|
||||
else
|
||||
EX=1
|
||||
echo "FAILED"
|
||||
fi
|
||||
|
||||
echo -n "nginx restart ... "
|
||||
if invoke-rc.d nginx restart; then
|
||||
echo "OK"
|
||||
else
|
||||
EX=1
|
||||
echo "FAILED"
|
||||
fi
|
||||
sleep 5
|
||||
|
||||
echo -n "curl after restart: http status="
|
||||
if $CURL_CMD -w "response_code: %{http_code}, ... " http://127.0.0.1/; then
|
||||
echo "OK"
|
||||
else
|
||||
EX=1
|
||||
echo "FAILED"
|
||||
fi
|
||||
|
||||
if [ ${EX} -ne 0 ]; then
|
||||
echo "=== journalctl ==="
|
||||
journalctl -n all -xu nginx.service || :
|
||||
|
||||
echo "=== error.log ==="
|
||||
if [ `wc -l /var/log/nginx/error.log | cut -d ' ' -f1` -gt 100 ]; then
|
||||
head -n 50 /var/log/nginx/error.log
|
||||
echo '...'
|
||||
tail -n 50 /var/log/nginx/error.log
|
||||
else
|
||||
cat /var/log/nginx/error.log
|
||||
fi
|
||||
fi
|
||||
|
||||
exit ${EX}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
cat <<EOF > '/etc/nginx/sites-enabled/default'
|
||||
server {
|
||||
listen 80 default_server;
|
||||
|
||||
location /helloworld {
|
||||
js_path "/etc/nginx/njs/";
|
||||
js_import hello.js;
|
||||
js_content hello.hello;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
mkdir -p '/etc/nginx/njs'
|
||||
cat <<EOF > "/etc/nginx/njs/hello.js"
|
||||
function hello(r) {
|
||||
r.return(200, "Hello world!\n");
|
||||
}
|
||||
export default {hello}
|
||||
EOF
|
||||
|
||||
exp="Hello world!
|
||||
response_code: 200"
|
||||
|
||||
nginx -t
|
||||
invoke-rc.d nginx restart || { journalctl -n all -xu nginx.service; exit 1; }
|
||||
|
||||
out=`curl --fail -w "response_code: %{http_code}\n" http://127.0.0.1/helloworld`
|
||||
|
||||
if [ x"${out}" != x"${exp}" ]; then
|
||||
echo "output:"
|
||||
echo "====================="
|
||||
echo "${out}"
|
||||
echo "====================="
|
||||
echo "expected output:"
|
||||
echo "====================="
|
||||
echo "${exp}"
|
||||
echo "====================="
|
||||
exit 1
|
||||
fi
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
version=4
|
||||
opts="filenamemangle=s%(?:.*?)?v?(\d[\d.]*@ARCHIVE_EXT@)%@PACKAGE@-$1%" \
|
||||
https://github.com/nginx/njs/tags \
|
||||
(?:.*?/)?v?@ANY_VERSION@@ARCHIVE_EXT@
|
||||
|
|
@ -1,658 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.h>
|
||||
|
||||
|
||||
typedef void (*njs_hash_init)(void *ctx);
|
||||
typedef void (*njs_hash_update)(void *ctx, const void *data, size_t size);
|
||||
typedef void (*njs_hash_final)(u_char *result, void *ctx);
|
||||
|
||||
typedef njs_int_t (*njs_digest_encode)(njs_vm_t *vm, njs_value_t *value,
|
||||
const njs_str_t *src);
|
||||
|
||||
|
||||
typedef struct {
|
||||
njs_str_t name;
|
||||
|
||||
size_t size;
|
||||
njs_hash_init init;
|
||||
njs_hash_update update;
|
||||
njs_hash_final final;
|
||||
} njs_hash_alg_t;
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
njs_md5_t md5;
|
||||
njs_sha1_t sha1;
|
||||
njs_sha2_t sha2;
|
||||
} u;
|
||||
|
||||
njs_hash_alg_t *alg;
|
||||
} njs_digest_t;
|
||||
|
||||
typedef struct {
|
||||
u_char opad[64];
|
||||
|
||||
union {
|
||||
njs_md5_t md5;
|
||||
njs_sha1_t sha1;
|
||||
njs_sha2_t sha2;
|
||||
} u;
|
||||
|
||||
njs_hash_alg_t *alg;
|
||||
} njs_hmac_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
njs_str_t name;
|
||||
|
||||
njs_digest_encode encode;
|
||||
} njs_crypto_enc_t;
|
||||
|
||||
|
||||
static njs_hash_alg_t *njs_crypto_algorithm(njs_vm_t *vm,
|
||||
const njs_value_t *value);
|
||||
static njs_crypto_enc_t *njs_crypto_encoding(njs_vm_t *vm,
|
||||
const njs_value_t *value);
|
||||
static njs_int_t njs_buffer_digest(njs_vm_t *vm, njs_value_t *value,
|
||||
const njs_str_t *src);
|
||||
static njs_int_t njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t unused);
|
||||
static njs_int_t njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t hmac);
|
||||
static njs_int_t njs_hash_prototype_digest(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t hmac);
|
||||
static njs_int_t njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t unused);
|
||||
|
||||
static njs_int_t njs_crypto_init(njs_vm_t *vm);
|
||||
|
||||
|
||||
static njs_hash_alg_t njs_hash_algorithms[] = {
|
||||
|
||||
{
|
||||
njs_str("md5"),
|
||||
16,
|
||||
(njs_hash_init) njs_md5_init,
|
||||
(njs_hash_update) njs_md5_update,
|
||||
(njs_hash_final) njs_md5_final
|
||||
},
|
||||
|
||||
{
|
||||
njs_str("sha1"),
|
||||
20,
|
||||
(njs_hash_init) njs_sha1_init,
|
||||
(njs_hash_update) njs_sha1_update,
|
||||
(njs_hash_final) njs_sha1_final
|
||||
},
|
||||
|
||||
{
|
||||
njs_str("sha256"),
|
||||
32,
|
||||
(njs_hash_init) njs_sha2_init,
|
||||
(njs_hash_update) njs_sha2_update,
|
||||
(njs_hash_final) njs_sha2_final
|
||||
},
|
||||
|
||||
{
|
||||
njs_null_str,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
static njs_crypto_enc_t njs_encodings[] = {
|
||||
|
||||
{
|
||||
njs_str("buffer"),
|
||||
njs_buffer_digest
|
||||
},
|
||||
|
||||
{
|
||||
njs_str("hex"),
|
||||
njs_string_hex
|
||||
},
|
||||
|
||||
{
|
||||
njs_str("base64"),
|
||||
njs_string_base64
|
||||
},
|
||||
|
||||
{
|
||||
njs_str("base64url"),
|
||||
njs_string_base64url
|
||||
},
|
||||
|
||||
{
|
||||
njs_null_str,
|
||||
NULL
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static njs_external_t njs_ext_crypto_hash[] = {
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_PROPERTY | NJS_EXTERN_SYMBOL,
|
||||
.name.symbol = NJS_SYMBOL_TO_STRING_TAG,
|
||||
.u.property = {
|
||||
.value = "Hash",
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_METHOD,
|
||||
.name.string = njs_str("update"),
|
||||
.writable = 1,
|
||||
.configurable = 1,
|
||||
.u.method = {
|
||||
.native = njs_hash_prototype_update,
|
||||
.magic8 = 0,
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_METHOD,
|
||||
.name.string = njs_str("digest"),
|
||||
.writable = 1,
|
||||
.configurable = 1,
|
||||
.u.method = {
|
||||
.native = njs_hash_prototype_digest,
|
||||
.magic8 = 0,
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_METHOD,
|
||||
.name.string = njs_str("constructor"),
|
||||
.writable = 1,
|
||||
.configurable = 1,
|
||||
.u.method = {
|
||||
.native = njs_crypto_create_hash,
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static njs_external_t njs_ext_crypto_hmac[] = {
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_PROPERTY | NJS_EXTERN_SYMBOL,
|
||||
.name.symbol = NJS_SYMBOL_TO_STRING_TAG,
|
||||
.u.property = {
|
||||
.value = "Hmac",
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_METHOD,
|
||||
.name.string = njs_str("update"),
|
||||
.writable = 1,
|
||||
.configurable = 1,
|
||||
.u.method = {
|
||||
.native = njs_hash_prototype_update,
|
||||
.magic8 = 1,
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_METHOD,
|
||||
.name.string = njs_str("digest"),
|
||||
.writable = 1,
|
||||
.configurable = 1,
|
||||
.u.method = {
|
||||
.native = njs_hash_prototype_digest,
|
||||
.magic8 = 1,
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_METHOD,
|
||||
.name.string = njs_str("constructor"),
|
||||
.writable = 1,
|
||||
.configurable = 1,
|
||||
.u.method = {
|
||||
.native = njs_crypto_create_hmac,
|
||||
.magic8 = 0,
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static njs_external_t njs_ext_crypto_crypto[] = {
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_PROPERTY | NJS_EXTERN_SYMBOL,
|
||||
.name.symbol = NJS_SYMBOL_TO_STRING_TAG,
|
||||
.u.property = {
|
||||
.value = "crypto",
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_METHOD,
|
||||
.name.string = njs_str("createHash"),
|
||||
.writable = 1,
|
||||
.configurable = 1,
|
||||
.enumerable = 1,
|
||||
.u.method = {
|
||||
.native = njs_crypto_create_hash,
|
||||
.magic8 = 0,
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
.flags = NJS_EXTERN_METHOD,
|
||||
.name.string = njs_str("createHmac"),
|
||||
.writable = 1,
|
||||
.configurable = 1,
|
||||
.enumerable = 1,
|
||||
.u.method = {
|
||||
.native = njs_crypto_create_hmac,
|
||||
.magic8 = 0,
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static njs_int_t njs_crypto_hash_proto_id;
|
||||
static njs_int_t njs_crypto_hmac_proto_id;
|
||||
|
||||
|
||||
njs_module_t njs_crypto_module = {
|
||||
.name = njs_str("crypto"),
|
||||
.init = njs_crypto_init,
|
||||
};
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
njs_digest_t *dgst;
|
||||
njs_hash_alg_t *alg;
|
||||
|
||||
alg = njs_crypto_algorithm(vm, njs_arg(args, nargs, 1));
|
||||
if (njs_slow_path(alg == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
dgst = njs_mp_alloc(vm->mem_pool, sizeof(njs_digest_t));
|
||||
if (njs_slow_path(dgst == NULL)) {
|
||||
njs_memory_error(vm);
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
dgst->alg = alg;
|
||||
|
||||
alg->init(&dgst->u);
|
||||
|
||||
return njs_vm_external_create(vm, &vm->retval, njs_crypto_hash_proto_id,
|
||||
dgst, 0);
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t hmac)
|
||||
{
|
||||
njs_str_t data;
|
||||
njs_int_t ret;
|
||||
njs_hmac_t *ctx;
|
||||
njs_value_t *this, dst;
|
||||
njs_digest_t *dgst;
|
||||
njs_typed_array_t *array;
|
||||
const njs_value_t *value;
|
||||
njs_array_buffer_t *buffer;
|
||||
const njs_buffer_encoding_t *encoding;
|
||||
|
||||
this = njs_argument(args, 0);
|
||||
|
||||
if (!hmac) {
|
||||
dgst = njs_vm_external(vm, njs_crypto_hash_proto_id, this);
|
||||
if (njs_slow_path(dgst == NULL)) {
|
||||
njs_type_error(vm, "\"this\" is not a hash object");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
if (njs_slow_path(dgst->alg == NULL)) {
|
||||
njs_error(vm, "Digest already called");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ctx = NULL;
|
||||
|
||||
} else {
|
||||
ctx = njs_vm_external(vm, njs_crypto_hmac_proto_id, this);
|
||||
if (njs_slow_path(ctx == NULL)) {
|
||||
njs_type_error(vm, "\"this\" is not a hmac object");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
if (njs_slow_path(ctx->alg == NULL)) {
|
||||
njs_error(vm, "Digest already called");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
dgst = NULL;
|
||||
}
|
||||
|
||||
value = njs_arg(args, nargs, 1);
|
||||
|
||||
switch (value->type) {
|
||||
case NJS_STRING:
|
||||
encoding = njs_buffer_encoding(vm, njs_arg(args, nargs, 2));
|
||||
if (njs_slow_path(encoding == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ret = njs_buffer_decode_string(vm, value, &dst, encoding);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
njs_string_get(&dst, &data);
|
||||
break;
|
||||
|
||||
case NJS_TYPED_ARRAY:
|
||||
case NJS_DATA_VIEW:
|
||||
array = njs_typed_array(value);
|
||||
buffer = array->buffer;
|
||||
if (njs_slow_path(njs_is_detached_buffer(buffer))) {
|
||||
njs_type_error(vm, "detached buffer");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
data.start = &buffer->u.u8[array->offset];
|
||||
data.length = array->byte_length;
|
||||
break;
|
||||
|
||||
default:
|
||||
njs_type_error(vm, "data argument \"%s\" is not a string "
|
||||
"or Buffer-like object", njs_type_string(value->type));
|
||||
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
if (!hmac) {
|
||||
dgst->alg->update(&dgst->u, data.start, data.length);
|
||||
|
||||
} else {
|
||||
ctx->alg->update(&ctx->u, data.start, data.length);
|
||||
}
|
||||
|
||||
vm->retval = *this;
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_hash_prototype_digest(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t hmac)
|
||||
{
|
||||
njs_str_t str;
|
||||
njs_hmac_t *ctx;
|
||||
njs_value_t *this;
|
||||
njs_digest_t *dgst;
|
||||
njs_hash_alg_t *alg;
|
||||
njs_crypto_enc_t *enc;
|
||||
u_char hash1[32], digest[32];
|
||||
|
||||
this = njs_argument(args, 0);
|
||||
|
||||
if (!hmac) {
|
||||
dgst = njs_vm_external(vm, njs_crypto_hash_proto_id, this);
|
||||
if (njs_slow_path(dgst == NULL)) {
|
||||
njs_type_error(vm, "\"this\" is not a hash object");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
if (njs_slow_path(dgst->alg == NULL)) {
|
||||
goto exception;
|
||||
}
|
||||
|
||||
ctx = NULL;
|
||||
|
||||
} else {
|
||||
ctx = njs_vm_external(vm, njs_crypto_hmac_proto_id, this);
|
||||
if (njs_slow_path(ctx == NULL)) {
|
||||
njs_type_error(vm, "\"this\" is not a hmac object");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
if (njs_slow_path(ctx->alg == NULL)) {
|
||||
goto exception;
|
||||
}
|
||||
|
||||
dgst = NULL;
|
||||
}
|
||||
|
||||
enc = njs_crypto_encoding(vm, njs_arg(args, nargs, 1));
|
||||
if (njs_slow_path(enc == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
if (!hmac) {
|
||||
alg = dgst->alg;
|
||||
alg->final(digest, &dgst->u);
|
||||
dgst->alg = NULL;
|
||||
|
||||
} else {
|
||||
alg = ctx->alg;
|
||||
alg->final(hash1, &ctx->u);
|
||||
|
||||
alg->init(&ctx->u);
|
||||
alg->update(&ctx->u, ctx->opad, 64);
|
||||
alg->update(&ctx->u, hash1, alg->size);
|
||||
alg->final(digest, &ctx->u);
|
||||
ctx->alg = NULL;
|
||||
}
|
||||
|
||||
str.start = digest;
|
||||
str.length = alg->size;
|
||||
|
||||
return enc->encode(vm, &vm->retval, &str);
|
||||
|
||||
exception:
|
||||
|
||||
njs_error(vm, "Digest already called");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
njs_str_t key;
|
||||
njs_uint_t i;
|
||||
njs_hmac_t *ctx;
|
||||
njs_hash_alg_t *alg;
|
||||
njs_typed_array_t *array;
|
||||
const njs_value_t *value;
|
||||
njs_array_buffer_t *buffer;
|
||||
u_char digest[32], key_buf[64];
|
||||
|
||||
alg = njs_crypto_algorithm(vm, njs_arg(args, nargs, 1));
|
||||
if (njs_slow_path(alg == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
value = njs_arg(args, nargs, 2);
|
||||
|
||||
switch (value->type) {
|
||||
case NJS_STRING:
|
||||
njs_string_get(value, &key);
|
||||
break;
|
||||
|
||||
case NJS_TYPED_ARRAY:
|
||||
case NJS_DATA_VIEW:
|
||||
array = njs_typed_array(value);
|
||||
buffer = array->buffer;
|
||||
if (njs_slow_path(njs_is_detached_buffer(buffer))) {
|
||||
njs_type_error(vm, "detached buffer");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
key.start = &buffer->u.u8[array->offset];
|
||||
key.length = array->byte_length;
|
||||
break;
|
||||
|
||||
default:
|
||||
njs_type_error(vm, "key argument \"%s\" is not a string "
|
||||
"or Buffer-like object", njs_type_string(value->type));
|
||||
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ctx = njs_mp_alloc(vm->mem_pool, sizeof(njs_hmac_t));
|
||||
if (njs_slow_path(ctx == NULL)) {
|
||||
njs_memory_error(vm);
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ctx->alg = alg;
|
||||
|
||||
if (key.length > sizeof(key_buf)) {
|
||||
alg->init(&ctx->u);
|
||||
alg->update(&ctx->u, key.start, key.length);
|
||||
alg->final(digest, &ctx->u);
|
||||
|
||||
memcpy(key_buf, digest, alg->size);
|
||||
njs_explicit_memzero(key_buf + alg->size, sizeof(key_buf) - alg->size);
|
||||
|
||||
} else {
|
||||
memcpy(key_buf, key.start, key.length);
|
||||
njs_explicit_memzero(key_buf + key.length,
|
||||
sizeof(key_buf) - key.length);
|
||||
}
|
||||
|
||||
for (i = 0; i < 64; i++) {
|
||||
ctx->opad[i] = key_buf[i] ^ 0x5c;
|
||||
}
|
||||
|
||||
for (i = 0; i < 64; i++) {
|
||||
key_buf[i] ^= 0x36;
|
||||
}
|
||||
|
||||
alg->init(&ctx->u);
|
||||
alg->update(&ctx->u, key_buf, 64);
|
||||
|
||||
return njs_vm_external_create(vm, &vm->retval, njs_crypto_hmac_proto_id,
|
||||
ctx, 0);
|
||||
}
|
||||
|
||||
|
||||
static njs_hash_alg_t *
|
||||
njs_crypto_algorithm(njs_vm_t *vm, const njs_value_t *value)
|
||||
{
|
||||
njs_str_t name;
|
||||
njs_hash_alg_t *e;
|
||||
|
||||
if (njs_slow_path(!njs_is_string(value))) {
|
||||
njs_type_error(vm, "algorithm must be a string");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
njs_string_get(value, &name);
|
||||
|
||||
for (e = &njs_hash_algorithms[0]; e->name.length != 0; e++) {
|
||||
if (njs_strstr_eq(&name, &e->name)) {
|
||||
return e;
|
||||
}
|
||||
}
|
||||
|
||||
njs_type_error(vm, "not supported algorithm: \"%V\"", &name);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static njs_crypto_enc_t *
|
||||
njs_crypto_encoding(njs_vm_t *vm, const njs_value_t *value)
|
||||
{
|
||||
njs_str_t name;
|
||||
njs_crypto_enc_t *e;
|
||||
|
||||
if (njs_slow_path(!njs_is_string(value))) {
|
||||
if (njs_is_defined(value)) {
|
||||
njs_type_error(vm, "encoding must be a string");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &njs_encodings[0];
|
||||
}
|
||||
|
||||
njs_string_get(value, &name);
|
||||
|
||||
for (e = &njs_encodings[1]; e->name.length != 0; e++) {
|
||||
if (njs_strstr_eq(&name, &e->name)) {
|
||||
return e;
|
||||
}
|
||||
}
|
||||
|
||||
njs_type_error(vm, "Unknown digest encoding: \"%V\"", &name);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_buffer_digest(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
|
||||
{
|
||||
return njs_buffer_new(vm, value, src->start, src->length);
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_crypto_init(njs_vm_t *vm)
|
||||
{
|
||||
njs_int_t ret, proto_id;
|
||||
njs_mod_t *module;
|
||||
njs_opaque_value_t value;
|
||||
|
||||
njs_crypto_hash_proto_id =
|
||||
njs_vm_external_prototype(vm, njs_ext_crypto_hash,
|
||||
njs_nitems(njs_ext_crypto_hash));
|
||||
if (njs_slow_path(njs_crypto_hash_proto_id < 0)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
njs_crypto_hmac_proto_id =
|
||||
njs_vm_external_prototype(vm, njs_ext_crypto_hmac,
|
||||
njs_nitems(njs_ext_crypto_hmac));
|
||||
if (njs_slow_path(njs_crypto_hmac_proto_id < 0)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
proto_id = njs_vm_external_prototype(vm, njs_ext_crypto_crypto,
|
||||
njs_nitems(njs_ext_crypto_crypto));
|
||||
if (njs_slow_path(proto_id < 0)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ret = njs_vm_external_create(vm, njs_value_arg(&value), proto_id, NULL, 1);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
module = njs_module_add(vm, &njs_str_value("crypto"));
|
||||
if (njs_slow_path(module == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
njs_value_assign(&module->value, &value);
|
||||
module->function.native = 1;
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,59 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _NJS_EXTERNAL_OPENSSL_H_INCLUDED_
|
||||
#define _NJS_EXTERNAL_OPENSSL_H_INCLUDED_
|
||||
|
||||
|
||||
#define OPENSSL_SUPPRESS_DEPRECATED
|
||||
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/bio.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/aes.h>
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/rand.h>
|
||||
#include <openssl/hmac.h>
|
||||
#include <openssl/crypto.h>
|
||||
|
||||
#ifdef EVP_PKEY_HKDF
|
||||
#include <openssl/kdf.h>
|
||||
#endif
|
||||
|
||||
|
||||
#if (defined LIBRESSL_VERSION_NUMBER && OPENSSL_VERSION_NUMBER == 0x20000000L)
|
||||
#undef OPENSSL_VERSION_NUMBER
|
||||
#if (LIBRESSL_VERSION_NUMBER >= 0x2080000fL)
|
||||
#define OPENSSL_VERSION_NUMBER 0x1010000fL
|
||||
#else
|
||||
#define OPENSSL_VERSION_NUMBER 0x1000107fL
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L)
|
||||
#define njs_evp_md_ctx_new() EVP_MD_CTX_new()
|
||||
#define njs_evp_md_ctx_free(_ctx) EVP_MD_CTX_free(_ctx)
|
||||
#else
|
||||
#define njs_evp_md_ctx_new() EVP_MD_CTX_create()
|
||||
#define njs_evp_md_ctx_free(_ctx) EVP_MD_CTX_destroy(_ctx)
|
||||
#define ECDSA_SIG_get0_s(sig) (sig)->s
|
||||
#define ECDSA_SIG_get0_r(sig) (sig)->r
|
||||
#endif
|
||||
|
||||
|
||||
#define njs_bio_new_mem_buf(b, len) BIO_new_mem_buf((void *) b, len)
|
||||
|
||||
|
||||
#if (OPENSSL_VERSION_NUMBER < 0x30000000L && !defined ERR_peek_error_data)
|
||||
#define ERR_peek_error_data(d, f) ERR_peek_error_line_data(NULL, NULL, d, f)
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* _NJS_EXTERNAL_OPENSSL_H_INCLUDED_ */
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,646 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.h>
|
||||
|
||||
#ifdef NJS_HAVE_PCRE2
|
||||
|
||||
#define PCRE2_CODE_UNIT_WIDTH 8
|
||||
#include <pcre2.h>
|
||||
|
||||
|
||||
static const u_char* njs_regex_pcre2_error(int errcode, u_char buffer[128]);
|
||||
|
||||
#else
|
||||
|
||||
#include <pcre.h>
|
||||
|
||||
|
||||
static void *njs_pcre_malloc(size_t size);
|
||||
static void njs_pcre_free(void *p);
|
||||
|
||||
|
||||
static njs_regex_generic_ctx_t *regex_context;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
njs_regex_generic_ctx_t *
|
||||
njs_regex_generic_ctx_create(njs_pcre_malloc_t private_malloc,
|
||||
njs_pcre_free_t private_free, void *memory_data)
|
||||
{
|
||||
#ifdef NJS_HAVE_PCRE2
|
||||
|
||||
return pcre2_general_context_create(private_malloc, private_free,
|
||||
memory_data);
|
||||
#else
|
||||
|
||||
njs_regex_generic_ctx_t *ctx;
|
||||
|
||||
ctx = private_malloc(sizeof(njs_regex_generic_ctx_t), memory_data);
|
||||
|
||||
if (njs_fast_path(ctx != NULL)) {
|
||||
ctx->private_malloc = private_malloc;
|
||||
ctx->private_free = private_free;
|
||||
ctx->memory_data = memory_data;
|
||||
}
|
||||
|
||||
return ctx;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
njs_regex_compile_ctx_t *
|
||||
njs_regex_compile_ctx_create(njs_regex_generic_ctx_t *ctx)
|
||||
{
|
||||
#ifdef NJS_HAVE_PCRE2
|
||||
pcre2_compile_context *cc;
|
||||
|
||||
cc = pcre2_compile_context_create(ctx);
|
||||
|
||||
#ifdef PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES
|
||||
if (njs_fast_path(cc != NULL)) {
|
||||
/* Workaround for surrogate pairs in regular expressions
|
||||
*
|
||||
* This option is needed because njs, unlike the standard ECMAScript,
|
||||
* stores and processes strings in UTF-8 encoding.
|
||||
* PCRE2 does not support surrogate pairs by default when it
|
||||
* is compiled for UTF-8 only strings. But many polyfills
|
||||
* and transpilers use such surrogate pairs expressions.
|
||||
*/
|
||||
pcre2_set_compile_extra_options(cc,
|
||||
PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES);
|
||||
}
|
||||
#endif
|
||||
|
||||
return cc;
|
||||
|
||||
#else
|
||||
|
||||
return ctx;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
njs_int_t
|
||||
njs_regex_escape(njs_mp_t *mp, njs_str_t *text)
|
||||
{
|
||||
#ifdef NJS_HAVE_PCRE2
|
||||
|
||||
return NJS_OK;
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* 1) PCRE with PCRE_JAVASCRIPT_COMPAT flag rejects regexps with
|
||||
* lone closing square brackets as invalid. Whereas according
|
||||
* to ES6: 11.8.5 it is a valid regexp expression.
|
||||
*
|
||||
* 2) escaping zero byte characters as "\u0000".
|
||||
*
|
||||
* Escaping it here as a workaround.
|
||||
*/
|
||||
|
||||
size_t brackets, zeros;
|
||||
u_char *p, *dst, *start, *end;
|
||||
njs_bool_t in;
|
||||
|
||||
start = text->start;
|
||||
end = text->start + text->length;
|
||||
|
||||
in = 0;
|
||||
zeros = 0;
|
||||
brackets = 0;
|
||||
|
||||
for (p = start; p < end; p++) {
|
||||
|
||||
switch (*p) {
|
||||
case '[':
|
||||
in = 1;
|
||||
break;
|
||||
|
||||
case ']':
|
||||
if (!in) {
|
||||
brackets++;
|
||||
}
|
||||
|
||||
in = 0;
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
p++;
|
||||
|
||||
if (p == end || *p != '\0') {
|
||||
break;
|
||||
}
|
||||
|
||||
/* Fall through. */
|
||||
|
||||
case '\0':
|
||||
zeros++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!brackets && !zeros) {
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
text->length = text->length + brackets + zeros * njs_length("\\u0000");
|
||||
|
||||
text->start = njs_mp_alloc(mp, text->length);
|
||||
if (njs_slow_path(text->start == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
in = 0;
|
||||
dst = text->start;
|
||||
|
||||
for (p = start; p < end; p++) {
|
||||
|
||||
switch (*p) {
|
||||
case '[':
|
||||
in = 1;
|
||||
break;
|
||||
|
||||
case ']':
|
||||
if (!in) {
|
||||
*dst++ = '\\';
|
||||
}
|
||||
|
||||
in = 0;
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
*dst++ = *p++;
|
||||
|
||||
if (p == end) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (*p != '\0') {
|
||||
break;
|
||||
}
|
||||
|
||||
/* Fall through. */
|
||||
|
||||
case '\0':
|
||||
dst = njs_cpymem(dst, "\\u0000", 6);
|
||||
continue;
|
||||
}
|
||||
|
||||
*dst++ = *p;
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
text->length = dst - text->start;
|
||||
|
||||
return NJS_OK;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
njs_int_t
|
||||
njs_regex_compile(njs_regex_t *regex, u_char *source, size_t len,
|
||||
njs_regex_flags_t flags, njs_regex_compile_ctx_t *cctx, njs_trace_t *trace)
|
||||
{
|
||||
#ifdef NJS_HAVE_PCRE2
|
||||
|
||||
int ret;
|
||||
u_char *error;
|
||||
size_t erroff;
|
||||
njs_uint_t options;
|
||||
u_char errstr[128];
|
||||
|
||||
options = PCRE2_ALT_BSUX | PCRE2_MATCH_UNSET_BACKREF;
|
||||
|
||||
if ((flags & NJS_REGEX_IGNORE_CASE)) {
|
||||
options |= PCRE2_CASELESS;
|
||||
}
|
||||
|
||||
if ((flags & NJS_REGEX_MULTILINE)) {
|
||||
options |= PCRE2_MULTILINE;
|
||||
}
|
||||
|
||||
if ((flags & NJS_REGEX_STICKY)) {
|
||||
options |= PCRE2_ANCHORED;
|
||||
}
|
||||
|
||||
if ((flags & NJS_REGEX_UTF8)) {
|
||||
options |= PCRE2_UTF;
|
||||
}
|
||||
|
||||
regex->code = pcre2_compile(source, len, options, &ret, &erroff, cctx);
|
||||
|
||||
if (njs_slow_path(regex->code == NULL)) {
|
||||
error = &source[erroff];
|
||||
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre_compile2(\"%s\") failed: %s at \"%s\"",
|
||||
source, njs_regex_pcre2_error(ret, errstr), error);
|
||||
|
||||
return NJS_DECLINED;
|
||||
}
|
||||
|
||||
ret = pcre2_pattern_info(regex->code, PCRE2_INFO_CAPTURECOUNT,
|
||||
®ex->ncaptures);
|
||||
|
||||
if (njs_slow_path(ret < 0)) {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre2_pattern_info(\"%s\", PCRE2_INFO_CAPTURECOUNT) failed: %s",
|
||||
source, njs_regex_pcre2_error(ret, errstr));
|
||||
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ret = pcre2_pattern_info(regex->code, PCRE2_INFO_BACKREFMAX,
|
||||
®ex->backrefmax);
|
||||
|
||||
if (njs_slow_path(ret < 0)) {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre2_pattern_info(\"%s\", PCRE2_INFO_BACKREFMAX) failed: %s",
|
||||
source, njs_regex_pcre2_error(ret, errstr));
|
||||
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
/* Reserve additional elements for the first "$0" capture. */
|
||||
regex->ncaptures++;
|
||||
|
||||
if (regex->ncaptures > 1) {
|
||||
ret = pcre2_pattern_info(regex->code, PCRE2_INFO_NAMECOUNT,
|
||||
®ex->nentries);
|
||||
|
||||
if (njs_slow_path(ret < 0)) {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre2_pattern_info(\"%s\", PCRE2_INFO_NAMECOUNT) failed: %s",
|
||||
source, njs_regex_pcre2_error(ret, errstr));
|
||||
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
if (regex->nentries != 0) {
|
||||
ret = pcre2_pattern_info(regex->code, PCRE2_INFO_NAMEENTRYSIZE,
|
||||
®ex->entry_size);
|
||||
|
||||
if (njs_slow_path(ret < 0)) {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre2_pattern_info(\"%s\", PCRE2_INFO_NAMEENTRYSIZE)"
|
||||
" failed: %s", source,
|
||||
njs_regex_pcre2_error(ret, errstr));
|
||||
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ret = pcre2_pattern_info(regex->code, PCRE2_INFO_NAMETABLE,
|
||||
®ex->entries);
|
||||
|
||||
if (njs_slow_path(ret < 0)) {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre2_pattern_info(\"%s\", PCRE2_INFO_NAMETABLE) "
|
||||
"failed: %s", source,
|
||||
njs_regex_pcre2_error(ret, errstr));
|
||||
|
||||
return NJS_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NJS_OK;
|
||||
|
||||
#else
|
||||
|
||||
int ret, err, erroff;
|
||||
char *pattern, *error;
|
||||
void *(*saved_malloc)(size_t size);
|
||||
void (*saved_free)(void *p);
|
||||
njs_uint_t options;
|
||||
const char *errstr;
|
||||
njs_regex_generic_ctx_t *ctx;
|
||||
|
||||
ctx = cctx;
|
||||
|
||||
ret = NJS_ERROR;
|
||||
|
||||
saved_malloc = pcre_malloc;
|
||||
pcre_malloc = njs_pcre_malloc;
|
||||
saved_free = pcre_free;
|
||||
pcre_free = njs_pcre_free;
|
||||
regex_context = ctx;
|
||||
|
||||
#ifdef PCRE_JAVASCRIPT_COMPAT
|
||||
/* JavaScript compatibility has been introduced in PCRE-7.7. */
|
||||
options = PCRE_JAVASCRIPT_COMPAT;
|
||||
#else
|
||||
options = 0;
|
||||
#endif
|
||||
|
||||
if ((flags & NJS_REGEX_IGNORE_CASE)) {
|
||||
options |= PCRE_CASELESS;
|
||||
}
|
||||
|
||||
if ((flags & NJS_REGEX_MULTILINE)) {
|
||||
options |= PCRE_MULTILINE;
|
||||
}
|
||||
|
||||
if ((flags & NJS_REGEX_STICKY)) {
|
||||
options |= PCRE_ANCHORED;
|
||||
}
|
||||
|
||||
if ((flags & NJS_REGEX_UTF8)) {
|
||||
options |= PCRE_UTF8;
|
||||
}
|
||||
|
||||
pattern = (char *) source;
|
||||
|
||||
regex->code = pcre_compile(pattern, options, &errstr, &erroff, NULL);
|
||||
|
||||
if (njs_slow_path(regex->code == NULL)) {
|
||||
error = pattern + erroff;
|
||||
|
||||
if (*error != '\0') {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre_compile(\"%s\") failed: %s at \"%s\"",
|
||||
pattern, errstr, error);
|
||||
|
||||
} else {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre_compile(\"%s\") failed: %s", pattern, errstr);
|
||||
}
|
||||
|
||||
ret = NJS_DECLINED;
|
||||
|
||||
goto done;
|
||||
}
|
||||
|
||||
regex->extra = pcre_study(regex->code, 0, &errstr);
|
||||
|
||||
if (njs_slow_path(errstr != NULL)) {
|
||||
njs_alert(trace, NJS_LEVEL_WARN,
|
||||
"pcre_study(\"%s\") failed: %s", pattern, errstr);
|
||||
}
|
||||
|
||||
err = pcre_fullinfo(regex->code, NULL, PCRE_INFO_CAPTURECOUNT,
|
||||
®ex->ncaptures);
|
||||
|
||||
if (njs_slow_path(err < 0)) {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre_fullinfo(\"%s\", PCRE_INFO_CAPTURECOUNT) failed: %d",
|
||||
pattern, err);
|
||||
|
||||
goto done;
|
||||
}
|
||||
|
||||
err = pcre_fullinfo(regex->code, NULL, PCRE_INFO_BACKREFMAX,
|
||||
®ex->backrefmax);
|
||||
|
||||
if (njs_slow_path(err < 0)) {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre_fullinfo(\"%s\", PCRE_INFO_BACKREFMAX) failed: %d",
|
||||
pattern, err);
|
||||
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Reserve additional elements for the first "$0" capture. */
|
||||
regex->ncaptures++;
|
||||
|
||||
if (regex->ncaptures > 1) {
|
||||
err = pcre_fullinfo(regex->code, NULL, PCRE_INFO_NAMECOUNT,
|
||||
®ex->nentries);
|
||||
|
||||
if (njs_slow_path(err < 0)) {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR,
|
||||
"pcre_fullinfo(\"%s\", PCRE_INFO_NAMECOUNT) failed: %d",
|
||||
pattern, err);
|
||||
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (regex->nentries != 0) {
|
||||
err = pcre_fullinfo(regex->code, NULL, PCRE_INFO_NAMEENTRYSIZE,
|
||||
®ex->entry_size);
|
||||
|
||||
if (njs_slow_path(err < 0)) {
|
||||
njs_alert(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 (njs_slow_path(err < 0)) {
|
||||
njs_alert(trace, NJS_LEVEL_ERROR, "pcre_fullinfo(\"%s\", "
|
||||
"PCRE_INFO_NAMETABLE) failed: %d", pattern, err);
|
||||
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ret = NJS_OK;
|
||||
|
||||
done:
|
||||
|
||||
pcre_malloc = saved_malloc;
|
||||
pcre_free = saved_free;
|
||||
regex_context = NULL;
|
||||
|
||||
return ret;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
njs_bool_t
|
||||
njs_regex_is_valid(njs_regex_t *regex)
|
||||
{
|
||||
return (regex->code != NULL);
|
||||
}
|
||||
|
||||
|
||||
njs_int_t
|
||||
njs_regex_named_captures(njs_regex_t *regex, njs_str_t *name, int n)
|
||||
{
|
||||
char *entry;
|
||||
|
||||
if (name == NULL) {
|
||||
return regex->nentries;
|
||||
}
|
||||
|
||||
if (n >= regex->nentries) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
entry = regex->entries + regex->entry_size * n;
|
||||
|
||||
name->start = (u_char *) entry + 2;
|
||||
name->length = njs_strlen(name->start);
|
||||
|
||||
return (entry[0] << 8) + entry[1];
|
||||
}
|
||||
|
||||
|
||||
njs_regex_match_data_t *
|
||||
njs_regex_match_data(njs_regex_t *regex, njs_regex_generic_ctx_t *ctx)
|
||||
{
|
||||
#ifdef NJS_HAVE_PCRE2
|
||||
|
||||
if (regex != NULL) {
|
||||
return pcre2_match_data_create_from_pattern(regex->code, ctx);
|
||||
}
|
||||
|
||||
return pcre2_match_data_create(0, ctx);
|
||||
|
||||
#else
|
||||
|
||||
size_t size;
|
||||
njs_uint_t ncaptures;
|
||||
njs_regex_match_data_t *match_data;
|
||||
|
||||
if (regex != NULL) {
|
||||
ncaptures = regex->ncaptures - 1;
|
||||
|
||||
} else {
|
||||
ncaptures = 0;
|
||||
}
|
||||
|
||||
/* Each capture is stored in 3 "int" vector elements. */
|
||||
ncaptures *= 3;
|
||||
size = sizeof(njs_regex_match_data_t) + ncaptures * sizeof(int);
|
||||
|
||||
match_data = ctx->private_malloc(size, ctx->memory_data);
|
||||
|
||||
if (njs_fast_path(match_data != NULL)) {
|
||||
match_data->ncaptures = ncaptures + 3;
|
||||
}
|
||||
|
||||
return match_data;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
njs_regex_match_data_free(njs_regex_match_data_t *match_data,
|
||||
njs_regex_generic_ctx_t *ctx)
|
||||
{
|
||||
#ifdef NJS_HAVE_PCRE2
|
||||
|
||||
pcre2_match_data_free(match_data);
|
||||
|
||||
#else
|
||||
|
||||
ctx->private_free(match_data, ctx->memory_data);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
njs_int_t
|
||||
njs_regex_match(njs_regex_t *regex, const u_char *subject, size_t off,
|
||||
size_t len, njs_regex_match_data_t *match_data, njs_trace_t *trace)
|
||||
{
|
||||
#ifdef NJS_HAVE_PCRE2
|
||||
|
||||
int ret;
|
||||
u_char errstr[128];
|
||||
|
||||
ret = pcre2_match(regex->code, subject, len, off, 0, match_data, NULL);
|
||||
|
||||
if (ret < 0) {
|
||||
if (ret == PCRE2_ERROR_NOMATCH) {
|
||||
return NJS_DECLINED;
|
||||
}
|
||||
|
||||
njs_alert(trace, NJS_LEVEL_ERROR, "pcre2_match() failed: %s",
|
||||
njs_regex_pcre2_error(ret, errstr));
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
#else
|
||||
|
||||
int ret;
|
||||
|
||||
ret = pcre_exec(regex->code, regex->extra, (const char *) subject, len,
|
||||
off, 0, match_data->captures, match_data->ncaptures);
|
||||
|
||||
if (ret <= PCRE_ERROR_NOMATCH) {
|
||||
if (ret == PCRE_ERROR_NOMATCH) {
|
||||
return NJS_DECLINED;
|
||||
}
|
||||
|
||||
njs_alert(trace, NJS_LEVEL_ERROR, "pcre_exec() failed: %d", ret);
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
njs_regex_capture(njs_regex_match_data_t *match_data, njs_uint_t n)
|
||||
{
|
||||
#ifdef NJS_HAVE_PCRE2
|
||||
|
||||
size_t c;
|
||||
|
||||
c = pcre2_get_ovector_pointer(match_data)[n];
|
||||
|
||||
if (c == PCRE2_UNSET) {
|
||||
return NJS_REGEX_UNSET;
|
||||
}
|
||||
|
||||
return c;
|
||||
|
||||
#else
|
||||
|
||||
return match_data->captures[n];
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef NJS_HAVE_PCRE2
|
||||
|
||||
static const u_char *
|
||||
njs_regex_pcre2_error(int errcode, u_char buffer[128])
|
||||
{
|
||||
pcre2_get_error_message(errcode, buffer, 128);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void *
|
||||
njs_pcre_malloc(size_t size)
|
||||
{
|
||||
return regex_context->private_malloc(size, regex_context->memory_data);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
njs_pcre_free(void *p)
|
||||
{
|
||||
regex_context->private_free(p, regex_context->memory_data);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,34 +0,0 @@
|
|||
ngx_addon_name="ngx_js_module"
|
||||
|
||||
NJS_DEPS="$ngx_addon_dir/ngx_js.h \
|
||||
$ngx_addon_dir/ngx_js_fetch.h"
|
||||
NJS_SRCS="$ngx_addon_dir/ngx_js.c \
|
||||
$ngx_addon_dir/ngx_js_fetch.c \
|
||||
$ngx_addon_dir/ngx_js_regex.c \
|
||||
$ngx_addon_dir/../external/njs_webcrypto_module.c"
|
||||
|
||||
if [ $HTTP != NO ]; then
|
||||
ngx_module_type=HTTP_AUX_FILTER
|
||||
ngx_module_name=ngx_http_js_module
|
||||
ngx_module_incs="$ngx_addon_dir/../src $ngx_addon_dir/../build"
|
||||
ngx_module_deps="$ngx_addon_dir/../build/libnjs.a $NJS_DEPS"
|
||||
ngx_module_srcs="$ngx_addon_dir/ngx_http_js_module.c $NJS_SRCS"
|
||||
ngx_module_libs="PCRE OPENSSL $ngx_addon_dir/../build/libnjs.a -lm"
|
||||
|
||||
. auto/module
|
||||
|
||||
if [ "$ngx_module_link" != DYNAMIC ]; then
|
||||
NJS_SRCS=
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $STREAM != NO ]; then
|
||||
ngx_module_type=STREAM
|
||||
ngx_module_name=ngx_stream_js_module
|
||||
ngx_module_incs="$ngx_addon_dir/../src $ngx_addon_dir/../build"
|
||||
ngx_module_deps="$ngx_addon_dir/../build/libnjs.a $NJS_DEPS"
|
||||
ngx_module_srcs="$ngx_addon_dir/ngx_stream_js_module.c $NJS_SRCS"
|
||||
ngx_module_libs="PCRE OPENSSL $ngx_addon_dir/../build/libnjs.a -lm"
|
||||
|
||||
. auto/module
|
||||
fi
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
cat << END >> $NGX_MAKEFILE
|
||||
|
||||
$ngx_addon_dir/../build/libnjs.a: $NGX_MAKEFILE
|
||||
cd $ngx_addon_dir/.. \\
|
||||
&& if [ -f build/Makefile ]; then \$(MAKE) clean; fi \\
|
||||
&& CFLAGS="\$(CFLAGS)" CC="\$(CC)" ./configure --no-openssl --no-pcre \\
|
||||
&& \$(MAKE) libnjs
|
||||
|
||||
END
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,154 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Roman Arutyunyan
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _NGX_JS_H_INCLUDED_
|
||||
#define _NGX_JS_H_INCLUDED_
|
||||
|
||||
|
||||
#include <ngx_config.h>
|
||||
#include <ngx_core.h>
|
||||
#include <njs.h>
|
||||
|
||||
|
||||
#define NGX_JS_UNSET 0
|
||||
#define NGX_JS_DEPRECATED 1
|
||||
#define NGX_JS_STRING 2
|
||||
#define NGX_JS_BUFFER 4
|
||||
#define NGX_JS_BOOLEAN 8
|
||||
#define NGX_JS_NUMBER 16
|
||||
|
||||
#define NGX_JS_BOOL_FALSE 0
|
||||
#define NGX_JS_BOOL_TRUE 1
|
||||
#define NGX_JS_BOOL_UNSET 2
|
||||
|
||||
#define ngx_js_buffer_type(btype) ((btype) & ~NGX_JS_DEPRECATED)
|
||||
|
||||
|
||||
typedef ngx_pool_t *(*ngx_external_pool_pt)(njs_vm_t *vm, njs_external_ptr_t e);
|
||||
typedef void (*ngx_js_event_handler_pt)(njs_external_ptr_t e,
|
||||
njs_vm_event_t vm_event, njs_value_t *args, njs_uint_t nargs);
|
||||
typedef ngx_resolver_t *(*ngx_external_resolver_pt)(njs_vm_t *vm,
|
||||
njs_external_ptr_t e);
|
||||
typedef ngx_msec_t (*ngx_external_timeout_pt)(njs_vm_t *vm,
|
||||
njs_external_ptr_t e);
|
||||
typedef ngx_flag_t (*ngx_external_flag_pt)(njs_vm_t *vm,
|
||||
njs_external_ptr_t e);
|
||||
typedef ngx_flag_t (*ngx_external_size_pt)(njs_vm_t *vm,
|
||||
njs_external_ptr_t e);
|
||||
typedef ngx_ssl_t *(*ngx_external_ssl_pt)(njs_vm_t *vm, njs_external_ptr_t e);
|
||||
|
||||
typedef struct {
|
||||
ngx_str_t name;
|
||||
ngx_str_t path;
|
||||
u_char *file;
|
||||
ngx_uint_t line;
|
||||
} ngx_js_named_path_t;
|
||||
|
||||
|
||||
#define _NGX_JS_COMMON_CONF \
|
||||
njs_vm_t *vm; \
|
||||
ngx_array_t *imports; \
|
||||
ngx_array_t *paths; \
|
||||
\
|
||||
njs_vm_t *preload_vm; \
|
||||
ngx_array_t *preload_objects; \
|
||||
\
|
||||
size_t buffer_size; \
|
||||
size_t max_response_body_size; \
|
||||
ngx_msec_t timeout
|
||||
|
||||
|
||||
#if defined(NGX_HTTP_SSL) || defined(NGX_STREAM_SSL)
|
||||
#define NGX_JS_COMMON_CONF \
|
||||
_NGX_JS_COMMON_CONF; \
|
||||
\
|
||||
ngx_ssl_t *ssl; \
|
||||
ngx_str_t ssl_ciphers; \
|
||||
ngx_uint_t ssl_protocols; \
|
||||
ngx_flag_t ssl_verify; \
|
||||
ngx_int_t ssl_verify_depth; \
|
||||
ngx_str_t ssl_trusted_certificate
|
||||
|
||||
#else
|
||||
#define NGX_JS_COMMON_CONF _NGX_JS_COMMON_CONF
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct {
|
||||
NGX_JS_COMMON_CONF;
|
||||
} ngx_js_conf_t;
|
||||
|
||||
|
||||
#define ngx_external_connection(vm, e) \
|
||||
(*((ngx_connection_t **) ((u_char *) (e) + njs_vm_meta(vm, 0))))
|
||||
#define ngx_external_pool(vm, e) \
|
||||
((ngx_external_pool_pt) njs_vm_meta(vm, 1))(vm, e)
|
||||
#define ngx_external_resolver(vm, e) \
|
||||
((ngx_external_resolver_pt) njs_vm_meta(vm, 2))(vm, e)
|
||||
#define ngx_external_resolver_timeout(vm, e) \
|
||||
((ngx_external_timeout_pt) njs_vm_meta(vm, 3))(vm, e)
|
||||
#define ngx_external_event_handler(vm, e) \
|
||||
((ngx_js_event_handler_pt) njs_vm_meta(vm, 4))
|
||||
#define ngx_external_ssl(vm, e) \
|
||||
((ngx_external_ssl_pt) njs_vm_meta(vm, 5))(vm, e)
|
||||
#define ngx_external_ssl_verify(vm, e) \
|
||||
((ngx_external_flag_pt) njs_vm_meta(vm, 6))(vm, e)
|
||||
#define ngx_external_fetch_timeout(vm, e) \
|
||||
((ngx_external_timeout_pt) njs_vm_meta(vm, 7))(vm, e)
|
||||
#define ngx_external_buffer_size(vm, e) \
|
||||
((ngx_external_size_pt) njs_vm_meta(vm, 8))(vm, e)
|
||||
#define ngx_external_max_response_buffer_size(vm, e) \
|
||||
((ngx_external_size_pt) njs_vm_meta(vm, 9))(vm, e)
|
||||
|
||||
|
||||
#define ngx_js_prop(vm, type, value, start, len) \
|
||||
((type == NGX_JS_STRING) ? njs_vm_value_string_set(vm, value, start, len) \
|
||||
: njs_vm_value_buffer_set(vm, value, start, len))
|
||||
|
||||
|
||||
ngx_int_t ngx_js_call(njs_vm_t *vm, ngx_str_t *fname, ngx_log_t *log,
|
||||
njs_opaque_value_t *args, njs_uint_t nargs);
|
||||
ngx_int_t ngx_js_retval(njs_vm_t *vm, njs_opaque_value_t *retval,
|
||||
ngx_str_t *s);
|
||||
|
||||
njs_int_t ngx_js_ext_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t level);
|
||||
void ngx_js_logger(njs_vm_t *vm, njs_external_ptr_t external,
|
||||
njs_log_level_t level, const u_char *start, size_t length);
|
||||
char * ngx_js_import(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
|
||||
char * ngx_js_preload_object(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
|
||||
ngx_int_t ngx_js_init_preload_vm(ngx_conf_t *cf, ngx_js_conf_t *conf);
|
||||
ngx_int_t ngx_js_merge_vm(ngx_conf_t *cf, ngx_js_conf_t *conf,
|
||||
ngx_js_conf_t *prev,
|
||||
ngx_int_t (*init_vm)(ngx_conf_t *cf, ngx_js_conf_t *conf));
|
||||
ngx_int_t ngx_js_init_conf_vm(ngx_conf_t *cf, ngx_js_conf_t *conf,
|
||||
njs_vm_opt_t *options,
|
||||
ngx_int_t (*externals_init)(ngx_conf_t *cf, ngx_js_conf_t *conf));
|
||||
ngx_js_conf_t *ngx_js_create_conf(ngx_conf_t *cf, size_t size);
|
||||
char * ngx_js_merge_conf(ngx_conf_t *cf, void *parent, void *child,
|
||||
ngx_int_t (*init_vm)(ngx_conf_t *cf, ngx_js_conf_t *conf));
|
||||
|
||||
njs_int_t ngx_js_ext_string(njs_vm_t *vm, njs_object_prop_t *prop,
|
||||
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
|
||||
njs_int_t ngx_js_ext_uint(njs_vm_t *vm, njs_object_prop_t *prop,
|
||||
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
|
||||
njs_int_t ngx_js_ext_constant(njs_vm_t *vm, njs_object_prop_t *prop,
|
||||
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
|
||||
njs_int_t ngx_js_ext_flags(njs_vm_t *vm, njs_object_prop_t *prop,
|
||||
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
|
||||
|
||||
ngx_int_t ngx_js_core_init(njs_vm_t *vm, ngx_log_t *log);
|
||||
|
||||
ngx_int_t ngx_js_string(njs_vm_t *vm, njs_value_t *value, njs_str_t *str);
|
||||
ngx_int_t ngx_js_integer(njs_vm_t *vm, njs_value_t *value, ngx_int_t *n);
|
||||
|
||||
|
||||
extern njs_module_t *njs_js_addon_modules[];
|
||||
|
||||
|
||||
#endif /* _NGX_JS_H_INCLUDED_ */
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,18 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _NGX_JS_FETCH_H_INCLUDED_
|
||||
#define _NGX_JS_FETCH_H_INCLUDED_
|
||||
|
||||
|
||||
njs_int_t ngx_js_ext_fetch(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t level);
|
||||
|
||||
ngx_int_t ngx_js_fetch_init(njs_vm_t *vm, ngx_log_t *log);
|
||||
|
||||
|
||||
#endif /* _NGX_JS_FETCH_H_INCLUDED_ */
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <ngx_config.h>
|
||||
|
||||
#if (NGX_PCRE2)
|
||||
|
||||
#define NJS_HAVE_PCRE2 1
|
||||
|
||||
#endif
|
||||
|
||||
#include "../external/njs_regex.c"
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,504 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*
|
||||
* njs public header.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_H_INCLUDED_
|
||||
#define _NJS_H_INCLUDED_
|
||||
|
||||
#include <njs_auto_config.h>
|
||||
|
||||
#define NJS_VERSION "0.7.9"
|
||||
#define NJS_VERSION_NUMBER 0x000709
|
||||
|
||||
|
||||
#include <unistd.h> /* STDOUT_FILENO, STDERR_FILENO */
|
||||
#include <njs_types.h>
|
||||
#include <njs_clang.h>
|
||||
#include <njs_str.h>
|
||||
#include <njs_unicode.h>
|
||||
#include <njs_utf8.h>
|
||||
#include <njs_mp.h>
|
||||
#include <njs_chb.h>
|
||||
#include <njs_lvlhsh.h>
|
||||
#include <njs_sprintf.h>
|
||||
|
||||
|
||||
typedef uintptr_t njs_index_t;
|
||||
typedef struct njs_vm_s njs_vm_t;
|
||||
typedef struct njs_mod_s njs_mod_t;
|
||||
typedef union njs_value_s njs_value_t;
|
||||
typedef struct njs_function_s njs_function_t;
|
||||
typedef struct njs_vm_shared_s njs_vm_shared_t;
|
||||
typedef struct njs_object_prop_s njs_object_prop_t;
|
||||
typedef struct njs_external_s njs_external_t;
|
||||
|
||||
/*
|
||||
* njs_opaque_value_t is the external storage type for native njs_value_t type.
|
||||
* sizeof(njs_opaque_value_t) == sizeof(njs_value_t).
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
uint64_t filler[2];
|
||||
} njs_opaque_value_t;
|
||||
|
||||
typedef enum {
|
||||
NJS_LOG_LEVEL_ERROR = 4,
|
||||
NJS_LOG_LEVEL_WARN = 5,
|
||||
NJS_LOG_LEVEL_INFO = 7,
|
||||
} njs_log_level_t;
|
||||
|
||||
/* sizeof(njs_value_t) is 16 bytes. */
|
||||
#define njs_argument(args, n) \
|
||||
(njs_value_t *) ((u_char *) args + (n) * 16)
|
||||
|
||||
|
||||
extern const njs_value_t njs_value_undefined;
|
||||
|
||||
#define njs_arg(args, nargs, n) \
|
||||
((n < nargs) ? njs_argument(args, n) \
|
||||
: (njs_value_t *) &njs_value_undefined)
|
||||
|
||||
#define njs_value_assign(dst, src) \
|
||||
memcpy(dst, src, sizeof(njs_opaque_value_t))
|
||||
|
||||
#define njs_value_arg(val) ((njs_value_t *) val)
|
||||
|
||||
#define njs_lvalue_arg(lvalue, args, nargs, n) \
|
||||
((n < nargs) ? njs_argument(args, n) \
|
||||
: (njs_value_assign(lvalue, &njs_value_undefined), lvalue))
|
||||
|
||||
#define njs_vm_error(vm, fmt, ...) \
|
||||
njs_vm_value_error_set(vm, njs_vm_retval(vm), fmt, ##__VA_ARGS__)
|
||||
|
||||
#define njs_vm_log(vm, fmt, ...) njs_vm_logger(vm, NJS_LOG_LEVEL_INFO, fmt, \
|
||||
##__VA_ARGS__)
|
||||
#define njs_vm_warn(vm, fmt, ...) njs_vm_logger(vm, NJS_LOG_LEVEL_WARN, fmt, \
|
||||
##__VA_ARGS__)
|
||||
#define njs_vm_err(vm, fmt, ...) njs_vm_logger(vm, NJS_LOG_LEVEL_ERROR, fmt, \
|
||||
##__VA_ARGS__)
|
||||
|
||||
#define njs_deprecated(vm, text) \
|
||||
do { \
|
||||
static njs_bool_t reported; \
|
||||
\
|
||||
if (!reported) { \
|
||||
njs_vm_warn(vm, text " is deprecated " \
|
||||
"and will be removed in the future"); \
|
||||
reported = 1; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
/*
|
||||
* njs_prop_handler_t operates as a property getter/setter or delete handler.
|
||||
* - retval != NULL && setval == NULL - GET context.
|
||||
* - retval != NULL && setval != NULL - SET context.
|
||||
* - retval == NULL - DELETE context.
|
||||
*
|
||||
* njs_prop_handler_t is expected to return:
|
||||
* NJS_OK - handler executed successfully;
|
||||
* NJS_DECLINED - handler was applied to inappropriate object, retval
|
||||
* contains undefined value;
|
||||
* NJS_ERROR - some error, vm->retval contains appropriate exception.
|
||||
*/
|
||||
typedef njs_int_t (*njs_prop_handler_t) (njs_vm_t *vm, njs_object_prop_t *prop,
|
||||
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
|
||||
typedef njs_int_t (*njs_exotic_keys_t)(njs_vm_t *vm, njs_value_t *value,
|
||||
njs_value_t *retval);
|
||||
typedef njs_int_t (*njs_function_native_t) (njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t magic8);
|
||||
|
||||
|
||||
typedef enum {
|
||||
NJS_SYMBOL_INVALID,
|
||||
NJS_SYMBOL_ASYNC_ITERATOR,
|
||||
NJS_SYMBOL_HAS_INSTANCE,
|
||||
NJS_SYMBOL_IS_CONCAT_SPREADABLE,
|
||||
NJS_SYMBOL_ITERATOR,
|
||||
NJS_SYMBOL_MATCH,
|
||||
NJS_SYMBOL_MATCH_ALL,
|
||||
NJS_SYMBOL_REPLACE,
|
||||
NJS_SYMBOL_SEARCH,
|
||||
NJS_SYMBOL_SPECIES,
|
||||
NJS_SYMBOL_SPLIT,
|
||||
NJS_SYMBOL_TO_PRIMITIVE,
|
||||
NJS_SYMBOL_TO_STRING_TAG,
|
||||
NJS_SYMBOL_UNSCOPABLES,
|
||||
NJS_SYMBOL_KNOWN_MAX,
|
||||
} njs_wellknown_symbol_t;
|
||||
|
||||
|
||||
typedef enum {
|
||||
NJS_EXTERN_PROPERTY = 0,
|
||||
NJS_EXTERN_METHOD = 1,
|
||||
NJS_EXTERN_OBJECT = 2,
|
||||
NJS_EXTERN_SYMBOL = 4,
|
||||
} njs_extern_flag_t;
|
||||
|
||||
|
||||
typedef enum {
|
||||
NJS_EXTERN_TYPE_INT = 0,
|
||||
NJS_EXTERN_TYPE_UINT = 1,
|
||||
NJS_EXTERN_TYPE_VALUE = 2,
|
||||
} njs_extern_type_t;
|
||||
|
||||
|
||||
struct njs_external_s {
|
||||
njs_extern_flag_t flags;
|
||||
|
||||
union {
|
||||
njs_str_t string;
|
||||
uint32_t symbol;
|
||||
} name;
|
||||
|
||||
unsigned writable;
|
||||
unsigned configurable;
|
||||
unsigned enumerable;
|
||||
|
||||
union {
|
||||
struct {
|
||||
const char value[15]; /* NJS_STRING_SHORT + 1. */
|
||||
njs_prop_handler_t handler;
|
||||
uint16_t magic16;
|
||||
uint32_t magic32;
|
||||
} property;
|
||||
|
||||
struct {
|
||||
njs_function_native_t native;
|
||||
uint8_t magic8;
|
||||
uint8_t ctor;
|
||||
} method;
|
||||
|
||||
struct {
|
||||
njs_external_t *properties;
|
||||
njs_uint_t nproperties;
|
||||
|
||||
unsigned writable;
|
||||
unsigned configurable;
|
||||
unsigned enumerable;
|
||||
njs_prop_handler_t prop_handler;
|
||||
uint32_t magic32;
|
||||
njs_exotic_keys_t keys;
|
||||
} object;
|
||||
} u;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* NJS and event loops.
|
||||
*
|
||||
* njs_vm_ops_t callbacks are used to interact with the event loop environment.
|
||||
*
|
||||
* Functions get an external object as the first argument. The external
|
||||
* object is provided as the third argument to njs_vm_clone().
|
||||
*
|
||||
* The callbacks are expected to return to the VM the unique id of an
|
||||
* underlying event. This id will be passed as the second argument to
|
||||
* njs_event_destructor() at the moment the VM wants to destroy it.
|
||||
*
|
||||
* When an underlying events fires njs_vm_post_event() should be invoked with
|
||||
* the value provided as vm_event.
|
||||
*
|
||||
* The events posted by njs_vm_post_event() are processed as soon as
|
||||
* njs_vm_run() is invoked. njs_vm_run() returns NJS_AGAIN until pending events
|
||||
* are present.
|
||||
*/
|
||||
|
||||
typedef void * njs_vm_event_t;
|
||||
typedef void * njs_host_event_t;
|
||||
typedef void * njs_external_ptr_t;
|
||||
|
||||
typedef njs_host_event_t (*njs_set_timer_t)(njs_external_ptr_t external,
|
||||
uint64_t delay, njs_vm_event_t vm_event);
|
||||
typedef void (*njs_event_destructor_t)(njs_external_ptr_t external,
|
||||
njs_host_event_t event);
|
||||
typedef njs_mod_t *(*njs_module_loader_t)(njs_vm_t *vm,
|
||||
njs_external_ptr_t external, njs_str_t *name);
|
||||
typedef void (*njs_logger_t)(njs_vm_t *vm, njs_external_ptr_t external,
|
||||
njs_log_level_t level, const u_char *start, size_t length);
|
||||
|
||||
|
||||
typedef struct {
|
||||
njs_set_timer_t set_timer;
|
||||
njs_event_destructor_t clear_timer;
|
||||
njs_module_loader_t module_loader;
|
||||
njs_logger_t logger;
|
||||
} njs_vm_ops_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
size_t size;
|
||||
uintptr_t *values;
|
||||
} njs_vm_meta_t;
|
||||
|
||||
|
||||
typedef njs_int_t (*njs_addon_init_pt)(njs_vm_t *vm);
|
||||
|
||||
typedef struct {
|
||||
njs_str_t name;
|
||||
njs_addon_init_pt init;
|
||||
} njs_module_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
njs_external_ptr_t external;
|
||||
njs_vm_shared_t *shared;
|
||||
njs_vm_ops_t *ops;
|
||||
njs_vm_meta_t *metas;
|
||||
njs_module_t **addons;
|
||||
njs_str_t file;
|
||||
|
||||
char **argv;
|
||||
njs_uint_t argc;
|
||||
|
||||
njs_uint_t max_stack_size;
|
||||
|
||||
njs_log_level_t log_level;
|
||||
|
||||
#define NJS_VM_OPT_UNHANDLED_REJECTION_IGNORE 0
|
||||
#define NJS_VM_OPT_UNHANDLED_REJECTION_THROW 1
|
||||
|
||||
/*
|
||||
* interactive - enables "interactive" mode.
|
||||
* (REPL). Allows starting parent VM without cloning.
|
||||
* disassemble - enables disassemble.
|
||||
* backtrace - enables backtraces.
|
||||
* quiet - removes filenames from backtraces. To produce comparable
|
||||
test262 diffs.
|
||||
* sandbox - "sandbox" mode. Disables file access.
|
||||
* unsafe - enables unsafe language features:
|
||||
* - Function constructors.
|
||||
* module - ES6 "module" mode. Script mode is default.
|
||||
* ast - print AST.
|
||||
* unhandled_rejection IGNORE | THROW - tracks unhandled promise rejections:
|
||||
* - throwing inside a Promise without a catch block.
|
||||
* - throwing inside in a finally or catch block.
|
||||
*/
|
||||
uint8_t interactive; /* 1 bit */
|
||||
uint8_t trailer; /* 1 bit */
|
||||
uint8_t init; /* 1 bit */
|
||||
uint8_t disassemble; /* 1 bit */
|
||||
uint8_t backtrace; /* 1 bit */
|
||||
uint8_t quiet; /* 1 bit */
|
||||
uint8_t sandbox; /* 1 bit */
|
||||
uint8_t unsafe; /* 1 bit */
|
||||
uint8_t module; /* 1 bit */
|
||||
uint8_t ast; /* 1 bit */
|
||||
#ifdef NJS_DEBUG_OPCODE
|
||||
uint8_t opcode_debug; /* 1 bit */
|
||||
#endif
|
||||
#ifdef NJS_DEBUG_GENERATOR
|
||||
uint8_t generator_debug; /* 1 bit */
|
||||
#endif
|
||||
uint8_t unhandled_rejection;
|
||||
} njs_vm_opt_t;
|
||||
|
||||
|
||||
NJS_EXPORT void njs_vm_opt_init(njs_vm_opt_t *options);
|
||||
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_mod_t *njs_vm_compile_module(njs_vm_t *vm, njs_str_t *name,
|
||||
u_char **start, u_char *end);
|
||||
NJS_EXPORT njs_vm_t *njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external);
|
||||
|
||||
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);
|
||||
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.
|
||||
*/
|
||||
NJS_EXPORT njs_int_t njs_vm_waiting(njs_vm_t *vm);
|
||||
|
||||
/*
|
||||
* Returns 1 if posted events are ready to be executed.
|
||||
*/
|
||||
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))
|
||||
|
||||
#define njs_vm_unhandled_rejection(vm) \
|
||||
((vm)->options.unhandled_rejection == NJS_VM_OPT_UNHANDLED_REJECTION_THROW \
|
||||
&& (vm)->promise_reason != NULL && (vm)->promise_reason->length != 0)
|
||||
|
||||
/*
|
||||
* Runs the specified function with provided arguments.
|
||||
* NJS_OK successful run.
|
||||
* NJS_ERROR some exception or internal error happens.
|
||||
*
|
||||
* njs_vm_retval(vm) can be used to get the retval or exception value.
|
||||
*/
|
||||
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_value_t *retval);
|
||||
|
||||
/*
|
||||
* Runs posted events.
|
||||
* NJS_OK successfully processed all posted events, no more events.
|
||||
* NJS_AGAIN successfully processed all events, some posted events are
|
||||
* still pending.
|
||||
* NJS_ERROR some exception or internal error happens.
|
||||
* njs_vm_retval(vm) can be used to get the retval or exception value.
|
||||
*/
|
||||
NJS_EXPORT njs_int_t njs_vm_run(njs_vm_t *vm);
|
||||
|
||||
/*
|
||||
* Runs the global code.
|
||||
* NJS_OK successful run.
|
||||
* NJS_ERROR some exception or internal error happens.
|
||||
*
|
||||
* njs_vm_retval(vm) can be used to get the retval or exception value.
|
||||
*/
|
||||
NJS_EXPORT njs_int_t njs_vm_start(njs_vm_t *vm);
|
||||
|
||||
NJS_EXPORT njs_int_t njs_vm_add_path(njs_vm_t *vm, const njs_str_t *path);
|
||||
|
||||
#define NJS_PROTO_ID_ANY (-1)
|
||||
|
||||
NJS_EXPORT njs_int_t njs_vm_external_prototype(njs_vm_t *vm,
|
||||
const njs_external_t *definition, njs_uint_t n);
|
||||
NJS_EXPORT njs_int_t njs_vm_external_create(njs_vm_t *vm, njs_value_t *value,
|
||||
njs_int_t proto_id, njs_external_ptr_t external, njs_bool_t shared);
|
||||
NJS_EXPORT njs_external_ptr_t njs_vm_external(njs_vm_t *vm,
|
||||
njs_int_t proto_id, const njs_value_t *value);
|
||||
NJS_EXPORT njs_int_t njs_external_property(njs_vm_t *vm,
|
||||
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
|
||||
njs_value_t *retval);
|
||||
NJS_EXPORT uintptr_t njs_vm_meta(njs_vm_t *vm, njs_uint_t index);
|
||||
|
||||
NJS_EXPORT njs_function_t *njs_vm_function_alloc(njs_vm_t *vm,
|
||||
njs_function_native_t native);
|
||||
|
||||
NJS_EXPORT void njs_disassembler(njs_vm_t *vm);
|
||||
|
||||
NJS_EXPORT njs_int_t njs_vm_bind(njs_vm_t *vm, const njs_str_t *var_name,
|
||||
const njs_value_t *value, njs_bool_t shared);
|
||||
NJS_EXPORT njs_int_t njs_vm_value(njs_vm_t *vm, const njs_str_t *path,
|
||||
njs_value_t *retval);
|
||||
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);
|
||||
NJS_EXPORT njs_mp_t *njs_vm_memory_pool(njs_vm_t *vm);
|
||||
|
||||
/* Gets string value, no copy. */
|
||||
NJS_EXPORT void njs_value_string_get(njs_value_t *value, njs_str_t *dst);
|
||||
/*
|
||||
* Sets a byte string value.
|
||||
* start data is not copied and should not be freed.
|
||||
*/
|
||||
NJS_EXPORT njs_int_t njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value,
|
||||
const u_char *start, uint32_t size);
|
||||
NJS_EXPORT u_char *njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value,
|
||||
uint32_t size);
|
||||
NJS_EXPORT njs_int_t njs_vm_value_string_copy(njs_vm_t *vm, njs_str_t *retval,
|
||||
njs_value_t *value, uintptr_t *next);
|
||||
|
||||
NJS_EXPORT njs_int_t njs_vm_value_array_buffer_set(njs_vm_t *vm,
|
||||
njs_value_t *value, const u_char *start, uint32_t size);
|
||||
|
||||
/*
|
||||
* Sets a Buffer value.
|
||||
* start data is not copied and should not be freed.
|
||||
*/
|
||||
NJS_EXPORT njs_int_t njs_vm_value_buffer_set(njs_vm_t *vm, njs_value_t *value,
|
||||
const u_char *start, uint32_t size);
|
||||
|
||||
/*
|
||||
* Converts a value to bytes.
|
||||
*/
|
||||
NJS_EXPORT njs_int_t njs_vm_value_to_bytes(njs_vm_t *vm, njs_str_t *dst,
|
||||
njs_value_t *src);
|
||||
|
||||
/*
|
||||
* Converts a value to string.
|
||||
*/
|
||||
NJS_EXPORT njs_int_t njs_vm_value_to_string(njs_vm_t *vm, njs_str_t *dst,
|
||||
njs_value_t *src);
|
||||
|
||||
/*
|
||||
* Calls njs_vm_value_to_string(), if exception was thrown adds backtrace.
|
||||
*/
|
||||
NJS_EXPORT njs_int_t njs_vm_value_string(njs_vm_t *vm, njs_str_t *dst,
|
||||
njs_value_t *src);
|
||||
NJS_EXPORT njs_int_t njs_vm_retval_string(njs_vm_t *vm, njs_str_t *dst);
|
||||
|
||||
NJS_EXPORT njs_int_t njs_vm_value_dump(njs_vm_t *vm, njs_str_t *dst,
|
||||
njs_value_t *value, njs_uint_t console, njs_uint_t indent);
|
||||
NJS_EXPORT njs_int_t njs_vm_retval_dump(njs_vm_t *vm, njs_str_t *dst,
|
||||
njs_uint_t indent);
|
||||
|
||||
NJS_EXPORT void njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value,
|
||||
const char *fmt, ...);
|
||||
NJS_EXPORT void njs_vm_memory_error(njs_vm_t *vm);
|
||||
|
||||
NJS_EXPORT void njs_vm_logger(njs_vm_t *vm, njs_log_level_t level,
|
||||
const char *fmt, ...);
|
||||
|
||||
NJS_EXPORT void njs_value_undefined_set(njs_value_t *value);
|
||||
NJS_EXPORT void njs_value_null_set(njs_value_t *value);
|
||||
NJS_EXPORT void njs_value_invalid_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 uint8_t njs_value_bool(const njs_value_t *value);
|
||||
NJS_EXPORT double njs_value_number(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_external_tag(const njs_value_t *value);
|
||||
|
||||
NJS_EXPORT uint16_t njs_vm_prop_magic16(njs_object_prop_t *prop);
|
||||
NJS_EXPORT uint32_t njs_vm_prop_magic32(njs_object_prop_t *prop);
|
||||
NJS_EXPORT njs_int_t njs_vm_prop_name(njs_vm_t *vm, njs_object_prop_t *prop,
|
||||
njs_str_t *dst);
|
||||
|
||||
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_valid(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_array(const njs_value_t *value);
|
||||
NJS_EXPORT njs_int_t njs_value_is_function(const njs_value_t *value);
|
||||
NJS_EXPORT njs_int_t njs_value_is_buffer(const njs_value_t *value);
|
||||
|
||||
NJS_EXPORT njs_int_t njs_vm_object_alloc(njs_vm_t *vm, njs_value_t *retval,
|
||||
...);
|
||||
NJS_EXPORT njs_value_t *njs_vm_object_keys(njs_vm_t *vm, njs_value_t *value,
|
||||
njs_value_t *retval);
|
||||
NJS_EXPORT njs_value_t *njs_vm_object_prop(njs_vm_t *vm,
|
||||
njs_value_t *value, const njs_str_t *key, njs_opaque_value_t *retval);
|
||||
|
||||
NJS_EXPORT njs_int_t njs_vm_array_alloc(njs_vm_t *vm, njs_value_t *retval,
|
||||
uint32_t spare);
|
||||
NJS_EXPORT njs_int_t njs_vm_array_length(njs_vm_t *vm, njs_value_t *value,
|
||||
int64_t *length);
|
||||
NJS_EXPORT njs_value_t *njs_vm_array_start(njs_vm_t *vm, njs_value_t *value);
|
||||
NJS_EXPORT njs_value_t *njs_vm_array_prop(njs_vm_t *vm,
|
||||
njs_value_t *value, int64_t index, njs_opaque_value_t *retval);
|
||||
NJS_EXPORT njs_value_t *njs_vm_array_push(njs_vm_t *vm, njs_value_t *value);
|
||||
|
||||
NJS_EXPORT njs_int_t njs_vm_json_parse(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs);
|
||||
NJS_EXPORT njs_int_t njs_vm_json_stringify(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs);
|
||||
|
||||
NJS_EXPORT njs_int_t njs_vm_query_string_parse(njs_vm_t *vm, u_char *start,
|
||||
u_char *end, njs_value_t *retval);
|
||||
|
||||
NJS_EXPORT njs_int_t njs_vm_promise_create(njs_vm_t *vm, njs_value_t *retval,
|
||||
njs_value_t *callbacks);
|
||||
|
||||
|
||||
#endif /* _NJS_H_INCLUDED_ */
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
prefix=@PREFIX@
|
||||
libdir=@LIBDIR@
|
||||
|
||||
Name: njs
|
||||
Description: library to embed njs scripting language
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -lnjs @EXTRA_LIBS@
|
||||
Cflags: @CFLAGS@
|
||||
|
|
@ -1,265 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*
|
||||
* addr2line impementaton based upon the work by Jeff Muizelaar.
|
||||
*
|
||||
* A hacky replacement for backtrace_symbols in glibc
|
||||
*
|
||||
* backtrace_symbols in glibc looks up symbols using dladdr which is limited in
|
||||
* the symbols that it sees. libbacktracesymbols opens the executable and
|
||||
* shared libraries using libbfd and will look up backtrace information using
|
||||
* the symbol table and the dwarf line information.
|
||||
*
|
||||
* Derived from addr2line.c from GNU Binutils by Jeff Muizelaar
|
||||
*
|
||||
* Copyright 2007 Jeff Muizelaar
|
||||
*
|
||||
* addr2line.c -- convert addresses to line number and function name
|
||||
* Copyright 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Contributed by Ulrich Lauther <Ulrich.Lauther@mchp.siemens.de>
|
||||
*
|
||||
* This file was part of GNU Binutils.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <njs_main.h>
|
||||
#include <njs_addr2line.h>
|
||||
|
||||
#include <bfd.h>
|
||||
#include <link.h>
|
||||
|
||||
|
||||
typedef struct {
|
||||
const char *file;
|
||||
ElfW(Addr) address;
|
||||
ElfW(Addr) base;
|
||||
void *hdr;
|
||||
} njs_file_match_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
bfd_vma pc;
|
||||
const char *filename;
|
||||
const char *functionname;
|
||||
unsigned int line;
|
||||
njs_bool_t found;
|
||||
asymbol **syms;
|
||||
} njs_translate_address_t;
|
||||
|
||||
|
||||
static u_char *njs_process_file(u_char *buf, u_char *end, bfd_vma *addr,
|
||||
const char *file_name);
|
||||
static long njs_read_symtab(bfd *abfd, asymbol ***syms);
|
||||
static u_char *njs_translate_address(u_char *buf, u_char *end, bfd_vma *addr,
|
||||
bfd *abfd, asymbol **syms);
|
||||
static void njs_find_address_in_section(bfd *abfd, asection *section,
|
||||
void *data);
|
||||
static int njs_find_matching_file(struct dl_phdr_info *info, size_t size,
|
||||
void *data);
|
||||
|
||||
|
||||
u_char *
|
||||
_njs_addr2line(u_char *buf, u_char *end, void *address)
|
||||
{
|
||||
bfd_vma addr;
|
||||
const char *fname;
|
||||
|
||||
njs_file_match_t match = { .address = (ElfW(Addr)) address };
|
||||
|
||||
bfd_init();
|
||||
|
||||
dl_iterate_phdr(njs_find_matching_file, &match);
|
||||
|
||||
fname = "/proc/self/exe";
|
||||
if (match.file != NULL && njs_strlen(match.file)) {
|
||||
fname = match.file;
|
||||
}
|
||||
|
||||
addr = (ElfW(Addr)) address - match.base;
|
||||
|
||||
return njs_process_file(buf, end, &addr, fname);
|
||||
}
|
||||
|
||||
|
||||
static u_char *
|
||||
njs_process_file(u_char *buf, u_char *end, bfd_vma *addr, const char *file_name)
|
||||
{
|
||||
bfd *abfd;
|
||||
char **matching;
|
||||
u_char *p;
|
||||
asymbol **syms;
|
||||
|
||||
abfd = bfd_openr(file_name, NULL);
|
||||
if (abfd == NULL) {
|
||||
njs_stderror("%s: failed to open while looking for addr2line",
|
||||
file_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (bfd_check_format(abfd, bfd_archive)) {
|
||||
njs_stderror("%s: can not get addresses from archive", file_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!bfd_check_format_matches(abfd, bfd_object, &matching)) {
|
||||
njs_stderror("%s: bfd_check_format_matches() failed",
|
||||
bfd_get_filename(abfd));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (njs_read_symtab(abfd, &syms) <= 0) {
|
||||
njs_stderror("%s: njs_read_symtab() failed",
|
||||
bfd_get_filename(abfd));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
p = njs_translate_address(buf, end, addr, abfd, syms);
|
||||
|
||||
if (syms != NULL) {
|
||||
free(syms);
|
||||
syms = NULL;
|
||||
}
|
||||
|
||||
bfd_close(abfd);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
static long
|
||||
njs_read_symtab(bfd *abfd, asymbol ***syms)
|
||||
{
|
||||
long symcount;
|
||||
unsigned size;
|
||||
|
||||
if ((bfd_get_file_flags(abfd) & HAS_SYMS) == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
symcount = bfd_read_minisymbols(abfd, 0, (PTR) syms, &size);
|
||||
if (symcount == 0) {
|
||||
symcount = bfd_read_minisymbols(abfd, 1 /* dynamic */,
|
||||
(PTR) syms, &size);
|
||||
}
|
||||
|
||||
return symcount;
|
||||
}
|
||||
|
||||
|
||||
static u_char *
|
||||
njs_translate_address(u_char *buf, u_char *end, bfd_vma *addr, bfd *abfd,
|
||||
asymbol **syms)
|
||||
{
|
||||
char *h;
|
||||
const char *name;
|
||||
njs_translate_address_t ctx;
|
||||
|
||||
ctx.pc = *addr;
|
||||
ctx.found = 0;
|
||||
ctx.syms = syms;
|
||||
|
||||
bfd_map_over_sections(abfd, njs_find_address_in_section, &ctx);
|
||||
|
||||
if (!ctx.found) {
|
||||
return njs_sprintf(buf, end, "\?\? \t\?\?:0 [0x%p]", addr);
|
||||
}
|
||||
|
||||
name = ctx.functionname;
|
||||
|
||||
if (name == NULL || *name == '\0') {
|
||||
name = "??";
|
||||
}
|
||||
|
||||
if (ctx.filename != NULL) {
|
||||
h = strrchr(ctx.filename, '/');
|
||||
if (h != NULL) {
|
||||
ctx.filename = h + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return njs_sprintf(buf, end, "%s() %s:%ud [0x%p]", name,
|
||||
ctx.filename ? ctx.filename : "??", ctx.line, addr);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
njs_find_address_in_section(bfd *abfd, asection *section, void *data)
|
||||
{
|
||||
bfd_vma vma;
|
||||
bfd_size_type size;
|
||||
njs_translate_address_t *ctx;
|
||||
|
||||
ctx = data;
|
||||
|
||||
if (ctx->found) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((bfd_section_flags(section) & SEC_ALLOC) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
vma = bfd_section_vma(section);
|
||||
if (ctx->pc < vma) {
|
||||
return;
|
||||
}
|
||||
|
||||
size = bfd_section_size(section);
|
||||
if (ctx->pc >= vma + size) {
|
||||
return;
|
||||
}
|
||||
|
||||
ctx->found = bfd_find_nearest_line(abfd, section, ctx->syms, ctx->pc - vma,
|
||||
&ctx->filename, &ctx->functionname,
|
||||
&ctx->line);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
njs_find_matching_file(struct dl_phdr_info *info, size_t size, void *data)
|
||||
{
|
||||
long n;
|
||||
const ElfW(Phdr) *phdr;
|
||||
|
||||
ElfW(Addr) load_base = info->dlpi_addr;
|
||||
njs_file_match_t *match = data;
|
||||
|
||||
/*
|
||||
* This code is modeled from Gfind_proc_info-lsb.c:callback()
|
||||
* from libunwind.
|
||||
*/
|
||||
|
||||
phdr = info->dlpi_phdr;
|
||||
|
||||
for (n = info->dlpi_phnum; --n >= 0; phdr++) {
|
||||
if (phdr->p_type == PT_LOAD) {
|
||||
ElfW(Addr) vaddr = phdr->p_vaddr + load_base;
|
||||
|
||||
if (match->address >= vaddr
|
||||
&& match->address < vaddr + phdr->p_memsz)
|
||||
{
|
||||
/* we found a match */
|
||||
match->file = info->dlpi_name;
|
||||
match->base = info->dlpi_addr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) Nginx, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_ADDR2LINE_H_INCLUDED_
|
||||
#define _NJS_ADDR2LINE_H_INCLUDED_
|
||||
|
||||
|
||||
u_char *_njs_addr2line(u_char *buf, u_char *end, void *address);
|
||||
|
||||
|
||||
#if defined(NJS_HAVE_LIBBFD) && defined(NJS_HAVE_DL_ITERATE_PHDR)
|
||||
#define NJS_HAVE_ADDR2LINE 1
|
||||
#define njs_addr2line(buf, end, addr) _njs_addr2line(buf, end, addr)
|
||||
#else
|
||||
#define njs_addr2line(buf, end, addr) \
|
||||
njs_sprintf(buf, end, "\?\?() \?\?:0 [0x%p]", addr)
|
||||
#endif
|
||||
|
||||
#endif /* _NJS_ADDR2LINE_H_INCLUDED_ */
|
||||
|
|
@ -1,164 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.h>
|
||||
|
||||
|
||||
njs_arr_t *
|
||||
njs_arr_create(njs_mp_t *mp, njs_uint_t n, size_t size)
|
||||
{
|
||||
njs_arr_t *arr;
|
||||
|
||||
arr = njs_mp_alloc(mp, sizeof(njs_arr_t) + n * size);
|
||||
if (njs_slow_path(arr == NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
arr->start = (char *) arr + sizeof(njs_arr_t);
|
||||
arr->items = 0;
|
||||
arr->item_size = size;
|
||||
arr->available = n;
|
||||
arr->pointer = 1;
|
||||
arr->separate = 0;
|
||||
arr->mem_pool = mp;
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
njs_arr_init(njs_mp_t *mp, njs_arr_t *arr, void *start, njs_uint_t n,
|
||||
size_t size)
|
||||
{
|
||||
arr->start = start;
|
||||
arr->items = n;
|
||||
arr->item_size = size;
|
||||
arr->available = n;
|
||||
arr->pointer = 0;
|
||||
arr->separate = 0;
|
||||
arr->mem_pool = mp;
|
||||
|
||||
if (arr->start == NULL) {
|
||||
arr->separate = 1;
|
||||
arr->items = 0;
|
||||
|
||||
arr->start = njs_mp_alloc(mp, n * size);
|
||||
}
|
||||
|
||||
return arr->start;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
njs_arr_destroy(njs_arr_t *arr)
|
||||
{
|
||||
if (arr->separate) {
|
||||
njs_mp_free(arr->mem_pool, arr->start);
|
||||
#if (NJS_DEBUG)
|
||||
arr->start = NULL;
|
||||
arr->items = 0;
|
||||
arr->available = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (arr->pointer) {
|
||||
njs_mp_free(arr->mem_pool, arr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
njs_arr_add(njs_arr_t *arr)
|
||||
{
|
||||
return njs_arr_add_multiple(arr, 1);
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
njs_arr_add_multiple(njs_arr_t *arr, njs_uint_t items)
|
||||
{
|
||||
void *item, *start, *old;
|
||||
uint32_t n;
|
||||
|
||||
n = arr->available;
|
||||
items += arr->items;
|
||||
|
||||
if (items >= n) {
|
||||
|
||||
if (n < 16) {
|
||||
/* Allocate new arr twice as much as current. */
|
||||
n *= 2;
|
||||
|
||||
} else {
|
||||
/* Allocate new arr half as much as current. */
|
||||
n += n / 2;
|
||||
}
|
||||
|
||||
if (n < items) {
|
||||
n = items;
|
||||
}
|
||||
|
||||
start = njs_mp_alloc(arr->mem_pool, n * arr->item_size);
|
||||
if (njs_slow_path(start == NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
arr->available = n;
|
||||
old = arr->start;
|
||||
arr->start = start;
|
||||
|
||||
memcpy(start, old, arr->items * arr->item_size);
|
||||
|
||||
if (arr->separate == 0) {
|
||||
arr->separate = 1;
|
||||
|
||||
} else {
|
||||
njs_mp_free(arr->mem_pool, old);
|
||||
}
|
||||
}
|
||||
|
||||
item = (char *) arr->start + arr->items * arr->item_size;
|
||||
|
||||
arr->items = items;
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
njs_arr_zero_add(njs_arr_t *arr)
|
||||
{
|
||||
void *item;
|
||||
|
||||
item = njs_arr_add(arr);
|
||||
|
||||
if (njs_fast_path(item != NULL)) {
|
||||
njs_memzero(item, arr->item_size);
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
njs_arr_remove(njs_arr_t *arr, void *item)
|
||||
{
|
||||
u_char *next, *last, *end;
|
||||
uint32_t item_size;
|
||||
|
||||
item_size = arr->item_size;
|
||||
end = (u_char *) arr->start + item_size * arr->items;
|
||||
last = end - item_size;
|
||||
|
||||
if (item != last) {
|
||||
next = (u_char *) item + item_size;
|
||||
|
||||
memmove(item, next, end - next);
|
||||
}
|
||||
|
||||
arr->items--;
|
||||
}
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
|
||||
/*
|
||||
* 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 2**32 items.
|
||||
* the item size is no more than 64K.
|
||||
*/
|
||||
uint32_t items;
|
||||
uint32_t available;
|
||||
uint16_t item_size;
|
||||
|
||||
uint8_t pointer;
|
||||
uint8_t separate;
|
||||
njs_mp_t *mem_pool;
|
||||
} njs_arr_t;
|
||||
|
||||
|
||||
NJS_EXPORT njs_arr_t *njs_arr_create(njs_mp_t *mp, njs_uint_t n,
|
||||
size_t size);
|
||||
NJS_EXPORT void *njs_arr_init(njs_mp_t *mp, njs_arr_t *arr, void *start,
|
||||
njs_uint_t n, size_t size);
|
||||
NJS_EXPORT void njs_arr_destroy(njs_arr_t *arr);
|
||||
NJS_EXPORT void *njs_arr_add(njs_arr_t *arr);
|
||||
NJS_EXPORT void *njs_arr_add_multiple(njs_arr_t *arr, njs_uint_t n);
|
||||
NJS_EXPORT void *njs_arr_zero_add(njs_arr_t *arr);
|
||||
NJS_EXPORT void njs_arr_remove(njs_arr_t *arr, void *item);
|
||||
|
||||
|
||||
#define njs_arr_item(arr, i) \
|
||||
((void *) ((char *) (arr)->start + (arr)->item_size * (i)))
|
||||
|
||||
|
||||
#define njs_arr_last(arr) \
|
||||
((void *) \
|
||||
((char *) (arr)->start \
|
||||
+ (arr)->item_size * ((arr)->items - 1)))
|
||||
|
||||
|
||||
#define njs_arr_reset(arr) \
|
||||
(arr)->items = 0;
|
||||
|
||||
|
||||
#define njs_arr_is_empty(arr) \
|
||||
((arr)->items == 0)
|
||||
|
||||
|
||||
njs_inline void *
|
||||
njs_arr_remove_last(njs_arr_t *arr)
|
||||
{
|
||||
arr->items--;
|
||||
return (char *) arr->start + arr->item_size * arr->items;
|
||||
}
|
||||
|
||||
|
||||
#endif /* _NJS_ARR_H_INCLUDED_ */
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,59 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_ARRAY_H_INCLUDED_
|
||||
#define _NJS_ARRAY_H_INCLUDED_
|
||||
|
||||
|
||||
#define NJS_ARRAY_MAX_INDEX 0xffffffff
|
||||
#define NJS_ARRAY_INVALID_INDEX NJS_ARRAY_MAX_INDEX
|
||||
|
||||
#define NJS_ARRAY_SPARE 8
|
||||
#define NJS_ARRAY_FAST_OBJECT_LENGTH (1024)
|
||||
#define NJS_ARRAY_LARGE_OBJECT_LENGTH (32768)
|
||||
#define NJS_ARRAY_FLAT_MAX_LENGTH (1048576)
|
||||
|
||||
#define njs_fast_object(_sz) ((_sz) <= NJS_ARRAY_FAST_OBJECT_LENGTH)
|
||||
|
||||
|
||||
njs_array_t *njs_array_alloc(njs_vm_t *vm, njs_bool_t flat, uint64_t length,
|
||||
uint32_t spare);
|
||||
void njs_array_destroy(njs_vm_t *vm, njs_array_t *array);
|
||||
njs_int_t njs_array_add(njs_vm_t *vm, njs_array_t *array, njs_value_t *value);
|
||||
njs_int_t njs_array_convert_to_slow_array(njs_vm_t *vm, njs_array_t *array);
|
||||
njs_int_t njs_array_length_redefine(njs_vm_t *vm, njs_value_t *value,
|
||||
uint32_t length, int writable);
|
||||
njs_int_t njs_array_length_set(njs_vm_t *vm, njs_value_t *value,
|
||||
njs_object_prop_t *prev, njs_value_t *setval);
|
||||
njs_array_t *njs_array_keys(njs_vm_t *vm, njs_value_t *array, njs_bool_t all);
|
||||
njs_array_t *njs_array_indices(njs_vm_t *vm, njs_value_t *object);
|
||||
njs_int_t njs_array_string_add(njs_vm_t *vm, njs_array_t *array,
|
||||
const u_char *start, size_t size, size_t length);
|
||||
njs_int_t njs_array_expand(njs_vm_t *vm, njs_array_t *array, uint32_t prepend,
|
||||
uint32_t append);
|
||||
njs_int_t njs_array_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t unused);
|
||||
|
||||
|
||||
njs_inline njs_value_t *
|
||||
njs_array_push(njs_vm_t *vm, njs_array_t *array)
|
||||
{
|
||||
njs_int_t ret;
|
||||
|
||||
ret = njs_array_expand(vm, array, 0, 1);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &array->start[array->length++];
|
||||
}
|
||||
|
||||
|
||||
extern const njs_object_init_t njs_array_instance_init;
|
||||
extern const njs_object_type_init_t njs_array_type_init;
|
||||
|
||||
|
||||
#endif /* _NJS_ARRAY_H_INCLUDED_ */
|
||||
|
|
@ -1,274 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.h>
|
||||
|
||||
|
||||
njs_array_buffer_t *
|
||||
njs_array_buffer_alloc(njs_vm_t *vm, uint64_t size, njs_bool_t zeroing)
|
||||
{
|
||||
njs_object_t *proto;
|
||||
njs_array_buffer_t *array;
|
||||
|
||||
if (njs_slow_path(size > UINT32_MAX)) {
|
||||
goto overflow;
|
||||
}
|
||||
|
||||
array = njs_mp_alloc(vm->mem_pool, sizeof(njs_array_buffer_t));
|
||||
if (njs_slow_path(array == NULL)) {
|
||||
goto memory_error;
|
||||
}
|
||||
|
||||
if (zeroing) {
|
||||
array->u.data = njs_mp_zalloc(vm->mem_pool, size);
|
||||
|
||||
} else {
|
||||
array->u.data = njs_mp_alloc(vm->mem_pool, size);
|
||||
}
|
||||
|
||||
if (njs_slow_path(array->u.data == NULL)) {
|
||||
goto memory_error;
|
||||
}
|
||||
|
||||
proto = &vm->prototypes[NJS_OBJ_TYPE_ARRAY_BUFFER].object;
|
||||
|
||||
njs_lvlhsh_init(&array->object.hash);
|
||||
njs_lvlhsh_init(&array->object.shared_hash);
|
||||
array->object.__proto__ = proto;
|
||||
array->object.slots = NULL;
|
||||
array->object.type = NJS_ARRAY_BUFFER;
|
||||
array->object.shared = 0;
|
||||
array->object.extensible = 1;
|
||||
array->object.error_data = 0;
|
||||
array->object.fast_array = 0;
|
||||
array->size = size;
|
||||
|
||||
return array;
|
||||
|
||||
memory_error:
|
||||
|
||||
njs_memory_error(vm);
|
||||
|
||||
return NULL;
|
||||
|
||||
overflow:
|
||||
|
||||
njs_range_error(vm, "Invalid array length");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_array_buffer_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
uint64_t size;
|
||||
njs_int_t ret;
|
||||
njs_value_t *value;
|
||||
njs_array_buffer_t *array;
|
||||
|
||||
if (!vm->top_frame->ctor) {
|
||||
njs_type_error(vm, "Constructor ArrayBuffer requires 'new'");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
size = 0;
|
||||
value = njs_arg(args, nargs, 1);
|
||||
|
||||
ret = njs_value_to_index(vm, value, &size);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
array = njs_array_buffer_alloc(vm, size, 1);
|
||||
if (njs_slow_path(array == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
njs_set_array_buffer(&vm->retval, array);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_array_buffer_get_this(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t unused)
|
||||
{
|
||||
vm->retval = args[0];
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_array_buffer_is_view(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
njs_set_boolean(&vm->retval, njs_is_typed_array(njs_arg(args, nargs, 1)));
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
njs_int_t
|
||||
njs_array_buffer_writable(njs_vm_t *vm, njs_array_buffer_t *buffer)
|
||||
{
|
||||
void *dst;
|
||||
|
||||
if (!buffer->object.shared) {
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
dst = njs_mp_alloc(vm->mem_pool, buffer->size);
|
||||
if (njs_slow_path(dst == NULL)) {
|
||||
njs_memory_error(vm);
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
memcpy(dst, buffer->u.data, buffer->size);
|
||||
|
||||
buffer->object.shared = 0;
|
||||
buffer->u.data = dst;
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static const njs_object_prop_t njs_array_buffer_constructor_properties[] =
|
||||
{
|
||||
NJS_DECLARE_PROP_NAME("ArrayBuffer"),
|
||||
|
||||
NJS_DECLARE_PROP_LENGTH(1),
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),
|
||||
|
||||
{
|
||||
.type = NJS_ACCESSOR,
|
||||
.name = njs_wellknown_symbol(NJS_SYMBOL_SPECIES),
|
||||
.u.accessor = njs_getter(njs_array_buffer_get_this, 0),
|
||||
.writable = NJS_ATTRIBUTE_UNSET,
|
||||
.configurable = 1,
|
||||
},
|
||||
|
||||
NJS_DECLARE_PROP_NATIVE("isView", njs_array_buffer_is_view, 1, 0),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_array_buffer_constructor_init = {
|
||||
njs_array_buffer_constructor_properties,
|
||||
njs_nitems(njs_array_buffer_constructor_properties),
|
||||
};
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_array_buffer_prototype_byte_length(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t unused)
|
||||
{
|
||||
njs_value_t *value;
|
||||
njs_array_buffer_t *array;
|
||||
|
||||
value = njs_argument(args, 0);
|
||||
|
||||
if (!njs_is_array_buffer(value)) {
|
||||
njs_type_error(vm, "Method ArrayBuffer.prototype.byteLength called "
|
||||
"on incompatible receiver");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
array = njs_array_buffer(value);
|
||||
if (njs_slow_path(njs_is_detached_buffer(array))) {
|
||||
njs_type_error(vm, "detached buffer");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
njs_set_number(&vm->retval, array->size);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_array_buffer_prototype_slice(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t unused)
|
||||
{
|
||||
int64_t len, start, end;
|
||||
njs_int_t ret;
|
||||
njs_value_t *value;
|
||||
njs_array_buffer_t *this, *buffer;
|
||||
|
||||
value = njs_argument(args, 0);
|
||||
|
||||
if (!njs_is_array_buffer(value)) {
|
||||
njs_type_error(vm, "Method ArrayBuffer.prototype.slice called "
|
||||
"on incompatible receiver");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
this = njs_array_buffer(value);
|
||||
len = njs_array_buffer_size(this);
|
||||
end = len;
|
||||
|
||||
value = njs_arg(args, nargs, 1);
|
||||
|
||||
ret = njs_value_to_integer(vm, value, &start);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
value = njs_arg(args, nargs, 2);
|
||||
|
||||
if (!njs_is_undefined(value)) {
|
||||
ret = njs_value_to_integer(vm, value, &end);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
buffer = njs_array_buffer_slice(vm, this, start, end);
|
||||
if (njs_slow_path(buffer == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
njs_set_array_buffer(&vm->retval, buffer);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static const njs_object_prop_t njs_array_buffer_prototype_properties[] =
|
||||
{
|
||||
NJS_DECLARE_PROP_HANDLER("constructor",
|
||||
njs_object_prototype_create_constructor,
|
||||
0, 0, NJS_OBJECT_PROP_VALUE_CW),
|
||||
|
||||
NJS_DECLARE_PROP_GETTER("byteLength",
|
||||
njs_array_buffer_prototype_byte_length, 0),
|
||||
|
||||
NJS_DECLARE_PROP_NATIVE("slice", njs_array_buffer_prototype_slice, 2, 0),
|
||||
|
||||
{
|
||||
.type = NJS_PROPERTY,
|
||||
.name = njs_wellknown_symbol(NJS_SYMBOL_TO_STRING_TAG),
|
||||
.u.value = njs_string("ArrayBuffer"),
|
||||
.configurable = 1,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_array_buffer_prototype_init = {
|
||||
njs_array_buffer_prototype_properties,
|
||||
njs_nitems(njs_array_buffer_prototype_properties),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_type_init_t njs_array_buffer_type_init = {
|
||||
.constructor = njs_native_ctor(njs_array_buffer_constructor, 1, 0),
|
||||
.prototype_props = &njs_array_buffer_prototype_init,
|
||||
.constructor_props = &njs_array_buffer_constructor_init,
|
||||
.prototype_value = { .object = { .type = NJS_OBJECT } },
|
||||
};
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_ARRAY_BUFFER_H_INCLUDED_
|
||||
#define _NJS_ARRAY_BUFFER_H_INCLUDED_
|
||||
|
||||
|
||||
#define njs_array_buffer_size(buffer) \
|
||||
((buffer)->size)
|
||||
|
||||
|
||||
njs_array_buffer_t *njs_array_buffer_alloc(njs_vm_t *vm, uint64_t size,
|
||||
njs_bool_t zeroing);
|
||||
njs_int_t njs_array_buffer_writable(njs_vm_t *vm, njs_array_buffer_t *buffer);
|
||||
|
||||
njs_inline njs_array_buffer_t *
|
||||
njs_array_buffer_slice(njs_vm_t *vm, njs_array_buffer_t *this, int64_t start,
|
||||
int64_t end)
|
||||
{
|
||||
int64_t len, new_len, first, final;
|
||||
njs_array_buffer_t *new_buffer;
|
||||
|
||||
len = njs_array_buffer_size(this);
|
||||
|
||||
first = (start < 0) ? njs_max(len + start, 0) : njs_min(start, len);
|
||||
final = (end < 0) ? njs_max(len + end, 0) : njs_min(end, len);
|
||||
|
||||
new_len = njs_max(final - first, 0);
|
||||
|
||||
new_buffer = njs_array_buffer_alloc(vm, new_len, 1);
|
||||
if (new_buffer == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(new_buffer->u.u8, &this->u.u8[first], new_len);
|
||||
|
||||
return new_buffer;
|
||||
}
|
||||
|
||||
|
||||
extern const njs_object_type_init_t njs_array_buffer_type_init;
|
||||
|
||||
|
||||
#endif /* _NJS_ARRAY_BUFFER_H_INCLUDED_ */
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_ASSERT_H_INCLUDED_
|
||||
#define _NJS_ASSERT_H_INCLUDED_
|
||||
|
||||
#if (NJS_DEBUG)
|
||||
|
||||
#define njs_assert(condition) \
|
||||
do { \
|
||||
if (!(condition)) { \
|
||||
njs_stderror("Assertion \"%s\" failed at %s:%d\n", #condition, \
|
||||
__FILE__, __LINE__); \
|
||||
abort(); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define njs_assert_msg(condition, fmt, ...) \
|
||||
do { \
|
||||
if (!(condition)) { \
|
||||
njs_stderror(fmt, ##__VA_ARGS__); \
|
||||
njs_stderror(" at %s:%d\n", __FILE__, __LINE__); \
|
||||
abort(); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
|
||||
#define njs_assert(condition)
|
||||
#define njs_assert_msg(condition, fmt, ...)
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _NJS_ASSERT_H_INCLUDED_ */
|
||||
|
|
@ -1,224 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Alexander Borisov
|
||||
* Copyright (C) Nginx, Inc.
|
||||
*/
|
||||
|
||||
#include <njs_main.h>
|
||||
|
||||
|
||||
static void
|
||||
njs_async_context_free(njs_vm_t *vm, njs_async_ctx_t *ctx);
|
||||
|
||||
|
||||
njs_int_t
|
||||
njs_async_function_frame_invoke(njs_vm_t *vm, njs_value_t *retval)
|
||||
{
|
||||
njs_int_t ret;
|
||||
njs_value_t ctor;
|
||||
njs_native_frame_t *frame;
|
||||
njs_promise_capability_t *capability;
|
||||
|
||||
frame = vm->top_frame;
|
||||
frame->retval = retval;
|
||||
|
||||
njs_set_function(&ctor, &vm->constructors[NJS_OBJ_TYPE_PROMISE]);
|
||||
|
||||
capability = njs_promise_new_capability(vm, &ctor);
|
||||
if (njs_slow_path(capability == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ret = njs_function_lambda_call(vm, capability);
|
||||
|
||||
if (ret == NJS_OK) {
|
||||
ret = njs_function_call(vm, njs_function(&capability->resolve),
|
||||
&njs_value_undefined, retval, 1, &vm->retval);
|
||||
|
||||
} else if (ret == NJS_AGAIN) {
|
||||
ret = NJS_OK;
|
||||
|
||||
} else if (ret == NJS_ERROR) {
|
||||
if (njs_is_memory_error(vm, &vm->retval)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ret = njs_function_call(vm, njs_function(&capability->reject),
|
||||
&njs_value_undefined, &vm->retval, 1,
|
||||
&vm->retval);
|
||||
}
|
||||
|
||||
*retval = capability->promise;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
njs_int_t
|
||||
njs_await_fulfilled(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
njs_int_t ret;
|
||||
njs_value_t **cur_local, **cur_closures, *value;
|
||||
njs_frame_t *frame, *async_frame;
|
||||
njs_async_ctx_t *ctx;
|
||||
njs_native_frame_t *top, *async;
|
||||
|
||||
ctx = vm->top_frame->function->context;
|
||||
|
||||
value = njs_arg(args, nargs, 1);
|
||||
|
||||
async_frame = ctx->await;
|
||||
async = &async_frame->native;
|
||||
async->previous = vm->top_frame;
|
||||
|
||||
cur_local = vm->levels[NJS_LEVEL_LOCAL];
|
||||
cur_closures = vm->levels[NJS_LEVEL_CLOSURE];
|
||||
top = vm->top_frame;
|
||||
frame = vm->active_frame;
|
||||
|
||||
vm->levels[NJS_LEVEL_LOCAL] = async->local;
|
||||
vm->levels[NJS_LEVEL_CLOSURE] = njs_function_closures(async->function);
|
||||
|
||||
vm->top_frame = async;
|
||||
vm->active_frame = async_frame;
|
||||
|
||||
*njs_scope_value(vm, ctx->index) = *value;
|
||||
vm->retval = *value;
|
||||
|
||||
vm->top_frame->retval = &vm->retval;
|
||||
|
||||
ret = njs_vmcode_interpreter(vm, ctx->pc, ctx->capability, ctx);
|
||||
|
||||
vm->levels[NJS_LEVEL_LOCAL] = cur_local;
|
||||
vm->levels[NJS_LEVEL_CLOSURE] = cur_closures;
|
||||
|
||||
vm->top_frame = top;
|
||||
vm->active_frame = frame;
|
||||
|
||||
if (ret == NJS_OK) {
|
||||
ret = njs_function_call(vm, njs_function(&ctx->capability->resolve),
|
||||
&njs_value_undefined, &vm->retval, 1, &vm->retval);
|
||||
|
||||
njs_async_context_free(vm, ctx);
|
||||
|
||||
} else if (ret == NJS_AGAIN) {
|
||||
ret = NJS_OK;
|
||||
|
||||
} else if (ret == NJS_ERROR) {
|
||||
if (njs_is_memory_error(vm, &vm->retval)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
value = &vm->retval;
|
||||
|
||||
goto failed;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
failed:
|
||||
|
||||
(void) njs_function_call(vm, njs_function(&ctx->capability->reject),
|
||||
&njs_value_undefined, value, 1, &vm->retval);
|
||||
|
||||
njs_async_context_free(vm, ctx);
|
||||
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
|
||||
njs_int_t
|
||||
njs_await_rejected(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
njs_value_t *value;
|
||||
njs_async_ctx_t *ctx;
|
||||
|
||||
ctx = vm->top_frame->function->context;
|
||||
|
||||
value = njs_arg(args, nargs, 1);
|
||||
|
||||
if (ctx->await->native.pc == ctx->pc) {
|
||||
/* No catch block was set before await. */
|
||||
(void) njs_function_call(vm, njs_function(&ctx->capability->reject),
|
||||
&njs_value_undefined, value, 1, &vm->retval);
|
||||
|
||||
njs_async_context_free(vm, ctx);
|
||||
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
/* ctx->await->native.pc points to a catch block here. */
|
||||
|
||||
ctx->pc = ctx->await->native.pc;
|
||||
|
||||
return njs_await_fulfilled(vm, args, nargs, unused);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
njs_async_context_free(njs_vm_t *vm, njs_async_ctx_t *ctx)
|
||||
{
|
||||
njs_mp_free(vm->mem_pool, ctx->capability);
|
||||
njs_mp_free(vm->mem_pool, ctx);
|
||||
}
|
||||
|
||||
|
||||
static const njs_object_prop_t njs_async_constructor_properties[] =
|
||||
{
|
||||
NJS_DECLARE_PROP_LENGTH(1),
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_async_constructor_init = {
|
||||
njs_async_constructor_properties,
|
||||
njs_nitems(njs_async_constructor_properties),
|
||||
};
|
||||
|
||||
|
||||
static const njs_object_prop_t njs_async_prototype_properties[] =
|
||||
{
|
||||
{
|
||||
.type = NJS_PROPERTY,
|
||||
.name = njs_wellknown_symbol(NJS_SYMBOL_TO_STRING_TAG),
|
||||
.u.value = njs_string("AsyncFunction"),
|
||||
.configurable = 1,
|
||||
},
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("constructor",
|
||||
njs_object_prototype_create_constructor,
|
||||
0, 0, NJS_OBJECT_PROP_VALUE_CW),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_async_prototype_init = {
|
||||
njs_async_prototype_properties,
|
||||
njs_nitems(njs_async_prototype_properties),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_type_init_t njs_async_function_type_init = {
|
||||
.constructor = njs_native_ctor(njs_function_constructor, 1, 1),
|
||||
.constructor_props = &njs_async_constructor_init,
|
||||
.prototype_props = &njs_async_prototype_init,
|
||||
.prototype_value = { .object = { .type = NJS_OBJECT } },
|
||||
};
|
||||
|
||||
|
||||
const njs_object_prop_t njs_async_function_instance_properties[] =
|
||||
{
|
||||
NJS_DECLARE_PROP_HANDLER("length", njs_function_instance_length, 0, 0,
|
||||
NJS_OBJECT_PROP_VALUE_C),
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("name", njs_function_instance_name, 0, 0,
|
||||
NJS_OBJECT_PROP_VALUE_C),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_async_function_instance_init = {
|
||||
njs_async_function_instance_properties,
|
||||
njs_nitems(njs_async_function_instance_properties),
|
||||
};
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Alexander Borisov
|
||||
* Copyright (C) Nginx, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_ASYNC_H_INCLUDED_
|
||||
#define _NJS_ASYNC_H_INCLUDED_
|
||||
|
||||
|
||||
typedef struct {
|
||||
njs_promise_capability_t *capability;
|
||||
njs_frame_t *await;
|
||||
uintptr_t index;
|
||||
u_char *pc;
|
||||
} njs_async_ctx_t;
|
||||
|
||||
|
||||
njs_int_t njs_async_function_frame_invoke(njs_vm_t *vm, njs_value_t *retval);
|
||||
njs_int_t njs_await_fulfilled(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused);
|
||||
njs_int_t njs_await_rejected(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused);
|
||||
|
||||
|
||||
extern const njs_object_type_init_t njs_async_function_type_init;
|
||||
extern const njs_object_init_t njs_async_function_instance_init;
|
||||
|
||||
|
||||
#endif /* _NJS_ASYNC_H_INCLUDED_ */
|
||||
|
|
@ -1,148 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.h>
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_boolean_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
const njs_value_t *value;
|
||||
njs_object_value_t *object;
|
||||
|
||||
if (nargs == 1) {
|
||||
value = &njs_value_false;
|
||||
|
||||
} else {
|
||||
value = njs_is_true(&args[1]) ? &njs_value_true : &njs_value_false;
|
||||
}
|
||||
|
||||
if (vm->top_frame->ctor) {
|
||||
object = njs_object_value_alloc(vm, NJS_OBJ_TYPE_BOOLEAN, 0, value);
|
||||
if (njs_slow_path(object == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
njs_set_object_value(&vm->retval, object);
|
||||
|
||||
} else {
|
||||
vm->retval = *value;
|
||||
}
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static const njs_object_prop_t njs_boolean_constructor_properties[] =
|
||||
{
|
||||
{
|
||||
.type = NJS_PROPERTY,
|
||||
.name = njs_string("name"),
|
||||
.u.value = njs_string("Boolean"),
|
||||
.configurable = 1,
|
||||
},
|
||||
|
||||
{
|
||||
.type = NJS_PROPERTY,
|
||||
.name = njs_string("length"),
|
||||
.u.value = njs_value(NJS_NUMBER, 1, 1.0),
|
||||
.configurable = 1,
|
||||
},
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_boolean_constructor_init = {
|
||||
njs_boolean_constructor_properties,
|
||||
njs_nitems(njs_boolean_constructor_properties),
|
||||
};
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_boolean_prototype_value_of(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t unused)
|
||||
{
|
||||
njs_value_t *value;
|
||||
|
||||
value = &args[0];
|
||||
|
||||
if (value->type != NJS_BOOLEAN) {
|
||||
|
||||
if (njs_is_object_boolean(value)) {
|
||||
value = njs_object_value(value);
|
||||
|
||||
} else {
|
||||
njs_type_error(vm, "unexpected value type:%s",
|
||||
njs_type_string(value->type));
|
||||
return NJS_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
vm->retval = *value;
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_boolean_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_index_t unused)
|
||||
{
|
||||
njs_value_t *value;
|
||||
|
||||
value = &args[0];
|
||||
|
||||
if (value->type != NJS_BOOLEAN) {
|
||||
|
||||
if (njs_is_object_boolean(value)) {
|
||||
value = njs_object_value(value);
|
||||
|
||||
} else {
|
||||
njs_type_error(vm, "unexpected value type:%s",
|
||||
njs_type_string(value->type));
|
||||
return NJS_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
vm->retval = njs_is_true(value) ? njs_string_true : njs_string_false;
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static const njs_object_prop_t njs_boolean_prototype_properties[] =
|
||||
{
|
||||
NJS_DECLARE_PROP_HANDLER("__proto__", njs_primitive_prototype_get_proto,
|
||||
0, 0, NJS_OBJECT_PROP_VALUE_CW),
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("constructor",
|
||||
njs_object_prototype_create_constructor,
|
||||
0, 0, NJS_OBJECT_PROP_VALUE_CW),
|
||||
|
||||
NJS_DECLARE_PROP_NATIVE("valueOf", njs_boolean_prototype_value_of, 0, 0),
|
||||
|
||||
NJS_DECLARE_PROP_NATIVE("toString", njs_boolean_prototype_to_string, 0, 0),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_boolean_prototype_init = {
|
||||
njs_boolean_prototype_properties,
|
||||
njs_nitems(njs_boolean_prototype_properties),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_type_init_t njs_boolean_type_init = {
|
||||
.constructor = njs_native_ctor(njs_boolean_constructor, 1, 0),
|
||||
.constructor_props = &njs_boolean_constructor_init,
|
||||
.prototype_props = &njs_boolean_prototype_init,
|
||||
.prototype_value = { .object_value = {
|
||||
.value = njs_value(NJS_BOOLEAN, 0, 0.0),
|
||||
.object = { .type = NJS_OBJECT_VALUE } }
|
||||
},
|
||||
};
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_BOOLEAN_H_INCLUDED_
|
||||
#define _NJS_BOOLEAN_H_INCLUDED_
|
||||
|
||||
|
||||
extern const njs_object_type_init_t njs_boolean_type_init;
|
||||
|
||||
|
||||
#endif /* _NJS_BOOLEAN_H_INCLUDED_ */
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,42 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Alexander Borisov
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_BUFFER_H_INCLUDED_
|
||||
#define _NJS_BUFFER_H_INCLUDED_
|
||||
|
||||
|
||||
typedef njs_int_t (*njs_buffer_encode_t)(njs_vm_t *vm, njs_value_t *value,
|
||||
const njs_str_t *src);
|
||||
typedef size_t (*njs_buffer_encode_length_t)(const njs_str_t *src,
|
||||
size_t *out_size);
|
||||
|
||||
typedef struct {
|
||||
njs_str_t name;
|
||||
njs_buffer_encode_t encode;
|
||||
njs_buffer_encode_t decode;
|
||||
njs_buffer_encode_length_t decode_length;
|
||||
} njs_buffer_encoding_t;
|
||||
|
||||
|
||||
njs_typed_array_t *njs_buffer_slot(njs_vm_t *vm, njs_value_t *value,
|
||||
const char *name);
|
||||
njs_int_t njs_buffer_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,
|
||||
uint32_t size);
|
||||
njs_int_t njs_buffer_new(njs_vm_t *vm, njs_value_t *value, const u_char *start,
|
||||
uint32_t size);
|
||||
njs_typed_array_t *njs_buffer_alloc(njs_vm_t *vm, size_t size,
|
||||
njs_bool_t zeroing);
|
||||
|
||||
const njs_buffer_encoding_t *njs_buffer_encoding(njs_vm_t *vm,
|
||||
const njs_value_t *value);
|
||||
njs_int_t njs_buffer_decode_string(njs_vm_t *vm, const njs_value_t *value,
|
||||
njs_value_t *dst, const njs_buffer_encoding_t *encoding);
|
||||
|
||||
|
||||
extern const njs_object_type_init_t njs_buffer_type_init;
|
||||
|
||||
|
||||
#endif /* _NJS_BUFFER_H_INCLUDED_ */
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,244 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.h>
|
||||
|
||||
|
||||
#define NJS_CHB_MIN_SIZE 256
|
||||
|
||||
|
||||
void
|
||||
njs_chb_append0(njs_chb_t *chain, const char *msg, size_t len)
|
||||
{
|
||||
u_char *p;
|
||||
|
||||
if (len != 0 && !chain->error) {
|
||||
p = njs_chb_reserve(chain, len);
|
||||
if (njs_slow_path(p == NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(p, msg, len);
|
||||
|
||||
njs_chb_written(chain, len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
u_char *
|
||||
njs_chb_reserve(njs_chb_t *chain, size_t size)
|
||||
{
|
||||
njs_chb_node_t *n;
|
||||
|
||||
n = chain->last;
|
||||
|
||||
if (njs_fast_path(n != NULL && njs_chb_node_room(n) >= size)) {
|
||||
return n->pos;
|
||||
}
|
||||
|
||||
if (size < NJS_CHB_MIN_SIZE) {
|
||||
size = NJS_CHB_MIN_SIZE;
|
||||
}
|
||||
|
||||
n = njs_mp_alloc(chain->pool, sizeof(njs_chb_node_t) + size);
|
||||
if (njs_slow_path(n == NULL)) {
|
||||
chain->error = 1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
n->next = NULL;
|
||||
n->start = (u_char *) n + sizeof(njs_chb_node_t);
|
||||
n->pos = n->start;
|
||||
n->end = n->pos + size;
|
||||
|
||||
if (chain->last != NULL) {
|
||||
chain->last->next = n;
|
||||
|
||||
} else {
|
||||
chain->nodes = n;
|
||||
}
|
||||
|
||||
chain->last = n;
|
||||
|
||||
return n->start;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
njs_chb_vsprintf(njs_chb_t *chain, size_t size, const char *fmt, va_list args)
|
||||
{
|
||||
u_char *start, *end;
|
||||
|
||||
start = njs_chb_reserve(chain, size);
|
||||
if (njs_slow_path(start == NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
end = njs_vsprintf(start, start + size, fmt, args);
|
||||
|
||||
njs_chb_written(chain, end - start);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
njs_chb_sprintf(njs_chb_t *chain, size_t size, const char* fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
|
||||
njs_chb_vsprintf(chain, size, fmt, args);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Drains size bytes from the beginning of the chain.
|
||||
*/
|
||||
void
|
||||
njs_chb_drain(njs_chb_t *chain, size_t drain)
|
||||
{
|
||||
njs_chb_node_t *n;
|
||||
|
||||
n = chain->nodes;
|
||||
|
||||
while (n != NULL) {
|
||||
if (njs_chb_node_size(n) > drain) {
|
||||
n->start += drain;
|
||||
return;
|
||||
}
|
||||
|
||||
drain -= njs_chb_node_size(n);
|
||||
chain->nodes = n->next;
|
||||
|
||||
njs_mp_free(chain->pool, n);
|
||||
n = chain->nodes;
|
||||
}
|
||||
|
||||
chain->last = NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Drops size bytes from the end of the chain.
|
||||
*/
|
||||
void
|
||||
njs_chb_drop(njs_chb_t *chain, size_t drop)
|
||||
{
|
||||
uint64_t size;
|
||||
njs_chb_node_t *n, *next;
|
||||
|
||||
if (njs_slow_path(chain->error)) {
|
||||
return;
|
||||
}
|
||||
|
||||
n = chain->last;
|
||||
|
||||
if (njs_fast_path(n != NULL && (njs_chb_node_size(n) > drop))) {
|
||||
n->pos -= drop;
|
||||
return;
|
||||
}
|
||||
|
||||
n = chain->nodes;
|
||||
size = (uint64_t) njs_chb_size(chain);
|
||||
|
||||
if (drop >= size) {
|
||||
njs_chb_destroy(chain);
|
||||
njs_chb_init(chain, chain->pool);
|
||||
return;
|
||||
}
|
||||
|
||||
while (n != NULL) {
|
||||
size -= njs_chb_node_size(n);
|
||||
|
||||
if (size <= drop) {
|
||||
chain->last = n;
|
||||
chain->last->pos -= drop - size;
|
||||
|
||||
n = chain->last->next;
|
||||
chain->last->next = NULL;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
n = n->next;
|
||||
}
|
||||
|
||||
while (n != NULL) {
|
||||
next = n->next;
|
||||
njs_mp_free(chain->pool, n);
|
||||
n = next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
njs_int_t
|
||||
njs_chb_join(njs_chb_t *chain, njs_str_t *str)
|
||||
{
|
||||
u_char *start;
|
||||
uint64_t size;
|
||||
njs_chb_node_t *n;
|
||||
|
||||
if (njs_slow_path(chain->error)) {
|
||||
return NJS_DECLINED;
|
||||
}
|
||||
|
||||
n = chain->nodes;
|
||||
|
||||
if (n == NULL) {
|
||||
str->length = 0;
|
||||
str->start = NULL;
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
size = (uint64_t) njs_chb_size(chain);
|
||||
if (njs_slow_path(size >= UINT32_MAX)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
start = njs_mp_alloc(chain->pool, size);
|
||||
if (njs_slow_path(start == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
str->length = size;
|
||||
str->start = start;
|
||||
|
||||
njs_chb_join_to(chain, start);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
njs_chb_join_to(njs_chb_t *chain, u_char *dst)
|
||||
{
|
||||
njs_chb_node_t *n;
|
||||
|
||||
n = chain->nodes;
|
||||
|
||||
while (n != NULL) {
|
||||
dst = njs_cpymem(dst, n->start, njs_chb_node_size(n));
|
||||
n = n->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
njs_chb_destroy(njs_chb_t *chain)
|
||||
{
|
||||
njs_chb_node_t *n, *next;
|
||||
|
||||
n = chain->nodes;
|
||||
|
||||
while (n != NULL) {
|
||||
next = n->next;
|
||||
njs_mp_free(chain->pool, n);
|
||||
n = next;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,133 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_CHB_H_INCLUDED_
|
||||
#define _NJS_CHB_H_INCLUDED_
|
||||
|
||||
|
||||
typedef struct njs_chb_node_s njs_chb_node_t;
|
||||
|
||||
struct njs_chb_node_s {
|
||||
njs_chb_node_t *next;
|
||||
u_char *start;
|
||||
u_char *pos;
|
||||
u_char *end;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
njs_bool_t error;
|
||||
njs_mp_t *pool;
|
||||
njs_chb_node_t *nodes;
|
||||
njs_chb_node_t *last;
|
||||
} njs_chb_t;
|
||||
|
||||
|
||||
void njs_chb_append0(njs_chb_t *chain, const char *msg, size_t len);
|
||||
void njs_chb_vsprintf(njs_chb_t *chain, size_t size, const char *fmt,
|
||||
va_list args);
|
||||
void njs_chb_sprintf(njs_chb_t *chain, size_t size, const char* fmt, ...);
|
||||
u_char *njs_chb_reserve(njs_chb_t *chain, size_t size);
|
||||
void njs_chb_drain(njs_chb_t *chain, size_t drop);
|
||||
void njs_chb_drop(njs_chb_t *chain, size_t drop);
|
||||
njs_int_t njs_chb_join(njs_chb_t *chain, njs_str_t *str);
|
||||
void njs_chb_join_to(njs_chb_t *chain, u_char *dst);
|
||||
void njs_chb_destroy(njs_chb_t *chain);
|
||||
|
||||
|
||||
#define njs_chb_append(chain, msg, len) \
|
||||
njs_chb_append0(chain, (const char *) (msg), len)
|
||||
|
||||
#define njs_chb_append_literal(chain, literal) \
|
||||
njs_chb_append0(chain, literal, njs_length(literal))
|
||||
|
||||
|
||||
#define njs_chb_node_size(n) (size_t) ((n)->pos - (n)->start)
|
||||
#define njs_chb_node_room(n) (size_t) ((n)->end - (n)->pos)
|
||||
|
||||
|
||||
njs_inline void
|
||||
njs_chb_init(njs_chb_t *chain, njs_mp_t *pool)
|
||||
{
|
||||
chain->error = 0;
|
||||
chain->pool = pool;
|
||||
chain->nodes = NULL;
|
||||
chain->last = NULL;
|
||||
}
|
||||
|
||||
|
||||
njs_inline void
|
||||
njs_chb_append_str(njs_chb_t *chain, njs_str_t *str)
|
||||
{
|
||||
njs_chb_append0(chain, (const char *) str->start, str->length);
|
||||
}
|
||||
|
||||
|
||||
njs_inline int64_t
|
||||
njs_chb_size(njs_chb_t *chain)
|
||||
{
|
||||
uint64_t size;
|
||||
njs_chb_node_t *n;
|
||||
|
||||
if (njs_slow_path(chain->error)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
n = chain->nodes;
|
||||
|
||||
size = 0;
|
||||
|
||||
while (n != NULL) {
|
||||
size += njs_chb_node_size(n);
|
||||
n = n->next;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
njs_inline int64_t
|
||||
njs_chb_utf8_length(njs_chb_t *chain)
|
||||
{
|
||||
int64_t len, length;
|
||||
njs_chb_node_t *n;
|
||||
|
||||
if (njs_slow_path(chain->error)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
n = chain->nodes;
|
||||
|
||||
length = 0;
|
||||
|
||||
while (n != NULL) {
|
||||
len = njs_utf8_length(n->start, njs_chb_node_size(n));
|
||||
if (njs_slow_path(len < 0)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
length += len;
|
||||
n = n->next;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
njs_inline u_char *
|
||||
njs_chb_current(njs_chb_t *chain)
|
||||
{
|
||||
return (chain->last != NULL) ? chain->last->pos : NULL;
|
||||
}
|
||||
|
||||
|
||||
njs_inline void
|
||||
njs_chb_written(njs_chb_t *chain, size_t bytes)
|
||||
{
|
||||
chain->last->pos += bytes;
|
||||
}
|
||||
|
||||
|
||||
#endif /* _NJS_JSON_H_INCLUDED_ */
|
||||
|
|
@ -1,243 +0,0 @@
|
|||
|
||||
/*
|
||||
* 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(). */
|
||||
|
||||
|
||||
#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]))
|
||||
|
||||
#define njs_max(val1, val2) \
|
||||
((val1 < val2) ? (val2) : (val1))
|
||||
|
||||
#define njs_min(val1, val2) \
|
||||
((val1 < val2) ? (val1) : (val2))
|
||||
|
||||
|
||||
#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_PACKED)
|
||||
#define NJS_PACKED __attribute__((packed))
|
||||
|
||||
#else
|
||||
#define NJS_PACKED
|
||||
#endif
|
||||
|
||||
|
||||
#if (NJS_HAVE_GCC_ATTRIBUTE_FALLTHROUGH)
|
||||
#define NJS_FALLTHROUGH __attribute__((fallthrough))
|
||||
|
||||
#else
|
||||
#define NJS_FALLTHROUGH
|
||||
#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
|
||||
|
||||
|
||||
#define njs_stringify(v) #v
|
||||
|
||||
|
||||
#if (NJS_HAVE_MEMORY_SANITIZER)
|
||||
#include <sanitizer/msan_interface.h>
|
||||
|
||||
#define njs_msan_unpoison(ptr, size) __msan_unpoison(ptr, size)
|
||||
#else
|
||||
|
||||
#define njs_msan_unpoison(ptr, size)
|
||||
#endif
|
||||
|
||||
|
||||
#if (NJS_HAVE_DENORMALS_CONTROL)
|
||||
#include <xmmintrin.h>
|
||||
|
||||
/*
|
||||
* 0x8000 Flush to zero
|
||||
* 0x0040 Denormals are zeros
|
||||
*/
|
||||
|
||||
#define NJS_MM_DENORMALS_MASK 0x8040
|
||||
|
||||
#define njs_mm_denormals(on) \
|
||||
_mm_setcsr((_mm_getcsr() & ~NJS_MM_DENORMALS_MASK) | (!(on) ? 0x8040: 0x0))
|
||||
#else
|
||||
|
||||
#define njs_mm_denormals(on)
|
||||
#endif
|
||||
|
||||
|
||||
#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_CLANG_H_INCLUDED_ */
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,19 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_DATE_H_INCLUDED_
|
||||
#define _NJS_DATE_H_INCLUDED_
|
||||
|
||||
|
||||
njs_date_t *njs_date_alloc(njs_vm_t *vm, double time);
|
||||
njs_int_t njs_date_to_string(njs_vm_t *vm, njs_value_t *retval,
|
||||
const njs_value_t *date);
|
||||
|
||||
|
||||
extern const njs_object_type_init_t njs_date_type_init;
|
||||
|
||||
|
||||
#endif /* _NJS_DATE_H_INCLUDED_ */
|
||||
|
|
@ -1,564 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.h>
|
||||
|
||||
|
||||
typedef struct {
|
||||
njs_vmcode_operation_t operation;
|
||||
size_t size;
|
||||
njs_str_t name;
|
||||
} njs_code_name_t;
|
||||
|
||||
|
||||
static njs_code_name_t code_names[] = {
|
||||
|
||||
{ NJS_VMCODE_PUT_ARG, sizeof(njs_vmcode_1addr_t),
|
||||
njs_str("PUT ARG ") },
|
||||
{ NJS_VMCODE_OBJECT, sizeof(njs_vmcode_object_t),
|
||||
njs_str("OBJECT ") },
|
||||
{ NJS_VMCODE_FUNCTION, sizeof(njs_vmcode_function_t),
|
||||
njs_str("FUNCTION ") },
|
||||
{ NJS_VMCODE_ARGUMENTS, sizeof(njs_vmcode_arguments_t),
|
||||
njs_str("ARGUMENTS ") },
|
||||
{ NJS_VMCODE_REGEXP, sizeof(njs_vmcode_regexp_t),
|
||||
njs_str("REGEXP ") },
|
||||
{ NJS_VMCODE_TEMPLATE_LITERAL, sizeof(njs_vmcode_template_literal_t),
|
||||
njs_str("TEMPLATE LITERAL") },
|
||||
{ NJS_VMCODE_OBJECT_COPY, sizeof(njs_vmcode_object_copy_t),
|
||||
njs_str("OBJECT COPY ") },
|
||||
|
||||
{ NJS_VMCODE_FUNCTION_COPY, sizeof(njs_vmcode_function_copy_t),
|
||||
njs_str("FUNCTION COPY ") },
|
||||
|
||||
{ NJS_VMCODE_PROPERTY_GET, sizeof(njs_vmcode_prop_get_t),
|
||||
njs_str("PROP GET ") },
|
||||
{ NJS_VMCODE_GLOBAL_GET, sizeof(njs_vmcode_prop_get_t),
|
||||
njs_str("GLOBAL GET ") },
|
||||
{ NJS_VMCODE_PROPERTY_INIT, sizeof(njs_vmcode_prop_set_t),
|
||||
njs_str("PROP INIT ") },
|
||||
{ NJS_VMCODE_PROTO_INIT, sizeof(njs_vmcode_prop_set_t),
|
||||
njs_str("PROTO INIT ") },
|
||||
{ NJS_VMCODE_PROPERTY_SET, sizeof(njs_vmcode_prop_set_t),
|
||||
njs_str("PROP SET ") },
|
||||
{ NJS_VMCODE_PROPERTY_IN, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("PROP IN ") },
|
||||
{ NJS_VMCODE_PROPERTY_DELETE, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("PROP DELETE ") },
|
||||
{ NJS_VMCODE_INSTANCE_OF, sizeof(njs_vmcode_instance_of_t),
|
||||
njs_str("INSTANCE OF ") },
|
||||
|
||||
{ NJS_VMCODE_FUNCTION_CALL, sizeof(njs_vmcode_function_call_t),
|
||||
njs_str("FUNCTION CALL ") },
|
||||
{ NJS_VMCODE_RETURN, sizeof(njs_vmcode_return_t),
|
||||
njs_str("RETURN ") },
|
||||
{ NJS_VMCODE_STOP, sizeof(njs_vmcode_stop_t),
|
||||
njs_str("STOP ") },
|
||||
|
||||
{ NJS_VMCODE_INCREMENT, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("INC ") },
|
||||
{ NJS_VMCODE_DECREMENT, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("DEC ") },
|
||||
{ NJS_VMCODE_POST_INCREMENT, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("POST INC ") },
|
||||
{ NJS_VMCODE_POST_DECREMENT, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("POST DEC ") },
|
||||
|
||||
{ NJS_VMCODE_DELETE, sizeof(njs_vmcode_2addr_t),
|
||||
njs_str("DELETE ") },
|
||||
{ NJS_VMCODE_VOID, sizeof(njs_vmcode_2addr_t),
|
||||
njs_str("VOID ") },
|
||||
{ NJS_VMCODE_TYPEOF, sizeof(njs_vmcode_2addr_t),
|
||||
njs_str("TYPEOF ") },
|
||||
{ NJS_VMCODE_TO_PROPERTY_KEY, sizeof(njs_vmcode_2addr_t),
|
||||
njs_str("TO PROP KEY ") },
|
||||
{ NJS_VMCODE_TO_PROPERTY_KEY_CHK, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("TO PROP KEY CHK ") },
|
||||
{ NJS_VMCODE_SET_FUNCTION_NAME, sizeof(njs_vmcode_2addr_t),
|
||||
njs_str("SET FUNC NAME ") },
|
||||
|
||||
{ NJS_VMCODE_UNARY_PLUS, sizeof(njs_vmcode_2addr_t),
|
||||
njs_str("PLUS ") },
|
||||
{ NJS_VMCODE_UNARY_NEGATION, sizeof(njs_vmcode_2addr_t),
|
||||
njs_str("NEGATION ") },
|
||||
|
||||
{ NJS_VMCODE_ADDITION, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("ADD ") },
|
||||
{ NJS_VMCODE_SUBSTRACTION, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("SUBSTRACT ") },
|
||||
{ NJS_VMCODE_MULTIPLICATION, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("MULTIPLY ") },
|
||||
{ NJS_VMCODE_EXPONENTIATION, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("POWER ") },
|
||||
{ NJS_VMCODE_DIVISION, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("DIVIDE ") },
|
||||
{ NJS_VMCODE_REMAINDER, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("REMAINDER ") },
|
||||
|
||||
{ NJS_VMCODE_LEFT_SHIFT, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("LEFT SHIFT ") },
|
||||
{ NJS_VMCODE_RIGHT_SHIFT, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("RIGHT SHIFT ") },
|
||||
{ NJS_VMCODE_UNSIGNED_RIGHT_SHIFT, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("USGN RIGHT SHIFT") },
|
||||
|
||||
{ NJS_VMCODE_LOGICAL_NOT, sizeof(njs_vmcode_2addr_t),
|
||||
njs_str("LOGICAL NOT ") },
|
||||
|
||||
{ NJS_VMCODE_BITWISE_NOT, sizeof(njs_vmcode_2addr_t),
|
||||
njs_str("BINARY NOT ") },
|
||||
{ NJS_VMCODE_BITWISE_AND, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("BINARY AND ") },
|
||||
{ NJS_VMCODE_BITWISE_XOR, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("BINARY XOR ") },
|
||||
{ NJS_VMCODE_BITWISE_OR, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("BINARY OR ") },
|
||||
|
||||
{ NJS_VMCODE_EQUAL, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("EQUAL ") },
|
||||
{ NJS_VMCODE_NOT_EQUAL, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("NOT EQUAL ") },
|
||||
{ NJS_VMCODE_LESS, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("LESS ") },
|
||||
{ NJS_VMCODE_LESS_OR_EQUAL, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("LESS OR EQUAL ") },
|
||||
{ NJS_VMCODE_GREATER, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("GREATER ") },
|
||||
{ NJS_VMCODE_GREATER_OR_EQUAL, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("GREATER OR EQUAL") },
|
||||
|
||||
{ NJS_VMCODE_STRICT_EQUAL, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("STRICT EQUAL ") },
|
||||
{ NJS_VMCODE_STRICT_NOT_EQUAL, sizeof(njs_vmcode_3addr_t),
|
||||
njs_str("STRICT NOT EQUAL") },
|
||||
|
||||
{ NJS_VMCODE_MOVE, sizeof(njs_vmcode_move_t),
|
||||
njs_str("MOVE ") },
|
||||
|
||||
{ NJS_VMCODE_THROW, sizeof(njs_vmcode_throw_t),
|
||||
njs_str("THROW ") },
|
||||
|
||||
{ NJS_VMCODE_LET, sizeof(njs_vmcode_variable_t),
|
||||
njs_str("LET ") },
|
||||
|
||||
{ NJS_VMCODE_LET_UPDATE, sizeof(njs_vmcode_variable_t),
|
||||
njs_str("LET UPDATE ") },
|
||||
|
||||
{ NJS_VMCODE_INITIALIZATION_TEST, sizeof(njs_vmcode_variable_t),
|
||||
njs_str("INIT TEST ") },
|
||||
|
||||
{ NJS_VMCODE_NOT_INITIALIZED, sizeof(njs_vmcode_variable_t),
|
||||
njs_str("NOT INIT ") },
|
||||
|
||||
{ NJS_VMCODE_ASSIGNMENT_ERROR, sizeof(njs_vmcode_variable_t),
|
||||
njs_str("ASSIGNMENT ERROR") },
|
||||
|
||||
{ NJS_VMCODE_DEBUGGER, sizeof(njs_vmcode_debugger_t),
|
||||
njs_str("DEBUGGER ") },
|
||||
|
||||
{ NJS_VMCODE_AWAIT, sizeof(njs_vmcode_await_t),
|
||||
njs_str("AWAIT ") },
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
njs_disassembler(njs_vm_t *vm)
|
||||
{
|
||||
njs_uint_t n;
|
||||
njs_vm_code_t *code;
|
||||
|
||||
code = vm->codes->start;
|
||||
n = vm->codes->items;
|
||||
|
||||
while (n != 0) {
|
||||
njs_printf("%V:%V\n", &code->file, &code->name);
|
||||
njs_disassemble(code->start, code->end, -1, code->lines);
|
||||
code++;
|
||||
n--;
|
||||
}
|
||||
|
||||
njs_printf("\n");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
njs_disassemble(u_char *start, u_char *end, njs_int_t count, njs_arr_t *lines)
|
||||
{
|
||||
u_char *p;
|
||||
uint32_t line;
|
||||
njs_str_t *name;
|
||||
njs_uint_t n;
|
||||
const char *type;
|
||||
njs_code_name_t *code_name;
|
||||
njs_vmcode_jump_t *jump;
|
||||
njs_vmcode_error_t *error;
|
||||
njs_vmcode_1addr_t *code1;
|
||||
njs_vmcode_2addr_t *code2;
|
||||
njs_vmcode_3addr_t *code3;
|
||||
njs_vmcode_array_t *array;
|
||||
njs_vmcode_catch_t *catch;
|
||||
njs_vmcode_import_t *import;
|
||||
njs_vmcode_finally_t *finally;
|
||||
njs_vmcode_try_end_t *try_end;
|
||||
njs_vmcode_try_start_t *try_start;
|
||||
njs_vmcode_operation_t operation;
|
||||
njs_vmcode_cond_jump_t *cond_jump;
|
||||
njs_vmcode_test_jump_t *test_jump;
|
||||
njs_vmcode_prop_next_t *prop_next;
|
||||
njs_vmcode_try_return_t *try_return;
|
||||
njs_vmcode_equal_jump_t *equal;
|
||||
njs_vmcode_prop_foreach_t *prop_foreach;
|
||||
njs_vmcode_method_frame_t *method;
|
||||
njs_vmcode_prop_accessor_t *prop_accessor;
|
||||
njs_vmcode_try_trampoline_t *try_tramp;
|
||||
njs_vmcode_function_frame_t *function;
|
||||
|
||||
/*
|
||||
* On some 32-bit platform uintptr_t is int and compilers warn
|
||||
* about %l format modifier. size_t has the size as pointer so
|
||||
* there is no run-time overhead.
|
||||
*/
|
||||
|
||||
p = start;
|
||||
|
||||
while (((p < end) && (count == -1)) || (count-- > 0)) {
|
||||
operation = *(njs_vmcode_operation_t *) p;
|
||||
line = njs_lookup_line(lines, p - start);
|
||||
|
||||
if (operation == NJS_VMCODE_ARRAY) {
|
||||
array = (njs_vmcode_array_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz ARRAY %04Xz %uz%s\n",
|
||||
line, p - start, (size_t) array->retval,
|
||||
(size_t) array->length, array->ctor ? " INIT" : "");
|
||||
|
||||
p += sizeof(njs_vmcode_array_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_IF_TRUE_JUMP) {
|
||||
cond_jump = (njs_vmcode_cond_jump_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz JUMP IF TRUE %04Xz %z\n",
|
||||
line, p - start, (size_t) cond_jump->cond,
|
||||
(size_t) cond_jump->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_cond_jump_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_IF_FALSE_JUMP) {
|
||||
cond_jump = (njs_vmcode_cond_jump_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz JUMP IF FALSE %04Xz %z\n",
|
||||
line, p - start, (size_t) cond_jump->cond,
|
||||
(size_t) cond_jump->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_cond_jump_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_JUMP) {
|
||||
jump = (njs_vmcode_jump_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz JUMP %z\n",
|
||||
line, p - start, (size_t) jump->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_jump_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_IF_EQUAL_JUMP) {
|
||||
equal = (njs_vmcode_equal_jump_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz JUMP IF EQUAL %04Xz %04Xz %z\n",
|
||||
line, p - start, (size_t) equal->value1,
|
||||
(size_t) equal->value2, (size_t) equal->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_equal_jump_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_TEST_IF_TRUE) {
|
||||
test_jump = (njs_vmcode_test_jump_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz TEST IF TRUE %04Xz %04Xz %z\n",
|
||||
line, p - start, (size_t) test_jump->retval,
|
||||
(size_t) test_jump->value, (size_t) test_jump->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_test_jump_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_TEST_IF_FALSE) {
|
||||
test_jump = (njs_vmcode_test_jump_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz TEST IF FALSE %04Xz %04Xz %z\n",
|
||||
line, p - start, (size_t) test_jump->retval,
|
||||
(size_t) test_jump->value, (size_t) test_jump->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_test_jump_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_COALESCE) {
|
||||
test_jump = (njs_vmcode_test_jump_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz COALESCE %04Xz %04Xz %z\n",
|
||||
line, p - start, (size_t) test_jump->retval,
|
||||
(size_t) test_jump->value, (size_t) test_jump->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_test_jump_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_FUNCTION_FRAME) {
|
||||
function = (njs_vmcode_function_frame_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz FUNCTION FRAME %04Xz %uz%s\n",
|
||||
line, p - start, (size_t) function->name,
|
||||
function->nargs, function->ctor ? " CTOR" : "");
|
||||
|
||||
p += sizeof(njs_vmcode_function_frame_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_METHOD_FRAME) {
|
||||
method = (njs_vmcode_method_frame_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz METHOD FRAME %04Xz %04Xz %uz%s\n",
|
||||
line, p - start, (size_t) method->object,
|
||||
(size_t) method->method, method->nargs,
|
||||
method->ctor ? " CTOR" : "");
|
||||
|
||||
p += sizeof(njs_vmcode_method_frame_t);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_PROPERTY_FOREACH) {
|
||||
prop_foreach = (njs_vmcode_prop_foreach_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz PROP FOREACH %04Xz %04Xz %z\n",
|
||||
line, p - start, (size_t) prop_foreach->next,
|
||||
(size_t) prop_foreach->object,
|
||||
(size_t) prop_foreach->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_prop_foreach_t);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_PROPERTY_NEXT) {
|
||||
prop_next = (njs_vmcode_prop_next_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz PROP NEXT %04Xz %04Xz %04Xz %z\n",
|
||||
line, p - start, (size_t) prop_next->retval,
|
||||
(size_t) prop_next->object, (size_t) prop_next->next,
|
||||
(size_t) prop_next->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_prop_next_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_PROPERTY_ACCESSOR) {
|
||||
prop_accessor = (njs_vmcode_prop_accessor_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz PROP %s ACCESSOR %04Xz %04Xz %04Xz\n",
|
||||
line, p - start,
|
||||
(prop_accessor->type == NJS_OBJECT_PROP_GETTER)
|
||||
? "GET" : "SET",
|
||||
(size_t) prop_accessor->value,
|
||||
(size_t) prop_accessor->object,
|
||||
(size_t) prop_accessor->property);
|
||||
|
||||
p += sizeof(njs_vmcode_prop_accessor_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_IMPORT) {
|
||||
import = (njs_vmcode_import_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz IMPORT %04Xz %V\n",
|
||||
line, p - start, (size_t) import->retval,
|
||||
&import->module->name);
|
||||
|
||||
p += sizeof(njs_vmcode_import_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_TRY_START) {
|
||||
try_start = (njs_vmcode_try_start_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz TRY START %04Xz %04Xz %z\n",
|
||||
line, p - start, (size_t) try_start->exception_value,
|
||||
(size_t) try_start->exit_value,
|
||||
(size_t) try_start->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_try_start_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_TRY_BREAK) {
|
||||
try_tramp = (njs_vmcode_try_trampoline_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz TRY BREAK %04Xz %z\n",
|
||||
line, p - start, (size_t) try_tramp->exit_value,
|
||||
(size_t) try_tramp->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_try_trampoline_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_TRY_CONTINUE) {
|
||||
try_tramp = (njs_vmcode_try_trampoline_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz TRY CONTINUE %04Xz %z\n",
|
||||
line, p - start, (size_t) try_tramp->exit_value,
|
||||
(size_t) try_tramp->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_try_trampoline_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_TRY_RETURN) {
|
||||
try_return = (njs_vmcode_try_return_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz TRY RETURN %04Xz %04Xz %z\n",
|
||||
line, p - start, (size_t) try_return->save,
|
||||
(size_t) try_return->retval,
|
||||
(size_t) try_return->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_try_return_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_CATCH) {
|
||||
catch = (njs_vmcode_catch_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz CATCH %04Xz %z\n",
|
||||
line, p - start, (size_t) catch->exception,
|
||||
(size_t) catch->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_catch_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_TRY_END) {
|
||||
try_end = (njs_vmcode_try_end_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz TRY END %z\n",
|
||||
line, p - start, (size_t) try_end->offset);
|
||||
|
||||
p += sizeof(njs_vmcode_try_end_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_FINALLY) {
|
||||
finally = (njs_vmcode_finally_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz TRY FINALLY %04Xz %04Xz %z %z\n",
|
||||
line, p - start, (size_t) finally->retval,
|
||||
(size_t) finally->exit_value,
|
||||
(size_t) finally->continue_offset,
|
||||
(size_t) finally->break_offset);
|
||||
|
||||
p += sizeof(njs_vmcode_finally_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (operation == NJS_VMCODE_ERROR) {
|
||||
error = (njs_vmcode_error_t *) p;
|
||||
|
||||
switch (error->type) {
|
||||
case NJS_OBJ_TYPE_REF_ERROR:
|
||||
type = "REFERENCE";
|
||||
break;
|
||||
|
||||
case NJS_OBJ_TYPE_TYPE_ERROR:
|
||||
type = "TYPE";
|
||||
break;
|
||||
|
||||
case NJS_OBJ_TYPE_ERROR:
|
||||
default:
|
||||
type = "";
|
||||
}
|
||||
|
||||
njs_printf("%5uD | %05uz %s ERROR\n", line, p - start, type);
|
||||
|
||||
p += sizeof(njs_vmcode_error_t);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
code_name = code_names;
|
||||
n = njs_nitems(code_names);
|
||||
|
||||
do {
|
||||
if (operation == code_name->operation) {
|
||||
name = &code_name->name;
|
||||
|
||||
if (code_name->size == sizeof(njs_vmcode_3addr_t)) {
|
||||
code3 = (njs_vmcode_3addr_t *) p;
|
||||
|
||||
njs_printf("%5uD | %05uz %*s %04Xz %04Xz %04Xz\n",
|
||||
line, 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;
|
||||
|
||||
njs_printf("%5uD | %05uz %*s %04Xz %04Xz\n",
|
||||
line, 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;
|
||||
|
||||
njs_printf("%5uD | %05uz %*s %04Xz\n",
|
||||
line, p - start, name->length, name->start,
|
||||
(size_t) code1->index);
|
||||
}
|
||||
|
||||
p += code_name->size;
|
||||
|
||||
goto next;
|
||||
}
|
||||
|
||||
code_name++;
|
||||
n--;
|
||||
|
||||
} while (n != 0);
|
||||
|
||||
njs_printf("%5uD | %05uz UNKNOWN %04Xz\n", line,
|
||||
p - start, (size_t) (uintptr_t) operation);
|
||||
|
||||
p += sizeof(njs_vmcode_operation_t);
|
||||
|
||||
next:
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,149 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*
|
||||
* An internal diy_fp implementation.
|
||||
* For details, see Loitsch, Florian. "Printing floating-point numbers quickly
|
||||
* and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.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);
|
||||
}
|
||||
|
|
@ -1,214 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*
|
||||
* An internal diy_fp implementation.
|
||||
* For details, see Loitsch, Florian. "Printing floating-point numbers quickly
|
||||
* and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_DIYFP_H_INCLUDED_
|
||||
#define _NJS_DIYFP_H_INCLUDED_
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint64_t significand;
|
||||
int exp;
|
||||
} njs_diyfp_t;
|
||||
|
||||
|
||||
typedef union {
|
||||
double d;
|
||||
uint64_t u64;
|
||||
} njs_diyfp_conv_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_OFFSET ((int64_t) 0x3ff)
|
||||
#define NJS_DBL_EXPONENT_BIAS (NJS_DBL_EXPONENT_OFFSET \
|
||||
+ 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_DBL_SIGN_MASK njs_uint64(0x80000000, 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;
|
||||
njs_diyfp_conv_t conv;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
conv.u64 = (significand & NJS_DBL_SIGNIFICAND_MASK)
|
||||
| (biased_exp << NJS_DBL_SIGNIFICAND_SIZE);
|
||||
|
||||
return conv.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_ */
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.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;
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
|
||||
/*
|
||||
* 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_ */
|
||||
|
|
@ -1,657 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*
|
||||
* Grisu2 algorithm implementation for printing floating-point numbers based
|
||||
* upon the work of Milo Yip and Doug Currie.
|
||||
*
|
||||
* For algorithm information, see Loitsch, Florian. "Printing
|
||||
* floating-point numbers quickly and accurately with integers." ACM Sigplan
|
||||
* Notices 45.6 (2010): 233-243.
|
||||
*
|
||||
* Copyright (C) 2015 Doug Currie
|
||||
* based on dtoa_milo.h
|
||||
* Copyright (C) 2014 Milo Yip
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.h>
|
||||
#include <njs_diyfp.h>
|
||||
#include <njs_dtoa.h>
|
||||
|
||||
|
||||
njs_inline void
|
||||
njs_round(char *start, size_t length, uint64_t delta, uint64_t rest,
|
||||
uint64_t ten_kappa, uint64_t margin)
|
||||
{
|
||||
while (rest < margin && delta - rest >= ten_kappa
|
||||
&& (rest + ten_kappa < margin || /* closer */
|
||||
margin - rest > rest + ten_kappa - margin))
|
||||
{
|
||||
start[length - 1]--;
|
||||
rest += ten_kappa;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
njs_inline void
|
||||
njs_round_prec(char *start, size_t length, uint64_t rest, uint64_t ten_kappa,
|
||||
uint64_t unit, int *kappa)
|
||||
{
|
||||
njs_int_t i;
|
||||
|
||||
if (unit >= ten_kappa || ten_kappa - unit <= unit) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((ten_kappa - rest > rest) && (ten_kappa - 2 * rest >= 2 * unit)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((rest > unit) && (ten_kappa - (rest - unit) <= (rest - unit))) {
|
||||
start[length - 1]++;
|
||||
|
||||
for (i = length - 1; i > 0; --i) {
|
||||
if (start[i] != '0' + 10) {
|
||||
break;
|
||||
}
|
||||
|
||||
start[i] = '0';
|
||||
start[i - 1]++;
|
||||
}
|
||||
|
||||
if (start[0] == '0' + 10) {
|
||||
start[0] = '1';
|
||||
*kappa += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
njs_inline int
|
||||
njs_dec_count(uint32_t n)
|
||||
{
|
||||
if (n < 10000) {
|
||||
if (n < 100) {
|
||||
return (n < 10) ? 1 : 2;
|
||||
|
||||
} else {
|
||||
return (n < 1000) ? 3 : 4;
|
||||
}
|
||||
|
||||
} else {
|
||||
if (n < 1000000) {
|
||||
return (n < 100000) ? 5 : 6;
|
||||
|
||||
} else {
|
||||
if (n < 100000000) {
|
||||
return (n < 10000000) ? 7 : 8;
|
||||
|
||||
} else {
|
||||
return (n < 1000000000) ? 9 : 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_digit_gen(njs_diyfp_t v, njs_diyfp_t high, uint64_t delta, char *start,
|
||||
int *dec_exp)
|
||||
{
|
||||
int kappa;
|
||||
char *p;
|
||||
uint32_t integer, d;
|
||||
uint64_t fraction, rest, margin;
|
||||
njs_diyfp_t one;
|
||||
|
||||
static const uint64_t pow10[] = {
|
||||
1,
|
||||
10,
|
||||
100,
|
||||
1000,
|
||||
10000,
|
||||
100000,
|
||||
1000000,
|
||||
10000000,
|
||||
100000000,
|
||||
1000000000
|
||||
};
|
||||
|
||||
one = njs_diyfp((uint64_t) 1 << -high.exp, high.exp);
|
||||
integer = (uint32_t) (high.significand >> -one.exp);
|
||||
fraction = high.significand & (one.significand - 1);
|
||||
|
||||
margin = njs_diyfp_sub(high, v).significand;
|
||||
|
||||
p = start;
|
||||
|
||||
kappa = njs_dec_count(integer);
|
||||
|
||||
while (kappa > 0) {
|
||||
|
||||
switch (kappa) {
|
||||
case 10: d = integer / 1000000000; integer %= 1000000000; break;
|
||||
case 9: d = integer / 100000000; integer %= 100000000; break;
|
||||
case 8: d = integer / 10000000; integer %= 10000000; break;
|
||||
case 7: d = integer / 1000000; integer %= 1000000; break;
|
||||
case 6: d = integer / 100000; integer %= 100000; break;
|
||||
case 5: d = integer / 10000; integer %= 10000; break;
|
||||
case 4: d = integer / 1000; integer %= 1000; break;
|
||||
case 3: d = integer / 100; integer %= 100; break;
|
||||
case 2: d = integer / 10; integer %= 10; break;
|
||||
default: d = integer; integer = 0; break;
|
||||
}
|
||||
|
||||
if (d != 0 || p != start) {
|
||||
*p++ = '0' + d;
|
||||
}
|
||||
|
||||
kappa--;
|
||||
|
||||
rest = ((uint64_t) integer << -one.exp) + fraction;
|
||||
|
||||
if (rest < delta) {
|
||||
*dec_exp += kappa;
|
||||
njs_round(start, p - start, delta, rest, pow10[kappa] << -one.exp,
|
||||
margin);
|
||||
return p - start;
|
||||
}
|
||||
}
|
||||
|
||||
/* kappa = 0. */
|
||||
|
||||
for ( ;; ) {
|
||||
fraction *= 10;
|
||||
delta *= 10;
|
||||
|
||||
d = (uint32_t) (fraction >> -one.exp);
|
||||
|
||||
if (d != 0 || p != start) {
|
||||
*p++ = '0' + d;
|
||||
}
|
||||
|
||||
fraction &= one.significand - 1;
|
||||
kappa--;
|
||||
|
||||
if (fraction < delta) {
|
||||
*dec_exp += kappa;
|
||||
margin *= (-kappa < 10) ? pow10[-kappa] : 0;
|
||||
njs_round(start, p - start, delta, fraction, one.significand,
|
||||
margin);
|
||||
return p - start;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_digit_gen_prec(njs_diyfp_t v, size_t prec, char *start, int *dec_exp)
|
||||
{
|
||||
int kappa;
|
||||
char *p;
|
||||
uint32_t integer, divisor;
|
||||
uint64_t fraction, rest, error;
|
||||
njs_diyfp_t one;
|
||||
|
||||
static const uint64_t pow10[] = {
|
||||
1,
|
||||
10,
|
||||
100,
|
||||
1000,
|
||||
10000,
|
||||
100000,
|
||||
1000000,
|
||||
10000000,
|
||||
100000000,
|
||||
1000000000
|
||||
};
|
||||
|
||||
one = njs_diyfp((uint64_t) 1 << -v.exp, v.exp);
|
||||
integer = (uint32_t) (v.significand >> -one.exp);
|
||||
fraction = v.significand & (one.significand - 1);
|
||||
|
||||
error = 1;
|
||||
|
||||
p = start;
|
||||
|
||||
kappa = njs_dec_count(integer);
|
||||
|
||||
while (kappa > 0) {
|
||||
divisor = pow10[kappa - 1];
|
||||
|
||||
*p++ = '0' + integer / divisor;
|
||||
|
||||
integer %= divisor;
|
||||
|
||||
kappa--;
|
||||
prec--;
|
||||
|
||||
if (prec == 0) {
|
||||
rest = ((uint64_t) integer << -one.exp) + fraction;
|
||||
njs_round_prec(start, p - start, rest, pow10[kappa] << -one.exp,
|
||||
error, &kappa);
|
||||
|
||||
*dec_exp += kappa;
|
||||
return p - start;
|
||||
}
|
||||
}
|
||||
|
||||
/* kappa = 0. */
|
||||
|
||||
while (prec > 0 && fraction > error) {
|
||||
fraction *= 10;
|
||||
error *= 10;
|
||||
|
||||
*p++ = '0' + (fraction >> -one.exp);
|
||||
|
||||
fraction &= one.significand - 1;
|
||||
kappa--;
|
||||
prec--;
|
||||
}
|
||||
|
||||
njs_round_prec(start, p - start, fraction, one.significand, error, &kappa);
|
||||
|
||||
*dec_exp += kappa;
|
||||
|
||||
return p - start;
|
||||
}
|
||||
|
||||
|
||||
njs_inline njs_diyfp_t
|
||||
njs_diyfp_normalize_boundary(njs_diyfp_t v)
|
||||
{
|
||||
while ((v.significand & (NJS_DBL_HIDDEN_BIT << 1)) == 0) {
|
||||
v.significand <<= 1;
|
||||
v.exp--;
|
||||
}
|
||||
|
||||
return njs_diyfp_shift_left(v, NJS_SIGNIFICAND_SHIFT - 2);
|
||||
}
|
||||
|
||||
|
||||
njs_inline void
|
||||
njs_diyfp_normalize_boundaries(njs_diyfp_t v, njs_diyfp_t* minus,
|
||||
njs_diyfp_t* plus)
|
||||
{
|
||||
njs_diyfp_t pl, mi;
|
||||
|
||||
pl = njs_diyfp_normalize_boundary(njs_diyfp((v.significand << 1) + 1,
|
||||
v.exp - 1));
|
||||
|
||||
if (v.significand == NJS_DBL_HIDDEN_BIT) {
|
||||
mi = njs_diyfp((v.significand << 2) - 1, v.exp - 2);
|
||||
|
||||
} else {
|
||||
mi = njs_diyfp((v.significand << 1) - 1, v.exp - 1);
|
||||
}
|
||||
|
||||
mi.significand <<= mi.exp - pl.exp;
|
||||
mi.exp = pl.exp;
|
||||
|
||||
*plus = pl;
|
||||
*minus = mi;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Grisu2 produces optimal (shortest) decimal representation for 99.8%
|
||||
* of IEEE doubles. For remaining 0.2% bignum algorithm like Dragon4 is requred.
|
||||
*/
|
||||
njs_inline size_t
|
||||
njs_grisu2(double value, char *start, int *point)
|
||||
{
|
||||
int dec_exp;
|
||||
size_t length;
|
||||
njs_diyfp_t v, low, high, ten_mk, scaled_v, scaled_low, scaled_high;
|
||||
|
||||
v = njs_d2diyfp(value);
|
||||
|
||||
njs_diyfp_normalize_boundaries(v, &low, &high);
|
||||
|
||||
ten_mk = njs_cached_power_bin(high.exp, &dec_exp);
|
||||
|
||||
scaled_v = njs_diyfp_mul(njs_diyfp_normalize(v), ten_mk);
|
||||
scaled_low = njs_diyfp_mul(low, ten_mk);
|
||||
scaled_high = njs_diyfp_mul(high, ten_mk);
|
||||
|
||||
scaled_low.significand++;
|
||||
scaled_high.significand--;
|
||||
|
||||
length = njs_digit_gen(scaled_v, scaled_high,
|
||||
scaled_high.significand - scaled_low.significand,
|
||||
start, &dec_exp);
|
||||
|
||||
*point = length + dec_exp;
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_grisu2_prec(double value, char *start, size_t prec, int *point)
|
||||
{
|
||||
int dec_exp;
|
||||
size_t length;
|
||||
njs_diyfp_t v, ten_mk, scaled_v;
|
||||
|
||||
v = njs_diyfp_normalize(njs_d2diyfp(value));
|
||||
|
||||
ten_mk = njs_cached_power_bin(v.exp, &dec_exp);
|
||||
|
||||
scaled_v = njs_diyfp_mul(v, ten_mk);
|
||||
|
||||
length = njs_digit_gen_prec(scaled_v, prec, start, &dec_exp);
|
||||
|
||||
*point = length + dec_exp;
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_write_exponent(int exp, char *start)
|
||||
{
|
||||
char *p;
|
||||
size_t length;
|
||||
uint32_t u32;
|
||||
char buf[4];
|
||||
|
||||
/* -324 <= exp <= 308. */
|
||||
|
||||
if (exp < 0) {
|
||||
*start++ = '-';
|
||||
exp = -exp;
|
||||
|
||||
} else {
|
||||
*start++ = '+';
|
||||
}
|
||||
|
||||
u32 = exp;
|
||||
p = buf + njs_length(buf);
|
||||
|
||||
do {
|
||||
*--p = u32 % 10 + '0';
|
||||
u32 /= 10;
|
||||
} while (u32 != 0);
|
||||
|
||||
length = buf + njs_length(buf) - p;
|
||||
|
||||
memcpy(start, p, length);
|
||||
|
||||
return length + 1;
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_dtoa_format(char *start, size_t len, int point)
|
||||
{
|
||||
int offset, length;
|
||||
size_t size;
|
||||
|
||||
length = (int) len;
|
||||
|
||||
if (length <= point && point <= 21) {
|
||||
|
||||
/* 1234e7 -> 12340000000 */
|
||||
|
||||
if (point - length > 0) {
|
||||
njs_memset(&start[length], '0', point - length);
|
||||
}
|
||||
|
||||
return point;
|
||||
}
|
||||
|
||||
if (0 < point && point <= 21) {
|
||||
|
||||
/* 1234e-2 -> 12.34 */
|
||||
|
||||
memmove(&start[point + 1], &start[point], length - point);
|
||||
start[point] = '.';
|
||||
|
||||
return length + 1;
|
||||
}
|
||||
|
||||
if (-6 < point && point <= 0) {
|
||||
|
||||
/* 1234e-6 -> 0.001234 */
|
||||
|
||||
offset = 2 - point;
|
||||
memmove(&start[offset], start, length);
|
||||
|
||||
start[0] = '0';
|
||||
start[1] = '.';
|
||||
|
||||
if (offset - 2 > 0) {
|
||||
njs_memset(&start[2], '0', offset - 2);
|
||||
}
|
||||
|
||||
return length + offset;
|
||||
}
|
||||
|
||||
/* 1234e30 -> 1.234e33 */
|
||||
|
||||
if (length == 1) {
|
||||
|
||||
/* 1e30 */
|
||||
|
||||
start[1] = 'e';
|
||||
|
||||
size = njs_write_exponent(point - 1, &start[2]);
|
||||
|
||||
return size + 2;
|
||||
}
|
||||
|
||||
memmove(&start[2], &start[1], length - 1);
|
||||
start[1] = '.';
|
||||
start[length + 1] = 'e';
|
||||
|
||||
size = njs_write_exponent(point - 1, &start[length + 2]);
|
||||
|
||||
return size + length + 2;
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_dtoa_exp_format(char *start, int exponent, size_t prec, size_t len)
|
||||
{
|
||||
char *p;
|
||||
|
||||
p = &start[len];
|
||||
if (prec != 1) {
|
||||
memmove(&start[2], &start[1], len - 1);
|
||||
start[1] = '.';
|
||||
p++;
|
||||
}
|
||||
|
||||
njs_memset(p, '0', prec - len);
|
||||
p += prec - len;
|
||||
|
||||
*p++ = 'e';
|
||||
|
||||
return prec + 1 + (prec != 1) + njs_write_exponent(exponent, p);
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_dtoa_prec_format(char *start, size_t prec, size_t len, int point)
|
||||
{
|
||||
int exponent;
|
||||
size_t m, rest;
|
||||
|
||||
exponent = point - 1;
|
||||
|
||||
if (exponent < -6 || exponent >= (int) prec) {
|
||||
return njs_dtoa_exp_format(start, exponent, prec, len);
|
||||
}
|
||||
|
||||
/* Fixed notation. */
|
||||
|
||||
if (point <= 0) {
|
||||
|
||||
/* 1234e-2 => 0.001234000 */
|
||||
|
||||
memmove(&start[2 + (-point)], start, len);
|
||||
start[0] = '0';
|
||||
start[1] = '.';
|
||||
|
||||
njs_memset(&start[2], '0', -point);
|
||||
|
||||
if (prec > len) {
|
||||
njs_memset(&start[2 + (-point) + len], '0', prec - len);
|
||||
}
|
||||
|
||||
return prec + 2 + (-point);
|
||||
}
|
||||
|
||||
if (point >= (int) len) {
|
||||
|
||||
/* TODO: (2**96).toPrecision(45) not enough precision, BigInt needed. */
|
||||
|
||||
njs_memset(&start[len], '0', point - len);
|
||||
|
||||
if (point < (int) prec) {
|
||||
start[point] = '.';
|
||||
|
||||
njs_memset(&start[point + 1], '0', prec - point);
|
||||
}
|
||||
|
||||
} else if (point < (int) prec) {
|
||||
|
||||
/* 123456 -> 123.45600 */
|
||||
|
||||
m = njs_min((int) len, point);
|
||||
rest = njs_min(len, prec) - m;
|
||||
memmove(&start[m + 1], &start[m], rest);
|
||||
|
||||
start[m] = '.';
|
||||
|
||||
njs_memset(&start[m + rest + 1], '0', prec - m - rest);
|
||||
}
|
||||
|
||||
return prec + (point < (int) prec);
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
njs_dtoa(double value, char *start)
|
||||
{
|
||||
int point, minus;
|
||||
char *p;
|
||||
size_t length;
|
||||
|
||||
/* Not handling NaN and inf. */
|
||||
|
||||
minus = 0;
|
||||
p = start;
|
||||
|
||||
if (value == 0) {
|
||||
*p++ = '0';
|
||||
|
||||
return p - start;
|
||||
}
|
||||
|
||||
if (signbit(value)) {
|
||||
*p++ = '-';
|
||||
value = -value;
|
||||
minus = 1;
|
||||
}
|
||||
|
||||
length = njs_grisu2(value, p, &point);
|
||||
|
||||
return njs_dtoa_format(p, length, point) + minus;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* TODO: For prec > 16 result maybe rounded. To support prec > 16 Bignum
|
||||
* support is requred.
|
||||
*/
|
||||
size_t
|
||||
njs_dtoa_precision(double value, char *start, size_t prec)
|
||||
{
|
||||
int point, minus;
|
||||
char *p;
|
||||
size_t length;
|
||||
|
||||
/* Not handling NaN and inf. */
|
||||
|
||||
p = start;
|
||||
minus = 0;
|
||||
|
||||
if (value != 0) {
|
||||
if (value < 0) {
|
||||
*p++ = '-';
|
||||
value = -value;
|
||||
minus = 1;
|
||||
}
|
||||
|
||||
length = njs_grisu2_prec(value, p, prec, &point);
|
||||
|
||||
} else {
|
||||
start[0] = '0';
|
||||
length = 1;
|
||||
point = 1;
|
||||
}
|
||||
|
||||
return njs_dtoa_prec_format(p, prec, length, point) + minus;
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
njs_dtoa_exponential(double value, char *start, njs_int_t frac)
|
||||
{
|
||||
int point, minus;
|
||||
char *p;
|
||||
size_t length;
|
||||
|
||||
/* Not handling NaN and inf. */
|
||||
|
||||
p = start;
|
||||
minus = 0;
|
||||
|
||||
if (value != 0) {
|
||||
if (value < 0) {
|
||||
*p++ = '-';
|
||||
value = -value;
|
||||
minus = 1;
|
||||
}
|
||||
|
||||
if (frac == -1) {
|
||||
length = njs_grisu2(value, p, &point);
|
||||
|
||||
} else {
|
||||
length = njs_grisu2_prec(value, p, frac + 1, &point);
|
||||
}
|
||||
|
||||
} else {
|
||||
start[0] = '0';
|
||||
length = 1;
|
||||
point = 1;
|
||||
}
|
||||
|
||||
if (frac == -1) {
|
||||
frac = length - 1;
|
||||
}
|
||||
|
||||
return njs_dtoa_exp_format(p, point - 1, frac + 1, length) + minus;
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
|
||||
/*
|
||||
* 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 *start);
|
||||
NJS_EXPORT size_t njs_dtoa_precision(double value, char *start, size_t prec);
|
||||
NJS_EXPORT size_t njs_dtoa_exponential(double value, char *start,
|
||||
njs_int_t frac);
|
||||
|
||||
#endif /* _NJS_DTOA_H_INCLUDED_ */
|
||||
|
|
@ -1,446 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*
|
||||
* An internal fixed_dtoa() implementation based upon V8
|
||||
* src/numbers/fixed-dtoa.cc without bignum support.
|
||||
*
|
||||
* Copyright 2011 the V8 project authors. All rights reserved.
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include <njs_main.h>
|
||||
#include <njs_diyfp.h>
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint64_t high;
|
||||
uint64_t low;
|
||||
} njs_diyu128_t;
|
||||
|
||||
|
||||
#define njs_diyu128(_h, _l) (njs_diyu128_t) { .high = (_h), .low = (_l) }
|
||||
|
||||
|
||||
njs_inline njs_diyu128_t
|
||||
njs_diyu128_mul(njs_diyu128_t v, uint32_t multiplicand)
|
||||
{
|
||||
uint32_t part;
|
||||
uint64_t accumulator;
|
||||
|
||||
accumulator = (v.low & UINT32_MAX) * multiplicand;
|
||||
part = (uint32_t) (accumulator & UINT32_MAX);
|
||||
|
||||
accumulator >>= 32;
|
||||
accumulator = accumulator + (v.low >> 32) * multiplicand;
|
||||
v.low = (accumulator << 32) + part;
|
||||
|
||||
accumulator >>= 32;
|
||||
accumulator = accumulator + (v.high & UINT32_MAX) * multiplicand;
|
||||
part = (uint32_t) (accumulator & UINT32_MAX);
|
||||
|
||||
accumulator >>= 32;
|
||||
accumulator = accumulator + (v.high >> 32) * multiplicand;
|
||||
v.high = (accumulator << 32) + part;
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
njs_inline njs_diyu128_t
|
||||
njs_diyu128_shift(njs_diyu128_t v, njs_int_t shift)
|
||||
{
|
||||
/* -64 <= shift <= 64.*/
|
||||
|
||||
if (shift < 0) {
|
||||
if (shift == -64) {
|
||||
v.high = v.low;
|
||||
v.low = 0;
|
||||
|
||||
} else {
|
||||
v.high <<= -shift;
|
||||
v.high += v.low >> (64 + shift);
|
||||
v.low <<= -shift;
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
if (shift > 0) {
|
||||
if (shift == 64) {
|
||||
v.low = v.high;
|
||||
v.high = 0;
|
||||
|
||||
} else {
|
||||
v.low >>= shift;
|
||||
v.low += v.high << (64 - shift);
|
||||
v.high >>= shift;
|
||||
}
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
njs_inline njs_int_t
|
||||
njs_diyu128_div_mod_pow2(njs_diyu128_t *v, njs_int_t power)
|
||||
{
|
||||
uint64_t part_low, part_high;
|
||||
njs_int_t result;
|
||||
|
||||
if (power >= 64) {
|
||||
result = (int) (v->high >> (power - 64));
|
||||
v->high -= (uint64_t) result << (power - 64);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
part_low = v->low >> power;
|
||||
part_high = v->high << (64 - power);
|
||||
|
||||
result = (int) (part_low + part_high);
|
||||
|
||||
v->low -= part_low << power;
|
||||
v->high = 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
njs_inline njs_bool_t
|
||||
njs_diyu128_is_zero(njs_diyu128_t v)
|
||||
{
|
||||
if (v.low == 0 && v.high == 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
njs_inline njs_uint_t
|
||||
njs_diyu128_bit_at(njs_diyu128_t v, njs_uint_t pos)
|
||||
{
|
||||
if (pos >= 64) {
|
||||
return (njs_uint_t) (v.high >> (pos - 64)) & 1;
|
||||
}
|
||||
|
||||
return (njs_uint_t) (v.low >> pos) & 1;
|
||||
}
|
||||
|
||||
|
||||
static size_t
|
||||
njs_fill_digits32(uint32_t number, char *start, size_t length)
|
||||
{
|
||||
char c;
|
||||
size_t i, j, n;
|
||||
njs_int_t digit;
|
||||
|
||||
n = 0;
|
||||
|
||||
while (number != 0) {
|
||||
digit = number % 10;
|
||||
number /= 10;
|
||||
start[length + n] = '0' + digit;
|
||||
n++;
|
||||
}
|
||||
|
||||
i = length;
|
||||
j = length + n - 1;
|
||||
|
||||
while (i < j) {
|
||||
c = start[i];
|
||||
start[i] = start[j];
|
||||
start[j] = c;
|
||||
|
||||
i++;
|
||||
j--;
|
||||
}
|
||||
|
||||
return length + n;
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_fill_digits32_fixed_length(uint32_t number, size_t requested_length,
|
||||
char *start, size_t length)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
i = requested_length;
|
||||
|
||||
while (i-- > 0) {
|
||||
start[length + i] = '0' + number % 10;
|
||||
number /= 10;
|
||||
}
|
||||
|
||||
return length + requested_length;
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_fill_digits64(uint64_t number, char *start, size_t length)
|
||||
{
|
||||
uint32_t part0, part1, part2, ten7;
|
||||
|
||||
ten7 = 10000000;
|
||||
|
||||
part2 = (uint32_t) (number % ten7);
|
||||
number /= ten7;
|
||||
|
||||
part1 = (uint32_t) (number % ten7);
|
||||
part0 = (uint32_t) (number / ten7);
|
||||
|
||||
if (part0 != 0) {
|
||||
length = njs_fill_digits32(part0, start, length);
|
||||
length = njs_fill_digits32_fixed_length(part1, 7, start, length);
|
||||
return njs_fill_digits32_fixed_length(part2, 7, start, length);
|
||||
}
|
||||
|
||||
if (part1 != 0) {
|
||||
length = njs_fill_digits32(part1, start, length);
|
||||
return njs_fill_digits32_fixed_length(part2, 7, start, length);
|
||||
}
|
||||
|
||||
return njs_fill_digits32(part2, start, length);
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_fill_digits64_fixed_length(uint64_t number, char *start, size_t length)
|
||||
{
|
||||
uint32_t part0, part1, part2, ten7;
|
||||
|
||||
ten7 = 10000000;
|
||||
|
||||
part2 = (uint32_t) (number % ten7);
|
||||
number /= ten7;
|
||||
|
||||
part1 = (uint32_t) (number % ten7);
|
||||
part0 = (uint32_t) (number / ten7);
|
||||
|
||||
length = njs_fill_digits32_fixed_length(part0, 3, start, length);
|
||||
length = njs_fill_digits32_fixed_length(part1, 7, start, length);
|
||||
|
||||
return njs_fill_digits32_fixed_length(part2, 7, start, length);
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_dtoa_round_up(char *start, size_t length, njs_int_t *point)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (length == 0) {
|
||||
start[0] = '1';
|
||||
*point = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
start[length - 1]++;
|
||||
|
||||
for (i = length - 1; i > 0; --i) {
|
||||
if (start[i] != '0' + 10) {
|
||||
return length;
|
||||
}
|
||||
|
||||
start[i] = '0';
|
||||
start[i - 1]++;
|
||||
}
|
||||
|
||||
if (start[0] == '0' + 10) {
|
||||
start[0] = '1';
|
||||
(*point)++;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
static size_t
|
||||
njs_fill_fractionals(uint64_t fractionals, int exponent, njs_uint_t frac,
|
||||
char *start, size_t length, njs_int_t *point)
|
||||
{
|
||||
njs_int_t n, digit;
|
||||
njs_uint_t i;
|
||||
njs_diyu128_t fractionals128;
|
||||
|
||||
/*
|
||||
* -128 <= exponent <= 0.
|
||||
* 0 <= fractionals * 2^exponent < 1.
|
||||
*/
|
||||
|
||||
if (-exponent <= 64) {
|
||||
/* fractionals <= 2^56. */
|
||||
|
||||
n = -exponent;
|
||||
|
||||
for (i = 0; i < frac && fractionals != 0; ++i) {
|
||||
/*
|
||||
* Multiplication by 10 is replaced with multiplication by 5 and
|
||||
* point location adjustment. To avoid integer-overflow.
|
||||
*/
|
||||
|
||||
fractionals *= 5;
|
||||
n--;
|
||||
|
||||
digit = (njs_int_t) (fractionals >> n);
|
||||
fractionals -= (uint64_t) digit << n;
|
||||
|
||||
start[length++] = '0' + digit;
|
||||
}
|
||||
|
||||
if (n > 0 && ((fractionals >> (n - 1)) & 1)) {
|
||||
length = njs_dtoa_round_up(start, length, point);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
fractionals128 = njs_diyu128(fractionals, 0);
|
||||
fractionals128 = njs_diyu128_shift(fractionals128, -exponent - 64);
|
||||
|
||||
n = 128;
|
||||
|
||||
for (i = 0; i < frac && !njs_diyu128_is_zero(fractionals128); ++i) {
|
||||
/*
|
||||
* Multiplication by 10 is replaced with multiplication by 5 and
|
||||
* point location adjustment. To avoid integer-overflow.
|
||||
*/
|
||||
|
||||
fractionals128 = njs_diyu128_mul(fractionals128, 5);
|
||||
n--;
|
||||
|
||||
digit = njs_diyu128_div_mod_pow2(&fractionals128, n);
|
||||
|
||||
start[length++] = '0' + digit;
|
||||
}
|
||||
|
||||
if (njs_diyu128_bit_at(fractionals128, n - 1)) {
|
||||
length = njs_dtoa_round_up(start, length, point);
|
||||
}
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
njs_inline size_t
|
||||
njs_trim_zeroes(char *start, size_t length, njs_int_t *point)
|
||||
{
|
||||
size_t i, n;
|
||||
|
||||
while (length > 0 && start[length - 1] == '0') {
|
||||
length--;
|
||||
}
|
||||
|
||||
n = 0;
|
||||
|
||||
while (n < length && start[n] == '0') {
|
||||
n++;
|
||||
}
|
||||
|
||||
if (n != 0) {
|
||||
for (i = n; i < length; ++i) {
|
||||
start[i - n] = start[i];
|
||||
}
|
||||
|
||||
length -= n;
|
||||
*point -= n;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
njs_fixed_dtoa(double value, njs_uint_t frac, char *start, njs_int_t *point)
|
||||
{
|
||||
size_t length;
|
||||
uint32_t quotient;
|
||||
uint64_t significand, divisor, dividend, remainder, integral, fract;
|
||||
njs_int_t exponent;
|
||||
njs_diyfp_t v;
|
||||
|
||||
length = 0;
|
||||
v = njs_d2diyfp(value);
|
||||
|
||||
significand = v.significand;
|
||||
exponent = v.exp;
|
||||
|
||||
/* exponent <= 19. */
|
||||
|
||||
if (exponent + NJS_SIGNIFICAND_SIZE > 64) {
|
||||
/* exponent > 11. */
|
||||
|
||||
divisor = njs_uint64(0xB1, 0xA2BC2EC5); /* 5 ^ 17 */
|
||||
|
||||
dividend = significand;
|
||||
|
||||
if (exponent > 17) {
|
||||
/* (e - 17) <= 3. */
|
||||
dividend <<= exponent - 17;
|
||||
|
||||
quotient = (uint32_t) (dividend / divisor);
|
||||
remainder = (dividend % divisor) << 17;
|
||||
|
||||
} else {
|
||||
divisor <<= 17 - exponent;
|
||||
|
||||
quotient = (uint32_t) (dividend / divisor);
|
||||
remainder = (dividend % divisor) << exponent;
|
||||
}
|
||||
|
||||
length = njs_fill_digits32(quotient, start, length);
|
||||
length = njs_fill_digits64_fixed_length(remainder, start, length);
|
||||
*point = (njs_int_t) length;
|
||||
|
||||
} else if (exponent >= 0) {
|
||||
/* 0 <= exponent <= 11. */
|
||||
|
||||
significand <<= exponent;
|
||||
length = njs_fill_digits64(significand, start, length);
|
||||
*point = (njs_int_t) length;
|
||||
|
||||
} else if (exponent > -NJS_SIGNIFICAND_SIZE) {
|
||||
/* -53 < exponent < 0. */
|
||||
|
||||
integral = significand >> -exponent;
|
||||
fract = significand - (integral << -exponent);
|
||||
|
||||
if (integral > UINT32_MAX) {
|
||||
length = njs_fill_digits64(integral, start, length);
|
||||
|
||||
} else {
|
||||
length = njs_fill_digits32((uint32_t) integral, start, length);
|
||||
}
|
||||
|
||||
*point = (njs_int_t) length;
|
||||
length = njs_fill_fractionals(fract, exponent, frac, start, length,
|
||||
point);
|
||||
|
||||
} else if (exponent < -128) {
|
||||
/* Valid for frac =< 20 only. TODO: bignum support. */
|
||||
|
||||
start[0] = '\0';
|
||||
|
||||
*point = -frac;
|
||||
|
||||
} else {
|
||||
/* -128 <= exponent <= -53. */
|
||||
|
||||
*point = 0;
|
||||
length = njs_fill_fractionals(significand, exponent, frac, start,
|
||||
length, point);
|
||||
}
|
||||
|
||||
length = njs_trim_zeroes(start, length, point);
|
||||
start[length] = '\0';
|
||||
|
||||
if (length == 0) {
|
||||
*point = -frac;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Dmitry Volyntsev
|
||||
* Copyright (C) Nginx, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NJS_DTOA_FIXED_H_INCLUDED_
|
||||
#define _NJS_DTOA_FIXED_H_INCLUDED_
|
||||
|
||||
NJS_EXPORT size_t njs_fixed_dtoa(double value, njs_uint_t frac, char *start,
|
||||
njs_int_t *point);
|
||||
|
||||
#endif /* _NJS_DTOA_FIXED_H_INCLUDED_ */
|
||||
|
|
@ -1,614 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) Alexander Borisov
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <njs_main.h>
|
||||
|
||||
|
||||
typedef enum {
|
||||
NJS_ENCODING_UTF8,
|
||||
} njs_encoding_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
njs_encoding_t encoding;
|
||||
njs_bool_t fatal;
|
||||
njs_bool_t ignore_bom;
|
||||
|
||||
njs_unicode_decode_t ctx;
|
||||
} njs_encoding_decode_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
njs_str_t name;
|
||||
njs_encoding_t encoding;
|
||||
} njs_encoding_label_t;
|
||||
|
||||
|
||||
static njs_encoding_label_t njs_encoding_labels[] =
|
||||
{
|
||||
{ njs_str("utf-8"), NJS_ENCODING_UTF8 },
|
||||
{ njs_str("utf8") , NJS_ENCODING_UTF8 },
|
||||
{ njs_null_str, 0 }
|
||||
};
|
||||
|
||||
|
||||
static njs_int_t njs_text_encoder_encode_utf8(njs_vm_t *vm,
|
||||
njs_string_prop_t *prop);
|
||||
static njs_int_t njs_text_decoder_arg_encoding(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_encoding_decode_t *data);
|
||||
static njs_int_t njs_text_decoder_arg_options(njs_vm_t *vm, njs_value_t *args,
|
||||
njs_uint_t nargs, njs_encoding_decode_t *data);
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_encoder_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
njs_object_value_t *encoder;
|
||||
|
||||
if (!vm->top_frame->ctor) {
|
||||
njs_type_error(vm, "Constructor of TextEncoder requires 'new'");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
encoder = njs_object_value_alloc(vm, NJS_OBJ_TYPE_TEXT_ENCODER, 0, NULL);
|
||||
if (njs_slow_path(encoder == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
njs_set_data(&encoder->value, NULL, NJS_DATA_TAG_TEXT_ENCODER);
|
||||
njs_set_object_value(&vm->retval, encoder);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_encoder_encode(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
u_char *dst;
|
||||
size_t size;
|
||||
njs_int_t ret;
|
||||
njs_value_t *this, *input, value;
|
||||
const u_char *start, *end;
|
||||
njs_string_prop_t prop;
|
||||
njs_typed_array_t *array;
|
||||
njs_unicode_decode_t ctx;
|
||||
|
||||
this = njs_argument(args, 0);
|
||||
|
||||
if (njs_slow_path(!njs_is_object_data(this, NJS_DATA_TAG_TEXT_ENCODER))) {
|
||||
njs_type_error(vm, "\"this\" is not a TextEncoder");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
start = NULL;
|
||||
end = NULL;
|
||||
|
||||
if (nargs > 1) {
|
||||
input = njs_argument(args, 1);
|
||||
|
||||
if (njs_slow_path(!njs_is_string(input))) {
|
||||
ret = njs_value_to_string(vm, input, input);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
(void) njs_string_prop(&prop, input);
|
||||
|
||||
if (prop.length != 0) {
|
||||
return njs_text_encoder_encode_utf8(vm, &prop);
|
||||
}
|
||||
|
||||
start = prop.start;
|
||||
end = start + prop.size;
|
||||
}
|
||||
|
||||
njs_utf8_decode_init(&ctx);
|
||||
|
||||
(void) njs_utf8_stream_length(&ctx, start, end - start, 1, 0, &size);
|
||||
|
||||
njs_set_number(&value, size);
|
||||
|
||||
array = njs_typed_array_alloc(vm, &value, 1, 0, NJS_OBJ_TYPE_UINT8_ARRAY);
|
||||
if (njs_slow_path(array == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
dst = njs_typed_array_buffer(array)->u.u8;
|
||||
njs_utf8_decode_init(&ctx);
|
||||
|
||||
(void) njs_utf8_stream_encode(&ctx, start, end, dst, 1, 0);
|
||||
|
||||
njs_set_typed_array(&vm->retval, array);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_encoder_encode_utf8(njs_vm_t *vm, njs_string_prop_t *prop)
|
||||
{
|
||||
njs_value_t value;
|
||||
njs_typed_array_t *array;
|
||||
|
||||
njs_set_number(&value, prop->size);
|
||||
|
||||
array = njs_typed_array_alloc(vm, &value, 1, 0, NJS_OBJ_TYPE_UINT8_ARRAY);
|
||||
if (njs_slow_path(array == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
memcpy(njs_typed_array_buffer(array)->u.u8, prop->start, prop->size);
|
||||
|
||||
njs_set_typed_array(&vm->retval, array);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_encoder_encode_into(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
u_char *to, *to_end;
|
||||
size_t size;
|
||||
uint32_t cp;
|
||||
njs_int_t ret;
|
||||
njs_str_t str;
|
||||
njs_value_t *this, *input, *dest, retval, read, written;
|
||||
const u_char *start, *end;
|
||||
njs_typed_array_t *array;
|
||||
njs_unicode_decode_t ctx;
|
||||
|
||||
static const njs_value_t read_str = njs_string("read");
|
||||
static const njs_value_t written_str = njs_string("written");
|
||||
|
||||
this = njs_argument(args, 0);
|
||||
input = njs_arg(args, nargs, 1);
|
||||
dest = njs_arg(args, nargs, 2);
|
||||
|
||||
if (njs_slow_path(!njs_is_object_data(this, NJS_DATA_TAG_TEXT_ENCODER))) {
|
||||
njs_type_error(vm, "\"this\" is not a TextEncoder");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
if (njs_slow_path(!njs_is_string(input))) {
|
||||
ret = njs_value_to_string(vm, &retval, input);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
input = &retval;
|
||||
}
|
||||
|
||||
if (njs_slow_path(!njs_is_typed_array_uint8(dest))) {
|
||||
njs_type_error(vm, "The \"destination\" argument must be an instance "
|
||||
"of Uint8Array");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
njs_string_get(input, &str);
|
||||
|
||||
start = str.start;
|
||||
end = start + str.length;
|
||||
|
||||
array = njs_typed_array(dest);
|
||||
to = njs_typed_array_start(array);
|
||||
to_end = to + array->byte_length;
|
||||
|
||||
cp = 0;
|
||||
njs_set_number(&read, 0);
|
||||
njs_set_number(&written, 0);
|
||||
|
||||
njs_utf8_decode_init(&ctx);
|
||||
|
||||
while (start < end) {
|
||||
cp = njs_utf8_decode(&ctx, &start, end);
|
||||
|
||||
if (cp > NJS_UNICODE_MAX_CODEPOINT) {
|
||||
cp = NJS_UNICODE_REPLACEMENT;
|
||||
}
|
||||
|
||||
size = njs_utf8_size(cp);
|
||||
|
||||
if (to + size > to_end) {
|
||||
break;
|
||||
}
|
||||
|
||||
njs_number(&read) += (cp > 0xFFFF) ? 2 : 1;
|
||||
njs_number(&written) += size;
|
||||
|
||||
to = njs_utf8_encode(to, cp);
|
||||
}
|
||||
|
||||
return njs_vm_object_alloc(vm, &vm->retval, &read_str, &read,
|
||||
&written_str, &written, NULL);
|
||||
}
|
||||
|
||||
|
||||
static const njs_object_prop_t njs_text_encoder_properties[] =
|
||||
{
|
||||
NJS_DECLARE_PROP_HANDLER("constructor",
|
||||
njs_object_prototype_create_constructor,
|
||||
0, 0, NJS_OBJECT_PROP_VALUE_CW),
|
||||
|
||||
NJS_DECLARE_PROP_VALUE("encoding", njs_string("utf-8"), 0),
|
||||
|
||||
NJS_DECLARE_PROP_NATIVE("encode", njs_text_encoder_encode, 0, 0),
|
||||
|
||||
NJS_DECLARE_PROP_NATIVE("encodeInto", njs_text_encoder_encode_into, 2, 0),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_text_encoder_init = {
|
||||
njs_text_encoder_properties,
|
||||
njs_nitems(njs_text_encoder_properties),
|
||||
};
|
||||
|
||||
|
||||
static const njs_object_prop_t njs_text_encoder_constructor_properties[] =
|
||||
{
|
||||
NJS_DECLARE_PROP_NAME("TextEncoder"),
|
||||
|
||||
NJS_DECLARE_PROP_LENGTH(0),
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_text_encoder_constructor_init = {
|
||||
njs_text_encoder_constructor_properties,
|
||||
njs_nitems(njs_text_encoder_constructor_properties),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_type_init_t njs_text_encoder_type_init = {
|
||||
.constructor = njs_native_ctor(njs_text_encoder_constructor, 0, 0),
|
||||
.prototype_props = &njs_text_encoder_init,
|
||||
.constructor_props = &njs_text_encoder_constructor_init,
|
||||
.prototype_value = { .object = { .type = NJS_OBJECT } },
|
||||
};
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_decoder_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
njs_int_t ret;
|
||||
njs_object_value_t *decoder;
|
||||
njs_encoding_decode_t *data;
|
||||
|
||||
if (!vm->top_frame->ctor) {
|
||||
njs_type_error(vm, "Constructor of TextDecoder requires 'new'");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
decoder = njs_object_value_alloc(vm, NJS_OBJ_TYPE_TEXT_DECODER,
|
||||
sizeof(njs_encoding_decode_t), NULL);
|
||||
if (njs_slow_path(decoder == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
data = (njs_encoding_decode_t *) ((uint8_t *) decoder
|
||||
+ sizeof(njs_object_value_t));
|
||||
|
||||
ret = njs_text_decoder_arg_encoding(vm, args, nargs, data);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = njs_text_decoder_arg_options(vm, args, nargs, data);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
njs_utf8_decode_init(&data->ctx);
|
||||
|
||||
njs_set_data(&decoder->value, data, NJS_DATA_TAG_TEXT_DECODER);
|
||||
njs_set_object_value(&vm->retval, decoder);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_decoder_arg_encoding(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_encoding_decode_t *data)
|
||||
{
|
||||
njs_str_t str;
|
||||
njs_int_t ret;
|
||||
njs_value_t *value;
|
||||
njs_encoding_label_t *label;
|
||||
|
||||
if (nargs < 2) {
|
||||
data->encoding = NJS_ENCODING_UTF8;
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
value = njs_argument(args, 1);
|
||||
|
||||
if (njs_slow_path(!njs_is_string(value))) {
|
||||
ret = njs_value_to_string(vm, value, value);
|
||||
if (njs_slow_path(ret != NJS_OK)) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
njs_string_get(value, &str);
|
||||
|
||||
for (label = &njs_encoding_labels[0]; label->name.length != 0; label++) {
|
||||
if (njs_strstr_eq(&str, &label->name)) {
|
||||
data->encoding = label->encoding;
|
||||
return NJS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
njs_range_error(vm, "The \"%V\" encoding is not supported", &str);
|
||||
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_decoder_arg_options(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_encoding_decode_t *data)
|
||||
{
|
||||
njs_int_t ret;
|
||||
njs_value_t retval, *value;
|
||||
|
||||
static const njs_value_t fatal_str = njs_string("fatal");
|
||||
static const njs_value_t ignore_bom_str = njs_string("ignoreBOM");
|
||||
|
||||
if (nargs < 3) {
|
||||
data->fatal = 0;
|
||||
data->ignore_bom = 0;
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
value = njs_argument(args, 2);
|
||||
|
||||
if (njs_slow_path(!njs_is_object(value))) {
|
||||
njs_type_error(vm, "The \"options\" argument must be of type object");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ret = njs_value_property(vm, value, njs_value_arg(&fatal_str), &retval);
|
||||
if (njs_slow_path(ret == NJS_ERROR)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
data->fatal = njs_bool(&retval);
|
||||
|
||||
ret = njs_value_property(vm, value, njs_value_arg(&ignore_bom_str),
|
||||
&retval);
|
||||
if (njs_slow_path(ret == NJS_ERROR)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
data->ignore_bom = njs_bool(&retval);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_decoder_encoding(njs_vm_t *vm, njs_object_prop_t *prop,
|
||||
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
|
||||
{
|
||||
njs_encoding_decode_t *data;
|
||||
|
||||
static const njs_value_t utf8_str = njs_string("utf-8");
|
||||
|
||||
if (njs_slow_path(!njs_is_object_data(value, NJS_DATA_TAG_TEXT_DECODER))) {
|
||||
njs_set_undefined(retval);
|
||||
return NJS_DECLINED;
|
||||
}
|
||||
|
||||
data = njs_object_data(value);
|
||||
|
||||
switch (data->encoding) {
|
||||
case NJS_ENCODING_UTF8:
|
||||
*retval = utf8_str;
|
||||
break;
|
||||
|
||||
default:
|
||||
njs_type_error(vm, "unknown encoding");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_decoder_fatal(njs_vm_t *vm, njs_object_prop_t *prop,
|
||||
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
|
||||
{
|
||||
njs_encoding_decode_t *data;
|
||||
|
||||
if (njs_slow_path(!njs_is_object_data(value, NJS_DATA_TAG_TEXT_DECODER))) {
|
||||
njs_set_undefined(retval);
|
||||
return NJS_DECLINED;
|
||||
}
|
||||
|
||||
data = njs_object_data(value);
|
||||
|
||||
njs_set_boolean(retval, data->fatal);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_decoder_ignore_bom(njs_vm_t *vm, njs_object_prop_t *prop,
|
||||
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
|
||||
{
|
||||
njs_encoding_decode_t *data;
|
||||
|
||||
if (njs_slow_path(!njs_is_object_data(value, NJS_DATA_TAG_TEXT_DECODER))) {
|
||||
njs_set_undefined(retval);
|
||||
return NJS_DECLINED;
|
||||
}
|
||||
|
||||
data = njs_object_data(value);
|
||||
|
||||
njs_set_boolean(retval, data->ignore_bom);
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static njs_int_t
|
||||
njs_text_decoder_decode(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
|
||||
njs_index_t unused)
|
||||
{
|
||||
u_char *dst;
|
||||
size_t size;
|
||||
ssize_t length;
|
||||
njs_int_t ret;
|
||||
njs_bool_t stream;
|
||||
njs_value_t retval, *this, *value, *options;
|
||||
const u_char *start, *end;
|
||||
njs_unicode_decode_t ctx;
|
||||
njs_encoding_decode_t *data;
|
||||
const njs_typed_array_t *array;
|
||||
const njs_array_buffer_t *buffer;
|
||||
|
||||
static const njs_value_t stream_str = njs_string("stream");
|
||||
|
||||
start = NULL;
|
||||
end = NULL;
|
||||
|
||||
stream = 0;
|
||||
|
||||
this = njs_argument(args, 0);
|
||||
|
||||
if (njs_slow_path(!njs_is_object_data(this, NJS_DATA_TAG_TEXT_DECODER))) {
|
||||
njs_type_error(vm, "\"this\" is not a TextDecoder");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
if (njs_fast_path(nargs > 1)) {
|
||||
value = njs_argument(args, 1);
|
||||
|
||||
if (njs_is_typed_array(value)) {
|
||||
array = njs_typed_array(value);
|
||||
|
||||
start = njs_typed_array_start(array);
|
||||
end = start + array->byte_length;
|
||||
|
||||
} else if (njs_is_array_buffer(value)) {
|
||||
buffer = njs_array_buffer(value);
|
||||
|
||||
start = buffer->u.u8;
|
||||
end = start + buffer->size;
|
||||
|
||||
} else {
|
||||
njs_type_error(vm, "The \"input\" argument must be an instance "
|
||||
"of TypedArray");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if (nargs > 2) {
|
||||
options = njs_argument(args, 2);
|
||||
|
||||
if (njs_slow_path(!njs_is_object(options))) {
|
||||
njs_type_error(vm, "The \"options\" argument must be "
|
||||
"of type object");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
ret = njs_value_property(vm, options, njs_value_arg(&stream_str),
|
||||
&retval);
|
||||
if (njs_slow_path(ret == NJS_ERROR)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
stream = njs_bool(&retval);
|
||||
}
|
||||
|
||||
data = njs_object_data(this);
|
||||
|
||||
ctx = data->ctx;
|
||||
|
||||
/* Looking for BOM. */
|
||||
|
||||
if (!data->ignore_bom) {
|
||||
start += njs_utf8_bom(start, end);
|
||||
}
|
||||
|
||||
length = njs_utf8_stream_length(&ctx, start, end - start, !stream,
|
||||
data->fatal, &size);
|
||||
if (length == -1) {
|
||||
njs_type_error(vm, "The encoded data was not valid");
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
dst = njs_string_alloc(vm, &vm->retval, size, length);
|
||||
if (njs_slow_path(dst == NULL)) {
|
||||
return NJS_ERROR;
|
||||
}
|
||||
|
||||
(void) njs_utf8_stream_encode(&data->ctx, start, end, dst, !stream, 0);
|
||||
|
||||
if (!stream) {
|
||||
njs_utf8_decode_init(&data->ctx);
|
||||
}
|
||||
|
||||
return NJS_OK;
|
||||
}
|
||||
|
||||
|
||||
static const njs_object_prop_t njs_text_decoder_properties[] =
|
||||
{
|
||||
NJS_DECLARE_PROP_HANDLER("constructor",
|
||||
njs_object_prototype_create_constructor,
|
||||
0, 0, NJS_OBJECT_PROP_VALUE_CW),
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("encoding", njs_text_decoder_encoding, 0, 0, 0),
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("fatal", njs_text_decoder_fatal, 0, 0, 0),
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("ignoreBOM", njs_text_decoder_ignore_bom, 0, 0, 0),
|
||||
|
||||
NJS_DECLARE_PROP_NATIVE("decode", njs_text_decoder_decode, 0, 0),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_text_decoder_init = {
|
||||
njs_text_decoder_properties,
|
||||
njs_nitems(njs_text_decoder_properties),
|
||||
};
|
||||
|
||||
|
||||
static const njs_object_prop_t njs_text_decoder_constructor_properties[] =
|
||||
{
|
||||
NJS_DECLARE_PROP_NAME("TextDecoder"),
|
||||
|
||||
NJS_DECLARE_PROP_LENGTH(0),
|
||||
|
||||
NJS_DECLARE_PROP_HANDLER("prototype", njs_object_prototype_create, 0, 0, 0),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_init_t njs_text_decoder_constructor_init = {
|
||||
njs_text_decoder_constructor_properties,
|
||||
njs_nitems(njs_text_decoder_constructor_properties),
|
||||
};
|
||||
|
||||
|
||||
const njs_object_type_init_t njs_text_decoder_type_init = {
|
||||
.constructor = njs_native_ctor(njs_text_decoder_constructor, 0, 0),
|
||||
.prototype_props = &njs_text_decoder_init,
|
||||
.constructor_props = &njs_text_decoder_constructor_init,
|
||||
.prototype_value = { .object = { .type = NJS_OBJECT } },
|
||||
};
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue