diff --git a/examples/tabs/.Tabs.py.swp b/examples/tabs/.Tabs.py.swp deleted file mode 100644 index 9b5d79c..0000000 Binary files a/examples/tabs/.Tabs.py.swp and /dev/null differ diff --git a/examples/textinput/TextInput.ll b/examples/textinput/TextInput.ll index 833c0da..d569374 100644 --- a/examples/textinput/TextInput.ll +++ b/examples/textinput/TextInput.ll @@ -60,75 +60,79 @@ entry: ; Event handler: increment define void @increment() { entry: - store i32 0, i32* @signal_TextInput_count + %var0 = load i32, i32* @signal_TextInput_count + %var1 = add i32 %var0, 1 + store i32 %var1, i32* @signal_TextInput_count ret void } ; Event handler: decrement define void @decrement() { entry: - store i32 0, i32* @signal_TextInput_count + %var2 = load i32, i32* @signal_TextInput_count + %var3 = sub i32 %var2, 1 + store i32 %var3, i32* @signal_TextInput_count ret void } ; Component render function define i32 @render_TextInput() { entry: - %var0 = 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 %var0, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0)) - %var1 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0)) - %var2 = call i32 @js_create_text(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.4, i32 0, i32 0)) - call void @js_append_child(i32 %var1, i32 %var2) - call void @js_append_child(i32 %var0, i32 %var1) - %var3 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, i32 0, i32 0)) - call void @js_set_attribute(i32 %var3, 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.6, i32 0, i32 0)) - %var4 = call i32 @js_create_text(i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0)) - call void @js_append_child(i32 %var3, i32 %var4) - call void @js_append_child(i32 %var0, i32 %var3) - %var5 = 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 %var5, 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.8, i32 0, i32 0)) - %var6 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.9, i32 0, i32 0)) - call void @js_bind_event(i32 %var6, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.10, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i32 0, i32 0)) - %var7 = call i32 @js_create_text(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.12, i32 0, i32 0)) - call void @js_append_child(i32 %var6, i32 %var7) + %var4 = 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 %var4, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0)) + %var5 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0)) + %var6 = call i32 @js_create_text(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.4, i32 0, i32 0)) call void @js_append_child(i32 %var5, i32 %var6) - %var8 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, i32 0, i32 0)) - call void @js_set_attribute(i32 %var8, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.13, i32 0, i32 0)) - ; TODO: Format f-string with signal count - %var9 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i32 0, i32 0)) - call void @js_append_child(i32 %var8, i32 %var9) - call void @js_append_child(i32 %var5, i32 %var8) + call void @js_append_child(i32 %var4, i32 %var5) + %var7 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, 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 ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0)) + %var8 = call i32 @js_create_text(i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0)) + call void @js_append_child(i32 %var7, i32 %var8) + call void @js_append_child(i32 %var4, i32 %var7) + %var9 = 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 %var9, 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.8, i32 0, i32 0)) %var10 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.9, i32 0, i32 0)) - call void @js_bind_event(i32 %var10, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.10, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.15, i32 0, i32 0)) - %var11 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.16, i32 0, i32 0)) + call void @js_bind_event(i32 %var10, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.10, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i32 0, i32 0)) + %var11 = call i32 @js_create_text(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.12, i32 0, i32 0)) call void @js_append_child(i32 %var10, i32 %var11) - call void @js_append_child(i32 %var5, i32 %var10) - call void @js_append_child(i32 %var0, i32 %var5) + call void @js_append_child(i32 %var9, i32 %var10) %var12 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, i32 0, i32 0)) - call void @js_set_attribute(i32 %var12, 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.17, i32 0, i32 0)) - %var13 = call i32 @js_create_text(i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str.18, i32 0, i32 0)) + call void @js_set_attribute(i32 %var12, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.13, i32 0, i32 0)) + ; TODO: Format f-string with signal count + %var13 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i32 0, i32 0)) call void @js_append_child(i32 %var12, i32 %var13) - call void @js_append_child(i32 %var0, i32 %var12) - %var14 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.19, i32 0, i32 0)) - call void @js_set_attribute(i32 %var14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.20, i32 0, i32 0)) - %var15 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0)) - %var16 = call i32 @js_create_text(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.22, i32 0, i32 0)) - call void @js_append_child(i32 %var15, i32 %var16) + call void @js_append_child(i32 %var9, i32 %var12) + %var14 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.9, i32 0, i32 0)) + call void @js_bind_event(i32 %var14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.10, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.15, i32 0, i32 0)) + %var15 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.16, i32 0, i32 0)) call void @js_append_child(i32 %var14, i32 %var15) - %var17 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0)) - %var18 = call i32 @js_create_text(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.23, i32 0, i32 0)) - call void @js_append_child(i32 %var17, i32 %var18) - call void @js_append_child(i32 %var14, i32 %var17) + call void @js_append_child(i32 %var9, i32 %var14) + call void @js_append_child(i32 %var4, i32 %var9) + %var16 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, i32 0, i32 0)) + call void @js_set_attribute(i32 %var16, 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.17, i32 0, i32 0)) + %var17 = call i32 @js_create_text(i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str.18, i32 0, i32 0)) + call void @js_append_child(i32 %var16, i32 %var17) + call void @js_append_child(i32 %var4, i32 %var16) + %var18 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.19, i32 0, i32 0)) + call void @js_set_attribute(i32 %var18, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.20, i32 0, i32 0)) %var19 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0)) - %var20 = call i32 @js_create_text(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.24, i32 0, i32 0)) + %var20 = call i32 @js_create_text(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.22, i32 0, i32 0)) call void @js_append_child(i32 %var19, i32 %var20) - call void @js_append_child(i32 %var14, i32 %var19) + call void @js_append_child(i32 %var18, i32 %var19) %var21 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0)) - %var22 = call i32 @js_create_text(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.25, i32 0, i32 0)) + %var22 = call i32 @js_create_text(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.23, i32 0, i32 0)) call void @js_append_child(i32 %var21, i32 %var22) - call void @js_append_child(i32 %var14, i32 %var21) - call void @js_append_child(i32 %var0, i32 %var14) - ret i32 %var0 + call void @js_append_child(i32 %var18, i32 %var21) + %var23 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0)) + %var24 = 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 %var23, i32 %var24) + call void @js_append_child(i32 %var18, i32 %var23) + %var25 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0)) + %var26 = call i32 @js_create_text(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.25, i32 0, i32 0)) + call void @js_append_child(i32 %var25, i32 %var26) + call void @js_append_child(i32 %var18, i32 %var25) + call void @js_append_child(i32 %var4, i32 %var18) + ret i32 %var4 } ; Main entry point diff --git a/examples/textinput/TextInput.wasm b/examples/textinput/TextInput.wasm index c8d021a..9a9cb10 100755 Binary files a/examples/textinput/TextInput.wasm and b/examples/textinput/TextInput.wasm differ diff --git a/ritz/__pycache__/llvm_codegen_signals.cpython-313.pyc b/ritz/__pycache__/llvm_codegen_signals.cpython-313.pyc index dca0fc5..c25a0c7 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/__pycache__/parser.cpython-313.pyc b/ritz/__pycache__/parser.cpython-313.pyc index 420c747..59943cd 100644 Binary files a/ritz/__pycache__/parser.cpython-313.pyc and b/ritz/__pycache__/parser.cpython-313.pyc differ diff --git a/ritz/llvm_codegen_signals.py b/ritz/llvm_codegen_signals.py index 5730b1c..fe7f42d 100644 --- a/ritz/llvm_codegen_signals.py +++ b/ritz/llvm_codegen_signals.py @@ -1093,6 +1093,25 @@ class SignalLLVMIRGenerator: result_var = self._new_var() self.lines.append(f" %{result_var} = select i1 %{cond_var}, i32 {true_val}, i32 {false_val}") return f"%{result_var}" + elif expr["type"] == "binop": + # Handle binary operations (e.g., count + 1, x - 5) + left_val = self._emit_expr(expr["left"]) + right_val = self._emit_expr(expr["right"]) + op = expr["op"] + + # Map Python operators to LLVM instructions + op_map = { + "Add": "add", + "Sub": "sub", + "Mult": "mul", + "Div": "sdiv", # signed division + "Mod": "srem", # signed remainder + } + + llvm_op = op_map.get(op, "add") + result_var = self._new_var() + self.lines.append(f" %{result_var} = {llvm_op} i32 {left_val}, {right_val}") + return f"%{result_var}" else: # Unknown expression type return "0" diff --git a/ritz/parser.py b/ritz/parser.py index df6590c..06c2135 100644 --- a/ritz/parser.py +++ b/ritz/parser.py @@ -356,6 +356,14 @@ def _transform_expr(expr: ast.expr | None) -> dict[str, Any]: "body": _transform_expr(expr.body), "orelse": _transform_expr(expr.orelse), } + elif isinstance(expr, ast.BinOp): + # Handle binary operations (e.g., count + 1, x - 5, a * b) + return { + "type": "binop", + "left": _transform_expr(expr.left), + "op": type(expr.op).__name__, # Add, Sub, Mult, Div, Mod, etc. + "right": _transform_expr(expr.right), + } else: return {"type": "unknown", "ast_type": type(expr).__name__}