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),
|
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||||
name.clone(),
|
name.clone(),
|
||||||
),
|
),
|
||||||
ast::ExpressionKind::Borrow(_) => todo!(),
|
ast::ExpressionKind::Borrow(name) => mir::ExprKind::Borrow(NamedVariableRef(
|
||||||
ast::ExpressionKind::Deref(_) => todo!(),
|
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))
|
mir::Expression(kind, self.1.as_meta(module_id))
|
||||||
|
@ -935,6 +935,8 @@ impl mir::Expression {
|
|||||||
TypeKind::CustomType(name.clone()),
|
TypeKind::CustomType(name.clone()),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
mir::ExprKind::Borrow(named_variable_ref) => todo!(),
|
||||||
|
mir::ExprKind::Deref(named_variable_ref) => todo!(),
|
||||||
};
|
};
|
||||||
if let Some(value) = &value {
|
if let Some(value) = &value {
|
||||||
value.instr().maybe_location(&mut scope.block, location);
|
value.instr().maybe_location(&mut scope.block, location);
|
||||||
@ -1111,6 +1113,9 @@ impl TypeKind {
|
|||||||
TypeKind::Ptr(type_kind) => {
|
TypeKind::Ptr(type_kind) => {
|
||||||
Type::Ptr(Box::new(type_kind.get_type(type_vals, typedefs)))
|
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_access(f, name)?;
|
||||||
write!(f, "<{}>", type_kind)
|
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),
|
EmptyBlock(Metadata),
|
||||||
NoBlockReturn(Metadata),
|
NoBlockReturn(Metadata),
|
||||||
IndexingNonArray(Metadata),
|
IndexingNonArray(Metadata),
|
||||||
|
DerefNonBorrow(Metadata),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TypeKind {
|
impl TypeKind {
|
||||||
@ -47,8 +48,9 @@ impl TypeKind {
|
|||||||
TypeKind::StringPtr => 32,
|
TypeKind::StringPtr => 32,
|
||||||
TypeKind::Array(type_kind, len) => type_kind.size_of() * len,
|
TypeKind::Array(type_kind, len) => type_kind.size_of() * len,
|
||||||
TypeKind::CustomType(_) => 32,
|
TypeKind::CustomType(_) => 32,
|
||||||
TypeKind::Ptr(inner) => 64,
|
TypeKind::Ptr(_) => 64,
|
||||||
TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"),
|
TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"),
|
||||||
|
TypeKind::Borrow(_) => 64,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,8 +71,9 @@ impl TypeKind {
|
|||||||
TypeKind::StringPtr => 32,
|
TypeKind::StringPtr => 32,
|
||||||
TypeKind::Array(type_kind, _) => type_kind.alignment(),
|
TypeKind::Array(type_kind, _) => type_kind.alignment(),
|
||||||
TypeKind::CustomType(_) => 32,
|
TypeKind::CustomType(_) => 32,
|
||||||
TypeKind::Ptr(type_kind) => 64,
|
TypeKind::Ptr(_) => 64,
|
||||||
TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"),
|
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())),
|
Accessed(_, type_kind, _) => Ok((ReturnKind::Soft, type_kind.clone())),
|
||||||
Struct(name, _) => Ok((ReturnKind::Soft, TypeKind::CustomType(name.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::Variable(var_ref) => Some(var_ref),
|
||||||
ExprKind::Indexed(lhs, _, _) => lhs.backing_var(),
|
ExprKind::Indexed(lhs, _, _) => lhs.backing_var(),
|
||||||
ExprKind::Accessed(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::Array(_) => None,
|
||||||
ExprKind::Struct(_, _) => None,
|
ExprKind::Struct(_, _) => None,
|
||||||
ExprKind::Literal(_) => None,
|
ExprKind::Literal(_) => None,
|
||||||
ExprKind::BinOp(_, _, _) => None,
|
ExprKind::BinOp(_, _, _) => None,
|
||||||
ExprKind::FunctionCall(_) => None,
|
ExprKind::FunctionCall(_) => None,
|
||||||
ExprKind::If(_) => None,
|
ExprKind::If(_) => None,
|
||||||
ExprKind::Block(block) => block.backing_var(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,6 +110,8 @@ pub enum TypeKind {
|
|||||||
#[error("{0}")]
|
#[error("{0}")]
|
||||||
CustomType(String),
|
CustomType(String),
|
||||||
#[error("Ptr({0})")]
|
#[error("Ptr({0})")]
|
||||||
|
Borrow(Box<TypeKind>),
|
||||||
|
#[error("Ptr({0})")]
|
||||||
Ptr(Box<TypeKind>),
|
Ptr(Box<TypeKind>),
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
Vague(#[from] VagueType),
|
Vague(#[from] VagueType),
|
||||||
@ -245,6 +247,8 @@ pub enum ExprKind {
|
|||||||
FunctionCall(FunctionCall),
|
FunctionCall(FunctionCall),
|
||||||
If(IfExpression),
|
If(IfExpression),
|
||||||
Block(Block),
|
Block(Block),
|
||||||
|
Borrow(NamedVariableRef),
|
||||||
|
Deref(NamedVariableRef),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -627,6 +627,8 @@ impl Expression {
|
|||||||
}
|
}
|
||||||
Ok(TypeKind::CustomType(struct_name.clone()))
|
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()))
|
.from_type(&TypeKind::CustomType(struct_name.clone()))
|
||||||
.unwrap())
|
.unwrap())
|
||||||
}
|
}
|
||||||
|
ExprKind::Borrow(named_variable_ref) => todo!(),
|
||||||
|
ExprKind::Deref(named_variable_ref) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user