From b1794605247697b2c518f72628d5355014a9f755 Mon Sep 17 00:00:00 2001 From: Meng Date: Sat, 31 Dec 2022 13:28:56 +0100 Subject: [PATCH] quickjs: update to the latest version Also add patch to fix std.loadFile issue for reading proc and sysfs. --- quickjs/Makefile | 12 +- quickjs/patches/000-build-options.patch | 17 +-- quickjs/patches/001-no-fenv-dtoa-libbf.patch | 16 +-- quickjs/patches/002-fix_std_loadFile.patch | 126 +++++++++++++++++++ 4 files changed, 143 insertions(+), 28 deletions(-) create mode 100644 quickjs/patches/002-fix_std_loadFile.patch diff --git a/quickjs/Makefile b/quickjs/Makefile index 10c014458..ea4f7217a 100644 --- a/quickjs/Makefile +++ b/quickjs/Makefile @@ -5,8 +5,8 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/bellard/quickjs.git -PKG_SOURCE_DATE:=2020-11-08 -PKG_SOURCE_VERSION:=204682fb87ab9312f0cf81f959ecd181180457bc +PKG_SOURCE_DATE:=2022-03-06 +PKG_SOURCE_VERSION:=2788d71e823b522b178db3b3660ce93689534e6d PKG_MIRROR_HASH:=skip PKG_LICENSE:=MIT @@ -30,18 +30,16 @@ define Package/quickjs/description generators, proxies and BigInt. endef -MAKE_VARS += \ - LIBS="-latomic" - MAKE_FLAGS = \ prefix=/usr \ CONFIG_SMALL=y \ + EXTRA_LIBS="-latomic" \ CROSS_PREFIX="$(TARGET_CROSS)" define Build/InstallDev $(INSTALL_DIR) $(1)/usr/lib/quickjs - $(CP) $(PKG_INSTALL_DIR)/usr/lib/quickjs/libquickjs.a $(1)/usr/lib/quickjs/ - $(CP) $(PKG_INSTALL_DIR)/usr/lib/quickjs/libquickjs.lto.a $(1)/usr/lib/quickjs/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/quickjs/libquickjs.a $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/quickjs/libquickjs.lto.a $(1)/usr/lib/ $(INSTALL_DIR) $(1)/usr/include/quickjs $(CP) $(PKG_INSTALL_DIR)/usr/include/quickjs/quickjs.h $(1)/usr/include/quickjs/ $(CP) $(PKG_INSTALL_DIR)/usr/include/quickjs/quickjs-libc.h $(1)/usr/include/quickjs/ diff --git a/quickjs/patches/000-build-options.patch b/quickjs/patches/000-build-options.patch index 3000ceb9c..c36f6fc8a 100644 --- a/quickjs/patches/000-build-options.patch +++ b/quickjs/patches/000-build-options.patch @@ -1,5 +1,5 @@ diff --git a/Makefile b/Makefile -index e6ae827..bbd3ce8 100644 +index 49b1f6f..2c96eae 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,8 @@ CONFIG_LTO=y @@ -58,16 +58,7 @@ index e6ae827..bbd3ce8 100644 ifdef CONFIG_LTO CFLAGS_SMALL+=-flto CFLAGS_OPT+=-flto -@@ -175,7 +188,7 @@ QJS_OBJS+=$(OBJDIR)/qjscalc.o - endif - - HOST_LIBS=-lm -ldl -lpthread --LIBS=-lm -+LIBS+=-lm - ifndef CONFIG_WIN32 - LIBS+=-ldl -lpthread - endif -@@ -194,6 +207,8 @@ qjsc$(EXE): $(OBJDIR)/qjsc.o $(QJS_LIB_OBJS) +@@ -195,6 +208,8 @@ qjsc$(EXE): $(OBJDIR)/qjsc.o $(QJS_LIB_OBJS) ifneq ($(CROSS_PREFIX),) @@ -76,7 +67,7 @@ index e6ae827..bbd3ce8 100644 $(QJSC): $(OBJDIR)/qjsc.host.o \ $(patsubst %.o, %.host.o, $(QJS_LIB_OBJS)) $(HOST_CC) $(LDFLAGS) -o $@ $^ $(HOST_LIBS) -@@ -261,6 +276,8 @@ run-test262-32: $(patsubst %.o, %.m32.o, $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS) +@@ -262,6 +277,8 @@ run-test262-32: $(patsubst %.o, %.m32.o, $(OBJDIR)/run-test262.o $(QJS_LIB_OBJS) $(OBJDIR)/%.o: %.c | $(OBJDIR) $(CC) $(CFLAGS_OPT) -c -o $@ $< @@ -85,7 +76,7 @@ index e6ae827..bbd3ce8 100644 $(OBJDIR)/%.host.o: %.c | $(OBJDIR) $(HOST_CC) $(CFLAGS_OPT) -c -o $@ $< -@@ -285,6 +302,8 @@ $(OBJDIR)/%.check.o: %.c | $(OBJDIR) +@@ -286,6 +303,8 @@ $(OBJDIR)/%.check.o: %.c | $(OBJDIR) regexp_test: libregexp.c libunicode.c cutils.c $(CC) $(LDFLAGS) $(CFLAGS) -DTEST -o $@ libregexp.c libunicode.c cutils.c $(LIBS) diff --git a/quickjs/patches/001-no-fenv-dtoa-libbf.patch b/quickjs/patches/001-no-fenv-dtoa-libbf.patch index 57f4e7531..591262420 100644 --- a/quickjs/patches/001-no-fenv-dtoa-libbf.patch +++ b/quickjs/patches/001-no-fenv-dtoa-libbf.patch @@ -1,8 +1,8 @@ diff --git a/quickjs.c b/quickjs.c -index a39ff8f..635c506 100644 +index 7916013..3936eec 100644 --- a/quickjs.c +++ b/quickjs.c -@@ -65,6 +65,16 @@ +@@ -67,6 +67,16 @@ #define CONFIG_PRINTF_RNDN #endif @@ -19,7 +19,7 @@ index a39ff8f..635c506 100644 /* define to include Atomics.* operations which depend on the OS threads */ #if !defined(EMSCRIPTEN) -@@ -11253,6 +11263,11 @@ static char *i64toa(char *buf_end, int64_t n, unsigned int base) +@@ -11299,6 +11309,11 @@ static char *i64toa(char *buf_end, int64_t n, unsigned int base) return q; } @@ -31,7 +31,7 @@ index a39ff8f..635c506 100644 /* buf1 contains the printf result */ static void js_ecvt1(double d, int n_digits, int *decpt, int *sign, char *buf, int rounding_mode, char *buf1, int buf1_size) -@@ -11272,9 +11287,6 @@ static void js_ecvt1(double d, int n_digits, int *decpt, int *sign, char *buf, +@@ -11318,9 +11333,6 @@ static void js_ecvt1(double d, int n_digits, int *decpt, int *sign, char *buf, *decpt = atoi(buf1 + n_digits + 2 + (n_digits > 1)) + 1; } @@ -41,7 +41,7 @@ index a39ff8f..635c506 100644 /* needed because ecvt usually limits the number of digits to 17. Return the number of digits. */ static int js_ecvt(double d, int n_digits, int *decpt, int *sign, char *buf, -@@ -11383,6 +11395,8 @@ static void js_fcvt(char *buf, int buf_size, double d, int n_digits) +@@ -11429,6 +11441,8 @@ static void js_fcvt(char *buf, int buf_size, double d, int n_digits) js_fcvt1(buf, buf_size, d, n_digits, rounding_mode); } @@ -50,7 +50,7 @@ index a39ff8f..635c506 100644 /* radix != 10 is only supported with flags = JS_DTOA_VAR_FORMAT */ /* use as many digits as necessary */ #define JS_DTOA_VAR_FORMAT (0 << 0) -@@ -11396,8 +11410,10 @@ static void js_fcvt(char *buf, int buf_size, double d, int n_digits) +@@ -11442,8 +11456,10 @@ static void js_fcvt(char *buf, int buf_size, double d, int n_digits) /* XXX: slow and maybe not fully correct. Use libbf when it is fast enough. XXX: radix != 10 is only supported for small integers */ @@ -62,7 +62,7 @@ index a39ff8f..635c506 100644 char *q; if (!isfinite(d)) { -@@ -11419,6 +11435,25 @@ static void js_dtoa1(char *buf, double d, int radix, int n_digits, int flags) +@@ -11465,6 +11481,25 @@ static void js_dtoa1(char *buf, double d, int radix, int n_digits, int flags) ptr = i64toa(buf1 + sizeof(buf1), i64, radix); strcpy(buf, ptr); } else { @@ -88,7 +88,7 @@ index a39ff8f..635c506 100644 if (d == 0.0) d = 0.0; /* convert -0 to 0 */ if (flags == JS_DTOA_FRAC_FORMAT) { -@@ -11482,14 +11517,8 @@ static void js_dtoa1(char *buf, double d, int radix, int n_digits, int flags) +@@ -11528,14 +11563,8 @@ static void js_dtoa1(char *buf, double d, int radix, int n_digits, int flags) sprintf(q, "%d", p); } } diff --git a/quickjs/patches/002-fix_std_loadFile.patch b/quickjs/patches/002-fix_std_loadFile.patch new file mode 100644 index 000000000..1eb7ef294 --- /dev/null +++ b/quickjs/patches/002-fix_std_loadFile.patch @@ -0,0 +1,126 @@ +diff --git a/quickjs-libc.c b/quickjs-libc.c +index e180dd0..76182d2 100644 +--- a/quickjs-libc.c ++++ b/quickjs-libc.c +@@ -358,12 +358,89 @@ fail: + return JS_EXCEPTION; + } + ++// For reading files that are not seekable, per second answer from stackoverflow: ++// https://stackoverflow.com/questions/14002954/c-programming-how-to-read-the-whole-file-contents-into-a-buffer ++ ++#define READALL_CHUNK 10*1024 ++ ++static int readall(FILE *f, JSContext *ctx, uint8_t **dataptr, size_t *sizeptr) ++{ ++ uint8_t *data = NULL, *temp; ++ size_t size = 0; ++ size_t used = 0; ++ size_t n; ++ ++ while (1) { ++ if (used + READALL_CHUNK + 1 > size) { ++ size = used + READALL_CHUNK + 1; ++ ++ /* Overflow check. Some ANSI C compilers ++ may optimize this away, though. */ ++ if (size <= used) { ++ if (ctx) ++ js_free(ctx, data); ++ else ++ free(data); ++ return -1; ++ } ++ ++ if (ctx) ++ temp = js_realloc(ctx, data, size); ++ else ++ temp = realloc(data, size); ++ ++ if (temp == NULL) { ++ if (ctx) ++ js_free(ctx, data); ++ else ++ free(data); ++ return -1; ++ } ++ data = temp; ++ } ++ ++ n = fread(data + used, 1, READALL_CHUNK, f); ++ if (n == 0) ++ break; ++ ++ used += n; ++ } ++ ++ if (ferror(f)) { ++ if (ctx) ++ js_free(ctx, data); ++ else ++ free(data); ++ return -1; ++ } ++ ++ if (ctx) ++ temp = js_realloc(ctx, data, used + 1); ++ else ++ temp = realloc(data, used + 1); ++ ++ if (temp == NULL) { ++ if (ctx) ++ js_free(ctx, data); ++ else ++ free(data); ++ return -1; ++ } ++ data = temp; ++ data[used] = '\0'; ++ ++ *dataptr = data; ++ *sizeptr = used; ++ ++ return 0; ++} ++ + uint8_t *js_load_file(JSContext *ctx, size_t *pbuf_len, const char *filename) + { + FILE *f; + uint8_t *buf; + size_t buf_len; +- long lret; ++ long lret = 0; + + f = fopen(filename, "rb"); + if (!f) +@@ -371,7 +448,7 @@ uint8_t *js_load_file(JSContext *ctx, size_t *pbuf_len, const char *filename) + if (fseek(f, 0, SEEK_END) < 0) + goto fail; + lret = ftell(f); +- if (lret < 0) ++ if (lret <= 0) + goto fail; + /* XXX: on Linux, ftell() return LONG_MAX for directories */ + if (lret == LONG_MAX) { +@@ -387,13 +464,19 @@ uint8_t *js_load_file(JSContext *ctx, size_t *pbuf_len, const char *filename) + buf = malloc(buf_len + 1); + if (!buf) + goto fail; +- if (fread(buf, 1, buf_len, f) != buf_len) { +- errno = EIO; ++ buf_len = fread(buf, 1, buf_len, f); ++ if (ferror(f)) { + if (ctx) + js_free(ctx, buf); + else + free(buf); + fail: ++ // Files in proc and sysfs may not be seekable or may falsely ++ // appear to be of zero size. Try to read them in another way. ++ if (lret == 0 && readall(f, ctx, &buf, pbuf_len) == 0) { ++ fclose(f); ++ return buf; ++ } + fclose(f); + return NULL; + }