1 test failing now

This commit is contained in:
2026-02-07 12:50:26 -06:00
parent 31d67f6710
commit 32fb44857c

View File

@@ -31982,16 +31982,26 @@ static int mach_compile_expr(MachCompState *cs, cJSON *node, int dest) {
cJSON *elems = cJSON_GetObjectItem(node, "list"); cJSON *elems = cJSON_GetObjectItem(node, "list");
int count = elems ? cJSON_GetArraySize(elems) : 0; int count = elems ? cJSON_GetArraySize(elems) : 0;
/* Reserve consecutive regs for elements starting at dest+1 */ /* Reserve consecutive regs for elements starting at arr_base+1.
If dest is below freereg, other temps occupy dest+1..freereg-1
so we must use a fresh base to avoid clobbering them. */
int save = cs->freereg; int save = cs->freereg;
cs->freereg = dest + 1; int arr_base;
if (dest + 1 >= cs->freereg) {
arr_base = dest;
cs->freereg = dest + 1;
} else {
arr_base = mach_reserve_reg(cs);
}
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
int er = mach_reserve_reg(cs); int er = mach_reserve_reg(cs);
cJSON *elem = cJSON_GetArrayItem(elems, i); cJSON *elem = cJSON_GetArrayItem(elems, i);
int r = mach_compile_expr(cs, elem, er); int r = mach_compile_expr(cs, elem, er);
if (r != er) mach_emit(cs, MACH_ABC(MACH_MOVE, er, r, 0)); if (r != er) mach_emit(cs, MACH_ABC(MACH_MOVE, er, r, 0));
} }
mach_emit(cs, MACH_ABC(MACH_NEWARRAY, dest, count, 0)); mach_emit(cs, MACH_ABC(MACH_NEWARRAY, arr_base, count, 0));
if (arr_base != dest)
mach_emit(cs, MACH_ABC(MACH_MOVE, dest, arr_base, 0));
mach_free_reg_to(cs, save); mach_free_reg_to(cs, save);
return dest; return dest;
} }
@@ -32903,10 +32913,14 @@ static JSValue reg_vm_binop(JSContext *ctx, int op, JSValue a, JSValue b) {
/* Comparison ops allow mixed types — return false for mismatches */ /* Comparison ops allow mixed types — return false for mismatches */
if (op >= MACH_EQ && op <= MACH_GE) { if (op >= MACH_EQ && op <= MACH_GE) {
/* Fast path: bitwise-identical values (same object/pointer) */ /* Fast path: identical values (chase pointers for forwarded objects) */
if (a == b) { {
if (op == MACH_EQ || op == MACH_LE || op == MACH_GE) return JS_TRUE; JSValue ca = JS_IsPtr(a) ? JS_MKPTR(chase(a)) : a;
if (op == MACH_NEQ) return JS_FALSE; JSValue cb = JS_IsPtr(b) ? JS_MKPTR(chase(b)) : b;
if (ca == cb) {
if (op == MACH_EQ || op == MACH_LE || op == MACH_GE) return JS_TRUE;
if (op == MACH_NEQ) return JS_FALSE;
}
} }
if (JS_IsNumber(a) && JS_IsNumber(b)) { if (JS_IsNumber(a) && JS_IsNumber(b)) {
double da, db; double da, db;