Skip to content

Commit

Permalink
more testing
Browse files Browse the repository at this point in the history
  • Loading branch information
JonathanWoollett-Light committed Nov 24, 2023
1 parent e8b1b23 commit d32d4a4
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 16 deletions.
1 change: 1 addition & 0 deletions src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ pub struct Variable {
pub identifier: Identifier,
pub index: Option<Box<Index>>,
}

pub type Identifier = Vec<u8>;

impl std::fmt::Debug for Variable {
Expand Down
148 changes: 139 additions & 9 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ fn main() {
#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashSet;
use std::fs::remove_file;
use std::fs::OpenOptions;
use std::io::Write;
Expand Down Expand Up @@ -146,6 +147,25 @@ mod tests {
match_nodes(new_nodes, expected);
new_nodes
}
fn test_optimization_new(
nodes: NonNull<NewStateNode>,
expected_build: &[Statement],
expected_read: HashSet<Identifier>,
expected_finish: &[Statement],
) -> NonNull<NewNode> {
unsafe {
let (new_nodes, read) = build_optimized_tree(nodes);

match_nodes(new_nodes, expected_build);
assert_eq!(read, expected_read);

let finish = finish_optimized_tree(new_nodes, read);

match_nodes(finish, expected_finish);

finish
}
}

fn test_assembling(nodes: NonNull<NewNode>, expected_assembly: &str, expected_exitcode: i32) {
let assembly = assembly_from_node(nodes);
Expand Down Expand Up @@ -244,13 +264,19 @@ mod tests {
);

// Optimization
let optimized = test_optimization(
let optimized = test_optimization_new(
path,
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(0))],
}],
HashSet::from([]),
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(0))],
}],
);

// Assembly
Expand Down Expand Up @@ -290,13 +316,19 @@ mod tests {
);

// Optimization
let optimized = test_optimization(
let optimized = test_optimization_new(
path,
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(1))],
}],
HashSet::from([]),
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(1))],
}],
);

// Assembly
Expand Down Expand Up @@ -336,13 +368,19 @@ mod tests {
);

// Optimization
let optimized = test_optimization(
let optimized = test_optimization_new(
path,
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(12))],
}],
HashSet::from([]),
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(12))],
}],
);

// Assembly
Expand Down Expand Up @@ -387,14 +425,21 @@ mod tests {
&[&[TypeValueState::new()]],
&[TypeValueState::new()],
);

// Optimization
let optimized = test_optimization(
let optimized = test_optimization_new(
path,
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(1))],
}],
HashSet::from([]),
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(1))],
}],
);

// Assembly
Expand Down Expand Up @@ -555,8 +600,25 @@ mod tests {
);

// Optimization
let optimized = test_optimization(
let optimized = test_optimization_new(
path,
&[
Statement {
comptime: false,
op: Op::Special(Special::Type),
arg: vec![
Value::Variable(Variable::new("x")),
Value::Type(Type::U8),
Value::Literal(Literal::Integer(1)),
],
},
Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(0))],
},
],
HashSet::from([]),
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
Expand Down Expand Up @@ -718,8 +780,25 @@ mod tests {
);

// Optimization
let optimized = test_optimization(
let optimized = test_optimization_new(
path,
&[
Statement {
comptime: false,
op: Op::Special(Special::Type),
arg: vec![
Value::Variable(Variable::new("x")),
Value::Type(Type::U8),
Value::Literal(Literal::Integer(1)),
],
},
Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(1))],
},
],
HashSet::from([]),
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
Expand Down Expand Up @@ -925,8 +1004,25 @@ mod tests {
);

// Optimization
let optimized = test_optimization(
let optimized = test_optimization_new(
path,
&[
Statement {
comptime: false,
op: Op::Special(Special::Type),
arg: vec![
Value::Variable(Variable::new("x")),
Value::Type(Type::U8),
Value::Literal(Literal::Integer(1)),
],
},
Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(2))],
},
],
HashSet::from([]),
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
Expand Down Expand Up @@ -1137,8 +1233,25 @@ mod tests {
);

