implement an api for errors

master
Able 2023-03-30 02:35:02 -05:00
parent a3d61ba0a0
commit b283da1b9a
4 changed files with 50 additions and 19 deletions

View File

@ -1,4 +1,4 @@
use core::arch::asm;
use crate::{exit::exit, Error};
#[no_mangle]
unsafe extern "C" fn _start() -> ! {
@ -8,14 +8,24 @@ unsafe extern "C" fn _start() -> ! {
// TODO: grab and pass arguments to main
main(0, core::ptr::null());
let ret = main(0, core::ptr::null());
// asm!(
// "syscall",
// in("rax") 60,
// in("rdi") 0,
// options(noreturn)
// );
// TODO: implement exiting properly and provide a public exit function
let err_obj = match ret {
0 => None,
1 => {
// TODO: Get errorID location and error message
Some(Error {
error_id: 123456789,
location: None,
a_lil_message_as_a_treat: "Unknown Cause",
})
}
_ => panic!("Program returned an invalid isize"),
};
exit(err_obj);
}
#[lang = "start"]

View File

@ -0,0 +1,4 @@
use crate::Error;
/// Exit a program
pub fn exit(error_code: Option<Error>) -> ! {}

View File

@ -4,10 +4,11 @@
mod entry;
pub mod env;
pub mod exit;
pub mod io;
pub mod panic;
use core::arch::asm;
use core::{arch::asm, fmt::Display};
#[prelude_import]
pub use prelude::rust_2021::*;
@ -49,3 +50,29 @@ pub fn print_char(c: char) {
);
}
}
#[derive(Debug)]
pub struct LocationInFile<'a> {
// TODO: replace &str with ableOS path
file_path: &'a str,
line: u16,
column: u16,
}
impl<'a> Display for Error<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{}{}{}", self.file_path, self.line, self.column)
}
}
pub struct Error<'a> {
error_id: u128,
// Optional location of the error
location: Option<LocationInFile<'a>>,
a_lil_message_as_a_treat: &'a str,
}
impl<'a> Display for Error<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "EID: {}\nSRC: {}", self.error_id, self.location)
}
}

View File

@ -4,15 +4,5 @@ use core::arch::asm;
fn panic_handler(pinfo: &core::panic::PanicInfo) -> ! {
print("PANIC!\n");
// #[cfg(unix)]
unsafe {
asm!(
"syscall",
in("rax") 231,
in("rdi") 1,
options(noreturn)
);
}
loop {}
}