Skip to content

Commit a96e4ce

Browse files
committed
QuickJS Update. Optimized string operations.
And more spec compliance fixes. Rename `update_and_apply_patches.sh` -> `update.sh` since we always apply patches. Upstream changes (Thanks, Fabrice!): * Add `js_string_eq()` bellard/quickjs@c720e35 * Inline `get_length()` bellard/quickjs@3e5f2bb * Optimized Array.prototype.push bellard/quickjs@9a421b3 * Changed module rejection order according to spec change bellard/quickjs@af16a97 * Fixed operation order in Regexp constructor bellard/quickjs@c31809e * Remove un-initialized variable bellard/quickjs@eb2c890
1 parent 51cc767 commit a96e4ce

File tree

6 files changed

+111
-65
lines changed

6 files changed

+111
-65
lines changed

src/couch_quickjs/patches/01-spidermonkey-185-mode.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
--- quickjs-master/quickjs.c 2025-10-13 08:51:37
2-
+++ quickjs/quickjs.c 2025-10-15 21:57:44
3-
@@ -30997,10 +30997,24 @@
1+
--- quickjs-master/quickjs.c 2025-10-18 06:04:12
2+
+++ quickjs/quickjs.c 2025-10-20 10:47:26
3+
@@ -31017,10 +31017,24 @@
44
if (s->token.val == TOK_FUNCTION ||
55
(token_is_pseudo_keyword(s, JS_ATOM_async) &&
66
peek_token(s, TRUE) == TOK_FUNCTION)) {

src/couch_quickjs/patches/02-test262-errors.patch

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
--- quickjs-master/test262_errors.txt 2025-10-13 08:51:37
2-
+++ quickjs/test262_errors.txt 2025-10-15 22:00:27
3-
@@ -7,6 +7,8 @@
1+
--- quickjs-master/test262_errors.txt 2025-10-18 06:04:12
2+
+++ quickjs/test262_errors.txt 2025-10-20 10:49:07
3+
@@ -6,6 +6,8 @@
4+
test262/test/annexB/language/expressions/assignmenttargettype/callexpression.js:33: SyntaxError: invalid assignment left-hand side
45
test262/test/annexB/language/expressions/assignmenttargettype/cover-callexpression-and-asyncarrowhead.js:20: SyntaxError: invalid assignment left-hand side
56
test262/test/language/identifier-resolution/assign-to-global-undefined.js:20: strict mode: expected error
6-
test262/test/language/module-code/top-level-await/rejection-order.js:20: TypeError: $DONE() not called
77
+test262/test/language/statements/expression/S12.4_A1.js:15: unexpected error type: Test262: This statement should not be evaluated.
88
+test262/test/language/statements/expression/S12.4_A1.js:15: strict mode: unexpected error type: Test262: This statement should not be evaluated.
99
test262/test/staging/sm/Function/arguments-parameter-shadowing.js:14: Test262Error: Expected SameValue(«true», «false») to be true

src/couch_quickjs/quickjs/quickjs.c

Lines changed: 102 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,8 +1176,8 @@ static int JS_ToUint8ClampFree(JSContext *ctx, int32_t *pres, JSValue val);
11761176
static JSValue js_new_string8_len(JSContext *ctx, const char *buf, int len);
11771177
static JSValue js_compile_regexp(JSContext *ctx, JSValueConst pattern,
11781178
JSValueConst flags);
1179-
static JSValue js_regexp_constructor_internal(JSContext *ctx, JSValueConst ctor,
1180-
JSValue pattern, JSValue bc);
1179+
static JSValue js_regexp_set_internal(JSContext *ctx, JSValue obj,
1180+
JSValue pattern, JSValue bc);
11811181
static void gc_decref(JSRuntime *rt);
11821182
static int JS_NewClass1(JSRuntime *rt, JSClassID class_id,
11831183
const JSClassDef *class_def, JSAtom name);
@@ -1261,6 +1261,8 @@ static JSValue js_promise_resolve(JSContext *ctx, JSValueConst this_val,
12611261
int argc, JSValueConst *argv, int magic);
12621262
static JSValue js_promise_then(JSContext *ctx, JSValueConst this_val,
12631263
int argc, JSValueConst *argv);
1264+
static BOOL js_string_eq(JSContext *ctx,
1265+
const JSString *p1, const JSString *p2);
12641266
static int js_string_compare(JSContext *ctx,
12651267
const JSString *p1, const JSString *p2);
12661268
static JSValue JS_ToNumber(JSContext *ctx, JSValueConst val);
@@ -3226,9 +3228,9 @@ static JSValue JS_AtomIsNumericIndex1(JSContext *ctx, JSAtom atom)
32263228
JS_FreeValue(ctx, num);
32273229
return str;
32283230
}
3229-
ret = js_string_compare(ctx, p, JS_VALUE_GET_STRING(str));
3231+
ret = js_string_eq(ctx, p, JS_VALUE_GET_STRING(str));
32303232
JS_FreeValue(ctx, str);
3231-
if (ret == 0) {
3233+
if (ret) {
32323234
return num;
32333235
} else {
32343236
JS_FreeValue(ctx, num);
@@ -4130,6 +4132,16 @@ static int js_string_memcmp(const JSString *p1, int pos1, const JSString *p2,
41304132
return res;
41314133
}
41324134

4135+
static BOOL js_string_eq(JSContext *ctx,
4136+
const JSString *p1, const JSString *p2)
4137+
{
4138+
if (p1->len != p2->len)
4139+
return FALSE;
4140+
if (p1 == p2)
4141+
return TRUE;
4142+
return js_string_memcmp(p1, 0, p2, 0, p1->len) == 0;
4143+
}
4144+
41334145
/* return < 0, 0 or > 0 */
41344146
static int js_string_compare(JSContext *ctx,
41354147
const JSString *p1, const JSString *p2)
@@ -5226,7 +5238,7 @@ static JSValue JS_NewObjectFromShape(JSContext *ctx, JSShape *sh, JSClassID clas
52265238
case JS_CLASS_REGEXP:
52275239
p->u.regexp.pattern = NULL;
52285240
p->u.regexp.bytecode = NULL;
5229-
goto set_exotic;
5241+
break;
52305242
default:
52315243
set_exotic:
52325244
if (ctx->rt->class_array[class_id].exotic) {
@@ -13414,6 +13426,11 @@ static void js_print_regexp(JSPrintValueState *s, JSObject *p1)
1341413426
int i, n, c, c2, bra, flags;
1341513427
static const char regexp_flags[] = { 'g', 'i', 'm', 's', 'u', 'y', 'd', 'v' };
1341613428

13429+
if (!re->pattern || !re->bytecode) {
13430+
/* the regexp fields are zeroed at init */
13431+
js_puts(s, "[uninitialized_regexp]");
13432+
return;
13433+
}
1341713434
p = re->pattern;
1341813435
js_putc(s, '/');
1341913436
if (p->len == 0) {
@@ -15265,8 +15282,8 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
1526515282
if (!tag_is_string(tag2)) {
1526615283
res = FALSE;
1526715284
} else if (tag1 == JS_TAG_STRING && tag2 == JS_TAG_STRING) {
15268-
res = (js_string_compare(ctx, JS_VALUE_GET_STRING(op1),
15269-
JS_VALUE_GET_STRING(op2)) == 0);
15285+
res = js_string_eq(ctx, JS_VALUE_GET_STRING(op1),
15286+
JS_VALUE_GET_STRING(op2));
1527015287
} else {
1527115288
res = (js_string_rope_compare(ctx, op1, op2, TRUE) == 0);
1527215289
}
@@ -17120,18 +17137,6 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
1712017137
CASE(OP_push_empty_string):
1712117138
*sp++ = JS_AtomToString(ctx, JS_ATOM_empty_string);
1712217139
BREAK;
17123-
CASE(OP_get_length):
17124-
{
17125-
JSValue val;
17126-
17127-
sf->cur_pc = pc;
17128-
val = JS_GetProperty(ctx, sp[-1], JS_ATOM_length);
17129-
if (unlikely(JS_IsException(val)))
17130-
goto exception;
17131-
JS_FreeValue(ctx, sp[-1]);
17132-
sp[-1] = val;
17133-
}
17134-
BREAK;
1713517140
#endif
1713617141
CASE(OP_push_atom_value):
1713717142
*sp++ = JS_AtomToValue(ctx, get_u32(pc));
@@ -17638,8 +17643,13 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
1763817643

1763917644
CASE(OP_regexp):
1764017645
{
17641-
sp[-2] = js_regexp_constructor_internal(ctx, JS_UNDEFINED,
17642-
sp[-2], sp[-1]);
17646+
JSValue obj;
17647+
obj = JS_NewObjectClass(ctx, JS_CLASS_REGEXP);
17648+
if (JS_IsException(obj))
17649+
goto exception;
17650+
sp[-2] = js_regexp_set_internal(ctx, obj, sp[-2], sp[-1]);
17651+
if (JS_IsException(sp[-2]))
17652+
goto exception;
1764317653
sp--;
1764417654
}
1764517655
BREAK;
@@ -18305,16 +18315,20 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
1830518315
}
1830618316
BREAK;
1830718317

18308-
#define GET_FIELD_INLINE(name, keep) \
18318+
#define GET_FIELD_INLINE(name, keep, is_length) \
1830918319
{ \
1831018320
JSValue val, obj; \
1831118321
JSAtom atom; \
1831218322
JSObject *p; \
1831318323
JSProperty *pr; \
1831418324
JSShapeProperty *prs; \
1831518325
\
18316-
atom = get_u32(pc); \
18317-
pc += 4; \
18326+
if (is_length) { \
18327+
atom = JS_ATOM_length; \
18328+
} else { \
18329+
atom = get_u32(pc); \
18330+
pc += 4; \
18331+
} \
1831818332
\
1831918333
obj = sp[-1]; \
1832018334
if (likely(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT)) { \
@@ -18358,13 +18372,19 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
1835818372

1835918373

1836018374
CASE(OP_get_field):
18361-
GET_FIELD_INLINE(get_field, 0);
18375+
GET_FIELD_INLINE(get_field, 0, 0);
1836218376
BREAK;
1836318377

1836418378
CASE(OP_get_field2):
18365-
GET_FIELD_INLINE(get_field2, 1);
18379+
GET_FIELD_INLINE(get_field2, 1, 0);
1836618380
BREAK;
1836718381

18382+
#if SHORT_OPCODES
18383+
CASE(OP_get_length):
18384+
GET_FIELD_INLINE(get_length, 0, 1);
18385+
BREAK;
18386+
#endif
18387+
1836818388
CASE(OP_put_field):
1836918389
{
1837018390
int ret;
@@ -30239,21 +30259,21 @@ static JSValue js_async_module_execution_rejected(JSContext *ctx, JSValueConst t
3023930259
module->status = JS_MODULE_STATUS_EVALUATED;
3024030260
module->async_evaluation = FALSE;
3024130261

30242-
for(i = 0; i < module->async_parent_modules_count; i++) {
30243-
JSModuleDef *m = module->async_parent_modules[i];
30244-
JSValue m_obj = JS_NewModuleValue(ctx, m);
30245-
js_async_module_execution_rejected(ctx, JS_UNDEFINED, 1, &error, 0,
30246-
&m_obj);
30247-
JS_FreeValue(ctx, m_obj);
30248-
}
30249-
3025030262
if (!JS_IsUndefined(module->promise)) {
3025130263
JSValue ret_val;
3025230264
assert(module->cycle_root == module);
3025330265
ret_val = JS_Call(ctx, module->resolving_funcs[1], JS_UNDEFINED,
3025430266
1, &error);
3025530267
JS_FreeValue(ctx, ret_val);
3025630268
}
30269+
30270+
for(i = 0; i < module->async_parent_modules_count; i++) {
30271+
JSModuleDef *m = module->async_parent_modules[i];
30272+
JSValue m_obj = JS_NewModuleValue(ctx, m);
30273+
js_async_module_execution_rejected(ctx, JS_UNDEFINED, 1, &error, 0,
30274+
&m_obj);
30275+
JS_FreeValue(ctx, m_obj);
30276+
}
3025730277
return JS_UNDEFINED;
3025830278
}
3025930279

@@ -41537,6 +41557,31 @@ static JSValue js_array_push(JSContext *ctx, JSValueConst this_val,
4153741557
int i;
4153841558
int64_t len, from, newLen;
4153941559

41560+
if (likely(JS_VALUE_GET_TAG(this_val) == JS_TAG_OBJECT && !unshift)) {
41561+
JSObject *p = JS_VALUE_GET_OBJ(this_val);
41562+
if (likely(p->class_id == JS_CLASS_ARRAY && p->fast_array &&
41563+
p->extensible &&
41564+
p->shape->proto == JS_VALUE_GET_OBJ(ctx->class_proto[JS_CLASS_ARRAY]) &&
41565+
ctx->std_array_prototype &&
41566+
JS_VALUE_GET_TAG(p->prop[0].u.value) == JS_TAG_INT &&
41567+
JS_VALUE_GET_INT(p->prop[0].u.value) == p->u.array.count &&
41568+
(get_shape_prop(p->shape)->flags & JS_PROP_WRITABLE) != 0)) {
41569+
/* fast case */
41570+
uint32_t new_len;
41571+
new_len = p->u.array.count + argc;
41572+
if (likely(new_len <= INT32_MAX)) {
41573+
if (unlikely(new_len > p->u.array.u1.size)) {
41574+
if (expand_fast_array(ctx, p, new_len))
41575+
return JS_EXCEPTION;
41576+
}
41577+
for(i = 0; i < argc; i++)
41578+
p->u.array.u.values[p->u.array.count + i] = JS_DupValue(ctx, argv[i]);
41579+
p->prop[0].u.value = JS_NewInt32(ctx, new_len);
41580+
p->u.array.count = new_len;
41581+
return JS_NewInt32(ctx, new_len);
41582+
}
41583+
}
41584+
}
4154041585
obj = JS_ToObject(ctx, this_val);
4154141586
if (js_get_length64(ctx, &len, obj))
4154241587
goto exception;
@@ -46084,8 +46129,10 @@ static void js_regexp_finalizer(JSRuntime *rt, JSValue val)
4608446129
{
4608546130
JSObject *p = JS_VALUE_GET_OBJ(val);
4608646131
JSRegExp *re = &p->u.regexp;
46087-
JS_FreeValueRT(rt, JS_MKPTR(JS_TAG_STRING, re->bytecode));
46088-
JS_FreeValueRT(rt, JS_MKPTR(JS_TAG_STRING, re->pattern));
46132+
if (re->bytecode != NULL)
46133+
JS_FreeValueRT(rt, JS_MKPTR(JS_TAG_STRING, re->bytecode));
46134+
if (re->pattern != NULL)
46135+
JS_FreeValueRT(rt, JS_MKPTR(JS_TAG_STRING, re->pattern));
4608946136
}
4609046137

4609146138
/* create a string containing the RegExp bytecode */
@@ -46167,32 +46214,29 @@ static JSValue js_compile_regexp(JSContext *ctx, JSValueConst pattern,
4616746214
return ret;
4616846215
}
4616946216

46170-
/* create a RegExp object from a string containing the RegExp bytecode
46171-
and the source pattern */
46172-
static JSValue js_regexp_constructor_internal(JSContext *ctx, JSValueConst ctor,
46173-
JSValue pattern, JSValue bc)
46217+
/* set the RegExp fields */
46218+
static JSValue js_regexp_set_internal(JSContext *ctx,
46219+
JSValue obj,
46220+
JSValue pattern, JSValue bc)
4617446221
{
46175-
JSValue obj;
4617646222
JSObject *p;
4617746223
JSRegExp *re;
4617846224

4617946225
/* sanity check */
46180-
if (JS_VALUE_GET_TAG(bc) != JS_TAG_STRING ||
46181-
JS_VALUE_GET_TAG(pattern) != JS_TAG_STRING) {
46226+
if (unlikely(JS_VALUE_GET_TAG(bc) != JS_TAG_STRING ||
46227+
JS_VALUE_GET_TAG(pattern) != JS_TAG_STRING)) {
4618246228
JS_ThrowTypeError(ctx, "string expected");
46183-
fail:
46229+
JS_FreeValue(ctx, obj);
4618446230
JS_FreeValue(ctx, bc);
4618546231
JS_FreeValue(ctx, pattern);
4618646232
return JS_EXCEPTION;
4618746233
}
4618846234

46189-
obj = js_create_from_ctor(ctx, ctor, JS_CLASS_REGEXP);
46190-
if (JS_IsException(obj))
46191-
goto fail;
4619246235
p = JS_VALUE_GET_OBJ(obj);
4619346236
re = &p->u.regexp;
4619446237
re->pattern = JS_VALUE_GET_STRING(pattern);
4619546238
re->bytecode = JS_VALUE_GET_STRING(bc);
46239+
/* Note: cannot fail because the field is preallocated */
4619646240
JS_DefinePropertyValue(ctx, obj, JS_ATOM_lastIndex, JS_NewInt32(ctx, 0),
4619746241
JS_PROP_WRITABLE);
4619846242
return obj;
@@ -46229,7 +46273,7 @@ static int js_is_regexp(JSContext *ctx, JSValueConst obj)
4622946273
static JSValue js_regexp_constructor(JSContext *ctx, JSValueConst new_target,
4623046274
int argc, JSValueConst *argv)
4623146275
{
46232-
JSValue pattern, flags, bc, val;
46276+
JSValue pattern, flags, bc, val, obj = JS_UNDEFINED;
4623346277
JSValueConst pat, flags1;
4623446278
JSRegExp *re;
4623546279
int pat_is_regexp;
@@ -46255,18 +46299,19 @@ static JSValue js_regexp_constructor(JSContext *ctx, JSValueConst new_target,
4625546299
}
4625646300
}
4625746301
re = js_get_regexp(ctx, pat, FALSE);
46302+
flags = JS_UNDEFINED;
4625846303
if (re) {
4625946304
pattern = JS_DupValue(ctx, JS_MKPTR(JS_TAG_STRING, re->pattern));
4626046305
if (JS_IsUndefined(flags1)) {
4626146306
bc = JS_DupValue(ctx, JS_MKPTR(JS_TAG_STRING, re->bytecode));
46307+
obj = js_create_from_ctor(ctx, new_target, JS_CLASS_REGEXP);
46308+
if (JS_IsException(obj))
46309+
goto fail;
4626246310
goto no_compilation;
4626346311
} else {
46264-
flags = JS_ToString(ctx, flags1);
46265-
if (JS_IsException(flags))
46266-
goto fail;
46312+
flags = JS_DupValue(ctx, flags1);
4626746313
}
4626846314
} else {
46269-
flags = JS_UNDEFINED;
4627046315
if (pat_is_regexp) {
4627146316
pattern = JS_GetProperty(ctx, pat, JS_ATOM_source);
4627246317
if (JS_IsException(pattern))
@@ -46292,15 +46337,19 @@ static JSValue js_regexp_constructor(JSContext *ctx, JSValueConst new_target,
4629246337
goto fail;
4629346338
}
4629446339
}
46340+
obj = js_create_from_ctor(ctx, new_target, JS_CLASS_REGEXP);
46341+
if (JS_IsException(obj))
46342+
goto fail;
4629546343
bc = js_compile_regexp(ctx, pattern, flags);
4629646344
if (JS_IsException(bc))
4629746345
goto fail;
4629846346
JS_FreeValue(ctx, flags);
4629946347
no_compilation:
46300-
return js_regexp_constructor_internal(ctx, new_target, pattern, bc);
46348+
return js_regexp_set_internal(ctx, obj, pattern, bc);
4630146349
fail:
4630246350
JS_FreeValue(ctx, pattern);
4630346351
JS_FreeValue(ctx, flags);
46352+
JS_FreeValue(ctx, obj);
4630446353
return JS_EXCEPTION;
4630546354
}
4630646355

src/couch_quickjs/quickjs/test262.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,8 @@ test262/test/staging/sm/regress/regress-699682.js
336336
test262/test/staging/sm/RegExp/toString.js
337337
test262/test/staging/sm/RegExp/source.js
338338
test262/test/staging/sm/RegExp/escape.js
339+
# RegExp.lastMatch not supported
340+
test262/test/staging/sm/statements/regress-642975.js
339341
# source directives are not standard yet
340342
test262/test/staging/sm/syntax/syntax-parsed-arrow-then-directive.js
341343
# returning "bound fn" as initialName for a function is permitted by the spec

src/couch_quickjs/quickjs/test262_errors.txt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ test262/test/annexB/language/expressions/assignmenttargettype/callexpression-in-
66
test262/test/annexB/language/expressions/assignmenttargettype/callexpression.js:33: SyntaxError: invalid assignment left-hand side
77
test262/test/annexB/language/expressions/assignmenttargettype/cover-callexpression-and-asyncarrowhead.js:20: SyntaxError: invalid assignment left-hand side
88
test262/test/language/identifier-resolution/assign-to-global-undefined.js:20: strict mode: expected error
9-
test262/test/language/module-code/top-level-await/rejection-order.js:20: TypeError: $DONE() not called
109
test262/test/language/statements/expression/S12.4_A1.js:15: unexpected error type: Test262: This statement should not be evaluated.
1110
test262/test/language/statements/expression/S12.4_A1.js:15: strict mode: unexpected error type: Test262: This statement should not be evaluated.
1211
test262/test/staging/sm/Function/arguments-parameter-shadowing.js:14: Test262Error: Expected SameValue(«true», «false») to be true
@@ -17,8 +16,6 @@ test262/test/staging/sm/Function/function-name-for.js:13: Test262Error: Expected
1716
test262/test/staging/sm/Function/implicit-this-in-parameter-expression.js:12: Test262Error: Expected SameValue(«[object Object]», «undefined») to be true
1817
test262/test/staging/sm/Function/invalid-parameter-list.js:13: Test262Error: Expected a SyntaxError to be thrown but no exception was thrown at all
1918
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
20-
test262/test/staging/sm/RegExp/constructor-ordering-2.js:12: Test262Error: Expected SameValue(«false», «true») to be true
21-
test262/test/staging/sm/RegExp/constructor-ordering-2.js:12: strict mode: Test262Error: Expected SameValue(«false», «true») to be true
2219
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.
2320
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.
2421
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.
@@ -57,7 +54,5 @@ test262/test/staging/sm/regress/regress-1383630.js:28: Test262Error: proxy must
5754
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
5855
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
5956
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
60-
test262/test/staging/sm/statements/regress-642975.js:11: Test262Error: Expected SameValue(«undefined», «"y"») to be true
61-
test262/test/staging/sm/statements/regress-642975.js:11: strict mode: Test262Error: Expected SameValue(«undefined», «"y"») to be true
6257
test262/test/staging/sm/statements/try-completion.js:11: Test262Error: Expected SameValue(«"try"», «undefined») to be true
6358
test262/test/staging/sm/statements/try-completion.js:11: strict mode: Test262Error: Expected SameValue(«"try"», «undefined») to be true
File renamed without changes.

0 commit comments

Comments
 (0)