Pattern8 (Boolean Predicate Scan) implementation for is_integer/1:
- New pattern detection for `loop + if not predicate() { return false }`
- JoinIR lowerer with main/loop_step/k_exit structure
- Me receiver passed as param (by-name 禁止)
Key fixes:
1. expr_result = Some(join_exit_value) (Pattern7 style)
2. Tail-call: dst: None (no extra Ret instruction)
3. instruction_rewriter: Add `&& is_loop_header_with_phi` check
- Pattern8 has no carriers → no PHIs → MUST generate Copy bindings
- Without this, ValueId(103/104/105) were undefined
Status: Copy instructions now generated correctly, but exit block
creation issue remains (next step: Step A-C in指示書).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
36 lines
770 B
Plaintext
36 lines
770 B
Plaintext
static box StringUtils {
|
|
is_digit(ch) {
|
|
return ch == "0" or ch == "1" or ch == "2" or ch == "3" or ch == "4"
|
|
or ch == "5" or ch == "6" or ch == "7" or ch == "8" or ch == "9"
|
|
}
|
|
|
|
is_integer(s) {
|
|
if s.length() == 0 {
|
|
return false
|
|
}
|
|
|
|
local start = 0
|
|
if s.substring(0, 1) == "-" {
|
|
if s.length() == 1 {
|
|
return false
|
|
}
|
|
start = 1
|
|
}
|
|
|
|
local i = start
|
|
loop(i < s.length()) {
|
|
if not this.is_digit(s.substring(i, i + 1)) {
|
|
return false
|
|
}
|
|
i = i + 1
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
static box Main {
|
|
main() {
|
|
return StringUtils.is_integer("123") ? 7 : 1
|
|
}
|
|
}
|