Merge branch 'gen_dylib'
This commit is contained in:
@@ -85,6 +85,12 @@ static JSValue *mach_materialize_cpool(JSContext *ctx, MachCPoolEntry *entries,
|
||||
/* ---- Link pass: resolve GETNAME to GETINTRINSIC or GETENV ---- */
|
||||
|
||||
static void mach_link_code(JSContext *ctx, JSCodeRegister *code, JSValue env) {
|
||||
if (!JS_IsNull(env) && !JS_IsStone(env)) {
|
||||
fprintf(stderr, "mach_link_code: ERROR env not stone (code=%s file=%s)\n",
|
||||
code->name_cstr ? code->name_cstr : "<unknown>",
|
||||
code->filename_cstr ? code->filename_cstr : "<unknown>");
|
||||
abort();
|
||||
}
|
||||
JSGCRef env_ref;
|
||||
JS_PushGCRef(ctx, &env_ref);
|
||||
env_ref.val = env;
|
||||
@@ -809,7 +815,7 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code,
|
||||
DT(MACH_ADD), DT(MACH_SUB),
|
||||
DT(MACH_MUL), DT(MACH_DIV),
|
||||
DT(MACH_MOD), DT(MACH_POW),
|
||||
DT(MACH_NEG), DT(MACH_INC), DT(MACH_DEC),
|
||||
DT(MACH_NEG),
|
||||
DT(MACH_EQ), DT(MACH_NEQ),
|
||||
DT(MACH_LT), DT(MACH_LE),
|
||||
DT(MACH_GT), DT(MACH_GE),
|
||||
@@ -859,7 +865,7 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code,
|
||||
DT(MACH_GOINVOKE),
|
||||
DT(MACH_JMPNOTNULL),
|
||||
DT(MACH_DISRUPT),
|
||||
DT(MACH_SET_VAR), DT(MACH_IN),
|
||||
DT(MACH_IN),
|
||||
DT(MACH_IS_ARRAY), DT(MACH_IS_FUNC),
|
||||
DT(MACH_IS_RECORD), DT(MACH_IS_STONE),
|
||||
DT(MACH_LENGTH), DT(MACH_IS_PROXY),
|
||||
@@ -1218,38 +1224,6 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code,
|
||||
VM_BREAK();
|
||||
}
|
||||
|
||||
VM_CASE(MACH_INC): {
|
||||
JSValue v = frame->slots[b];
|
||||
if (JS_IsInt(v)) {
|
||||
int32_t i = JS_VALUE_GET_INT(v);
|
||||
if (i == INT32_MAX)
|
||||
frame->slots[a] = JS_NewFloat64(ctx, (double)i + 1);
|
||||
else
|
||||
frame->slots[a] = JS_NewInt32(ctx, i + 1);
|
||||
} else {
|
||||
double d;
|
||||
JS_ToFloat64(ctx, &d, v);
|
||||
frame->slots[a] = JS_NewFloat64(ctx, d + 1);
|
||||
}
|
||||
VM_BREAK();
|
||||
}
|
||||
|
||||
VM_CASE(MACH_DEC): {
|
||||
JSValue v = frame->slots[b];
|
||||
if (JS_IsInt(v)) {
|
||||
int32_t i = JS_VALUE_GET_INT(v);
|
||||
if (i == INT32_MIN)
|
||||
frame->slots[a] = JS_NewFloat64(ctx, (double)i - 1);
|
||||
else
|
||||
frame->slots[a] = JS_NewInt32(ctx, i - 1);
|
||||
} else {
|
||||
double d;
|
||||
JS_ToFloat64(ctx, &d, v);
|
||||
frame->slots[a] = JS_NewFloat64(ctx, d - 1);
|
||||
}
|
||||
VM_BREAK();
|
||||
}
|
||||
|
||||
VM_CASE(MACH_LNOT): {
|
||||
int bval = JS_ToBool(ctx, frame->slots[b]);
|
||||
frame->slots[a] = JS_NewBool(ctx, !bval);
|
||||
@@ -2075,21 +2049,6 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code,
|
||||
VM_CASE(MACH_DISRUPT):
|
||||
goto disrupt;
|
||||
|
||||
/* Variable storage: env/global[K(Bx)] = R(A) */
|
||||
VM_CASE(MACH_SET_VAR): {
|
||||
int bx = MACH_GET_Bx(instr);
|
||||
JSValue key = code->cpool[bx];
|
||||
JSValue val = frame->slots[a];
|
||||
JSValue cur_env = JS_VALUE_GET_FUNCTION(frame->function)->u.reg.env_record;
|
||||
if (!JS_IsNull(cur_env)) {
|
||||
JS_SetProperty(ctx, cur_env, key, val);
|
||||
} else {
|
||||
JS_SetProperty(ctx, ctx->global_obj, key, val);
|
||||
}
|
||||
frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val);
|
||||
VM_BREAK();
|
||||
}
|
||||
|
||||
/* Has-property check (mcode name) */
|
||||
VM_CASE(MACH_IN): {
|
||||
JSValue key = frame->slots[b];
|
||||
@@ -2128,6 +2087,7 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code,
|
||||
pc = code->disruption_pc;
|
||||
ctx->disruption_reported = FALSE;
|
||||
frame_ref.val = JS_MKPTR(frame); /* root handler frame for GC */
|
||||
ctx->current_exception = JS_NULL;
|
||||
break;
|
||||
}
|
||||
if (JS_IsNull(frame->caller)) {
|
||||
@@ -2334,9 +2294,6 @@ static int mcode_reg_items(cJSON *it, cJSON **out) {
|
||||
/* goinvoke: [1]=frame only (no result) */
|
||||
if (!strcmp(op, "goinvoke")) { ADD(1); return c; }
|
||||
|
||||
/* set_var: [1]=name(string), [2]=val */
|
||||
if (!strcmp(op, "set_var")) { ADD(2); return c; }
|
||||
|
||||
/* setarg: [1]=call, [2]=arg_idx(const), [3]=val */
|
||||
if (!strcmp(op, "setarg")) { ADD(1); ADD(3); return c; }
|
||||
|
||||
@@ -2906,12 +2863,6 @@ static MachCode *mcode_lower_func(cJSON *fobj, const char *filename) {
|
||||
else if (strcmp(op, "disrupt") == 0) {
|
||||
EM(MACH_ABC(MACH_DISRUPT, 0, 0, 0));
|
||||
}
|
||||
/* Variable storage */
|
||||
else if (strcmp(op, "set_var") == 0) {
|
||||
const char *vname = cJSON_GetArrayItem(it, 1)->valuestring;
|
||||
int val_reg = A2;
|
||||
EM(MACH_ABx(MACH_SET_VAR, val_reg, ml_cpool_str(&s, vname)));
|
||||
}
|
||||
/* Misc */
|
||||
else if (strcmp(op, "in") == 0) {
|
||||
EM(MACH_ABC(MACH_IN, A1, A2, A3));
|
||||
@@ -3341,8 +3292,6 @@ static void dump_register_code(JSContext *ctx, JSCodeRegister *code, int indent)
|
||||
/* A, B: move, unary ops */
|
||||
case MACH_MOVE:
|
||||
case MACH_NEG:
|
||||
case MACH_INC:
|
||||
case MACH_DEC:
|
||||
case MACH_LNOT:
|
||||
case MACH_BNOT:
|
||||
printf("r%d, r%d", a, b);
|
||||
|
||||
Reference in New Issue
Block a user