1 test failing now
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user