From 66107b4310d65b7faab0704bb1fc8311da87aa96 Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Fri, 29 Nov 2024 19:13:30 -0600 Subject: [PATCH] Begin work on write_module. --- src/vm/module.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/vm/module.rs b/src/vm/module.rs index 1b4de73..6595fc7 100644 --- a/src/vm/module.rs +++ b/src/vm/module.rs @@ -3,8 +3,13 @@ use std::collections::HashMap; use std::io::Read; pub const DEIMOS_MAGIC_NUMBER: u64 = 0x00_00_64_65_69_6d_6f_73; // ascii 'deimos' +const DEIMOS_MAGIC_STRING: [u8; 6] = [0x64, 0x65, 0x69, 0x6d, 0x6f, 0x73]; // ascii 'deimos' + +pub const VERSION_STRING: &str = "0.1.0"; pub struct DmModule { + name: String, + version: String, constants: HashMap, functions: HashMap, } @@ -35,6 +40,47 @@ struct DmSymbol { address: u32, } +macro_rules! push_byte_array { + ( $dest: expr, $arr: expr ) => { + for b in $arr { + $dest.push(b); + } + }; +} + +macro_rules! push_number_le { + ( $dest: expr, $num: expr ) => { + for b in $num.to_le_bytes() { + $dest.push(b); + } + }; +} + +macro_rules! push_string { + ( $dest: expr, $s: expr ) => { + for b in $s.len().to_le_bytes() { + $dest.push(b); + } + for b in $s.bytes() { + $dest.push(b); + } + }; +} + +pub fn write_module(module: DmModule) -> Vec { + // Push magic number + let mut result: Vec = Vec::new(); + push_byte_array!(result, DEIMOS_MAGIC_STRING); + + // Push version string + push_string!(result, module.version); + + // Push module name length, little endian + push_string!(result, module.name); + + result +} + pub fn load_module(bytes: &[u8]) -> Result { let mut ip: usize = 0; // Check for magic number at bytes 0..5 @@ -62,6 +108,9 @@ pub fn load_module(bytes: &[u8]) -> Result { return Err(String::from("Invalid Deimos module version.")); } + // TODO: extract module name + + // Holder for Symbols we will extract from the symbol table bytes let mut symbols: Vec = Vec::new();