Implement rudamentary borrow
This commit is contained in:
parent
e4ce897f94
commit
965ad5797f
@ -415,8 +415,14 @@ impl mir::Expression {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
mir::ExprKind::Indexed(expression, val_t, idx_expr) => {
|
mir::ExprKind::Indexed(expression, val_t, idx_expr) => {
|
||||||
let array = expression.codegen(scope, state)?;
|
dbg!(&expression, &idx_expr);
|
||||||
let idx = idx_expr.codegen(scope, state)?;
|
let array = expression
|
||||||
|
.codegen(scope, state)
|
||||||
|
.expect("array returned none!");
|
||||||
|
let idx = idx_expr
|
||||||
|
.codegen(scope, state)
|
||||||
|
.expect("index returned none!");
|
||||||
|
|
||||||
let mut ptr = scope
|
let mut ptr = scope
|
||||||
.block
|
.block
|
||||||
.build(Instr::GetElemPtr(array, vec![idx]))
|
.build(Instr::GetElemPtr(array, vec![idx]))
|
||||||
@ -468,14 +474,19 @@ impl mir::Expression {
|
|||||||
Some(array)
|
Some(array)
|
||||||
}
|
}
|
||||||
mir::ExprKind::Accessed(expression, type_kind, field) => {
|
mir::ExprKind::Accessed(expression, type_kind, field) => {
|
||||||
let struct_val = expression.codegen(scope, &mut state.load(true))?;
|
let struct_val = expression.codegen(scope, &mut state.load(true)).unwrap();
|
||||||
|
|
||||||
let struct_ty = expression.return_type().ok()?.1.known().ok()?;
|
let struct_ty = expression
|
||||||
let TypeKind::CustomType(name) = struct_ty else {
|
.return_type()
|
||||||
return None;
|
.map(|r| r.1.known())
|
||||||
|
.unwrap()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let TypeKind::CustomType(name) = struct_ty.deref_borrow() else {
|
||||||
|
panic!("tried accessing non-custom-type");
|
||||||
};
|
};
|
||||||
let TypeDefinitionKind::Struct(struct_ty) = scope.get_typedef(&name)?;
|
let TypeDefinitionKind::Struct(struct_ty) = scope.get_typedef(&name).unwrap();
|
||||||
let idx = struct_ty.find_index(field)?;
|
let idx = struct_ty.find_index(field).unwrap();
|
||||||
|
|
||||||
let mut value = scope
|
let mut value = scope
|
||||||
.block
|
.block
|
||||||
@ -644,6 +655,9 @@ impl TypeKind {
|
|||||||
TypeDefinitionKind::Struct(_) => Type::Ptr(Box::new(custom_t)),
|
TypeDefinitionKind::Struct(_) => Type::Ptr(Box::new(custom_t)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TypeKind::Borrow(type_kind) => {
|
||||||
|
Type::Ptr(Box::new(type_kind.get_type(type_vals, typedefs)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,7 +149,7 @@ impl Expression {
|
|||||||
Indexed(expression, _, _) => {
|
Indexed(expression, _, _) => {
|
||||||
let expr_type = expression.return_type()?;
|
let expr_type = expression.return_type()?;
|
||||||
if let (_, TypeKind::Array(elem_ty, _)) = expr_type {
|
if let (_, TypeKind::Array(elem_ty, _)) = expr_type {
|
||||||
Ok((ReturnKind::Soft, *elem_ty))
|
Ok((ReturnKind::Soft, TypeKind::Borrow(Box::new(*elem_ty))))
|
||||||
} else {
|
} else {
|
||||||
Err(ReturnTypeOther::IndexingNonArray(expression.1))
|
Err(ReturnTypeOther::IndexingNonArray(expression.1))
|
||||||
}
|
}
|
||||||
@ -165,7 +165,10 @@ impl Expression {
|
|||||||
TypeKind::Array(Box::new(first.1), expressions.len() as u64),
|
TypeKind::Array(Box::new(first.1), expressions.len() as u64),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
Accessed(_, type_kind, _) => Ok((ReturnKind::Soft, type_kind.clone())),
|
Accessed(_, type_kind, _) => Ok((
|
||||||
|
ReturnKind::Soft,
|
||||||
|
TypeKind::Borrow(Box::new(type_kind.clone())),
|
||||||
|
)),
|
||||||
Struct(name, _) => Ok((ReturnKind::Soft, TypeKind::CustomType(name.clone()))),
|
Struct(name, _) => Ok((ReturnKind::Soft, TypeKind::CustomType(name.clone()))),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -267,6 +270,13 @@ impl TypeKind {
|
|||||||
_ => resolved,
|
_ => resolved,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn deref_borrow(&self) -> TypeKind {
|
||||||
|
match self {
|
||||||
|
TypeKind::Borrow(type_kind) => *type_kind.clone(),
|
||||||
|
_ => self.clone(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, thiserror::Error)]
|
#[derive(Debug, Clone, thiserror::Error)]
|
||||||
|
@ -65,6 +65,8 @@ pub enum TypeKind {
|
|||||||
StringPtr,
|
StringPtr,
|
||||||
#[error("[{0}; {1}]")]
|
#[error("[{0}; {1}]")]
|
||||||
Array(Box<TypeKind>, u64),
|
Array(Box<TypeKind>, u64),
|
||||||
|
#[error("Borrow({0})")]
|
||||||
|
Borrow(Box<TypeKind>),
|
||||||
#[error("{0}")]
|
#[error("{0}")]
|
||||||
CustomType(String),
|
CustomType(String),
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
|
Loading…
Reference in New Issue
Block a user