]> rethought.computer Git - sorel-lang.git/commitdiff
store-and-more-tests keep/9f2e929375557eaec86675dd41f3fc1b536a85e8
authorBryan English <bryan@rethought.computer>
Fri, 6 Feb 2026 03:55:59 +0000 (22:55 -0500)
committerBryan English <bryan@rethought.computer>
Tue, 10 Feb 2026 04:08:54 +0000 (04:08 +0000)
rel-lang/sorel-ir/src/lib.rs
rel-lang/sorelc/src/ir.rs
rel-lang/sorelc/src/riscv_asm_codegen.rs
rel-lang/stdlib/process.sorel [new file with mode: 0644]
rel-lang/tests/assert.sorel [new file with mode: 0644]
rel-lang/tests/test1.sorel

index 919a08fa13987dcf57c9a3c0465d4ba1470afb7f..1a3ec276942dc1be1c8f81dfc9c5be2005a12004 100644 (file)
@@ -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
index d38d7f783c04a9e423f6c33dfb8f406a2993a098..324ca6dd210efa7132ec3ea85d937ad8ec4e1c62 100644 (file)
@@ -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<Rc<IRModule>> {
         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,
index efc15214aee7d7570931c8afcfb231045e430e87..144e8c4d0d296140acaf3d33c412df1c3b345dbf 100644 (file)
@@ -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 (file)
index 0000000..73a7008
--- /dev/null
@@ -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 (file)
index 0000000..8cfe073
--- /dev/null
@@ -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
+;
index 0adf96ad06dc9d41bd71f7dd6e55b0bd70ddff01..6f5571ee05934dfb087536b59dce96984600ada7 100644 (file)
@@ -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