Add AST->MIR for borrow/deref
This commit is contained in:
parent
93b4de9230
commit
26818cec96
@ -225,8 +225,16 @@ impl ast::Expression {
|
||||
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||
name.clone(),
|
||||
),
|
||||
ast::ExpressionKind::Borrow(_) => todo!(),
|
||||
ast::ExpressionKind::Deref(_) => todo!(),
|
||||
ast::ExpressionKind::Borrow(name) => mir::ExprKind::Borrow(NamedVariableRef(
|
||||
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||
name.clone(),
|
||||
self.1.as_meta(module_id),
|
||||
)),
|
||||
ast::ExpressionKind::Deref(name) => mir::ExprKind::Deref(NamedVariableRef(
|
||||
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||
name.clone(),
|
||||
self.1.as_meta(module_id),
|
||||
)),
|
||||
};
|
||||
|
||||
mir::Expression(kind, self.1.as_meta(module_id))
|
||||
|
@ -935,6 +935,8 @@ impl mir::Expression {
|
||||
TypeKind::CustomType(name.clone()),
|
||||
))
|
||||
}
|
||||
mir::ExprKind::Borrow(named_variable_ref) => todo!(),
|
||||
mir::ExprKind::Deref(named_variable_ref) => todo!(),
|
||||
};
|
||||
if let Some(value) = &value {
|
||||
value.instr().maybe_location(&mut scope.block, location);
|
||||
@ -1111,6 +1113,9 @@ impl TypeKind {
|
||||
TypeKind::Ptr(type_kind) => {
|
||||
Type::Ptr(Box::new(type_kind.get_type(type_vals, typedefs)))
|
||||
}
|
||||
TypeKind::Borrow(type_kind) => {
|
||||
Type::Ptr(Box::new(type_kind.get_type(type_vals, typedefs)))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -208,6 +208,8 @@ impl Display for ExprKind {
|
||||
write_access(f, name)?;
|
||||
write!(f, "<{}>", type_kind)
|
||||
}
|
||||
ExprKind::Borrow(var_ref) => write!(f, "&{}", var_ref),
|
||||
ExprKind::Deref(var_ref) => write!(f, "*{}", var_ref),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,7 @@ pub enum ReturnTypeOther {
|
||||
EmptyBlock(Metadata),
|
||||
NoBlockReturn(Metadata),
|
||||
IndexingNonArray(Metadata),
|
||||
DerefNonBorrow(Metadata),
|
||||
}
|
||||
|
||||
impl TypeKind {
|
||||
@ -47,8 +48,9 @@ impl TypeKind {
|
||||
TypeKind::StringPtr => 32,
|
||||
TypeKind::Array(type_kind, len) => type_kind.size_of() * len,
|
||||
TypeKind::CustomType(_) => 32,
|
||||
TypeKind::Ptr(inner) => 64,
|
||||
TypeKind::Ptr(_) => 64,
|
||||
TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"),
|
||||
TypeKind::Borrow(_) => 64,
|
||||
}
|
||||
}
|
||||
|
||||
@ -69,8 +71,9 @@ impl TypeKind {
|
||||
TypeKind::StringPtr => 32,
|
||||
TypeKind::Array(type_kind, _) => type_kind.alignment(),
|
||||
TypeKind::CustomType(_) => 32,
|
||||
TypeKind::Ptr(type_kind) => 64,
|
||||
TypeKind::Ptr(_) => 64,
|
||||
TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"),
|
||||
TypeKind::Borrow(_) => 64,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -222,6 +225,17 @@ impl Expression {
|
||||
}
|
||||
Accessed(_, type_kind, _) => Ok((ReturnKind::Soft, type_kind.clone())),
|
||||
Struct(name, _) => Ok((ReturnKind::Soft, TypeKind::CustomType(name.clone()))),
|
||||
Borrow(var) => {
|
||||
let ret_type = var.return_type()?;
|
||||
Ok((ret_type.0, TypeKind::Borrow(Box::new(ret_type.1))))
|
||||
}
|
||||
Deref(var) => {
|
||||
let ret_type = var.return_type()?;
|
||||
match ret_type {
|
||||
(_, TypeKind::Borrow(type_kind)) => Ok((ret_type.0, *type_kind)),
|
||||
_ => Err(ReturnTypeOther::DerefNonBorrow(var.2)),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -230,13 +244,15 @@ impl Expression {
|
||||
ExprKind::Variable(var_ref) => Some(var_ref),
|
||||
ExprKind::Indexed(lhs, _, _) => lhs.backing_var(),
|
||||
ExprKind::Accessed(lhs, _, _) => lhs.backing_var(),
|
||||
ExprKind::Borrow(var) => Some(var),
|
||||
ExprKind::Deref(var) => Some(var),
|
||||
ExprKind::Block(block) => block.backing_var(),
|
||||
ExprKind::Array(_) => None,
|
||||
ExprKind::Struct(_, _) => None,
|
||||
ExprKind::Literal(_) => None,
|
||||
ExprKind::BinOp(_, _, _) => None,
|
||||
ExprKind::FunctionCall(_) => None,
|
||||
ExprKind::If(_) => None,
|
||||
ExprKind::Block(block) => block.backing_var(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -110,6 +110,8 @@ pub enum TypeKind {
|
||||
#[error("{0}")]
|
||||
CustomType(String),
|
||||
#[error("Ptr({0})")]
|
||||
Borrow(Box<TypeKind>),
|
||||
#[error("Ptr({0})")]
|
||||
Ptr(Box<TypeKind>),
|
||||
#[error(transparent)]
|
||||
Vague(#[from] VagueType),
|
||||
@ -245,6 +247,8 @@ pub enum ExprKind {
|
||||
FunctionCall(FunctionCall),
|
||||
If(IfExpression),
|
||||
Block(Block),
|
||||
Borrow(NamedVariableRef),
|
||||
Deref(NamedVariableRef),
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
@ -627,6 +627,8 @@ impl Expression {
|
||||
}
|
||||
Ok(TypeKind::CustomType(struct_name.clone()))
|
||||
}
|
||||
ExprKind::Borrow(named_variable_ref) => todo!(),
|
||||
ExprKind::Deref(named_variable_ref) => todo!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -364,6 +364,8 @@ impl Expression {
|
||||
.from_type(&TypeKind::CustomType(struct_name.clone()))
|
||||
.unwrap())
|
||||
}
|
||||
ExprKind::Borrow(named_variable_ref) => todo!(),
|
||||
ExprKind::Deref(named_variable_ref) => todo!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user