Implement importing of associated functions with types
This commit is contained in:
		
							parent
							
								
									5104555890
								
							
						
					
					
						commit
						dc360ef196
					
				| @ -14,7 +14,7 @@ struct String { | |||||||
| impl String { | impl String { | ||||||
|     pub fn new() -> String { |     pub fn new() -> String { | ||||||
|         String { |         String { | ||||||
|             inner: char::alloca(0), |             inner: allocate(0), | ||||||
|             length: 0, |             length: 0, | ||||||
|             max_length: 0, |             max_length: 0, | ||||||
|             must_be_freed: true, |             must_be_freed: true, | ||||||
|  | |||||||
| @ -36,6 +36,7 @@ impl ast::Module { | |||||||
|                 ExternFunction(signature) => { |                 ExternFunction(signature) => { | ||||||
|                     let def = mir::FunctionDefinition { |                     let def = mir::FunctionDefinition { | ||||||
|                         name: signature.name.clone(), |                         name: signature.name.clone(), | ||||||
|  |                         linkage_name: None, | ||||||
|                         is_pub: false, |                         is_pub: false, | ||||||
|                         is_imported: false, |                         is_imported: false, | ||||||
|                         return_type: signature |                         return_type: signature | ||||||
| @ -149,6 +150,7 @@ impl ast::FunctionDefinition { | |||||||
|         ); |         ); | ||||||
|         mir::FunctionDefinition { |         mir::FunctionDefinition { | ||||||
|             name: signature.name.clone(), |             name: signature.name.clone(), | ||||||
|  |             linkage_name: None, | ||||||
|             is_pub: *is_pub, |             is_pub: *is_pub, | ||||||
|             is_imported: false, |             is_imported: false, | ||||||
|             return_type: signature |             return_type: signature | ||||||
|  | |||||||
| @ -40,6 +40,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef | |||||||
|     match name { |     match name { | ||||||
|         "sizeof" => Some(FunctionDefinition { |         "sizeof" => Some(FunctionDefinition { | ||||||
|             name: "sizeof".to_owned(), |             name: "sizeof".to_owned(), | ||||||
|  |             linkage_name: None, | ||||||
|             is_pub: true, |             is_pub: true, | ||||||
|             is_imported: false, |             is_imported: false, | ||||||
|             return_type: TypeKind::U64, |             return_type: TypeKind::U64, | ||||||
| @ -48,6 +49,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef | |||||||
|         }), |         }), | ||||||
|         "alloca" => Some(FunctionDefinition { |         "alloca" => Some(FunctionDefinition { | ||||||
|             name: "alloca".to_owned(), |             name: "alloca".to_owned(), | ||||||
|  |             linkage_name: None, | ||||||
|             is_pub: true, |             is_pub: true, | ||||||
|             is_imported: false, |             is_imported: false, | ||||||
|             return_type: TypeKind::UserPtr(Box::new(ty.clone())), |             return_type: TypeKind::UserPtr(Box::new(ty.clone())), | ||||||
| @ -56,6 +58,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef | |||||||
|         }), |         }), | ||||||
|         "null" => Some(FunctionDefinition { |         "null" => Some(FunctionDefinition { | ||||||
|             name: "null".to_owned(), |             name: "null".to_owned(), | ||||||
|  |             linkage_name: None, | ||||||
|             is_pub: true, |             is_pub: true, | ||||||
|             is_imported: false, |             is_imported: false, | ||||||
|             return_type: TypeKind::UserPtr(Box::new(ty.clone())), |             return_type: TypeKind::UserPtr(Box::new(ty.clone())), | ||||||
|  | |||||||
| @ -187,7 +187,7 @@ impl mir::Module { | |||||||
|             let is_main = self.is_main && function.name == "main"; |             let is_main = self.is_main && function.name == "main"; | ||||||
|             let func = match &function.kind { |             let func = match &function.kind { | ||||||
|                 mir::FunctionDefinitionKind::Local(_, _) => Some(module.function( |                 mir::FunctionDefinitionKind::Local(_, _) => Some(module.function( | ||||||
|                     &function.name, |                     &function.linkage_name.clone().unwrap_or(function.name.clone()), | ||||||
|                     function.return_type.get_type(&type_values), |                     function.return_type.get_type(&type_values), | ||||||
|                     param_types, |                     param_types, | ||||||
|                     FunctionFlags { |                     FunctionFlags { | ||||||
| @ -198,7 +198,7 @@ impl mir::Module { | |||||||
|                     }, |                     }, | ||||||
|                 )), |                 )), | ||||||
|                 mir::FunctionDefinitionKind::Extern(imported) => Some(module.function( |                 mir::FunctionDefinitionKind::Extern(imported) => Some(module.function( | ||||||
|                     &function.name, |                     &function.linkage_name.clone().unwrap_or(function.name.clone()), | ||||||
|                     function.return_type.get_type(&type_values), |                     function.return_type.get_type(&type_values), | ||||||
|                     param_types, |                     param_types, | ||||||
|                     FunctionFlags { |                     FunctionFlags { | ||||||
| @ -238,7 +238,7 @@ impl mir::Module { | |||||||
|                     }, |                     }, | ||||||
|                 )), |                 )), | ||||||
|                 mir::FunctionDefinitionKind::Extern(imported) => Some(module.function( |                 mir::FunctionDefinitionKind::Extern(imported) => Some(module.function( | ||||||
|                     &function.name, |                     &function.linkage_name.clone().unwrap_or(function.name.clone()), | ||||||
|                     function.return_type.get_type(&type_values), |                     function.return_type.get_type(&type_values), | ||||||
|                     param_types, |                     param_types, | ||||||
|                     FunctionFlags { |                     FunctionFlags { | ||||||
|  | |||||||
| @ -227,7 +227,8 @@ impl<'map> Pass for LinkerPass<'map> { | |||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     importer_module.functions.push(FunctionDefinition { |                     importer_module.functions.push(FunctionDefinition { | ||||||
|                         name: func_name, |                         name: func_name.clone(), | ||||||
|  |                         linkage_name: None, | ||||||
|                         is_pub: false, |                         is_pub: false, | ||||||
|                         is_imported: false, |                         is_imported: false, | ||||||
|                         return_type, |                         return_type, | ||||||
| @ -268,6 +269,66 @@ impl<'map> Pass for LinkerPass<'map> { | |||||||
|                             FunctionDefinitionKind::Intrinsic(_) => {} |                             FunctionDefinitionKind::Intrinsic(_) => {} | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|  | 
 | ||||||
|  |                     for (ty, func) in &mut imported.associated_functions { | ||||||
|  |                         if *ty != imported_ty { | ||||||
|  |                             continue; | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         let func_name = func.name.clone(); | ||||||
|  |                         dbg!(&func_name); | ||||||
|  | 
 | ||||||
|  |                         if !func.is_pub { | ||||||
|  |                             state.ok::<_, Infallible>( | ||||||
|  |                                 Err(ErrorKind::FunctionIsPrivate(module_name.clone(), func_name.clone())), | ||||||
|  |                                 import.1, | ||||||
|  |                             ); | ||||||
|  |                             continue; | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         func.is_imported = true; | ||||||
|  | 
 | ||||||
|  |                         if let Some((_, existing)) = importer_module | ||||||
|  |                             .associated_functions | ||||||
|  |                             .iter() | ||||||
|  |                             .find(|(ty, f)| *ty == imported_ty && f.name == *func_name) | ||||||
|  |                         { | ||||||
|  |                             if let Err(e) = existing.equals_as_imported(func) { | ||||||
|  |                                 state.ok::<_, Infallible>( | ||||||
|  |                                     Err(ErrorKind::FunctionImportIssue( | ||||||
|  |                                         module_name.clone(), | ||||||
|  |                                         func_name.clone(), | ||||||
|  |                                         e, | ||||||
|  |                                     )), | ||||||
|  |                                     import.1, | ||||||
|  |                                 ); | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         let types = import_type(&func.return_type, false); | ||||||
|  |                         let return_type = func.return_type.clone(); | ||||||
|  |                         imported_types.extend(types); | ||||||
|  | 
 | ||||||
|  |                         let mut param_tys = Vec::new(); | ||||||
|  |                         for (param_name, param_ty) in &func.parameters { | ||||||
|  |                             let types = import_type(¶m_ty, false); | ||||||
|  |                             imported_types.extend(types); | ||||||
|  |                             param_tys.push((param_name.clone(), param_ty.clone())); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         importer_module.associated_functions.push(( | ||||||
|  |                             ty.clone(), | ||||||
|  |                             FunctionDefinition { | ||||||
|  |                                 name: func_name.clone(), | ||||||
|  |                                 linkage_name: Some(format!("{}::{}", ty, func_name)), | ||||||
|  |                                 is_pub: false, | ||||||
|  |                                 is_imported: false, | ||||||
|  |                                 return_type, | ||||||
|  |                                 parameters: param_tys, | ||||||
|  |                                 kind: super::FunctionDefinitionKind::Extern(true), | ||||||
|  |                             }, | ||||||
|  |                         )); | ||||||
|  |                     } | ||||||
|                 } else { |                 } else { | ||||||
|                     state.ok::<_, Infallible>( |                     state.ok::<_, Infallible>( | ||||||
|                         Err(ErrorKind::ImportDoesNotExist(module_name.clone(), import_name.clone())), |                         Err(ErrorKind::ImportDoesNotExist(module_name.clone(), import_name.clone())), | ||||||
| @ -405,8 +466,6 @@ impl<'map> Pass for LinkerPass<'map> { | |||||||
|                 super::ExprKind::Deref(..) => {} |                 super::ExprKind::Deref(..) => {} | ||||||
|                 super::ExprKind::CastTo(_, type_kind) => *type_kind = type_kind.update_imported(extern_types, mod_id), |                 super::ExprKind::CastTo(_, type_kind) => *type_kind = type_kind.update_imported(extern_types, mod_id), | ||||||
|                 super::ExprKind::AssociatedFunctionCall(type_kind, _) => { |                 super::ExprKind::AssociatedFunctionCall(type_kind, _) => { | ||||||
|                     dbg!(&type_kind); |  | ||||||
|                     dbg!(extern_types); |  | ||||||
|                     *type_kind = type_kind.update_imported(extern_types, mod_id) |                     *type_kind = type_kind.update_imported(extern_types, mod_id) | ||||||
|                 } |                 } | ||||||
|                 _ => {} |                 _ => {} | ||||||
|  | |||||||
| @ -284,6 +284,7 @@ pub struct FunctionCall { | |||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct FunctionDefinition { | pub struct FunctionDefinition { | ||||||
|     pub name: String, |     pub name: String, | ||||||
|  |     pub linkage_name: Option<String>, | ||||||
|     /// Whether this function is visible to outside modules
 |     /// Whether this function is visible to outside modules
 | ||||||
|     pub is_pub: bool, |     pub is_pub: bool, | ||||||
|     /// Whether this module is from an external module, and has been imported
 |     /// Whether this module is from an external module, and has been imported
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user