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