Get Fabrice Bellard's JavaScript engine to build

$ m=tiny
$ make -j12 MODE=$m o/$m/third_party/quickjs/qjs.com
$ o/$m/third_party/quickjs/qjs.com -e 'console.log(2 + 2)'
4
$ ls -hal o/$m/third_party/quickjs/qjs.com
631.5K

See #97
This commit is contained in:
Justine Tunney
2021-04-09 01:06:57 -07:00
parent 1fbfbb3192
commit 8f52c0d773
73 changed files with 954 additions and 1299 deletions

View File

@ -136,6 +136,7 @@ include third_party/third_party.mk
include libc/testlib/testlib.mk include libc/testlib/testlib.mk
include tool/viz/lib/vizlib.mk include tool/viz/lib/vizlib.mk
include third_party/lua/lua.mk include third_party/lua/lua.mk
include third_party/quickjs/quickjs.mk
include examples/examples.mk include examples/examples.mk
include third_party/lz4cli/lz4cli.mk include third_party/lz4cli/lz4cli.mk
include tool/build/lib/buildlib.mk include tool/build/lib/buildlib.mk

23
libc/runtime/dlfcn.h Normal file
View File

@ -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_ */

32
libc/runtime/fegetround.c Normal file
View File

@ -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;
}

41
libc/runtime/fenv.c Normal file
View File

@ -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;
}

39
libc/runtime/fenv.h Normal file
View File

@ -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_ */

51
libc/runtime/fesetround.c Normal file
View File

@ -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;
}
}

34
libc/runtime/fltrounds.c Normal file
View File

@ -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;
}
}

View File

@ -16,7 +16,7 @@
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
│ PERFORMANCE OF THIS SOFTWARE. │ │ PERFORMANCE OF THIS SOFTWARE. │
╚─────────────────────────────────────────────────────────────────────────────*/ ╚─────────────────────────────────────────────────────────────────────────────*/
#include "libc/runtime/runtime.h" #include "libc/runtime/dlfcn.h"
char *dlerror(void) { char *dlerror(void) {
return "cosmopolitan doesn't support dsos"; return "cosmopolitan doesn't support dsos";

View File

@ -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 TCOOFF 0 1 1 1 1 0 # bsd consensus
syscon misc TCOON 1 2 2 2 2 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_DISK 0 0 0 0 0 0 # consensus
syscon misc TYPE_A 1 1 1 1 1 0 # unix 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 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_MUTEX_ROBUST 0 0 1 0 0 0
syscon misc PTHREAD_PROCESS_PRIVATE 0 2 0 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_TTY 0 0 0 0 0 0 # consensus
syscon misc N_6PACK 7 0 0 0 0 0 syscon misc N_6PACK 7 0 0 0 0 0
syscon misc N_AX25 5 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_NMAX 0x7fffffff 1 1 0 0 0
syscon misc NL_SETD 1 1 0 1 1 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_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_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 syscon rusage RUSAGE_THREAD 1 99 1 1 1 1 # faked nt & unavailable on xnu

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FE_ALL_EXCEPT,61,63,63,63,63,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FE_DIVBYZERO,4,4,4,4,4,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FE_DOWNWARD,0x0400,0x0400,0x0400,0x0400,0x0400,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FE_INEXACT,0x20,0x20,0x20,0x20,0x20,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FE_INVALID,1,1,1,1,1,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FE_OVERFLOW,8,8,8,8,8,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FE_TONEAREST,0,0,0,0,0,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FE_TOWARDZERO,0x0c00,0x0c00,0x0c00,0x0c00,0x0c00,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FE_UNDERFLOW,0x10,0x10,0x10,0x10,0x10,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FE_UPWARD,0x0800,0x0800,0x0800,0x0800,0x0800,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_CHDIR,4,8,8,8,8,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_D,1,1,1,1,1,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_DEPTH,8,4,4,4,4,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_DNR,2,2,2,2,2,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_DP,5,3,3,3,3,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_F,0,0,0,0,0,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_MOUNT,2,2,2,2,2,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_NS,3,4,4,4,4,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_PHYS,1,1,1,1,1,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_SL,4,5,5,5,5,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,FTW_SLN,6,6,6,6,6,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,RTLD_DI_LINKMAP,0,0,2,0,0,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,RTLD_GLOBAL,0x0100,8,0x0100,0x0100,0x0100,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,RTLD_LAZY,1,1,1,1,1,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,RTLD_LOCAL,0,4,0,0,0,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,RTLD_NODELETE,0x1000,0x80,0x1000,0,0,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,RTLD_NOLOAD,4,0x10,0x2000,0,0,0

View File

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,RTLD_NOW,2,2,2,2,2,0

View File

@ -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_ */

View File

@ -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_ */

View File

@ -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_ */

View File

@ -1,5 +1,6 @@
#include "libc/math.h" #include "libc/math.h"
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/runtime/fenv.h"
#include "libc/str/str.h" #include "libc/str/str.h"
#include "third_party/gdtoa/gdtoa.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\""); Copyright (C) 1997, 1998, 2000 by Lucent Technologies\"");
asm(".include \"libc/disclaimer.inc\""); asm(".include \"libc/disclaimer.inc\"");
#define IEEE_Arith 1 #define IEEE_Arith 1
#define IEEE_8087 1 #define IEEE_8087 1
#define f_QNAN 0x7fc00000 #define Honor_FLT_ROUNDS 1
#define d_QNAN0 0x7ff80000 #define f_QNAN 0x7fc00000
#define d_QNAN1 0x0 #define d_QNAN0 0x7ff80000
#define d_QNAN1 0x0
/**************************************************************** /****************************************************************

View File

@ -28,6 +28,7 @@ THIRD_PARTY_GDTOA_A_DIRECTDEPS = \
LIBC_INTRIN \ LIBC_INTRIN \
LIBC_MEM \ LIBC_MEM \
LIBC_NEXGEN32E \ LIBC_NEXGEN32E \
LIBC_RUNTIME \
LIBC_STR \ LIBC_STR \
LIBC_STUBS \ LIBC_STUBS \
LIBC_SYSV \ LIBC_SYSV \

43
third_party/musl/ftw.c vendored Normal file
View File

@ -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);
}

32
third_party/musl/ftw.h vendored Normal file
View File

@ -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_ */

171
third_party/musl/nftw.c vendored Normal file
View File

@ -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;
}

View File

@ -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|</style>|</style>\n<meta name="viewport" content="width=device-width, initial-scale=1.0">|' < $< > $@
###############################################################################
# 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)

View File

@ -1,6 +1,6 @@
/* /*
* C utilities * C utilities
* *
* Copyright (c) 2017 Fabrice Bellard * Copyright (c) 2017 Fabrice Bellard
* Copyright (c) 2018 Charlie Gordon * Copyright (c) 2018 Charlie Gordon
* *
@ -22,12 +22,18 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdlib.h> #include "libc/fmt/fmt.h"
#include <stdio.h> #include "libc/mem/mem.h"
#include <stdarg.h> #include "libc/str/str.h"
#include <string.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) void pstrcpy(char *buf, int buf_size, const char *str)
{ {

View File

@ -1,41 +1,17 @@
/* #ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_CUTILS_H_
* C utilities #define COSMOPOLITAN_THIRD_PARTY_QUICKJS_CUTILS_H_
* #if !(__ASSEMBLER__ + __LINKER__ + 0)
* Copyright (c) 2017 Fabrice Bellard COSMOPOLITAN_C_START_
* Copyright (c) 2018 Charlie Gordon /* clang-format off */
*
* 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 <stdlib.h>
#include <inttypes.h>
/* set if CPU is big endian */ /* set if CPU is big endian */
#undef WORDS_BIGENDIAN #undef WORDS_BIGENDIAN
#define likely(x) __builtin_expect(!!(x), 1) #define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0) #define unlikely(x) __builtin_expect(!!(x), 0)
#define force_inline inline __attribute__((always_inline)) #define force_inline forceinline
#define no_inline __attribute__((noinline)) #define no_inline noinline
#define __maybe_unused __attribute__((unused)) #define __maybe_unused __attribute__((__unused__))
#define xglue(x, y) x ## y #define xglue(x, y) x ## y
#define glue(x, y) xglue(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 */ /* WARNING: undefined if a = 0 */
static inline int clz32(unsigned int a) forceinline int clz32(unsigned int a)
{ {
return __builtin_clz(a); return __builtin_clz(a);
} }
/* WARNING: undefined if a = 0 */ /* WARNING: undefined if a = 0 */
static inline int clz64(uint64_t a) forceinline int clz64(uint64_t a)
{ {
return __builtin_clzll(a); return __builtin_clzll(a);
} }
/* WARNING: undefined if a = 0 */ /* WARNING: undefined if a = 0 */
static inline int ctz32(unsigned int a) forceinline int ctz32(unsigned int a)
{ {
return __builtin_ctz(a); return __builtin_ctz(a);
} }
/* WARNING: undefined if a = 0 */ /* WARNING: undefined if a = 0 */
static inline int ctz64(uint64_t a) forceinline int ctz64(uint64_t a)
{ {
return __builtin_ctzll(a); return __builtin_ctzll(a);
} }
@ -207,18 +183,18 @@ static inline void put_u8(uint8_t *tab, uint8_t val)
*tab = val; *tab = val;
} }
static inline uint16_t bswap16(uint16_t x) forceinline uint16_t bswap16(uint16_t x)
{ {
return (x >> 8) | (x << 8); 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) | return ((v & 0xff000000) >> 24) | ((v & 0x00ff0000) >> 8) |
((v & 0x0000ff00) << 8) | ((v & 0x000000ff) << 24); ((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)) | return ((v & ((uint64_t)0xff << (7 * 8))) >> (7 * 8)) |
((v & ((uint64_t)0xff << (6 * 8))) >> (5 * 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 *), int (*cmp)(const void *, const void *, void *),
void *arg); void *arg);
#endif /* CUTILS_H */ /* clang-format on */
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_CUTILS_H_ */

