From cdddbf675ac91f97634acae3b9706974ced86e35 Mon Sep 17 00:00:00 2001 From: Aaron Sinclair Date: Sat, 15 Nov 2025 03:39:43 -0800 Subject: [PATCH] Add component parameter support and fix JS runtime - Emit function parameters in component signature - JS runtime passes props as positional arguments - Remove incorrect return value handling (components call js_set_root internally) - Enables: def Tabs(orientation=0) - All tests passing (30/30) --- examples/runtime/ritz-runtime.js | 6 +----- examples/tabs/Tabs.ll | 2 +- examples/tabs/Tabs.wasm | Bin 3205 -> 3205 bytes .../llvm_codegen_signals.cpython-313.pyc | Bin 25957 -> 26276 bytes ritz/llvm_codegen_signals.py | 11 ++++++++++- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/examples/runtime/ritz-runtime.js b/examples/runtime/ritz-runtime.js index 4143e0e..4292517 100644 --- a/examples/runtime/ritz-runtime.js +++ b/examples/runtime/ritz-runtime.js @@ -277,12 +277,8 @@ class RitzLoader { } // Pass props as positional arguments - // Components now RETURN the root element ID instead of calling js_set_root const propValues = Object.values(props); - const rootElementId = renderFn(...propValues); - - // Mount the returned element to the DOM - runtime.js_set_root(rootElementId); + renderFn(...propValues); // Update signals runtime.updateSignals(); diff --git a/examples/tabs/Tabs.ll b/examples/tabs/Tabs.ll index cf6bd75..c776f15 100644 --- a/examples/tabs/Tabs.ll +++ b/examples/tabs/Tabs.ll @@ -299,7 +299,7 @@ entry: } ; Component render function -define void @render_Tabs() { +define void @render_Tabs(i32 %orientation) { entry: %var56 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) call void @js_set_attribute(i32 %var56, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.28, i32 0, i32 0)) diff --git a/examples/tabs/Tabs.wasm b/examples/tabs/Tabs.wasm index 9ee906c988b07267a0b2e5d81ea83d91e9feb9f7..c7ec38db5f9aec056f7031e0559c7c8c77a3ec4e 100755 GIT binary patch delta 19 acmZpbY?Yj_laX=bt{u#bESrm2gg5|0(FOMa delta 19 acmZpbY?Yj_laXQLt{u#btecBjgg5|0%LVrU diff --git a/ritz/__pycache__/llvm_codegen_signals.cpython-313.pyc b/ritz/__pycache__/llvm_codegen_signals.cpython-313.pyc index 4d12edbab21c1e7129a3ab7d455cd87c68befaa0..38a7dc5c627e95e66ff1d22f6d22422ea1b158d3 100644 GIT binary patch delta 1310 zcmZWpZ%kWN6u+nKdwu;w3)1qpK$*kQ!6;kDh7*|67C{AB%bS@XZGmp3L|s%?6>i;j*vHq3?UGho7Bk=1gw76 z;qsCu7UCQuU-~%MKc*vDxQhbXd*Q(#C`kRHS{p!=)?G3-2q93+Ht+dJ%Rc4o##CQ?ckw99FA}(WT4u^ zF}7nkm5!!kiC8l2F;mumLJb@`Ih^KcX6=yhNIaER1&XP?Hf?oW&XQ zEoXTquxc&(!CJ9ot;h=5*j)Q;A{$<;Z2I1MU|k?Zt~(-WXuj;9?wsnJIlb)gTn}bU ztGHfYn+G>MH_E^AFP0r$mV%0V&sCk6;JRwCy3&Qedrfd#+4SBrKmwQcUx0HM?RQ~g ziJ*_4*igor-qDFK^7J|_{ZO+V%9Y2P3kA4<1FiSBUSu)q<8XWjdHndQ-Jqz z(tjSFQN+Ma5w4>8#0rd{@?^I-pWDXRRVjYT&Cjr|>q8jFRe!bcd^~;Xq5|Dlc*$G6 z9pdLa;|u()_i32JBl19*R{b?+HPMPnIcr2wC zc^T`;l30vCA9uhX%0I_T0Vc7aZyzk+Xub<0eHPfnk-jg1qObob{Ht8*_vk}Yoj9O$J*_F33mNOIBH4%0VdZ>tN;K2 delta 965 zcmX|ATSyd97(V}wGp?@fmbc6nTj}QJYMPg_%ni!TA~V@mAG|TSqi(vhb=)mY$Rdi~ zihhEEsEvH62r?$9mo88i1VvGF*&@0Sg!EuHDk$pwV|5kQBX{B59k73% zG9{IXby>>^?Fd}354kbkl48lV;JzhG@keGQMqF9=GOGa3xoib~MVA8LPnJbQ2CG}h zn4T0!@>}WbPgy2VwJ=t1$I-PpSiB&0u`UOsO=OzGSU@fi4zz+~DI$w5)t546V=fku z{@tpx7+$w~Qc?qwo%wBL5{mV2w<5bE9~${_jXQza#=Mmu|) z#y#&>8BXHO+F@ukR{0((FoHStPhm5DtY5$2A{8S^?)1qynKMb#`pn^Vg!HZmzd}A& zF|__X#4yj7FK-V;dxi{e!%@ohEKsLhBaiDizo{8c;c!!Xu9@~GSxq(npNEg(x2AG< zf}ZATWt+JF+v{LR>kEz=2b=pPg~G(J9w^h%)shKsjf$2T0K2iFbrFnVWU3R7x7y$X zo^8DaVcgo*2%n4_ZL1{P7}cYXfFH(mwFF+{O0^V@U`*X$`3}ZyH4bnQdpc{~B$y8n z(93WdnmKVEBSw93v-vT6-06ikm>s-4Gh5D!&x!Y+UKt-aSv None: """Emit component render function.""" component_name = ir["name"] + + # Build parameter list + params = ir.get("params", []) + param_list = [] + for param in params: + # For now, all params are i32 + param_list.append(f"i32 %{param['name']}") + param_str = ", ".join(param_list) if param_list else "" + self.lines.append("; Component render function") - self.lines.append(f"define void @render_{component_name}() {{") + self.lines.append(f"define void @render_{component_name}({param_str}) {{") self.lines.append("entry:") # Process component body (skip signals and functions, already handled)