streamline mcode
This commit is contained in:
@@ -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); }
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user