This is an automated email from the ASF dual-hosted git repository.
vatamane 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 d76933015 QuickJS Update
d76933015 is described below
commit d76933015241da322b8f850817e98951ebe83dc8
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Mon Oct 6 23:35:31 2025 -0400
QuickJS Update
* Update test262. Expand tests from 81934 to running 83147 tests
https://github.com/bellard/quickjs/commit/31663a930d2d17b92d562cd3e8a1d4792be4d145
* Improve error handling in Promise.withResolvers (we don't use these)
https://github.com/bellard/quickjs/commit/f1253f2ab53d3adbe918fe1d68710269f0c2335e
* Optimize array creation
https://github.com/bellard/quickjs/commit/f4951efd94344985cf47bfedf10e8b2c43d3cd21
* Optimized global variable access
https://github.com/bellard/quickjs/commit/2c90110287ac2646d74d39d231c261a6fcd8d4df
* Inline fast path for get_field, get_field2 and put_field
https://github.com/bellard/quickjs/commit/57f8ec0099e2f83dc9bc118d74e69c3f87a4af2b
* Remove `JS_PROP_NO_ADD` (internal property flag, unused)
https://github.com/bellard/quickjs/commit/64c55c6dafb40a2d2cdb1e7f373ed901dd771273
* Optimize array access by inlining `get_array_el(2/3)` and `put_array_el`
https://github.com/bellard/quickjs/commit/8e8eefb922b205bb56de14e0279b4e42b5f3f460
---
.../patches/01-spidermonkey-185-mode.patch | 6 +-
src/couch_quickjs/patches/02-test262-errors.patch | 14 +-
src/couch_quickjs/quickjs/Makefile | 2 +-
src/couch_quickjs/quickjs/quickjs-opcode.h | 2 -
src/couch_quickjs/quickjs/quickjs.c | 580 +++++++++++----------
src/couch_quickjs/quickjs/quickjs.h | 3 +-
src/couch_quickjs/quickjs/test262.conf | 4 +
src/couch_quickjs/quickjs/test262_errors.txt | 91 ++--
src/couch_quickjs/quickjs/tests/test262.patch | 65 +--
9 files changed, 387 insertions(+), 380 deletions(-)
diff --git a/src/couch_quickjs/patches/01-spidermonkey-185-mode.patch
b/src/couch_quickjs/patches/01-spidermonkey-185-mode.patch
index a16e9e475..681eedbdc 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 2025-09-30 04:35:00
-+++ quickjs/quickjs.c 2025-09-30 11:38:07
-@@ -30784,10 +30784,24 @@
+--- quickjs-master/quickjs.c 2025-10-04 04:46:29
++++ quickjs/quickjs.c 2025-10-06 23:16:06
+@@ -30866,10 +30866,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 4baf0c894..07644016f 100644
--- a/src/couch_quickjs/patches/02-test262-errors.patch
+++ b/src/couch_quickjs/patches/02-test262-errors.patch
@@ -1,11 +1,11 @@
---- quickjs-master/test262_errors.txt 2025-09-30 04:35:00
-+++ quickjs/test262_errors.txt 2025-09-30 11:47:32
-@@ -5,6 +5,8 @@
-
test262/test/annexB/language/expressions/assignmenttargettype/callexpression-in-prefix-update.js:27:
SyntaxError: invalid increment/decrement operand
+--- quickjs-master/test262_errors.txt 2025-10-04 04:46:29
++++ quickjs/test262_errors.txt 2025-10-06 23:19:01
+@@ -6,6 +6,8 @@
test262/test/annexB/language/expressions/assignmenttargettype/callexpression.js:33:
SyntaxError: invalid assignment left-hand side
test262/test/annexB/language/expressions/assignmenttargettype/cover-callexpression-and-asyncarrowhead.js:20:
SyntaxError: invalid assignment left-hand side
+ test262/test/language/identifier-resolution/assign-to-global-undefined.js:20:
strict mode: expected error
+test262/test/language/statements/expression/S12.4_A1.js:15: unexpected error
type: Test262: This statement should not be evaluated.
+test262/test/language/statements/expression/S12.4_A1.js:15: strict mode:
unexpected error type: Test262: This statement should not be evaluated.
- test262/test/staging/sm/Date/UTC-convert-all-arguments.js:75: Test262Error:
index 1: expected 42, got Error: didn't throw Expected SameValue(«Error: didn't
throw», «42») to be true
- test262/test/staging/sm/Date/constructor-convert-all-arguments.js:75:
Test262Error: index undefined: expected 42, got Error: didn't throw Expected
SameValue(«Error: didn't throw», «42») to be true
- test262/test/staging/sm/Date/two-digit-years.js:76: Test262Error: Expected
SameValue(«915177600000», «NaN») to be true
+ test262/test/staging/sm/Date/UTC-convert-all-arguments.js:13: Test262Error:
index 1: expected 42, got Error: didn't throw Expected SameValue(«Error: didn't
throw», «42») to be true
+ test262/test/staging/sm/Date/UTC-convert-all-arguments.js:13: strict mode:
Test262Error: index 1: expected 42, got Error: didn't throw Expected
SameValue(«Error: didn't throw», «42») to be true
+ test262/test/staging/sm/Date/constructor-convert-all-arguments.js:13:
Test262Error: index undefined: expected 42, got Error: didn't throw Expected
SameValue(«Error: didn't throw», «42») to be true
diff --git a/src/couch_quickjs/quickjs/Makefile
b/src/couch_quickjs/quickjs/Makefile
index 9dab23a1e..0ddb759f3 100644
--- a/src/couch_quickjs/quickjs/Makefile
+++ b/src/couch_quickjs/quickjs/Makefile
@@ -55,7 +55,7 @@ PREFIX?=/usr/local
#CONFIG_UBSAN=y
# TEST262 bootstrap config: commit id and shallow "since" parameter
-TEST262_COMMIT?=a5e69a1534de88d1eb29b76657d84c8541b72df7
+TEST262_COMMIT?=06dfddc4ebd21c39e1ce44f3e13b56b0dfda28e3
TEST262_SINCE?=2025-09-01
OBJDIR=.obj
diff --git a/src/couch_quickjs/quickjs/quickjs-opcode.h
b/src/couch_quickjs/quickjs/quickjs-opcode.h
index 814a7cbaa..86c3ec406 100644
--- a/src/couch_quickjs/quickjs/quickjs-opcode.h
+++ b/src/couch_quickjs/quickjs/quickjs-opcode.h
@@ -123,12 +123,10 @@ DEF( regexp, 1, 2, 1, none) /* create a RegExp
object from the pattern a
DEF( get_super, 1, 1, 1, none)
DEF( import, 1, 2, 1, none) /* dynamic module import */
-DEF( check_var, 5, 0, 1, atom) /* check if a variable exists */
DEF( get_var_undef, 5, 0, 1, atom) /* push undefined if the variable does not
exist */
DEF( get_var, 5, 0, 1, atom) /* throw an exception if the variable does
not exist */
DEF( put_var, 5, 1, 0, atom) /* must come after get_var */
DEF( put_var_init, 5, 1, 0, atom) /* must come after put_var. Used to
initialize a global lexical variable */
-DEF( put_var_strict, 5, 2, 0, atom) /* for strict mode variable write */
DEF( get_ref_value, 1, 2, 3, none)
DEF( put_ref_value, 1, 3, 0, none)
diff --git a/src/couch_quickjs/quickjs/quickjs.c
b/src/couch_quickjs/quickjs/quickjs.c
index 01394203b..9d795238d 100644
--- a/src/couch_quickjs/quickjs/quickjs.c
+++ b/src/couch_quickjs/quickjs/quickjs.c
@@ -8914,6 +8914,57 @@ static JSValue js_allocate_fast_array(JSContext *ctx,
int64_t len)
return arr;
}
+static JSValue js_create_array(JSContext *ctx, int len, JSValueConst *tab)
+{
+ JSValue obj;
+ JSObject *p;
+ int i;
+
+ obj = JS_NewArray(ctx);
+ if (JS_IsException(obj))
+ return JS_EXCEPTION;
+ if (len > 0) {
+ p = JS_VALUE_GET_OBJ(obj);
+ if (expand_fast_array(ctx, p, len) < 0) {
+ JS_FreeValue(ctx, obj);
+ return JS_EXCEPTION;
+ }
+ p->u.array.count = len;
+ for(i = 0; i < len; i++)
+ p->u.array.u.values[i] = JS_DupValue(ctx, tab[i]);
+ /* update the 'length' field */
+ set_value(ctx, &p->prop[0].u.value, JS_NewInt32(ctx, len));
+ }
+ return obj;
+}
+
+static JSValue js_create_array_free(JSContext *ctx, int len, JSValue *tab)
+{
+ JSValue obj;
+ JSObject *p;
+ int i;
+
+ obj = JS_NewArray(ctx);
+ if (JS_IsException(obj))
+ goto fail;
+ if (len > 0) {
+ p = JS_VALUE_GET_OBJ(obj);
+ if (expand_fast_array(ctx, p, len) < 0) {
+ JS_FreeValue(ctx, obj);
+ fail:
+ for(i = 0; i < len; i++)
+ JS_FreeValue(ctx, tab[i]);
+ return JS_EXCEPTION;
+ }
+ p->u.array.count = len;
+ for(i = 0; i < len; i++)
+ p->u.array.u.values[i] = tab[i];
+ /* update the 'length' field */
+ set_value(ctx, &p->prop[0].u.value, JS_NewInt32(ctx, len));
+ }
+ return obj;
+}
+
static void js_free_desc(JSContext *ctx, JSPropertyDescriptor *desc)
{
JS_FreeValue(ctx, desc->getter);
@@ -8922,11 +8973,9 @@ static void js_free_desc(JSContext *ctx,
JSPropertyDescriptor *desc)
}
/* return -1 in case of exception or TRUE or FALSE. Warning: 'val' is
- freed by the function. 'flags' is a bitmask of JS_PROP_NO_ADD,
- JS_PROP_THROW or JS_PROP_THROW_STRICT. If JS_PROP_NO_ADD is set,
- the new property is not added and an error is raised. 'this_obj' is
- the receiver. If obj != this_obj, then obj must be an object
- (Reflect.set case). */
+ freed by the function. 'flags' is a bitmask of JS_PROP_THROW and
+ JS_PROP_THROW_STRICT. 'this_obj' is the receiver. If obj !=
+ this_obj, then obj must be an object (Reflect.set case). */
int JS_SetPropertyInternal(JSContext *ctx, JSValueConst obj,
JSAtom prop, JSValue val, JSValueConst this_obj,
int flags)
{
@@ -9122,12 +9171,6 @@ int JS_SetPropertyInternal(JSContext *ctx, JSValueConst
obj,
}
}
- if (unlikely(flags & JS_PROP_NO_ADD)) {
- JS_FreeValue(ctx, val);
- JS_ThrowReferenceErrorNotDefined(ctx, prop);
- return -1;
- }
-
if (unlikely(!p)) {
JS_FreeValue(ctx, val);
return JS_ThrowTypeErrorOrFalse(ctx, flags, "not an object");
@@ -10124,8 +10167,8 @@ static int JS_DefineGlobalFunction(JSContext *ctx,
JSAtom prop,
return 0;
}
-static JSValue JS_GetGlobalVar(JSContext *ctx, JSAtom prop,
- BOOL throw_ref_error)
+static inline JSValue JS_GetGlobalVar(JSContext *ctx, JSAtom prop,
+ BOOL throw_ref_error)
{
JSObject *p;
JSShapeProperty *prs;
@@ -10140,6 +10183,14 @@ static JSValue JS_GetGlobalVar(JSContext *ctx, JSAtom
prop,
return JS_ThrowReferenceErrorUninitialized(ctx, prs->atom);
return JS_DupValue(ctx, pr->u.value);
}
+
+ /* fast path */
+ p = JS_VALUE_GET_OBJ(ctx->global_obj);
+ prs = find_own_property(&pr, p, prop);
+ if (prs) {
+ if (likely((prs->flags & JS_PROP_TMASK) == 0))
+ return JS_DupValue(ctx, pr->u.value);
+ }
return JS_GetPropertyInternal(ctx, ctx->global_obj, prop,
ctx->global_obj, throw_ref_error);
}
@@ -10181,37 +10232,16 @@ static int JS_GetGlobalVarRef(JSContext *ctx, JSAtom
prop, JSValue *sp)
return 0;
}
-/* use for strict variable access: test if the variable exists */
-static int JS_CheckGlobalVar(JSContext *ctx, JSAtom prop)
-{
- JSObject *p;
- JSShapeProperty *prs;
- int ret;
-
- /* no exotic behavior is possible in global_var_obj */
- p = JS_VALUE_GET_OBJ(ctx->global_var_obj);
- prs = find_own_property1(p, prop);
- if (prs) {
- ret = TRUE;
- } else {
- ret = JS_HasProperty(ctx, ctx->global_obj, prop);
- if (ret < 0)
- return -1;
- }
- return ret;
-}
-
/* flag = 0: normal variable write
flag = 1: initialize lexical variable
- flag = 2: normal variable write, strict check was done before
*/
-static int JS_SetGlobalVar(JSContext *ctx, JSAtom prop, JSValue val,
- int flag)
+static inline int JS_SetGlobalVar(JSContext *ctx, JSAtom prop, JSValue val,
+ int flag)
{
JSObject *p;
JSShapeProperty *prs;
JSProperty *pr;
- int flags;
+ int ret;
/* no exotic behavior is possible in global_var_obj */
p = JS_VALUE_GET_OBJ(ctx->global_var_obj);
@@ -10232,13 +10262,30 @@ static int JS_SetGlobalVar(JSContext *ctx, JSAtom
prop, JSValue val,
set_value(ctx, &pr->u.value, val);
return 0;
}
- /* XXX: add a fast path where the property exists and the object
- is not exotic. Otherwise do as in OP_put_ref_value and remove
- JS_PROP_NO_ADD which is no longer necessary */
- flags = JS_PROP_THROW_STRICT;
- if (is_strict_mode(ctx))
- flags |= JS_PROP_NO_ADD;
- return JS_SetPropertyInternal(ctx, ctx->global_obj, prop, val,
ctx->global_obj, flags);
+
+ p = JS_VALUE_GET_OBJ(ctx->global_obj);
+ prs = find_own_property(&pr, p, prop);
+ if (prs) {
+ if (likely((prs->flags & (JS_PROP_TMASK | JS_PROP_WRITABLE |
+ JS_PROP_LENGTH)) == JS_PROP_WRITABLE)) {
+ /* fast path */
+ set_value(ctx, &pr->u.value, val);
+ return 0;
+ }
+ }
+ /* slow path */
+ ret = JS_HasProperty(ctx, ctx->global_obj, prop);
+ if (ret < 0) {
+ JS_FreeValue(ctx, val);
+ return -1;
+ }
+ if (ret == 0 && is_strict_mode(ctx)) {
+ JS_FreeValue(ctx, val);
+ JS_ThrowReferenceErrorNotDefined(ctx, prop);
+ return -1;
+ }
+ return JS_SetPropertyInternal(ctx, ctx->global_obj, prop, val,
ctx->global_obj,
+ JS_PROP_THROW_STRICT);
}
/* return -1, FALSE or TRUE */
@@ -15620,26 +15667,6 @@ static JSValue js_build_mapped_arguments(JSContext
*ctx, int argc,
return JS_EXCEPTION;
}
-static JSValue js_build_rest(JSContext *ctx, int first, int argc, JSValueConst
*argv)
-{
- JSValue val;
- int i, ret;
-
- val = JS_NewArray(ctx);
- if (JS_IsException(val))
- return val;
- for (i = first; i < argc; i++) {
- ret = JS_DefinePropertyValueUint32(ctx, val, i - first,
- JS_DupValue(ctx, argv[i]),
- JS_PROP_C_W_E);
- if (ret < 0) {
- JS_FreeValue(ctx, val);
- return JS_EXCEPTION;
- }
- }
- return val;
-}
-
static JSValue build_for_in_iterator(JSContext *ctx, JSValue obj)
{
JSObject *p, *p1;
@@ -17122,7 +17149,8 @@ static JSValue JS_CallInternal(JSContext *caller_ctx,
JSValueConst func_obj,
{
int first = get_u16(pc);
pc += 2;
- *sp++ = js_build_rest(ctx, first, argc, (JSValueConst *)argv);
+ first = min_int(first, argc);
+ *sp++ = js_create_array(ctx, argc - first, (JSValueConst
*)(argv + first));
if (unlikely(JS_IsException(sp[-1])))
goto exception;
}
@@ -17345,27 +17373,13 @@ static JSValue JS_CallInternal(JSContext *caller_ctx,
JSValueConst func_obj,
}
BREAK;
CASE(OP_array_from):
- {
- int i, ret;
-
- call_argc = get_u16(pc);
- pc += 2;
- ret_val = JS_NewArray(ctx);
- if (unlikely(JS_IsException(ret_val)))
- goto exception;
- call_argv = sp - call_argc;
- for(i = 0; i < call_argc; i++) {
- ret = JS_DefinePropertyValue(ctx, ret_val,
__JS_AtomFromUInt32(i), call_argv[i],
- JS_PROP_C_W_E |
JS_PROP_THROW);
- call_argv[i] = JS_UNDEFINED;
- if (ret < 0) {
- JS_FreeValue(ctx, ret_val);
- goto exception;
- }
- }
- sp -= call_argc;
- *sp++ = ret_val;
- }
+ call_argc = get_u16(pc);
+ pc += 2;
+ ret_val = js_create_array_free(ctx, call_argc, sp - call_argc);
+ sp -= call_argc;
+ if (unlikely(JS_IsException(ret_val)))
+ goto exception;
+ *sp++ = ret_val;
BREAK;
CASE(OP_apply):
@@ -17579,21 +17593,6 @@ static JSValue JS_CallInternal(JSContext *caller_ctx,
JSValueConst func_obj,
}
BREAK;
- CASE(OP_check_var):
- {
- int ret;
- JSAtom atom;
- atom = get_u32(pc);
- pc += 4;
- sf->cur_pc = pc;
-
- ret = JS_CheckGlobalVar(ctx, atom);
- if (ret < 0)
- goto exception;
- *sp++ = JS_NewBool(ctx, ret);
- }
- BREAK;
-
CASE(OP_get_var_undef):
CASE(OP_get_var):
{
@@ -17626,26 +17625,6 @@ static JSValue JS_CallInternal(JSContext *caller_ctx,
JSValueConst func_obj,
}
BREAK;
- CASE(OP_put_var_strict):
- {
- int ret;
- JSAtom atom;
- atom = get_u32(pc);
- pc += 4;
- sf->cur_pc = pc;
-
- /* sp[-2] is JS_TRUE or JS_FALSE */
- if (unlikely(!JS_VALUE_GET_INT(sp[-2]))) {
- JS_ThrowReferenceErrorNotDefined(ctx, atom);
- goto exception;
- }
- ret = JS_SetGlobalVar(ctx, atom, sp[-1], 2);
- sp -= 2;
- if (unlikely(ret < 0))
- goto exception;
- }
- BREAK;
-
CASE(OP_check_define_var):
{
JSAtom atom;
@@ -18249,51 +18228,104 @@ static JSValue JS_CallInternal(JSContext
*caller_ctx, JSValueConst func_obj,
}
BREAK;
- CASE(OP_get_field):
- {
- JSValue val;
- JSAtom atom;
- atom = get_u32(pc);
- pc += 4;
-
- sf->cur_pc = pc;
- val = JS_GetProperty(ctx, sp[-1], atom);
- if (unlikely(JS_IsException(val)))
- goto exception;
- JS_FreeValue(ctx, sp[-1]);
- sp[-1] = val;
+#define GET_FIELD_INLINE(name, keep) \
+ { \
+ JSValue val, obj; \
+ JSAtom atom; \
+ JSObject *p; \
+ JSProperty *pr; \
+ JSShapeProperty *prs; \
+ \
+ atom = get_u32(pc); \
+ pc += 4; \
+ \
+ obj = sp[-1]; \
+ if (likely(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT)) { \
+ p = JS_VALUE_GET_OBJ(obj); \
+ for(;;) { \
+ prs = find_own_property(&pr, p, atom); \
+ if (prs) { \
+ /* found */ \
+ if (unlikely(prs->flags & JS_PROP_TMASK)) \
+ goto name ## _slow_path; \
+ val = JS_DupValue(ctx, pr->u.value); \
+ break; \
+ } \
+ if (unlikely(p->is_exotic)) { \
+ /* XXX: should avoid the slow path for arrays \
+ and typed arrays by ensuring that 'prop' is \
+ not numeric */ \
+ obj = JS_MKPTR(JS_TAG_OBJECT, p); \
+ goto name ## _slow_path; \
+ } \
+ p = p->shape->proto; \
+ if (!p) { \
+ val = JS_UNDEFINED; \
+ break; \
+ } \
+ } \
+ } else { \
+ name ## _slow_path: \
+ sf->cur_pc = pc; \
+ val = JS_GetPropertyInternal(ctx, obj, atom, sp[-1], 0); \
+ if (unlikely(JS_IsException(val))) \
+ goto exception; \
+ } \
+ if (keep) { \
+ *sp++ = val; \
+ } else { \
+ JS_FreeValue(ctx, sp[-1]); \
+ sp[-1] = val; \
+ } \
}
+
+
+ CASE(OP_get_field):
+ GET_FIELD_INLINE(get_field, 0);
BREAK;
CASE(OP_get_field2):
- {
- JSValue val;
- JSAtom atom;
- atom = get_u32(pc);
- pc += 4;
-
- sf->cur_pc = pc;
- val = JS_GetProperty(ctx, sp[-1], atom);
- if (unlikely(JS_IsException(val)))
- goto exception;
- *sp++ = val;
- }
+ GET_FIELD_INLINE(get_field2, 1);
BREAK;
CASE(OP_put_field):
{
int ret;
+ JSValue obj;
JSAtom atom;
+ JSObject *p;
+ JSProperty *pr;
+ JSShapeProperty *prs;
+
atom = get_u32(pc);
pc += 4;
- sf->cur_pc = pc;
- ret = JS_SetPropertyInternal(ctx, sp[-2], atom, sp[-1], sp[-2],
- JS_PROP_THROW_STRICT);
- JS_FreeValue(ctx, sp[-2]);
- sp -= 2;
- if (unlikely(ret < 0))
- goto exception;
+ obj = sp[-2];
+ if (likely(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT)) {
+ p = JS_VALUE_GET_OBJ(obj);
+ prs = find_own_property(&pr, p, atom);
+ if (!prs)
+ goto put_field_slow_path;
+ if (likely((prs->flags & (JS_PROP_TMASK | JS_PROP_WRITABLE
|
+ JS_PROP_LENGTH)) ==
JS_PROP_WRITABLE)) {
+ /* fast path */
+ set_value(ctx, &pr->u.value, sp[-1]);
+ } else {
+ goto put_field_slow_path;
+ }
+ JS_FreeValue(ctx, obj);
+ sp -= 2;
+ } else {
+ put_field_slow_path:
+ sf->cur_pc = pc;
+ ret = JS_SetPropertyInternal(ctx, obj, atom, sp[-1], obj,
+ JS_PROP_THROW_STRICT);
+ JS_FreeValue(ctx, obj);
+ sp -= 2;
+ if (unlikely(ret < 0))
+ goto exception;
+ }
+
}
BREAK;
@@ -18475,61 +18507,95 @@ static JSValue JS_CallInternal(JSContext *caller_ctx,
JSValueConst func_obj,
}
BREAK;
- CASE(OP_get_array_el):
- {
- JSValue val;
-
- sf->cur_pc = pc;
- val = JS_GetPropertyValue(ctx, sp[-2], sp[-1]);
- JS_FreeValue(ctx, sp[-2]);
- sp[-2] = val;
- sp--;
- if (unlikely(JS_IsException(val)))
- goto exception;
+#define GET_ARRAY_EL_INLINE(name, keep) \
+ { \
+ JSValue val, obj, prop; \
+ JSObject *p; \
+ uint32_t idx; \
+ \
+ obj = sp[-2]; \
+ prop = sp[-1]; \
+ if (likely(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT && \
+ JS_VALUE_GET_TAG(prop) == JS_TAG_INT)) { \
+ p = JS_VALUE_GET_OBJ(obj); \
+ idx = JS_VALUE_GET_INT(prop); \
+ if (unlikely(p->class_id != JS_CLASS_ARRAY)) \
+ goto name ## _slow_path; \
+ if (unlikely(idx >= p->u.array.count)) \
+ goto name ## _slow_path; \
+ val = JS_DupValue(ctx, p->u.array.u.values[idx]); \
+ } else { \
+ name ## _slow_path: \
+ sf->cur_pc = pc; \
+ val = JS_GetPropertyValue(ctx, obj, prop); \
+ if (unlikely(JS_IsException(val))) { \
+ if (keep) \
+ sp[-1] = JS_UNDEFINED; \
+ else \
+ sp--; \
+ goto exception; \
+ } \
+ } \
+ if (keep) { \
+ sp[-1] = val; \
+ } else { \
+ JS_FreeValue(ctx, obj); \
+ sp[-2] = val; \
+ sp--; \
+ } \
}
+
+ CASE(OP_get_array_el):
+ GET_ARRAY_EL_INLINE(get_array_el, 0);
BREAK;
CASE(OP_get_array_el2):
- {
- JSValue val;
-
- sf->cur_pc = pc;
- val = JS_GetPropertyValue(ctx, sp[-2], sp[-1]);
- sp[-1] = val;
- if (unlikely(JS_IsException(val)))
- goto exception;
- }
+ GET_ARRAY_EL_INLINE(get_array_el2, 1);
BREAK;
CASE(OP_get_array_el3):
{
JSValue val;
+ JSObject *p;
+ uint32_t idx;
- switch (JS_VALUE_GET_TAG(sp[-2])) {
- case JS_TAG_INT:
- case JS_TAG_STRING:
- case JS_TAG_SYMBOL:
- /* undefined and null are tested in JS_GetPropertyValue()
*/
- break;
- default:
- /* must be tested nefore JS_ToPropertyKey */
- if (unlikely(JS_IsUndefined(sp[-2]) || JS_IsNull(sp[-2])))
{
- JS_ThrowTypeError(ctx, "value has no property");
- goto exception;
+ if (likely(JS_VALUE_GET_TAG(sp[-2]) == JS_TAG_OBJECT &&
+ JS_VALUE_GET_TAG(sp[-1]) == JS_TAG_INT)) {
+ p = JS_VALUE_GET_OBJ(sp[-2]);
+ idx = JS_VALUE_GET_INT(sp[-1]);
+ if (unlikely(p->class_id != JS_CLASS_ARRAY))
+ goto get_array_el3_slow_path;
+ if (unlikely(idx >= p->u.array.count))
+ goto get_array_el3_slow_path;
+ val = JS_DupValue(ctx, p->u.array.u.values[idx]);
+ } else {
+ get_array_el3_slow_path:
+ switch (JS_VALUE_GET_TAG(sp[-1])) {
+ case JS_TAG_INT:
+ case JS_TAG_STRING:
+ case JS_TAG_SYMBOL:
+ /* undefined and null are tested in
JS_GetPropertyValue() */
+ break;
+ default:
+ /* must be tested before JS_ToPropertyKey */
+ if (unlikely(JS_IsUndefined(sp[-2]) ||
JS_IsNull(sp[-2]))) {
+ JS_ThrowTypeError(ctx, "value has no property");
+ goto exception;
+ }
+ sf->cur_pc = pc;
+ ret_val = JS_ToPropertyKey(ctx, sp[-1]);
+ if (JS_IsException(ret_val))
+ goto exception;
+ JS_FreeValue(ctx, sp[-1]);
+ sp[-1] = ret_val;
+ break;
}
sf->cur_pc = pc;
- ret_val = JS_ToPropertyKey(ctx, sp[-1]);
- if (JS_IsException(ret_val))
+ val = JS_GetPropertyValue(ctx, sp[-2], JS_DupValue(ctx,
sp[-1]));
+ if (unlikely(JS_IsException(val)))
goto exception;
- JS_FreeValue(ctx, sp[-1]);
- sp[-1] = ret_val;
- break;
}
- sf->cur_pc = pc;
- val = JS_GetPropertyValue(ctx, sp[-2], JS_DupValue(ctx,
sp[-1]));
*sp++ = val;
- if (unlikely(JS_IsException(val)))
- goto exception;
}
BREAK;
@@ -18594,13 +18660,29 @@ static JSValue JS_CallInternal(JSContext *caller_ctx,
JSValueConst func_obj,
CASE(OP_put_array_el):
{
int ret;
+ JSObject *p;
+ uint32_t idx;
- sf->cur_pc = pc;
- ret = JS_SetPropertyValue(ctx, sp[-3], sp[-2], sp[-1],
JS_PROP_THROW_STRICT);
- JS_FreeValue(ctx, sp[-3]);
- sp -= 3;
- if (unlikely(ret < 0))
- goto exception;
+ if (likely(JS_VALUE_GET_TAG(sp[-3]) == JS_TAG_OBJECT &&
+ JS_VALUE_GET_TAG(sp[-2]) == JS_TAG_INT)) {
+ p = JS_VALUE_GET_OBJ(sp[-3]);
+ idx = JS_VALUE_GET_INT(sp[-2]);
+ if (unlikely(p->class_id != JS_CLASS_ARRAY))
+ goto put_array_el_slow_path;
+ if (unlikely(idx >= (uint32_t)p->u.array.count))
+ goto put_array_el_slow_path;
+ set_value(ctx, &p->u.array.u.values[idx], sp[-1]);
+ JS_FreeValue(ctx, sp[-3]);
+ sp -= 3;
+ } else {
+ put_array_el_slow_path:
+ sf->cur_pc = pc;
+ ret = JS_SetPropertyValue(ctx, sp[-3], sp[-2], sp[-1],
JS_PROP_THROW_STRICT);
+ JS_FreeValue(ctx, sp[-3]);
+ sp -= 3;
+ if (unlikely(ret < 0))
+ goto exception;
+ }
}
BREAK;
@@ -31574,20 +31656,10 @@ static int optimize_scope_make_global_ref(JSContext
*ctx, JSFunctionDef *s,
JSAtom var_name)
{
int label_pos, end_pos, pos, op;
- BOOL is_strict;
- is_strict = ((s->js_mode & JS_MODE_STRICT) != 0);
/* replace the reference get/put with normal variable
accesses */
- if (is_strict) {
- /* need to check if the variable exists before evaluating the right
- expression */
- /* XXX: need an extra OP_true if destructuring an array */
- dbuf_putc(bc, OP_check_var);
- dbuf_put_u32(bc, JS_DupAtom(ctx, var_name));
- } else {
- /* XXX: need 2 extra OP_true if destructuring an array */
- }
+ /* XXX: need 2 extra OP_true if destructuring an array */
if (bc_buf[pos_next] == OP_get_ref_value) {
dbuf_putc(bc, OP_get_var);
dbuf_put_u32(bc, JS_DupAtom(ctx, var_name));
@@ -31601,34 +31673,10 @@ static int optimize_scope_make_global_ref(JSContext
*ctx, JSFunctionDef *s,
assert(bc_buf[pos] == OP_label);
end_pos = label_pos + 2;
op = bc_buf[label_pos];
- if (is_strict) {
- if (op != OP_nop) {
- switch(op) {
- case OP_insert3:
- op = OP_insert2;
- break;
- case OP_perm4:
- op = OP_perm3;
- break;
- case OP_rot3l:
- op = OP_swap;
- break;
- default:
- abort();
- }
- bc_buf[pos++] = op;
- }
- } else {
- if (op == OP_insert3)
- bc_buf[pos++] = OP_dup;
- }
- if (is_strict) {
- bc_buf[pos] = OP_put_var_strict;
- /* XXX: need 1 extra OP_drop if destructuring an array */
- } else {
- bc_buf[pos] = OP_put_var;
- /* XXX: need 2 extra OP_drop if destructuring an array */
- }
+ if (op == OP_insert3)
+ bc_buf[pos++] = OP_dup;
+ bc_buf[pos] = OP_put_var;
+ /* XXX: need 2 extra OP_drop if destructuring an array */
put_u32(bc_buf + pos + 1, JS_DupAtom(ctx, var_name));
pos += 5;
/* pad with OP_nop */
@@ -34099,12 +34147,11 @@ static __exception int resolve_labels(JSContext *ctx,
JSFunctionDef *s)
if (OPTIMIZE) {
/* Transformation:
insert2 put_field(a) drop -> put_field(a)
- insert2 put_var_strict(a) drop -> put_var_strict(a)
*/
- if (code_match(&cc, pos_next, M2(OP_put_field,
OP_put_var_strict), OP_drop, -1)) {
+ if (code_match(&cc, pos_next, OP_put_field, OP_drop, -1)) {
if (cc.line_num >= 0) line_num = cc.line_num;
add_pc2line_info(s, bc_out.size, line_num);
- dbuf_putc(&bc_out, cc.op);
+ dbuf_putc(&bc_out, OP_put_field);
dbuf_put_u32(&bc_out, cc.atom);
pos_next = cc.pos;
break;
@@ -34250,7 +34297,6 @@ static __exception int resolve_labels(JSContext *ctx,
JSFunctionDef *s)
/* transformation:
post_inc put_x drop -> inc put_x
post_inc perm3 put_field drop -> inc put_field
- post_inc perm3 put_var_strict drop -> inc put_var_strict
post_inc perm4 put_array_el drop -> inc put_array_el
*/
int op1, idx;
@@ -34269,11 +34315,11 @@ static __exception int resolve_labels(JSContext *ctx,
JSFunctionDef *s)
put_short_code(&bc_out, op1, idx);
break;
}
- if (code_match(&cc, pos_next, OP_perm3, M2(OP_put_field,
OP_put_var_strict), OP_drop, -1)) {
+ if (code_match(&cc, pos_next, OP_perm3, OP_put_field, OP_drop,
-1)) {
if (cc.line_num >= 0) line_num = cc.line_num;
add_pc2line_info(s, bc_out.size, line_num);
dbuf_putc(&bc_out, OP_dec + (op - OP_post_dec));
- dbuf_putc(&bc_out, cc.op);
+ dbuf_putc(&bc_out, OP_put_field);
dbuf_put_u32(&bc_out, cc.atom);
pos_next = cc.pos;
break;
@@ -42118,23 +42164,6 @@ static void js_array_iterator_mark(JSRuntime *rt,
JSValueConst val,
}
}
-static JSValue js_create_array(JSContext *ctx, int len, JSValueConst *tab)
-{
- JSValue obj;
- int i;
-
- obj = JS_NewArray(ctx);
- if (JS_IsException(obj))
- return JS_EXCEPTION;
- for(i = 0; i < len; i++) {
- if (JS_CreateDataPropertyUint32(ctx, obj, i, JS_DupValue(ctx, tab[i]),
0) < 0) {
- JS_FreeValue(ctx, obj);
- return JS_EXCEPTION;
- }
- }
- return obj;
-}
-
static JSValue js_create_array_iterator(JSContext *ctx, JSValueConst this_val,
int argc, JSValueConst *argv, int
magic)
{
@@ -51681,16 +51710,29 @@ static JSValue js_promise_withResolvers(JSContext
*ctx,
if (JS_IsException(result_promise))
return result_promise;
obj = JS_NewObject(ctx);
- if (JS_IsException(obj)) {
- JS_FreeValue(ctx, resolving_funcs[0]);
- JS_FreeValue(ctx, resolving_funcs[1]);
- JS_FreeValue(ctx, result_promise);
- return JS_EXCEPTION;
+ if (JS_IsException(obj))
+ goto exception;
+ if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_promise, result_promise,
+ JS_PROP_C_W_E) < 0) {
+ goto exception;
+ }
+ result_promise = JS_UNDEFINED;
+ if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_resolve, resolving_funcs[0],
+ JS_PROP_C_W_E) < 0) {
+ goto exception;
+ }
+ resolving_funcs[0] = JS_UNDEFINED;
+ if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_reject, resolving_funcs[1],
+ JS_PROP_C_W_E) < 0) {
+ goto exception;
}
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_promise, result_promise,
JS_PROP_C_W_E);
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_resolve, resolving_funcs[0],
JS_PROP_C_W_E);
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_reject, resolving_funcs[1],
JS_PROP_C_W_E);
return obj;
+exception:
+ JS_FreeValue(ctx, resolving_funcs[0]);
+ JS_FreeValue(ctx, resolving_funcs[1]);
+ JS_FreeValue(ctx, result_promise);
+ JS_FreeValue(ctx, obj);
+ return JS_EXCEPTION;
}
static JSValue js_promise_try(JSContext *ctx, JSValueConst this_val,
diff --git a/src/couch_quickjs/quickjs/quickjs.h
b/src/couch_quickjs/quickjs/quickjs.h
index c8cd14944..cad3652fb 100644
--- a/src/couch_quickjs/quickjs/quickjs.h
+++ b/src/couch_quickjs/quickjs/quickjs.h
@@ -319,8 +319,7 @@ static inline JSValue __JS_NewShortBigInt(JSContext *ctx,
int64_t d)
(JS_SetProperty) */
#define JS_PROP_THROW_STRICT (1 << 15)
-#define JS_PROP_NO_ADD (1 << 16) /* internal use */
-#define JS_PROP_NO_EXOTIC (1 << 17) /* internal use */
+#define JS_PROP_NO_EXOTIC (1 << 16) /* internal use */
#ifndef JS_DEFAULT_STACK_SIZE
#define JS_DEFAULT_STACK_SIZE (1024 * 1024)
diff --git a/src/couch_quickjs/quickjs/test262.conf
b/src/couch_quickjs/quickjs/test262.conf
index 73cfa9cd0..430843a25 100644
--- a/src/couch_quickjs/quickjs/test262.conf
+++ b/src/couch_quickjs/quickjs/test262.conf
@@ -116,6 +116,7 @@ for-of
generators
globalThis
hashbang
+host-gc-required
immutable-arraybuffer=skip
import-attributes
import-defer=skip
@@ -152,6 +153,7 @@ logical-assignment-operators
Map
Math.sumPrecise
new.target
+nonextensible-applies-to-private=skip
numeric-separator-literal
object-rest
object-spread
@@ -189,6 +191,8 @@ ShadowRealm=skip
SharedArrayBuffer
source-phase-imports-module-source=skip
source-phase-imports=skip
+stable-array-sort
+stable-typedarray-sort
string-trimming
String.fromCodePoint
String.prototype.at
diff --git a/src/couch_quickjs/quickjs/test262_errors.txt
b/src/couch_quickjs/quickjs/test262_errors.txt
index e46b03d27..56ac50680 100644
--- a/src/couch_quickjs/quickjs/test262_errors.txt
+++ b/src/couch_quickjs/quickjs/test262_errors.txt
@@ -5,45 +5,72 @@
test262/test/annexB/language/expressions/assignmenttargettype/callexpression-in-
test262/test/annexB/language/expressions/assignmenttargettype/callexpression-in-prefix-update.js:27:
SyntaxError: invalid increment/decrement operand
test262/test/annexB/language/expressions/assignmenttargettype/callexpression.js:33:
SyntaxError: invalid assignment left-hand side
test262/test/annexB/language/expressions/assignmenttargettype/cover-callexpression-and-asyncarrowhead.js:20:
SyntaxError: invalid assignment left-hand side
+test262/test/language/identifier-resolution/assign-to-global-undefined.js:20:
strict mode: expected error
test262/test/language/statements/expression/S12.4_A1.js:15: unexpected error
type: Test262: This statement should not be evaluated.
test262/test/language/statements/expression/S12.4_A1.js:15: strict mode:
unexpected error type: Test262: This statement should not be evaluated.
-test262/test/staging/sm/Date/UTC-convert-all-arguments.js:75: Test262Error:
index 1: expected 42, got Error: didn't throw Expected SameValue(«Error: didn't
throw», «42») to be true
-test262/test/staging/sm/Date/constructor-convert-all-arguments.js:75:
Test262Error: index undefined: expected 42, got Error: didn't throw Expected
SameValue(«Error: didn't throw», «42») to be true
-test262/test/staging/sm/Date/two-digit-years.js:76: Test262Error: Expected
SameValue(«915177600000», «NaN») to be true
-test262/test/staging/sm/Function/arguments-parameter-shadowing.js:15:
Test262Error: Expected SameValue(«true», «false») to be true
-test262/test/staging/sm/Function/constructor-binding.js:12: Test262Error:
Expected SameValue(«"function"», «"undefined"») to be true
-test262/test/staging/sm/Function/function-bind.js:14: Test262Error: Conforms
to NativeFunction Syntax: "function bound unbound() {\n [native code]\n}"
-test262/test/staging/sm/Function/function-name-for.js:12: Test262Error:
Expected SameValue(«""», «"forInHead"») to be true
-test262/test/staging/sm/Function/implicit-this-in-parameter-expression.js:13:
Test262Error: Expected SameValue(«[object Object]», «undefined») to be true
-test262/test/staging/sm/Function/invalid-parameter-list.js:35: Error:
Assertion failed: expected exception SyntaxError, no exception thrown
-test262/test/staging/sm/RegExp/constructor-ordering-2.js:15: Test262Error:
Expected SameValue(«false», «true») to be true
+test262/test/staging/sm/Date/UTC-convert-all-arguments.js:13: Test262Error:
index 1: expected 42, got Error: didn't throw Expected SameValue(«Error: didn't
throw», «42») to be true
+test262/test/staging/sm/Date/UTC-convert-all-arguments.js:13: strict mode:
Test262Error: index 1: expected 42, got Error: didn't throw Expected
SameValue(«Error: didn't throw», «42») to be true
+test262/test/staging/sm/Date/constructor-convert-all-arguments.js:13:
Test262Error: index undefined: expected 42, got Error: didn't throw Expected
SameValue(«Error: didn't throw», «42») to be true
+test262/test/staging/sm/Date/constructor-convert-all-arguments.js:13: strict
mode: Test262Error: index undefined: expected 42, got Error: didn't throw
Expected SameValue(«Error: didn't throw», «42») to be true
+test262/test/staging/sm/Date/two-digit-years.js:26: Test262Error: Expected
SameValue(«915177600000», «NaN») to be true
+test262/test/staging/sm/Date/two-digit-years.js:26: strict mode: Test262Error:
Expected SameValue(«915177600000», «NaN») to be true
+test262/test/staging/sm/Function/arguments-parameter-shadowing.js:14:
Test262Error: Expected SameValue(«true», «false») to be true
+test262/test/staging/sm/Function/constructor-binding.js:11: Test262Error:
Expected SameValue(«"function"», «"undefined"») to be true
+test262/test/staging/sm/Function/constructor-binding.js:11: strict mode:
Test262Error: Expected SameValue(«"function"», «"undefined"») to be true
+test262/test/staging/sm/Function/function-bind.js:24: Test262Error: Conforms
to NativeFunction Syntax: "function bound unbound() {\n [native code]\n}"
+test262/test/staging/sm/Function/function-name-for.js:13: Test262Error:
Expected SameValue(«""», «"forInHead"») to be true
+test262/test/staging/sm/Function/implicit-this-in-parameter-expression.js:12:
Test262Error: Expected SameValue(«[object Object]», «undefined») to be true
+test262/test/staging/sm/Function/invalid-parameter-list.js:13: Test262Error:
Expected a SyntaxError to be thrown but no exception was thrown at all
+test262/test/staging/sm/Function/invalid-parameter-list.js:13: strict mode:
Test262Error: Expected a SyntaxError to be thrown but no exception was thrown
at all
+test262/test/staging/sm/Math/acosh-exact.js:15: ReferenceError:
'ONE_MINUS_EPSILON' is not defined
+test262/test/staging/sm/Math/acosh-exact.js:15: strict mode: ReferenceError:
'ONE_MINUS_EPSILON' is not defined
+test262/test/staging/sm/Math/atanh-exact.js:15: ReferenceError:
'ONE_PLUS_EPSILON' is not defined
+test262/test/staging/sm/Math/atanh-exact.js:15: strict mode: ReferenceError:
'ONE_PLUS_EPSILON' is not defined
+test262/test/staging/sm/Math/log1p-exact.js:18: ReferenceError:
'ONE_PLUS_EPSILON' is not defined
+test262/test/staging/sm/Math/log1p-exact.js:18: strict mode: ReferenceError:
'ONE_PLUS_EPSILON' is not defined
+test262/test/staging/sm/Math/trunc.js:29: ReferenceError: 'ONE_MINUS_EPSILON'
is not defined
+test262/test/staging/sm/Math/trunc.js:29: strict mode: ReferenceError:
'ONE_MINUS_EPSILON' is not defined
+test262/test/staging/sm/RegExp/constructor-ordering-2.js:12: Test262Error:
Expected SameValue(«false», «true») to be true
+test262/test/staging/sm/RegExp/constructor-ordering-2.js:12: strict mode:
Test262Error: Expected SameValue(«false», «true») to be true
test262/test/staging/sm/RegExp/regress-613820-1.js:12: Test262Error: Actual
[aaa, aa, a] and expected [aa, a, a] should have the same contents.
test262/test/staging/sm/RegExp/regress-613820-1.js:12: strict mode:
Test262Error: Actual [aaa, aa, a] and expected [aa, a, a] should have the same
contents.
test262/test/staging/sm/RegExp/regress-613820-2.js:12: Test262Error: Actual
[foobar, f, o, o, b, a, r] and expected [foobar, undefined, undefined,
undefined, b, a, r] should have the same contents.
test262/test/staging/sm/RegExp/regress-613820-2.js:12: strict mode:
Test262Error: Actual [foobar, f, o, o, b, a, r] and expected [foobar,
undefined, undefined, undefined, b, a, r] should have the same contents.
test262/test/staging/sm/RegExp/regress-613820-3.js:12: Test262Error: Actual
[aab, a, undefined, ab] and expected [aa, undefined, a, undefined] should have
the same contents.
test262/test/staging/sm/RegExp/regress-613820-3.js:12: strict mode:
Test262Error: Actual [aab, a, undefined, ab] and expected [aa, undefined, a,
undefined] should have the same contents.
-test262/test/staging/sm/TypedArray/constructor-buffer-sequence.js:73: Error:
Assertion failed: expected exception ExpectedError, got Error: Poisoned Value
+test262/test/staging/sm/TypedArray/constructor-buffer-sequence.js:29:
Test262Error: Expected a ExpectedError but got a Error
+test262/test/staging/sm/TypedArray/constructor-buffer-sequence.js:29: strict
mode: Test262Error: Expected a ExpectedError but got a Error
test262/test/staging/sm/TypedArray/prototype-constructor-identity.js:17:
Test262Error: Expected SameValue(«2», «6») to be true
-test262/test/staging/sm/TypedArray/sort_modifications.js:12: Test262Error:
Int8Array at index 0 for size 4 Expected SameValue(«0», «1») to be true
-test262/test/staging/sm/async-functions/async-contains-unicode-escape.js:45:
Error: Assertion failed: expected exception SyntaxError, no exception thrown
-test262/test/staging/sm/async-functions/await-error.js:12: Test262Error:
Expected SameValue(«false», «true») to be true
-test262/test/staging/sm/async-functions/await-in-arrow-parameters.js:33:
Error: Assertion failed: expected exception SyntaxError, no exception thrown -
AsyncFunction:(a = (b = await/r/g) => {}) => {}
-test262/test/staging/sm/class/boundFunctionSubclassing.js:12: Test262Error:
Expected SameValue(«false», «true») to be true
-test262/test/staging/sm/class/strictExecution.js:32: Error: Assertion failed:
expected exception TypeError, no exception thrown
-test262/test/staging/sm/class/superPropOrdering.js:83: Error: Assertion
failed: expected exception TypeError, no exception thrown
-test262/test/staging/sm/expressions/short-circuit-compound-assignment-const.js:97:
TypeError: 'a' is read-only
-test262/test/staging/sm/expressions/short-circuit-compound-assignment-tdz.js:23:
Error: Assertion failed: expected exception ReferenceError, got TypeError: 'a'
is read-only
-test262/test/staging/sm/generators/syntax.js:30: Error: Assertion failed:
expected SyntaxError, but no exception thrown - function* g() { (function*
yield() {}); }
-test262/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-arguments.js:14:
Test262Error: Expected SameValue(«"object"», «"function"») to be true
-test262/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-eval.js:12:
Test262Error: Expected SameValue(«"outer-gouter-geval-gtruefalseq"»,
«"outer-geval-gwith-gtruefalseq"») to be true
-test262/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-if.js:20:
TypeError: not a function
-test262/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-notapplicable.js:15:
Test262Error: Expected SameValue(«function x() {2}», «function x() {1}») to be
true
+test262/test/staging/sm/TypedArray/prototype-constructor-identity.js:17:
strict mode: Test262Error: Expected SameValue(«2», «6») to be true
+test262/test/staging/sm/TypedArray/sort_modifications.js:9: Test262Error:
Int8Array at index 0 for size 4 Expected SameValue(«0», «1») to be true
+test262/test/staging/sm/TypedArray/sort_modifications.js:9: strict mode:
Test262Error: Int8Array at index 0 for size 4 Expected SameValue(«0», «1») to
be true
+test262/test/staging/sm/async-functions/async-contains-unicode-escape.js:11:
Test262Error: Expected a SyntaxError to be thrown but no exception was thrown
at all
+test262/test/staging/sm/async-functions/async-contains-unicode-escape.js:11:
strict mode: Test262Error: Expected a SyntaxError to be thrown but no exception
was thrown at all
+test262/test/staging/sm/async-functions/await-in-arrow-parameters.js:10:
Test262Error: AsyncFunction:(a = (b = await/r/g) => {}) => {} Expected a
SyntaxError to be thrown but no exception was thrown at all
+test262/test/staging/sm/async-functions/await-in-arrow-parameters.js:10:
strict mode: Test262Error: AsyncFunction:(a = (b = await/r/g) => {}) => {}
Expected a SyntaxError to be thrown but no exception was thrown at all
+test262/test/staging/sm/class/boundFunctionSubclassing.js:9: Test262Error:
Expected SameValue(«false», «true») to be true
+test262/test/staging/sm/class/boundFunctionSubclassing.js:9: strict mode:
Test262Error: Expected SameValue(«false», «true») to be true
+test262/test/staging/sm/class/strictExecution.js:13: Test262Error: Expected a
TypeError to be thrown but no exception was thrown at all
+test262/test/staging/sm/class/superPropOrdering.js:17: Test262Error: Expected
a TypeError to be thrown but no exception was thrown at all
+test262/test/staging/sm/class/superPropOrdering.js:17: strict mode:
Test262Error: Expected a TypeError to be thrown but no exception was thrown at
all
+test262/test/staging/sm/expressions/short-circuit-compound-assignment-const.js:96:
TypeError: 'a' is read-only
+test262/test/staging/sm/expressions/short-circuit-compound-assignment-tdz.js:18:
Test262Error: Expected a ReferenceError but got a TypeError
+test262/test/staging/sm/expressions/short-circuit-compound-assignment-tdz.js:18:
strict mode: Test262Error: Expected a ReferenceError but got a TypeError
+test262/test/staging/sm/generators/syntax.js:50: Test262Error: Expected a
SyntaxError to be thrown but no exception was thrown at all
+test262/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-arguments.js:13:
Test262Error: Expected SameValue(«"object"», «"function"») to be true
+test262/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-eval.js:11:
Test262Error: Expected SameValue(«"outer-gouter-geval-gtruefalseq"»,
«"outer-geval-gwith-gtruefalseq"») to be true
+test262/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-if.js:19:
TypeError: not a function
+test262/test/staging/sm/lexical-environment/block-scoped-functions-annex-b-notapplicable.js:14:
Test262Error: Expected SameValue(«function x() {2}», «function x() {1}») to be
true
test262/test/staging/sm/lexical-environment/block-scoped-functions-deprecated-redecl.js:23:
Test262Error: Expected SameValue(«3», «4») to be true
-test262/test/staging/sm/lexical-environment/var-in-catch-body-annex-b-eval.js:17:
Test262Error: Expected SameValue(«"g"», «"global-x"») to be true
-test262/test/staging/sm/object/defineProperties-order.js:14: Test262Error:
Expected
SameValue(«"ownKeys,getOwnPropertyDescriptor,getOwnPropertyDescriptor,get,get"»,
«"ownKeys,getOwnPropertyDescriptor,get,getOwnPropertyDescriptor,get"») to be
true
-test262/test/staging/sm/regress/regress-602621.js:14: Test262Error: function
sub-statement must override arguments Expected SameValue(«"function"»,
«"object"») to be true
-test262/test/staging/sm/regress/regress-1383630.js:30: Error: Assertion
failed: expected exception TypeError, no exception thrown
-test262/test/staging/sm/statements/arrow-function-in-for-statement-head.js:15:
Test262Error: expected syntax error, got Error: didn't throw Expected
SameValue(«false», «true») to be true
-test262/test/staging/sm/statements/regress-642975.js:14: Test262Error:
Expected SameValue(«undefined», «"y"») to be true
-test262/test/staging/sm/statements/try-completion.js:17: Test262Error:
Expected SameValue(«"try"», «undefined») to be true
+test262/test/staging/sm/lexical-environment/var-in-catch-body-annex-b-eval.js:16:
Test262Error: Expected SameValue(«"g"», «"global-x"») to be true
+test262/test/staging/sm/object/defineProperties-order.js:11: Test262Error:
Expected
SameValue(«"ownKeys,getOwnPropertyDescriptor,getOwnPropertyDescriptor,get,get"»,
«"ownKeys,getOwnPropertyDescriptor,get,getOwnPropertyDescriptor,get"») to be
true
+test262/test/staging/sm/object/defineProperties-order.js:11: strict mode:
Test262Error: Expected
SameValue(«"ownKeys,getOwnPropertyDescriptor,getOwnPropertyDescriptor,get,get"»,
«"ownKeys,getOwnPropertyDescriptor,get,getOwnPropertyDescriptor,get"») to be
true
+test262/test/staging/sm/regress/regress-602621.js:13: Test262Error: function
sub-statement must override arguments Expected SameValue(«"function"»,
«"object"») to be true
+test262/test/staging/sm/regress/regress-1383630.js:28: Test262Error: proxy
must report the same value for the non-writable, non-configurable property
Expected a TypeError to be thrown but no exception was thrown at all
+test262/test/staging/sm/regress/regress-1383630.js:28: strict mode:
Test262Error: proxy must report the same value for the non-writable,
non-configurable property Expected a TypeError to be thrown but no exception
was thrown at all
+test262/test/staging/sm/statements/arrow-function-in-for-statement-head.js:13:
Test262Error: Expected a SyntaxError to be thrown but no exception was thrown
at all
+test262/test/staging/sm/statements/arrow-function-in-for-statement-head.js:13:
strict mode: Test262Error: Expected a SyntaxError to be thrown but no exception
was thrown at all
+test262/test/staging/sm/statements/regress-642975.js:11: Test262Error:
Expected SameValue(«undefined», «"y"») to be true
+test262/test/staging/sm/statements/regress-642975.js:11: strict mode:
Test262Error: Expected SameValue(«undefined», «"y"») to be true
+test262/test/staging/sm/statements/try-completion.js:11: Test262Error:
Expected SameValue(«"try"», «undefined») to be true
+test262/test/staging/sm/statements/try-completion.js:11: strict mode:
Test262Error: Expected SameValue(«"try"», «undefined») to be true
diff --git a/src/couch_quickjs/quickjs/tests/test262.patch
b/src/couch_quickjs/quickjs/tests/test262.patch
index e488df829..d7cba88cc 100644
--- a/src/couch_quickjs/quickjs/tests/test262.patch
+++ b/src/couch_quickjs/quickjs/tests/test262.patch
@@ -1,5 +1,5 @@
diff --git a/harness/atomicsHelper.js b/harness/atomicsHelper.js
-index 9828b15..4a5919d 100644
+index 9828b15..9e24d64 100644
--- a/harness/atomicsHelper.js
+++ b/harness/atomicsHelper.js
@@ -272,10 +272,14 @@ $262.agent.waitUntil = function(typedArray, index,
expected) {
@@ -70,66 +70,3 @@ index b397be0..c197ddc 100644
}
return result;
}
-diff --git a/harness/sm/non262.js b/harness/sm/non262.js
-index 89df923..79ded15 100644
---- a/harness/sm/non262.js
-+++ b/harness/sm/non262.js
-@@ -34,8 +34,6 @@ globalThis.createNewGlobal = function() {
- return $262.createRealm().global
- }
-
--function print(...args) {
--}
- function assertEq(...args) {
- assert.sameValue(...args)
- }
-diff --git a/test/staging/sm/extensions/regress-469625-01.js
b/test/staging/sm/extensions/regress-469625-01.js
-index 81f84fc..4652002 100644
---- a/test/staging/sm/extensions/regress-469625-01.js
-+++ b/test/staging/sm/extensions/regress-469625-01.js
-@@ -14,8 +14,7 @@ esid: pending
-
//-----------------------------------------------------------------------------
- var BUGNUMBER = 469625;
- var summary = 'TM: Array prototype and expression closures';
--var actual = '';
--var expect = '';
-+var actual = null;
-
-
-
//-----------------------------------------------------------------------------
-@@ -24,9 +23,6 @@ test();
-
- function test()
- {
-- expect = 'TypeError: [].__proto__ is not a function';
--
--
- Array.prototype.__proto__ = function () { return 3; };
-
- try
-@@ -35,8 +31,10 @@ function test()
- }
- catch(ex)
- {
-- print(actual = ex + '');
-+ print(ex + '');
-+ actual = ex;
- }
-
-- assert.sameValue(expect, actual, summary);
-+ assert.sameValue(actual instanceof TypeError, true);
-+ assert.sameValue(actual.message.includes("not a function"), true);
- }
-diff --git a/test/staging/sm/misc/new-with-non-constructor.js
b/test/staging/sm/misc/new-with-non-constructor.js
-index 18c2f0c..f9aa209 100644
---- a/test/staging/sm/misc/new-with-non-constructor.js
-+++ b/test/staging/sm/misc/new-with-non-constructor.js
-@@ -16,7 +16,7 @@ function checkConstruct(thing) {
- new thing();
- assert.sameValue(0, 1, "not reached " + thing);
- } catch (e) {
-- assert.sameValue(e.message.includes(" is not a constructor") ||
-+ assert.sameValue(e.message.includes("not a constructor") ||
- e.message === "Function.prototype.toString called on
incompatible object", true);
- }
- }