From 9f601b1787cb37b2acc83ccda2f8267a7e9c495c Mon Sep 17 00:00:00 2001 From: Aaron Sinclair Date: Sat, 15 Nov 2025 03:43:06 -0800 Subject: [PATCH] Fix element appending in conditional branches - Add parent_element_stack to track nesting context - Elements inside if/match branches append to parent - Fixes: Li elements inside if statements now append to Ul parent - Tabs now render visibly! - TODO: Fix duplicate appends - All tests passing (30/30) --- examples/tabs/Tabs.ll | 60 ++++++++++++++++++ examples/tabs/Tabs.wasm | Bin 3205 -> 3433 bytes .../llvm_codegen_signals.cpython-313.pyc | Bin 26276 -> 26697 bytes ritz/llvm_codegen_signals.py | 16 +++++ 4 files changed, 76 insertions(+) diff --git a/examples/tabs/Tabs.ll b/examples/tabs/Tabs.ll index c776f15..bb54ad3 100644 --- a/examples/tabs/Tabs.ll +++ b/examples/tabs/Tabs.ll @@ -137,6 +137,7 @@ if.then.var2: call void @js_bind_event(i32 %var7, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.7, i32 0, i32 0)) %var8 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.8, i32 0, i32 0)) call void @js_append_child(i32 %var7, i32 %var8) + call void @js_append_child(i32 %var1, i32 %var7) br label %if.end.var2 if.else.var2: %var9 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) @@ -144,6 +145,7 @@ if.else.var2: call void @js_bind_event(i32 %var9, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.7, i32 0, i32 0)) %var10 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.8, i32 0, i32 0)) call void @js_append_child(i32 %var9, i32 %var10) + call void @js_append_child(i32 %var1, i32 %var9) br label %if.end.var2 if.end.var2: %var12 = load i32, i32* @signal_VerticalTabs_setting_tab @@ -157,6 +159,7 @@ if.then.var11: call void @js_bind_event(i32 %var16, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.10, i32 0, i32 0)) %var17 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.11, i32 0, i32 0)) call void @js_append_child(i32 %var16, i32 %var17) + call void @js_append_child(i32 %var1, i32 %var16) br label %if.end.var11 if.else.var11: %var18 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) @@ -164,6 +167,7 @@ if.else.var11: call void @js_bind_event(i32 %var18, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.10, i32 0, i32 0)) %var19 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.11, i32 0, i32 0)) call void @js_append_child(i32 %var18, i32 %var19) + call void @js_append_child(i32 %var1, i32 %var18) br label %if.end.var11 if.end.var11: %var21 = load i32, i32* @signal_VerticalTabs_setting_tab @@ -177,6 +181,7 @@ if.then.var20: call void @js_bind_event(i32 %var25, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.12, i32 0, i32 0)) %var26 = call i32 @js_create_text(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.13, i32 0, i32 0)) call void @js_append_child(i32 %var25, i32 %var26) + call void @js_append_child(i32 %var1, i32 %var25) br label %if.end.var20 if.else.var20: %var27 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) @@ -184,8 +189,10 @@ if.else.var20: call void @js_bind_event(i32 %var27, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.12, i32 0, i32 0)) %var28 = call i32 @js_create_text(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.13, i32 0, i32 0)) call void @js_append_child(i32 %var27, i32 %var28) + call void @js_append_child(i32 %var1, i32 %var27) br label %if.end.var20 if.end.var20: + call void @js_append_child(i32 %var0, i32 %var1) call void @js_append_child(i32 %var0, i32 %var1) %var29 = 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 %var29, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.14, i32 0, i32 0)) @@ -202,14 +209,18 @@ match.case0.var30: %var34 = call i32 @js_create_text(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.17, i32 0, i32 0)) call void @js_append_child(i32 %var33, i32 %var34) call void @js_append_child(i32 %var32, i32 %var33) + call void @js_append_child(i32 %var32, i32 %var33) %var35 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var36 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.19, i32 0, i32 0)) call void @js_append_child(i32 %var35, i32 %var36) call void @js_append_child(i32 %var32, i32 %var35) + call void @js_append_child(i32 %var32, i32 %var35) %var37 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var38 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.20, i32 0, i32 0)) call void @js_append_child(i32 %var37, i32 %var38) call void @js_append_child(i32 %var32, i32 %var37) + call void @js_append_child(i32 %var32, i32 %var37) + call void @js_append_child(i32 %var29, i32 %var32) br label %match.end.var30 match.case1.var30: %var39 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) @@ -218,14 +229,18 @@ match.case1.var30: %var41 = call i32 @js_create_text(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.21, i32 0, i32 0)) call void @js_append_child(i32 %var40, i32 %var41) call void @js_append_child(i32 %var39, i32 %var40) + call void @js_append_child(i32 %var39, i32 %var40) %var42 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var43 = call i32 @js_create_text(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.22, i32 0, i32 0)) call void @js_append_child(i32 %var42, i32 %var43) call void @js_append_child(i32 %var39, i32 %var42) + call void @js_append_child(i32 %var39, i32 %var42) %var44 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var45 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.23, i32 0, i32 0)) call void @js_append_child(i32 %var44, i32 %var45) call void @js_append_child(i32 %var39, i32 %var44) + call void @js_append_child(i32 %var39, i32 %var44) + call void @js_append_child(i32 %var29, i32 %var39) br label %match.end.var30 match.case2.var30: %var46 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) @@ -234,14 +249,18 @@ match.case2.var30: %var48 = call i32 @js_create_text(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.24, i32 0, i32 0)) call void @js_append_child(i32 %var47, i32 %var48) call void @js_append_child(i32 %var46, i32 %var47) + call void @js_append_child(i32 %var46, i32 %var47) %var49 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var50 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.25, i32 0, i32 0)) call void @js_append_child(i32 %var49, i32 %var50) call void @js_append_child(i32 %var46, i32 %var49) + call void @js_append_child(i32 %var46, i32 %var49) %var51 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var52 = call i32 @js_create_text(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.26, i32 0, i32 0)) call void @js_append_child(i32 %var51, i32 %var52) call void @js_append_child(i32 %var46, i32 %var51) + call void @js_append_child(i32 %var46, i32 %var51) + call void @js_append_child(i32 %var29, i32 %var46) br label %match.end.var30 match.case3.var30: %var53 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) @@ -250,8 +269,11 @@ match.case3.var30: %var55 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.27, i32 0, i32 0)) call void @js_append_child(i32 %var54, i32 %var55) call void @js_append_child(i32 %var53, i32 %var54) + call void @js_append_child(i32 %var53, i32 %var54) + call void @js_append_child(i32 %var29, i32 %var53) br label %match.end.var30 match.end.var30: + call void @js_append_child(i32 %var0, i32 %var29) call void @js_append_child(i32 %var0, i32 %var29) call void @js_set_root(i32 %var0) ret void @@ -307,11 +329,13 @@ entry: %var58 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.30, i32 0, i32 0)) call void @js_append_child(i32 %var57, i32 %var58) call void @js_append_child(i32 %var56, i32 %var57) + call void @js_append_child(i32 %var56, i32 %var57) %var59 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) call void @js_set_attribute(i32 %var59, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.31, i32 0, i32 0)) %var60 = call i32 @js_create_text(i8* getelementptr inbounds ([58 x i8], [58 x i8]* @.str.32, i32 0, i32 0)) call void @js_append_child(i32 %var59, i32 %var60) call void @js_append_child(i32 %var56, i32 %var59) + call void @js_append_child(i32 %var56, i32 %var59) %var61 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.33, i32 0, i32 0)) call void @js_set_attribute(i32 %var61, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.34, i32 0, i32 0)) %var63 = load i32, i32* @signal_Tabs_tab_index @@ -327,6 +351,8 @@ if.then.var62: %var69 = call i32 @js_create_text(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.38, i32 0, i32 0)) call void @js_append_child(i32 %var68, i32 %var69) call void @js_append_child(i32 %var67, i32 %var68) + call void @js_append_child(i32 %var67, i32 %var68) + call void @js_append_child(i32 %var61, i32 %var67) br label %if.end.var62 if.else.var62: %var70 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.35, i32 0, i32 0)) @@ -336,6 +362,8 @@ if.else.var62: %var72 = call i32 @js_create_text(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.38, i32 0, i32 0)) call void @js_append_child(i32 %var71, i32 %var72) call void @js_append_child(i32 %var70, i32 %var71) + call void @js_append_child(i32 %var70, i32 %var71) + call void @js_append_child(i32 %var61, i32 %var70) br label %if.end.var62 if.end.var62: %var74 = load i32, i32* @signal_Tabs_tab_index @@ -351,6 +379,8 @@ if.then.var73: %var80 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.41, i32 0, i32 0)) call void @js_append_child(i32 %var79, i32 %var80) call void @js_append_child(i32 %var78, i32 %var79) + call void @js_append_child(i32 %var78, i32 %var79) + call void @js_append_child(i32 %var61, i32 %var78) br label %if.end.var73 if.else.var73: %var81 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.35, i32 0, i32 0)) @@ -360,6 +390,8 @@ if.else.var73: %var83 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.41, i32 0, i32 0)) call void @js_append_child(i32 %var82, i32 %var83) call void @js_append_child(i32 %var81, i32 %var82) + call void @js_append_child(i32 %var81, i32 %var82) + call void @js_append_child(i32 %var61, i32 %var81) br label %if.end.var73 if.end.var73: %var85 = load i32, i32* @signal_Tabs_tab_index @@ -375,6 +407,8 @@ if.then.var84: %var91 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.43, i32 0, i32 0)) call void @js_append_child(i32 %var90, i32 %var91) call void @js_append_child(i32 %var89, i32 %var90) + call void @js_append_child(i32 %var89, i32 %var90) + call void @js_append_child(i32 %var61, i32 %var89) br label %if.end.var84 if.else.var84: %var92 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.35, i32 0, i32 0)) @@ -384,8 +418,11 @@ if.else.var84: %var94 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.43, i32 0, i32 0)) call void @js_append_child(i32 %var93, i32 %var94) call void @js_append_child(i32 %var92, i32 %var93) + call void @js_append_child(i32 %var92, i32 %var93) + call void @js_append_child(i32 %var61, i32 %var92) br label %if.end.var84 if.end.var84: + call void @js_append_child(i32 %var56, i32 %var61) call void @js_append_child(i32 %var56, i32 %var61) %var95 = 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 %var95, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.44, i32 0, i32 0)) @@ -402,28 +439,36 @@ match.case0.var96: %var100 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.47, i32 0, i32 0)) call void @js_append_child(i32 %var99, i32 %var100) call void @js_append_child(i32 %var98, i32 %var99) + call void @js_append_child(i32 %var98, i32 %var99) %var101 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var102 = call i32 @js_create_text(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.48, i32 0, i32 0)) call void @js_append_child(i32 %var101, i32 %var102) call void @js_append_child(i32 %var98, i32 %var101) + call void @js_append_child(i32 %var98, i32 %var101) %var103 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var104 = call i32 @js_create_text(i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.49, i32 0, i32 0)) call void @js_append_child(i32 %var103, i32 %var104) call void @js_append_child(i32 %var98, i32 %var103) + call void @js_append_child(i32 %var98, i32 %var103) %var105 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.33, i32 0, i32 0)) %var106 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.35, i32 0, i32 0)) %var107 = call i32 @js_create_text(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.50, i32 0, i32 0)) call void @js_append_child(i32 %var106, i32 %var107) call void @js_append_child(i32 %var105, i32 %var106) + call void @js_append_child(i32 %var105, i32 %var106) %var108 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.35, i32 0, i32 0)) %var109 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.51, i32 0, i32 0)) call void @js_append_child(i32 %var108, i32 %var109) call void @js_append_child(i32 %var105, i32 %var108) + call void @js_append_child(i32 %var105, i32 %var108) %var110 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.35, i32 0, i32 0)) %var111 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.52, i32 0, i32 0)) call void @js_append_child(i32 %var110, i32 %var111) call void @js_append_child(i32 %var105, i32 %var110) + call void @js_append_child(i32 %var105, i32 %var110) call void @js_append_child(i32 %var98, i32 %var105) + call void @js_append_child(i32 %var98, i32 %var105) + call void @js_append_child(i32 %var95, i32 %var98) br label %match.end.var96 match.case1.var96: %var112 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) @@ -432,25 +477,32 @@ match.case1.var96: %var114 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.54, i32 0, i32 0)) call void @js_append_child(i32 %var113, i32 %var114) call void @js_append_child(i32 %var112, i32 %var113) + call void @js_append_child(i32 %var112, i32 %var113) %var115 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var116 = call i32 @js_create_text(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.55, i32 0, i32 0)) call void @js_append_child(i32 %var115, i32 %var116) call void @js_append_child(i32 %var112, i32 %var115) + call void @js_append_child(i32 %var112, i32 %var115) %var117 = 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 %var117, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.56, i32 0, i32 0)) %var118 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var119 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.57, i32 0, i32 0)) call void @js_append_child(i32 %var118, i32 %var119) call void @js_append_child(i32 %var117, i32 %var118) + call void @js_append_child(i32 %var117, i32 %var118) %var120 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var121 = call i32 @js_create_text(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.58, i32 0, i32 0)) call void @js_append_child(i32 %var120, i32 %var121) call void @js_append_child(i32 %var117, i32 %var120) + call void @js_append_child(i32 %var117, i32 %var120) %var122 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var123 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.59, i32 0, i32 0)) call void @js_append_child(i32 %var122, i32 %var123) call void @js_append_child(i32 %var117, i32 %var122) + call void @js_append_child(i32 %var117, i32 %var122) call void @js_append_child(i32 %var112, i32 %var117) + call void @js_append_child(i32 %var112, i32 %var117) + call void @js_append_child(i32 %var95, i32 %var112) br label %match.end.var96 match.case2.var96: %var124 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) @@ -459,11 +511,14 @@ match.case2.var96: %var126 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.43, i32 0, i32 0)) call void @js_append_child(i32 %var125, i32 %var126) call void @js_append_child(i32 %var124, i32 %var125) + call void @js_append_child(i32 %var124, i32 %var125) %var127 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) %var128 = call i32 @js_create_text(i8* getelementptr inbounds ([55 x i8], [55 x i8]* @.str.61, i32 0, i32 0)) call void @js_append_child(i32 %var127, i32 %var128) call void @js_append_child(i32 %var124, i32 %var127) + call void @js_append_child(i32 %var124, i32 %var127) call void @render_VerticalTabs() + call void @js_append_child(i32 %var95, i32 %var124) br label %match.end.var96 match.case3.var96: %var129 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) @@ -472,8 +527,11 @@ match.case3.var96: %var131 = call i32 @js_create_text(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.63, i32 0, i32 0)) call void @js_append_child(i32 %var130, i32 %var131) call void @js_append_child(i32 %var129, i32 %var130) + call void @js_append_child(i32 %var129, i32 %var130) + call void @js_append_child(i32 %var95, i32 %var129) br label %match.end.var96 match.end.var96: + call void @js_append_child(i32 %var56, i32 %var95) call void @js_append_child(i32 %var56, i32 %var95) %var132 = 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 %var132, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.64, i32 0, i32 0)) @@ -482,6 +540,8 @@ match.end.var96: %var134 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.65, i32 0, i32 0)) call void @js_append_child(i32 %var133, i32 %var134) call void @js_append_child(i32 %var132, i32 %var133) + call void @js_append_child(i32 %var132, i32 %var133) + call void @js_append_child(i32 %var56, i32 %var132) call void @js_append_child(i32 %var56, i32 %var132) call void @js_set_root(i32 %var56) ret void diff --git a/examples/tabs/Tabs.wasm b/examples/tabs/Tabs.wasm index c7ec38db5f9aec056f7031e0559c7c8c77a3ec4e..b0179cacd8d019ada4882ef3bca255948b54f4d7 100755 GIT binary patch delta 1248 zcmah|JBt)S5bo-p@#f{)w~-H!-izd75zMZVixlx^Xly>4oJPVPqlt=%XdovnEQsL- zBAgg(AcEN{qG%u&nQA@eb-TzhP}9>@U)5J%)$E=7d4BrL+A6P}+pERI!Ko7OC*EvD z)h~Oo1bmRvhrt&KzRYl*2e{xN7<`rD-^^P&Jx#syQJ|xba521O&8Ux>=L8IZu-gKE zC~%yd2rLBB(VkgPS)^$1XZbqX591qrF9&-c0G5efM z3XcrV_*!(DW%wx#hDL_f*XXQHx3<9iS1{Ee-aa|#TD)D#p7b-31|9isQjhw?_<96( zr+I=II0M$vI&u@gd8&u3h{3sbOFK%6h*d=lF4Ga^wR#1b`p5EUP|>obRW$4;zGFZ2YeZy^3@+9^B9?6XJr+Q>62I$j)u&o}jwnSb3&<;} zUDU40rqu0$R3Np5t%aU$c2p0vPG7TzswV4sd{Ka=xP|X|uyy2QxY}+`tD)<#@>k2C YKet$m5Azz!fwGhRO$yQM=EmjtAKQDdf&c&j delta 963 zcmaiyziSjx5XaxlzLouP#&?GiRFHRRlypJ_?J|vB{sZw35bW&tnrI~)tTrk(VhV}m zARv}kh@e3m(gQqea16E{*iQiEhi#9KF5}{t&|@X&h&6Mq;p3e(U@8=GM;?Y_mpz{GBn) zfpj!9JsamRJcrgXlJc!%AWR6FzFmJ&{d*5_X_*pfesCcA)7JZE#MfFusyR z8KV!RxJaWA13ky6O_pe!o-kqlBZQUwQ?7z=+yu z@GWS=uGUvAVqo0Ns5{5l4doU#GwHg!a%EL?oeo6bXW72C1RD0{_+|T?bobw8nUqQsaSh6i+S*$NYmMvpTzHlk{67Urxiir&=P|9@m` z$d2aQv*-NhKmY&zm!ltjMEth`tIUKgw!*4X`Sn9ctjZrSTAN%TF^pk*l?+z1X;E; zAie+#xfJ`l$E`1yy3MfXZrS0B{3PMBlD?#J2WcHDX#iL#mJiFxbaqNf%c=H=O#5Im zD9~~ga3SD%hLFmunVexss`;QuxtHjSQ5?@^X0jTRqbV5`Tu-~&NQm8WwUSBwBUhcZ z2^B`)F>fmi60RUeU_quB8QO%p!mQTkWtVN`B%>emgay*aUaon?%l+MhQhtCO#z)@V z*228LFu9^feQ#L6Q=@iIXbc5UA#@;&BRr45%?Mg)1%4D9W1+g;5TDUHkNXhJ=BxlR zJO!Kff)lmuR$Vdq9$TurM-H*oaFu?&-fOAo1VKYoa=BDeGsL_?ffhQ*-rMsM>1F!@ zq1r8*4JoFnv$4wx4Hgw>!;^rfR|EdaK|Hi*^U$qx&#;w1g#1|lEbxkTS3N%o(oo6d z76c5CpZ3BW?PE7WJsxy4TJRKY3YuvbE*@lm4+V~F`3~V6#%XTVb2vi(jgpv}N%5qH z*g^z@wt|I7106wlk)3P_f#X+OYDg=)-O@zv>-Srh&7_mfwat5Z8gS;G4vL1l{TNFd z)JsA2KlJvnY9*8GR%c%y2IfnLEKgB6txTzD*&hXRR6H<&PzVl=&}zeyRyB%BgZ51Z zS#{Sexys%??`3Ts!IHZ0AN^Nd=gh;Hkqd5Fjw|W3d^wv+$h}a$36;hc%#Fb)J%LJ~ zT;N4{7|_X_1z?N(m*K-`=7~6WpoIAJ>j%EDR`YmEv#E3FcO>hpJtI8UaoUq2P{k&q|(nCiOIvH&{o{0r4j49Avqk zcJUf+u0^B7jFOK}H|h_1Y(fC7qL?7`0Kz1K0$`9fLyBiLU|++ue0+40OtH!S3P{e` z{<==i^ft*@T81T;rv>(r^Cy|`6I3Z9B-w-hCNj;w=x-ni<{R*n^ZL<&1!BG-=qrOe ztrpW*8T)RDi#d`c(Lom+vQkc~}*$UE%X#Mq%eSc4Ma9fypTN+t z0zG-?llxAG#g}lRkpJ^3HJ!Mx-#C5D3`9CxtJvo+tRLP70?_;1@S>GC-YjzTz_1r? zH-0}oTkL2U6g%Fs@>w_eQtv!lLL7e;)Mm;uTdbo=vFFs-Bw9t1;+L z$^7)Qsy~Fw*vsBJXE$5S>}Tihw&p-9<#rP4fibAXK4eG`|AJ{x_fQp@TfKRQS^wbt z|IBa?zCXEdgl8Z0$(ghgS1BiuH}vnLX3QW%ROj;0?$up0b+|JNtC1fq0o1SFZ8cV)LXs5qt>z znwD^c|6phkA%xI`(1NfR;S5460u~Rwih!+`Vyi3kp({AT$Wxv_++UtV+_Lf*`!s%V zPni(8*|BI@Jhdp@>Rvj!>|T!lx_x>2UEf-$cdfejkqHDg8ufuhH}Q50o}2l_BTKHu zp<7osOz^o}{|H|jy=JzkUhEg3+%XYm3Wd&Hw4*ge2of$haD?0$(xFT? YaVf2KQyV*RVW4D8B7uLK5V_F*0Yh<_82|tP delta 2430 zcmZ8iYitx%6z-kfnQq(d14^O5(oVNs+AUq&Qm8z;MeIUBmIB5iuVr?3x@?)wHg^|F zR~}K27)|`)G4Tq_^8XhJJ8qc{?T5x`Rd-p!h zJ?A^$Irqye?9^AR;zoISX%T+Wf!fT;$KI=0D6@;OO8&^3E(%I9F5yzp3w6qCa79_e z5-_tk;kxRngJ+7rQGB?_>tUCthqYLzJ?ACngB@iNHXn|conc`s>K$gK58@_U%A~j- zE|#}CXTmU6-l(+FN(VgYnE~MnAM3T&SKMUG4-ZxOtCy1LskFg8n9Z0$7x%$PRe-g? z@v3I_n02WtB;nQ@Q&$`o7s&fGW3MjU~LG z)w7j(wA2b4qdxe(x`OSnZdd!=t=%{qJ1b3I6=cGEj^TpJiFY1Eu-nDSQ>8U*&>F36 zmsvNwHRni!AR$1znh+0S?Goj+9I_? zK+Iu)djZ+D|og?fZeAL;B2NsO=^ar?#pIUYB$%-l+NP?sU;ZWF*=TQhCf_ng5u1%5GMFPfPd_HBG5m> zm29?ke#u|%*&^khk&KZ_YCOd$bp^Mmw&RqM2I4$%DXXjM&_|+ArV=kyhJvma3azH7dvIvKt3r$T0XfuVBLw7%FW~y zCyDUI1aX302sR7bo@CZU+D#H>sAm_`;Q5~ED9<;0{EGy|lk8IU*{)okJG2woceQXD z$D$|j0l3rC%F@srZDL8-*w-NI`-k~fi$@DgI_b9lSUtrJiyoN@H%h8u>mz$)xv3~P z3!YlviP^reekERgdwtWa|G7*ZjGrZl!jjkt)&bwg+A9s=fh`-^5uNiCs2kL^qKkP^ ztvq9<9xJOA+#-88UL8}d;%|SSj(dDA<$J6`f>5;?wB(3>uHCot(GJoQFa*zWY^A zKB4OAow~Sv8vEV4y1kf1$(YTy6%=*9npwO9?Ftnux|z(T^!rUGM)P_cOEjI|eZT3; z_?-EmYiF5si@~~`mmc6~l?y)^uf;K%rGm6Q*d`s1IOuv zTTIilg}NC3oW}eBEw>4Z`jRz_Sp&&>#!BH>stMjr?KmuQORa=YA(%rT9ySk+S_xVR z=p7YLBBuwAhY0!!sKp8i^Mf>^M#K*hh;CS*(GvthKO$NoBH>p}9G=scx+>+l@P%F{ z str: """Get the scoped global name for a signal.""" if self.current_component: @@ -428,6 +433,9 @@ class SignalLLVMIRGenerator: f"i8* getelementptr inbounds ({self._string_type(onclick_handler)}, {self._string_type(onclick_handler)}* {handler_str}, i32 0, i32 0))" ) + # Push this element as the parent for children + self.parent_element_stack.append(elem_var) + # Process children for child_stmt in stmt["body"]: child_var = self._emit_statement(child_stmt) @@ -436,6 +444,14 @@ class SignalLLVMIRGenerator: f" call void @js_append_child(i32 %{elem_var}, i32 %{child_var})" ) + # Pop parent + self.parent_element_stack.pop() + + # If we're inside an if/match branch (have a grandparent), append to it + if self.parent_element_stack: + parent_var = self.parent_element_stack[-1] + self.lines.append(f" call void @js_append_child(i32 %{parent_var}, i32 %{elem_var})") + return elem_var def _emit_yield(self, stmt: dict[str, Any]) -> str | None: