From 9f2e929375557eaec86675dd41f3fc1b536a85e8 Mon Sep 17 00:00:00 2001 From: Bryan English Date: Thu, 5 Feb 2026 22:55:59 -0500 Subject: [PATCH] store-and-more-tests --- rel-lang/sorel-ir/src/lib.rs | 3 +++ rel-lang/sorelc/src/ir.rs | 8 ++++++++ rel-lang/sorelc/src/riscv_asm_codegen.rs | 14 +++++++++++++- rel-lang/stdlib/process.sorel | 8 ++++++++ rel-lang/tests/assert.sorel | 14 ++++++++++++++ rel-lang/tests/test1.sorel | 3 +++ 6 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 rel-lang/stdlib/process.sorel create mode 100644 rel-lang/tests/assert.sorel diff --git a/rel-lang/sorel-ir/src/lib.rs b/rel-lang/sorel-ir/src/lib.rs index 919a08f..1a3ec27 100644 --- a/rel-lang/sorel-ir/src/lib.rs +++ b/rel-lang/sorel-ir/src/lib.rs @@ -16,6 +16,9 @@ pub enum IR { Load16, Load32, Store, // ! ( x addr -- ) -- Store x at addr + Store8, + Store16, + Store32, // These ones might not be inlined, but should be built-in, so a compiler might // turn this into `Call(String)` before translating to assembly/machine-code, but diff --git a/rel-lang/sorelc/src/ir.rs b/rel-lang/sorelc/src/ir.rs index d38d7f7..324ca6d 100644 --- a/rel-lang/sorelc/src/ir.rs +++ b/rel-lang/sorelc/src/ir.rs @@ -64,6 +64,7 @@ fn std_import(specifier: &str) -> Result<&str> { "std:mem" => Ok(include_str!("../../stdlib/mem.sorel")), "std:out" => Ok(include_str!("../../stdlib/out.sorel")), "std:string" => Ok(include_str!("../../stdlib/string.sorel")), + "std:process" => Ok(include_str!("../../stdlib/process.sorel")), _ => bail!("{} is not a standard library module", specifier), } } @@ -71,6 +72,10 @@ fn std_import(specifier: &str) -> Result<&str> { impl ImportTree { fn import(&mut self, importer_dir: &PathBuf, specifier: &str, is_entrypoint: bool) -> Result> { Ok(if specifier.starts_with("std:") { + if self.all_modules.contains_key(specifier) { + let module = self.all_modules.get(specifier).unwrap().clone(); + return Ok(module); + } let contents = std_import(specifier)?; let parsed = &Module::parse(tokenize(&contents)?, is_entrypoint)?; let module = self.generate_internal(None, Some(specifier.to_string()), parsed); @@ -153,6 +158,9 @@ impl ImportTree { "@:16" => IR::Load16, "@:32" => IR::Load32, "!" => IR::Store, + "!:8" => IR::Store8, + "!:16" => IR::Store16, + "!:32" => IR::Store32, "dup" => IR::Dup, "swap" => IR::Swap, "drop" => IR::Drop, diff --git a/rel-lang/sorelc/src/riscv_asm_codegen.rs b/rel-lang/sorelc/src/riscv_asm_codegen.rs index efc1521..144e8c4 100644 --- a/rel-lang/sorelc/src/riscv_asm_codegen.rs +++ b/rel-lang/sorelc/src/riscv_asm_codegen.rs @@ -195,9 +195,21 @@ impl<'a> CodeGen<'a> { self.line("ld t0, 0(t0)"); // deref pointer in t0 to t0 self.copy_to_top_of_stack("t0"); }, + IR::Store8 => { // ( x addr -- ) + self.pop_some_to("t0 t1"); + self.line("sbu t0, 0(t1)"); // store x at addr + }, + IR::Store16 => { // ( x addr -- ) + self.pop_some_to("t0 t1"); + self.line("shu t0, 0(t1)"); // store x at addr + }, + IR::Store32 => { // ( x addr -- ) + self.pop_some_to("t0 t1"); + self.line("shu t0, 0(t1)"); // store x at addr + }, IR::Store => { // ( x addr -- ) self.pop_some_to("t0 t1"); - self.line("sd t0, 0(t1)"); // store x at addr + self.line("sd t0, 0(t1)"); // store x at addr }, IR::StackPush(num) => { self.label(format!("# stackpush {}", num)); diff --git a/rel-lang/stdlib/process.sorel b/rel-lang/stdlib/process.sorel new file mode 100644 index 0000000..73a7008 --- /dev/null +++ b/rel-lang/stdlib/process.sorel @@ -0,0 +1,8 @@ +\ vim: filetype=forth + +export exit + +: exit ( code -- ) + 93 + sys1 +; diff --git a/rel-lang/tests/assert.sorel b/rel-lang/tests/assert.sorel new file mode 100644 index 0000000..8cfe073 --- /dev/null +++ b/rel-lang/tests/assert.sorel @@ -0,0 +1,14 @@ +\ vim: filetype=forth + +import "std:process" +import "std:out" + +export assert + +: assert ( x -- ) + if + "pass\n" puts drop + else + 1 exit + endif +; diff --git a/rel-lang/tests/test1.sorel b/rel-lang/tests/test1.sorel index 0adf96a..6f5571e 100644 --- a/rel-lang/tests/test1.sorel +++ b/rel-lang/tests/test1.sorel @@ -1,6 +1,7 @@ \ vim: filetype=forth import "std:out" +import "./assert.sorel" "Hello, World! \n" puts drop @@ -12,3 +13,5 @@ import "std:mem" 64 alloc free + +\ 0 assert -- 2.43.0