});
},
+ 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;
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) });
},
_ => {
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>> {
"-" => IR::SubtractU64,
"*" => IR::MultiplyU64,
"/" => IR::DivideU64,
+ "|" => IR::BitwiseOr,
"import" => IR::Import,
"sys0" => IR::Sys0,
"sys1" => IR::Sys1,
}
},
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),