microimprovements to oxidizer

This commit is contained in:
Daniella 2024-08-28 23:54:16 +02:00
parent fbd6d9d43f
commit 9b90d8e516
3 changed files with 13 additions and 6 deletions

View file

@ -7,7 +7,7 @@ fn main() {
let arg = &args
.next()
.unwrap_or_else(|| find_in_splpath("repl.spl").expect("no file to be run"));
if arg == "--build" || arg == "--run" {
if arg == "--build" || arg == "--run" || arg == "--buildrun" {
let file = args.next().unwrap();
let data = fs::read_to_string(file.clone()).expect("unable to read specified file");
let build_only = arg == "--build";
@ -29,14 +29,17 @@ fn main() {
if build_only {
println!("Building...");
}
let app = builder.build(build_only).unwrap();
let app = builder.build(build_only || arg == "--buildrun").unwrap();
if build_only {
println!("Built! Binary is {}", app.get_binary());
} else {
let mut args: Vec<String> = args.collect();
args.insert(0, file);
let mut command = app.execute(args).unwrap();
app.delete();
if arg != "--buildrun" {
println!("spl: cleaning temporary dir (run with --buildrun to keep)");
app.delete();
}
command.wait().unwrap();
}

View file

@ -146,16 +146,16 @@ impl RustAppBuilder {
let mut code = String::new();
for func in self.rust_functions.into_iter().enumerate() {
code += &format!(
"fn spl_oxidizer_{}(stack: &mut Stack) -> OError {{ {} Ok(()) }}",
"fn spl_oxidizer_{}(stack: &mut Stack) -> OError {{ {} Ok(()) }}\n",
func.0, func.1.content
);
runtime_init += &format!(
"rt.native_functions.insert({:?}, (0, FuncImpl::Native(spl_oxidizer_{})));",
"rt.native_functions.insert({:?}, (0, FuncImpl::Native(spl_oxidizer_{})));\n",
func.1.fn_name, func.0
)
}
for (name, data) in self.to_embed.into_iter() {
runtime_init += &format!("rt.embedded_files.insert({:?}, {:?});", name, data);
runtime_init += &format!("rt.embedded_files.insert({:?}, {:?});\n", name, data);
}
fs::write(
format!("{tmp}/spl-{name}/src/main.rs"),

View file

@ -4,12 +4,16 @@ use super::RustFunction;
/// Parses a #-expression and returns the string to be inserted in its place.
fn parse_hash_expr(s: String, name: &str) -> String {
if &s == "drop" {
return "let _ = stack.pop();".to_owned();
}
if &s == "pop" {
return "stack.pop().lock_ro()".to_owned();
}
if &s == "pop_mut" {
return "stack.pop().lock()".to_owned();
}
// TODO: broken. fix.
if &s == "pop:Array" {
return format!("{{ require_array_on_stack!(tmp, stack, {name:?}); tmp }}");
}