feat(joinir): Phase 213-2 Step 2-2 & 2-3 Data structure extensions

Extended PatternPipelineContext and CarrierUpdateInfo for Pattern 3 AST-based generalization.

Changes:
1. PatternPipelineContext:
   - Added loop_condition: Option<ASTNode>
   - Added loop_body: Option<Vec<ASTNode>>
   - Added loop_update_summary: Option<LoopUpdateSummary>
   - Updated build_pattern_context() for Pattern 3

2. CarrierUpdateInfo:
   - Added then_expr: Option<ASTNode>
   - Added else_expr: Option<ASTNode>
   - Updated analyze_loop_updates() with None defaults

Status: Phase 213-2 Steps 2-2 & 2-3 complete
Next: Create Pattern3IfAnalyzer to extract if statement and populate update summary
This commit is contained in:
nyash-codex
2025-12-10 00:01:53 +09:00
parent 577b5b01d5
commit d7805e5974
138 changed files with 3529 additions and 378 deletions

View File

@ -3,14 +3,14 @@
このページはPhase 10.10の再起動用ミニ手順です。3つだけ確かめればOK。
- 事前ビルド: `cargo build --release -j32`
- 実行は `./target/release/nyash` を使用
- 実行は `./target/release/hakorune` を使用
## 1) HH直実行Map.get_hh
- 目的: 受け手/キーが関数パラメータのとき、JIT HostCallを許可HH経路
- 実行:
```
NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 NYASH_JIT_HOSTCALL=1 NYASH_JIT_EVENTS=1 \
./target/release/nyash --backend vm examples/jit_map_get_param_hh.hako
./target/release/hakorune --backend vm examples/jit_map_get_param_hh.hako
```
- 期待: `allow id: nyash.map.get_hh` イベントが出る。戻り値は `value1`
@ -19,7 +19,7 @@ NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 NYASH_JIT_HOSTCALL=1 NYASH_JIT_EVENTS=1 \
- 実行:
```
NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 NYASH_JIT_HOSTCALL=1 NYASH_JIT_EVENTS=1 \
./target/release/nyash --backend vm examples/jit_policy_optin_mutating.hako
./target/release/hakorune --backend vm examples/jit_policy_optin_mutating.hako
```
- 期待: 1回目は `policy_denied_mutating` でfallback、whitelist後の2回目はallow。
@ -36,7 +36,7 @@ NYASH_JIT_EVENTS_RUNTIME=1 NYASH_JIT_EVENTS_PATH=events.jsonl ...
- 目的: GCのカウント/トレース/バリア観測の導線確認VM経路
- 実行:
```
./target/release/nyash --backend vm examples/gc_counting_demo.hako
./target/release/hakorune --backend vm examples/gc_counting_demo.hako
```
- Tips: 詳細ログは `NYASH_GC_COUNTING=1 NYASH_GC_TRACE=2` を併用。
@ -45,7 +45,7 @@ NYASH_JIT_EVENTS_RUNTIME=1 NYASH_JIT_EVENTS_PATH=events.jsonl ...
- 実行(しきい値=1を明示またはDebugConfigBoxでapply後にRunnerが自動設定:
```
NYASH_JIT_THRESHOLD=1 NYASH_JIT_HOSTCALL=1 \
./target/release/nyash --backend vm examples/jit_policy_whitelist_demo.hako
./target/release/hakorune --backend vm examples/jit_policy_whitelist_demo.hako
```
- 期待: `policy_events.jsonl``phase:"lower"`(計画)と `phase:"execute"`(実績)が出る。
@ -61,12 +61,12 @@ NYASH_JIT_THRESHOLD=1 NYASH_JIT_HOSTCALL=1 \
- 事前: `cargo build --release --features cranelift-jit`
- 実行例String/Integer/Consoleの最小:
```
./target/release/nyash --compile-native examples/aot_min_string_len.hako -o app && ./app
./target/release/hakorune --compile-native examples/aot_min_string_len.hako -o app && ./app
# 結果は `Result: <val>` として標準出力に表示
```
- Python最小チェーンRO:
```
./target/release/nyash --compile-native examples/aot_py_min_chain.hako -o app && ./app
./target/release/hakorune --compile-native examples/aot_py_min_chain.hako -o app && ./app
```
- スクリプト版(詳細な手順): `tools/build_aot.sh <file> -o <out>`Windowsは `tools/build_aot.ps1`
@ -75,6 +75,6 @@ NYASH_JIT_THRESHOLD=1 NYASH_JIT_HOSTCALL=1 \
- 実行(デモ):
```
NYASH_SCHED_DEMO=1 NYASH_SCHED_POLL_BUDGET=2 \
./target/release/nyash --backend vm examples/scheduler_demo.hako
./target/release/hakorune --backend vm examples/scheduler_demo.hako
```
- 期待: `[SCHED] immediate task ran at safepoint``[SCHED] delayed task ran at safepoint` が出力

View File

@ -1,7 +1,7 @@
// AOT Python evalR OK demo (returns Result.Ok)
// Build:
// cargo build --release --features cranelift-jit
// ./target/release/nyash --compile-native examples/aot_py_result_ok.hako -o app && ./app
// ./target/release/hakorune --compile-native examples/aot_py_result_ok.hako -o app && ./app
static box Main {
main() {
@ -13,4 +13,3 @@ static box Main {
return 0
}
}

View File

@ -1,7 +1,7 @@
// ArrayBox plugin demo
// Requires: plugins/nyash-array-plugin built (release) and nyash.toml updated
// Run:
// NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/array_plugin_demo.hako
// NYASH_CLI_VERBOSE=1 ./target/release/hakorune --backend vm examples/array_plugin_demo.hako
static box Main {
main() {
@ -19,4 +19,3 @@ static box Main {
return a.length()
}
}

View File

@ -1,6 +1,6 @@
// GC Counting demo (VM path) — verifies CountingGc counters and barrier sites
// Run:
// ./target/release/nyash --backend vm examples/gc_counting_demo.hako
// ./target/release/hakorune --backend vm examples/gc_counting_demo.hako
// Expect (with trace): [GC] counters: safepoints>0 read_barriers>=0 write_barriers>=0
static box Main {
@ -31,4 +31,3 @@ static box Main {
return "done"
}
}

View File

@ -1,7 +1,7 @@
// jit-direct: boolean return normalization
// Build: cargo build --release --features cranelift-jit
// Run: NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 \
// ./target/release/nyash --jit-direct examples/jit_direct_bool_ret.hako
// ./target/release/hakorune --jit-direct examples/jit_direct_bool_ret.hako
static box Main {
main() {
@ -11,4 +11,3 @@ static box Main {
return a < b // expect true
}
}

View File

@ -1,7 +1,7 @@
// jit-direct: f64 return demo
// Build: cargo build --release --features cranelift-jit
// Run: NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 NYASH_JIT_NATIVE_F64=1 \
// ./target/release/nyash --jit-direct examples/jit_direct_f64_ret.hako
// ./target/release/hakorune --jit-direct examples/jit_direct_f64_ret.hako
static box Main {
main() {
@ -12,4 +12,3 @@ static box Main {
return s // expect 3.75
}
}

View File

@ -1,7 +1,7 @@
// jit-direct: minimal local Store/Load path
// Build: cargo build --release --features cranelift-jit
// Run: NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 \
// ./target/release/nyash --jit-direct examples/jit_direct_local_store_load.hako
// ./target/release/hakorune --jit-direct examples/jit_direct_local_store_load.hako
static box Main {
main() {
@ -12,4 +12,3 @@ static box Main {
return x // expect 3
}
}

View File

@ -1,5 +1,5 @@
// Fallback case: Array.append/push is mutating; with read-only policy it should fallback
// Run: NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 ./target/release/nyash --backend vm examples/jit_hostcall_array_append.hako
// Run: NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 ./target/release/hakorune --backend vm examples/jit_hostcall_array_append.hako
static box Main {
main() {
@ -9,4 +9,3 @@ static box Main {
return xs.length() // expect 1 in VM; under JIT read-only policy push is denied → still 1 via VM path
}
}

View File

@ -1,5 +1,5 @@
// Success case: String.length() via JIT hostcall (read-only)
// Run: NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 ./target/release/nyash --backend vm examples/jit_hostcall_len_string.hako
// Run: NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 ./target/release/hakorune --backend vm examples/jit_hostcall_len_string.hako
static box Main {
main() {
@ -8,4 +8,3 @@ static box Main {
return s.length()
}
}

View File

@ -1,7 +1,7 @@
// Allow case: math.sin expects f64; JIT records sig_ok (allow) and VM executes (thin bridge)
// Run:
// NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 NYASH_JIT_EVENTS=1 \
// ./target/release/nyash --backend vm examples/jit_hostcall_math_sin_allow_float.hako
// ./target/release/hakorune --backend vm examples/jit_hostcall_math_sin_allow_float.hako
static box Main {
main() {
@ -13,4 +13,3 @@ static box Main {
return m.sin(x)
}
}

View File

@ -2,7 +2,7 @@
// Expect: JIT hostcall allow for nyash.map.get_hh (Handle,Handle)
// Run:
// NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 NYASH_JIT_HOSTCALL=1 NYASH_JIT_EVENTS=1 \
// ./target/release/nyash --backend vm examples/jit_map_get_param_hh.hako
// ./target/release/hakorune --backend vm examples/jit_map_get_param_hh.hako
box Helper {
birth() {

View File

@ -1,11 +1,10 @@
// Function-style math: cos(x)
// Run:
// NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 NYASH_JIT_NATIVE_F64=1 NYASH_JIT_EVENTS=1 \
// ./target/release/nyash --backend vm examples/jit_math_function_style_cos_float.hako
// ./target/release/hakorune --backend vm examples/jit_math_function_style_cos_float.hako
static box Main {
main() {
return cos(0.0)
}
}

View File

@ -1,11 +1,10 @@
// Function-style math: max(a,b)
// Run:
// NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 NYASH_JIT_NATIVE_F64=1 NYASH_JIT_EVENTS=1 \
// ./target/release/nyash --backend vm examples/jit_math_function_style_max_float.hako
// ./target/release/hakorune --backend vm examples/jit_math_function_style_max_float.hako
static box Main {
main() {
return max(2.5, 7.0)
}
}

View File

@ -4,7 +4,7 @@
// Run:
// NYASH_USE_PLUGIN_BUILTINS=1 NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 \
// NYASH_JIT_SHIM_TRACE=1 NYASH_CLI_VERBOSE=1 \
// ./target/release/nyash --backend vm examples/jit_plugin_invoke_static_helper.hako
// ./target/release/hakorune --backend vm examples/jit_plugin_invoke_static_helper.hako
static box Helper {
static helper(arr) {
@ -22,4 +22,3 @@ a.push(3)
print(Helper.helper(a))
print(debug.getJitEvents())

View File

@ -4,7 +4,7 @@
// Run:
// NYASH_USE_PLUGIN_BUILTINS=1 NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 \
// NYASH_JIT_SHIM_TRACE=1 NYASH_CLI_VERBOSE=1 \
// ./target/release/nyash --backend vm examples/jit_shim_trace_param_array.hako
// ./target/release/hakorune --backend vm examples/jit_shim_trace_param_array.hako
static box Main {
main() {

View File

@ -1,8 +1,8 @@
// Nyash micro benchmarks using TimeBox (script-level)
// How to run:
// - Interpreter: ./target/release/nyash examples/ny_bench_fixed.hako
// - VM: ./target/release/nyash --backend vm examples/ny_bench_fixed.hako
// - VM+JIT (fast path!): NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 ./target/release/nyash --backend vm examples/ny_bench_fixed.hako
// - Interpreter: ./target/release/hakorune examples/ny_bench_fixed.hako
// - VM: ./target/release/hakorune --backend vm examples/ny_bench_fixed.hako
// - VM+JIT (fast path!): NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 ./target/release/hakorune --backend vm examples/ny_bench_fixed.hako
local ITER
ITER = 100000 // change for heavier runs
@ -55,4 +55,4 @@ ops = (ITER * 1000.0) / ms
print("[simple_add_loop] elapsed_ms=" + ms + ", ops/sec=" + ops)
print("\nDone.")
return 0
return 0

View File

@ -1,8 +1,8 @@
// Nyash small benchmarks - reduced iterations for quick testing
// How to run:
// - Interpreter: ./target/release/nyash examples/ny_bench_small.hako
// - VM: ./target/release/nyash --backend vm examples/ny_bench_small.hako
// - VM+JIT (fast path!): NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 ./target/release/nyash --backend vm examples/ny_bench_small.hako
// - Interpreter: ./target/release/hakorune examples/ny_bench_small.hako
// - VM: ./target/release/hakorune --backend vm examples/ny_bench_small.hako
// - VM+JIT (fast path!): NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 ./target/release/hakorune --backend vm examples/ny_bench_small.hako
local ITER
ITER = 1000 // reduced for interpreter testing
@ -43,4 +43,4 @@ loop(i < ITER) {
print("[simple_add_loop] final z = " + z)
print("\nDone.")
return 0
return 0

View File

@ -1,6 +1,6 @@
// Python callR error demo (returns Result.Err)
// Run:
// NYASH_PLUGIN_ONLY=1 ./target/release/nyash --backend vm examples/py_callR_error_demo.hako
// NYASH_PLUGIN_ONLY=1 ./target/release/hakorune --backend vm examples/py_callR_error_demo.hako
static box Main {
main() {
@ -14,4 +14,3 @@ static box Main {
return 0
}
}

View File

@ -2,7 +2,7 @@
// @env NYASH_PLUGIN_ONLY=1
// @env NYASH_PY_AUTODECODE=1
// Run:
// ./target/release/nyash --backend vm examples/py_callR_int_base16_ok_demo.hako
// ./target/release/hakorune --backend vm examples/py_callR_int_base16_ok_demo.hako
static box Main {
main() {

View File

@ -2,7 +2,7 @@
// @env NYASH_PLUGIN_ONLY=1
// @env NYASH_PY_AUTODECODE=1
// Run:
// ./target/release/nyash --backend vm examples/py_callR_ok_demo.hako
// ./target/release/hakorune --backend vm examples/py_callR_ok_demo.hako
static box Main {
main() {