streamline mcode

This commit is contained in:
2026-02-12 09:43:13 -06:00
parent 68fb440502
commit 900db912a5
22 changed files with 1475 additions and 93 deletions

View File

@@ -1658,6 +1658,24 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code,
case MACH_IS_NULL:
frame->slots[a] = JS_NewBool(ctx, JS_IsNull(frame->slots[b]));
break;
case MACH_IS_ARRAY:
frame->slots[a] = JS_NewBool(ctx, JS_IsArray(frame->slots[b]));
break;
case MACH_IS_FUNC:
frame->slots[a] = JS_NewBool(ctx, JS_IsFunction(frame->slots[b]));
break;
case MACH_IS_RECORD:
frame->slots[a] = JS_NewBool(ctx, JS_IsRecord(frame->slots[b]));
break;
case MACH_IS_STONE:
frame->slots[a] = JS_NewBool(ctx, JS_IsStone(frame->slots[b]));
break;
case MACH_LENGTH: {
JSValue res = JS_CellLength(ctx, frame->slots[b]);
frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val);
frame->slots[a] = res;
break;
}
case MACH_TYPEOF: {
JSValue val = frame->slots[b];
const char *tname = "unknown";
@@ -2552,8 +2570,13 @@ static MachCode *mcode_lower_func(cJSON *fobj, const char *filename) {
else if (strcmp(op, "is_num") == 0) { AB2(MACH_IS_NUM); }
else if (strcmp(op, "is_text") == 0) { AB2(MACH_IS_TEXT); }
else if (strcmp(op, "is_bool") == 0) { AB2(MACH_IS_BOOL); }
else if (strcmp(op, "is_null") == 0) { AB2(MACH_IS_NULL); }
else if (strcmp(op, "typeof") == 0) { AB2(MACH_TYPEOF); }
else if (strcmp(op, "is_null") == 0) { AB2(MACH_IS_NULL); }
else if (strcmp(op, "is_array") == 0) { AB2(MACH_IS_ARRAY); }
else if (strcmp(op, "is_func") == 0) { AB2(MACH_IS_FUNC); }
else if (strcmp(op, "is_record") == 0) { AB2(MACH_IS_RECORD); }
else if (strcmp(op, "is_stone") == 0) { AB2(MACH_IS_STONE); }
else if (strcmp(op, "length") == 0) { AB2(MACH_LENGTH); }
else if (strcmp(op, "typeof") == 0) { AB2(MACH_TYPEOF); }
/* Logical */
else if (strcmp(op, "not") == 0) { AB2(MACH_NOT); }
else if (strcmp(op, "and") == 0) { ABC3(MACH_AND); }

View File

@@ -596,6 +596,13 @@ typedef enum MachOpcode {
/* Misc */
MACH_IN, /* R(A) = (R(B) in R(C)) — has property (ABC) */
/* Extended type checks (AB) */
MACH_IS_ARRAY, /* R(A) = is_array(R(B)) */
MACH_IS_FUNC, /* R(A) = is_function(R(B)) */
MACH_IS_RECORD, /* R(A) = is_object(R(B)) */
MACH_IS_STONE, /* R(A) = is_stone(R(B)) */
MACH_LENGTH, /* R(A) = length(R(B)) — array/text/blob length */
MACH_OP_COUNT
} MachOpcode;
@@ -724,6 +731,12 @@ static const char *mach_opcode_names[MACH_OP_COUNT] = {
[MACH_DISRUPT] = "disrupt",
[MACH_SET_VAR] = "set_var",
[MACH_IN] = "in",
/* Extended type checks */
[MACH_IS_ARRAY] = "is_array",
[MACH_IS_FUNC] = "is_func",
[MACH_IS_RECORD] = "is_record",
[MACH_IS_STONE] = "is_stone",
[MACH_LENGTH] = "length",
};
/* Compiled register-based code (off-heap, never GC'd).

View File

@@ -486,7 +486,7 @@ JS_BOOL JS_IsRecord(JSValue v);
JS_BOOL JS_IsFunction(JSValue v);
JS_BOOL JS_IsBlob(JSValue v);
JS_BOOL JS_IsText(JSValue v);
static JS_BOOL JS_IsStone(JSValue v);
JS_BOOL JS_IsStone(JSValue v);
// Fundamental
int JS_GetLength (JSContext *ctx, JSValue obj, int64_t *pres);