Fix std Strings
This commit is contained in:
parent
3d73c52cb4
commit
bbdfae081d
@ -36,15 +36,27 @@ pub fn new_string() -> String {
|
||||
|
||||
pub fn add_char(string: &mut String, c: char) {
|
||||
if ((*string).length + 1) >= (*string).max_length {
|
||||
let new = allocate((*string).max_length + 4) as *char;
|
||||
copy_bits((*string).inner, new, 0, (*string).max_length);
|
||||
|
||||
free((*string).inner as *u8);
|
||||
(*string).max_length = (*string).max_length + 4;
|
||||
(*string).inner = allocate((*string).max_length) as *char;
|
||||
(*string).inner = new;
|
||||
|
||||
}
|
||||
(*string).inner[(*string).length] = c;
|
||||
(((*string).inner) as *u8)[((*string).length + 1)] = 0;
|
||||
(*string).length = (*string).length + 1;
|
||||
}
|
||||
|
||||
fn copy_bits(from: *char, to: *char, pos: u64, max: u64) -> u8 {
|
||||
if (pos >= max) {
|
||||
return 0;
|
||||
}
|
||||
to[pos] = from[pos];
|
||||
return copy_bits(from, to, pos + 1, max);
|
||||
}
|
||||
|
||||
pub fn free_string(string: &mut String) {
|
||||
free((*string).inner as *u8);
|
||||
}
|
@ -150,7 +150,7 @@ pub fn perform_all_passes<'map>(
|
||||
#[cfg(debug_assertions)]
|
||||
println!("{:-^100}", "TYPE INFERRER OUTPUT");
|
||||
#[cfg(debug_assertions)]
|
||||
dbg!(&refs);
|
||||
println!("{}", &refs);
|
||||
#[cfg(debug_assertions)]
|
||||
println!("{}", &context);
|
||||
#[cfg(debug_assertions)]
|
||||
|
@ -2,7 +2,27 @@ use std::fmt::{Debug, Display, Write};
|
||||
|
||||
use crate::pad_adapter::PadAdapter;
|
||||
|
||||
use super::*;
|
||||
use super::{
|
||||
typerefs::{TypeRef, TypeRefs},
|
||||
*,
|
||||
};
|
||||
|
||||
impl Display for TypeRefs {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
for (i, typeref) in self.type_refs.borrow().iter().enumerate() {
|
||||
let idx = *typeref.borrow();
|
||||
writeln!(
|
||||
f,
|
||||
"{:<3} = {:<3} = {:?} = {}",
|
||||
i,
|
||||
unsafe { *self.recurse_type_ref(idx).borrow() },
|
||||
self.retrieve_type(idx),
|
||||
TypeKind::Vague(VagueType::TypeRef(idx)).resolve_ref(self)
|
||||
)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for Context {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
|
@ -13,8 +13,8 @@ use super::{
|
||||
pass::{Pass, PassResult, PassState},
|
||||
typecheck::ErrorKind,
|
||||
typerefs::{ScopeTypeRefs, TypeRef, TypeRefs},
|
||||
Block, ExprKind, Expression, FunctionDefinition, FunctionDefinitionKind, IfExpression, Module,
|
||||
ReturnKind, StmtKind, CustomTypeKey,
|
||||
Block, CustomTypeKey, ExprKind, Expression, FunctionDefinition, FunctionDefinitionKind,
|
||||
IfExpression, Module, ReturnKind, StmtKind,
|
||||
TypeKind::*,
|
||||
VagueType::*,
|
||||
};
|
||||
@ -183,8 +183,8 @@ impl Expression {
|
||||
type_refs
|
||||
.binop(op, &mut lhs_ref, &mut rhs_ref)
|
||||
.ok_or(ErrorKind::TypesIncompatible(
|
||||
lhs_ref.as_type(),
|
||||
rhs_ref.as_type(),
|
||||
lhs_ref.resolve_deep().unwrap(),
|
||||
rhs_ref.resolve_deep().unwrap(),
|
||||
))
|
||||
}
|
||||
ExprKind::FunctionCall(function_call) => {
|
||||
|
@ -9,7 +9,10 @@ use crate::mir::VagueType;
|
||||
use super::{typecheck::ErrorKind, BinaryOperator, TypeKind};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct TypeRef<'scope>(TypeIdRef, &'scope ScopeTypeRefs<'scope>);
|
||||
pub struct TypeRef<'scope>(
|
||||
pub(super) TypeIdRef,
|
||||
pub(super) &'scope ScopeTypeRefs<'scope>,
|
||||
);
|
||||
|
||||
impl<'scope> TypeRef<'scope> {
|
||||
/// Resolve current type in a weak manner, not resolving any Arrays or
|
||||
@ -54,9 +57,9 @@ type TypeIdRef = Rc<RefCell<usize>>;
|
||||
#[derive(Debug, Default)]
|
||||
pub struct TypeRefs {
|
||||
/// Simple list of types that variables can refrence
|
||||
hints: RefCell<Vec<TypeKind>>,
|
||||
pub(super) hints: RefCell<Vec<TypeKind>>,
|
||||
/// Indirect ID-references, referring to hints-vec
|
||||
type_refs: RefCell<Vec<TypeIdRef>>,
|
||||
pub(super) type_refs: RefCell<Vec<TypeIdRef>>,
|
||||
}
|
||||
|
||||
impl TypeRefs {
|
||||
@ -89,7 +92,7 @@ impl TypeRefs {
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn recurse_type_ref(&self, mut idx: usize) -> TypeIdRef {
|
||||
pub(super) unsafe fn recurse_type_ref(&self, mut idx: usize) -> TypeIdRef {
|
||||
let refs = self.type_refs.borrow();
|
||||
let mut inner_idx = refs.get_unchecked(idx);
|
||||
let mut seen = HashSet::new();
|
||||
|
Loading…
Reference in New Issue
Block a user