Add example and refine local inlining
Add a new example file `examples/def_local_inlining.myc` to demonstrate and test local inlining. Refine the optimizer to handle local inlining more robustly by: - Passing a `SubstitutionMap` to `visit_node` to track local variable substitutions. - Enabling constant propagation for local variables by checking `sub.locals` in `BoundKind::Get`. - Updating `BoundKind::DefLocal` and `BoundKind::Set` to maintain the substitution map for local variables. - Adjusting `try_beta_reduce` to use the optimizer's `visit_node` with the substitution map for inlining. - Re-indexing upvalues correctly when inlining captured variables into lambdas.
This commit is contained in:
+12
-1
@@ -3,7 +3,9 @@ use crate::ast::nodes::Node;
|
||||
use crate::ast::compiler::bound_nodes::{BoundKind, TypedNode};
|
||||
use crate::ast::types::StaticType;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
use std::fmt::Debug;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct RuntimeMetadata {
|
||||
pub ty: StaticType,
|
||||
pub is_tail: bool,
|
||||
@@ -11,6 +13,15 @@ pub struct RuntimeMetadata {
|
||||
pub original: Rc<TypedNode>,
|
||||
}
|
||||
|
||||
impl Debug for RuntimeMetadata {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.debug_struct("Metadata")
|
||||
.field("ty", &self.ty)
|
||||
.field("is_tail", &self.is_tail)
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
/// The ExecNode is the AST used by the VM. It carries TCO flags and links to source.
|
||||
pub type ExecNode = Node<BoundKind<RuntimeMetadata>, RuntimeMetadata>;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user