Phase 20.34: wire Host providers via externs (env.mirbuilder.emit, env.codegen.emit_object); implement MirBuilder provider (Program→MIR JSON) and ny-llvmc wrapper; update Hako boxes (MirBuilderBox, LLVMEmitProviderBox) to delegate; adjust canaries to PASS (MirBuilder PASS, LLVM SKIP on unresolved or missing ny-llvmc).
This commit is contained in:
@ -25,6 +25,8 @@ pub fn extern_call(
|
||||
"env.debug" => handle_debug(method_name, args),
|
||||
"env.runtime" => handle_runtime(method_name, args),
|
||||
"env.future" => handle_future(method_name, args),
|
||||
"env.mirbuilder" => handle_mirbuilder(method_name, args),
|
||||
"env.codegen" => handle_codegen(method_name, args),
|
||||
_ => Err(BidError::PluginError),
|
||||
}
|
||||
}
|
||||
@ -187,6 +189,39 @@ fn handle_future(method_name: &str, args: &[Box<dyn NyashBox>]) -> BidResult<Opt
|
||||
}
|
||||
}
|
||||
|
||||
/// Handle env.mirbuilder.* methods (Program(JSON v0) → MIR(JSON v0))
|
||||
fn handle_mirbuilder(method_name: &str, args: &[Box<dyn NyashBox>]) -> BidResult<Option<Box<dyn NyashBox>>> {
|
||||
match method_name {
|
||||
"emit" => {
|
||||
let program_json = args.get(0).map(|b| b.to_string_box().value).unwrap_or_default();
|
||||
match crate::host_providers::mir_builder::program_json_to_mir_json(&program_json) {
|
||||
Ok(s) => Ok(Some(Box::new(StringBox::new(&s)) as Box<dyn NyashBox>)),
|
||||
Err(_e) => Ok(None),
|
||||
}
|
||||
}
|
||||
_ => Err(BidError::PluginError),
|
||||
}
|
||||
}
|
||||
|
||||
/// Handle env.codegen.* methods (MIR(JSON v0) → object via ny-llvmc)
|
||||
fn handle_codegen(method_name: &str, args: &[Box<dyn NyashBox>]) -> BidResult<Option<Box<dyn NyashBox>>> {
|
||||
match method_name {
|
||||
"emit_object" => {
|
||||
let mir_json = args.get(0).map(|b| b.to_string_box().value).unwrap_or_default();
|
||||
// Collect minimal options from env (optional)
|
||||
let opt_level = std::env::var("HAKO_LLVM_OPT_LEVEL").ok().or_else(|| std::env::var("NYASH_LLVM_OPT_LEVEL").ok());
|
||||
let out = None;
|
||||
let nyrt = std::env::var("NYASH_EMIT_EXE_NYRT").ok().map(std::path::PathBuf::from);
|
||||
let opts = crate::host_providers::llvm_codegen::Opts { out, nyrt, opt_level, timeout_ms: None };
|
||||
match crate::host_providers::llvm_codegen::mir_json_to_object(&mir_json, opts) {
|
||||
Ok(p) => Ok(Some(Box::new(StringBox::new(&p.to_string_lossy())) as Box<dyn NyashBox>)),
|
||||
Err(_e) => Ok(None),
|
||||
}
|
||||
}
|
||||
_ => Err(BidError::PluginError),
|
||||
}
|
||||
}
|
||||
|
||||
/// Handle env.future.await method
|
||||
fn handle_future_await(args: &[Box<dyn NyashBox>]) -> BidResult<Option<Box<dyn NyashBox>>> {
|
||||
if let Some(arg) = args.get(0) {
|
||||
|
||||
Reference in New Issue
Block a user