Basically revert everything, create macro-pass
This commit is contained in:
parent
80bdf4eba8
commit
67a5fcd002
@ -61,7 +61,6 @@ impl mir::FunctionDefinitionKind {
|
|||||||
}
|
}
|
||||||
mir::FunctionDefinitionKind::Extern(_) => {}
|
mir::FunctionDefinitionKind::Extern(_) => {}
|
||||||
mir::FunctionDefinitionKind::Intrinsic(_) => {}
|
mir::FunctionDefinitionKind::Intrinsic(_) => {}
|
||||||
mir::FunctionDefinitionKind::Macro(_) => {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Allocator { allocations: allocated }
|
Allocator { allocations: allocated }
|
||||||
|
@ -310,7 +310,11 @@ pub trait IntrinsicFunction: std::fmt::Debug {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub trait MacroFunction: std::fmt::Debug {
|
pub trait MacroFunction: std::fmt::Debug {
|
||||||
fn codegen<'ctx, 'a>(&self, scope: &mut Scope<'ctx, 'a>, params: &[mir::Literal]) -> Result<StackValue, ErrorKind>;
|
fn generate<'ctx, 'a>(
|
||||||
|
&self,
|
||||||
|
scope: &mut Scope<'ctx, 'a>,
|
||||||
|
params: &[mir::Literal],
|
||||||
|
) -> Result<mir::Expression, ErrorKind>;
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! intrinsic_debug {
|
macro_rules! intrinsic_debug {
|
||||||
|
@ -237,7 +237,6 @@ impl mir::Module {
|
|||||||
},
|
},
|
||||||
)),
|
)),
|
||||||
mir::FunctionDefinitionKind::Intrinsic(_) => None,
|
mir::FunctionDefinitionKind::Intrinsic(_) => None,
|
||||||
mir::FunctionDefinitionKind::Macro(_) => None,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(func) = func {
|
if let Some(func) = func {
|
||||||
@ -290,7 +289,6 @@ impl mir::Module {
|
|||||||
},
|
},
|
||||||
)),
|
)),
|
||||||
mir::FunctionDefinitionKind::Intrinsic(_) => None,
|
mir::FunctionDefinitionKind::Intrinsic(_) => None,
|
||||||
mir::FunctionDefinitionKind::Macro(_) => None,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(func) = func {
|
if let Some(func) = func {
|
||||||
@ -377,7 +375,6 @@ impl mir::Module {
|
|||||||
}
|
}
|
||||||
FunctionDefinitionKind::Extern(_) => None,
|
FunctionDefinitionKind::Extern(_) => None,
|
||||||
FunctionDefinitionKind::Intrinsic(_) => None,
|
FunctionDefinitionKind::Intrinsic(_) => None,
|
||||||
FunctionDefinitionKind::Macro(_) => None,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@ -398,7 +395,6 @@ impl mir::Module {
|
|||||||
FunctionDefinitionKind::Intrinsic(intrinsic_function) => {
|
FunctionDefinitionKind::Intrinsic(intrinsic_function) => {
|
||||||
ScopeFunctionKind::Intrinsic(intrinsic_function)
|
ScopeFunctionKind::Intrinsic(intrinsic_function)
|
||||||
}
|
}
|
||||||
FunctionDefinitionKind::Macro(macro_function) => ScopeFunctionKind::Macro(macro_function),
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@ -455,7 +451,6 @@ impl mir::Module {
|
|||||||
}
|
}
|
||||||
FunctionDefinitionKind::Extern(_) => None,
|
FunctionDefinitionKind::Extern(_) => None,
|
||||||
FunctionDefinitionKind::Intrinsic(_) => None,
|
FunctionDefinitionKind::Intrinsic(_) => None,
|
||||||
FunctionDefinitionKind::Macro(macro_function) => None,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@ -516,7 +511,6 @@ impl mir::Module {
|
|||||||
}
|
}
|
||||||
FunctionDefinitionKind::Extern(_) => None,
|
FunctionDefinitionKind::Extern(_) => None,
|
||||||
FunctionDefinitionKind::Intrinsic(_) => None,
|
FunctionDefinitionKind::Intrinsic(_) => None,
|
||||||
FunctionDefinitionKind::Macro(_) => None,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@ -623,7 +617,6 @@ impl FunctionDefinitionKind {
|
|||||||
}
|
}
|
||||||
mir::FunctionDefinitionKind::Extern(_) => {}
|
mir::FunctionDefinitionKind::Extern(_) => {}
|
||||||
mir::FunctionDefinitionKind::Intrinsic(_) => {}
|
mir::FunctionDefinitionKind::Intrinsic(_) => {}
|
||||||
FunctionDefinitionKind::Macro(_) => {}
|
|
||||||
};
|
};
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -1387,14 +1380,7 @@ fn codegen_function_call<'ctx, 'a>(
|
|||||||
.or(intrinsic.as_ref())
|
.or(intrinsic.as_ref())
|
||||||
.expect(&format!("Function {} does not exist!", call_name));
|
.expect(&format!("Function {} does not exist!", call_name));
|
||||||
callee
|
callee
|
||||||
.codegen(
|
.codegen(&call_name, params.as_slice(), &call.return_type, location, scope)
|
||||||
&call_name,
|
|
||||||
params.as_slice(),
|
|
||||||
&call.parameters,
|
|
||||||
&call.return_type,
|
|
||||||
location,
|
|
||||||
scope,
|
|
||||||
)
|
|
||||||
.unwrap()
|
.unwrap()
|
||||||
} else {
|
} else {
|
||||||
let callee = scope
|
let callee = scope
|
||||||
@ -1403,14 +1389,7 @@ fn codegen_function_call<'ctx, 'a>(
|
|||||||
.expect(&format!("Function {} does not exist!", call_name));
|
.expect(&format!("Function {} does not exist!", call_name));
|
||||||
|
|
||||||
callee
|
callee
|
||||||
.codegen(
|
.codegen(&call_name, params.as_slice(), &call.return_type, location, scope)
|
||||||
&call_name,
|
|
||||||
params.as_slice(),
|
|
||||||
&call.parameters,
|
|
||||||
&call.return_type,
|
|
||||||
location,
|
|
||||||
scope,
|
|
||||||
)
|
|
||||||
.unwrap()
|
.unwrap()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -140,7 +140,6 @@ pub enum ScopeFunctionKind<'ctx> {
|
|||||||
UserGenerated(Function<'ctx>),
|
UserGenerated(Function<'ctx>),
|
||||||
Intrinsic(&'ctx Box<dyn IntrinsicFunction>),
|
Intrinsic(&'ctx Box<dyn IntrinsicFunction>),
|
||||||
IntrinsicOwned(Box<dyn IntrinsicFunction>),
|
IntrinsicOwned(Box<dyn IntrinsicFunction>),
|
||||||
Macro(&'ctx Box<dyn MacroFunction>),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ctx> StackBinopDefinition<'ctx> {
|
impl<'ctx> StackBinopDefinition<'ctx> {
|
||||||
@ -159,7 +158,7 @@ impl<'ctx> StackBinopDefinition<'ctx> {
|
|||||||
"binop.{}.{}.{}.call",
|
"binop.{}.{}.{}.call",
|
||||||
self.parameters.0.ty, self.parameters.1.ty, self.return_ty
|
self.parameters.0.ty, self.parameters.1.ty, self.return_ty
|
||||||
);
|
);
|
||||||
self.kind.codegen(&name, &[lhs, rhs], &[], &self.return_ty, None, scope)
|
self.kind.codegen(&name, &[lhs, rhs], &self.return_ty, None, scope)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,7 +167,6 @@ impl<'ctx> ScopeFunctionKind<'ctx> {
|
|||||||
&self,
|
&self,
|
||||||
name: &str,
|
name: &str,
|
||||||
params: &[StackValue],
|
params: &[StackValue],
|
||||||
param_exprs: &[mir::Expression],
|
|
||||||
return_ty: &TypeKind,
|
return_ty: &TypeKind,
|
||||||
location: Option<DebugLocation>,
|
location: Option<DebugLocation>,
|
||||||
scope: &mut Scope<'ctx, 'a>,
|
scope: &mut Scope<'ctx, 'a>,
|
||||||
@ -193,16 +191,6 @@ impl<'ctx> ScopeFunctionKind<'ctx> {
|
|||||||
}
|
}
|
||||||
ScopeFunctionKind::Intrinsic(fun) => fun.codegen(scope, params),
|
ScopeFunctionKind::Intrinsic(fun) => fun.codegen(scope, params),
|
||||||
ScopeFunctionKind::IntrinsicOwned(fun) => fun.codegen(scope, params),
|
ScopeFunctionKind::IntrinsicOwned(fun) => fun.codegen(scope, params),
|
||||||
ScopeFunctionKind::Macro(fun) => fun.codegen(
|
|
||||||
scope,
|
|
||||||
¶m_exprs
|
|
||||||
.iter()
|
|
||||||
.map(|e| match &e.0 {
|
|
||||||
crate::mir::ExprKind::Literal(lit) => lit.clone(),
|
|
||||||
_ => panic!(),
|
|
||||||
})
|
|
||||||
.collect::<Vec<_>>(),
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,6 @@ impl Display for FunctionDefinitionKind {
|
|||||||
FunctionDefinitionKind::Extern(true) => write!(f, "<Imported Extern>"),
|
FunctionDefinitionKind::Extern(true) => write!(f, "<Imported Extern>"),
|
||||||
FunctionDefinitionKind::Extern(false) => write!(f, "<Linked Extern>"),
|
FunctionDefinitionKind::Extern(false) => write!(f, "<Linked Extern>"),
|
||||||
FunctionDefinitionKind::Intrinsic(_) => write!(f, "<Intrinsic>"),
|
FunctionDefinitionKind::Intrinsic(_) => write!(f, "<Intrinsic>"),
|
||||||
FunctionDefinitionKind::Macro(_) => write!(f, "<Macro>"),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -615,7 +615,6 @@ impl FunctionDefinition {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
FunctionDefinitionKind::Intrinsic(_) => Err(EqualsIssue::ExistsAsIntrinsic),
|
FunctionDefinitionKind::Intrinsic(_) => Err(EqualsIssue::ExistsAsIntrinsic),
|
||||||
FunctionDefinitionKind::Macro(_) => Err(EqualsIssue::ExistsAsIntrinsic),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -269,7 +269,6 @@ impl<'map> Pass for LinkerPass<'map> {
|
|||||||
}
|
}
|
||||||
FunctionDefinitionKind::Extern(_) => {}
|
FunctionDefinitionKind::Extern(_) => {}
|
||||||
FunctionDefinitionKind::Intrinsic(_) => {}
|
FunctionDefinitionKind::Intrinsic(_) => {}
|
||||||
FunctionDefinitionKind::Macro(_) => {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
28
reid/src/mir/macros.rs
Normal file
28
reid/src/mir/macros.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use crate::codegen::intrinsics::MacroFunction;
|
||||||
|
|
||||||
|
use super::pass::{Pass, PassResult, PassState};
|
||||||
|
|
||||||
|
#[derive(thiserror::Error, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub enum ErrorKind {
|
||||||
|
#[error("Should never be encountered!")]
|
||||||
|
Null,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Struct used to implement a type-checking pass that can be performed on the
|
||||||
|
/// MIR.
|
||||||
|
pub struct MacroPass {
|
||||||
|
macros: HashMap<String, Box<dyn MacroFunction>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
type LinkerPassState<'st, 'sc> = PassState<'st, 'sc, (), ErrorKind>;
|
||||||
|
|
||||||
|
impl Pass for MacroPass {
|
||||||
|
type Data = ();
|
||||||
|
type TError = ErrorKind;
|
||||||
|
|
||||||
|
fn expr(&mut self, expr: &mut super::Expression, state: PassState<Self::Data, Self::TError>) -> PassResult {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
@ -13,6 +13,7 @@ use crate::{
|
|||||||
mod fmt;
|
mod fmt;
|
||||||
pub mod implement;
|
pub mod implement;
|
||||||
pub mod linker;
|
pub mod linker;
|
||||||
|
pub mod macros;
|
||||||
pub mod pass;
|
pub mod pass;
|
||||||
pub mod typecheck;
|
pub mod typecheck;
|
||||||
|
|
||||||
@ -322,8 +323,6 @@ pub enum FunctionDefinitionKind {
|
|||||||
Extern(bool),
|
Extern(bool),
|
||||||
/// Intrinsic definition, defined within the compiler
|
/// Intrinsic definition, defined within the compiler
|
||||||
Intrinsic(Box<dyn IntrinsicFunction>),
|
Intrinsic(Box<dyn IntrinsicFunction>),
|
||||||
/// Macro function, executed entirely on the compiler
|
|
||||||
Macro(Box<dyn MacroFunction>),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FunctionDefinition {
|
impl FunctionDefinition {
|
||||||
@ -332,7 +331,6 @@ impl FunctionDefinition {
|
|||||||
FunctionDefinitionKind::Local(block, _) => block.meta.clone(),
|
FunctionDefinitionKind::Local(block, _) => block.meta.clone(),
|
||||||
FunctionDefinitionKind::Extern(_) => Metadata::default(),
|
FunctionDefinitionKind::Extern(_) => Metadata::default(),
|
||||||
FunctionDefinitionKind::Intrinsic(_) => Metadata::default(),
|
FunctionDefinitionKind::Intrinsic(_) => Metadata::default(),
|
||||||
FunctionDefinitionKind::Macro(_) => Metadata::default(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,7 +339,6 @@ impl FunctionDefinition {
|
|||||||
FunctionDefinitionKind::Local(_, metadata) => metadata.clone(),
|
FunctionDefinitionKind::Local(_, metadata) => metadata.clone(),
|
||||||
FunctionDefinitionKind::Extern(_) => Metadata::default(),
|
FunctionDefinitionKind::Extern(_) => Metadata::default(),
|
||||||
FunctionDefinitionKind::Intrinsic(_) => Metadata::default(),
|
FunctionDefinitionKind::Intrinsic(_) => Metadata::default(),
|
||||||
FunctionDefinitionKind::Macro(_) => Metadata::default(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -406,7 +403,6 @@ impl BinopDefinition {
|
|||||||
FunctionDefinitionKind::Local(block, _) => Some(block.meta),
|
FunctionDefinitionKind::Local(block, _) => Some(block.meta),
|
||||||
FunctionDefinitionKind::Extern(_) => None,
|
FunctionDefinitionKind::Extern(_) => None,
|
||||||
FunctionDefinitionKind::Intrinsic(_) => None,
|
FunctionDefinitionKind::Intrinsic(_) => None,
|
||||||
FunctionDefinitionKind::Macro(_) => None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,7 +188,6 @@ impl<Data: Clone + Default> Scope<Data> {
|
|||||||
ScopeFunction {
|
ScopeFunction {
|
||||||
ret: func.return_type,
|
ret: func.return_type,
|
||||||
params: func.parameters.iter().map(|p| p.ty.clone()).collect(),
|
params: func.parameters.iter().map(|p| p.ty.clone()).collect(),
|
||||||
is_macro: matches!(func.kind, FunctionDefinitionKind::Macro(_)),
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@ -203,7 +202,6 @@ impl<Data: Clone + Default> Scope<Data> {
|
|||||||
pub struct ScopeFunction {
|
pub struct ScopeFunction {
|
||||||
pub ret: TypeKind,
|
pub ret: TypeKind,
|
||||||
pub params: Vec<TypeKind>,
|
pub params: Vec<TypeKind>,
|
||||||
pub is_macro: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
@ -429,7 +427,6 @@ impl Module {
|
|||||||
ScopeFunction {
|
ScopeFunction {
|
||||||
ret: function.return_type.clone(),
|
ret: function.return_type.clone(),
|
||||||
params: function.parameters.iter().cloned().map(|v| v.ty).collect(),
|
params: function.parameters.iter().cloned().map(|v| v.ty).collect(),
|
||||||
is_macro: matches!(function.kind, FunctionDefinitionKind::Macro(_)),
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.ok();
|
.ok();
|
||||||
@ -443,7 +440,6 @@ impl Module {
|
|||||||
ScopeFunction {
|
ScopeFunction {
|
||||||
ret: function.return_type.clone(),
|
ret: function.return_type.clone(),
|
||||||
params: function.parameters.iter().cloned().map(|v| v.ty).collect(),
|
params: function.parameters.iter().cloned().map(|v| v.ty).collect(),
|
||||||
is_macro: matches!(function.kind, FunctionDefinitionKind::Macro(_)),
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.ok();
|
.ok();
|
||||||
@ -488,7 +484,6 @@ impl FunctionDefinition {
|
|||||||
}
|
}
|
||||||
FunctionDefinitionKind::Extern(_) => {}
|
FunctionDefinitionKind::Extern(_) => {}
|
||||||
FunctionDefinitionKind::Intrinsic(..) => {}
|
FunctionDefinitionKind::Intrinsic(..) => {}
|
||||||
FunctionDefinitionKind::Macro(_) => {}
|
|
||||||
};
|
};
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,6 @@ impl FunctionDefinitionKind {
|
|||||||
}
|
}
|
||||||
FunctionDefinitionKind::Extern(_) => Ok((ReturnKind::Soft, TypeKind::Vague(Vague::Unknown))),
|
FunctionDefinitionKind::Extern(_) => Ok((ReturnKind::Soft, TypeKind::Vague(Vague::Unknown))),
|
||||||
FunctionDefinitionKind::Intrinsic(intrinsic) => Ok((ReturnKind::Soft, TypeKind::Vague(Vague::Unknown))),
|
FunctionDefinitionKind::Intrinsic(intrinsic) => Ok((ReturnKind::Soft, TypeKind::Vague(Vague::Unknown))),
|
||||||
FunctionDefinitionKind::Macro(_) => Ok((ReturnKind::Soft, TypeKind::Vague(Vague::Unknown))),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -472,16 +471,6 @@ impl Expression {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if f.is_macro {
|
|
||||||
for param in &function_call.parameters {
|
|
||||||
match ¶m.0 {
|
|
||||||
ExprKind::Literal(_) => {}
|
|
||||||
_ => return Err(ErrorKind::Null),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Ok(function_call.return_type.clone());
|
|
||||||
}
|
|
||||||
|
|
||||||
let true_params_iter = f
|
let true_params_iter = f
|
||||||
.params
|
.params
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -56,7 +56,6 @@ impl<'t> Pass for TypeInference<'t> {
|
|||||||
FunctionDefinitionKind::Local(..) => ErrorTypedefKind::Local,
|
FunctionDefinitionKind::Local(..) => ErrorTypedefKind::Local,
|
||||||
FunctionDefinitionKind::Extern(..) => ErrorTypedefKind::Extern,
|
FunctionDefinitionKind::Extern(..) => ErrorTypedefKind::Extern,
|
||||||
FunctionDefinitionKind::Intrinsic(..) => ErrorTypedefKind::Intrinsic,
|
FunctionDefinitionKind::Intrinsic(..) => ErrorTypedefKind::Intrinsic,
|
||||||
FunctionDefinitionKind::Macro(..) => ErrorTypedefKind::Intrinsic,
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -80,7 +79,6 @@ impl<'t> Pass for TypeInference<'t> {
|
|||||||
FunctionDefinitionKind::Local(..) => ErrorTypedefKind::Local,
|
FunctionDefinitionKind::Local(..) => ErrorTypedefKind::Local,
|
||||||
FunctionDefinitionKind::Extern(..) => ErrorTypedefKind::Extern,
|
FunctionDefinitionKind::Extern(..) => ErrorTypedefKind::Extern,
|
||||||
FunctionDefinitionKind::Intrinsic(..) => ErrorTypedefKind::Intrinsic,
|
FunctionDefinitionKind::Intrinsic(..) => ErrorTypedefKind::Intrinsic,
|
||||||
FunctionDefinitionKind::Macro(..) => ErrorTypedefKind::Intrinsic,
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -193,7 +191,6 @@ impl FunctionDefinition {
|
|||||||
}
|
}
|
||||||
FunctionDefinitionKind::Extern(_) => {}
|
FunctionDefinitionKind::Extern(_) => {}
|
||||||
FunctionDefinitionKind::Intrinsic(_) => {}
|
FunctionDefinitionKind::Intrinsic(_) => {}
|
||||||
FunctionDefinitionKind::Macro(_) => {}
|
|
||||||
};
|
};
|
||||||
let return_ty = self
|
let return_ty = self
|
||||||
.kind
|
.kind
|
||||||
@ -226,7 +223,6 @@ impl FunctionDefinitionKind {
|
|||||||
}
|
}
|
||||||
FunctionDefinitionKind::Extern(_) => None,
|
FunctionDefinitionKind::Extern(_) => None,
|
||||||
FunctionDefinitionKind::Intrinsic(_) => None,
|
FunctionDefinitionKind::Intrinsic(_) => None,
|
||||||
FunctionDefinitionKind::Macro(_) => todo!(),
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user