View File

@ -1,6 +1,6 @@
/* /*
* Tiny arbitrary precision floating point library * Tiny arbitrary precision floating point library
* *
* Copyright (c) 2017-2021 Fabrice Bellard * Copyright (c) 2017-2021 Fabrice Bellard
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdlib.h> #include "libc/assert.h"
#include <stdio.h> #include "libc/inttypes.h"
#include <inttypes.h> #include "libc/stdio/stdio.h"
#include <math.h> #include "libc/str/str.h"
#include <string.h> #include "third_party/quickjs/cutils.h"
#include <assert.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__ #ifdef __AVX2__
#include <immintrin.h> #undef __AVX2__
#endif #endif
#include "cutils.h" /* clang-format off */
#include "libbf.h"
/* enable it to check the multiplication result */ /* enable it to check the multiplication result */
//#define USE_MUL_CHECK //#define USE_MUL_CHECK

View File

@ -1,31 +1,10 @@
/* #ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBBF_H_
* Tiny arbitrary precision floating point library #define COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBBF_H_
* #include "libc/limits.h"
* Copyright (c) 2017-2021 Fabrice Bellard #include "libc/literal.h"
* #if !(__ASSEMBLER__ + __LINKER__ + 0)
* Permission is hereby granted, free of charge, to any person obtaining a copy COSMOPOLITAN_C_START_
* of this software and associated documentation files (the "Software"), to deal /* clang-format off */
* 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 <stddef.h>
#include <stdint.h>
#if INTPTR_MAX >= INT64_MAX #if INTPTR_MAX >= INT64_MAX
#define LIMB_LOG2_BITS 6 #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); 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_ */

View File

@ -1,6 +1,6 @@
/* /*
* Regular Expression Engine * Regular Expression Engine
* *
* Copyright (c) 2017-2018 Fabrice Bellard * Copyright (c) 2017-2018 Fabrice Bellard
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
@ -22,6 +22,8 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
/* clang-format off */
#ifdef DEF #ifdef DEF
DEF(invalid, 1) /* never used */ DEF(invalid, 1) /* never used */

View File

