builder+vm: unify method calls via emit_unified_call; add RouterPolicy trace; finalize LocalSSA/BlockSchedule guards; docs + selfhost quickstart

- Unify standard method calls to emit_unified_call; route via RouterPolicy and apply rewrite::{special,known} at a single entry.\n- Stabilize emit-time invariants: LocalSSA finalize + BlockSchedule PHI→Copy→Call ordering; metadata propagation on copies.\n- Known rewrite default ON (userbox only, strict guards) with opt-out flag NYASH_REWRITE_KNOWN_DEFAULT=0.\n- Expand TypeAnnotation whitelist (is_digit_char/is_hex_digit_char/is_alpha_char/Map.has).\n- Docs: unified-method-resolution design note; Quick Reference normalization note; selfhosting/quickstart.\n- Tools: add tools/selfhost_smoke.sh (dev-only).\n- Keep behavior unchanged for Unknown/core/user-instance via BoxCall fallback; all tests green (quick/integration).
This commit is contained in:
nyash-codex
2025-09-28 20:38:09 +09:00
parent e442e5f612
commit dd65cf7e4c
60 changed files with 2523 additions and 471 deletions

View File

@ -91,7 +91,7 @@ impl super::MirBuilder {
}
// Enter try block
self.emit_instruction(MirInstruction::Jump { target: try_block })?;
crate::mir::builder::emission::branch::emit_jump(self, try_block)?;
self.start_new_block(try_block)?;
let try_ast = ASTNode::Program {
statements: try_body,
@ -100,7 +100,7 @@ impl super::MirBuilder {
let _try_result = self.build_expression(try_ast)?;
if !self.is_current_block_terminated() {
let next_target = finally_block.unwrap_or(exit_block);
self.emit_instruction(MirInstruction::Jump { target: next_target })?;
crate::mir::builder::emission::branch::emit_jump(self, next_target)?;
}
// Catch block
@ -117,7 +117,7 @@ impl super::MirBuilder {
}
if !self.is_current_block_terminated() {
let next_target = finally_block.unwrap_or(exit_block);
self.emit_instruction(MirInstruction::Jump { target: next_target })?;
crate::mir::builder::emission::branch::emit_jump(self, next_target)?;
}
// Finally
@ -136,7 +136,7 @@ impl super::MirBuilder {
self.build_expression(finally_ast)?;
cleanup_terminated = self.is_current_block_terminated();
if !cleanup_terminated {
self.emit_instruction(MirInstruction::Jump { target: exit_block })?;
crate::mir::builder::emission::branch::emit_jump(self, exit_block)?;
}
self.in_cleanup_block = false;
}
@ -145,13 +145,9 @@ impl super::MirBuilder {
self.start_new_block(exit_block)?;
let result = if self.return_deferred_emitted && !cleanup_terminated {
self.emit_instruction(MirInstruction::Return { value: Some(ret_slot) })?;
let r = self.value_gen.next();
self.emit_instruction(MirInstruction::Const { dst: r, value: ConstValue::Void })?;
r
crate::mir::builder::emission::constant::emit_void(self)
} else {
let r = self.value_gen.next();
self.emit_instruction(MirInstruction::Const { dst: r, value: ConstValue::Void })?;
r
crate::mir::builder::emission::constant::emit_void(self)
};
// Restore context