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 {}