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 c276a15..2253726 100755 Binary files a/examples/tabs/Tabs.wasm and b/examples/tabs/Tabs.wasm differ diff --git a/ritz/__pycache__/llvm_codegen_signals.cpython-313.pyc b/ritz/__pycache__/llvm_codegen_signals.cpython-313.pyc index 7e06a30..5927d8a 100644 Binary files a/ritz/__pycache__/llvm_codegen_signals.cpython-313.pyc and b/ritz/__pycache__/llvm_codegen_signals.cpython-313.pyc differ diff --git a/ritz/llvm_codegen_signals.py b/ritz/llvm_codegen_signals.py index c70a1bd..d757bc8 100644 --- a/ritz/llvm_codegen_signals.py +++ b/ritz/llvm_codegen_signals.py @@ -225,6 +225,8 @@ class SignalLLVMIRGenerator: return self._emit_yield(stmt) elif stmt["type"] == "if": return self._emit_if(stmt) + elif stmt["type"] == "match": + return self._emit_match(stmt) return None def _emit_if(self, stmt: dict[str, Any]) -> 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":