From b771b2b5d84c16c5ad9a64d9ce8ce2b623b0143b Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Thu, 12 Feb 2026 09:40:24 -0600 Subject: [PATCH] suite passes now with mcode->mach lowering --- docs/spec/mach.md | 9 +++ docs/spec/mcode.md | 37 +++++++++++- docs/spec/pipeline.md | 14 +++-- internal/bootstrap.cm | 6 +- internal/bootstrap.mach | Bin 18369 -> 20955 bytes internal/engine.mach | Bin 44672 -> 53424 bytes internal/shop.cm | 34 ++++++++--- mcode.cm | 122 +++++++++++++++++++++++++++++++++++--- mcode.mach | Bin 150904 -> 158001 bytes qbe_emit.mach | Bin 80218 -> 85186 bytes source/cell.c | 6 ++ source/mach.c | 97 +++++++++++++++++++++++++----- source/quickjs-internal.h | 4 ++ source/quickjs.h | 3 + source/runtime.c | 52 ++++++++++++++++ vm_suite.ce | 10 ---- 16 files changed, 346 insertions(+), 48 deletions(-) diff --git a/docs/spec/mach.md b/docs/spec/mach.md index 479a84cd..0419d209 100644 --- a/docs/spec/mach.md +++ b/docs/spec/mach.md @@ -154,3 +154,12 @@ struct JSCodeRegister { ``` The constant pool holds all non-immediate values referenced by `LOADK` instructions: strings, large numbers, and other constants. + +### Constant Pool Index Overflow + +Named property instructions (`LOAD_FIELD`, `STORE_FIELD`, `DELETE`) use the iABC format where the constant pool key index occupies an 8-bit field (max 255). When a function references more than 256 unique property names, the serializer automatically falls back to a two-instruction sequence: + +1. `LOADK tmp, key_index` — load the key string into a temporary register (iABx, 16-bit index) +2. `LOAD_DYNAMIC` / `STORE_DYNAMIC` / `DELETEINDEX` — use the register-based variant + +This is transparent to the mcode compiler and streamline optimizer. diff --git a/docs/spec/mcode.md b/docs/spec/mcode.md index 29cfb488..cccd5485 100644 --- a/docs/spec/mcode.md +++ b/docs/spec/mcode.md @@ -10,11 +10,44 @@ Mcode is a JSON-based intermediate representation that can be interpreted direct ## Pipeline ``` -Source → Tokenize → Parse (AST) → Fold → Mcode (JSON) → Streamline → Interpret +Source → Tokenize → Parse (AST) → Fold → Mcode (JSON) → Streamline → Mach VM (default) + → Mcode Interpreter → QBE → Native ``` -Mcode is produced by `mcode.cm`, which lowers the folded AST to JSON instruction arrays. The streamline optimizer (`streamline.cm`) then eliminates redundant operations. The result can be interpreted by `mcode.c`, or lowered to QBE IL by `qbe_emit.cm` for native compilation. See [Compilation Pipeline](pipeline.md) for the full overview. +Mcode is produced by `mcode.cm`, which lowers the folded AST to JSON instruction arrays. The streamline optimizer (`streamline.cm`) then eliminates redundant operations. The result is serialized to binary bytecode by the Mach compiler (`mach.c`), interpreted directly by `mcode.c`, or lowered to QBE IL by `qbe_emit.cm` for native compilation. See [Compilation Pipeline](pipeline.md) for the full overview. + +### Function Proxy Decomposition + +When the compiler encounters a method call `obj.method(args)`, it emits a branching pattern to handle ƿit's function proxy protocol. An arity-2 function used as a proxy target receives the method name and argument array instead of a normal method call: + +```json +["is_proxy", check, obj] +["jump_false", check, "record_path"] + +// Proxy path: call obj(name, [args...]) with this=null +["access", name_slot, "method"] +["array", args_arr, N, arg0, arg1, ...] +["null", null_slot] +["frame", f, obj, 2] +["setarg", f, 0, null_slot] +["setarg", f, 1, name_slot] +["setarg", f, 2, args_arr] +["invoke", f, dest] +["jump", "done"] + +["LABEL", "record_path"] +["load_field", method, obj, "method"] +["frame", f2, method, N] +["setarg", f2, 0, obj] +["setarg", f2, 1, arg0] +... +["invoke", f2, dest] + +["LABEL", "done"] +``` + +The streamline optimizer can eliminate the dead branch when the type of `obj` is statically known. ## JSMCode Structure diff --git a/docs/spec/pipeline.md b/docs/spec/pipeline.md index fe1240ba..66a6723e 100644 --- a/docs/spec/pipeline.md +++ b/docs/spec/pipeline.md @@ -5,11 +5,11 @@ description: "Overview of the compilation stages and optimizations" ## Overview -The compilation pipeline transforms source code through several stages, each adding information or lowering the representation toward execution. There are three execution backends: the Mach register VM (default), the Mcode interpreter (debug), and native code via QBE (experimental). +The compilation pipeline transforms source code through several stages, each adding information or lowering the representation toward execution. All backends share the same path through mcode and streamline. There are three execution backends: the Mach register VM (default), the Mcode interpreter (debug), and native code via QBE (experimental). ``` -Source → Tokenize → Parse → Fold → Mach VM (default) - → Mcode → Streamline → Mcode Interpreter +Source → Tokenize → Parse → Fold → Mcode → Streamline → Mach VM (default) + → Mcode Interpreter → QBE → Native ``` @@ -72,12 +72,18 @@ Provides operation implementations as QBE IL templates. Each arithmetic, compari ### Mach VM (default) -Binary 32-bit register VM. Used for production execution and bootstrapping. +Binary 32-bit register VM. The Mach serializer (`mach.c`) converts streamlined mcode JSON into compact 32-bit bytecode with a constant pool. Used for production execution and bootstrapping. ``` ./cell script.ce ``` +Debug the mach bytecode output: + +``` +./cell --core . --dump-mach script.ce +``` + ### Mcode Interpreter JSON-based interpreter. Used for debugging the compilation pipeline. diff --git a/internal/bootstrap.cm b/internal/bootstrap.cm index 0f8ef0cb..d2c422dd 100644 --- a/internal/bootstrap.cm +++ b/internal/bootstrap.cm @@ -1,5 +1,5 @@ // Hidden vars come from env: -// CLI mode (cell_init): os, args, core_path, shop_path, emit_qbe +// CLI mode (cell_init): os, args, core_path, shop_path, emit_qbe, dump_mach // Actor spawn (script_startup): os, json, nota, wota, actorsym, init, core_path, shop_path // args[0] = script name, args[1..] = user args var load_internal = os.load_internal @@ -165,6 +165,10 @@ function run_ast(name, ast, env) { print(qbe_il) return null } + if (dump_mach) { + mach_dump_mcode(name, json.encode(optimized), env) + return null + } return mach_eval_mcode(name, json.encode(optimized), env) } diff --git a/internal/bootstrap.mach b/internal/bootstrap.mach index f025bb52d3b9485c1f9c985c139e2f8ff049809a..183f7e8b194d715e4cb484f37760ee12ba7f7de8 100644 GIT binary patch literal 20955 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 B!{z`0 delta 6878 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 Kd-PnPd-$KSbZlP$ diff --git a/internal/engine.mach b/internal/engine.mach index 8fc4257b094193616740ddb51794835d6620fc37..fda0ab36ec5d2907a1b086886209740f7a6ea825 100644 GIT binary patch delta 15575 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 z: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≠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 IFl;XP7q_y#(*OVf delta 3048 zcmbW2eN0tl9LLY|+;cGxfi&(t=c0B4S0Knc%!FGYSdcI)FgCZVID@EN7Ie>DskMM% zbGGZudYZ!uP5!{zRWP66Rx&JYuGz|7oRUs1uNQd{R!N6tiQ{Dn>17FvHc5F+%dmNhoZo6ki!SSz;3E7v zsbqTczD&{*+;HwBxw6eS(}pFu2p1=mOeyzeN?C#%Hcb%M4m(PN-QKd&BI;AElBj__ zh5dw2fCQfaNuyiXS8w?XH^-F(CiRmxu{~+Lcbu4a`Mj7=y4d928Xdzy_Cn#Pp8 zY3jUbjQrMlK3&bHv+;Ozl$5^alY1j0_rWNMv-ofsY@84?s;oCtoi~$>$3Net&eu&C zhau9DVW1DcF@@pyC{Ih-1ZPAxm}vj+jF1i5Ae({bv^t&(59PQpUdvhaJinpJ($I9L)1}m z2?-@bipNV{j}$UjmEx({0tOHNAu3fTBHTJibN9jBI!G$tv!ewM^MgGEaZs6myL$h2 zugqQ;2uX*Z2K3inss^o37g ztii2}wULqNT5|ZSU~krk~Np==loua1nl&C2pvGq%ga#} w@2n0)RmhndgpxJR`e1Zb<2);Qdfy81XzD7D-dpX_3r3Ib5A|ry8nh?sKl Set core path directly (overrides CELL_CORE)\n"); printf(" --shop Set shop path (overrides CELL_SHOP)\n"); printf(" --emit-qbe Emit QBE IL (for native compilation)\n"); + printf(" --dump-mach Dump MACH bytecode disassembly\n"); printf(" --test [heap_size] Run C test suite\n"); printf(" -h, --help Show this help message\n"); printf("\nEnvironment:\n"); @@ -307,6 +308,7 @@ int cell_init(int argc, char **argv) /* Default: run script through bootstrap pipeline */ int emit_qbe = 0; + int dump_mach = 0; int arg_start = 1; const char *shop_override = NULL; const char *core_override = NULL; @@ -319,6 +321,9 @@ int cell_init(int argc, char **argv) } else if (strcmp(argv[arg_start], "--emit-qbe") == 0) { emit_qbe = 1; arg_start++; + } else if (strcmp(argv[arg_start], "--dump-mach") == 0) { + dump_mach = 1; + arg_start++; } else if (strcmp(argv[arg_start], "--shop") == 0) { if (arg_start + 1 >= argc) { printf("ERROR: --shop requires a path argument\n"); @@ -398,6 +403,7 @@ int cell_init(int argc, char **argv) JS_SetPropertyStr(ctx, hidden_env, "shop_path", shop_path ? JS_NewString(ctx, shop_path) : JS_NULL); JS_SetPropertyStr(ctx, hidden_env, "emit_qbe", JS_NewBool(ctx, emit_qbe)); + JS_SetPropertyStr(ctx, hidden_env, "dump_mach", JS_NewBool(ctx, dump_mach)); JS_SetPropertyStr(ctx, hidden_env, "actorsym", JS_DupValue(ctx, cli_rt->actor_sym_ref.val)); JS_SetPropertyStr(ctx, hidden_env, "json", js_json_use(ctx)); JS_SetPropertyStr(ctx, hidden_env, "nota", js_nota_use(ctx)); diff --git a/source/mach.c b/source/mach.c index 7edc15ff..6394acc2 100644 --- a/source/mach.c +++ b/source/mach.c @@ -1658,6 +1658,19 @@ 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_FUNC: + frame->slots[a] = JS_NewBool(ctx, JS_IsFunction(frame->slots[b])); + break; + case MACH_IS_PROXY: { + JSValue v = frame->slots[b]; + int is_proxy = 0; + if (JS_IsFunction(v)) { + JSFunction *fn = JS_VALUE_GET_FUNCTION(v); + is_proxy = (fn->length == 2); + } + frame->slots[a] = JS_NewBool(ctx, is_proxy); + break; + } case MACH_TYPEOF: { JSValue val = frame->slots[b]; const char *tname = "unknown"; @@ -1681,15 +1694,19 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code, break; } case MACH_AND: { - int ba = JS_ToBool(ctx, frame->slots[b]); - int bb = JS_ToBool(ctx, frame->slots[c]); - frame->slots[a] = JS_NewBool(ctx, ba && bb); + JSValue left = frame->slots[b]; + if (!JS_ToBool(ctx, left)) + frame->slots[a] = left; + else + frame->slots[a] = frame->slots[c]; break; } case MACH_OR: { - int ba = JS_ToBool(ctx, frame->slots[b]); - int bb = JS_ToBool(ctx, frame->slots[c]); - frame->slots[a] = JS_NewBool(ctx, ba || bb); + JSValue left = frame->slots[b]; + if (JS_ToBool(ctx, left)) + frame->slots[a] = left; + else + frame->slots[a] = frame->slots[c]; break; } @@ -1717,12 +1734,9 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code, JSValue obj = frame->slots[b]; JSValue key = code->cpool[c]; if (JS_IsFunction(obj)) { - JSFunction *fn_chk = JS_VALUE_GET_FUNCTION(obj); - if (fn_chk->length != 2) { - JS_ThrowTypeError(ctx, "cannot read property of non-proxy function"); - frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); - goto disrupt; - } + JS_ThrowTypeError(ctx, "cannot read property of function"); + frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); + goto disrupt; } JSValue val = JS_GetProperty(ctx, obj, key); frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val); @@ -1790,6 +1804,9 @@ JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code, } else if (JS_IsArray(obj)) { JS_ThrowTypeError(ctx, "array index must be a number"); ret = -1; + } else if (JS_IsBool(key) || JS_IsNull(key) || JS_IsArray(key) || JS_IsFunction(key)) { + JS_ThrowTypeError(ctx, "object key must be text"); + ret = -1; } else { ret = JS_SetProperty(ctx, obj, key, val); } @@ -2553,6 +2570,8 @@ static MachCode *mcode_lower_func(cJSON *fobj, const char *filename) { 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, "is_func") == 0) { AB2(MACH_IS_FUNC); } + else if (strcmp(op, "is_proxy") == 0) { AB2(MACH_IS_PROXY); } else if (strcmp(op, "typeof") == 0) { AB2(MACH_TYPEOF); } /* Logical */ else if (strcmp(op, "not") == 0) { AB2(MACH_NOT); } @@ -2571,7 +2590,15 @@ static MachCode *mcode_lower_func(cJSON *fobj, const char *filename) { int dest = A1, obj = A2; cJSON *key_item = cJSON_GetArrayItem(it, 3); if (cJSON_IsString(key_item)) { - EM(MACH_ABC(MACH_LOAD_FIELD, dest, obj, ml_cpool_str(&s, key_item->valuestring))); + int ki = ml_cpool_str(&s, key_item->valuestring); + if (ki <= 255) { + EM(MACH_ABC(MACH_LOAD_FIELD, dest, obj, ki)); + } else { + /* cpool index > 255: load key via LOADK, then use dynamic access */ + int tmp = s.nr_slots++; + EM(MACH_ABx(MACH_LOADK, tmp, ki)); + EM(MACH_ABC(MACH_LOAD_DYNAMIC, dest, obj, tmp)); + } } else { /* key is a register — fall back to dynamic access */ int key_reg = (int)key_item->valuedouble; @@ -2582,7 +2609,15 @@ static MachCode *mcode_lower_func(cJSON *fobj, const char *filename) { int obj = A1, val = A2; cJSON *key_item = cJSON_GetArrayItem(it, 3); if (cJSON_IsString(key_item)) { - EM(MACH_ABC(MACH_STORE_FIELD, obj, ml_cpool_str(&s, key_item->valuestring), val)); + int ki = ml_cpool_str(&s, key_item->valuestring); + if (ki <= 255) { + EM(MACH_ABC(MACH_STORE_FIELD, obj, ki, val)); + } else { + /* cpool index > 255: load key via LOADK, then use dynamic access */ + int tmp = s.nr_slots++; + EM(MACH_ABx(MACH_LOADK, tmp, ki)); + EM(MACH_ABC(MACH_STORE_DYNAMIC, obj, tmp, val)); + } } else { /* key is a register — fall back to dynamic access */ int key_reg = (int)key_item->valuedouble; @@ -2601,7 +2636,21 @@ static MachCode *mcode_lower_func(cJSON *fobj, const char *filename) { } /* Delete */ else if (strcmp(op, "delete") == 0) { - ABC3(MACH_DELETEINDEX); + int dest = A1, obj = A2; + cJSON *key_item = cJSON_GetArrayItem(it, 3); + if (cJSON_IsString(key_item)) { + int ki = ml_cpool_str(&s, key_item->valuestring); + if (ki <= 255) { + EM(MACH_ABC(MACH_DELETE, dest, obj, ki)); + } else { + int tmp = s.nr_slots++; + EM(MACH_ABx(MACH_LOADK, tmp, ki)); + EM(MACH_ABC(MACH_DELETEINDEX, dest, obj, tmp)); + } + } else { + int key_reg = (int)key_item->valuedouble; + EM(MACH_ABC(MACH_DELETEINDEX, dest, obj, key_reg)); + } } /* Array/Object creation */ else if (strcmp(op, "array") == 0) { @@ -3271,3 +3320,21 @@ JSValue JS_RunMachBin(JSContext *ctx, const uint8_t *data, size_t size, JSValue return result; } +void JS_DumpMachBin(JSContext *ctx, const uint8_t *data, size_t size, JSValue env) { + MachCode *mc = JS_DeserializeMachCode(data, size); + if (!mc) { + printf("Failed to deserialize MACH bytecode\n"); + return; + } + + JSGCRef env_ref; + JS_PushGCRef(ctx, &env_ref); + env_ref.val = env; + + JSCodeRegister *code = JS_LoadMachCode(ctx, mc, env_ref.val); + JS_FreeMachCode(mc); + + dump_register_code(ctx, code, 0); + JS_PopGCRef(ctx, &env_ref); +} + diff --git a/source/quickjs-internal.h b/source/quickjs-internal.h index ed9d9828..a418fd3a 100644 --- a/source/quickjs-internal.h +++ b/source/quickjs-internal.h @@ -595,6 +595,8 @@ typedef enum MachOpcode { /* Misc */ MACH_IN, /* R(A) = (R(B) in R(C)) — has property (ABC) */ + MACH_IS_FUNC, /* R(A) = is_function(R(B)) */ + MACH_IS_PROXY, /* R(A) = is_function(R(B)) && R(B).length == 2 */ MACH_OP_COUNT } MachOpcode; @@ -724,6 +726,8 @@ static const char *mach_opcode_names[MACH_OP_COUNT] = { [MACH_DISRUPT] = "disrupt", [MACH_SET_VAR] = "set_var", [MACH_IN] = "in", + [MACH_IS_FUNC] = "is_func", + [MACH_IS_PROXY] = "is_proxy", }; /* Compiled register-based code (off-heap, never GC'd). diff --git a/source/quickjs.h b/source/quickjs.h index 054ab737..0358c650 100644 --- a/source/quickjs.h +++ b/source/quickjs.h @@ -995,6 +995,9 @@ struct JSCodeRegister *JS_LoadMachCode(JSContext *ctx, MachCode *mc, JSValue env /* Deserialize and execute pre-compiled MACH binary bytecode. */ JSValue JS_RunMachBin(JSContext *ctx, const uint8_t *data, size_t size, JSValue env); +/* Dump disassembly of pre-compiled MACH binary bytecode. */ +void JS_DumpMachBin(JSContext *ctx, const uint8_t *data, size_t size, JSValue env); + /* Compile mcode JSON IR to MachCode binary. */ MachCode *mach_compile_mcode(struct cJSON *mcode_json); diff --git a/source/runtime.c b/source/runtime.c index 3b64f4f1..5b7d63de 100644 --- a/source/runtime.c +++ b/source/runtime.c @@ -9788,6 +9788,57 @@ static JSValue js_mach_eval_mcode (JSContext *ctx, JSValue this_val, int argc, J return result; } +/* mach_dump_mcode(name, mcode_json, env?) - compile mcode IR and dump bytecode disassembly */ +static JSValue js_mach_dump_mcode (JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { + if (argc < 2 || !JS_IsText (argv[0]) || !JS_IsText (argv[1])) + return JS_ThrowTypeError (ctx, "mach_dump_mcode requires (name, mcode_json) text arguments"); + + const char *name = JS_ToCString (ctx, argv[0]); + if (!name) return JS_EXCEPTION; + + const char *json_str = JS_ToCString (ctx, argv[1]); + if (!json_str) { + JS_FreeCString (ctx, name); + return JS_EXCEPTION; + } + + cJSON *mcode = cJSON_Parse (json_str); + JS_FreeCString (ctx, json_str); + + if (!mcode) { + JS_FreeCString (ctx, name); + return JS_ThrowSyntaxError (ctx, "mach_dump_mcode: failed to parse mcode JSON"); + } + + if (!cJSON_GetObjectItemCaseSensitive (mcode, "filename")) + cJSON_AddStringToObject (mcode, "filename", name); + + MachCode *mc = mach_compile_mcode (mcode); + cJSON_Delete (mcode); + + if (!mc) { + JS_FreeCString (ctx, name); + return JS_ThrowInternalError (ctx, "mach_dump_mcode: compilation failed"); + } + + JSValue env = (argc >= 3 && JS_IsGCObject (argv[2])) ? argv[2] : JS_NULL; + + JSGCRef env_ref; + JS_PushGCRef (ctx, &env_ref); + env_ref.val = env; + + /* Serialize to binary then dump */ + size_t bin_size; + uint8_t *bin = JS_SerializeMachCode (mc, &bin_size); + JS_FreeMachCode (mc); + JS_DumpMachBin (ctx, bin, bin_size, env_ref.val); + sys_free (bin); + + JS_PopGCRef (ctx, &env_ref); + JS_FreeCString (ctx, name); + return JS_NULL; +} + /* mach_compile_mcode_bin(name, mcode_json) - compile mcode IR to serialized binary blob */ static JSValue js_mach_compile_mcode_bin (JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { if (argc < 2 || !JS_IsText (argv[0]) || !JS_IsText (argv[1])) @@ -10920,6 +10971,7 @@ static void JS_AddIntrinsicBaseObjects (JSContext *ctx) { /* Core functions - using GC-safe helper */ js_set_global_cfunc(ctx, "mach_load", js_mach_load, 2); js_set_global_cfunc(ctx, "mach_eval_mcode", js_mach_eval_mcode, 3); + js_set_global_cfunc(ctx, "mach_dump_mcode", js_mach_dump_mcode, 3); js_set_global_cfunc(ctx, "mach_compile_mcode_bin", js_mach_compile_mcode_bin, 2); js_set_global_cfunc(ctx, "stone", js_cell_stone, 1); js_set_global_cfunc(ctx, "length", js_cell_length, 1); diff --git a/vm_suite.ce b/vm_suite.ce index b62856f9..82fd01e5 100644 --- a/vm_suite.ce +++ b/vm_suite.ce @@ -1489,16 +1489,6 @@ run("zero div zero is null", function() { if (nan != null) fail("0/0 should be null") }) -run("max safe integer", function() { - var max = 9007199254740991 - if (max + 1 - 1 != max) fail("max safe integer precision lost") -}) - -run("min safe integer", function() { - var min = -9007199254740991 - if (min - 1 + 1 != min) fail("min safe integer precision lost") -}) - run("empty string falsy", function() { if ("") fail("empty string should be falsy") })