From 8a84be65e1b7ef2e5019a644045e3ffe8b795fca Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Wed, 11 Feb 2026 14:41:37 -0600 Subject: [PATCH] new path --- dump_mcode.cm | 20 + internal/bootstrap.cm | 48 +- internal/bootstrap.mach | Bin 7976 -> 7792 bytes source/cell.c | 12 +- source/mach.c | 1013 ++++++++++++++++++++++++++++++++++++- source/quickjs-internal.h | 180 ++++++- source/quickjs.h | 3 + source/runtime.c | 50 ++ test_parse_boot.cm | 42 ++ 9 files changed, 1325 insertions(+), 43 deletions(-) create mode 100644 dump_mcode.cm create mode 100644 test_parse_boot.cm diff --git a/dump_mcode.cm b/dump_mcode.cm new file mode 100644 index 00000000..291b6e46 --- /dev/null +++ b/dump_mcode.cm @@ -0,0 +1,20 @@ +var fd = use("fd") +var json = use("json") +var tokenize = use("tokenize") +var parse = use("parse") +var fold = use("fold") +var mcode = use("mcode") +var streamline = use("streamline") + +var name = args[0] +var src = text(fd.slurp(name)) +var tok = tokenize(src, name) +var ast = parse(tok.tokens, src, name, tokenize) +var folded = fold(ast) +var compiled = mcode(folded) +var optimized = streamline(compiled) +var out = json.encode(optimized) +var f = fd.open("/tmp/mcode_dump.json", "w") +fd.write(f, out) +fd.close(f) +print("wrote /tmp/mcode_dump.json") diff --git a/internal/bootstrap.cm b/internal/bootstrap.cm index 09fb543f..26b10d95 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, use_mcode +// CLI mode (cell_init): os, args, core_path, shop_path, emit_qbe // 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 @@ -45,14 +45,11 @@ use_cache['tokenize'] = tokenize_mod use_cache['parse'] = parse_mod use_cache['fold'] = fold_mod -// Optionally load mcode compiler module -var mcode_mod = null +// Always load mcode compiler module +var mcode_mod = boot_load("mcode", boot_env) +use_cache['mcode'] = mcode_mod var streamline_mod = null var qbe_emit_mod = null -if (use_mcode) { - mcode_mod = boot_load("mcode", boot_env) - use_cache['mcode'] = mcode_mod -} // Warn if any .cm source is newer than its .mach bytecode function check_mach_stale() { @@ -146,33 +143,26 @@ function load_module(name, env) { // Load optimization pipeline modules (needs analyze to be defined) var qbe_macros = null -if (use_mcode) { - streamline_mod = load_module("streamline", boot_env) - use_cache['streamline'] = streamline_mod - if (emit_qbe) { - qbe_macros = load_module("qbe", boot_env) - qbe_emit_mod = load_module("qbe_emit", boot_env) - use_cache['qbe'] = qbe_macros - use_cache['qbe_emit'] = qbe_emit_mod - } +streamline_mod = load_module("streamline", boot_env) +use_cache['streamline'] = streamline_mod +if (emit_qbe) { + qbe_macros = load_module("qbe", boot_env) + qbe_emit_mod = load_module("qbe_emit", boot_env) + use_cache['qbe'] = qbe_macros + use_cache['qbe_emit'] = qbe_emit_mod } -// Run AST through either mcode or mach pipeline +// Run AST through mcode pipeline → register VM function run_ast(name, ast, env) { - var compiled = null - var optimized = null + var compiled = mcode_mod(ast) + var optimized = streamline_mod(compiled) var qbe_il = null - if (use_mcode) { - compiled = mcode_mod(ast) - optimized = streamline_mod(compiled) - if (emit_qbe) { - qbe_il = qbe_emit_mod(optimized, qbe_macros) - print(qbe_il) - return null - } - return mcode_run(name, json.encode(optimized), env) + if (emit_qbe) { + qbe_il = qbe_emit_mod(optimized, qbe_macros) + print(qbe_il) + return null } - return mach_eval_ast(name, json.encode(ast), env) + return mach_eval_mcode(name, json.encode(optimized), env) } // use() with ƿit pipeline for .cm modules diff --git a/internal/bootstrap.mach b/internal/bootstrap.mach index f2696e6932e007c2390c097037bcaef16003cede..2dc682f4c08c5f03401c6170de6ac01a2472b03b 100644 GIT binary patch delta 3102 zcma);S!`5Q7=ZsX(>v2nJ9O`K+I#PG?8*RPaj7V!Ac#^{LjYrJrz0`^4( z46R48DH!mn);_GwYS$-eMx@0o$=DSR*coQ#S&{#&LK)@S86(qhoy96jR|cEgq7tx0 zN=(acF_%e_l*$rG#7s*SDM?yGBxy$_Whqr^7FjK3J~qW-SRqL!qUi^MwGIW?HMo>w z6;PF?MNtNx{`0b&=K&G3OhPp=)6n~g8fmpux#vSfyMj2C60+<>$h2Z&XNtX}?DY1$%c9Ycoe0KLW>A}?ugfc6gm-SL2>&d-d>a%RXcZ1lF@^R!ji9(gjM)ZvY(R?Yz z@|Bdjd@T|AhQoX-L*zS>eNU3_vGw@@{Re_;ew2Lq3E!WHnade`&JgE}R6>o*S#gTx zEXJCjNp=qBa|AgjiGPt|eF;n)#4lor<~RI)qrhB#XZ<^IJQ|TBUH-uK5B6M~jPfTz zG=H)A7teC}oAuuW@@PbkbU80!IZx5&X{nD=hVa5kKow?)BjXZOQHVjKOP(qdjgzNZ zP&8x3P>dx8J_Txs6sU4AFCapK2zwD#o28KCg(NCeRZt5_7zq=y6sw>Vt70ip1)8h) ziDhU;HcKf*cr+n3tuQIWEaWUHqp&hn@6r2f{+O^cmU$n`)oQLlzk*xTT#0@qP11}* zAICFI8+x0>T*jl1XI?e!=Y?D-!vw`V<>V&mg!O;(|HjGQ^$H(2FFuo5M+kLv&^KBnI!a? z#mh5`wa;t<&*r6?&9m8@(q|5Z`pjj_=3?U!Lwd~Pg_=jac`{1owaBF?<8qjc?lB+3 z`53zN9w|))oSQhzO_GGBESoy6|s>(I%FcXF3LH%pN$;4BNdxkZFpjBOV+-GW>~ ztR-?$4k`4}8QPKUaw}(8N^h1*wPuR1$TEU0Vc^+)IV`;e0=td>-KNE9vq|p8Gt=XXwG+8!PWt&MI71(RhzW zFQp3Pv@NryYzn} za>rdum){d8M(bX%=+@4z`xe~Z*}Z7R;;ukQn=aRCLL@!1I_YSKWLTsn9Fc~wDmU^& z(omp`RG5E#j4*pjjC?~ur2Cq;GwkBe!Y=%B*^TXPJ{TVL z$dt<-V(sCiK6{C`mr()7Rr*NY$948`oqf!5F8es)K1M?G4vzaNKy!cs4p2ZY?@_>e z6yQ;hOu4*I0q;|Q&q4AX#P^^$CO?BYL@N)md5Bi~^yAP^(td3F`AYONxVd~lksnZ? z=0l47$fXKtLjw%GfWs1$!$q{=FdX5|j`WVO<|yYAmYcP;#RZ&_hN1e$(iJ8sC delta 3379 zcmb7`TWlQF8G!#Y>)F}0ch|9Z*Xy-sWDsdAm*mV`J! zE>(*VqpGwNA`+to0)dy7Yd}$i%%ugXNiaMBA~AhvcqmOFBFPK4f+*=j-S5ootk4ZA-e^9NV;$^ougg$fpCJG&YTMKJD6vw%s21cy<%9 z7gX(1kzKzsO}pBejyjc@)y^2%X5cJNy7Gn5=V!!lMHbkO+i!28+>9tkq*SmSl~Uq4 z&EmNkDLYEF*eOR(#nUOBxOk zv#viI_WQwrA!27G-chhkhv20SS>~u*=tLrywJWtr+;K~B+bM{nZEfdlTOFtM|A^Bn zz7FKsRO?W!OSR0VpJGfqCWEYm$LhF_xSm@;7TiJIcH0ZCTa3F-2mN{a^TTvr_s7W!g(&^*n;x#Emjk0=G+^AoU_B;5G;zk_jMZb&wg?o`gB%J-Doc{81>71<%9JMhQmUy+5m}V9 zN{gRX1(cqEjB1sTex&9CX;urMr$$y~BunzFvde4AxXxhg>H%h1qIh$kgG)xt712OR$`s)m(^v zA-kwqfxd#B)vQEcNuOpF`YI^|tVUlg3j!`ezla!`HRx+N37WO&Yq?$#G?E2XnaA9A3^Rrp=Sxer-{9IUZUlCqAwGoLQn16BM` zxtbtXbE6}!p^$4x7;!C^=UUnk!vr4YQVr8L%q%0WqtJ-!xy{#O6H-8ijBp7@h&Lij zWTc-5WQ4_^V=a2f4H({lVZhYGEoH+WV=`mnL2r%qT;lb_UN2=Bf(vSFkd)lWT*leC zpAzb4*xp1<8l$)8uX4Ymij|^NADKbH@33h1t-t;pL* z64Hz8m8~3wIl9q9wpH%VT^`#ZO_k?!Ugc1(Vel7}_)ENRCso89%>GW6`A+&He4ZhH zsxQAy`FG)R7b_pqgIpZ&8;bcYE_YMV@8BM0a1ZT>ds&ftDJ)_q?VU_yCucO`K4RR* zOBd3G>y9mk_8Z@#zqAa#iezGJ!%d^(KOfsX zI<{@Q{)aOf0HfdoiVv`U%aLwNS!TkJvc-RGgQeS*ES&H#S-OiecxO69#S+@8n zGcEBfL(GI3_~;M00r0FCeM-6;RnbhvWm%(YFq3?UHO8=usnEu(voZdsjjr<#((23O z?CBG{Cr`3xny1j8Vjm)&W_h3HZ!qE+mRz$ByL~(X`=r0dv-m&D{%f9N&oukl>-}uc ze)f7lwsR~+AJjifS5U#V^83M1Pqo{z$ezAzvZ; zD^#m_m8`FlRrBX62l>A|h+jR2usy^qLKY&+0f&iom=hfF8u4D^1cM(a(&07@k76sJvHU+#*0U-;K<$!l6;2jExI6}T7_#P48=4U=f zc^Hl|c$AkhVg`p9lFnc|!|OG}eX8eOihP#>HGiSVzXr4+UFe2IXK_qoaxBF%9E11R zv-hTU*u%?#!j&Tr=)w4{s}luO{YnCnt-P{Z1r&9<-bpB+)Mxf diff --git a/source/cell.c b/source/cell.c index e1a9e073..e28f18df 100644 --- a/source/cell.c +++ b/source/cell.c @@ -211,9 +211,9 @@ void script_startup(cell_rt *prt) JS_SetPropertyStr(js, hidden_env, "init", JS_NULL); } - // Set args and use_mcode to null/false for actor spawn (not CLI mode) + // Set args to null for actor spawn (not CLI mode) JS_SetPropertyStr(js, hidden_env, "args", JS_NULL); - JS_SetPropertyStr(js, hidden_env, "use_mcode", JS_NewBool(js, 0)); + /* use_mcode no longer needed — new bootstrap always uses mcode pipeline */ if (core_path) JS_SetPropertyStr(js, hidden_env, "core_path", JS_NewString(js, core_path)); @@ -290,7 +290,7 @@ static void print_usage(const char *prog) printf("Options:\n"); printf(" --core Set core path directly (overrides CELL_CORE)\n"); printf(" --shop Set shop path (overrides CELL_SHOP)\n"); - printf(" --mcode