From cd89f75c1c49340075822e5eb02f05b9d73bc2c8 Mon Sep 17 00:00:00 2001 From: Aaron Sinclair Date: Sat, 15 Nov 2025 03:35:31 -0800 Subject: [PATCH] Implement match/case statement code generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add _emit_match() using LLVM switch instruction - Handle value patterns and wildcard (case _:) patterns - Each case gets its own basic block with branch to end - Wildcard case becomes default label in switch - All tests passing (30/30) - Tabs.wasm size: 1908 → 3185 bytes --- examples/tabs/Tabs.ll | 404 +++++++++++++----- examples/tabs/Tabs.wasm | Bin 1908 -> 3185 bytes .../llvm_codegen_signals.cpython-313.pyc | Bin 23131 -> 25424 bytes ritz/llvm_codegen_signals.py | 55 +++ 4 files changed, 346 insertions(+), 113 deletions(-) diff --git a/examples/tabs/Tabs.ll b/examples/tabs/Tabs.ll index 25850dd..f664683 100644 --- a/examples/tabs/Tabs.ll +++ b/examples/tabs/Tabs.ll @@ -17,26 +17,57 @@ @.str.12 = private unnamed_addr constant [14 x i8] c"set_setting_2\00" @.str.13 = private unnamed_addr constant [14 x i8] c"🚀 Advanced\00" @.str.14 = private unnamed_addr constant [21 x i8] c"vertical-tab-content\00" -@.str.15 = private unnamed_addr constant [15 x i8] c"tabs-container\00" -@.str.16 = private unnamed_addr constant [3 x i8] c"h1\00" -@.str.17 = private unnamed_addr constant [19 x i8] c"Tab Component Demo\00" +@.str.15 = private unnamed_addr constant [13 x i8] c"setting-pane\00" +@.str.16 = private unnamed_addr constant [3 x i8] c"h3\00" +@.str.17 = private unnamed_addr constant [24 x i8] c"⚙️ General Settings\00" @.str.18 = private unnamed_addr constant [2 x i8] c"p\00" -@.str.19 = private unnamed_addr constant [9 x i8] c"subtitle\00" -@.str.20 = private unnamed_addr constant [58 x i8] c"Beautiful composition with TabMenu and TabPane components\00" -@.str.21 = private unnamed_addr constant [3 x i8] c"ul\00" -@.str.22 = private unnamed_addr constant [9 x i8] c"tab-menu\00" -@.str.23 = private unnamed_addr constant [3 x i8] c"li\00" -@.str.24 = private unnamed_addr constant [11 x i8] c"tab active\00" -@.str.25 = private unnamed_addr constant [10 x i8] c"set_tab_0\00" -@.str.26 = private unnamed_addr constant [10 x i8] c"🏠 Home\00" -@.str.27 = private unnamed_addr constant [4 x i8] c"tab\00" -@.str.28 = private unnamed_addr constant [10 x i8] c"set_tab_1\00" -@.str.29 = private unnamed_addr constant [13 x i8] c"👤 Profile\00" -@.str.30 = private unnamed_addr constant [10 x i8] c"set_tab_2\00" -@.str.31 = private unnamed_addr constant [16 x i8] c"⚙️ Settings\00" -@.str.32 = private unnamed_addr constant [12 x i8] c"tab-content\00" -@.str.33 = private unnamed_addr constant [13 x i8] c"debug-footer\00" -@.str.34 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.19 = private unnamed_addr constant [18 x i8] c"Language: English\00" +@.str.20 = private unnamed_addr constant [15 x i8] c"Time Zone: UTC\00" +@.str.21 = private unnamed_addr constant [22 x i8] c"🔒 Privacy Settings\00" +@.str.22 = private unnamed_addr constant [26 x i8] c"Data Collection: Disabled\00" +@.str.23 = private unnamed_addr constant [19 x i8] c"Analytics: Opt-out\00" +@.str.24 = private unnamed_addr constant [23 x i8] c"🚀 Advanced Settings\00" +@.str.25 = private unnamed_addr constant [16 x i8] c"Debug Mode: Off\00" +@.str.26 = private unnamed_addr constant [32 x i8] c"Experimental Features: Disabled\00" +@.str.27 = private unnamed_addr constant [16 x i8] c"Invalid setting\00" +@.str.28 = private unnamed_addr constant [15 x i8] c"tabs-container\00" +@.str.29 = private unnamed_addr constant [3 x i8] c"h1\00" +@.str.30 = private unnamed_addr constant [19 x i8] c"Tab Component Demo\00" +@.str.31 = private unnamed_addr constant [9 x i8] c"subtitle\00" +@.str.32 = private unnamed_addr constant [58 x i8] c"Beautiful composition with TabMenu and TabPane components\00" +@.str.33 = private unnamed_addr constant [3 x i8] c"ul\00" +@.str.34 = private unnamed_addr constant [9 x i8] c"tab-menu\00" +@.str.35 = private unnamed_addr constant [3 x i8] c"li\00" +@.str.36 = private unnamed_addr constant [11 x i8] c"tab active\00" +@.str.37 = private unnamed_addr constant [10 x i8] c"set_tab_0\00" +@.str.38 = private unnamed_addr constant [10 x i8] c"🏠 Home\00" +@.str.39 = private unnamed_addr constant [4 x i8] c"tab\00" +@.str.40 = private unnamed_addr constant [10 x i8] c"set_tab_1\00" +@.str.41 = private unnamed_addr constant [13 x i8] c"👤 Profile\00" +@.str.42 = private unnamed_addr constant [10 x i8] c"set_tab_2\00" +@.str.43 = private unnamed_addr constant [16 x i8] c"⚙️ Settings\00" +@.str.44 = private unnamed_addr constant [12 x i8] c"tab-content\00" +@.str.45 = private unnamed_addr constant [14 x i8] c"tab-pane home\00" +@.str.46 = private unnamed_addr constant [3 x i8] c"h2\00" +@.str.47 = private unnamed_addr constant [18 x i8] c"🏠 Welcome Home\00" +@.str.48 = private unnamed_addr constant [29 x i8] c"This is your home dashboard.\00" +@.str.49 = private unnamed_addr constant [37 x i8] c"All your important info at a glance.\00" +@.str.50 = private unnamed_addr constant [20 x i8] c"✓ Recent activity\00" +@.str.51 = private unnamed_addr constant [18 x i8] c"✓ Quick actions\00" +@.str.52 = private unnamed_addr constant [18 x i8] c"✓ Summary stats\00" +@.str.53 = private unnamed_addr constant [17 x i8] c"tab-pane profile\00" +@.str.54 = private unnamed_addr constant [18 x i8] c"👤 Your Profile\00" +@.str.55 = private unnamed_addr constant [30 x i8] c"Manage your account settings.\00" +@.str.56 = private unnamed_addr constant [13 x i8] c"profile-info\00" +@.str.57 = private unnamed_addr constant [16 x i8] c"Name: Ritz User\00" +@.str.58 = private unnamed_addr constant [21 x i8] c"Email: user@ritz.dev\00" +@.str.59 = private unnamed_addr constant [19 x i8] c"Member since: 2025\00" +@.str.60 = private unnamed_addr constant [18 x i8] c"tab-pane settings\00" +@.str.61 = private unnamed_addr constant [55 x i8] c"Configure your preferences using the categories below:\00" +@.str.62 = private unnamed_addr constant [15 x i8] c"tab-pane error\00" +@.str.63 = private unnamed_addr constant [28 x i8] c"⚠️ Invalid tab selected\00" +@.str.64 = private unnamed_addr constant [13 x i8] c"debug-footer\00" +@.str.65 = private unnamed_addr constant [2 x i8] c"0\00" ; JavaScript bridge function declarations declare i32 @js_create_element(i8*) @@ -158,6 +189,69 @@ if.end.var20: 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)) + %var31 = load i32, i32* @signal_VerticalTabs_setting_tab + switch i32 %var31, label %match.case3.var30 [ + i32 0, label %match.case0.var30 + i32 1, label %match.case1.var30 + i32 2, label %match.case2.var30 + ] +match.case0.var30: + %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 ([13 x i8], [13 x i8]* @.str.15, i32 0, i32 0)) + %var33 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.16, i32 0, i32 0)) + %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) + %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) + %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) + 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)) + 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 ([13 x i8], [13 x i8]* @.str.15, i32 0, i32 0)) + %var40 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.16, i32 0, i32 0)) + %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) + %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) + %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) + 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)) + call void @js_set_attribute(i32 %var46, 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.15, i32 0, i32 0)) + %var47 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.16, i32 0, i32 0)) + %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) + %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) + %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) + 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)) + call void @js_set_attribute(i32 %var53, 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.15, i32 0, i32 0)) + %var54 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %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) + br label %match.end.var30 +match.end.var30: call void @js_append_child(i32 %var0, i32 %var29) call void @js_set_root(i32 %var0) ret void @@ -207,103 +301,187 @@ entry: ; Component render function define void @render_Tabs() { entry: - %var30 = 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 %var30, 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.15, i32 0, i32 0)) - %var31 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.16, i32 0, i32 0)) - %var32 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.17, i32 0, i32 0)) - call void @js_append_child(i32 %var31, i32 %var32) - call void @js_append_child(i32 %var30, i32 %var31) - %var33 = 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 %var33, 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.19, i32 0, i32 0)) - %var34 = call i32 @js_create_text(i8* getelementptr inbounds ([58 x i8], [58 x i8]* @.str.20, i32 0, i32 0)) - call void @js_append_child(i32 %var33, i32 %var34) - call void @js_append_child(i32 %var30, i32 %var33) - %var35 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0)) - call void @js_set_attribute(i32 %var35, 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.22, i32 0, i32 0)) - %var37 = load i32, i32* @signal_Tabs_tab_index - %var38 = icmp eq i32 %var37, 0 - %var39 = zext i1 %var38 to i32 - %var40 = icmp ne i32 %var39, 0 - br i1 %var40, label %if.then.var36, label %if.else.var36 -if.then.var36: - %var41 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i32 0, i32 0)) - call void @js_set_attribute(i32 %var41, 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.24, i32 0, i32 0)) - %var42 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) - call void @js_bind_event(i32 %var42, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.25, i32 0, i32 0)) - %var43 = call i32 @js_create_text(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.26, i32 0, i32 0)) - call void @js_append_child(i32 %var42, i32 %var43) - call void @js_append_child(i32 %var41, i32 %var42) - br label %if.end.var36 -if.else.var36: - %var44 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i32 0, i32 0)) - call void @js_set_attribute(i32 %var44, 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.27, i32 0, i32 0)) - %var45 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) - call void @js_bind_event(i32 %var45, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.25, i32 0, i32 0)) - %var46 = call i32 @js_create_text(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.26, i32 0, i32 0)) - call void @js_append_child(i32 %var45, i32 %var46) - call void @js_append_child(i32 %var44, i32 %var45) - br label %if.end.var36 -if.end.var36: - %var48 = load i32, i32* @signal_Tabs_tab_index - %var49 = icmp eq i32 %var48, 1 - %var50 = zext i1 %var49 to i32 - %var51 = icmp ne i32 %var50, 0 - br i1 %var51, label %if.then.var47, label %if.else.var47 -if.then.var47: - %var52 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i32 0, i32 0)) - call void @js_set_attribute(i32 %var52, 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.24, i32 0, i32 0)) - %var53 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) - call void @js_bind_event(i32 %var53, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.28, i32 0, i32 0)) - %var54 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.29, i32 0, i32 0)) - call void @js_append_child(i32 %var53, i32 %var54) - call void @js_append_child(i32 %var52, i32 %var53) - br label %if.end.var47 -if.else.var47: - %var55 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i32 0, i32 0)) - call void @js_set_attribute(i32 %var55, 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.27, i32 0, i32 0)) - %var56 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) - call void @js_bind_event(i32 %var56, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.28, i32 0, i32 0)) - %var57 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.29, i32 0, i32 0)) + %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)) + %var57 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.29, i32 0, i32 0)) + %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 %var55, i32 %var56) - br label %if.end.var47 -if.end.var47: - %var59 = load i32, i32* @signal_Tabs_tab_index - %var60 = icmp eq i32 %var59, 2 - %var61 = zext i1 %var60 to i32 - %var62 = icmp ne i32 %var61, 0 - br i1 %var62, label %if.then.var58, label %if.else.var58 -if.then.var58: - %var63 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i32 0, i32 0)) - call void @js_set_attribute(i32 %var63, 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.24, i32 0, i32 0)) - %var64 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) - call void @js_bind_event(i32 %var64, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.30, i32 0, i32 0)) - %var65 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.31, i32 0, i32 0)) - call void @js_append_child(i32 %var64, i32 %var65) - call void @js_append_child(i32 %var63, i32 %var64) - br label %if.end.var58 -if.else.var58: - %var66 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i32 0, i32 0)) - call void @js_set_attribute(i32 %var66, 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.27, i32 0, i32 0)) - %var67 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) - call void @js_bind_event(i32 %var67, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.30, i32 0, i32 0)) - %var68 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.31, i32 0, i32 0)) + %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) + %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 + %var64 = icmp eq i32 %var63, 0 + %var65 = zext i1 %var64 to i32 + %var66 = icmp ne i32 %var65, 0 + br i1 %var66, label %if.then.var62, label %if.else.var62 +if.then.var62: + %var67 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.35, i32 0, i32 0)) + call void @js_set_attribute(i32 %var67, 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.36, i32 0, i32 0)) + %var68 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) + call void @js_bind_event(i32 %var68, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.37, i32 0, i32 0)) + %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 %var66, i32 %var67) - br label %if.end.var58 -if.end.var58: - call void @js_append_child(i32 %var30, i32 %var35) - %var69 = 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 %var69, 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.32, i32 0, i32 0)) - call void @js_append_child(i32 %var30, i32 %var69) - %var70 = 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 %var70, 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.33, i32 0, i32 0)) - %var71 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) - ; TODO: Format f-string with signal tab_index - %var72 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.34, i32 0, i32 0)) + 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)) + call void @js_set_attribute(i32 %var70, 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.39, i32 0, i32 0)) + %var71 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) + call void @js_bind_event(i32 %var71, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.37, i32 0, i32 0)) + %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 %var30, i32 %var70) - call void @js_set_root(i32 %var30) + br label %if.end.var62 +if.end.var62: + %var74 = load i32, i32* @signal_Tabs_tab_index + %var75 = icmp eq i32 %var74, 1 + %var76 = zext i1 %var75 to i32 + %var77 = icmp ne i32 %var76, 0 + br i1 %var77, label %if.then.var73, label %if.else.var73 +if.then.var73: + %var78 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.35, i32 0, i32 0)) + call void @js_set_attribute(i32 %var78, 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.36, i32 0, i32 0)) + %var79 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) + call void @js_bind_event(i32 %var79, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.40, i32 0, i32 0)) + %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) + 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)) + call void @js_set_attribute(i32 %var81, 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.39, i32 0, i32 0)) + %var82 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) + call void @js_bind_event(i32 %var82, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.40, i32 0, i32 0)) + %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) + br label %if.end.var73 +if.end.var73: + %var85 = load i32, i32* @signal_Tabs_tab_index + %var86 = icmp eq i32 %var85, 2 + %var87 = zext i1 %var86 to i32 + %var88 = icmp ne i32 %var87, 0 + br i1 %var88, label %if.then.var84, label %if.else.var84 +if.then.var84: + %var89 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.35, i32 0, i32 0)) + call void @js_set_attribute(i32 %var89, 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.36, i32 0, i32 0)) + %var90 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) + call void @js_bind_event(i32 %var90, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.42, i32 0, i32 0)) + %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) + 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)) + call void @js_set_attribute(i32 %var92, 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.39, i32 0, i32 0)) + %var93 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) + call void @js_bind_event(i32 %var93, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.42, i32 0, i32 0)) + %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) + br label %if.end.var84 +if.end.var84: + 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)) + %var97 = load i32, i32* @signal_Tabs_tab_index + switch i32 %var97, label %match.case3.var96 [ + i32 0, label %match.case0.var96 + i32 1, label %match.case1.var96 + i32 2, label %match.case2.var96 + ] +match.case0.var96: + %var98 = 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 %var98, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.45, i32 0, i32 0)) + %var99 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.46, i32 0, i32 0)) + %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) + %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) + %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) + %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) + %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) + %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 %var98, i32 %var105) + 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)) + call void @js_set_attribute(i32 %var112, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.53, i32 0, i32 0)) + %var113 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.46, i32 0, i32 0)) + %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) + %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) + %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) + %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) + %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 %var112, i32 %var117) + 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)) + call void @js_set_attribute(i32 %var124, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.60, i32 0, i32 0)) + %var125 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.46, i32 0, i32 0)) + %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) + %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) + 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)) + call void @js_set_attribute(i32 %var129, 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.62, i32 0, i32 0)) + %var130 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %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) + br label %match.end.var96 +match.end.var96: + 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)) + %var133 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + ; TODO: Format f-string with signal tab_index + %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 %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 c276a1574f1dfcfeef8c82cdd89f1a36b6aa771d..2253726bc15a1120bdeca600593b169306841e56 100755 GIT binary patch literal 3185 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 PZC(%Ce*i?v9FF}5BBp|T delta 675 zcmYk4PfQa*6vp>;+o6E;PgtPTB1;ItDp})v7_frMlF(u;w6NASEs$-AQcW}_ zMDI@{UQ7!fS}sUNBZ+6lcrwA$ss}M*Jc;1JM2+sOnmC7F-hA_YGjAsI@)^8-2)6Bt ziZV_gCfTK&3@+PNOz;L*P1iug9=@qclx%M9f?2goqGUHJha}>4ezvYUVu_GQiQi<= z(-Mggzgem=9MzH&_n2D(Qdw&W$LVsdA-g1Zg#0z`G?d!^6px{}jdc^=GuM>Vt96Mo zZv%Z{{;?Z!xZ0XGCoEoqxqTtN-^-)P*NAPtUI^h8Uzl$Be(^%Kv_(wD;&M`K(jcH7 z)H}O2O5OQ7QC&IZdxC3F4|b)2}X8*y= str | None: @@ -267,6 +269,59 @@ class SignalLLVMIRGenerator: return None + def _emit_match(self, stmt: dict[str, Any]) -> str | None: + """Emit a match/case statement using LLVM switch.""" + # Generate unique labels + match_id = self._new_var() + + # Evaluate subject expression + subject_var = self._emit_expr(stmt["subject"]) + + # Create labels for each case and the end + case_labels = [f"match.case{i}.{match_id}" for i in range(len(stmt["cases"]))] + end_label = f"match.end.{match_id}" + default_label = f"match.default.{match_id}" + + # Build switch instruction + # Find wildcard case (case _:) to use as default + default_case_idx = None + switch_cases = [] + for i, case in enumerate(stmt["cases"]): + pattern = case["pattern"] + if pattern["type"] == "wildcard": + default_case_idx = i + elif pattern["type"] == "value": + # Extract the constant value + value = pattern["value"]["value"] + switch_cases.append(f"i32 {value}, label %{case_labels[i]}") + + # Emit switch + if default_case_idx is not None: + self.lines.append(f" switch i32 %{subject_var}, label %{case_labels[default_case_idx]} [") + else: + self.lines.append(f" switch i32 %{subject_var}, label %{default_label} [") + + for case_spec in switch_cases: + self.lines.append(f" {case_spec}") + self.lines.append(" ]") + + # Emit each case body + for i, case in enumerate(stmt["cases"]): + self.lines.append(f"{case_labels[i]}:") + for case_stmt in case["body"]: + self._emit_statement(case_stmt) + self.lines.append(f" br label %{end_label}") + + # Emit default case if needed (no wildcard) + if default_case_idx is None: + self.lines.append(f"{default_label}:") + self.lines.append(f" br label %{end_label}") + + # Emit end label + self.lines.append(f"{end_label}:") + + return None + def _emit_expr(self, expr: dict[str, Any]) -> str: """Emit an expression and return the result variable name.""" if expr["type"] == "name":