jetcrab\memory/
error.rs

1use crate::ast::Position;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub enum MemoryError {
6    AllocationError {
7        message: String,
8        size: usize,
9        position: Option<Position>,
10    },
11
12    OutOfMemory {
13        requested: usize,
14        available: usize,
15        position: Option<Position>,
16    },
17
18    GarbageCollectionError {
19        message: String,
20        position: Option<Position>,
21    },
22
23    InvalidPointer {
24        pointer: usize,
25        message: String,
26        position: Option<Position>,
27    },
28
29    MemoryCorruption {
30        address: usize,
31        message: String,
32        position: Option<Position>,
33    },
34
35    HeapFull {
36        message: String,
37        position: Option<Position>,
38    },
39
40    InvalidAllocation {
41        size: usize,
42        alignment: usize,
43        position: Option<Position>,
44    },
45
46    FragmentationError {
47        message: String,
48        position: Option<Position>,
49    },
50}
51
52impl std::fmt::Display for MemoryError {
53    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
54        match self {
55            MemoryError::AllocationError {
56                message,
57                size,
58                position,
59            } => {
60                write!(f, "Memory allocation error ({size} bytes): {message}")?;
61                if let Some(pos) = position {
62                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
63                }
64                Ok(())
65            }
66            MemoryError::OutOfMemory {
67                requested,
68                available,
69                position,
70            } => {
71                write!(
72                    f,
73                    "Out of memory: requested {requested} bytes, available {available} bytes",
74                )?;
75                if let Some(pos) = position {
76                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
77                }
78                Ok(())
79            }
80            MemoryError::GarbageCollectionError { message, position } => {
81                write!(f, "Garbage collection error: {message}")?;
82                if let Some(pos) = position {
83                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
84                }
85                Ok(())
86            }
87            MemoryError::InvalidPointer {
88                pointer,
89                message,
90                position,
91            } => {
92                write!(f, "Invalid pointer 0x{pointer:x}: {message}")?;
93                if let Some(pos) = position {
94                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
95                }
96                Ok(())
97            }
98            MemoryError::MemoryCorruption {
99                address,
100                message,
101                position,
102            } => {
103                write!(f, "Memory corruption at 0x{address:x}: {message}")?;
104                if let Some(pos) = position {
105                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
106                }
107                Ok(())
108            }
109            MemoryError::HeapFull { message, position } => {
110                write!(f, "Heap full: {message}")?;
111                if let Some(pos) = position {
112                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
113                }
114                Ok(())
115            }
116            MemoryError::InvalidAllocation {
117                size,
118                alignment,
119                position,
120            } => {
121                write!(
122                    f,
123                    "Invalid allocation: size {size} bytes, alignment {alignment} bytes",
124                )?;
125                if let Some(pos) = position {
126                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
127                }
128                Ok(())
129            }
130            MemoryError::FragmentationError { message, position } => {
131                write!(f, "Memory fragmentation error: {message}")?;
132                if let Some(pos) = position {
133                    write!(f, " at line {}, column {}", pos.line, pos.column)?;
134                }
135                Ok(())
136            }
137        }
138    }
139}
140
141impl std::error::Error for MemoryError {}