Files
ritz/examples/textinput/TextInput.ll
T
Aaron SinclairandClaude e1219ea0c1 Implement binary operations (BinOp) support
**Parser changes (parser.py):**
- Added ast.BinOp handling in _transform_expr()
- Emits: {type: "binop", left: ..., op: "Add|Sub|Mult|Div|Mod", right: ...}

**Codegen changes (llvm_codegen_signals.py):**
- Added BinOp handling in _emit_expr()
- Maps Python ops to LLVM instructions:
  - Add → add i32
  - Sub → sub i32
  - Mult → mul i32
  - Div → sdiv i32 (signed division)
  - Mod → srem i32 (signed remainder)

**Result:**
Before: count = count + 1 → store i32 0 (WRONG!)
After:  count = count + 1 → load, add i32 1, store ✓

**Still TODO:**
The counter buttons now UPDATE the signal correctly, but the display
doesn't update because f-string text nodes aren't reactive yet.
We need reactive text nodes (similar to reactive attributes).

All 55 tests passing ✓

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 12:18:16 -08:00

145 lines
8.4 KiB
LLVM
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; Generated by Ritz Framework with Signals
; Components: TextInput
; String constants
@.str.0 = private unnamed_addr constant [4 x i8] c"div\00"
@.str.1 = private unnamed_addr constant [6 x i8] c"class\00"
@.str.2 = private unnamed_addr constant [10 x i8] c"container\00"
@.str.3 = private unnamed_addr constant [3 x i8] c"h1\00"
@.str.4 = private unnamed_addr constant [17 x i8] c"Reactive Counter\00"
@.str.5 = private unnamed_addr constant [2 x i8] c"p\00"
@.str.6 = private unnamed_addr constant [13 x i8] c"instructions\00"
@.str.7 = private unnamed_addr constant [65 x i8] c"Click buttons to see reactive updates (text input coming soon!):\00"
@.str.8 = private unnamed_addr constant [13 x i8] c"button-group\00"
@.str.9 = private unnamed_addr constant [7 x i8] c"button\00"
@.str.10 = private unnamed_addr constant [6 x i8] c"click\00"
@.str.11 = private unnamed_addr constant [10 x i8] c"decrement\00"
@.str.12 = private unnamed_addr constant [4 x i8] c"−\00"
@.str.13 = private unnamed_addr constant [16 x i8] c"counter-display\00"
@.str.14 = private unnamed_addr constant [2 x i8] c"0\00"
@.str.15 = private unnamed_addr constant [10 x i8] c"increment\00"
@.str.16 = private unnamed_addr constant [2 x i8] c"+\00"
@.str.17 = private unnamed_addr constant [5 x i8] c"todo\00"
@.str.18 = private unnamed_addr constant [49 x i8] c"TODO: Replace with text input once we implement:\00"
@.str.19 = private unnamed_addr constant [3 x i8] c"ul\00"
@.str.20 = private unnamed_addr constant [10 x i8] c"todo-list\00"
@.str.21 = private unnamed_addr constant [3 x i8] c"li\00"
@.str.22 = private unnamed_addr constant [32 x i8] c"1. String signals (i8* not i32)\00"
@.str.23 = private unnamed_addr constant [25 x i8] c"2. oninput event handler\00"
@.str.24 = private unnamed_addr constant [23 x i8] c"3. Event value passing\00"
@.str.25 = private unnamed_addr constant [39 x i8] c"4. F-string interpolation with signals\00"
; JavaScript bridge function declarations
declare i32 @js_create_element(i8*)
declare i32 @js_create_text(i8*)
declare void @js_append_child(i32, i32)
declare void @js_set_attribute(i32, i8*, i8*)
declare void @js_set_root(i32)
declare void @js_bind_event(i32, i8*, i8*)
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 TextInput (reactive state in WASM memory)
@signal_TextInput_count = global i32 0
; Signal helper functions
define i32 @get_count() {
entry:
%val = load i32, i32* @signal_TextInput_count
ret i32 %val
}
define void @set_count(i32 %newval) {
entry:
store i32 %newval, i32* @signal_TextInput_count
; TODO: Trigger DOM update callback
ret void
}
; Event handler: increment
define void @increment() {
entry:
%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:
%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:
%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)
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.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 %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 ([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 %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)
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 ([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 %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 ([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 %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
define void @main() {
entry:
%root = call i32 @render_TextInput()
call void @js_set_root(i32 %root)
ret void
}