diff --git a/Makefile b/Makefile index 541b0169a..7769dfc07 100644 --- a/Makefile +++ b/Makefile @@ -136,6 +136,7 @@ include third_party/third_party.mk include libc/testlib/testlib.mk include tool/viz/lib/vizlib.mk include third_party/lua/lua.mk +include third_party/quickjs/quickjs.mk include examples/examples.mk include third_party/lz4cli/lz4cli.mk include tool/build/lib/buildlib.mk diff --git a/libc/runtime/dlfcn.h b/libc/runtime/dlfcn.h new file mode 100644 index 000000000..2f5753603 --- /dev/null +++ b/libc/runtime/dlfcn.h @@ -0,0 +1,23 @@ +#ifndef COSMOPOLITAN_LIBC_RUNTIME_DLFCN_H_ +#define COSMOPOLITAN_LIBC_RUNTIME_DLFCN_H_ + +#define RTLD_LOCAL 0 +#define RTLD_LAZY 1 +#define RTLD_NOW 2 +#define RTLD_GLOBAL 256 + +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +#define RTLD_NEXT ((void *)-1) +#define RTLD_DEFAULT ((void *)0) + +char *dlerror(void); +void *dlopen(const char *, int); +void *dlsym(void *, const char *); +int dlclose(void *); +int dl_iterate_phdr(int (*)(void *, size_t, void *), void *); + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_LIBC_RUNTIME_DLFCN_H_ */ diff --git a/libc/runtime/fegetround.c b/libc/runtime/fegetround.c new file mode 100644 index 000000000..7095671d2 --- /dev/null +++ b/libc/runtime/fegetround.c @@ -0,0 +1,32 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/runtime/fenv.h" + +/** + * Returns rounding mode. + * + * This implementation retrieves it from the x87 FPU control word. + * + * @see fesetround() for changing this + */ +int fegetround(void) { + uint16_t x87cw; + asm("fnstcw\t%0" : "=m"(x87cw)); + return x87cw & 0x0c00; +} diff --git a/libc/runtime/fenv.c b/libc/runtime/fenv.c new file mode 100644 index 000000000..89a2909af --- /dev/null +++ b/libc/runtime/fenv.c @@ -0,0 +1,41 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/runtime/fenv.h" + +/* TODO: implement these functions */ + +int feclearexcept(int mask) { + return 0; +} + +int fegetenv(fenv_t *envp) { + return 0; +} + +int feraiseexcept(int mask) { + return 0; +} + +int fetestexcept(int mask) { + return 0; +} + +int fesetenv(const fenv_t *envp) { + return 0; +} diff --git a/libc/runtime/fenv.h b/libc/runtime/fenv.h new file mode 100644 index 000000000..4dd9c8788 --- /dev/null +++ b/libc/runtime/fenv.h @@ -0,0 +1,39 @@ +#ifndef COSMOPOLITAN_LIBC_RUNTIME_FENV_H_ +#define COSMOPOLITAN_LIBC_RUNTIME_FENV_H_ + +#define FE_TONEAREST 0x0000 +#define FE_DOWNWARD 0x0400 +#define FE_UPWARD 0x0800 +#define FE_TOWARDZERO 0x0c00 + +#define FE_INVALID 1 +#define FE_DIVBYZERO 4 +#define FE_OVERFLOW 8 +#define FE_UNDERFLOW 16 +#define FE_INEXACT 32 +#define FE_ALL_EXCEPT 61 + +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +#define FLT_ROUNDS (__flt_rounds()) + +typedef void *fenv_t; +typedef uint16_t fexcept_t; + +int feclearexcept(int); +int fegetenv(fenv_t *); +int fegetexceptflag(fexcept_t *, int); +int fegetround(void); +int feholdexcept(fenv_t *); +int feraiseexcept(int); +int fesetenv(const fenv_t *); +int fesetexceptflag(const fexcept_t *, int); +int fesetround(int); +int fetestexcept(int); +int feupdateenv(const fenv_t *); +int __flt_rounds(void); + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_LIBC_RUNTIME_FENV_H_ */ diff --git a/libc/runtime/fesetround.c b/libc/runtime/fesetround.c new file mode 100644 index 000000000..f55465f35 --- /dev/null +++ b/libc/runtime/fesetround.c @@ -0,0 +1,51 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/runtime/fenv.h" + +/* TODO(jart): This needs tests. */ + +/** + * Sets rounding mode. + * + * This configures the x87 FPU as well as SSE. + * + * @param mode may be FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, or FE_TOWARDZERO + * @return 0 on success, or -1 on error + */ +int fesetround(int mode) { + uint16_t x87cw; + uint32_t ssecw; + switch (mode) { + case FE_TONEAREST: + case FE_DOWNWARD: + case FE_UPWARD: + case FE_TOWARDZERO: + asm("fnstcw\t%0" : "=m"(x87cw)); + x87cw &= ~0x0c00; + x87cw |= mode; + asm volatile("fldcw\t%0" : /* no outputs */ : "m"(x87cw)); + asm("stmxcsr\t%0" : "=m"(ssecw)); + ssecw &= ~(0x0c00 << 3); + ssecw |= (mode << 3); + asm volatile("ldmxcsr\t%0" : /* no outputs */ : "m"(ssecw)); + return 0; + default: + return -1; + } +} diff --git a/libc/runtime/fltrounds.c b/libc/runtime/fltrounds.c new file mode 100644 index 000000000..3b90c0f41 --- /dev/null +++ b/libc/runtime/fltrounds.c @@ -0,0 +1,34 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/runtime/fenv.h" + +int __flt_rounds(void) { + switch (fegetround()) { + case FE_TOWARDZERO: + return 0; + case FE_TONEAREST: + return 1; + case FE_UPWARD: + return 2; + case FE_DOWNWARD: + return 3; + default: + return -1; + } +} diff --git a/libc/runtime/ldso.c b/libc/runtime/ldso.c index 4034dfb34..fb3f35645 100644 --- a/libc/runtime/ldso.c +++ b/libc/runtime/ldso.c @@ -16,7 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/runtime/runtime.h" +#include "libc/runtime/dlfcn.h" char *dlerror(void) { return "cosmopolitan doesn't support dsos"; diff --git a/libc/sysv/consts.sh b/libc/sysv/consts.sh index acedc624a..80e50605e 100755 --- a/libc/sysv/consts.sh +++ b/libc/sysv/consts.sh @@ -1573,17 +1573,6 @@ syscon misc TCOFLUSH 1 2 2 2 2 0 # bsd consensus syscon misc TCOOFF 0 1 1 1 1 0 # bsd consensus syscon misc TCOON 1 2 2 2 2 0 # bsd consensus -syscon misc FE_TONEAREST 0 0 0 0 0 0 # consensus -syscon misc FE_DIVBYZERO 4 4 4 4 4 0 # unix consensus -syscon misc FE_DOWNWARD 0x0400 0x0400 0x0400 0x0400 0x0400 0 # unix consensus -syscon misc FE_INEXACT 0x20 0x20 0x20 0x20 0x20 0 # unix consensus -syscon misc FE_INVALID 1 1 1 1 1 0 # unix consensus -syscon misc FE_OVERFLOW 8 8 8 8 8 0 # unix consensus -syscon misc FE_TOWARDZERO 0x0c00 0x0c00 0x0c00 0x0c00 0x0c00 0 # unix consensus -syscon misc FE_UNDERFLOW 0x10 0x10 0x10 0x10 0x10 0 # unix consensus -syscon misc FE_UPWARD 0x0800 0x0800 0x0800 0x0800 0x0800 0 # unix consensus -syscon misc FE_ALL_EXCEPT 61 63 63 63 63 0 # bsd consensus - syscon misc TYPE_DISK 0 0 0 0 0 0 # consensus syscon misc TYPE_A 1 1 1 1 1 0 # unix consensus syscon misc TYPE_E 2 2 2 2 2 0 # unix consensus @@ -1637,18 +1626,6 @@ syscon misc PTHREAD_MUTEX_NORMAL 0 0 0 3 3 0 syscon misc PTHREAD_MUTEX_ROBUST 0 0 1 0 0 0 syscon misc PTHREAD_PROCESS_PRIVATE 0 2 0 0 0 0 -syscon misc FTW_F 0 0 0 0 0 0 # consensus -syscon misc FTW_D 1 1 1 1 1 0 # unix consensus -syscon misc FTW_DNR 2 2 2 2 2 0 # unix consensus -syscon misc FTW_MOUNT 2 2 2 2 2 0 # unix consensus -syscon misc FTW_PHYS 1 1 1 1 1 0 # unix consensus -syscon misc FTW_SLN 6 6 6 6 6 0 # unix consensus -syscon misc FTW_CHDIR 4 8 8 8 8 0 # bsd consensus -syscon misc FTW_DEPTH 8 4 4 4 4 0 # bsd consensus -syscon misc FTW_DP 5 3 3 3 3 0 # bsd consensus -syscon misc FTW_NS 3 4 4 4 4 0 # bsd consensus -syscon misc FTW_SL 4 5 5 5 5 0 # bsd consensus - syscon misc N_TTY 0 0 0 0 0 0 # consensus syscon misc N_6PACK 7 0 0 0 0 0 syscon misc N_AX25 5 0 0 0 0 0 @@ -2009,14 +1986,6 @@ syscon misc NL_TEXTMAX 0x7fffffff 0x0800 0x0800 255 255 0 syscon misc NL_NMAX 0x7fffffff 1 1 0 0 0 syscon misc NL_SETD 1 1 0 1 1 0 -syscon misc RTLD_LAZY 1 1 1 1 1 0 # unix consensus -syscon misc RTLD_NOW 2 2 2 2 2 0 # unix consensus -syscon misc RTLD_GLOBAL 0x0100 8 0x0100 0x0100 0x0100 0 -syscon misc RTLD_NODELETE 0x1000 0x80 0x1000 0 0 0 -syscon misc RTLD_NOLOAD 4 0x10 0x2000 0 0 0 -syscon misc RTLD_DI_LINKMAP 0 0 2 0 0 0 -syscon misc RTLD_LOCAL 0 4 0 0 0 0 - syscon rusage RUSAGE_SELF 0 0 0 0 0 0 # unix consensus & faked nt syscon rusage RUSAGE_CHILDREN -1 -1 -1 -1 -1 99 # unix consensus & unavailable on nt syscon rusage RUSAGE_THREAD 1 99 1 1 1 1 # faked nt & unavailable on xnu diff --git a/libc/sysv/consts/FE_ALL_EXCEPT.S b/libc/sysv/consts/FE_ALL_EXCEPT.S deleted file mode 100644 index f8e00c365..000000000 --- a/libc/sysv/consts/FE_ALL_EXCEPT.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FE_ALL_EXCEPT,61,63,63,63,63,0 diff --git a/libc/sysv/consts/FE_DIVBYZERO.S b/libc/sysv/consts/FE_DIVBYZERO.S deleted file mode 100644 index 5010d5484..000000000 --- a/libc/sysv/consts/FE_DIVBYZERO.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FE_DIVBYZERO,4,4,4,4,4,0 diff --git a/libc/sysv/consts/FE_DOWNWARD.S b/libc/sysv/consts/FE_DOWNWARD.S deleted file mode 100644 index ec5ed452c..000000000 --- a/libc/sysv/consts/FE_DOWNWARD.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FE_DOWNWARD,0x0400,0x0400,0x0400,0x0400,0x0400,0 diff --git a/libc/sysv/consts/FE_INEXACT.S b/libc/sysv/consts/FE_INEXACT.S deleted file mode 100644 index 9ff25b77d..000000000 --- a/libc/sysv/consts/FE_INEXACT.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FE_INEXACT,0x20,0x20,0x20,0x20,0x20,0 diff --git a/libc/sysv/consts/FE_INVALID.S b/libc/sysv/consts/FE_INVALID.S deleted file mode 100644 index b9a537f55..000000000 --- a/libc/sysv/consts/FE_INVALID.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FE_INVALID,1,1,1,1,1,0 diff --git a/libc/sysv/consts/FE_OVERFLOW.S b/libc/sysv/consts/FE_OVERFLOW.S deleted file mode 100644 index b6c59e672..000000000 --- a/libc/sysv/consts/FE_OVERFLOW.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FE_OVERFLOW,8,8,8,8,8,0 diff --git a/libc/sysv/consts/FE_TONEAREST.S b/libc/sysv/consts/FE_TONEAREST.S deleted file mode 100644 index 9cdb6a08e..000000000 --- a/libc/sysv/consts/FE_TONEAREST.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FE_TONEAREST,0,0,0,0,0,0 diff --git a/libc/sysv/consts/FE_TOWARDZERO.S b/libc/sysv/consts/FE_TOWARDZERO.S deleted file mode 100644 index 1d6957fb6..000000000 --- a/libc/sysv/consts/FE_TOWARDZERO.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FE_TOWARDZERO,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0 diff --git a/libc/sysv/consts/FE_UNDERFLOW.S b/libc/sysv/consts/FE_UNDERFLOW.S deleted file mode 100644 index b5b594020..000000000 --- a/libc/sysv/consts/FE_UNDERFLOW.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FE_UNDERFLOW,0x10,0x10,0x10,0x10,0x10,0 diff --git a/libc/sysv/consts/FE_UPWARD.S b/libc/sysv/consts/FE_UPWARD.S deleted file mode 100644 index c1f0ac0ec..000000000 --- a/libc/sysv/consts/FE_UPWARD.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FE_UPWARD,0x0800,0x0800,0x0800,0x0800,0x0800,0 diff --git a/libc/sysv/consts/FTW_CHDIR.S b/libc/sysv/consts/FTW_CHDIR.S deleted file mode 100644 index 6e0f412d0..000000000 --- a/libc/sysv/consts/FTW_CHDIR.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_CHDIR,4,8,8,8,8,0 diff --git a/libc/sysv/consts/FTW_D.S b/libc/sysv/consts/FTW_D.S deleted file mode 100644 index 6d1fa4cf9..000000000 --- a/libc/sysv/consts/FTW_D.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_D,1,1,1,1,1,0 diff --git a/libc/sysv/consts/FTW_DEPTH.S b/libc/sysv/consts/FTW_DEPTH.S deleted file mode 100644 index 423a1b6d7..000000000 --- a/libc/sysv/consts/FTW_DEPTH.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_DEPTH,8,4,4,4,4,0 diff --git a/libc/sysv/consts/FTW_DNR.S b/libc/sysv/consts/FTW_DNR.S deleted file mode 100644 index 9420c3a6c..000000000 --- a/libc/sysv/consts/FTW_DNR.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_DNR,2,2,2,2,2,0 diff --git a/libc/sysv/consts/FTW_DP.S b/libc/sysv/consts/FTW_DP.S deleted file mode 100644 index af0e2a5aa..000000000 --- a/libc/sysv/consts/FTW_DP.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_DP,5,3,3,3,3,0 diff --git a/libc/sysv/consts/FTW_F.S b/libc/sysv/consts/FTW_F.S deleted file mode 100644 index b9cc8d10d..000000000 --- a/libc/sysv/consts/FTW_F.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_F,0,0,0,0,0,0 diff --git a/libc/sysv/consts/FTW_MOUNT.S b/libc/sysv/consts/FTW_MOUNT.S deleted file mode 100644 index baf3bce7f..000000000 --- a/libc/sysv/consts/FTW_MOUNT.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_MOUNT,2,2,2,2,2,0 diff --git a/libc/sysv/consts/FTW_NS.S b/libc/sysv/consts/FTW_NS.S deleted file mode 100644 index b7ec16fce..000000000 --- a/libc/sysv/consts/FTW_NS.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_NS,3,4,4,4,4,0 diff --git a/libc/sysv/consts/FTW_PHYS.S b/libc/sysv/consts/FTW_PHYS.S deleted file mode 100644 index e8ed92944..000000000 --- a/libc/sysv/consts/FTW_PHYS.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_PHYS,1,1,1,1,1,0 diff --git a/libc/sysv/consts/FTW_SL.S b/libc/sysv/consts/FTW_SL.S deleted file mode 100644 index fb4ac0d0e..000000000 --- a/libc/sysv/consts/FTW_SL.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_SL,4,5,5,5,5,0 diff --git a/libc/sysv/consts/FTW_SLN.S b/libc/sysv/consts/FTW_SLN.S deleted file mode 100644 index afac65497..000000000 --- a/libc/sysv/consts/FTW_SLN.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,FTW_SLN,6,6,6,6,6,0 diff --git a/libc/sysv/consts/RTLD_DI_LINKMAP.S b/libc/sysv/consts/RTLD_DI_LINKMAP.S deleted file mode 100644 index 35d146794..000000000 --- a/libc/sysv/consts/RTLD_DI_LINKMAP.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,RTLD_DI_LINKMAP,0,0,2,0,0,0 diff --git a/libc/sysv/consts/RTLD_GLOBAL.S b/libc/sysv/consts/RTLD_GLOBAL.S deleted file mode 100644 index 625652d86..000000000 --- a/libc/sysv/consts/RTLD_GLOBAL.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,RTLD_GLOBAL,0x0100,8,0x0100,0x0100,0x0100,0 diff --git a/libc/sysv/consts/RTLD_LAZY.S b/libc/sysv/consts/RTLD_LAZY.S deleted file mode 100644 index 30e1aa8ee..000000000 --- a/libc/sysv/consts/RTLD_LAZY.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,RTLD_LAZY,1,1,1,1,1,0 diff --git a/libc/sysv/consts/RTLD_LOCAL.S b/libc/sysv/consts/RTLD_LOCAL.S deleted file mode 100644 index 1da9abd6d..000000000 --- a/libc/sysv/consts/RTLD_LOCAL.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,RTLD_LOCAL,0,4,0,0,0,0 diff --git a/libc/sysv/consts/RTLD_NODELETE.S b/libc/sysv/consts/RTLD_NODELETE.S deleted file mode 100644 index 1c7095570..000000000 --- a/libc/sysv/consts/RTLD_NODELETE.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,RTLD_NODELETE,0x1000,0x80,0x1000,0,0,0 diff --git a/libc/sysv/consts/RTLD_NOLOAD.S b/libc/sysv/consts/RTLD_NOLOAD.S deleted file mode 100644 index 9fc709f94..000000000 --- a/libc/sysv/consts/RTLD_NOLOAD.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,RTLD_NOLOAD,4,0x10,0x2000,0,0,0 diff --git a/libc/sysv/consts/RTLD_NOW.S b/libc/sysv/consts/RTLD_NOW.S deleted file mode 100644 index d45fb1fe0..000000000 --- a/libc/sysv/consts/RTLD_NOW.S +++ /dev/null @@ -1,2 +0,0 @@ -#include "libc/sysv/consts/syscon.internal.h" -.syscon misc,RTLD_NOW,2,2,2,2,2,0 diff --git a/libc/sysv/consts/fe.h b/libc/sysv/consts/fe.h deleted file mode 100644 index 28b979d2b..000000000 --- a/libc/sysv/consts/fe.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_SYSV_CONSTS_FE_H_ -#define COSMOPOLITAN_LIBC_SYSV_CONSTS_FE_H_ -#include "libc/runtime/symbolic.h" - -#define FE_ALL_EXCEPT SYMBOLIC(FE_ALL_EXCEPT) -#define FE_DIVBYZERO SYMBOLIC(FE_DIVBYZERO) -#define FE_DOWNWARD SYMBOLIC(FE_DOWNWARD) -#define FE_INEXACT SYMBOLIC(FE_INEXACT) -#define FE_INVALID SYMBOLIC(FE_INVALID) -#define FE_OVERFLOW SYMBOLIC(FE_OVERFLOW) -#define FE_TONEAREST SYMBOLIC(FE_TONEAREST) -#define FE_TOWARDZERO SYMBOLIC(FE_TOWARDZERO) -#define FE_UNDERFLOW SYMBOLIC(FE_UNDERFLOW) -#define FE_UPWARD SYMBOLIC(FE_UPWARD) - -#if !(__ASSEMBLER__ + __LINKER__ + 0) -COSMOPOLITAN_C_START_ - -extern const long FE_ALL_EXCEPT; -extern const long FE_DIVBYZERO; -extern const long FE_DOWNWARD; -extern const long FE_INEXACT; -extern const long FE_INVALID; -extern const long FE_OVERFLOW; -extern const long FE_TONEAREST; -extern const long FE_TOWARDZERO; -extern const long FE_UNDERFLOW; -extern const long FE_UPWARD; - -COSMOPOLITAN_C_END_ -#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ -#endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_FE_H_ */ diff --git a/libc/sysv/consts/ftw.h b/libc/sysv/consts/ftw.h deleted file mode 100644 index dc56db510..000000000 --- a/libc/sysv/consts/ftw.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_SYSV_CONSTS_FTW_H_ -#define COSMOPOLITAN_LIBC_SYSV_CONSTS_FTW_H_ -#include "libc/runtime/symbolic.h" - -#define FTW_CHDIR SYMBOLIC(FTW_CHDIR) -#define FTW_D SYMBOLIC(FTW_D) -#define FTW_DEPTH SYMBOLIC(FTW_DEPTH) -#define FTW_DNR SYMBOLIC(FTW_DNR) -#define FTW_DP SYMBOLIC(FTW_DP) -#define FTW_F SYMBOLIC(FTW_F) -#define FTW_MOUNT SYMBOLIC(FTW_MOUNT) -#define FTW_NS SYMBOLIC(FTW_NS) -#define FTW_PHYS SYMBOLIC(FTW_PHYS) -#define FTW_SL SYMBOLIC(FTW_SL) -#define FTW_SLN SYMBOLIC(FTW_SLN) - -#if !(__ASSEMBLER__ + __LINKER__ + 0) -COSMOPOLITAN_C_START_ - -extern const long FTW_CHDIR; -extern const long FTW_D; -extern const long FTW_DEPTH; -extern const long FTW_DNR; -extern const long FTW_DP; -extern const long FTW_F; -extern const long FTW_MOUNT; -extern const long FTW_NS; -extern const long FTW_PHYS; -extern const long FTW_SL; -extern const long FTW_SLN; - -COSMOPOLITAN_C_END_ -#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ -#endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_FTW_H_ */ diff --git a/libc/sysv/consts/rtld.h b/libc/sysv/consts/rtld.h deleted file mode 100644 index 589f121d2..000000000 --- a/libc/sysv/consts/rtld.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_SYSV_CONSTS_RTLD_H_ -#define COSMOPOLITAN_LIBC_SYSV_CONSTS_RTLD_H_ -#include "libc/runtime/symbolic.h" - -#define RTLD_DI_LINKMAP SYMBOLIC(RTLD_DI_LINKMAP) -#define RTLD_GLOBAL SYMBOLIC(RTLD_GLOBAL) -#define RTLD_LAZY SYMBOLIC(RTLD_LAZY) -#define RTLD_LOCAL SYMBOLIC(RTLD_LOCAL) -#define RTLD_NODELETE SYMBOLIC(RTLD_NODELETE) -#define RTLD_NOLOAD SYMBOLIC(RTLD_NOLOAD) -#define RTLD_NOW SYMBOLIC(RTLD_NOW) - -#if !(__ASSEMBLER__ + __LINKER__ + 0) -COSMOPOLITAN_C_START_ - -extern const long RTLD_DI_LINKMAP; -extern const long RTLD_GLOBAL; -extern const long RTLD_LAZY; -extern const long RTLD_LOCAL; -extern const long RTLD_NODELETE; -extern const long RTLD_NOLOAD; -extern const long RTLD_NOW; - -COSMOPOLITAN_C_END_ -#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ -#endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_RTLD_H_ */ diff --git a/third_party/gdtoa/gdtoa.internal.h b/third_party/gdtoa/gdtoa.internal.h index f26ba230a..0a74b0556 100644 --- a/third_party/gdtoa/gdtoa.internal.h +++ b/third_party/gdtoa/gdtoa.internal.h @@ -1,5 +1,6 @@ #include "libc/math.h" #include "libc/mem/mem.h" +#include "libc/runtime/fenv.h" #include "libc/str/str.h" #include "third_party/gdtoa/gdtoa.h" @@ -10,11 +11,12 @@ Kudos go to Guy L. Steele, Jr. and Jon L. White\\n\ Copyright (C) 1997, 1998, 2000 by Lucent Technologies\""); asm(".include \"libc/disclaimer.inc\""); -#define IEEE_Arith 1 -#define IEEE_8087 1 -#define f_QNAN 0x7fc00000 -#define d_QNAN0 0x7ff80000 -#define d_QNAN1 0x0 +#define IEEE_Arith 1 +#define IEEE_8087 1 +#define Honor_FLT_ROUNDS 1 +#define f_QNAN 0x7fc00000 +#define d_QNAN0 0x7ff80000 +#define d_QNAN1 0x0 /**************************************************************** diff --git a/third_party/gdtoa/gdtoa.mk b/third_party/gdtoa/gdtoa.mk index ef587ed15..d9e15e57b 100644 --- a/third_party/gdtoa/gdtoa.mk +++ b/third_party/gdtoa/gdtoa.mk @@ -28,6 +28,7 @@ THIRD_PARTY_GDTOA_A_DIRECTDEPS = \ LIBC_INTRIN \ LIBC_MEM \ LIBC_NEXGEN32E \ + LIBC_RUNTIME \ LIBC_STR \ LIBC_STUBS \ LIBC_SYSV \ diff --git a/third_party/musl/ftw.c b/third_party/musl/ftw.c new file mode 100644 index 000000000..ee4c54b22 --- /dev/null +++ b/third_party/musl/ftw.c @@ -0,0 +1,43 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ 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 "third_party/musl/ftw.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); + +/* clang-format off */ + +int ftw(const char *path, int (*fn)(const char *, const struct stat *, int), int fd_limit) +{ + /* The following cast assumes that calling a function with one + * argument more than it needs behaves as expected. This is + * actually undefined, but works on all real-world machines. */ + return nftw(path, (int (*)())fn, fd_limit, FTW_PHYS); +} diff --git a/third_party/musl/ftw.h b/third_party/musl/ftw.h new file mode 100644 index 000000000..0d8f92029 --- /dev/null +++ b/third_party/musl/ftw.h @@ -0,0 +1,32 @@ +#ifndef COSMOPOLITAN_THIRD_PARTY_MUSL_FTW_H_ +#define COSMOPOLITAN_THIRD_PARTY_MUSL_FTW_H_ +#include "libc/calls/struct/stat.h" +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +#define FTW_F 1 +#define FTW_D 2 +#define FTW_DNR 3 +#define FTW_NS 4 +#define FTW_SL 5 +#define FTW_DP 6 +#define FTW_SLN 7 + +#define FTW_PHYS 1 +#define FTW_MOUNT 2 +#define FTW_CHDIR 4 +#define FTW_DEPTH 8 + +struct FTW { + int base; + int level; +}; + +int ftw(const char *, int (*)(const char *, const struct stat *, int), int); +int nftw(const char *, + int (*)(const char *, const struct stat *, int, struct FTW *), int, + int); + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_MUSL_FTW_H_ */ diff --git a/third_party/musl/nftw.c b/third_party/musl/nftw.c new file mode 100644 index 000000000..15a491df8 --- /dev/null +++ b/third_party/musl/nftw.c @@ -0,0 +1,171 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:4;tab-width:4;coding:utf-8 -*-│ +│vi: set et ft=c ts=4 sw=4 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ 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 "libc/calls/calls.h" +#include "libc/calls/struct/dirent.h" +#include "libc/calls/weirdtypes.h" +#include "libc/errno.h" +#include "libc/str/str.h" +#include "libc/sysv/consts/o.h" +#include "third_party/musl/ftw.h" + +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); + +#define pthread_setcancelstate(...) /* no cosmo pthreads support atm */ + +/* clang-format off */ + +struct history +{ + struct history *chain; + dev_t dev; + ino_t ino; + int level; + int base; +}; + +static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags, struct history *h) +{ + size_t l = strlen(path), j = l && path[l-1]=='/' ? l-1 : l; + struct stat st; + struct history new; + int type; + int r; + int dfd=-1; + int err=0; + struct FTW lev; + + if ((flags & FTW_PHYS) ? lstat(path, &st) : stat(path, &st) < 0) { + if (!(flags & FTW_PHYS) && errno==ENOENT && !lstat(path, &st)) + type = FTW_SLN; + else if (errno != EACCES) return -1; + else type = FTW_NS; + } else if (S_ISDIR(st.st_mode)) { + if (flags & FTW_DEPTH) type = FTW_DP; + else type = FTW_D; + } else if (S_ISLNK(st.st_mode)) { + if (flags & FTW_PHYS) type = FTW_SL; + else type = FTW_SLN; + } else { + type = FTW_F; + } + + if ((flags & FTW_MOUNT) && h && st.st_dev != h->dev) + return 0; + + new.chain = h; + new.dev = st.st_dev; + new.ino = st.st_ino; + new.level = h ? h->level+1 : 0; + new.base = j+1; + + lev.level = new.level; + if (h) { + lev.base = h->base; + } else { + size_t k; + for (k=j; k && path[k]=='/'; k--); + for (; k && path[k-1]!='/'; k--); + lev.base = k; + } + + if (type == FTW_D || type == FTW_DP) { + dfd = open(path, O_RDONLY); + err = errno; + if (dfd < 0 && err == EACCES) type = FTW_DNR; + if (!fd_limit) close(dfd); + } + + if (!(flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev))) + return r; + + for (; h; h = h->chain) + if (h->dev == st.st_dev && h->ino == st.st_ino) + return 0; + + if ((type == FTW_D || type == FTW_DP) && fd_limit) { + if (dfd < 0) { + errno = err; + return -1; + } + DIR *d = fdopendir(dfd); + if (d) { + struct dirent *de; + while ((de = readdir(d))) { + if (de->d_name[0] == '.' + && (!de->d_name[1] + || (de->d_name[1]=='.' + && !de->d_name[2]))) continue; + if (strlen(de->d_name) >= PATH_MAX-l) { + errno = ENAMETOOLONG; + closedir(d); + return -1; + } + path[j]='/'; + strcpy(path+j+1, de->d_name); + if ((r=do_nftw(path, fn, fd_limit-1, flags, &new))) { + closedir(d); + return r; + } + } + closedir(d); + } else { + close(dfd); + return -1; + } + } + + path[l] = 0; + if ((flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev))) + return r; + + return 0; +} + +int nftw(const char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags) +{ + int r, cs; + size_t l; + char pathbuf[PATH_MAX+1]; + + if (fd_limit <= 0) return 0; + + l = strlen(path); + if (l > PATH_MAX) { + errno = ENAMETOOLONG; + return -1; + } + memcpy(pathbuf, path, l+1); + + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); + r = do_nftw(pathbuf, fn, fd_limit, flags, NULL); + pthread_setcancelstate(cs, 0); + return r; +} diff --git a/third_party/quickjs/Makefile b/third_party/quickjs/Makefile deleted file mode 100644 index 49b1f6fa7..000000000 --- a/third_party/quickjs/Makefile +++ /dev/null @@ -1,470 +0,0 @@ -# -# QuickJS Javascript Engine -# -# Copyright (c) 2017-2021 Fabrice Bellard -# Copyright (c) 2017-2021 Charlie Gordon -# -# 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. - -ifeq ($(shell uname -s),Darwin) -CONFIG_DARWIN=y -endif -# Windows cross compilation from Linux -#CONFIG_WIN32=y -# use link time optimization (smaller and faster executables but slower build) -CONFIG_LTO=y -# consider warnings as errors (for development) -#CONFIG_WERROR=y -# force 32 bit build for some utilities -#CONFIG_M32=y - -ifdef CONFIG_DARWIN -# use clang instead of gcc -CONFIG_CLANG=y -CONFIG_DEFAULT_AR=y -endif - -# installation directory -prefix=/usr/local - -# use the gprof profiler -#CONFIG_PROFILE=y -# use address sanitizer -#CONFIG_ASAN=y -# include the code for BigInt/BigFloat/BigDecimal and math mode -CONFIG_BIGNUM=y - -OBJDIR=.obj - -ifdef CONFIG_WIN32 - ifdef CONFIG_M32 - CROSS_PREFIX=i686-w64-mingw32- - else - CROSS_PREFIX=x86_64-w64-mingw32- - endif - EXE=.exe -else - CROSS_PREFIX= - EXE= -endif -ifdef CONFIG_CLANG - HOST_CC=clang - CC=$(CROSS_PREFIX)clang - CFLAGS=-g -Wall -MMD -MF $(OBJDIR)/$(@F).d - CFLAGS += -Wextra - CFLAGS += -Wno-sign-compare - CFLAGS += -Wno-missing-field-initializers - CFLAGS += -Wundef -Wuninitialized - CFLAGS += -Wunused -Wno-unused-parameter - CFLAGS += -Wwrite-strings - CFLAGS += -Wchar-subscripts -funsigned-char - CFLAGS += -MMD -MF $(OBJDIR)/$(@F).d - ifdef CONFIG_DEFAULT_AR - AR=$(CROSS_PREFIX)ar - else - ifdef CONFIG_LTO - AR=$(CROSS_PREFIX)llvm-ar - else - AR=$(CROSS_PREFIX)ar - endif - endif -else - HOST_CC=gcc - CC=$(CROSS_PREFIX)gcc - CFLAGS=-g -Wall -MMD -MF $(OBJDIR)/$(@F).d - CFLAGS += -Wno-array-bounds -Wno-format-truncation - ifdef CONFIG_LTO - AR=$(CROSS_PREFIX)gcc-ar - else - AR=$(CROSS_PREFIX)ar - endif -endif -STRIP=$(CROSS_PREFIX)strip -ifdef CONFIG_WERROR -CFLAGS+=-Werror -endif -DEFINES:=-D_GNU_SOURCE -DCONFIG_VERSION=\"$(shell cat VERSION)\" -ifdef CONFIG_BIGNUM -DEFINES+=-DCONFIG_BIGNUM -endif -ifdef CONFIG_WIN32 -DEFINES+=-D__USE_MINGW_ANSI_STDIO # for standard snprintf behavior -endif - -CFLAGS+=$(DEFINES) -CFLAGS_DEBUG=$(CFLAGS) -O0 -CFLAGS_SMALL=$(CFLAGS) -Os -CFLAGS_OPT=$(CFLAGS) -O2 -CFLAGS_NOLTO:=$(CFLAGS_OPT) -LDFLAGS=-g -ifdef CONFIG_LTO -CFLAGS_SMALL+=-flto -CFLAGS_OPT+=-flto -LDFLAGS+=-flto -endif -ifdef CONFIG_PROFILE -CFLAGS+=-p -LDFLAGS+=-p -endif -ifdef CONFIG_ASAN -CFLAGS+=-fsanitize=address -fno-omit-frame-pointer -LDFLAGS+=-fsanitize=address -fno-omit-frame-pointer -endif -ifdef CONFIG_WIN32 -LDEXPORT= -else -LDEXPORT=-rdynamic -endif - -PROGS=qjs$(EXE) qjsc$(EXE) run-test262 -ifneq ($(CROSS_PREFIX),) -QJSC_CC=gcc -QJSC=./host-qjsc -PROGS+=$(QJSC) -else -QJSC_CC=$(CC) -QJSC=./qjsc$(EXE) -endif -ifndef CONFIG_WIN32 -PROGS+=qjscalc -endif -ifdef CONFIG_M32 -PROGS+=qjs32 qjs32_s -endif -PROGS+=libquickjs.a -ifdef CONFIG_LTO -PROGS+=libquickjs.lto.a -endif - -# examples -ifeq ($(CROSS_PREFIX),) -ifdef CONFIG_ASAN -PROGS+= -else -PROGS+=examples/hello examples/hello_module examples/test_fib -ifndef CONFIG_DARWIN -PROGS+=examples/fib.so examples/point.so -endif -endif -endif - -all: $(OBJDIR) $(OBJDIR)/quickjs.check.o $(OBJDIR)/qjs.check.o $(PROGS) - -QJS_LIB_OBJS=$(OBJDIR)/quickjs.o $(OBJDIR)/libregexp.o $(OBJDIR)/libunicode.o $(OBJDIR)/cutils.o $(OBJDIR)/quickjs-libc.o - -QJS_OBJS=$(OBJDIR)/qjs.o $(OBJDIR)/repl.o $(QJS_LIB_OBJS) -ifdef CONFIG_BIGNUM -QJS_LIB_OBJS+=$(OBJDIR)/libbf.o -QJS_OBJS+=$(OBJDIR)/qjscalc.o -endif - -HOST_LIBS=-lm -ldl -lpthread -LIBS=-lm -ifndef CONFIG_WIN32 -LIBS+=-ldl -lpthread -endif -LIBS+=$(EXTRA_LIBS) - -$(OBJDIR): - mkdir -p $(OBJDIR) $(OBJDIR)/examples $(OBJDIR)/tests - -qjs$(EXE): $(QJS_OBJS) - $(CC) $(LDFLAGS) $(LDEXPORT) -o $@ $^ $(LIBS) - -qjs-debug$(EXE): $(patsubst %.o, %.debug.o, $(QJS_OBJS)) - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) - -qjsc$(EXE): $(OBJDIR)/qjsc.o $(QJS_LIB_OBJS) - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) - -ifneq ($(CROSS_PREFIX),) - -$(QJSC): $(OBJDIR)/qjsc.host.o \ - $(patsubst %.o, %.host.o, $(QJS_LIB_OBJS)) - $(HOST_CC) $(LDFLAGS) -o $@ $^ $(HOST_LIBS) - -endif #CROSS_PREFIX - -QJSC_DEFINES:=-DCONFIG_CC=\"$(QJSC_CC)\" -DCONFIG_PREFIX=\"$(prefix)\" -ifdef CONFIG_LTO -QJSC_DEFINES+=-DCONFIG_LTO -endif -QJSC_HOST_DEFINES:=-DCONFIG_CC=\"$(HOST_CC)\" -DCONFIG_PREFIX=\"$(prefix)\" - -$(OBJDIR)/qjsc.o: CFLAGS+=$(QJSC_DEFINES) -$(OBJDIR)/qjsc.host.o: CFLAGS+=$(QJSC_HOST_DEFINES) - -qjs32: $(patsubst %.o, %.m32.o, $(QJS_OBJS)) - $(CC) -m32 $(LDFLAGS) $(LDEXPORT) -o $@ $^ $(LIBS) - -qjs32_s: $(patsubst %.o, %.m32s.o, $(QJS_OBJS)) - $(CC) -m32 $(LDFLAGS) -o $@ $^ $(LIBS) - @size $@ - -qjscalc: qjs - ln -sf $< $@ - -ifdef CONFIG_LTO -LTOEXT=.lto -else -LTOEXT= -endif - -libquickjs$(LTOEXT).a: $(QJS_LIB_OBJS) - $(AR) rcs $@ $^ - -ifdef CONFIG_LTO -libquickjs.a: $(patsubst %.o, %.nolto.o, $(QJS_LIB_OBJS)) - $(AR) rcs $@ $^ -endif # CONFIG_LTO - -repl.c: $(QJSC) repl.js - $(QJSC) -c -o $@ -m repl.js - -qjscalc.c: $(QJSC) qjscalc.js - $(QJSC) -fbignum -c -o $@ qjscalc.js - -ifneq ($(wildcard unicode/UnicodeData.txt),) -$(OBJDIR)/libunicode.o $(OBJDIR)/libunicode.m32.o $(OBJDIR)/libunicode.m32s.o \ - $(OBJDIR)/libunicode.nolto.o: libunicode-table.h - -libunicode-table.h: unicode_gen - ./unicode_gen unicode $@ -endif - -run-test262: $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS) - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) - -run-test262-debug: $(patsubst %.o, %.debug.o, $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS)) - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) - -run-test262-32: $(patsubst %.o, %.m32.o, $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS)) - $(CC) -m32 $(LDFLAGS) -o $@ $^ $(LIBS) - -# object suffix order: nolto, [m32|m32s] - -$(OBJDIR)/%.o: %.c | $(OBJDIR) - $(CC) $(CFLAGS_OPT) -c -o $@ $< - -$(OBJDIR)/%.host.o: %.c | $(OBJDIR) - $(HOST_CC) $(CFLAGS_OPT) -c -o $@ $< - -$(OBJDIR)/%.pic.o: %.c | $(OBJDIR) - $(CC) $(CFLAGS_OPT) -fPIC -DJS_SHARED_LIBRARY -c -o $@ $< - -$(OBJDIR)/%.nolto.o: %.c | $(OBJDIR) - $(CC) $(CFLAGS_NOLTO) -c -o $@ $< - -$(OBJDIR)/%.m32.o: %.c | $(OBJDIR) - $(CC) -m32 $(CFLAGS_OPT) -c -o $@ $< - -$(OBJDIR)/%.m32s.o: %.c | $(OBJDIR) - $(CC) -m32 $(CFLAGS_SMALL) -c -o $@ $< - -$(OBJDIR)/%.debug.o: %.c | $(OBJDIR) - $(CC) $(CFLAGS_DEBUG) -c -o $@ $< - -$(OBJDIR)/%.check.o: %.c | $(OBJDIR) - $(CC) $(CFLAGS) -DCONFIG_CHECK_JSVALUE -c -o $@ $< - -regexp_test: libregexp.c libunicode.c cutils.c - $(CC) $(LDFLAGS) $(CFLAGS) -DTEST -o $@ libregexp.c libunicode.c cutils.c $(LIBS) - -unicode_gen: $(OBJDIR)/unicode_gen.host.o $(OBJDIR)/cutils.host.o libunicode.c unicode_gen_def.h - $(HOST_CC) $(LDFLAGS) $(CFLAGS) -o $@ $(OBJDIR)/unicode_gen.host.o $(OBJDIR)/cutils.host.o - -clean: - rm -f repl.c qjscalc.c out.c - rm -f *.a *.o *.d *~ unicode_gen regexp_test $(PROGS) - rm -f hello.c test_fib.c - rm -f examples/*.so tests/*.so - rm -rf $(OBJDIR)/ *.dSYM/ qjs-debug - rm -rf run-test262-debug run-test262-32 - -install: all - mkdir -p "$(DESTDIR)$(prefix)/bin" - $(STRIP) qjs qjsc - install -m755 qjs qjsc "$(DESTDIR)$(prefix)/bin" - ln -sf qjs "$(DESTDIR)$(prefix)/bin/qjscalc" - mkdir -p "$(DESTDIR)$(prefix)/lib/quickjs" - install -m644 libquickjs.a "$(DESTDIR)$(prefix)/lib/quickjs" -ifdef CONFIG_LTO - install -m644 libquickjs.lto.a "$(DESTDIR)$(prefix)/lib/quickjs" -endif - mkdir -p "$(DESTDIR)$(prefix)/include/quickjs" - install -m644 quickjs.h quickjs-libc.h "$(DESTDIR)$(prefix)/include/quickjs" - -############################################################################### -# examples - -# example of static JS compilation -HELLO_SRCS=examples/hello.js -HELLO_OPTS=-fno-string-normalize -fno-map -fno-promise -fno-typedarray \ - -fno-typedarray -fno-regexp -fno-json -fno-eval -fno-proxy \ - -fno-date -fno-module-loader -ifdef CONFIG_BIGNUM -HELLO_OPTS+=-fno-bigint -endif - -hello.c: $(QJSC) $(HELLO_SRCS) - $(QJSC) -e $(HELLO_OPTS) -o $@ $(HELLO_SRCS) - -ifdef CONFIG_M32 -examples/hello: $(OBJDIR)/hello.m32s.o $(patsubst %.o, %.m32s.o, $(QJS_LIB_OBJS)) - $(CC) -m32 $(LDFLAGS) -o $@ $^ $(LIBS) -else -examples/hello: $(OBJDIR)/hello.o $(QJS_LIB_OBJS) - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) -endif - -# example of static JS compilation with modules -HELLO_MODULE_SRCS=examples/hello_module.js -HELLO_MODULE_OPTS=-fno-string-normalize -fno-map -fno-promise -fno-typedarray \ - -fno-typedarray -fno-regexp -fno-json -fno-eval -fno-proxy \ - -fno-date -m -examples/hello_module: $(QJSC) libquickjs$(LTOEXT).a $(HELLO_MODULE_SRCS) - $(QJSC) $(HELLO_MODULE_OPTS) -o $@ $(HELLO_MODULE_SRCS) - -# use of an external C module (static compilation) - -test_fib.c: $(QJSC) examples/test_fib.js - $(QJSC) -e -M examples/fib.so,fib -m -o $@ examples/test_fib.js - -examples/test_fib: $(OBJDIR)/test_fib.o $(OBJDIR)/examples/fib.o libquickjs$(LTOEXT).a - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) - -examples/fib.so: $(OBJDIR)/examples/fib.pic.o - $(CC) $(LDFLAGS) -shared -o $@ $^ - -examples/point.so: $(OBJDIR)/examples/point.pic.o - $(CC) $(LDFLAGS) -shared -o $@ $^ - -############################################################################### -# documentation - -DOCS=doc/quickjs.pdf doc/quickjs.html doc/jsbignum.pdf doc/jsbignum.html - -build_doc: $(DOCS) - -clean_doc: - rm -f $(DOCS) - -doc/%.pdf: doc/%.texi - texi2pdf --clean -o $@ -q $< - -doc/%.html.pre: doc/%.texi - makeinfo --html --no-headers --no-split --number-sections -o $@ $< - -doc/%.html: doc/%.html.pre - sed -e 's||\n|' < $< > $@ - -############################################################################### -# tests - -ifndef CONFIG_DARWIN -test: tests/bjson.so examples/point.so -endif -ifdef CONFIG_M32 -test: qjs32 -endif - -test: qjs - ./qjs tests/test_closure.js - ./qjs tests/test_language.js - ./qjs tests/test_builtin.js - ./qjs tests/test_loop.js - ./qjs tests/test_std.js - ./qjs tests/test_worker.js -ifndef CONFIG_DARWIN -ifdef CONFIG_BIGNUM - ./qjs --bignum tests/test_bjson.js -else - ./qjs tests/test_bjson.js -endif - ./qjs examples/test_point.js -endif -ifdef CONFIG_BIGNUM - ./qjs --bignum tests/test_op_overloading.js - ./qjs --bignum tests/test_bignum.js - ./qjs --qjscalc tests/test_qjscalc.js -endif -ifdef CONFIG_M32 - ./qjs32 tests/test_closure.js - ./qjs32 tests/test_language.js - ./qjs32 tests/test_builtin.js - ./qjs32 tests/test_loop.js - ./qjs32 tests/test_std.js - ./qjs32 tests/test_worker.js -ifdef CONFIG_BIGNUM - ./qjs32 --bignum tests/test_op_overloading.js - ./qjs32 --bignum tests/test_bignum.js - ./qjs32 --qjscalc tests/test_qjscalc.js -endif -endif - -stats: qjs qjs32 - ./qjs -qd - ./qjs32 -qd - -microbench: qjs - ./qjs tests/microbench.js - -microbench-32: qjs32 - ./qjs32 tests/microbench.js - -# ES5 tests (obsolete) -test2o: run-test262 - time ./run-test262 -m -c test262o.conf - -test2o-32: run-test262-32 - time ./run-test262-32 -m -c test262o.conf - -test2o-update: run-test262 - ./run-test262 -u -c test262o.conf - -# Test262 tests -test2-default: run-test262 - time ./run-test262 -m -c test262.conf - -test2: run-test262 - time ./run-test262 -m -c test262.conf -a - -test2-32: run-test262-32 - time ./run-test262-32 -m -c test262.conf -a - -test2-update: run-test262 - ./run-test262 -u -c test262.conf -a - -test2-check: run-test262 - time ./run-test262 -m -c test262.conf -E -a - -testall: all test microbench test2o test2 - -testall-32: all test-32 microbench-32 test2o-32 test2-32 - -testall-complete: testall testall-32 - -bench-v8: qjs - make -C tests/bench-v8 - ./qjs -d tests/bench-v8/combined.js - -tests/bjson.so: $(OBJDIR)/tests/bjson.pic.o - $(CC) $(LDFLAGS) -shared -o $@ $^ $(LIBS) - --include $(wildcard $(OBJDIR)/*.d) diff --git a/third_party/quickjs/cutils.c b/third_party/quickjs/cutils.c index a02fb7688..89f517670 100644 --- a/third_party/quickjs/cutils.c +++ b/third_party/quickjs/cutils.c @@ -1,6 +1,6 @@ /* * C utilities - * + * * Copyright (c) 2017 Fabrice Bellard * Copyright (c) 2018 Charlie Gordon * @@ -22,12 +22,18 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include -#include +#include "libc/fmt/fmt.h" +#include "libc/mem/mem.h" +#include "libc/str/str.h" +#include "third_party/quickjs/cutils.h" -#include "cutils.h" +asm(".ident\t\"\\n\\n\ +QuickJS (MIT License)\\n\ +Copyright (c) 2017-2021 Fabrice Bellard\\n\ +Copyright (c) 2017-2021 Charlie Gordon\""); +asm(".include \"libc/disclaimer.inc\""); + +/* clang-format off */ void pstrcpy(char *buf, int buf_size, const char *str) { diff --git a/third_party/quickjs/cutils.h b/third_party/quickjs/cutils.h index 31f7cd84a..a50ae3d22 100644 --- a/third_party/quickjs/cutils.h +++ b/third_party/quickjs/cutils.h @@ -1,41 +1,17 @@ -/* - * C utilities - * - * Copyright (c) 2017 Fabrice Bellard - * Copyright (c) 2018 Charlie Gordon - * - * 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. - */ -#ifndef CUTILS_H -#define CUTILS_H - -#include -#include +#ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_CUTILS_H_ +#define COSMOPOLITAN_THIRD_PARTY_QUICKJS_CUTILS_H_ +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ +/* clang-format off */ /* set if CPU is big endian */ #undef WORDS_BIGENDIAN #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) -#define force_inline inline __attribute__((always_inline)) -#define no_inline __attribute__((noinline)) -#define __maybe_unused __attribute__((unused)) +#define force_inline forceinline +#define no_inline noinline +#define __maybe_unused __attribute__((__unused__)) #define xglue(x, y) x ## y #define glue(x, y) xglue(x, y) @@ -112,25 +88,25 @@ static inline int64_t min_int64(int64_t a, int64_t b) } /* WARNING: undefined if a = 0 */ -static inline int clz32(unsigned int a) +forceinline int clz32(unsigned int a) { return __builtin_clz(a); } /* WARNING: undefined if a = 0 */ -static inline int clz64(uint64_t a) +forceinline int clz64(uint64_t a) { return __builtin_clzll(a); } /* WARNING: undefined if a = 0 */ -static inline int ctz32(unsigned int a) +forceinline int ctz32(unsigned int a) { return __builtin_ctz(a); } /* WARNING: undefined if a = 0 */ -static inline int ctz64(uint64_t a) +forceinline int ctz64(uint64_t a) { return __builtin_ctzll(a); } @@ -207,18 +183,18 @@ static inline void put_u8(uint8_t *tab, uint8_t val) *tab = val; } -static inline uint16_t bswap16(uint16_t x) +forceinline uint16_t bswap16(uint16_t x) { return (x >> 8) | (x << 8); } -static inline uint32_t bswap32(uint32_t v) +forceinline uint32_t bswap32(uint32_t v) { return ((v & 0xff000000) >> 24) | ((v & 0x00ff0000) >> 8) | ((v & 0x0000ff00) << 8) | ((v & 0x000000ff) << 24); } -static inline uint64_t bswap64(uint64_t v) +forceinline uint64_t bswap64(uint64_t v) { return ((v & ((uint64_t)0xff << (7 * 8))) >> (7 * 8)) | ((v & ((uint64_t)0xff << (6 * 8))) >> (5 * 8)) | @@ -294,4 +270,7 @@ void rqsort(void *base, size_t nmemb, size_t size, int (*cmp)(const void *, const void *, void *), void *arg); -#endif /* CUTILS_H */ +/* clang-format on */ +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_CUTILS_H_ */ diff --git a/third_party/quickjs/libbf.c b/third_party/quickjs/libbf.c index fe1628e79..d2e2f84de 100644 --- a/third_party/quickjs/libbf.c +++ b/third_party/quickjs/libbf.c @@ -1,6 +1,6 @@ /* * Tiny arbitrary precision floating point library - * + * * Copyright (c) 2017-2021 Fabrice Bellard * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -21,19 +21,25 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include -#include -#include -#include +#include "libc/assert.h" +#include "libc/inttypes.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "third_party/quickjs/cutils.h" +#include "third_party/quickjs/libbf.h" +asm(".ident\t\"\\n\\n\ +QuickJS (MIT License)\\n\ +Copyright (c) 2017-2021 Fabrice Bellard\\n\ +Copyright (c) 2017-2021 Charlie Gordon\""); +asm(".include \"libc/disclaimer.inc\""); + +/* TODO(jart): let's use asm() instead of intel's strange and unusual veneer */ #ifdef __AVX2__ -#include +#undef __AVX2__ #endif -#include "cutils.h" -#include "libbf.h" +/* clang-format off */ /* enable it to check the multiplication result */ //#define USE_MUL_CHECK diff --git a/third_party/quickjs/libbf.h b/third_party/quickjs/libbf.h index 48e9d956a..ae9159eed 100644 --- a/third_party/quickjs/libbf.h +++ b/third_party/quickjs/libbf.h @@ -1,31 +1,10 @@ -/* - * Tiny arbitrary precision floating point library - * - * Copyright (c) 2017-2021 Fabrice Bellard - * - * 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. - */ -#ifndef LIBBF_H -#define LIBBF_H - -#include -#include +#ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBBF_H_ +#define COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBBF_H_ +#include "libc/limits.h" +#include "libc/literal.h" +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ +/* clang-format off */ #if INTPTR_MAX >= INT64_MAX #define LIMB_LOG2_BITS 6 @@ -532,4 +511,7 @@ static inline int bfdec_resize(bfdec_t *r, limb_t len) } int bfdec_normalize_and_round(bfdec_t *r, limb_t prec1, bf_flags_t flags); -#endif /* LIBBF_H */ +/* clang-format on */ +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBBF_H_ */ diff --git a/third_party/quickjs/libregexp-opcode.h b/third_party/quickjs/libregexp-opcode.inc similarity index 98% rename from third_party/quickjs/libregexp-opcode.h rename to third_party/quickjs/libregexp-opcode.inc index f90c23b34..dab647839 100644 --- a/third_party/quickjs/libregexp-opcode.h +++ b/third_party/quickjs/libregexp-opcode.inc @@ -1,6 +1,6 @@ /* * Regular Expression Engine - * + * * Copyright (c) 2017-2018 Fabrice Bellard * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -22,6 +22,8 @@ * THE SOFTWARE. */ +/* clang-format off */ + #ifdef DEF DEF(invalid, 1) /* never used */ diff --git a/third_party/quickjs/libregexp.c b/third_party/quickjs/libregexp.c index 379bfc7a9..49314c3d3 100644 --- a/third_party/quickjs/libregexp.c +++ b/third_party/quickjs/libregexp.c @@ -1,6 +1,6 @@ /* * Regular Expression Engine - * + * * Copyright (c) 2017-2018 Fabrice Bellard * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -21,15 +21,22 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include -#include -#include -#include +#include "libc/assert.h" +#include "libc/fmt/fmt.h" +#include "libc/limits.h" +#include "libc/mem/alloca.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "third_party/quickjs/cutils.h" +#include "third_party/quickjs/libregexp.h" -#include "cutils.h" -#include "libregexp.h" +asm(".ident\t\"\\n\\n\ +QuickJS (MIT License)\\n\ +Copyright (c) 2017-2021 Fabrice Bellard\\n\ +Copyright (c) 2017-2021 Charlie Gordon\""); +asm(".include \"libc/disclaimer.inc\""); + +/* clang-format off */ /* TODO: @@ -49,7 +56,7 @@ typedef enum { #define DEF(id, size) REOP_ ## id, -#include "libregexp-opcode.h" +#include "third_party/quickjs/libregexp-opcode.inc" #undef DEF REOP_COUNT, } REOPCodeEnum; @@ -96,7 +103,7 @@ static const REOpCode reopcode_info[REOP_COUNT] = { #else #define DEF(id, size) { size }, #endif -#include "libregexp-opcode.h" +#include "third_party/quickjs/libregexp-opcode.inc" #undef DEF }; diff --git a/third_party/quickjs/libregexp.h b/third_party/quickjs/libregexp.h index 9aedb7e93..1d04a8d49 100644 --- a/third_party/quickjs/libregexp.h +++ b/third_party/quickjs/libregexp.h @@ -1,32 +1,9 @@ -/* - * Regular Expression Engine - * - * Copyright (c) 2017-2018 Fabrice Bellard - * - * 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. - */ -#ifndef LIBREGEXP_H -#define LIBREGEXP_H - -#include - -#include "libunicode.h" +#ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBREGEXP_H_ +#define COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBREGEXP_H_ +#include "third_party/quickjs/libunicode.h" +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ +/* clang-format off */ #define LRE_BOOL int /* for documentation purposes */ @@ -89,4 +66,7 @@ static inline int lre_js_is_ident_next(int c) #undef LRE_BOOL -#endif /* LIBREGEXP_H */ +/* clang-format on */ +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBREGEXP_H_ */ diff --git a/third_party/quickjs/libunicode-table.h b/third_party/quickjs/libunicode-table.inc similarity index 99% rename from third_party/quickjs/libunicode-table.h rename to third_party/quickjs/libunicode-table.inc index 0ef211356..b4543ad7f 100644 --- a/third_party/quickjs/libunicode-table.h +++ b/third_party/quickjs/libunicode-table.inc @@ -1,8 +1,7 @@ +/* clang-format off */ /* Compressed unicode tables */ /* Automatically generated file - do not edit */ -#include - static const uint32_t case_conv_table1[361] = { 0x00209a30, 0x00309a00, 0x005a8173, 0x00601730, 0x006c0730, 0x006f81b3, 0x00701700, 0x007c0700, diff --git a/third_party/quickjs/libunicode.c b/third_party/quickjs/libunicode.c index 63c12a077..3abcaca8e 100644 --- a/third_party/quickjs/libunicode.c +++ b/third_party/quickjs/libunicode.c @@ -1,6 +1,6 @@ /* * Unicode utilities - * + * * Copyright (c) 2017-2018 Fabrice Bellard * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -21,15 +21,22 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include -#include -#include +#include "libc/assert.h" +#include "libc/limits.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "third_party/quickjs/cutils.h" +#include "third_party/quickjs/libunicode.h" -#include "cutils.h" -#include "libunicode.h" -#include "libunicode-table.h" +asm(".ident\t\"\\n\\n\ +QuickJS (MIT License)\\n\ +Copyright (c) 2017-2021 Fabrice Bellard\\n\ +Copyright (c) 2017-2021 Charlie Gordon\""); +asm(".include \"libc/disclaimer.inc\""); + +/* clang-format off */ + +#include "third_party/quickjs/libunicode-table.inc" enum { RUN_TYPE_U, diff --git a/third_party/quickjs/libunicode.h b/third_party/quickjs/libunicode.h index cfa600a50..312b68dc7 100644 --- a/third_party/quickjs/libunicode.h +++ b/third_party/quickjs/libunicode.h @@ -1,30 +1,9 @@ -/* - * Unicode utilities - * - * Copyright (c) 2017-2018 Fabrice Bellard - * - * 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. - */ -#ifndef LIBUNICODE_H -#define LIBUNICODE_H - -#include +#ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBUNICODE_H_ +#define COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBUNICODE_H_ +#include "third_party/quickjs/libunicode.h" +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ +/* clang-format off */ #define LRE_BOOL int /* for documentation purposes */ @@ -121,4 +100,7 @@ int unicode_prop(CharRange *cr, const char *prop_name); #undef LRE_BOOL -#endif /* LIBUNICODE_H */ +/* clang-format on */ +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBUNICODE_H_ */ diff --git a/third_party/quickjs/list.h b/third_party/quickjs/list.h index 0a1bc5a49..76d72be6c 100644 --- a/third_party/quickjs/list.h +++ b/third_party/quickjs/list.h @@ -1,32 +1,8 @@ -/* - * Linux klist like system - * - * Copyright (c) 2016-2017 Fabrice Bellard - * - * 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. - */ -#ifndef LIST_H -#define LIST_H - -#ifndef NULL -#include -#endif +#ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIST_H_ +#define COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIST_H_ +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ +/* clang-format off */ struct list_head { struct list_head *prev; @@ -97,4 +73,7 @@ static inline int list_empty(struct list_head *el) for(el = (head)->prev, el1 = el->prev; el != (head); \ el = el1, el1 = el->prev) -#endif /* LIST_H */ +/* clang-format on */ +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIST_H_ */ diff --git a/third_party/quickjs/qjs.c b/third_party/quickjs/qjs.c index d56b84336..39f541f81 100644 --- a/third_party/quickjs/qjs.c +++ b/third_party/quickjs/qjs.c @@ -1,6 +1,6 @@ /* * QuickJS stand alone interpreter - * + * * Copyright (c) 2017-2021 Fabrice Bellard * Copyright (c) 2017-2021 Charlie Gordon * @@ -22,24 +22,25 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(__APPLE__) -#include -#elif defined(__linux__) -#include -#endif +#include "libc/assert.h" +#include "libc/calls/weirdtypes.h" +#include "libc/log/log.h" +#include "libc/mem/mem.h" +#include "libc/runtime/runtime.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "libc/time/time.h" +#include "third_party/gdtoa/gdtoa.h" +#include "third_party/quickjs/cutils.h" +#include "third_party/quickjs/quickjs-libc.h" -#include "cutils.h" -#include "quickjs-libc.h" +asm(".ident\t\"\\n\\n\ +QuickJS (MIT License)\\n\ +Copyright (c) 2017-2021 Fabrice Bellard\\n\ +Copyright (c) 2017-2021 Charlie Gordon\""); +asm(".include \"libc/disclaimer.inc\""); + +/* clang-format off */ extern const uint8_t qjsc_repl[]; extern const uint32_t qjsc_repl_size; @@ -454,8 +455,10 @@ int main(int argc, char **argv) } } +#ifdef CONFIG_BIGNUM if (load_jscalc) bignum_ext = 1; +#endif if (trace_memory) { js_trace_malloc_init(&trace_data); @@ -539,7 +542,7 @@ int main(int argc, char **argv) if (empty_run && dump_memory) { clock_t t[5]; - double best[5]; + double best[5] = {0}; int i, j; for (i = 0; i < 100; i++) { t[0] = clock(); diff --git a/third_party/quickjs/qjsc.c b/third_party/quickjs/qjsc.c index b9f1e4cd5..588ba3312 100644 --- a/third_party/quickjs/qjsc.c +++ b/third_party/quickjs/qjsc.c @@ -1,6 +1,6 @@ /* * QuickJS command line compiler - * + * * Copyright (c) 2018-2021 Fabrice Bellard * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -21,20 +21,26 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#if !defined(_WIN32) -#include -#endif +#include "libc/assert.h" +#include "libc/calls/calls.h" +#include "libc/fmt/fmt.h" +#include "libc/log/log.h" +#include "libc/mem/mem.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "libc/x/x.h" +#include "third_party/gdtoa/gdtoa.h" +#include "third_party/getopt/getopt.h" +#include "third_party/quickjs/cutils.h" +#include "third_party/quickjs/quickjs-libc.h" -#include "cutils.h" -#include "quickjs-libc.h" +asm(".ident\t\"\\n\\n\ +QuickJS (MIT License)\\n\ +Copyright (c) 2017-2021 Fabrice Bellard\\n\ +Copyright (c) 2017-2021 Charlie Gordon\""); +asm(".include \"libc/disclaimer.inc\""); + +/* clang-format off */ typedef struct { char *name; @@ -208,7 +214,7 @@ static int js_module_dummy_init(JSContext *ctx, JSModuleDef *m) static void find_unique_cname(char *cname, size_t cname_size) { - char cname1[1024]; + char *cname1; int suffix_num; size_t len, max_len; assert(cname_size >= 32); @@ -219,13 +225,16 @@ static void find_unique_cname(char *cname, size_t cname_size) if (len > max_len) cname[max_len] = '\0'; suffix_num = 1; + cname1 = NULL; for(;;) { - snprintf(cname1, sizeof(cname1), "%s_%d", cname, suffix_num); + free(cname1); + cname1 = xasprintf("%s_%d", cname, suffix_num); if (!namelist_find(&cname_list, cname1)) break; suffix_num++; } pstrcpy(cname, cname_size, cname1); + free(cname1); } JSModuleDef *jsc_module_loader(JSContext *ctx, diff --git a/third_party/quickjs/quickjs-atom.h b/third_party/quickjs/quickjs-atom.inc similarity index 100% rename from third_party/quickjs/quickjs-atom.h rename to third_party/quickjs/quickjs-atom.inc diff --git a/third_party/quickjs/quickjs-libc.c b/third_party/quickjs/quickjs-libc.c index e180dd0cd..32dcc53f8 100644 --- a/third_party/quickjs/quickjs-libc.c +++ b/third_party/quickjs/quickjs-libc.c @@ -1,6 +1,6 @@ /* * QuickJS C library - * + * * Copyright (c) 2017-2021 Fabrice Bellard * Copyright (c) 2017-2021 Charlie Gordon * @@ -22,54 +22,36 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(_WIN32) -#include -#include -#include -#else -#include -#include -#include -#include +#include "libc/assert.h" +#include "libc/calls/calls.h" +#include "libc/calls/ioctl.h" +#include "libc/calls/struct/winsize.h" +#include "libc/calls/termios.h" +#include "libc/errno.h" +#include "libc/fmt/conv.h" +#include "libc/fmt/fmt.h" +#include "libc/limits.h" +#include "libc/runtime/dlfcn.h" +#include "libc/runtime/sysconf.h" +#include "libc/sock/select.h" +#include "libc/stdio/temp.h" +#include "libc/str/str.h" +#include "libc/sysv/consts/clock.h" +#include "libc/sysv/consts/o.h" +#include "libc/sysv/consts/termios.h" +#include "libc/sysv/consts/w.h" +#include "libc/time/time.h" +#include "third_party/quickjs/cutils.h" +#include "third_party/quickjs/list.h" +#include "third_party/quickjs/quickjs-libc.h" -#if defined(__APPLE__) -typedef sig_t sighandler_t; -#if !defined(environ) -#include -#define environ (*_NSGetEnviron()) -#endif -#endif /* __APPLE__ */ +asm(".ident\t\"\\n\\n\ +QuickJS (MIT License)\\n\ +Copyright (c) 2017-2021 Fabrice Bellard\\n\ +Copyright (c) 2017-2021 Charlie Gordon\""); +asm(".include \"libc/disclaimer.inc\""); -#endif - -#if !defined(_WIN32) -/* enable the os.Worker API. IT relies on POSIX threads */ -#define USE_WORKER -#endif - -#ifdef USE_WORKER -#include -#include -#endif - -#include "cutils.h" -#include "list.h" -#include "quickjs-libc.h" +/* clang-format off */ /* TODO: - add socket calls @@ -1463,7 +1445,9 @@ static JSClassDef js_std_file_class = { .finalizer = js_std_file_finalizer, }; -static const JSCFunctionListEntry js_std_error_props[] = { +static JSCFunctionListEntry js_std_error_props[11]; +static textstartup void js_std_error_props_init() { + JSCFunctionListEntry props[] = { /* various errno values */ #define DEF(x) JS_PROP_INT32_DEF(#x, x, JS_PROP_CONFIGURABLE ) DEF(EINVAL), @@ -1478,7 +1462,11 @@ static const JSCFunctionListEntry js_std_error_props[] = { DEF(EPIPE), DEF(EBADF), #undef DEF -}; + }; + _Static_assert(sizeof(js_std_error_props) == sizeof(props)); + memcpy(js_std_error_props, props, sizeof(props)); +} +const void *const js_std_error_props_ctor[] initarray = {js_std_error_props_init}; static const JSCFunctionListEntry js_std_funcs[] = { JS_CFUNC_DEF("exit", 1, js_std_exit ), @@ -2816,15 +2804,14 @@ static int my_execvpe(const char *filename, char **argv, char **envp) execve(buf, argv, envp); - switch(errno) { - case EACCES: - eacces_error = TRUE; - break; - case ENOENT: - case ENOTDIR: - break; - default: - return -1; + if (errno == EACCES) { + eacces_error = TRUE; + } else if (errno == ENOENT) { + /* do nothing */ + } else if (errno == ENOTDIR) { + /* do nothing */ + } else { + return -1; } } if (eacces_error) @@ -2958,7 +2945,7 @@ static JSValue js_os_exec(JSContext *ctx, JSValueConst this_val, } if (pid == 0) { /* child */ - int fd_max = sysconf(_SC_OPEN_MAX); + int fd_max = 128 /* sysconf(_SC_OPEN_MAX) */; /* remap the stdin/stdout/stderr handles if necessary */ for(i = 0; i < 3; i++) { @@ -3577,7 +3564,9 @@ void js_std_set_worker_new_context_func(JSContext *(*func)(JSRuntime *rt)) #define OS_FLAG(x) JS_PROP_INT32_DEF(#x, x, JS_PROP_CONFIGURABLE ) -static const JSCFunctionListEntry js_os_funcs[] = { +static JSCFunctionListEntry js_os_funcs[68]; +static textstartup void js_os_funcs_init() { + JSCFunctionListEntry funcs[] = { JS_CFUNC_DEF("open", 2, js_os_open ), OS_FLAG(O_RDONLY), OS_FLAG(O_WRONLY), @@ -3657,7 +3646,11 @@ static const JSCFunctionListEntry js_os_funcs[] = { JS_CFUNC_DEF("dup", 1, js_os_dup ), JS_CFUNC_DEF("dup2", 2, js_os_dup2 ), #endif -}; + }; + _Static_assert(sizeof(js_os_funcs) == sizeof(funcs)); + memcpy(js_os_funcs, funcs, sizeof(funcs)); +} +const void *const js_os_funcs_ctor[] initarray = {js_os_funcs_init}; static int js_os_init(JSContext *ctx, JSModuleDef *m) { diff --git a/third_party/quickjs/quickjs-libc.h b/third_party/quickjs/quickjs-libc.h index fbbe5b016..b03445273 100644 --- a/third_party/quickjs/quickjs-libc.h +++ b/third_party/quickjs/quickjs-libc.h @@ -1,37 +1,9 @@ -/* - * QuickJS C library - * - * Copyright (c) 2017-2018 Fabrice Bellard - * - * 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. - */ -#ifndef QUICKJS_LIBC_H -#define QUICKJS_LIBC_H - -#include -#include - -#include "quickjs.h" - -#ifdef __cplusplus -extern "C" { -#endif +#ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBC_H_ +#define COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBC_H_ +#include "third_party/quickjs/quickjs.h" +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ +/* clang-format off */ JSModuleDef *js_init_module_std(JSContext *ctx, const char *module_name); JSModuleDef *js_init_module_os(JSContext *ctx, const char *module_name); @@ -51,9 +23,8 @@ void js_std_promise_rejection_tracker(JSContext *ctx, JSValueConst promise, JSValueConst reason, JS_BOOL is_handled, void *opaque); void js_std_set_worker_new_context_func(JSContext *(*func)(JSRuntime *rt)); - -#ifdef __cplusplus -} /* extern "C" { */ -#endif -#endif /* QUICKJS_LIBC_H */ +/* clang-format on */ +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBC_H_ */ diff --git a/third_party/quickjs/quickjs-opcode.h b/third_party/quickjs/quickjs-opcode.inc similarity index 99% rename from third_party/quickjs/quickjs-opcode.h rename to third_party/quickjs/quickjs-opcode.inc index c731a14a9..5e13da11a 100644 --- a/third_party/quickjs/quickjs-opcode.h +++ b/third_party/quickjs/quickjs-opcode.inc @@ -1,6 +1,6 @@ /* * QuickJS opcode definitions - * + * * Copyright (c) 2017-2018 Fabrice Bellard * Copyright (c) 2017-2018 Charlie Gordon * @@ -23,6 +23,8 @@ * THE SOFTWARE. */ +/* clang-format off */ + #ifdef FMT FMT(none) FMT(none_int) diff --git a/third_party/quickjs/quickjs.c b/third_party/quickjs/quickjs.c index 48aeffc62..bcec9cc48 100644 --- a/third_party/quickjs/quickjs.c +++ b/third_party/quickjs/quickjs.c @@ -1,6 +1,6 @@ /* * QuickJS Javascript Engine - * + * * Copyright (c) 2017-2021 Fabrice Bellard * Copyright (c) 2017-2021 Charlie Gordon * @@ -22,31 +22,32 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(__APPLE__) -#include -#elif defined(__linux__) -#include -#elif defined(__FreeBSD__) -#include -#endif +#include "third_party/quickjs/cutils.h" +#include "third_party/quickjs/libregexp.h" +#include "third_party/quickjs/list.h" +#include "third_party/quickjs/quickjs.h" +#include "libc/assert.h" +#include "libc/fmt/fmt.h" +#include "libc/fmt/fmt.h" +#include "libc/inttypes.h" +#include "libc/mem/alloca.h" +#include "third_party/gdtoa/gdtoa.h" +#include "libc/fmt/conv.h" +#include "libc/runtime/fenv.h" +#include "libc/time/time.h" +#include "libc/time/time.h" +#include "libc/calls/weirdtypes.h" +#include "libc/time/struct/tm.h" +#include "libc/log/log.h" +#include "third_party/quickjs/libbf.h" -#include "cutils.h" -#include "list.h" -#include "quickjs.h" -#include "libregexp.h" -#ifdef CONFIG_BIGNUM -#include "libbf.h" -#endif +asm(".ident\t\"\\n\\n\ +QuickJS (MIT License)\\n\ +Copyright (c) 2017-2021 Fabrice Bellard\\n\ +Copyright (c) 2017-2021 Charlie Gordon\""); +asm(".include \"libc/disclaimer.inc\""); + +/* clang-format off */ #define OPTIMIZE 1 #define SHORT_OPCODES 1 @@ -69,7 +70,7 @@ /* define to include Atomics.* operations which depend on the OS threads */ -#if !defined(EMSCRIPTEN) +#if !defined(EMSCRIPTEN) && defined(USE_WORKER) #define CONFIG_ATOMICS #endif @@ -109,12 +110,6 @@ /* test the GC by forcing it before each object allocation */ //#define FORCE_GC_AT_MALLOC -#ifdef CONFIG_ATOMICS -#include -#include -#include -#endif - enum { /* classid tag */ /* union usage | properties */ JS_CLASS_OBJECT = 1, /* must be first */ @@ -952,7 +947,7 @@ struct JSObject { enum { __JS_ATOM_NULL = JS_ATOM_NULL, #define DEF(name, str) JS_ATOM_ ## name, -#include "quickjs-atom.h" +#include "third_party/quickjs/quickjs-atom.inc" #undef DEF JS_ATOM_END, }; @@ -961,14 +956,14 @@ enum { static const char js_atom_init[] = #define DEF(name, str) str "\0" -#include "quickjs-atom.h" +#include "third_party/quickjs/quickjs-atom.inc" #undef DEF ; typedef enum OPCodeFormat { #define FMT(f) OP_FMT_ ## f, #define DEF(id, size, n_pop, n_push, f) -#include "quickjs-opcode.h" +#include "third_party/quickjs/quickjs-opcode.inc" #undef DEF #undef FMT } OPCodeFormat; @@ -977,7 +972,7 @@ enum OPCodeEnum { #define FMT(f) #define DEF(id, size, n_pop, n_push, f) OP_ ## id, #define def(id, size, n_pop, n_push, f) -#include "quickjs-opcode.h" +#include "third_party/quickjs/quickjs-opcode.inc" #undef def #undef DEF #undef FMT @@ -988,7 +983,7 @@ enum OPCodeEnum { #define FMT(f) #define DEF(id, size, n_pop, n_push, f) #define def(id, size, n_pop, n_push, f) OP_ ## id, -#include "quickjs-opcode.h" +#include "third_party/quickjs/quickjs-opcode.inc" #undef def #undef DEF #undef FMT @@ -1021,7 +1016,6 @@ static __exception int JS_ToArrayLengthFree(JSContext *ctx, uint32_t *plen, JSValue val, BOOL is_array_ctor); static JSValue JS_EvalObject(JSContext *ctx, JSValueConst this_obj, JSValueConst val, int flags, int scope_idx); -JSValue __attribute__((format(printf, 2, 3))) JS_ThrowInternalError(JSContext *ctx, const char *fmt, ...); static __maybe_unused void JS_DumpAtoms(JSRuntime *rt); static __maybe_unused void JS_DumpString(JSRuntime *rt, const JSString *p); @@ -1148,7 +1142,6 @@ static JSValue JS_ToBigDecimalFree(JSContext *ctx, JSValue val, BOOL allow_null_or_undefined); static bfdec_t *JS_ToBigDecimal(JSContext *ctx, JSValueConst val); #endif -JSValue JS_ThrowOutOfMemory(JSContext *ctx); static JSValue JS_ThrowTypeErrorRevokedProxy(JSContext *ctx); static JSValue js_proxy_getPrototypeOf(JSContext *ctx, JSValueConst obj); static int js_proxy_setPrototypeOf(JSContext *ctx, JSValueConst obj, @@ -5181,8 +5174,8 @@ static void free_property(JSRuntime *rt, JSProperty *pr, int prop_flags) } } -static force_inline JSShapeProperty *find_own_property1(JSObject *p, - JSAtom atom) +force_inline JSShapeProperty *find_own_property1(JSObject *p, + JSAtom atom) { JSShape *sh; JSShapeProperty *pr, *prop; @@ -5201,9 +5194,9 @@ static force_inline JSShapeProperty *find_own_property1(JSObject *p, return NULL; } -static force_inline JSShapeProperty *find_own_property(JSProperty **ppr, - JSObject *p, - JSAtom atom) +force_inline JSShapeProperty *find_own_property(JSProperty **ppr, + JSObject *p, + JSAtom atom) { JSShape *sh; JSShapeProperty *pr, *prop; @@ -11303,11 +11296,11 @@ static char *i64toa(char *buf_end, int64_t n, unsigned int base) static void js_ecvt1(double d, int n_digits, int *decpt, int *sign, char *buf, int rounding_mode, char *buf1, int buf1_size) { - if (rounding_mode != FE_TONEAREST) - fesetround(rounding_mode); + /* if (rounding_mode != FE_TONEAREST) */ + /* fesetround(rounding_mode); */ snprintf(buf1, buf1_size, "%+.*e", n_digits - 1, d); - if (rounding_mode != FE_TONEAREST) - fesetround(FE_TONEAREST); + /* if (rounding_mode != FE_TONEAREST) */ + /* fesetround(FE_TONEAREST); */ *sign = (buf1[0] == '-'); /* mantissa */ buf[0] = buf1[1]; @@ -16223,7 +16216,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj, #else #define def(id, size, n_pop, n_push, f) && case_default, #endif -#include "quickjs-opcode.h" +#include "third_party/quickjs/quickjs-opcode.inc" [ OP_COUNT ... 255 ] = &&case_default }; #define SWITCH(pc) goto *dispatch_table[opcode = *pc++]; @@ -20121,7 +20114,7 @@ static const JSOpCode opcode_info[OP_COUNT + (OP_TEMP_END - OP_TEMP_START)] = { #else #define DEF(id, size, n_pop, n_push, f) { size, n_pop, n_push, OP_FMT_ ## f }, #endif -#include "quickjs-opcode.h" +#include "third_party/quickjs/quickjs-opcode.inc" #undef DEF #undef FMT }; @@ -53615,12 +53608,12 @@ static JSValue js_atomics_op(JSContext *ctx, a = func_name((_Atomic(uint32_t) *)ptr, v); \ break; #endif - OP(ADD, atomic_fetch_add) - OP(AND, atomic_fetch_and) - OP(OR, atomic_fetch_or) - OP(SUB, atomic_fetch_sub) - OP(XOR, atomic_fetch_xor) - OP(EXCHANGE, atomic_exchange) + /* OP(ADD, atomic_fetch_add) */ + /* OP(AND, atomic_fetch_and) */ + /* OP(OR, atomic_fetch_or) */ + /* OP(SUB, atomic_fetch_sub) */ + /* OP(XOR, atomic_fetch_xor) */ + /* OP(EXCHANGE, atomic_exchange) */ #undef OP case ATOMICS_OP_LOAD | (0 << 3): diff --git a/third_party/quickjs/quickjs.h b/third_party/quickjs/quickjs.h index d4a5cd311..e9104054d 100644 --- a/third_party/quickjs/quickjs.h +++ b/third_party/quickjs/quickjs.h @@ -1,42 +1,16 @@ -/* - * QuickJS Javascript Engine - * - * Copyright (c) 2017-2021 Fabrice Bellard - * Copyright (c) 2017-2021 Charlie Gordon - * - * 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. - */ -#ifndef QUICKJS_H -#define QUICKJS_H +#ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_QUICKJS_H_ +#define COSMOPOLITAN_THIRD_PARTY_QUICKJS_QUICKJS_H_ +#include "libc/math.h" +#include "libc/stdio/stdio.h" +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ +/* clang-format off */ -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__STRICT_ANSI__) #define js_likely(x) __builtin_expect(!!(x), 1) #define js_unlikely(x) __builtin_expect(!!(x), 0) -#define js_force_inline inline __attribute__((always_inline)) -#define __js_printf_like(f, a) __attribute__((format(printf, f, a))) +#define js_force_inline forceinline +#define __js_printf_like(f, a) __attribute__((__format__(__printf__, f, a))) #else #define js_likely(x) (x) #define js_unlikely(x) (x) @@ -502,22 +476,22 @@ int JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id); /* value handling */ -static js_force_inline JSValue JS_NewBool(JSContext *ctx, JS_BOOL val) +js_force_inline JSValue JS_NewBool(JSContext *ctx, JS_BOOL val) { return JS_MKVAL(JS_TAG_BOOL, (val != 0)); } -static js_force_inline JSValue JS_NewInt32(JSContext *ctx, int32_t val) +js_force_inline JSValue JS_NewInt32(JSContext *ctx, int32_t val) { return JS_MKVAL(JS_TAG_INT, val); } -static js_force_inline JSValue JS_NewCatchOffset(JSContext *ctx, int32_t val) +js_force_inline JSValue JS_NewCatchOffset(JSContext *ctx, int32_t val) { return JS_MKVAL(JS_TAG_CATCH_OFFSET, val); } -static js_force_inline JSValue JS_NewInt64(JSContext *ctx, int64_t val) +js_force_inline JSValue JS_NewInt64(JSContext *ctx, int64_t val) { JSValue v; if (val == (int32_t)val) { @@ -528,7 +502,7 @@ static js_force_inline JSValue JS_NewInt64(JSContext *ctx, int64_t val) return v; } -static js_force_inline JSValue JS_NewUint32(JSContext *ctx, uint32_t val) +js_force_inline JSValue JS_NewUint32(JSContext *ctx, uint32_t val) { JSValue v; if (val <= 0x7fffffff) { @@ -542,7 +516,7 @@ static js_force_inline JSValue JS_NewUint32(JSContext *ctx, uint32_t val) JSValue JS_NewBigInt64(JSContext *ctx, int64_t v); JSValue JS_NewBigUint64(JSContext *ctx, uint64_t v); -static js_force_inline JSValue JS_NewFloat64(JSContext *ctx, double d) +js_force_inline JSValue JS_NewFloat64(JSContext *ctx, double d) { JSValue v; int32_t val; @@ -723,7 +697,7 @@ int JS_IsArray(JSContext *ctx, JSValueConst val); JSValue JS_GetPropertyInternal(JSContext *ctx, JSValueConst obj, JSAtom prop, JSValueConst receiver, JS_BOOL throw_ref_error); -static js_force_inline JSValue JS_GetProperty(JSContext *ctx, JSValueConst this_obj, +js_force_inline JSValue JS_GetProperty(JSContext *ctx, JSValueConst this_obj, JSAtom prop) { return JS_GetPropertyInternal(ctx, this_obj, prop, this_obj, 0); @@ -1042,8 +1016,7 @@ int JS_SetModuleExportList(JSContext *ctx, JSModuleDef *m, #undef js_unlikely #undef js_force_inline -#ifdef __cplusplus -} /* extern "C" { */ -#endif - -#endif /* QUICKJS_H */ +/* clang-format on */ +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_QUICKJS_H_ */ diff --git a/third_party/quickjs/quickjs.mk b/third_party/quickjs/quickjs.mk new file mode 100644 index 000000000..494e1d93f --- /dev/null +++ b/third_party/quickjs/quickjs.mk @@ -0,0 +1,85 @@ +#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐ +#───vi: set et ft=make ts=8 tw=8 fenc=utf-8 :vi───────────────────────┘ + +PKGS += THIRD_PARTY_QUICKJS + +THIRD_PARTY_QUICKJS_FILES := $(wildcard third_party/quickjs/*) +THIRD_PARTY_QUICKJS_SRCS = $(filter %.c,$(THIRD_PARTY_QUICKJS_FILES)) +THIRD_PARTY_QUICKJS_HDRS = $(filter %.h,$(THIRD_PARTY_QUICKJS_FILES)) +THIRD_PARTY_QUICKJS_BINS = $(THIRD_PARTY_QUICKJS_COMS) $(THIRD_PARTY_QUICKJS_COMS:%=%.dbg) +THIRD_PARTY_QUICKJS = $(THIRD_PARTY_QUICKJS_DEPS) $(THIRD_PARTY_QUICKJS_A) +THIRD_PARTY_QUICKJS_A = o/$(MODE)/third_party/quickjs/quickjs.a + +THIRD_PARTY_QUICKJS_OBJS = \ + $(THIRD_PARTY_QUICKJS_SRCS:%.c=o/$(MODE)/%.o) + +THIRD_PARTY_QUICKJS_COMS = \ + o/$(MODE)/third_party/quickjs/qjs.com + +THIRD_PARTY_QUICKJS_CHECKS = \ + $(THIRD_PARTY_QUICKJS_A).pkg \ + $(THIRD_PARTY_QUICKJS_HDRS:%=o/$(MODE)/%.ok) + +THIRD_PARTY_QUICKJS_DIRECTDEPS = \ + LIBC_ALG \ + LIBC_CALLS \ + LIBC_FMT \ + LIBC_INTRIN \ + LIBC_LOG \ + LIBC_MEM \ + LIBC_NEXGEN32E \ + LIBC_RUNTIME \ + LIBC_SOCK \ + LIBC_STDIO \ + LIBC_STR \ + LIBC_SYSV \ + LIBC_SYSV_CALLS \ + LIBC_TIME \ + LIBC_TINYMATH \ + LIBC_UNICODE \ + LIBC_X \ + THIRD_PARTY_COMPILER_RT \ + THIRD_PARTY_GDTOA \ + THIRD_PARTY_GETOPT \ + THIRD_PARTY_MUSL + +THIRD_PARTY_QUICKJS_DEPS := \ + $(call uniq,$(foreach x,$(THIRD_PARTY_QUICKJS_DIRECTDEPS),$($(x)))) + +$(THIRD_PARTY_QUICKJS_A): \ + third_party/quickjs/ \ + $(THIRD_PARTY_QUICKJS_A).pkg \ + $(filter-out %/quickjs.c,$(THIRD_PARTY_QUICKJS_OBJS)) + +$(THIRD_PARTY_QUICKJS_A).pkg: \ + $(THIRD_PARTY_QUICKJS_OBJS) \ + $(foreach x,$(THIRD_PARTY_QUICKJS_DIRECTDEPS),$($(x)_A).pkg) + +o/$(MODE)/third_party/quickjs/qjs.com.dbg: \ + $(THIRD_PARTY_QUICKJS_DEPS) \ + $(THIRD_PARTY_QUICKJS_A) \ + $(THIRD_PARTY_QUICKJS_A).pkg \ + o/$(MODE)/third_party/quickjs/qjs.o \ + $(CRT) \ + $(APE) + -@$(APELINK) + +$(THIRD_PARTY_QUICKJS_OBJS): \ + OVERRIDE_CPPFLAGS += \ + -DCONFIG_BIGNUM \ + -DCONFIG_VERSION=\"$(shell cat third_party/quickjs/VERSION)\" + +o/$(MODE)/third_party/quickjs/unicode_gen.o: \ + OVERRIDE_CPPFLAGS += \ + -DSTACK_FRAME_UNLIMITED + +# TODO(jart): Replace alloca() calls with malloc(). +o/$(MODE)/third_party/quickjs/libregexp.o \ +o/$(MODE)/third_party/quickjs/quickjs.o: \ + OVERRIDE_CPPFLAGS += \ + -DSTACK_FRAME_UNLIMITED + +.PHONY: o/$(MODE)/third_party/quickjs +o/$(MODE)/third_party/quickjs: \ + $(THIRD_PARTY_QUICKJS_BINS) \ + $(THIRD_PARTY_QUICKJS_CHECKS) diff --git a/third_party/quickjs/release.sh b/third_party/quickjs/release.sh deleted file mode 100755 index 26fba1b03..000000000 --- a/third_party/quickjs/release.sh +++ /dev/null @@ -1,158 +0,0 @@ -#!/bin/sh -# Release the QuickJS source code - -set -e - -version=`cat VERSION` - -if [ "$1" = "-h" ] ; then - echo "release.sh [release_list]" - echo "" - echo "release_list: extras binary win_binary quickjs" - - exit 1 -fi - -release_list="extras binary win_binary quickjs" - -if [ "$1" != "" ] ; then - release_list="$1" -fi - -#################################################" -# extras - -if echo $release_list | grep -w -q extras ; then - -d="quickjs-${version}" -name="quickjs-extras-${version}" -outdir="/tmp/${d}" - -rm -rf $outdir -mkdir -p $outdir $outdir/unicode $outdir/tests - -cp unicode/* $outdir/unicode -cp -a tests/bench-v8 $outdir/tests - -( cd /tmp && tar Jcvf /tmp/${name}.tar.xz ${d} ) - -fi - -#################################################" -# Windows binary release - -if echo $release_list | grep -w -q win_binary ; then - -# win64 - -dlldir=/usr/x86_64-w64-mingw32/sys-root/mingw/bin -cross_prefix="x86_64-w64-mingw32-" -d="quickjs-win-x86_64-${version}" -outdir="/tmp/${d}" - -rm -rf $outdir -mkdir -p $outdir - -make CONFIG_WIN32=y qjs.exe -cp qjs.exe $outdir -${cross_prefix}strip $outdir/qjs.exe -cp $dlldir/libwinpthread-1.dll $outdir - -( cd /tmp/$d && rm -f ../${d}.zip && zip -r ../${d}.zip . ) - -make CONFIG_WIN32=y clean - -# win32 - -dlldir=/usr/i686-w64-mingw32/sys-root/mingw/bin -cross_prefix="i686-w64-mingw32-" -d="quickjs-win-i686-${version}" -outdir="/tmp/${d}" - -rm -rf $outdir -mkdir -p $outdir - -make clean -make CONFIG_WIN32=y clean - -make CONFIG_WIN32=y CONFIG_M32=y qjs.exe -cp qjs.exe $outdir -${cross_prefix}strip $outdir/qjs.exe -cp $dlldir/libwinpthread-1.dll $outdir - -( cd /tmp/$d && rm -f ../${d}.zip && zip -r ../${d}.zip . ) - -fi - -#################################################" -# Linux binary release - -if echo $release_list | grep -w -q binary ; then - -make clean -make CONFIG_WIN32=y clean -make -j4 qjs run-test262 -make -j4 CONFIG_M32=y qjs32 run-test262-32 -strip qjs run-test262 qjs32 run-test262-32 - -d="quickjs-linux-x86_64-${version}" -outdir="/tmp/${d}" - -rm -rf $outdir -mkdir -p $outdir - -cp qjs run-test262 $outdir - -( cd /tmp/$d && rm -f ../${d}.zip && zip -r ../${d}.zip . ) - -d="quickjs-linux-i686-${version}" -outdir="/tmp/${d}" - -rm -rf $outdir -mkdir -p $outdir - -cp qjs32 $outdir/qjs -cp run-test262-32 $outdir/run-test262 - -( cd /tmp/$d && rm -f ../${d}.zip && zip -r ../${d}.zip . ) - -fi - -#################################################" -# quickjs - -if echo $release_list | grep -w -q quickjs ; then - -make build_doc - -d="quickjs-${version}" -outdir="/tmp/${d}" - -rm -rf $outdir -mkdir -p $outdir $outdir/doc $outdir/tests $outdir/examples - -cp Makefile VERSION TODO Changelog readme.txt LICENSE \ - release.sh unicode_download.sh \ - qjs.c qjsc.c qjscalc.js repl.js \ - quickjs.c quickjs.h quickjs-atom.h \ - quickjs-libc.c quickjs-libc.h quickjs-opcode.h \ - cutils.c cutils.h list.h \ - libregexp.c libregexp.h libregexp-opcode.h \ - libunicode.c libunicode.h libunicode-table.h \ - libbf.c libbf.h \ - unicode_gen.c unicode_gen_def.h \ - run-test262.c test262o.conf test262.conf \ - test262o_errors.txt test262_errors.txt \ - $outdir - -cp tests/*.js tests/*.patch tests/bjson.c $outdir/tests - -cp examples/*.js examples/*.c $outdir/examples - -cp doc/quickjs.texi doc/quickjs.pdf doc/quickjs.html \ - doc/jsbignum.texi doc/jsbignum.html doc/jsbignum.pdf \ - $outdir/doc - -( cd /tmp && tar Jcvf /tmp/${d}.tar.xz ${d} ) - -fi diff --git a/third_party/quickjs/run-test262.c b/third_party/quickjs/run-test262.c index 2092cacaf..f69a28f48 100644 --- a/third_party/quickjs/run-test262.c +++ b/third_party/quickjs/run-test262.c @@ -1,6 +1,6 @@ /* * ECMA Test 262 Runner for QuickJS - * + * * Copyright (c) 2017-2021 Fabrice Bellard * Copyright (c) 2017-2021 Charlie Gordon * @@ -22,25 +22,29 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "libc/alg/alg.h" +#include "libc/calls/struct/stat.h" +#include "libc/calls/weirdtypes.h" +#include "libc/fmt/conv.h" +#include "libc/fmt/fmt.h" +#include "libc/log/log.h" +#include "libc/sysv/consts/clock.h" +#include "libc/time/time.h" +#include "third_party/musl/ftw.h" +#include "third_party/quickjs/cutils.h" +#include "third_party/quickjs/list.h" +#include "third_party/quickjs/quickjs-libc.h" -#include "cutils.h" -#include "list.h" -#include "quickjs-libc.h" +asm(".ident\t\"\\n\\n\ +QuickJS (MIT License)\\n\ +Copyright (c) 2017-2021 Fabrice Bellard\\n\ +Copyright (c) 2017-2021 Charlie Gordon\""); +asm(".include \"libc/disclaimer.inc\""); + +/* clang-format off */ /* enable test262 thread support to test SharedArrayBuffer and Atomics */ -#define CONFIG_AGENT +/* #define CONFIG_AGENT */ #define CMD_NAME "run-test262" @@ -417,9 +421,16 @@ static JSValue js_evalScript(JSContext *ctx, JSValue this_val, return ret; } -#ifdef CONFIG_AGENT +static JSValue add_helpers1(JSContext *ctx); -#include +static int64_t get_clock_ms(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000 + (ts.tv_nsec / 1000000); +} + +#ifdef CONFIG_AGENT typedef struct { struct list_head link; @@ -438,7 +449,6 @@ typedef struct { char *str; } AgentReport; -static JSValue add_helpers1(JSContext *ctx); static void add_helpers(JSContext *ctx); static pthread_mutex_t agent_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -648,13 +658,6 @@ static JSValue js_agent_sleep(JSContext *ctx, JSValue this_val, return JS_UNDEFINED; } -static int64_t get_clock_ms(void) -{ - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - return (uint64_t)ts.tv_sec * 1000 + (ts.tv_nsec / 1000000); -} - static JSValue js_agent_monotonicNow(JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { diff --git a/third_party/quickjs/unicode_gen.c b/third_party/quickjs/unicode_gen.c index f18aaa0ab..c89848bc0 100644 --- a/third_party/quickjs/unicode_gen.c +++ b/third_party/quickjs/unicode_gen.c @@ -1,6 +1,6 @@ /* * Generation of Unicode tables - * + * * Copyright (c) 2017-2018 Fabrice Bellard * Copyright (c) 2017-2018 Charlie Gordon * @@ -22,16 +22,24 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include +#include "libc/alg/alg.h" +#include "libc/assert.h" +#include "libc/fmt/conv.h" +#include "libc/fmt/fmt.h" +#include "libc/log/log.h" +#include "libc/mem/mem.h" +#include "libc/runtime/runtime.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "third_party/quickjs/cutils.h" -#include "cutils.h" +asm(".ident\t\"\\n\\n\ +QuickJS (MIT License)\\n\ +Copyright (c) 2017-2021 Fabrice Bellard\\n\ +Copyright (c) 2017-2021 Charlie Gordon\""); +asm(".include \"libc/disclaimer.inc\""); + +/* clang-format off */ /* define it to be able to test unicode.c */ //#define USE_TEST @@ -58,7 +66,7 @@ */ #ifdef USE_TEST -#include "libunicode.c" +#include "third_party/quickjs/libunicode.c" #endif #define CHARCODE_MAX 0x10ffff @@ -154,20 +162,20 @@ char *get_line(char *buf, int buf_size, FILE *f) typedef enum { #define DEF(id, str) GCAT_ ## id, -#include "unicode_gen_def.h" +#include "third_party/quickjs/unicode_gen_def.inc" #undef DEF GCAT_COUNT, } UnicodeGCEnum1; static const char *unicode_gc_name[] = { #define DEF(id, str) #id, -#include "unicode_gen_def.h" +#include "third_party/quickjs/unicode_gen_def.inc" #undef DEF }; static const char *unicode_gc_short_name[] = { #define DEF(id, str) str, -#include "unicode_gen_def.h" +#include "third_party/quickjs/unicode_gen_def.inc" #undef DEF }; @@ -177,20 +185,20 @@ static const char *unicode_gc_short_name[] = { typedef enum { #define DEF(id, str) SCRIPT_ ## id, -#include "unicode_gen_def.h" +#include "third_party/quickjs/unicode_gen_def.inc" #undef DEF SCRIPT_COUNT, } UnicodeScriptEnum1; static const char *unicode_script_name[] = { #define DEF(id, str) #id, -#include "unicode_gen_def.h" +#include "third_party/quickjs/unicode_gen_def.inc" #undef DEF }; const char *unicode_script_short_name[] = { #define DEF(id, str) str, -#include "unicode_gen_def.h" +#include "third_party/quickjs/unicode_gen_def.inc" #undef DEF }; @@ -200,20 +208,20 @@ const char *unicode_script_short_name[] = { typedef enum { #define DEF(id, str) PROP_ ## id, -#include "unicode_gen_def.h" +#include "third_party/quickjs/unicode_gen_def.inc" #undef DEF PROP_COUNT, } UnicodePropEnum1; static const char *unicode_prop_name[] = { #define DEF(id, str) #id, -#include "unicode_gen_def.h" +#include "third_party/quickjs/unicode_gen_def.inc" #undef DEF }; static const char *unicode_prop_short_name[] = { #define DEF(id, str) str, -#include "unicode_gen_def.h" +#include "third_party/quickjs/unicode_gen_def.inc" #undef DEF }; @@ -3037,8 +3045,6 @@ int main(int argc, char **argv) fprintf(fo, "/* Compressed unicode tables */\n" "/* Automatically generated file - do not edit */\n" - "\n" - "#include \n" "\n"); dump_case_conv_table(fo); compute_internal_props(); diff --git a/third_party/quickjs/unicode_gen_def.h b/third_party/quickjs/unicode_gen_def.inc similarity index 100% rename from third_party/quickjs/unicode_gen_def.h rename to third_party/quickjs/unicode_gen_def.inc diff --git a/third_party/quickjs/wut.c b/third_party/quickjs/wut.c new file mode 100644 index 000000000..583019bdc --- /dev/null +++ b/third_party/quickjs/wut.c @@ -0,0 +1,24 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "third_party/quickjs/quickjs.h" + +uint8_t qjsc_repl[FRAMESIZE]; +uint32_t qjsc_repl_size = FRAMESIZE; +uint8_t qjsc_qjscalc[FRAMESIZE]; +uint32_t qjsc_qjscalc_size = FRAMESIZE; diff --git a/third_party/third_party.mk b/third_party/third_party.mk index 59287caf7..bd2ba492f 100644 --- a/third_party/third_party.mk +++ b/third_party/third_party.mk @@ -11,6 +11,7 @@ o/$(MODE)/third_party: \ o/$(MODE)/third_party/lua \ o/$(MODE)/third_party/lz4cli \ o/$(MODE)/third_party/musl \ + o/$(MODE)/third_party/quickjs \ o/$(MODE)/third_party/regex \ o/$(MODE)/third_party/stb \ o/$(MODE)/third_party/xed \ diff --git a/tool/emacs/cosmo-format.el b/tool/emacs/cosmo-format.el index 68522f819..446fa5a28 100644 --- a/tool/emacs/cosmo-format.el +++ b/tool/emacs/cosmo-format.el @@ -67,7 +67,7 @@ :type '(repeat string) :group 'cosmo-format) -(defcustom cosmo-format-blacklist '() +(defcustom cosmo-format-blacklist '("quickjs.c") "List of files to ignore, matched by basename." :type '(repeat string) :group 'cosmo-format)