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 {
|
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");
|
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> {
|
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 {
|
match name {
|
||||||
"sizeof" => Some(FunctionDefinition {
|
"sizeof" => Some(FunctionDefinition {
|
||||||
name: "sizeof".to_owned(),
|
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 {
|
// impl IntrinsicFunction for IntrinsicIAdd {
|
||||||
// fn codegen<'ctx, 'a>(
|
// fn codegen<'ctx, 'a>(
|
||||||
|
@ -1360,7 +1360,7 @@ impl mir::Expression {
|
|||||||
let global_value = scope.globals.get(global_name).unwrap();
|
let global_value = scope.globals.get(global_name).unwrap();
|
||||||
let a = Some(StackValue(
|
let a = Some(StackValue(
|
||||||
StackValueKind::Literal(scope.block.build(Instr::GetGlobal(global_value.clone())).unwrap()),
|
StackValueKind::Literal(scope.block.build(Instr::GetGlobal(global_value.clone())).unwrap()),
|
||||||
TypeKind::UserPtr(Box::new(ty.clone())),
|
ty.clone(),
|
||||||
));
|
));
|
||||||
a
|
a
|
||||||
}
|
}
|
||||||
|
@ -429,7 +429,7 @@ impl Expression {
|
|||||||
Err(_) => Ok((ReturnKind::Soft, type_kind.clone())),
|
Err(_) => Ok((ReturnKind::Soft, type_kind.clone())),
|
||||||
},
|
},
|
||||||
AssociatedFunctionCall(_, fcall) => fcall.return_type(),
|
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((
|
Ok((
|
||||||
vec![global.clone()],
|
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