From 1a6c65dc6fac858f155a1491b4de814c00627935 Mon Sep 17 00:00:00 2001 From: Bryan English Date: Sat, 10 Jan 2026 23:24:38 -0500 Subject: [PATCH] a working allocator --- hylo-lang/examples/alloc.hylo | 16 ++++++++++++++++ hylo-lang/hylo-interpret/src/lib.rs | 18 ++++++++++++------ hylo-lang/hylo-ir/src/lib.rs | 1 + hylo-lang/hyloc/src/ir.rs | 10 ++++++---- 4 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 hylo-lang/examples/alloc.hylo diff --git a/hylo-lang/examples/alloc.hylo b/hylo-lang/examples/alloc.hylo new file mode 100644 index 0000000..a73a1af --- /dev/null +++ b/hylo-lang/examples/alloc.hylo @@ -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 diff --git a/hylo-lang/hylo-interpret/src/lib.rs b/hylo-lang/hylo-interpret/src/lib.rs index 0c725d6..08b8721 100644 --- a/hylo-lang/hylo-interpret/src/lib.rs +++ b/hylo-lang/hylo-interpret/src/lib.rs @@ -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) }); }, _ => { diff --git a/hylo-lang/hylo-ir/src/lib.rs b/hylo-lang/hylo-ir/src/lib.rs index 906a57c..a8aba87 100644 --- a/hylo-lang/hylo-ir/src/lib.rs +++ b/hylo-lang/hylo-ir/src/lib.rs @@ -26,6 +26,7 @@ pub enum IR { DivideU64, Equals, GreaterThan, + BitwiseOr, Dup, Swap, Drop, diff --git a/hylo-lang/hyloc/src/ir.rs b/hylo-lang/hyloc/src/ir.rs index cc2f422..c96ee9a 100644 --- a/hylo-lang/hyloc/src/ir.rs +++ b/hylo-lang/hyloc/src/ir.rs @@ -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, is_entrypoint: bool) -> Result> { @@ -102,6 +103,7 @@ fn generate_internal(path: PathBuf, module: &Module, imported: &mut HashSet 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 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), -- 2.43.0