chore: Phase 25.1 完了 - LoopForm v2/Stage1 CLI/環境変数削減 + Phase 26-D からの変更
Phase 25.1 完了成果: - ✅ LoopForm v2 テスト・ドキュメント・コメント完備 - 4ケース(A/B/C/D)完全テストカバレッジ - 最小再現ケース作成(SSAバグ調査用) - SSOT文書作成(loopform_ssot.md) - 全ソースに [LoopForm] コメントタグ追加 - ✅ Stage-1 CLI デバッグ環境構築 - stage1_cli.hako 実装 - stage1_bridge.rs ブリッジ実装 - デバッグツール作成(stage1_debug.sh/stage1_minimal.sh) - アーキテクチャ改善提案文書 - ✅ 環境変数削減計画策定 - 25変数の完全調査・分類 - 6段階削減ロードマップ(25→5、80%削減) - 即時削除可能変数特定(NYASH_CONFIG/NYASH_DEBUG) Phase 26-D からの累積変更: - PHI実装改善(ExitPhiBuilder/HeaderPhiBuilder等) - MIRビルダーリファクタリング - 型伝播・最適化パス改善 - その他約300ファイルの累積変更 🎯 技術的成果: - SSAバグ根本原因特定(条件分岐内loop変数変更) - Region+next_iパターン適用完了(UsingCollectorBox等) - LoopFormパターン文書化・テスト化完了 - セルフホスティング基盤強化 Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: ChatGPT <noreply@openai.com> Co-Authored-By: Task Assistant <task@anthropic.com>
This commit is contained in:
@ -1,4 +1,7 @@
|
||||
use super::{EffectMask, FunctionSignature, MirFunction, MirInstruction, MirModule, MirType, ValueId, BasicBlockId};
|
||||
use super::{
|
||||
BasicBlockId, EffectMask, FunctionSignature, MirFunction, MirInstruction, MirModule, MirType,
|
||||
ValueId,
|
||||
};
|
||||
use crate::ast::ASTNode;
|
||||
|
||||
// Lifecycle routines extracted from builder.rs
|
||||
@ -6,7 +9,13 @@ fn has_main_static(ast: &ASTNode) -> bool {
|
||||
use crate::ast::ASTNode as N;
|
||||
if let N::Program { statements, .. } = ast {
|
||||
for st in statements {
|
||||
if let N::BoxDeclaration { name, methods, is_static, .. } = st {
|
||||
if let N::BoxDeclaration {
|
||||
name,
|
||||
methods,
|
||||
is_static,
|
||||
..
|
||||
} = st
|
||||
{
|
||||
if *is_static && name == "Main" {
|
||||
if let Some(m) = methods.get("main") {
|
||||
if let N::FunctionDeclaration { .. } = m {
|
||||
@ -31,7 +40,12 @@ impl super::MirBuilder {
|
||||
self.index_declarations(st);
|
||||
}
|
||||
}
|
||||
ASTNode::BoxDeclaration { name, methods, is_static, .. } => {
|
||||
ASTNode::BoxDeclaration {
|
||||
name,
|
||||
methods,
|
||||
is_static,
|
||||
..
|
||||
} => {
|
||||
if !*is_static {
|
||||
self.user_defined_boxes.insert(name.clone());
|
||||
} else {
|
||||
@ -106,7 +120,8 @@ impl super::MirBuilder {
|
||||
ASTNode::Program { statements, .. } => {
|
||||
use crate::ast::ASTNode as N;
|
||||
// First pass: lower declarations (static boxes except Main, and instance boxes)
|
||||
let mut main_static: Option<(String, std::collections::HashMap<String, ASTNode>)> = None;
|
||||
let mut main_static: Option<(String, std::collections::HashMap<String, ASTNode>)> =
|
||||
None;
|
||||
for st in &statements {
|
||||
if let N::BoxDeclaration {
|
||||
name,
|
||||
@ -135,9 +150,20 @@ impl super::MirBuilder {
|
||||
|
||||
// Lower all static methods into standalone functions: BoxName.method/Arity
|
||||
for (mname, mast) in methods.iter() {
|
||||
if let N::FunctionDeclaration { params, body, .. } = mast {
|
||||
let func_name = format!("{}.{}{}", name, mname, format!("/{}", params.len()));
|
||||
self.lower_static_method_as_function(func_name, params.clone(), body.clone())?;
|
||||
if let N::FunctionDeclaration { params, body, .. } =
|
||||
mast
|
||||
{
|
||||
let func_name = format!(
|
||||
"{}.{}{}",
|
||||
name,
|
||||
mname,
|
||||
format!("/{}", params.len())
|
||||
);
|
||||
self.lower_static_method_as_function(
|
||||
func_name,
|
||||
params.clone(),
|
||||
body.clone(),
|
||||
)?;
|
||||
self.static_method_index
|
||||
.entry(mname.clone())
|
||||
.or_insert_with(Vec::new)
|
||||
@ -174,9 +200,20 @@ impl super::MirBuilder {
|
||||
}
|
||||
}
|
||||
for (mname, mast) in methods.iter() {
|
||||
if let N::FunctionDeclaration { params, body, is_static, .. } = mast {
|
||||
if let N::FunctionDeclaration {
|
||||
params,
|
||||
body,
|
||||
is_static,
|
||||
..
|
||||
} = mast
|
||||
{
|
||||
if !*is_static {
|
||||
let func_name = format!("{}.{}{}", name, mname, format!("/{}", params.len()));
|
||||
let func_name = format!(
|
||||
"{}.{}{}",
|
||||
name,
|
||||
mname,
|
||||
format!("/{}", params.len())
|
||||
);
|
||||
self.lower_method_as_function(
|
||||
func_name,
|
||||
name.clone(),
|
||||
@ -208,10 +245,7 @@ impl super::MirBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn finalize_module(
|
||||
&mut self,
|
||||
result_value: ValueId,
|
||||
) -> Result<MirModule, String> {
|
||||
pub(super) fn finalize_module(&mut self, result_value: ValueId) -> Result<MirModule, String> {
|
||||
// Hint: scope leave at function end (id=0 for main)
|
||||
self.hint_scope_leave(0);
|
||||
if let Some(block_id) = self.current_block {
|
||||
@ -280,7 +314,12 @@ impl super::MirBuilder {
|
||||
let insns = &bb.instructions;
|
||||
let mut idx = 0usize;
|
||||
while idx < insns.len() {
|
||||
if let MirInstruction::NewBox { dst, box_type, args } = &insns[idx] {
|
||||
if let MirInstruction::NewBox {
|
||||
dst,
|
||||
box_type,
|
||||
args,
|
||||
} = &insns[idx]
|
||||
{
|
||||
// Skip StringBox (literal optimization path)
|
||||
if box_type != "StringBox" {
|
||||
let expect_tail = format!("{}.birth/{}", box_type, args.len());
|
||||
@ -290,16 +329,26 @@ impl super::MirBuilder {
|
||||
let mut last_const_name: Option<String> = None;
|
||||
while j < insns.len() && j <= idx + 3 {
|
||||
match &insns[j] {
|
||||
MirInstruction::BoxCall { box_val, method, .. } => {
|
||||
if method == "birth" && box_val == dst { ok = true; break; }
|
||||
MirInstruction::BoxCall {
|
||||
box_val, method, ..
|
||||
} => {
|
||||
if method == "birth" && box_val == dst {
|
||||
ok = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
MirInstruction::Const { value, .. } => {
|
||||
if let super::ConstValue::String(s) = value { last_const_name = Some(s.clone()); }
|
||||
if let super::ConstValue::String(s) = value {
|
||||
last_const_name = Some(s.clone());
|
||||
}
|
||||
}
|
||||
MirInstruction::Call { func: _, .. } => {
|
||||
// If immediately preceded by matching Const String, accept
|
||||
if let Some(prev) = last_const_name.as_ref() {
|
||||
if prev == &expect_tail { ok = true; break; }
|
||||
if prev == &expect_tail {
|
||||
ok = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Heuristic: in some forms, builder may reuse a shared const; best-effort only
|
||||
}
|
||||
@ -317,7 +366,10 @@ impl super::MirBuilder {
|
||||
}
|
||||
}
|
||||
if warn_count > 0 {
|
||||
eprintln!("[warn] dev verify: NewBox→birth invariant warnings: {}", warn_count);
|
||||
eprintln!(
|
||||
"[warn] dev verify: NewBox→birth invariant warnings: {}",
|
||||
warn_count
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user