Fix indexing return type and casting to and from a char
This commit is contained in:
		
							parent
							
								
									bbdfae081d
								
							
						
					
					
						commit
						28437aecb6
					
				| @ -31,6 +31,16 @@ pub fn new_string() -> String { | ||||
|     String { | ||||
|         inner: allocate(0), | ||||
|         length: 0, | ||||
|         max_length: 0, | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub fn from_str(str: *char) -> String { | ||||
|     let length = str_length(str, 0); | ||||
|     String { | ||||
|         inner: str, | ||||
|         length: length, | ||||
|         max_length: length | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -42,13 +52,17 @@ pub fn add_char(string: &mut String, c: char) { | ||||
|         free((*string).inner as *u8); | ||||
|         (*string).max_length = (*string).max_length + 4; | ||||
|         (*string).inner = new; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     (*string).inner[(*string).length] = c; | ||||
|     (((*string).inner) as *u8)[((*string).length + 1)] = 0; | ||||
|     (*string).length = (*string).length + 1; | ||||
| } | ||||
| 
 | ||||
| pub fn free_string(string: &mut String) { | ||||
|     free((*string).inner as *u8); | ||||
| } | ||||
| 
 | ||||
| fn copy_bits(from: *char, to: *char, pos: u64, max: u64) -> u8 { | ||||
|     if (pos >= max) { | ||||
|         return 0; | ||||
| @ -57,6 +71,9 @@ fn copy_bits(from: *char, to: *char, pos: u64, max: u64) -> u8 { | ||||
|     return copy_bits(from, to, pos + 1, max); | ||||
| } | ||||
| 
 | ||||
| pub fn free_string(string: &mut String) { | ||||
|     free((*string).inner as *u8); | ||||
| fn str_length(string: *char, position: u32) -> u32 { | ||||
|     if ((string[position] as u8) == 0) { | ||||
|         return 0; | ||||
|     } | ||||
|     return str_length(string, position + 1) + 1; | ||||
| } | ||||
| @ -1083,7 +1083,9 @@ impl mir::Expression { | ||||
|                             )), | ||||
|                             _ => panic!(), | ||||
|                         }, | ||||
|                         (TypeKind::UserPtr(_), TypeKind::UserPtr(_)) => Some(StackValue( | ||||
|                         (TypeKind::UserPtr(_), TypeKind::UserPtr(_)) | ||||
|                         | (TypeKind::Char, TypeKind::U8) | ||||
|                         | (TypeKind::U8, TypeKind::Char) => Some(StackValue( | ||||
|                             val.0.derive( | ||||
|                                 scope | ||||
|                                     .block | ||||
|  | ||||
| @ -394,6 +394,8 @@ impl Expression { | ||||
|                 let expr_type = expression.return_type(refs, mod_id)?; | ||||
|                 if let TypeKind::Array(elem_ty, _) = expr_type.1.resolve_weak(refs) { | ||||
|                     Ok((ReturnKind::Soft, *elem_ty)) | ||||
|                 } else if let TypeKind::UserPtr(_) = expr_type.1.resolve_weak(refs) { | ||||
|                     Ok((ReturnKind::Soft, expr_type.1)) | ||||
|                 } else { | ||||
|                     Err(ReturnTypeOther::IndexingNonArray(expression.1)) | ||||
|                 } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user