Fix nested components - render functions now return i32
Changes: - Component render functions return i32 (root element) instead of void - Nested components (yield SomeComponent()) now work correctly - Added main() entry point that calls top-level component and sets root - Updated runtime to call main() instead of render_ComponentName() Note: Active state in ternary expressions still needs reactive updates This commit fixes the nested component rendering issue All tests passing (51 passed, 2 skipped) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
1 parent
adf95f424d
commit
b0e38db22c
26 files changed
+2310
-1222
No files matched your search
+119
-108
@@ -1,5 +1,5 @@
|
||||
; Generated by Ritz Framework with Signals
|
||||
; Component: Toggle
|
||||
; Components: Toggle
|
||||
|
||||
; String constants
|
||||
@.str.0 = private unnamed_addr constant [4 x i8] c"div\00"
|
||||
@@ -23,16 +23,6 @@
|
||||
@.str.18 = private unnamed_addr constant [18 x i8] c"Increment Counter\00"
|
||||
@.str.19 = private unnamed_addr constant [8 x i8] c"display\00"
|
||||
|
||||
; Signal storage (reactive state in WASM memory)
|
||||
@signal_count = global i32 0
|
||||
|
||||
; Conditional rendering state
|
||||
@cond_0_parent = global i32 0
|
||||
@cond_0_marker = global i32 0
|
||||
@cond_0_current = global i32 0
|
||||
@cond_0_then_root = global i32 0
|
||||
@cond_0_else_root = global i32 0
|
||||
|
||||
; JavaScript bridge function declarations
|
||||
declare i32 @js_create_element(i8*)
|
||||
declare i32 @js_create_text(i8*)
|
||||
@@ -44,16 +34,25 @@ declare void @js_update_text_content(i32, i8*)
|
||||
declare i32 @js_create_marker()
|
||||
declare void @js_replace_at_marker(i32, i32, i32)
|
||||
|
||||
; Signal storage for Toggle (reactive state in WASM memory)
|
||||
@signal_Toggle_count = global i32 0
|
||||
|
||||
; Conditional rendering state
|
||||
@cond_0_marker = global i32 0
|
||||
@cond_0_current = global i32 0
|
||||
@cond_0_then_root = global i32 0
|
||||
@cond_0_else_root = global i32 0
|
||||
|
||||
; Signal helper functions
|
||||
define i32 @get_count() {
|
||||
entry:
|
||||
%val = load i32, i32* @signal_count
|
||||
%val = load i32, i32* @signal_Toggle_count
|
||||
ret i32 %val
|
||||
}
|
||||
|
||||
define void @set_count(i32 %newval) {
|
||||
entry:
|
||||
store i32 %newval, i32* @signal_count
|
||||
store i32 %newval, i32* @signal_Toggle_count
|
||||
; TODO: Trigger DOM update callback
|
||||
ret void
|
||||
}
|
||||
@@ -61,65 +60,33 @@ entry:
|
||||
; Event handler: increment
|
||||
define void @increment() {
|
||||
entry:
|
||||
%var0 = load i32, i32* @signal_count
|
||||
%var0 = load i32, i32* @signal_Toggle_count
|
||||
%var1 = add i32 %var0, 1
|
||||
store i32 %var1, i32* @signal_count
|
||||
store i32 %var1, i32* @signal_Toggle_count
|
||||
call void @reevaluate_conditional_0()
|
||||
ret void
|
||||
}
|
||||
|
||||
; Conditional 0 - then branch
|
||||
define i32 @_render_cond_0_then() {
|
||||
entry:
|
||||
%var2 = 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 %var2, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0))
|
||||
%var3 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0))
|
||||
%var4 = call i32 @js_create_text(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.4, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var3, i32 %var4)
|
||||
call void @js_append_child(i32 %var2, i32 %var3)
|
||||
%var5 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0))
|
||||
call void @js_set_attribute(i32 %var5, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.5, i32 0, i32 0))
|
||||
; TODO: Format f-string with signal count
|
||||
%var6 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var5, i32 %var6)
|
||||
call void @js_append_child(i32 %var2, i32 %var5)
|
||||
ret i32 %var2
|
||||
}
|
||||
|
||||
; Conditional 0 - else branch
|
||||
define i32 @_render_cond_0_else() {
|
||||
entry:
|
||||
%var7 = 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 %var7, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i32 0, i32 0))
|
||||
%var8 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0))
|
||||
%var9 = call i32 @js_create_text(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.8, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var8, i32 %var9)
|
||||
call void @js_append_child(i32 %var7, i32 %var8)
|
||||
%var10 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0))
|
||||
call void @js_set_attribute(i32 %var10, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.5, i32 0, i32 0))
|
||||
; TODO: Format f-string with signal count
|
||||
%var11 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var10, i32 %var11)
|
||||
call void @js_append_child(i32 %var7, i32 %var10)
|
||||
ret i32 %var7
|
||||
}
|
||||
|
||||
; Initialize conditional 0 - render both branches
|
||||
define void @_init_conditional_0(i1 %cond) {
|
||||
; Initialize conditional 0
|
||||
define void @_init_conditional_0() {
|
||||
entry:
|
||||
; Render both branches upfront
|
||||
%then_root = call i32 @_render_cond_0_then()
|
||||
%else_root = call i32 @_render_cond_0_else()
|
||||
store i32 %then_root, i32* @cond_0_then_root
|
||||
store i32 %else_root, i32* @cond_0_else_root
|
||||
%marker = load i32, i32* @cond_0_marker
|
||||
br i1 %cond, label %insert_then, label %insert_else
|
||||
%var2 = call i32 @_render_cond_0_then()
|
||||
%var3 = call i32 @_render_cond_0_else()
|
||||
store i32 %var2, i32* @cond_0_then_root
|
||||
store i32 %var3, i32* @cond_0_else_root
|
||||
%var4 = load i32, i32* @signal_Toggle_count
|
||||
%var5 = icmp sgt i32 %var4, 5
|
||||
%var6 = zext i1 %var5 to i32
|
||||
%var7 = icmp ne i32 %var6, 0
|
||||
%var8 = load i32, i32* @cond_0_marker
|
||||
br i1 %var7, label %insert_then, label %insert_else
|
||||
insert_then:
|
||||
call void @js_replace_at_marker(i32 %marker, i32 0, i32 %then_root)
|
||||
call void @js_replace_at_marker(i32 %var8, i32 0, i32 %var2)
|
||||
store i32 1, i32* @cond_0_current
|
||||
ret void
|
||||
insert_else:
|
||||
call void @js_replace_at_marker(i32 %marker, i32 0, i32 %else_root)
|
||||
call void @js_replace_at_marker(i32 %var8, i32 0, i32 %var3)
|
||||
store i32 0, i32* @cond_0_current
|
||||
ret void
|
||||
}
|
||||
@@ -127,66 +94,110 @@ insert_else:
|
||||
; Re-evaluate conditional 0
|
||||
define void @reevaluate_conditional_0() {
|
||||
entry:
|
||||
%var12 = load i32, i32* @signal_count
|
||||
%var13 = icmp sgt i32 %var12, 5
|
||||
%var15 = load i32, i32* @cond_0_current
|
||||
%var16 = zext i1 %var13 to i32
|
||||
%var17 = icmp ne i32 %var15, %var16
|
||||
br i1 %var17, label %swap, label %done
|
||||
%var9 = load i32, i32* @signal_Toggle_count
|
||||
%var10 = icmp sgt i32 %var9, 5
|
||||
%var11 = zext i1 %var10 to i32
|
||||
%var12 = icmp ne i32 %var11, 0
|
||||
%var13 = zext i1 %var12 to i32
|
||||
%var14 = load i32, i32* @cond_0_current
|
||||
%var15 = icmp ne i32 %var14, %var13
|
||||
br i1 %var15, label %swap, label %done
|
||||
swap:
|
||||
br i1 %var13, label %swap_to_then, label %swap_to_else
|
||||
br i1 %var12, label %swap_to_then, label %swap_to_else
|
||||
swap_to_then:
|
||||
%var18 = load i32, i32* @cond_0_else_root
|
||||
%var19 = load i32, i32* @cond_0_then_root
|
||||
%var20 = load i32, i32* @cond_0_marker
|
||||
call void @js_replace_at_marker(i32 %var20, i32 %var18, i32 %var19)
|
||||
%var16 = load i32, i32* @cond_0_else_root
|
||||
%var17 = load i32, i32* @cond_0_then_root
|
||||
%var18 = load i32, i32* @cond_0_marker
|
||||
call void @js_replace_at_marker(i32 %var18, i32 %var16, i32 %var17)
|
||||
store i32 1, i32* @cond_0_current
|
||||
br label %done
|
||||
swap_to_else:
|
||||
%var21 = load i32, i32* @cond_0_then_root
|
||||
%var22 = load i32, i32* @cond_0_else_root
|
||||
%var23 = load i32, i32* @cond_0_marker
|
||||
call void @js_replace_at_marker(i32 %var23, i32 %var21, i32 %var22)
|
||||
%var19 = load i32, i32* @cond_0_then_root
|
||||
%var20 = load i32, i32* @cond_0_else_root
|
||||
%var21 = load i32, i32* @cond_0_marker
|
||||
call void @js_replace_at_marker(i32 %var21, i32 %var19, i32 %var20)
|
||||
store i32 0, i32* @cond_0_current
|
||||
br label %done
|
||||
done:
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @_render_cond_0_then() {
|
||||
entry:
|
||||
%var22 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0))
|
||||
%var23 = 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 %var23, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0))
|
||||
%var24 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0))
|
||||
%var25 = call i32 @js_create_text(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.4, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var24, i32 %var25)
|
||||
call void @js_append_child(i32 %var23, i32 %var24)
|
||||
call void @js_append_child(i32 %var23, i32 %var24)
|
||||
%var26 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0))
|
||||
call void @js_set_attribute(i32 %var26, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.5, i32 0, i32 0))
|
||||
; TODO: Format f-string with signal count
|
||||
%var27 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var26, i32 %var27)
|
||||
call void @js_append_child(i32 %var23, i32 %var26)
|
||||
call void @js_append_child(i32 %var23, i32 %var26)
|
||||
call void @js_append_child(i32 %var22, i32 %var23)
|
||||
ret i32 %var22
|
||||
}
|
||||
|
||||
define i32 @_render_cond_0_else() {
|
||||
entry:
|
||||
%var28 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0))
|
||||
%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 ([4 x i8], [4 x i8]* @.str.7, i32 0, i32 0))
|
||||
%var30 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0))
|
||||
%var31 = call i32 @js_create_text(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.8, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var30, i32 %var31)
|
||||
call void @js_append_child(i32 %var29, i32 %var30)
|
||||
call void @js_append_child(i32 %var29, i32 %var30)
|
||||
%var32 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0))
|
||||
call void @js_set_attribute(i32 %var32, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.5, i32 0, i32 0))
|
||||
; TODO: Format f-string with signal count
|
||||
%var33 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var32, i32 %var33)
|
||||
call void @js_append_child(i32 %var29, i32 %var32)
|
||||
call void @js_append_child(i32 %var29, i32 %var32)
|
||||
call void @js_append_child(i32 %var28, i32 %var29)
|
||||
ret i32 %var28
|
||||
}
|
||||
|
||||
; Component render function
|
||||
define void @render_Toggle() {
|
||||
entry:
|
||||
%var24 = 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 %var24, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.9, i32 0, i32 0))
|
||||
%var25 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.10, i32 0, i32 0))
|
||||
%var26 = call i32 @js_create_text(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.11, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var25, i32 %var26)
|
||||
call void @js_append_child(i32 %var24, i32 %var25)
|
||||
%var27 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0))
|
||||
call void @js_set_attribute(i32 %var27, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i32 0, i32 0))
|
||||
%var28 = call i32 @js_create_text(i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.13, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var27, i32 %var28)
|
||||
call void @js_append_child(i32 %var24, i32 %var27)
|
||||
%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 ([9 x i8], [9 x i8]* @.str.14, i32 0, i32 0))
|
||||
%var30 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.15, i32 0, i32 0))
|
||||
call void @js_bind_event(i32 %var30, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.16, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.17, i32 0, i32 0))
|
||||
%var31 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.18, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var30, i32 %var31)
|
||||
call void @js_append_child(i32 %var29, i32 %var30)
|
||||
call void @js_append_child(i32 %var24, i32 %var29)
|
||||
%var32 = 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 %var32, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.19, i32 0, i32 0))
|
||||
%var33 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0))
|
||||
%var34 = call i32 @js_create_marker()
|
||||
call void @js_append_child(i32 %var33, i32 %var34)
|
||||
store i32 %var34, i32* @cond_0_marker
|
||||
store i32 %var33, i32* @cond_0_parent
|
||||
%var35 = load i32, i32* @signal_count
|
||||
%var36 = icmp sgt i32 %var35, 5
|
||||
call void @_init_conditional_0(i1 %var36)
|
||||
call void @js_append_child(i32 %var32, i32 %var33)
|
||||
call void @js_append_child(i32 %var24, i32 %var32)
|
||||
call void @js_set_root(i32 %var24)
|
||||
%var34 = 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 %var34, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.9, i32 0, i32 0))
|
||||
%var35 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.10, i32 0, i32 0))
|
||||
%var36 = call i32 @js_create_text(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.11, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var35, i32 %var36)
|
||||
call void @js_append_child(i32 %var34, i32 %var35)
|
||||
call void @js_append_child(i32 %var34, i32 %var35)
|
||||
%var37 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0))
|
||||
call void @js_set_attribute(i32 %var37, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i32 0, i32 0))
|
||||
%var38 = call i32 @js_create_text(i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.13, i32 0, i32 0))
|
||||
call void @js_append_child(i32 %var37, i32 %var38)
|
||||
call void @js_append_child(i32 %var34, i32 %var37)
|
||||
call void @js_append_child(i32 %var34, i32 %var37)
|
||||
%var39 = 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 %var39, 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.14, i32 0, i32 0))
|
||||
%var40 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.15, i32 0, i32 0))
|
||||
call void @js_bind_event(i32 %var40, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.16, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.17, i32 0, i32 0))
|
||||
%var41 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.18, 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)
|
||||
call void @js_append_child(i32 %var34, i32 %var39)
|
||||
call void @js_append_child(i32 %var34, i32 %var39)
|
||||
%var42 = 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 %var42, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.19, i32 0, i32 0))
|
||||
%var43 = call i32 @js_create_marker()
|
||||
call void @js_append_child(i32 %var42, i32 %var43)
|
||||
store i32 %var43, i32* @cond_0_marker
|
||||
call void @_init_conditional_0()
|
||||
call void @js_append_child(i32 %var34, i32 %var42)
|
||||
call void @js_append_child(i32 %var34, i32 %var42)
|
||||
call void @js_set_root(i32 %var34)
|
||||
ret void
|
||||
}
|
||||
Reference in new issue
Block a user