Skip to main content

clr_assembler/program/
pool.rs

1use std::collections::HashMap;
2
3/// CLR 常量池,用于存储各种元数据
4#[derive(Debug, Clone, Default)]
5pub struct ClrConstantPool {
6    /// 字符串池 (#Strings)
7    pub strings: HashMap<String, u32>,
8    /// 二进制大对象池 (#Blob)
9    pub blobs: HashMap<Vec<u8>, u32>,
10    /// GUID 池 (#GUID)
11    pub guids: HashMap<[u8; 16], u32>,
12    /// 用户字符串池 (#US)
13    pub user_strings: HashMap<String, u32>,
14}
15
16impl ClrConstantPool {
17    /// 创建新的常量池
18    pub fn new() -> Self {
19        Self::default()
20    }
21
22    /// 添加字符串到字符串池
23    pub fn add_string(&mut self, s: String) -> u32 {
24        let next_index = self.strings.len() as u32;
25        *self.strings.entry(s).or_insert(next_index)
26    }
27
28    /// 添加二进制数据到 Blob 池
29    pub fn add_blob(&mut self, b: Vec<u8>) -> u32 {
30        let next_index = self.blobs.len() as u32;
31        *self.blobs.entry(b).or_insert(next_index)
32    }
33
34    /// 添加 GUID 到 GUID 池
35    pub fn add_guid(&mut self, g: [u8; 16]) -> u32 {
36        let next_index = self.guids.len() as u32;
37        *self.guids.entry(g).or_insert(next_index)
38    }
39
40    /// 添加用户字符串到用户字符串池
41    pub fn add_user_string(&mut self, s: String) -> u32 {
42        let next_index = self.user_strings.len() as u32;
43        *self.user_strings.entry(s).or_insert(next_index)
44    }
45}