use std::any::TypeId;
use std::error::Error;
use std::fmt::{Display, Formatter};
use cranelift_codegen::CodegenError;
use edlc_core::prelude::mir_type::MirTypeId;
use cranelift_module::ModuleError;
use crate::prelude::RuntimeId;
#[derive(Debug)]
pub enum JITErrorType {
TypeMismatch(MirTypeId, String),
ModuleErr(ModuleError),
MissingReturnType(String),
InvalidRuntimeData(RuntimeId),
RuntimeDataState(RuntimeId, String),
RuntimeError(String),
RuntimePanic(Vec<String>),
NoRustRepr(MirTypeId),
RustTypeMismatch(TypeId, TypeId),
Codegen(CodegenError),
Gimli(gimli::write::Error),
}
#[derive(Debug)]
pub struct JITError {
pub ty: JITErrorType
}
impl Display for JITError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl Error for JITError {}
impl From<ModuleError> for JITError {
fn from(e: ModuleError) -> Self {
JITError { ty: JITErrorType::ModuleErr(e) }
}
}