-
Notifications
You must be signed in to change notification settings - Fork 26
[WIP] Add a proper REPL #464
Changes from 1 commit
89dc56e
c16d59b
3b00ec7
c2ef7e7
83668a2
fd7696c
cba41e5
0ea9c91
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,14 +2,16 @@ mod commands; | |||||||||||||||||||||||||||
mod helper; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
use commands::CommandError; | ||||||||||||||||||||||||||||
use cranelift_module::Module; | ||||||||||||||||||||||||||||
use cranelift_simplejit::SimpleJITBackend; | ||||||||||||||||||||||||||||
use helper::{CommandHinter, ReplHelper}; | ||||||||||||||||||||||||||||
use rustyline::{ | ||||||||||||||||||||||||||||
error::ReadlineError, highlight::MatchingBracketHighlighter, | ||||||||||||||||||||||||||||
validate::MatchingBracketValidator, CompletionType, Config, EditMode, Editor, | ||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
use saltwater::{analyze, check_semantics, initialize_jit_module, Opt, Parser, PureAnalyzer}; | ||||||||||||||||||||||||||||
use saltwater::{ | ||||||||||||||||||||||||||||
analyze, | ||||||||||||||||||||||||||||
data::{self, hir, types}, | ||||||||||||||||||||||||||||
initialize_jit_module, ir, Opt, Parser, PureAnalyzer, JIT, | ||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const PROMPT: &str = ">> "; | ||||||||||||||||||||||||||||
const COMMAND_PREFIX: &str = ":"; | ||||||||||||||||||||||||||||
|
@@ -28,7 +30,6 @@ pub struct Repl<'s> { | |||||||||||||||||||||||||||
prompt: &'s str, | ||||||||||||||||||||||||||||
opt: Opt, | ||||||||||||||||||||||||||||
code: String, | ||||||||||||||||||||||||||||
module: Module<SimpleJITBackend>, | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
impl<'s> Repl<'s> { | ||||||||||||||||||||||||||||
|
@@ -54,7 +55,6 @@ impl<'s> Repl<'s> { | |||||||||||||||||||||||||||
prefix: COMMAND_PREFIX, | ||||||||||||||||||||||||||||
prompt: PROMPT, | ||||||||||||||||||||||||||||
code: String::new(), | ||||||||||||||||||||||||||||
module: initialize_jit_module(), | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
|
@@ -97,6 +97,56 @@ impl<'s> Repl<'s> { | |||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
fn execute_code(&mut self, code: &str) { | ||||||||||||||||||||||||||||
let program = check_semantics(code, self.opt.clone()); | ||||||||||||||||||||||||||||
let module = initialize_jit_module(); | ||||||||||||||||||||||||||||
let expr = match analyze(code, Parser::expr, PureAnalyzer::expr) { | ||||||||||||||||||||||||||||
Ok(mut expr) => { | ||||||||||||||||||||||||||||
expr.ctype = types::Type::Int(true); | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This doesn't look right. What's this meant to do? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, this crashes on strings:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Instead you could use a function name other than There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That's a good idea There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I had this code there, because otherwise I got an error from cranelift that it expected an i32 but got i64.
|
||||||||||||||||||||||||||||
expr | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
Err(err) => { | ||||||||||||||||||||||||||||
println!("error: {}", err.data); | ||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
let function_type = types::FunctionType { | ||||||||||||||||||||||||||||
return_type: Box::new(types::Type::Int(true)), | ||||||||||||||||||||||||||||
params: vec![], | ||||||||||||||||||||||||||||
varargs: false, | ||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
let qualifiers = hir::Qualifiers { | ||||||||||||||||||||||||||||
volatile: false, | ||||||||||||||||||||||||||||
c_const: false, | ||||||||||||||||||||||||||||
func: hir::FunctionQualifiers { | ||||||||||||||||||||||||||||
inline: false, | ||||||||||||||||||||||||||||
no_return: false, | ||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
Comment on lines
+116
to
+123
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
let main = hir::Variable { | ||||||||||||||||||||||||||||
ctype: types::Type::Function(function_type), | ||||||||||||||||||||||||||||
storage_class: data::StorageClass::Extern, | ||||||||||||||||||||||||||||
qualifiers, | ||||||||||||||||||||||||||||
id: saltwater::InternedStr::get_or_intern("main"), | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
let span = expr.location; | ||||||||||||||||||||||||||||
let stmt = span.with(hir::StmtType::Return(Some(expr))); | ||||||||||||||||||||||||||||
let init = hir::Initializer::FunctionBody(vec![stmt]); | ||||||||||||||||||||||||||||
let decl = hir::Declaration { | ||||||||||||||||||||||||||||
symbol: main.insert(), | ||||||||||||||||||||||||||||
init: Some(init), | ||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
let (result, _warns) = ir::compile(module, vec![span.with(decl)], false); | ||||||||||||||||||||||||||||
Comment on lines
+101
to
+139
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This looks useful on its own, can you make it a function in |
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if let Err(err) = result { | ||||||||||||||||||||||||||||
println!("failed to compile: {}", err.data); | ||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
let module = result.unwrap(); | ||||||||||||||||||||||||||||
Comment on lines
+141
to
+146
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Try to avoid
Suggested change
|
||||||||||||||||||||||||||||
let mut jit = JIT::from(module); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
let result = unsafe { jit.run_main() }.unwrap(); | ||||||||||||||||||||||||||||
println!("result: {}", result); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ups 😅