fix intrinsics and env
This commit is contained in:
@@ -86,9 +86,10 @@ static JSValue *mach_materialize_cpool(JSContext *ctx, MachCPoolEntry *entries,
|
||||
|
||||
static void mach_link_code(JSContext *ctx, JSCodeRegister *code, JSValue env) {
|
||||
if (!JS_IsNull(env) && !JS_IsStone(env)) {
|
||||
fprintf(stderr, "mach_link_code: WARNING env not stone (code=%s file=%s)\n",
|
||||
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);
|
||||
@@ -864,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),
|
||||
@@ -2048,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];
|
||||
@@ -2301,9 +2287,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; }
|
||||
|
||||
@@ -2873,12 +2856,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));
|
||||
|
||||
Reference in New Issue
Block a user