This is an automated email from the ASF dual-hosted git repository.
nickva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git
The following commit(s) were added to refs/heads/main by this push:
new 741854d6f QuickJS update: faster math ops, return checks, new release
741854d6f is described below
commit 741854d6f8685714bbe51711744d11e16d1c2a10
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Thu Jun 4 13:11:10 2026 -0400
QuickJS update: faster math ops, return checks, new release
* New release 2026-06-04
https://github.com/bellard/quickjs/commit/3d5e064e9dd67c70f7962836505a7fa067bf0a4e
* Check return values of fallible functions
https://github.com/bellard/quickjs/commit/ccfe0764eddc17bc531dcf9fc69f9ee3a2b3e0e2
* Fuzz targets for ES6 modules, JSON, RegExp, and bytecode
https://github.com/bellard/quickjs/commit/8b045501f92617951060ffb31f9db0be745195d9
* Doc updates
https://github.com/bellard/quickjs/commit/cfc846a31c5b60130ca02d121932438bcfc94cd1
* More generic `cpu_count()` for non Linux systems for tests
https://github.com/bellard/quickjs/commit/ad1e7bd3ce00544f86c254fde1f3db20fefa089f
* Fixed microbench with d8
https://github.com/bellard/quickjs/commit/92a3d4d5ea04c98c462161fb881ee00b78176d73
---
.../patches/01-spidermonkey-185-mode.patch | 6 +-
src/couch_quickjs/patches/02-test262-errors.patch | 4 +-
src/couch_quickjs/quickjs/Changelog | 3 +
src/couch_quickjs/quickjs/VERSION | 2 +-
src/couch_quickjs/quickjs/quickjs.c | 74 ++++++++++++++++++----
src/couch_quickjs/quickjs/run-test262.c | 9 ++-
6 files changed, 79 insertions(+), 19 deletions(-)
diff --git a/src/couch_quickjs/patches/01-spidermonkey-185-mode.patch
b/src/couch_quickjs/patches/01-spidermonkey-185-mode.patch
index 5466852aa..19e9316f9 100644
--- a/src/couch_quickjs/patches/01-spidermonkey-185-mode.patch
+++ b/src/couch_quickjs/patches/01-spidermonkey-185-mode.patch
@@ -1,6 +1,6 @@
---- quickjs-master/quickjs.c 2026-06-03 10:18:26
-+++ quickjs/quickjs.c 2026-06-03 14:25:58
-@@ -31873,10 +31873,24 @@
+--- quickjs-master/quickjs.c 2026-06-04 08:53:29
++++ quickjs/quickjs.c 2026-06-04 13:06:09
+@@ -31922,10 +31922,24 @@
if (s->token.val == TOK_FUNCTION ||
(token_is_pseudo_keyword(s, JS_ATOM_async) &&
peek_token(s, TRUE) == TOK_FUNCTION)) {
diff --git a/src/couch_quickjs/patches/02-test262-errors.patch
b/src/couch_quickjs/patches/02-test262-errors.patch
index f1ee61e58..a41cc408f 100644
--- a/src/couch_quickjs/patches/02-test262-errors.patch
+++ b/src/couch_quickjs/patches/02-test262-errors.patch
@@ -1,5 +1,5 @@
---- quickjs-master/test262_errors.txt 2026-06-03 10:18:26
-+++ quickjs/test262_errors.txt 2026-06-03 14:25:58
+--- quickjs-master/test262_errors.txt 2026-06-04 08:53:29
++++ quickjs/test262_errors.txt 2026-06-04 13:06:09
@@ -23,6 +23,8 @@
test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-export-star-as-from-and-import-star-as-and-export.js:74:
SyntaxError: export 'foo' in module
'test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-import-star-as-and-export.js'
is ambiguous
test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-export-star-as-from.js:75:
SyntaxError: export 'foo' in module
'test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-export-star-as-from.js'
is ambiguous
diff --git a/src/couch_quickjs/quickjs/Changelog
b/src/couch_quickjs/quickjs/Changelog
index 697193f3e..f5c536b19 100644
--- a/src/couch_quickjs/quickjs/Changelog
+++ b/src/couch_quickjs/quickjs/Changelog
@@ -1,3 +1,5 @@
+2026-06-04:
+
- added custom malloc for small blocks (11% faster on bench-v8)
- micro optimizations (30% faster on bench-v8)
- added resizable array buffers
@@ -8,6 +10,7 @@
- added added Map and WeakMap upsert methods
- added Math.sumPrecise()
- added regexp duplicate named groups
+- added base64 and hexadecimal encodings for Uint8Array
- misc bug fixes
2025-09-13:
diff --git a/src/couch_quickjs/quickjs/VERSION
b/src/couch_quickjs/quickjs/VERSION
index 433b8f85b..ba2d8bcde 100644
--- a/src/couch_quickjs/quickjs/VERSION
+++ b/src/couch_quickjs/quickjs/VERSION
@@ -1 +1 @@
-2025-09-13
+2026-06-04
diff --git a/src/couch_quickjs/quickjs/quickjs.c
b/src/couch_quickjs/quickjs/quickjs.c
index 05d4fd031..40bb08c1b 100644
--- a/src/couch_quickjs/quickjs/quickjs.c
+++ b/src/couch_quickjs/quickjs/quickjs.c
@@ -19733,9 +19733,24 @@ static JSValue JS_CallInternal(JSContext *caller_ctx,
JSValueConst func_obj,
sp[-2] = JS_NewInt32(ctx, r);
}
sp--;
- } else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) {
- sp[-2] = __JS_NewFloat64(ctx, JS_VALUE_GET_FLOAT64(op1) +
- JS_VALUE_GET_FLOAT64(op2));
+ } else if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1)) ||
+ JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ double d1, d2;
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1))) {
+ d1 = JS_VALUE_GET_FLOAT64(op1);
+ } else if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) {
+ d1 = JS_VALUE_GET_INT(op1);
+ } else {
+ goto add_slow_case;
+ }
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ d2 = JS_VALUE_GET_FLOAT64(op2);
+ } else if (JS_VALUE_GET_TAG(op2) == JS_TAG_INT) {
+ d2 = JS_VALUE_GET_INT(op2);
+ } else {
+ goto add_slow_case;
+ }
+ sp[-2] = __JS_NewFloat64(ctx, d1 + d2);
sp--;
} else if (JS_IsString(op1) && JS_IsString(op2)) {
sp[-2] = JS_ConcatString(ctx, op1, op2);
@@ -19743,6 +19758,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx,
JSValueConst func_obj,
if (JS_IsException(sp[-1]))
goto exception;
} else {
+ add_slow_case:
sf->cur_pc = pc;
if (js_add_slow(ctx, sp))
goto exception;
@@ -19813,9 +19829,24 @@ static JSValue JS_CallInternal(JSContext *caller_ctx,
JSValueConst func_obj,
sp[-2] = JS_NewInt32(ctx, r);
}
sp--;
- } else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) {
- sp[-2] = __JS_NewFloat64(ctx, JS_VALUE_GET_FLOAT64(op1) -
- JS_VALUE_GET_FLOAT64(op2));
+ } else if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1)) ||
+ JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ double d1, d2;
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1))) {
+ d1 = JS_VALUE_GET_FLOAT64(op1);
+ } else if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) {
+ d1 = JS_VALUE_GET_INT(op1);
+ } else {
+ goto binary_arith_slow;
+ }
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ d2 = JS_VALUE_GET_FLOAT64(op2);
+ } else if (JS_VALUE_GET_TAG(op2) == JS_TAG_INT) {
+ d2 = JS_VALUE_GET_INT(op2);
+ } else {
+ goto binary_arith_slow;
+ }
+ sp[-2] = __JS_NewFloat64(ctx, d1 - d2);
sp--;
} else {
goto binary_arith_slow;
@@ -19845,8 +19876,24 @@ static JSValue JS_CallInternal(JSContext *caller_ctx,
JSValueConst func_obj,
}
sp[-2] = JS_NewInt32(ctx, r);
sp--;
- } else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) {
- d = JS_VALUE_GET_FLOAT64(op1) * JS_VALUE_GET_FLOAT64(op2);
+ } else if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1)) ||
+ JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ double d1, d2;
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1))) {
+ d1 = JS_VALUE_GET_FLOAT64(op1);
+ } else if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) {
+ d1 = JS_VALUE_GET_INT(op1);
+ } else {
+ goto binary_arith_slow;
+ }
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ d2 = JS_VALUE_GET_FLOAT64(op2);
+ } else if (JS_VALUE_GET_TAG(op2) == JS_TAG_INT) {
+ d2 = JS_VALUE_GET_INT(op2);
+ } else {
+ goto binary_arith_slow;
+ }
+ d = d1 * d2;
mul_fp_res:
sp[-2] = __JS_NewFloat64(ctx, d);
sp--;
@@ -28671,7 +28718,8 @@ static __exception int js_parse_for_in_of(JSParseState
*s, int label_name,
int chunk_size = pos_expr - pos_next;
int offset = bc->size - pos_next;
int i;
- dbuf_claim(bc, chunk_size);
+ if (dbuf_claim(bc, chunk_size))
+ return -1;
dbuf_put(bc, bc->buf + pos_next, chunk_size);
memset(bc->buf + pos_next, OP_nop, chunk_size);
/* `next` part ends with a goto */
@@ -29077,7 +29125,8 @@ static __exception int
js_parse_statement_or_decl(JSParseState *s,
int chunk_size = pos_body - pos_cont;
int offset = bc->size - pos_cont;
int i;
- dbuf_claim(bc, chunk_size);
+ if (dbuf_claim(bc, chunk_size))
+ goto fail;
dbuf_put(bc, bc->buf + pos_cont, chunk_size);
memset(bc->buf + pos_cont, OP_nop, chunk_size);
/* increment part ends with a goto */
@@ -38019,11 +38068,14 @@ static int JS_WriteObjectRec(BCWriterState *s,
JSValueConst obj)
case JS_TAG_STRING_ROPE:
{
JSValue str;
+ int ret;
str = JS_ToString(s->ctx, obj);
if (JS_IsException(str))
goto fail;
- JS_WriteObjectRec(s, str);
+ ret = JS_WriteObjectRec(s, str);
JS_FreeValue(s->ctx, str);
+ if (ret)
+ goto fail;
}
break;
case JS_TAG_FUNCTION_BYTECODE:
diff --git a/src/couch_quickjs/quickjs/run-test262.c
b/src/couch_quickjs/quickjs/run-test262.c
index 8e2a7e7a5..81811b58d 100644
--- a/src/couch_quickjs/quickjs/run-test262.c
+++ b/src/couch_quickjs/quickjs/run-test262.c
@@ -151,7 +151,7 @@ static int cpu_count(void)
count += 1 & (procmask >> i);
return count;
}
-#else
+#elif defined(__linux__)
/* return the number of available physical cores or -1 if not available */
static int get_cpu_info_physical_cores(void)
{
@@ -215,7 +215,12 @@ static int cpu_count(void)
n = 1;
return n;
}
-#endif /* !_WIN32 */
+#else /* __linux__ */
+static int cpu_count(void)
+{
+ return sysconf(_SC_NPROCESSORS_ONLN);
+}
+#endif /* !__linux__ */
static void init_thread_local_storage(ThreadLocalStorage *tls)
{