@ -1,6 +1,6 @@
/* /*
* Regular Expression Engine * Regular Expression Engine
* *
* Copyright (c) 2017-2018 Fabrice Bellard * Copyright (c) 2017-2018 Fabrice Bellard
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdlib.h> #include "libc/assert.h"
#include <stdio.h> #include "libc/fmt/fmt.h"
#include <stdarg.h> #include "libc/limits.h"
#include <inttypes.h> #include "libc/mem/alloca.h"
#include <string.h> #include "libc/stdio/stdio.h"
#include <assert.h> #include "libc/str/str.h"
#include "third_party/quickjs/cutils.h"
#include "third_party/quickjs/libregexp.h"
#include "cutils.h" asm(".ident\t\"\\n\\n\
#include "libregexp.h" 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: TODO:
@ -49,7 +56,7 @@
typedef enum { typedef enum {
#define DEF(id, size) REOP_ ## id, #define DEF(id, size) REOP_ ## id,
#include "libregexp-opcode.h" #include "third_party/quickjs/libregexp-opcode.inc"
#undef DEF #undef DEF
REOP_COUNT, REOP_COUNT,
} REOPCodeEnum; } REOPCodeEnum;
@ -96,7 +103,7 @@ static const REOpCode reopcode_info[REOP_COUNT] = {
#else #else
#define DEF(id, size) { size }, #define DEF(id, size) { size },
#endif #endif
#include "libregexp-opcode.h" #include "third_party/quickjs/libregexp-opcode.inc"
#undef DEF #undef DEF
}; };

View File

@ -1,32 +1,9 @@
/* #ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBREGEXP_H_
* Regular Expression Engine #define COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBREGEXP_H_
* #include "third_party/quickjs/libunicode.h"
* Copyright (c) 2017-2018 Fabrice Bellard #if !(__ASSEMBLER__ + __LINKER__ + 0)
* COSMOPOLITAN_C_START_
* Permission is hereby granted, free of charge, to any person obtaining a copy /* clang-format off */
* 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 <stddef.h>
#include "libunicode.h"
#define LRE_BOOL int /* for documentation purposes */ #define LRE_BOOL int /* for documentation purposes */
@ -89,4 +66,7 @@ static inline int lre_js_is_ident_next(int c)
#undef LRE_BOOL #undef LRE_BOOL
#endif /* LIBREGEXP_H */ /* clang-format on */
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBREGEXP_H_ */

View File

