Skip to content

Commit ff92918

Browse files
Merge pull request #5 from aayush-tripathi/feature/o1-register-allocator
Feature/o1 register allocator, add tests and format code
2 parents 4e916ad + bf3eb49 commit ff92918

22 files changed

Lines changed: 2086 additions & 1746 deletions

File tree

tundra-cli/src/main.rs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,11 @@
1-
use std::{
2-
env,
3-
fs,
4-
path::Path,
5-
process,
6-
rc::Rc,
7-
cell::RefCell,
8-
};
1+
use std::{cell::RefCell, env, fs, path::Path, process, rc::Rc};
92

103
use tundra::{
11-
compiler::compiler::Compiler,
124
bytecode::chunk::Chunk,
13-
vm::{
14-
interpretresult::InterpretResult,
15-
vm::VM,
16-
},
17-
lexer::scanner::Scanner,
185
bytecode::debug::disassemble_chunk,
6+
compiler::compiler::Compiler,
7+
lexer::scanner::Scanner,
8+
vm::{interpretresult::InterpretResult, vm::VM},
199
};
2010

2111
fn print_usage_and_exit() -> ! {
@@ -28,7 +18,7 @@ fn main() {
2818
let _ = args.next(); // program name
2919
let script = match args.next() {
3020
Some(s) => s,
31-
None => print_usage_and_exit(),
21+
None => print_usage_and_exit(),
3222
};
3323

3424
let path = Path::new(&script);
@@ -62,7 +52,7 @@ fn main() {
6252
// 2) Run with **interpreter only** (no JIT)
6353
let mut vm = VM::new_interpreter_only(chunk);
6454
match vm.run() {
65-
InterpretResult::Ok => {}
55+
InterpretResult::Ok => {}
6656
InterpretResult::CompileError => {
6757
eprintln!("Compile error");
6858
process::exit(1);

tundra/src/bytecode/chunk.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
// bytecode/chunk.rs
22

3-
use crate::bytecode::value::Value;
43
use super::opcode::OpCode;
4+
use crate::bytecode::value::Value;
55

66
/// A compiled “chunk” of code:
77
/// - `code` holds your high-level `OpCode` instructions
88
/// - `constants` is the literal pool
99
/// - `lines[i]` is the source‐line for `code[i]`
10-
/// - `max_register` to allocate CraneLift Variables
11-
#[derive(Debug,PartialEq)]
10+
/// - `max_register` to allocate CraneLift Variables
11+
#[derive(Debug, PartialEq)]
1212
pub struct Chunk {
1313
pub code: Vec<OpCode>,
1414
pub constants: Vec<Value>,
@@ -23,7 +23,7 @@ impl Chunk {
2323
code: Vec::new(),
2424
constants: Vec::new(),
2525
lines: Vec::new(),
26-
max_register:0,
26+
max_register: 0,
2727
}
2828
}
2929

tundra/src/bytecode/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
pub mod chunk;
2-
pub mod opcode;
32
pub mod debug;
4-
pub mod value;
3+
pub mod opcode;
4+
pub mod value;

tundra/src/bytecode/opcode.rs

Lines changed: 73 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -40,55 +40,55 @@ pub enum OpCode {
4040
LessEqual(usize, usize, usize),
4141
NotEqual(usize, usize, usize),
4242
Call(usize, usize, usize),
43-
NewArray(usize, usize), // dest, length-reg
44-
GetIndex(usize, usize, usize), // dest, array-reg, index-reg
45-
SetIndex(usize, usize, usize), // array-reg, index-reg, value-reg
43+
NewArray(usize, usize), // dest, length-reg
44+
GetIndex(usize, usize, usize), // dest, array-reg, index-reg
45+
SetIndex(usize, usize, usize), // array-reg, index-reg, value-reg
4646
IncLoopIfLess(usize, usize, usize), // idx_reg, limit_reg, target_pc
4747
}
4848

4949
impl OpCode {
5050
/// A compact numeric tag for each variant (useful for a real byte-buffer backend)
5151
pub fn tag(&self) -> u8 {
5252
match self {
53-
OpCode::LoadConstant(_, _) => 0x01,
54-
OpCode::DefineGlobal(_, _) => 0x02,
55-
OpCode::GetGlobal(_, _) => 0x03,
56-
OpCode::SetGlobal(_, _) => 0x04,
57-
OpCode::GetLocal(_, _) => 0x05,
58-
OpCode::SetLocal(_, _) => 0x06,
59-
OpCode::JumpIfFalse(_, _) => 0x07,
60-
OpCode::Jump(_) => 0x08,
61-
OpCode::Loop(_) => 0x09,
62-
OpCode::Move(_, _) => 0x0A,
63-
OpCode::True(_) => 0x0B,
64-
OpCode::False(_) => 0x0C,
65-
OpCode::Pop(_) => 0x0D,
66-
OpCode::None(_) => 0x0E,
67-
OpCode::Add(_, _, _) => 0x0F,
68-
OpCode::Subtract(_, _, _) => 0x10,
69-
OpCode::Multiply(_, _, _) => 0x11,
70-
OpCode::Divide(_, _, _) => 0x12,
71-
OpCode::Exponentiate(_, _, _)=> 0x13,
72-
OpCode::IntDivide(_, _, _) => 0x14,
73-
OpCode::Return(_) => 0x15,
74-
OpCode::BitwiseNot(_, _) => 0x16,
75-
OpCode::Negate(_, _) => 0x17,
76-
OpCode::Print(_) => 0x18,
77-
OpCode::Equal(_, _, _) => 0x19,
78-
OpCode::Greater(_, _, _) => 0x1A,
79-
OpCode::Less(_, _, _) => 0x1B,
80-
OpCode::BitwiseAnd(_, _, _) => 0x1C,
81-
OpCode::BitwiseOr(_, _, _) => 0x1D,
82-
OpCode::BitwiseXor(_, _, _) => 0x1E,
83-
OpCode::GreaterEqual(_, _, _)=> 0x1F,
84-
OpCode::LessEqual(_, _, _) => 0x20,
85-
OpCode::NotEqual(_, _, _) => 0x21,
86-
OpCode::Call(_, _, _) => 0x22,
87-
OpCode::Mod(_, _, _) => 0x23,
88-
OpCode::NewArray(_, _) => 0x24,
89-
OpCode::GetIndex(_, _, _) => 0x25,
90-
OpCode::SetIndex(_, _, _) => 0x26,
91-
OpCode::IncLoopIfLess(_,_,_) => 0x27,
53+
OpCode::LoadConstant(_, _) => 0x01,
54+
OpCode::DefineGlobal(_, _) => 0x02,
55+
OpCode::GetGlobal(_, _) => 0x03,
56+
OpCode::SetGlobal(_, _) => 0x04,
57+
OpCode::GetLocal(_, _) => 0x05,
58+
OpCode::SetLocal(_, _) => 0x06,
59+
OpCode::JumpIfFalse(_, _) => 0x07,
60+
OpCode::Jump(_) => 0x08,
61+
OpCode::Loop(_) => 0x09,
62+
OpCode::Move(_, _) => 0x0A,
63+
OpCode::True(_) => 0x0B,
64+
OpCode::False(_) => 0x0C,
65+
OpCode::Pop(_) => 0x0D,
66+
OpCode::None(_) => 0x0E,
67+
OpCode::Add(_, _, _) => 0x0F,
68+
OpCode::Subtract(_, _, _) => 0x10,
69+
OpCode::Multiply(_, _, _) => 0x11,
70+
OpCode::Divide(_, _, _) => 0x12,
71+
OpCode::Exponentiate(_, _, _) => 0x13,
72+
OpCode::IntDivide(_, _, _) => 0x14,
73+
OpCode::Return(_) => 0x15,
74+
OpCode::BitwiseNot(_, _) => 0x16,
75+
OpCode::Negate(_, _) => 0x17,
76+
OpCode::Print(_) => 0x18,
77+
OpCode::Equal(_, _, _) => 0x19,
78+
OpCode::Greater(_, _, _) => 0x1A,
79+
OpCode::Less(_, _, _) => 0x1B,
80+
OpCode::BitwiseAnd(_, _, _) => 0x1C,
81+
OpCode::BitwiseOr(_, _, _) => 0x1D,
82+
OpCode::BitwiseXor(_, _, _) => 0x1E,
83+
OpCode::GreaterEqual(_, _, _) => 0x1F,
84+
OpCode::LessEqual(_, _, _) => 0x20,
85+
OpCode::NotEqual(_, _, _) => 0x21,
86+
OpCode::Call(_, _, _) => 0x22,
87+
OpCode::Mod(_, _, _) => 0x23,
88+
OpCode::NewArray(_, _) => 0x24,
89+
OpCode::GetIndex(_, _, _) => 0x25,
90+
OpCode::SetIndex(_, _, _) => 0x26,
91+
OpCode::IncLoopIfLess(_, _, _) => 0x27,
9292
}
9393
}
9494
///Convert to bytes (For Debugging)
@@ -119,8 +119,7 @@ impl OpCode {
119119
buf.extend(&(*r as u32).to_le_bytes());
120120
buf.extend(&(*idx as u32).to_le_bytes());
121121
}
122-
OpCode::Jump(idx)
123-
| OpCode::Loop(idx) => {
122+
OpCode::Jump(idx) | OpCode::Loop(idx) => {
124123
buf.extend(&(*idx as u32).to_le_bytes());
125124
}
126125
OpCode::True(r)
@@ -131,27 +130,27 @@ impl OpCode {
131130
| OpCode::Print(r) => {
132131
buf.extend(&(*r as u32).to_le_bytes());
133132
}
134-
OpCode::Add(d,a,b)
135-
| OpCode::Subtract(d,a,b)
136-
| OpCode::Multiply(d,a,b)
137-
| OpCode::Divide(d,a,b)
138-
| OpCode::Exponentiate(d,a,b)
139-
| OpCode::IntDivide(d,a,b)
140-
| OpCode::Mod(d,a,b)
141-
| OpCode::Equal(d,a,b)
142-
| OpCode::Greater(d,a,b)
143-
| OpCode::Less(d,a,b)
144-
| OpCode::BitwiseAnd(d,a,b)
145-
| OpCode::BitwiseOr(d,a,b)
146-
| OpCode::BitwiseXor(d,a,b)
147-
| OpCode::GreaterEqual(d,a,b)
148-
| OpCode::LessEqual(d,a,b)
149-
| OpCode::NotEqual(d,a,b) => {
133+
OpCode::Add(d, a, b)
134+
| OpCode::Subtract(d, a, b)
135+
| OpCode::Multiply(d, a, b)
136+
| OpCode::Divide(d, a, b)
137+
| OpCode::Exponentiate(d, a, b)
138+
| OpCode::IntDivide(d, a, b)
139+
| OpCode::Mod(d, a, b)
140+
| OpCode::Equal(d, a, b)
141+
| OpCode::Greater(d, a, b)
142+
| OpCode::Less(d, a, b)
143+
| OpCode::BitwiseAnd(d, a, b)
144+
| OpCode::BitwiseOr(d, a, b)
145+
| OpCode::BitwiseXor(d, a, b)
146+
| OpCode::GreaterEqual(d, a, b)
147+
| OpCode::LessEqual(d, a, b)
148+
| OpCode::NotEqual(d, a, b) => {
150149
buf.extend(&(*d as u32).to_le_bytes());
151150
buf.extend(&(*a as u32).to_le_bytes());
152151
buf.extend(&(*b as u32).to_le_bytes());
153152
}
154-
OpCode::Call(d,c,a) => {
153+
OpCode::Call(d, c, a) => {
155154
buf.extend(&(*d as u32).to_le_bytes());
156155
buf.extend(&(*c as u32).to_le_bytes());
157156
buf.extend(&(*a as u32).to_le_bytes());
@@ -160,8 +159,7 @@ impl OpCode {
160159
buf.extend(&(*dest as u32).to_le_bytes());
161160
buf.extend(&(*len as u32).to_le_bytes());
162161
}
163-
OpCode::GetIndex(d, arr, idx)
164-
| OpCode::SetIndex(d, arr, idx) => {
162+
OpCode::GetIndex(d, arr, idx) | OpCode::SetIndex(d, arr, idx) => {
165163
buf.extend(&(*d as u32).to_le_bytes());
166164
buf.extend(&(*arr as u32).to_le_bytes());
167165
buf.extend(&(*idx as u32).to_le_bytes());
@@ -185,12 +183,11 @@ impl OpCode {
185183
| True(d)
186184
| False(d)
187185
| Pop(d)
188-
| None(d) => vec![*d],
186+
| None(d) => vec![*d],
189187

190-
GetLocal(d, _)
191-
| SetLocal(d, _) => vec![*d],
188+
GetLocal(d, _) | SetLocal(d, _) => vec![*d],
192189

193-
SetGlobal(r,_) => vec![*r],
190+
SetGlobal(r, _) => vec![*r],
194191

195192
Add(d, a, b)
196193
| Subtract(d, a, b)
@@ -207,17 +204,17 @@ impl OpCode {
207204
| Greater(d, a, b)
208205
| GreaterEqual(d, a, b)
209206
| Less(d, a, b)
210-
| LessEqual(d, a, b) => vec![*d, *a, *b],
207+
| LessEqual(d, a, b) => vec![*d, *a, *b],
211208

212-
Move(d, s) => vec![*d, *s],
213-
Call(d, c, _) => vec![*d, *c],
214-
NewArray(d, l) => vec![*d, *l],
215-
GetIndex(d, a, i) => vec![*d, *a, *i],
216-
SetIndex(a, i, v) => vec![*a, *i, *v],
209+
Move(d, s) => vec![*d, *s],
210+
Call(d, c, _) => vec![*d, *c],
211+
NewArray(d, l) => vec![*d, *l],
212+
GetIndex(d, a, i) => vec![*d, *a, *i],
213+
SetIndex(a, i, v) => vec![*a, *i, *v],
217214

218-
JumpIfFalse(r, _) => vec![*r],
219-
Loop(_) | Jump(_) => vec![],
220-
_ => vec![],
215+
JumpIfFalse(r, _) => vec![*r],
216+
Loop(_) | Jump(_) => vec![],
217+
_ => vec![],
221218
}
222219
}
223220
}

0 commit comments

Comments
 (0)