Compare commits

...

2 Commits

Author SHA1 Message Date
8f45c8cf92 Fix nested if/else, add add_num_to_str to standard library 2025-07-22 20:47:39 +03:00
32059682ee Make add_char and set_char work 2025-07-22 20:27:29 +03:00
5 changed files with 70 additions and 8 deletions

View File

@ -105,12 +105,24 @@ impl BlockHolder {
}
writeln!(f, "{} ({:?}):", self.data.name, self.value)?;
let mut state = Default::default();
let mut inner = PadAdapter::wrap(f, &mut state);
for instr in &self.instructions {
let mut state = Default::default();
let mut inner = PadAdapter::wrap(f, &mut state);
instr.builder_fmt(&mut inner, builder, debug)?;
}
if let Some(terminator) = &self.data.terminator {
terminator.builder_fmt(&mut inner, builder, debug)?;
}
if let Some(location) = self.data.terminator_location {
writeln!(
inner,
" ^ (At {}) ",
debug.as_ref().unwrap().get_location(location)
)?;
}
Ok(())
}
}
@ -155,6 +167,24 @@ impl InstructionHolder {
}
}
impl TerminatorKind {
fn builder_fmt(
&self,
f: &mut impl std::fmt::Write,
builder: &Builder,
debug: &Option<DebugInformation>,
) -> std::fmt::Result {
match self {
TerminatorKind::Ret(instr) => writeln!(f, "ret {:?}", instr),
TerminatorKind::RetVoid => writeln!(f, "ret void"),
TerminatorKind::Br(block) => writeln!(f, "br {:?}", block),
TerminatorKind::CondBr(instr, lhs, rhs) => {
writeln!(f, "condbr {:?}, {:?} or {:?}", instr, lhs, rhs)
}
}
}
}
impl DebugMetadataValue {
fn hr(&self, debug: &DebugInformation) -> String {
let kind = match debug.get_metadata(*self) {

View File

@ -25,6 +25,7 @@ struct String {
inner: *char,
length: u64,
max_length: u64,
must_be_freed: bool,
}
pub fn new_string() -> String {
@ -32,6 +33,7 @@ pub fn new_string() -> String {
inner: allocate(0),
length: 0,
max_length: 0,
must_be_freed: true,
}
}
@ -42,7 +44,8 @@ pub fn from_str(str: *char) -> String {
return String {
inner: cloned,
length: length,
max_length: length
max_length: length,
must_be_freed: false,
};
}
@ -51,9 +54,12 @@ pub fn add_char(string: &mut String, c: char) {
let new = allocate((*string).max_length + 4) as *char;
copy_bits((*string).inner, new, 0, (*string).max_length);
free((*string).inner as *u8);
if (*string).must_be_freed == true {
free((*string).inner as *u8);
}
(*string).max_length = (*string).max_length + 4;
(*string).inner = new;
(*string).must_be_freed = true;
}
(*string).inner[(*string).length] = c;
@ -61,6 +67,12 @@ pub fn add_char(string: &mut String, c: char) {
(*string).length = (*string).length + 1;
}
pub fn set_char(string: &mut String, c: char, position: u64) {
if position <= (*string).length {
(*string).inner[position] = c;
}
}
pub fn free_string(string: &mut String) {
free((*string).inner as *u8);
}
@ -74,8 +86,21 @@ fn copy_bits(from: *char, to: *char, pos: u64, max: u64) -> u8 {
}
fn str_length(string: *char, position: u32) -> u32 {
if ((string[position] as u8) == 0) {
if (string[position] == '\0') {
return 0;
}
return str_length(string, position + 1) + 1;
}
pub fn add_num_to_str(string: &mut String, num: u64) {
if num == 0 { add_char(string, '0'); }
else { if num == 1 { add_char(string, '1'); }
else { if num == 2 { add_char(string, '2'); }
else { if num == 3 { add_char(string, '3'); }
else { if num == 4 { add_char(string, '4'); }
else { if num == 5 { add_char(string, '5'); }
else { if num == 6 { add_char(string, '6'); }
else { if num == 7 { add_char(string, '7'); }
else { if num == 8 { add_char(string, '8'); }
else { if num == 9 { add_char(string, '9'); } } } } } } } } } }
}

View File

@ -1135,7 +1135,7 @@ impl mir::IfExpression {
if let Some(debug) = &scope.debug {
let before_location = self.0 .1.into_debug(scope.tokens, debug.scope).unwrap();
let before_v = debug.info.location(&debug.scope, before_location);
scope.block.set_terminator_location(before_v).unwrap();
scope.block.set_terminator_location(before_v).ok();
let then_location = self
.1
@ -1177,8 +1177,9 @@ impl mir::IfExpression {
let opt = else_block.codegen(&mut else_scope, state);
else_scope.block.terminate(Term::Br(after_bb)).ok();
if let Some(ret) = opt {
else_scope.block.terminate(Term::Br(after_bb)).ok();
Some(ret)
} else {
None

View File

@ -167,7 +167,7 @@ impl<'a, 'b> TokenStream<'a, 'b> {
match T::parse(clone) {
Ok(res) => {
#[cfg(debug_assertions)]
dbg!(&res);
// dbg!(&res);
let new_pos = ref_pos.max(self.position);
Ok((res, new_pos))
}

View File

@ -1,10 +1,16 @@
import std::print;
import std::from_str;
import std::add_char;
import std::set_char;
import std::free_string;
import std::add_num_to_str;
fn main() -> i32 {
let mut test = from_str("hello world");
add_char(&mut test, '!');
set_char(&mut test, 'B', 0);
add_num_to_str(&mut test, 7);
print(&test);