@ -1,8 +1,7 @@
/* clang-format off */
/* Compressed unicode tables */ /* Compressed unicode tables */
/* Automatically generated file - do not edit */ /* Automatically generated file - do not edit */
#include <stdint.h>
static const uint32_t case_conv_table1[361] = { static const uint32_t case_conv_table1[361] = {
0x00209a30, 0x00309a00, 0x005a8173, 0x00601730, 0x00209a30, 0x00309a00, 0x005a8173, 0x00601730,
0x006c0730, 0x006f81b3, 0x00701700, 0x007c0700, 0x006c0730, 0x006f81b3, 0x00701700, 0x007c0700,

View File

@ -1,6 +1,6 @@
/* /*
* Unicode utilities * Unicode utilities
* *
* Copyright (c) 2017-2018 Fabrice Bellard * Copyright (c) 2017-2018 Fabrice Bellard
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdlib.h> #include "libc/assert.h"
#include <stdio.h> #include "libc/limits.h"
#include <stdarg.h> #include "libc/stdio/stdio.h"
#include <string.h> #include "libc/str/str.h"
#include <assert.h> #include "third_party/quickjs/cutils.h"
#include "third_party/quickjs/libunicode.h"
#include "cutils.h" asm(".ident\t\"\\n\\n\
#include "libunicode.h" QuickJS (MIT License)\\n\
#include "libunicode-table.h" 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 { enum {
RUN_TYPE_U, RUN_TYPE_U,

View File

@ -1,30 +1,9 @@
/* #ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBUNICODE_H_
* Unicode utilities #define COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBUNICODE_H_
* #include "third_party/quickjs/libunicode.h"
* Copyright (c) 2017-2018 Fabrice Bellard #if !(__ASSEMBLER__ + __LINKER__ + 0)
* COSMOPOLITAN_C_START_
* Permission is hereby granted, free of charge, to any person obtaining a copy /* clang-format off */
* 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 <inttypes.h>
#define LRE_BOOL int /* for documentation purposes */ #define LRE_BOOL int /* for documentation purposes */
@ -121,4 +100,7 @@ int unicode_prop(CharRange *cr, const char *prop_name);
#undef LRE_BOOL #undef LRE_BOOL
#endif /* LIBUNICODE_H */ /* clang-format on */
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBUNICODE_H_ */

View File

@ -1,32 +1,8 @@
/* #ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIST_H_
* Linux klist like system #define COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIST_H_
* #if !(__ASSEMBLER__ + __LINKER__ + 0)
* Copyright (c) 2016-2017 Fabrice Bellard COSMOPOLITAN_C_START_
* /* clang-format off */
* 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 <stddef.h>
#endif
struct list_head { struct list_head {
struct list_head *prev; 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); \ for(el = (head)->prev, el1 = el->prev; el != (head); \
el = el1, el1 = el->prev) 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_ */

View File

@ -1,6 +1,6 @@
/* /*
* QuickJS stand alone interpreter * QuickJS stand alone interpreter
* *
* Copyright (c) 2017-2021 Fabrice Bellard * Copyright (c) 2017-2021 Fabrice Bellard
* Copyright (c) 2017-2021 Charlie Gordon * 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdlib.h> #include "libc/assert.h"
#include <stdio.h> #include "libc/calls/weirdtypes.h"
#include <stdarg.h> #include "libc/log/log.h"
#include <inttypes.h> #include "libc/mem/mem.h"
#include <string.h> #include "libc/runtime/runtime.h"
#include <assert.h> #include "libc/stdio/stdio.h"
#include <unistd.h> #include "libc/str/str.h"
#include <errno.h> #include "libc/time/time.h"
#include <fcntl.h> #include "third_party/gdtoa/gdtoa.h"
#include <time.h> #include "third_party/quickjs/cutils.h"
#if defined(__APPLE__) #include "third_party/quickjs/quickjs-libc.h"
#include <malloc/malloc.h>
#elif defined(__linux__)
#include <malloc.h>
#endif
#include "cutils.h" asm(".ident\t\"\\n\\n\
#include "quickjs-libc.h" 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 uint8_t qjsc_repl[];
extern const uint32_t qjsc_repl_size; extern const uint32_t qjsc_repl_size;
@ -454,8 +455,10 @@ int main(int argc, char **argv)
} }
} }
#ifdef CONFIG_BIGNUM
if (load_jscalc) if (load_jscalc)
bignum_ext = 1; bignum_ext = 1;
#endif
if (trace_memory) { if (trace_memory) {
js_trace_malloc_init(&trace_data); js_trace_malloc_init(&trace_data);
@ -539,7 +542,7 @@ int main(int argc, char **argv)
if (empty_run && dump_memory) { if (empty_run && dump_memory) {
clock_t t[5]; clock_t t[5];
double best[5]; double best[5] = {0};
int i, j; int i, j;
for (i = 0; i < 100; i++) { for (i = 0; i < 100; i++) {
t[0] = clock(); t[0] = clock();

View File

@ -1,6 +1,6 @@
/* /*
* QuickJS command line compiler * QuickJS command line compiler
* *
* Copyright (c) 2018-2021 Fabrice Bellard * Copyright (c) 2018-2021 Fabrice Bellard
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdlib.h> #include "libc/assert.h"
#include <stdio.h> #include "libc/calls/calls.h"
#include <stdarg.h> #include "libc/fmt/fmt.h"
#include <inttypes.h> #include "libc/log/log.h"
#include <string.h> #include "libc/mem/mem.h"
#include <assert.h> #include "libc/stdio/stdio.h"
#include <unistd.h> #include "libc/str/str.h"
#include <errno.h> #include "libc/x/x.h"
#if !defined(_WIN32) #include "third_party/gdtoa/gdtoa.h"
#include <sys/wait.h> #include "third_party/getopt/getopt.h"
#endif #include "third_party/quickjs/cutils.h"
#include "third_party/quickjs/quickjs-libc.h"
#include "cutils.h" asm(".ident\t\"\\n\\n\
#include "quickjs-libc.h" 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 { typedef struct {
char *name; 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) static void find_unique_cname(char *cname, size_t cname_size)
{ {
char cname1[1024]; char *cname1;
int suffix_num; int suffix_num;
size_t len, max_len; size_t len, max_len;
assert(cname_size >= 32); assert(cname_size >= 32);
@ -219,13 +225,16 @@ static void find_unique_cname(char *cname, size_t cname_size)
if (len > max_len) if (len > max_len)
cname[max_len] = '\0'; cname[max_len] = '\0';
suffix_num = 1; suffix_num = 1;
cname1 = NULL;
for(;;) { 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)) if (!namelist_find(&cname_list, cname1))
break; break;
suffix_num++; suffix_num++;
} }
pstrcpy(cname, cname_size, cname1); pstrcpy(cname, cname_size, cname1);
free(cname1);
} }
JSModuleDef *jsc_module_loader(JSContext *ctx, JSModuleDef *jsc_module_loader(JSContext *ctx,

View File

@ -1,6 +1,6 @@
/* /*
* QuickJS C library * QuickJS C library
* *
* Copyright (c) 2017-2021 Fabrice Bellard * Copyright (c) 2017-2021 Fabrice Bellard
* Copyright (c) 2017-2021 Charlie Gordon * 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdlib.h> #include "libc/assert.h"
#include <stdio.h> #include "libc/calls/calls.h"
#include <stdarg.h> #include "libc/calls/ioctl.h"
#include <inttypes.h> #include "libc/calls/struct/winsize.h"
#include <string.h> #include "libc/calls/termios.h"
#include <assert.h> #include "libc/errno.h"
#include <unistd.h> #include "libc/fmt/conv.h"
#include <errno.h> #include "libc/fmt/fmt.h"
#include <fcntl.h> #include "libc/limits.h"
#include <sys/time.h> #include "libc/runtime/dlfcn.h"
#include <time.h> #include "libc/runtime/sysconf.h"
#include <signal.h> #include "libc/sock/select.h"
#include <limits.h> #include "libc/stdio/temp.h"
#include <sys/stat.h> #include "libc/str/str.h"
#include <dirent.h> #include "libc/sysv/consts/clock.h"
#if defined(_WIN32) #include "libc/sysv/consts/o.h"
#include <windows.h> #include "libc/sysv/consts/termios.h"
#include <conio.h> #include "libc/sysv/consts/w.h"
#include <utime.h> #include "libc/time/time.h"
#else #include "third_party/quickjs/cutils.h"
#include <dlfcn.h> #include "third_party/quickjs/list.h"
#include <termios.h> #include "third_party/quickjs/quickjs-libc.h"
#include <sys/ioctl.h>
#include <sys/wait.h>
#if defined(__APPLE__) asm(".ident\t\"\\n\\n\
typedef sig_t sighandler_t; QuickJS (MIT License)\\n\
#if !defined(environ) Copyright (c) 2017-2021 Fabrice Bellard\\n\
#include <crt_externs.h> Copyright (c) 2017-2021 Charlie Gordon\"");
#define environ (*_NSGetEnviron()) asm(".include \"libc/disclaimer.inc\"");
#endif
#endif /* __APPLE__ */
#endif /* clang-format off */
#if !defined(_WIN32)
/* enable the os.Worker API. IT relies on POSIX threads */
#define USE_WORKER
#endif
#ifdef USE_WORKER
#include <pthread.h>
#include <stdatomic.h>
#endif
#include "cutils.h"
#include "list.h"
#include "quickjs-libc.h"
/* TODO: /* TODO:
- add socket calls - add socket calls
@ -1463,7 +1445,9 @@ static JSClassDef js_std_file_class = {
.finalizer = js_std_file_finalizer, .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 */ /* various errno values */
#define DEF(x) JS_PROP_INT32_DEF(#x, x, JS_PROP_CONFIGURABLE ) #define DEF(x) JS_PROP_INT32_DEF(#x, x, JS_PROP_CONFIGURABLE )
DEF(EINVAL), DEF(EINVAL),
@ -1478,7 +1462,11 @@ static const JSCFunctionListEntry js_std_error_props[] = {
DEF(EPIPE), DEF(EPIPE),
DEF(EBADF), DEF(EBADF),
#undef DEF #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[] = { static const JSCFunctionListEntry js_std_funcs[] = {
JS_CFUNC_DEF("exit", 1, js_std_exit ), 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); execve(buf, argv, envp);
switch(errno) { if (errno == EACCES) {
case EACCES: eacces_error = TRUE;
eacces_error = TRUE; } else if (errno == ENOENT) {
break; /* do nothing */
case ENOENT: } else if (errno == ENOTDIR) {
case ENOTDIR: /* do nothing */
break; } else {
default: return -1;
return -1;
} }
} }
if (eacces_error) if (eacces_error)
@ -2958,7 +2945,7 @@ static JSValue js_os_exec(JSContext *ctx, JSValueConst this_val,
} }
if (pid == 0) { if (pid == 0) {
/* child */ /* child */
int fd_max = sysconf(_SC_OPEN_MAX); int fd_max = 128 /* sysconf(_SC_OPEN_MAX) */;
/* remap the stdin/stdout/stderr handles if necessary */ /* remap the stdin/stdout/stderr handles if necessary */
for(i = 0; i < 3; i++) { 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 ) #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 ), JS_CFUNC_DEF("open", 2, js_os_open ),
OS_FLAG(O_RDONLY), OS_FLAG(O_RDONLY),
OS_FLAG(O_WRONLY), 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("dup", 1, js_os_dup ),
JS_CFUNC_DEF("dup2", 2, js_os_dup2 ), JS_CFUNC_DEF("dup2", 2, js_os_dup2 ),
#endif #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) static int js_os_init(JSContext *ctx, JSModuleDef *m)
{ {

View File

@ -1,37 +1,9 @@
/* #ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBC_H_
* QuickJS C library #define COSMOPOLITAN_THIRD_PARTY_QUICKJS_LIBC_H_
* #include "third_party/quickjs/quickjs.h"
* Copyright (c) 2017-2018 Fabrice Bellard #if !(__ASSEMBLER__ + __LINKER__ + 0)
* COSMOPOLITAN_C_START_
* Permission is hereby granted, free of charge, to any person obtaining a copy /* clang-format off */
* 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 <stdio.h>
#include <stdlib.h>
#include "quickjs.h"
#ifdef __cplusplus
extern "C" {
#endif
JSModuleDef *js_init_module_std(JSContext *ctx, const char *module_name); JSModuleDef *js_init_module_std(JSContext *ctx, const char *module_name);
JSModuleDef *js_init_module_os(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, JSValueConst reason,
JS_BOOL is_handled, void *opaque); JS_BOOL is_handled, void *opaque);
void js_std_set_worker_new_context_func(JSContext *(*func)(JSRuntime *rt)); 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_ */

View File

@ -1,6 +1,6 @@
/* /*
* QuickJS opcode definitions * QuickJS opcode definitions
* *
* Copyright (c) 2017-2018 Fabrice Bellard * Copyright (c) 2017-2018 Fabrice Bellard
* Copyright (c) 2017-2018 Charlie Gordon * Copyright (c) 2017-2018 Charlie Gordon
* *
@ -23,6 +23,8 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
/* clang-format off */
#ifdef FMT #ifdef FMT
FMT(none) FMT(none)
FMT(none_int) FMT(none_int)

View File

@ -1,6 +1,6 @@
/* /*
* QuickJS Javascript Engine * QuickJS Javascript Engine
* *
* Copyright (c) 2017-2021 Fabrice Bellard * Copyright (c) 2017-2021 Fabrice Bellard
* Copyright (c) 2017-2021 Charlie Gordon * 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdlib.h> #include "third_party/quickjs/cutils.h"
#include <stdio.h> #include "third_party/quickjs/libregexp.h"
#include <stdarg.h> #include "third_party/quickjs/list.h"
#include <inttypes.h> #include "third_party/quickjs/quickjs.h"
#include <string.h> #include "libc/assert.h"
#include <assert.h> #include "libc/fmt/fmt.h"
#include <sys/time.h> #include "libc/fmt/fmt.h"
#include <time.h> #include "libc/inttypes.h"
#include <fenv.h> #include "libc/mem/alloca.h"
#include <math.h> #include "third_party/gdtoa/gdtoa.h"
#if defined(__APPLE__) #include "libc/fmt/conv.h"
#include <malloc/malloc.h> #include "libc/runtime/fenv.h"
#elif defined(__linux__) #include "libc/time/time.h"
#include <malloc.h> #include "libc/time/time.h"
#elif defined(__FreeBSD__) #include "libc/calls/weirdtypes.h"
#include <malloc_np.h> #include "libc/time/struct/tm.h"
#endif #include "libc/log/log.h"
#include "third_party/quickjs/libbf.h"
#include "cutils.h" asm(".ident\t\"\\n\\n\
#include "list.h" QuickJS (MIT License)\\n\
#include "quickjs.h" Copyright (c) 2017-2021 Fabrice Bellard\\n\
#include "libregexp.h" Copyright (c) 2017-2021 Charlie Gordon\"");
#ifdef CONFIG_BIGNUM asm(".include \"libc/disclaimer.inc\"");
#include "libbf.h"
#endif /* clang-format off */
#define OPTIMIZE 1 #define OPTIMIZE 1
#define SHORT_OPCODES 1 #define SHORT_OPCODES 1
@ -69,7 +70,7 @@
/* define to include Atomics.* operations which depend on the OS /* define to include Atomics.* operations which depend on the OS
threads */ threads */
#if !defined(EMSCRIPTEN) #if !defined(EMSCRIPTEN) && defined(USE_WORKER)
#define CONFIG_ATOMICS #define CONFIG_ATOMICS
#endif #endif
@ -109,12 +110,6 @@
/* test the GC by forcing it before each object allocation */ /* test the GC by forcing it before each object allocation */
//#define FORCE_GC_AT_MALLOC //#define FORCE_GC_AT_MALLOC
#ifdef CONFIG_ATOMICS
#include <pthread.h>
#include <stdatomic.h>
#include <errno.h>
#endif
enum { enum {
/* classid tag */ /* union usage | properties */ /* classid tag */ /* union usage | properties */
JS_CLASS_OBJECT = 1, /* must be first */ JS_CLASS_OBJECT = 1, /* must be first */
@ -952,7 +947,7 @@ struct JSObject {
enum { enum {
__JS_ATOM_NULL = JS_ATOM_NULL, __JS_ATOM_NULL = JS_ATOM_NULL,
#define DEF(name, str) JS_ATOM_ ## name, #define DEF(name, str) JS_ATOM_ ## name,
#include "quickjs-atom.h" #include "third_party/quickjs/quickjs-atom.inc"
#undef DEF #undef DEF
JS_ATOM_END, JS_ATOM_END,
}; };
@ -961,14 +956,14 @@ enum {
static const char js_atom_init[] = static const char js_atom_init[] =
#define DEF(name, str) str "\0" #define DEF(name, str) str "\0"
#include "quickjs-atom.h" #include "third_party/quickjs/quickjs-atom.inc"
#undef DEF #undef DEF
; ;
typedef enum OPCodeFormat { typedef enum OPCodeFormat {
#define FMT(f) OP_FMT_ ## f, #define FMT(f) OP_FMT_ ## f,
#define DEF(id, size, n_pop, n_push, f) #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 #undef FMT
} OPCodeFormat; } OPCodeFormat;
@ -977,7 +972,7 @@ enum OPCodeEnum {
#define FMT(f) #define FMT(f)
#define DEF(id, size, n_pop, n_push, f) OP_ ## id, #define DEF(id, size, n_pop, n_push, f) OP_ ## id,
#define def(id, size, n_pop, n_push, f) #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 DEF #undef DEF
#undef FMT #undef FMT
@ -988,7 +983,7 @@ enum OPCodeEnum {
#define FMT(f) #define FMT(f)
#define DEF(id, size, n_pop, n_push, f) #define DEF(id, size, n_pop, n_push, f)
#define def(id, size, n_pop, n_push, f) OP_ ## id, #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 DEF #undef DEF
#undef FMT #undef FMT
@ -1021,7 +1016,6 @@ static __exception int JS_ToArrayLengthFree(JSContext *ctx, uint32_t *plen,
JSValue val, BOOL is_array_ctor); JSValue val, BOOL is_array_ctor);
static JSValue JS_EvalObject(JSContext *ctx, JSValueConst this_obj, static JSValue JS_EvalObject(JSContext *ctx, JSValueConst this_obj,
JSValueConst val, int flags, int scope_idx); 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_DumpAtoms(JSRuntime *rt);
static __maybe_unused void JS_DumpString(JSRuntime *rt, static __maybe_unused void JS_DumpString(JSRuntime *rt,
const JSString *p); const JSString *p);
@ -1148,7 +1142,6 @@ static JSValue JS_ToBigDecimalFree(JSContext *ctx, JSValue val,
BOOL allow_null_or_undefined); BOOL allow_null_or_undefined);
static bfdec_t *JS_ToBigDecimal(JSContext *ctx, JSValueConst val); static bfdec_t *JS_ToBigDecimal(JSContext *ctx, JSValueConst val);
#endif #endif
JSValue JS_ThrowOutOfMemory(JSContext *ctx);
static JSValue JS_ThrowTypeErrorRevokedProxy(JSContext *ctx); static JSValue JS_ThrowTypeErrorRevokedProxy(JSContext *ctx);
static JSValue js_proxy_getPrototypeOf(JSContext *ctx, JSValueConst obj); static JSValue js_proxy_getPrototypeOf(JSContext *ctx, JSValueConst obj);
static int js_proxy_setPrototypeOf(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, force_inline JSShapeProperty *find_own_property1(JSObject *p,
JSAtom atom) JSAtom atom)
{ {
JSShape *sh; JSShape *sh;
JSShapeProperty *pr, *prop; JSShapeProperty *pr, *prop;
@ -5201,9 +5194,9 @@ static force_inline JSShapeProperty *find_own_property1(JSObject *p,
return NULL; return NULL;
} }
static force_inline JSShapeProperty *find_own_property(JSProperty **ppr, force_inline JSShapeProperty *find_own_property(JSProperty **ppr,
JSObject *p, JSObject *p,
JSAtom atom) JSAtom atom)
{ {
JSShape *sh; JSShape *sh;
JSShapeProperty *pr, *prop; 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, static void js_ecvt1(double d, int n_digits, int *decpt, int *sign, char *buf,
int rounding_mode, char *buf1, int buf1_size) int rounding_mode, char *buf1, int buf1_size)
{ {
if (rounding_mode != FE_TONEAREST) /* if (rounding_mode != FE_TONEAREST) */
fesetround(rounding_mode); /* fesetround(rounding_mode); */
snprintf(buf1, buf1_size, "%+.*e", n_digits - 1, d); snprintf(buf1, buf1_size, "%+.*e", n_digits - 1, d);
if (rounding_mode != FE_TONEAREST) /* if (rounding_mode != FE_TONEAREST) */
fesetround(FE_TONEAREST); /* fesetround(FE_TONEAREST); */
*sign = (buf1[0] == '-'); *sign = (buf1[0] == '-');
/* mantissa */ /* mantissa */
buf[0] = buf1[1]; buf[0] = buf1[1];
@ -16223,7 +16216,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
#else #else
#define def(id, size, n_pop, n_push, f) && case_default, #define def(id, size, n_pop, n_push, f) && case_default,
#endif #endif
#include "quickjs-opcode.h" #include "third_party/quickjs/quickjs-opcode.inc"
[ OP_COUNT ... 255 ] = &&case_default [ OP_COUNT ... 255 ] = &&case_default
}; };
#define SWITCH(pc) goto *dispatch_table[opcode = *pc++]; #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 #else
#define DEF(id, size, n_pop, n_push, f) { size, n_pop, n_push, OP_FMT_ ## f }, #define DEF(id, size, n_pop, n_push, f) { size, n_pop, n_push, OP_FMT_ ## f },
#endif #endif
#include "quickjs-opcode.h" #include "third_party/quickjs/quickjs-opcode.inc"
#undef DEF #undef DEF
#undef FMT #undef FMT
}; };
@ -53615,12 +53608,12 @@ static JSValue js_atomics_op(JSContext *ctx,
a = func_name((_Atomic(uint32_t) *)ptr, v); \ a = func_name((_Atomic(uint32_t) *)ptr, v); \
break; break;
#endif #endif
OP(ADD, atomic_fetch_add) /* OP(ADD, atomic_fetch_add) */
OP(AND, atomic_fetch_and) /* OP(AND, atomic_fetch_and) */
OP(OR, atomic_fetch_or) /* OP(OR, atomic_fetch_or) */
OP(SUB, atomic_fetch_sub) /* OP(SUB, atomic_fetch_sub) */
OP(XOR, atomic_fetch_xor) /* OP(XOR, atomic_fetch_xor) */
OP(EXCHANGE, atomic_exchange) /* OP(EXCHANGE, atomic_exchange) */
#undef OP #undef OP
case ATOMICS_OP_LOAD | (0 << 3): case ATOMICS_OP_LOAD | (0 << 3):

View File

@ -1,42 +1,16 @@
/* #ifndef COSMOPOLITAN_THIRD_PARTY_QUICKJS_QUICKJS_H_
* QuickJS Javascript Engine #define COSMOPOLITAN_THIRD_PARTY_QUICKJS_QUICKJS_H_
* #include "libc/math.h"
* Copyright (c) 2017-2021 Fabrice Bellard #include "libc/stdio/stdio.h"
* Copyright (c) 2017-2021 Charlie Gordon #if !(__ASSEMBLER__ + __LINKER__ + 0)
* COSMOPOLITAN_C_START_
* Permission is hereby granted, free of charge, to any person obtaining a copy /* clang-format off */
* 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
#include <stdio.h> #if (defined(__GNUC__) || defined(__clang__)) && !defined(__STRICT_ANSI__)
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#if defined(__GNUC__) || defined(__clang__)
#define js_likely(x) __builtin_expect(!!(x), 1) #define js_likely(x) __builtin_expect(!!(x), 1)
#define js_unlikely(x) __builtin_expect(!!(x), 0) #define js_unlikely(x) __builtin_expect(!!(x), 0)
#define js_force_inline inline __attribute__((always_inline)) #define js_force_inline forceinline
#define __js_printf_like(f, a) __attribute__((format(printf, f, a))) #define __js_printf_like(f, a) __attribute__((__format__(__printf__, f, a)))
#else #else
#define js_likely(x) (x) #define js_likely(x) (x)
#define js_unlikely(x) (x) #define js_unlikely(x) (x)
@ -502,22 +476,22 @@ int JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id);
/* value handling */ /* 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)); 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); 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); 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; JSValue v;
if (val == (int32_t)val) { if (val == (int32_t)val) {
@ -528,7 +502,7 @@ static js_force_inline JSValue JS_NewInt64(JSContext *ctx, int64_t val)
return v; 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; JSValue v;
if (val <= 0x7fffffff) { 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_NewBigInt64(JSContext *ctx, int64_t v);
JSValue JS_NewBigUint64(JSContext *ctx, uint64_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; JSValue v;
int32_t val; int32_t val;
@ -723,7 +697,7 @@ int JS_IsArray(JSContext *ctx, JSValueConst val);
JSValue JS_GetPropertyInternal(JSContext *ctx, JSValueConst obj, JSValue JS_GetPropertyInternal(JSContext *ctx, JSValueConst obj,
JSAtom prop, JSValueConst receiver, JSAtom prop, JSValueConst receiver,
JS_BOOL throw_ref_error); 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) JSAtom prop)
{ {
return JS_GetPropertyInternal(ctx, this_obj, prop, this_obj, 0); 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_unlikely
#undef js_force_inline #undef js_force_inline
#ifdef __cplusplus /* clang-format on */
} /* extern "C" { */ COSMOPOLITAN_C_END_
#endif #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_THIRD_PARTY_QUICKJS_QUICKJS_H_ */
#endif /* QUICKJS_H */

85
third_party/quickjs/quickjs.mk vendored Normal file
View File

@ -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)

View File

@ -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

View File

@ -1,6 +1,6 @@
/* /*
* ECMA Test 262 Runner for QuickJS * ECMA Test 262 Runner for QuickJS
* *
* Copyright (c) 2017-2021 Fabrice Bellard * Copyright (c) 2017-2021 Fabrice Bellard
* Copyright (c) 2017-2021 Charlie Gordon * 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdlib.h> #include "libc/alg/alg.h"
#include <stdio.h> #include "libc/calls/struct/stat.h"
#include <stdarg.h> #include "libc/calls/weirdtypes.h"
#include <inttypes.h> #include "libc/fmt/conv.h"
#include <string.h> #include "libc/fmt/fmt.h"
#include <assert.h> #include "libc/log/log.h"
#include <ctype.h> #include "libc/sysv/consts/clock.h"
#include <unistd.h> #include "libc/time/time.h"
#include <errno.h> #include "third_party/musl/ftw.h"
#include <time.h> #include "third_party/quickjs/cutils.h"
#include <dirent.h> #include "third_party/quickjs/list.h"
#include <ftw.h> #include "third_party/quickjs/quickjs-libc.h"
#include "cutils.h" asm(".ident\t\"\\n\\n\
#include "list.h" QuickJS (MIT License)\\n\
#include "quickjs-libc.h" 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 */ /* enable test262 thread support to test SharedArrayBuffer and Atomics */
#define CONFIG_AGENT /* #define CONFIG_AGENT */
#define CMD_NAME "run-test262" #define CMD_NAME "run-test262"
@ -417,9 +421,16 @@ static JSValue js_evalScript(JSContext *ctx, JSValue this_val,
return ret; return ret;
} }
#ifdef CONFIG_AGENT static JSValue add_helpers1(JSContext *ctx);
#include <pthread.h> 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 { typedef struct {
struct list_head link; struct list_head link;
@ -438,7 +449,6 @@ typedef struct {
char *str; char *str;
} AgentReport; } AgentReport;
static JSValue add_helpers1(JSContext *ctx);
static void add_helpers(JSContext *ctx); static void add_helpers(JSContext *ctx);
static pthread_mutex_t agent_mutex = PTHREAD_MUTEX_INITIALIZER; 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; 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, static JSValue js_agent_monotonicNow(JSContext *ctx, JSValue this_val,
int argc, JSValue *argv) int argc, JSValue *argv)
{ {

View File

@ -1,6 +1,6 @@
/* /*
* Generation of Unicode tables * Generation of Unicode tables
* *
* Copyright (c) 2017-2018 Fabrice Bellard * Copyright (c) 2017-2018 Fabrice Bellard
* Copyright (c) 2017-2018 Charlie Gordon * 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 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdlib.h> #include "libc/alg/alg.h"
#include <stdio.h> #include "libc/assert.h"
#include <stdarg.h> #include "libc/fmt/conv.h"
#include <inttypes.h> #include "libc/fmt/fmt.h"
#include <string.h> #include "libc/log/log.h"
#include <assert.h> #include "libc/mem/mem.h"
#include <ctype.h> #include "libc/runtime/runtime.h"
#include <time.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 it to be able to test unicode.c */
//#define USE_TEST //#define USE_TEST
@ -58,7 +66,7 @@
*/ */
#ifdef USE_TEST #ifdef USE_TEST
#include "libunicode.c" #include "third_party/quickjs/libunicode.c"
#endif #endif
#define CHARCODE_MAX 0x10ffff #define CHARCODE_MAX 0x10ffff
@ -154,20 +162,20 @@ char *get_line(char *buf, int buf_size, FILE *f)
typedef enum { typedef enum {
#define DEF(id, str) GCAT_ ## id, #define DEF(id, str) GCAT_ ## id,
#include "unicode_gen_def.h" #include "third_party/quickjs/unicode_gen_def.inc"
#undef DEF #undef DEF
GCAT_COUNT, GCAT_COUNT,
} UnicodeGCEnum1; } UnicodeGCEnum1;
static const char *unicode_gc_name[] = { static const char *unicode_gc_name[] = {
#define DEF(id, str) #id, #define DEF(id, str) #id,
#include "unicode_gen_def.h" #include "third_party/quickjs/unicode_gen_def.inc"
#undef DEF #undef DEF
}; };
static const char *unicode_gc_short_name[] = { static const char *unicode_gc_short_name[] = {
#define DEF(id, str) str, #define DEF(id, str) str,
#include "unicode_gen_def.h" #include "third_party/quickjs/unicode_gen_def.inc"
#undef DEF #undef DEF
}; };
@ -177,20 +185,20 @@ static const char *unicode_gc_short_name[] = {
typedef enum { typedef enum {
#define DEF(id, str) SCRIPT_ ## id, #define DEF(id, str) SCRIPT_ ## id,
#include "unicode_gen_def.h" #include "third_party/quickjs/unicode_gen_def.inc"
#undef DEF #undef DEF
SCRIPT_COUNT, SCRIPT_COUNT,
} UnicodeScriptEnum1; } UnicodeScriptEnum1;
static const char *unicode_script_name[] = { static const char *unicode_script_name[] = {
#define DEF(id, str) #id, #define DEF(id, str) #id,
#include "unicode_gen_def.h" #include "third_party/quickjs/unicode_gen_def.inc"
#undef DEF #undef DEF
}; };
const char *unicode_script_short_name[] = { const char *unicode_script_short_name[] = {
#define DEF(id, str) str, #define DEF(id, str) str,
#include "unicode_gen_def.h" #include "third_party/quickjs/unicode_gen_def.inc"
#undef DEF #undef DEF
}; };
@ -200,20 +208,20 @@ const char *unicode_script_short_name[] = {
typedef enum { typedef enum {
#define DEF(id, str) PROP_ ## id, #define DEF(id, str) PROP_ ## id,
#include "unicode_gen_def.h" #include "third_party/quickjs/unicode_gen_def.inc"
#undef DEF #undef DEF
PROP_COUNT, PROP_COUNT,
} UnicodePropEnum1; } UnicodePropEnum1;
static const char *unicode_prop_name[] = { static const char *unicode_prop_name[] = {
#define DEF(id, str) #id, #define DEF(id, str) #id,
#include "unicode_gen_def.h" #include "third_party/quickjs/unicode_gen_def.inc"
#undef DEF #undef DEF
}; };
static const char *unicode_prop_short_name[] = { static const char *unicode_prop_short_name[] = {
#define DEF(id, str) str, #define DEF(id, str) str,
#include "unicode_gen_def.h" #include "third_party/quickjs/unicode_gen_def.inc"
#undef DEF #undef DEF
}; };
@ -3037,8 +3045,6 @@ int main(int argc, char **argv)
fprintf(fo, fprintf(fo,
"/* Compressed unicode tables */\n" "/* Compressed unicode tables */\n"
"/* Automatically generated file - do not edit */\n" "/* Automatically generated file - do not edit */\n"
"\n"
"#include <stdint.h>\n"
"\n"); "\n");
dump_case_conv_table(fo); dump_case_conv_table(fo);
compute_internal_props(); compute_internal_props();

24
third_party/quickjs/wut.c vendored Normal file
View File

@ -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;

View File

@ -11,6 +11,7 @@ o/$(MODE)/third_party: \
o/$(MODE)/third_party/lua \ o/$(MODE)/third_party/lua \
o/$(MODE)/third_party/lz4cli \ o/$(MODE)/third_party/lz4cli \
o/$(MODE)/third_party/musl \ o/$(MODE)/third_party/musl \
o/$(MODE)/third_party/quickjs \
o/$(MODE)/third_party/regex \ o/$(MODE)/third_party/regex \
o/$(MODE)/third_party/stb \ o/$(MODE)/third_party/stb \
o/$(MODE)/third_party/xed \ o/$(MODE)/third_party/xed \

View File

@ -67,7 +67,7 @@
:type '(repeat string) :type '(repeat string)
:group 'cosmo-format) :group 'cosmo-format)
(defcustom cosmo-format-blacklist '() (defcustom cosmo-format-blacklist '("quickjs.c")
"List of files to ignore, matched by basename." "List of files to ignore, matched by basename."
:type '(repeat string) :type '(repeat string)
:group 'cosmo-format) :group 'cosmo-format)