feat(phase21.5/22.1): MirBuilder JsonFrag refactor + FileBox ring-1 + registry tests
Phase 21.5 (AOT/LLVM Optimization Prep) - FileBox ring-1 (core-ro) provider: priority=-100, always available, no panic path - src/runner/modes/common_util/provider_registry.rs: CoreRoFileProviderFactory - Auto-registers at startup, eliminates fallback panic structurally - StringBox fast path prototypes (length/size optimization) - Performance benchmarks (C/Python/Hako comparison baseline) Phase 22.1 (JsonFrag Unification) - JsonFrag.last_index_of_from() for backward search (VM fallback) - Replace hand-written lastIndexOf in lower_loop_sum_bc_box.hako - SentinelExtractorBox for Break/Continue pattern extraction MirBuilder Refactor (Box → JsonFrag Migration) - 20+ lower_*_box.hako: Box-heavy → JsonFrag text assembly - MirBuilderMinBox: lightweight using set for dev env - Registry-only fast path with [registry:*] tag observation - pattern_util_box.hako: enhanced pattern matching Dev Environment & Testing - Dev toggles: SMOKES_DEV_PREINCLUDE=1 (point-enable), HAKO_MIR_BUILDER_SKIP_LOOPS=1 - phase2160: registry opt-in tests (array/map get/set/push/len) - content verification - phase2034: rc-dependent → token grep (grep -F based validation) - run_quick.sh: fast smoke testing harness - ENV documentation: docs/ENV_VARS.md Test Results ✅ quick phase2034: ALL GREEN (MirBuilder internal patterns) ✅ registry phase2160: ALL GREEN (array/map get/set/push/len) ✅ rc-dependent tests → content token verification complete ✅ PREINCLUDE policy: default OFF, point-enable only where needed Technical Notes - No INCLUDE by default (maintain minimalism) - FAIL_FAST=0 in Bring-up contexts only (explicit dev toggles) - Tag-based route observation ([mirbuilder/min:*], [registry:*]) - MIR structure validation (not just rc parity) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -118,7 +118,26 @@ def lower_boxcall(
|
||||
|
||||
# Minimal method bridging for strings and console
|
||||
if method_name in ("length", "len"):
|
||||
# Any.length_h: Array/String/Map に対応
|
||||
# Fast path (opt-in): pointer-based string length → nyash.string.length_si(i8*, i64 mode)
|
||||
try:
|
||||
import os
|
||||
fast_on = os.environ.get('NYASH_LLVM_FAST') == '1'
|
||||
except Exception:
|
||||
fast_on = False
|
||||
if fast_on and resolver is not None and hasattr(resolver, 'string_ptrs'):
|
||||
try:
|
||||
ptr = resolver.string_ptrs.get(int(box_vid))
|
||||
except Exception:
|
||||
ptr = None
|
||||
if ptr is not None:
|
||||
mode = 1 if os.environ.get('NYASH_STR_CP') == '1' else 0
|
||||
mode_c = ir.Constant(i64, mode)
|
||||
callee = _declare(module, "nyash.string.length_si", i64, [i8p, i64])
|
||||
result = builder.call(callee, [ptr, mode_c], name="strlen_si")
|
||||
if dst_vid is not None:
|
||||
vmap[dst_vid] = result
|
||||
return
|
||||
# Default: Any.length_h(handle) → i64
|
||||
recv_h = _ensure_handle(builder, module, recv_val)
|
||||
callee = _declare(module, "nyash.any.length_h", i64, [i64])
|
||||
result = builder.call(callee, [recv_h], name="any_length_h")
|
||||
|
||||
Reference in New Issue
Block a user