// Optimization
let optimized = test_optimization(
let optimized = test_optimization_new(
path,
&[
Statement {
comptime: false,
op: Op::Special(Special::Type),
arg: vec![
Value::Variable(Variable::new("x")),
Value::Type(Type::U8),
Value::Literal(Literal::Integer(1)),
],
},
Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(0))],
},
],
HashSet::from([]),
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
Expand Down Expand Up @@ -1349,8 +1462,25 @@ mod tests {
);

// Optimization
let optimized = test_optimization(
let optimized = test_optimization_new(
path,
&[
Statement {
comptime: false,
op: Op::Special(Special::Type),
arg: vec![
Value::Variable(Variable::new("x")),
Value::Type(Type::U8),
Value::Literal(Literal::Integer(2)),
],
},
Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
arg: vec![Value::Literal(Literal::Integer(1))],
},
],
HashSet::from([]),
&[Statement {
comptime: false,
op: Op::Syscall(Syscall::Exit),
Expand Down
16 changes: 9 additions & 7 deletions src/middle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const DEFAULT_LOOP_LIMIT: usize = 100;
#[allow(dead_code)]
const UNROLL_LIMIT: usize = 4096;

pub unsafe fn get_optimized_tree(
pub unsafe fn build_optimized_tree(
graph: NonNull<NewStateNode>,
) -> (NonNull<NewNode>, HashSet<Identifier>) {
let mut types = HashMap::new();
Expand All @@ -33,7 +33,6 @@ pub unsafe fn get_optimized_tree(
let mut current_new_node = new_nodes;
while let Some(mut current) = stack.pop() {
let node = current.as_mut();
// dbg!(&node.statement.as_ref().statement);

match node.statement.as_ref().statement.op {
Op::Intrinsic(Intrinsic::Assign) => {
Expand Down Expand Up @@ -122,6 +121,9 @@ pub unsafe fn get_optimized_tree(
_ => todo!(),
}
}
// `current` is not used after `current = prev;` but it may be in the future, and I
// don't want to obfuscate this complex logic further.
#[allow(unused_assignments)]
Op::Intrinsic(Intrinsic::If(Cmp::Eq)) => {
match node.next {
(Some(_), None) | (None, Some(_)) => {
Expand Down Expand Up @@ -164,8 +166,6 @@ pub unsafe fn get_optimized_tree(
_ => todo!(),
}

// dbg!(&node.statement.as_ref().statement);

match node.next {
(Some(next), None) | (None, Some(next)) => {
match node.statement.as_ref().statement.op {
Expand Down Expand Up @@ -218,7 +218,7 @@ pub unsafe fn get_optimized_tree(
(new_nodes, read)
}

pub unsafe fn strip_optimized_tree(
pub unsafe fn finish_optimized_tree(
new_nodes: NonNull<NewNode>,
read: HashSet<Identifier>,
) -> NonNull<NewNode> {
Expand All @@ -244,6 +244,8 @@ pub unsafe fn strip_optimized_tree(
}
None => {
debug_assert_eq!(first, current);
// dbg!(&current.as_ref().child.unwrap().as_ref().statement);
// dbg!(&current.as_ref().statement);
first = current.as_ref().next.unwrap();
}
}
Expand Down Expand Up @@ -276,11 +278,11 @@ pub unsafe fn strip_optimized_tree(
pub unsafe fn optimize(graph: NonNull<NewStateNode>) -> NonNull<NewNode> {
// Construct new optimized abstract syntax tree.
// TODO This doesn't dealloc anything in `graph` which may be very very big. Do this deallocation.
let (new_nodes, read) = get_optimized_tree(graph);
let (new_nodes, read) = build_optimized_tree(graph);

dbg!(&read);

strip_optimized_tree(new_nodes, read)
finish_optimized_tree(new_nodes, read)
}

unsafe fn new_passback_end(mut node: NonNull<NewStateNode>, end: GraphNodeEnd) {
Expand Down

0 comments on commit d32d4a4

Please sign in to comment.