]> rethought.computer Git - sorel-lang.git/commitdiff
a working allocator keep/1a6c65dc6fac858f155a1491b4de814c00627935
authorBryan English <bryan@rethought.computer>
Sun, 11 Jan 2026 04:24:38 +0000 (23:24 -0500)
committerBryan English <bryan@rethought.computer>
Tue, 10 Feb 2026 04:08:54 +0000 (04:08 +0000)
hylo-lang/examples/alloc.hylo [new file with mode: 0644]
hylo-lang/hylo-interpret/src/lib.rs
hylo-lang/hylo-ir/src/lib.rs
hylo-lang/hyloc/src/ir.rs

diff --git a/hylo-lang/examples/alloc.hylo b/hylo-lang/examples/alloc.hylo
new file mode 100644 (file)
index 0000000..a73a1af
--- /dev/null
@@ -0,0 +1,16 @@
+: mmap 9 sys6 ;
+
+: PROT_READ 1 ;
+: PROT_WRITE 2 ;
+: MAP_PRIVATE 2 ;
+: MAP_ANONYMOUS 32 ;
+
+: ALLOC_PROT PROT_READ PROT_WRITE | ;
+: ALLOC_MAP MAP_PRIVATE MAP_ANONYMOUS | ;
+
+: alloc 0 swap ALLOC_PROT ALLOC_MAP -1:i16 0 mmap ;
+
+1024 alloc
+putn
+swap
+putn
index 0c725d6fbdfa7e5b75db598705debe8b58a212fc..08b87214a0072deb2e5535cef899019d00a19e1c 100644 (file)
@@ -135,6 +135,11 @@ impl<'a> Interpreter<'a> {
                         });
 
                     },
+                    IR::BitwiseOr => {
+                        let b = self.ds_pop()?;
+                        let a = self.ds_pop()?;
+                        self.data_stack.push(a | b);
+                    }
                     IR::If => {
                         if self.ds_pop()? != 0 {
                             looking_for_endif = true;
@@ -146,48 +151,49 @@ impl<'a> Interpreter<'a> {
                         self.process_syscall_result(unsafe { syscall!(call_num) });
                     },
                     IR::Sys1 => {
-                        let a1 = self.ds_pop()?;
                         let call_num = Sysno::from(self.ds_pop()? as i32);
+                        let a1 = self.ds_pop()?;
                         self.process_syscall_result(unsafe { syscall!(call_num, a1) });
                     },
                     IR::Sys2 => {
+                        let call_num = Sysno::from(self.ds_pop()? as i32);
                         let a2 = self.ds_pop()?;
                         let a1 = self.ds_pop()?;
-                        let call_num = Sysno::from(self.ds_pop()? as i32);
                         self.process_syscall_result(unsafe { syscall!(call_num, a1, a2) });
                     },
                     IR::Sys3 => {
+                        let call_num = Sysno::from(self.ds_pop()? as i32);
                         let a3 = self.ds_pop()?;
                         let a2 = self.ds_pop()?;
                         let a1 = self.ds_pop()?;
-                        let call_num = Sysno::from(self.ds_pop()? as i32);
                         self.process_syscall_result(unsafe { syscall!(call_num, a1, a2, a3) });
                     },
                     IR::Sys4 => {
+                        let call_num = Sysno::from(self.ds_pop()? as i32);
                         let a4 = self.ds_pop()?;
                         let a3 = self.ds_pop()?;
                         let a2 = self.ds_pop()?;
                         let a1 = self.ds_pop()?;
-                        let call_num = Sysno::from(self.ds_pop()? as i32);
                         self.process_syscall_result(unsafe { syscall!(call_num, a1, a2, a3, a4) });
                     },
                     IR::Sys5 => {
+                        let call_num = Sysno::from(self.ds_pop()? as i32);
                         let a5 = self.ds_pop()?;
                         let a4 = self.ds_pop()?;
                         let a3 = self.ds_pop()?;
                         let a2 = self.ds_pop()?;
                         let a1 = self.ds_pop()?;
-                        let call_num = Sysno::from(self.ds_pop()? as i32);
                         self.process_syscall_result(unsafe { syscall!(call_num, a1, a2, a3, a4, a5) });
                     },
                     IR::Sys6 => {
+                        println!("stack: {:?}", self.data_stack);
+                        let call_num = Sysno::from(self.ds_pop()? as i32);
                         let a6 = self.ds_pop()?;
                         let a5 = self.ds_pop()?;
                         let a4 = self.ds_pop()?;
                         let a3 = self.ds_pop()?;
                         let a2 = self.ds_pop()?;
                         let a1 = self.ds_pop()?;
-                        let call_num = Sysno::from(self.ds_pop()? as i32);
                         self.process_syscall_result(unsafe { syscall!(call_num, a1, a2, a3, a4, a5, a6) });
                     },
                     _ => {
index 906a57c8627fb92cdf35195c0bbec03a5508b557..a8aba878df6c31af681fafe7c317509ab4a41cc9 100644 (file)
@@ -26,6 +26,7 @@ pub enum IR {
     DivideU64,
     Equals,
     GreaterThan,
+    BitwiseOr,
     Dup,
     Swap,
     Drop,
index cc2f422bdb4a4e0fdfaed0003531c9ebfdab77b7..c96ee9a842db4b6615c9da7f0836eda3a284bed2 100644 (file)
@@ -8,7 +8,8 @@ use std::path::PathBuf;
 use anyhow::{Result, anyhow};
 
 macro_rules! push_num {
-    ($num:ident) => { IR::StackPush(*$num as u64) }
+    ($num:ident) => { IR::StackPush(*$num as u64) };
+    ($num:ident, $num_typ:ty) => { IR::StackPush(*$num as $num_typ as u64) };
 }
 
 fn import(importer_dir: &PathBuf, specifier: &str, imported: &mut HashSet<PathBuf>, is_entrypoint: bool) -> Result<Option<ModuleWithImports>> {
@@ -102,6 +103,7 @@ fn generate_internal(path: PathBuf, module: &Module, imported: &mut HashSet<Path
                         "-" => IR::SubtractU64,
                         "*" => IR::MultiplyU64,
                         "/" => IR::DivideU64,
+                        "|" => IR::BitwiseOr,
                         "import" => IR::Import,
                         "sys0" => IR::Sys0,
                         "sys1" => IR::Sys1,
@@ -135,11 +137,11 @@ fn generate_internal(path: PathBuf, module: &Module, imported: &mut HashSet<Path
                     }
                 },
                 Token::NumU8(num) => push_num!(num),
-                Token::NumI8(num) => push_num!(num),
+                Token::NumI8(num) => push_num!(num, u8),
                 Token::NumU16(num) => push_num!(num),
-                Token::NumI16(num) => push_num!(num),
+                Token::NumI16(num) => push_num!(num, u16),
                 Token::NumU32(num) => push_num!(num),
-                Token::NumI32(num) => push_num!(num),
+                Token::NumI32(num) => push_num!(num, u32),
                 Token::NumU64(num) => push_num!(num),
                 Token::NumI64(num) => push_num!(num),
                 Token::NumF32(num) => push_num!(num),