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)