Fix pointer-casting
This commit is contained in:
		
							parent
							
								
									c03a5188ea
								
							
						
					
					
						commit
						e27aa4b8ab
					
				| @ -1,13 +1,13 @@ | ||||
| 
 | ||||
| extern fn puts(message: *str) -> i32; | ||||
| extern fn malloc(size: u64) -> *u8; | ||||
| extern fn div(numerator: i32, denominator: i32) -> div_t; | ||||
| 
 | ||||
| struct div_t { | ||||
|     quotient: i32, | ||||
|     remainder: i32, | ||||
| } | ||||
| 
 | ||||
| extern fn div(numerator: i32, denominator: i32) -> div_t; | ||||
| 
 | ||||
| pub fn print(message: *str) { | ||||
|     puts(message); | ||||
| } | ||||
| @ -16,6 +16,10 @@ pub fn int_div(numerator: i32, denominator: i32) -> div_t { | ||||
|     return div(numerator, denominator); | ||||
| } | ||||
| 
 | ||||
| pub fn allocate(size: u64) -> *u8 { | ||||
|     malloc(size) | ||||
| } | ||||
| 
 | ||||
| fn main() -> u16 { | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| @ -1030,18 +1030,22 @@ impl mir::Expression { | ||||
|             } | ||||
|             mir::ExprKind::CastTo(expression, type_kind) => { | ||||
|                 let val = expression.codegen(scope, state)?; | ||||
|                 let cast_instr = val | ||||
|                     .1 | ||||
|                     .get_type(scope.type_values, scope.types) | ||||
|                     .cast_instruction( | ||||
|                         val.instr(), | ||||
|                         &type_kind.get_type(scope.type_values, scope.types), | ||||
|                     ) | ||||
|                     .unwrap(); | ||||
|                 Some(StackValue( | ||||
|                     val.0.derive(scope.block.build(cast_instr).unwrap()), | ||||
|                     type_kind.clone(), | ||||
|                 )) | ||||
|                 let instr = | ||||
|                     if let (TypeKind::UserPtr(_), TypeKind::UserPtr(_)) = (&val.1, type_kind) { | ||||
|                         val.0.instr() | ||||
|                     } else { | ||||
|                         let cast_instr = val | ||||
|                             .1 | ||||
|                             .get_type(scope.type_values, scope.types) | ||||
|                             .cast_instruction( | ||||
|                                 val.instr(), | ||||
|                                 &type_kind.get_type(scope.type_values, scope.types), | ||||
|                             ) | ||||
|                             .unwrap(); | ||||
|                         scope.block.build(cast_instr).unwrap() | ||||
|                     }; | ||||
| 
 | ||||
|                 Some(StackValue(val.0.derive(instr), type_kind.clone())) | ||||
|             } | ||||
|         }; | ||||
|         if let Some(value) = &value { | ||||
|  | ||||
| @ -1,5 +1,7 @@ | ||||
| // Arithmetic, function calls and imports! | ||||
| 
 | ||||
| import std::allocate; | ||||
| 
 | ||||
| fn other() -> i16 { | ||||
|   return 6; | ||||
| } | ||||
| @ -7,5 +9,7 @@ fn other() -> i16 { | ||||
| fn main() -> u32 { | ||||
|   let value = other() as u32; | ||||
| 
 | ||||
|   return value; | ||||
|   let v = (allocate(4) as *u32); | ||||
| 
 | ||||
|   return v[0]; | ||||
| } | ||||
|  | ||||
| @ -1,8 +1,6 @@ | ||||
| // Arithmetic, function calls and imports! | ||||
| 
 | ||||
| 
 | ||||
| extern fn malloc(size: u64) -> *u8; | ||||
| 
 | ||||
| fn main() -> u8 { | ||||
|     let mut ptr = malloc(4); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user