Change user-space pointer to different type
This commit is contained in:
		
							parent
							
								
									a49105b07a
								
							
						
					
					
						commit
						9db508bd9c
					
				| @ -294,7 +294,7 @@ impl From<ast::TypeKind> for mir::TypeKind { | |||||||
|                 mir::TypeKind::Borrow(Box::new(mir::TypeKind::from(*type_kind.clone())), *mutable) |                 mir::TypeKind::Borrow(Box::new(mir::TypeKind::from(*type_kind.clone())), *mutable) | ||||||
|             } |             } | ||||||
|             ast::TypeKind::Ptr(type_kind) => { |             ast::TypeKind::Ptr(type_kind) => { | ||||||
|                 mir::TypeKind::Ptr(Box::new(mir::TypeKind::from(*type_kind.clone()))) |                 mir::TypeKind::UserPtr(Box::new(mir::TypeKind::from(*type_kind.clone()))) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -368,7 +368,7 @@ impl mir::Module { | |||||||
|                     p_name.clone(), |                     p_name.clone(), | ||||||
|                     StackValue( |                     StackValue( | ||||||
|                         StackValueKind::mutable(p_ty.is_mutable(), alloca), |                         StackValueKind::mutable(p_ty.is_mutable(), alloca), | ||||||
|                         TypeKind::Ptr(Box::new(p_ty.clone())), |                         TypeKind::CodegenPtr(Box::new(p_ty.clone())), | ||||||
|                     ), |                     ), | ||||||
|                 ); |                 ); | ||||||
| 
 | 
 | ||||||
| @ -511,7 +511,7 @@ impl mir::Statement { | |||||||
| 
 | 
 | ||||||
|                 scope.stack_values.insert( |                 scope.stack_values.insert( | ||||||
|                     name.clone(), |                     name.clone(), | ||||||
|                     StackValue(stack_value, TypeKind::Ptr(Box::new(value.clone().1))), |                     StackValue(stack_value, TypeKind::CodegenPtr(Box::new(value.clone().1))), | ||||||
|                 ); |                 ); | ||||||
|                 if let Some(debug) = &scope.debug { |                 if let Some(debug) = &scope.debug { | ||||||
|                     let location = self.1.into_debug(scope.tokens).unwrap(); |                     let location = self.1.into_debug(scope.tokens).unwrap(); | ||||||
| @ -595,7 +595,7 @@ impl mir::Expression { | |||||||
|                     .expect("Variable reference not found?!"); |                     .expect("Variable reference not found?!"); | ||||||
|                 Some({ |                 Some({ | ||||||
|                     if state.should_load { |                     if state.should_load { | ||||||
|                         if let TypeKind::Ptr(inner) = &v.1 { |                         if let TypeKind::CodegenPtr(inner) = &v.1 { | ||||||
|                             StackValue( |                             StackValue( | ||||||
|                                 v.0.derive( |                                 v.0.derive( | ||||||
|                                     scope |                                     scope | ||||||
| @ -715,7 +715,7 @@ impl mir::Expression { | |||||||
|                     } else { |                     } else { | ||||||
|                         Some(StackValue( |                         Some(StackValue( | ||||||
|                             StackValueKind::Immutable(ptr), |                             StackValueKind::Immutable(ptr), | ||||||
|                             TypeKind::Ptr(Box::new(ret_type_kind)), |                             TypeKind::CodegenPtr(Box::new(ret_type_kind)), | ||||||
|                         )) |                         )) | ||||||
|                     } |                     } | ||||||
|                 } else { |                 } else { | ||||||
| @ -758,7 +758,7 @@ impl mir::Expression { | |||||||
|                     .unwrap() |                     .unwrap() | ||||||
|                     .maybe_location(&mut scope.block, location); |                     .maybe_location(&mut scope.block, location); | ||||||
| 
 | 
 | ||||||
|                 let TypeKind::Ptr(inner) = array_ty else { |                 let TypeKind::CodegenPtr(inner) = array_ty else { | ||||||
|                     panic!(); |                     panic!(); | ||||||
|                 }; |                 }; | ||||||
|                 let TypeKind::Array(elem_ty, _) = *inner else { |                 let TypeKind::Array(elem_ty, _) = *inner else { | ||||||
| @ -783,7 +783,7 @@ impl mir::Expression { | |||||||
|                         *elem_ty, |                         *elem_ty, | ||||||
|                     )) |                     )) | ||||||
|                 } else { |                 } else { | ||||||
|                     Some(StackValue(kind.derive(ptr), TypeKind::Ptr(elem_ty))) |                     Some(StackValue(kind.derive(ptr), TypeKind::CodegenPtr(elem_ty))) | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             mir::ExprKind::Array(expressions) => { |             mir::ExprKind::Array(expressions) => { | ||||||
| @ -856,7 +856,7 @@ impl mir::Expression { | |||||||
|             mir::ExprKind::Accessed(expression, type_kind, field) => { |             mir::ExprKind::Accessed(expression, type_kind, field) => { | ||||||
|                 let struct_val = expression.codegen(scope, &state.load(false)).unwrap(); |                 let struct_val = expression.codegen(scope, &state.load(false)).unwrap(); | ||||||
| 
 | 
 | ||||||
|                 let TypeKind::Ptr(inner) = &struct_val.1 else { |                 let TypeKind::CodegenPtr(inner) = &struct_val.1 else { | ||||||
|                     panic!("tried accessing non-pointer"); |                     panic!("tried accessing non-pointer"); | ||||||
|                 }; |                 }; | ||||||
|                 let TypeKind::CustomType(name) = *inner.clone() else { |                 let TypeKind::CustomType(name) = *inner.clone() else { | ||||||
| @ -898,7 +898,9 @@ impl mir::Expression { | |||||||
|                 } else { |                 } else { | ||||||
|                     Some(StackValue( |                     Some(StackValue( | ||||||
|                         struct_val.0.derive(value), |                         struct_val.0.derive(value), | ||||||
|                         TypeKind::Ptr(Box::new(struct_ty.get_field_ty(&field).unwrap().clone())), |                         TypeKind::CodegenPtr(Box::new( | ||||||
|  |                             struct_ty.get_field_ty(&field).unwrap().clone(), | ||||||
|  |                         )), | ||||||
|                     )) |                     )) | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @ -959,7 +961,7 @@ impl mir::Expression { | |||||||
|                     .get(&varref.1) |                     .get(&varref.1) | ||||||
|                     .expect("Variable reference not found?!"); |                     .expect("Variable reference not found?!"); | ||||||
| 
 | 
 | ||||||
|                 let TypeKind::Ptr(ptr_inner) = &v.1 else { |                 let TypeKind::CodegenPtr(ptr_inner) = &v.1 else { | ||||||
|                     panic!(); |                     panic!(); | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
| @ -976,7 +978,7 @@ impl mir::Expression { | |||||||
| 
 | 
 | ||||||
|                 Some({ |                 Some({ | ||||||
|                     if state.should_load { |                     if state.should_load { | ||||||
|                         if let TypeKind::Ptr(inner) = *ptr_inner.clone() { |                         if let TypeKind::CodegenPtr(inner) = *ptr_inner.clone() { | ||||||
|                             StackValue( |                             StackValue( | ||||||
|                                 v.0.derive( |                                 v.0.derive( | ||||||
|                                     scope |                                     scope | ||||||
| @ -1173,7 +1175,10 @@ impl TypeKind { | |||||||
|                 let type_val = type_vals.get(n).unwrap().clone(); |                 let type_val = type_vals.get(n).unwrap().clone(); | ||||||
|                 Type::CustomType(type_val) |                 Type::CustomType(type_val) | ||||||
|             } |             } | ||||||
|             TypeKind::Ptr(type_kind) => { |             TypeKind::UserPtr(type_kind) => { | ||||||
|  |                 Type::Ptr(Box::new(type_kind.get_type(type_vals, typedefs))) | ||||||
|  |             } | ||||||
|  |             TypeKind::CodegenPtr(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, _) => { |             TypeKind::Borrow(type_kind, _) => { | ||||||
| @ -1223,7 +1228,7 @@ impl TypeKind { | |||||||
|                 ), |                 ), | ||||||
|                 size_bits: self.size_of(), |                 size_bits: self.size_of(), | ||||||
|             }), |             }), | ||||||
|             TypeKind::Ptr(inner) | TypeKind::Borrow(inner, _) => { |             TypeKind::CodegenPtr(inner) | TypeKind::Borrow(inner, _) => { | ||||||
|                 DebugTypeData::Pointer(DebugPointerType { |                 DebugTypeData::Pointer(DebugPointerType { | ||||||
|                     name, |                     name, | ||||||
|                     pointee: inner.get_debug_type_hard( |                     pointee: inner.get_debug_type_hard( | ||||||
|  | |||||||
| @ -345,10 +345,14 @@ impl Display for TypeKind { | |||||||
|                 write!(f, "&mut ")?; |                 write!(f, "&mut ")?; | ||||||
|                 Display::fmt(type_kind, f) |                 Display::fmt(type_kind, f) | ||||||
|             } |             } | ||||||
|             TypeKind::Ptr(type_kind) => { |             TypeKind::UserPtr(type_kind) => { | ||||||
|                 write!(f, "*")?; |                 write!(f, "*")?; | ||||||
|                 Display::fmt(type_kind, f) |                 Display::fmt(type_kind, f) | ||||||
|             } |             } | ||||||
|  |             TypeKind::CodegenPtr(type_kind) => { | ||||||
|  |                 write!(f, "CodegenPtr ")?; | ||||||
|  |                 Display::fmt(type_kind, f) | ||||||
|  |             } | ||||||
|             TypeKind::Vague(vague_type) => Display::fmt(vague_type, f), |             TypeKind::Vague(vague_type) => Display::fmt(vague_type, f), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -46,9 +46,10 @@ 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(_) => 64, |             TypeKind::CodegenPtr(_) => 64, | ||||||
|             TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"), |             TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"), | ||||||
|             TypeKind::Borrow(_, _) => 64, |             TypeKind::Borrow(_, _) => 64, | ||||||
|  |             TypeKind::UserPtr(_) => 64, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -69,9 +70,10 @@ 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(_) => 64, |             TypeKind::CodegenPtr(_) => 64, | ||||||
|             TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"), |             TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"), | ||||||
|             TypeKind::Borrow(_, _) => 64, |             TypeKind::Borrow(_, _) => 64, | ||||||
|  |             TypeKind::UserPtr(_) => 64, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -397,8 +399,8 @@ impl Collapsable for TypeKind { | |||||||
|                     )) |                     )) | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             (TypeKind::Ptr(val1), TypeKind::Ptr(val2)) => { |             (TypeKind::UserPtr(val1), TypeKind::UserPtr(val2)) => { | ||||||
|                 Ok(TypeKind::Ptr(Box::new(val1.collapse_into(val2)?))) |                 Ok(TypeKind::UserPtr(Box::new(val1.collapse_into(val2)?))) | ||||||
|             } |             } | ||||||
|             _ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())), |             _ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())), | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -95,7 +95,8 @@ pub enum TypeKind { | |||||||
|     Array(Box<TypeKind>, u64), |     Array(Box<TypeKind>, u64), | ||||||
|     CustomType(String), |     CustomType(String), | ||||||
|     Borrow(Box<TypeKind>, bool), |     Borrow(Box<TypeKind>, bool), | ||||||
|     Ptr(Box<TypeKind>), |     UserPtr(Box<TypeKind>), | ||||||
|  |     CodegenPtr(Box<TypeKind>), | ||||||
|     Vague(VagueType), |     Vague(VagueType), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -39,8 +39,8 @@ pub enum ErrorKind { | |||||||
|     TypeNotInferrable(TypeKind), |     TypeNotInferrable(TypeKind), | ||||||
|     #[error("Expected branch type to be {0}, found {1} instead")] |     #[error("Expected branch type to be {0}, found {1} instead")] | ||||||
|     BranchTypesDiffer(TypeKind, TypeKind), |     BranchTypesDiffer(TypeKind, TypeKind), | ||||||
|     #[error("Attempted to index a non-array type of {0}")] |     #[error("Attempted to index a non-indexable type of {0}")] | ||||||
|     TriedIndexingNonArray(TypeKind), |     TriedIndexingNonIndexable(TypeKind), | ||||||
|     #[error("Index {0} out of bounds ({1})")] |     #[error("Index {0} out of bounds ({1})")] | ||||||
|     IndexOutOfBounds(u64, u64), |     IndexOutOfBounds(u64, u64), | ||||||
|     #[error("No such type {0} could be found")] |     #[error("No such type {0} could be found")] | ||||||
| @ -535,7 +535,7 @@ impl Expression { | |||||||
| 
 | 
 | ||||||
|                 let expr_t = expression.typecheck(state, typerefs, hint_t)?; |                 let expr_t = expression.typecheck(state, typerefs, hint_t)?; | ||||||
|                 match expr_t { |                 match expr_t { | ||||||
|                     TypeKind::Array(inferred_ty, _) | TypeKind::Ptr(inferred_ty) => { |                     TypeKind::Array(inferred_ty, _) | TypeKind::UserPtr(inferred_ty) => { | ||||||
|                         let ty = state.or_else( |                         let ty = state.or_else( | ||||||
|                             elem_ty.resolve_ref(typerefs).collapse_into(&inferred_ty), |                             elem_ty.resolve_ref(typerefs).collapse_into(&inferred_ty), | ||||||
|                             TypeKind::Vague(Vague::Unknown), |                             TypeKind::Vague(Vague::Unknown), | ||||||
| @ -544,7 +544,7 @@ impl Expression { | |||||||
|                         *elem_ty = ty.clone(); |                         *elem_ty = ty.clone(); | ||||||
|                         Ok(ty) |                         Ok(ty) | ||||||
|                     } |                     } | ||||||
|                     _ => Err(ErrorKind::TriedIndexingNonArray(expr_t)), |                     _ => Err(ErrorKind::TriedIndexingNonIndexable(expr_t)), | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             ExprKind::Array(expressions) => { |             ExprKind::Array(expressions) => { | ||||||
|  | |||||||
| @ -267,12 +267,12 @@ impl Expression { | |||||||
|                 // need for further resolution.
 |                 // need for further resolution.
 | ||||||
|                 let kind = expr_ty.resolve_weak().unwrap(); |                 let kind = expr_ty.resolve_weak().unwrap(); | ||||||
|                 match kind { |                 match kind { | ||||||
|                     Array(type_kind, _) | Ptr(type_kind) => { |                     Array(type_kind, _) | UserPtr(type_kind) => { | ||||||
|                         let elem_ty = type_refs.from_type(&type_kind).unwrap(); |                         let elem_ty = type_refs.from_type(&type_kind).unwrap(); | ||||||
|                         *index_ty = elem_ty.as_type().clone(); |                         *index_ty = elem_ty.as_type().clone(); | ||||||
|                         Ok(elem_ty) |                         Ok(elem_ty) | ||||||
|                     } |                     } | ||||||
|                     _ => Err(ErrorKind::TriedIndexingNonArray(kind)), |                     _ => Err(ErrorKind::TriedIndexingNonIndexable(kind)), | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             ExprKind::Array(expressions) => { |             ExprKind::Array(expressions) => { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user