Add length-intrinsic
This commit is contained in:
parent
f700c577f1
commit
baa7bafafc
@ -1,5 +1,11 @@
|
||||
import std::String;
|
||||
import std::print;
|
||||
|
||||
fn main() -> u8 {
|
||||
// let message = String::from(include_bytes!("./macro_easy_file.txt"));
|
||||
// - TODO make a type of global identifier for globls?
|
||||
// - TODO figure out if it is possible to map the path to the path of the
|
||||
// module and not the PWD.
|
||||
let bytes = test_macro!("./examples/macro_easy_file.txt");
|
||||
return bytes[0];
|
||||
print(String::new() + bytes.length());
|
||||
return *bytes[0];
|
||||
}
|
||||
|
@ -58,6 +58,28 @@ pub fn form_intrinsics() -> Vec<FunctionDefinition> {
|
||||
}
|
||||
|
||||
pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDefinition> {
|
||||
if let TypeKind::Array(_, len) = ty {
|
||||
match name {
|
||||
"length" => {
|
||||
return Some(FunctionDefinition {
|
||||
name: "length".to_owned(),
|
||||
linkage_name: None,
|
||||
is_pub: true,
|
||||
is_imported: false,
|
||||
return_type: TypeKind::U64,
|
||||
parameters: vec![FunctionParam {
|
||||
name: String::from("self"),
|
||||
ty: TypeKind::Borrow(Box::new(ty.clone()), false),
|
||||
meta: Default::default(),
|
||||
}],
|
||||
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicConst(*len))),
|
||||
source: None,
|
||||
})
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
match name {
|
||||
"sizeof" => Some(FunctionDefinition {
|
||||
name: "sizeof".to_owned(),
|
||||
@ -408,6 +430,14 @@ impl IntrinsicFunction for IntrinsicNullPtr {
|
||||
))
|
||||
}
|
||||
}
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct IntrinsicConst(u64);
|
||||
impl IntrinsicFunction for IntrinsicConst {
|
||||
fn codegen<'ctx, 'a>(&self, scope: &mut Scope<'ctx, 'a>, _: &[StackValue]) -> Result<StackValue, ErrorKind> {
|
||||
let zero = scope.block.build(Instr::Constant(ConstValueKind::U64(self.0))).unwrap();
|
||||
Ok(StackValue(StackValueKind::Literal(zero), TypeKind::U64))
|
||||
}
|
||||
}
|
||||
|
||||
// impl IntrinsicFunction for IntrinsicIAdd {
|
||||
// fn codegen<'ctx, 'a>(
|
||||
|
@ -1360,7 +1360,7 @@ impl mir::Expression {
|
||||
let global_value = scope.globals.get(global_name).unwrap();
|
||||
let a = Some(StackValue(
|
||||
StackValueKind::Literal(scope.block.build(Instr::GetGlobal(global_value.clone())).unwrap()),
|
||||
TypeKind::UserPtr(Box::new(ty.clone())),
|
||||
ty.clone(),
|
||||
));
|
||||
a
|
||||
}
|
||||
|
@ -429,7 +429,7 @@ impl Expression {
|
||||
Err(_) => Ok((ReturnKind::Soft, type_kind.clone())),
|
||||
},
|
||||
AssociatedFunctionCall(_, fcall) => fcall.return_type(),
|
||||
GlobalRef(_, type_kind) => Ok((ReturnKind::Soft, TypeKind::UserPtr(Box::new(type_kind.clone())))),
|
||||
GlobalRef(_, type_kind) => Ok((ReturnKind::Soft, type_kind.clone())),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -222,7 +222,10 @@ impl MacroFunction for TestMacro {
|
||||
|
||||
Ok((
|
||||
vec![global.clone()],
|
||||
mir::ExprKind::GlobalRef(global_name, TypeKind::U8),
|
||||
mir::ExprKind::GlobalRef(
|
||||
global_name,
|
||||
TypeKind::Borrow(Box::new(TypeKind::Array(Box::new(TypeKind::U8), len as u64)), false),
|
||||
),
|
||||
))
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user