Skip to main content

nyar_assembler/program/
types.rs

1use gaia_types::{GaiaError, QualifiedName};
2use serde::{Deserialize, Serialize};
3
4/// Nyar 程序(用于 Assembler 构建的高层对象)
5#[derive(Debug, Clone, Default)]
6pub struct NyarProgram {
7    /// 核心模块数据
8    pub module: NyarModule,
9}
10
11impl NyarProgram {
12    /// 创建一个新的 Nyar 程序构建器
13    pub fn new() -> Self {
14        Self::default()
15    }
16
17    /// 设置模块名称
18    pub fn set_name(&mut self, name: QualifiedName) {
19        self.module.name = name;
20    }
21
22    /// 获取构建完成的 Nyar 模块
23    pub fn into_module(self) -> NyarModule {
24        self.module
25    }
26}
27
28/// 异常处理器
29#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
30pub struct NyarHandler {
31    pub start: u32,
32    pub end: u32,
33    pub target: u32,
34    pub error_type: u16,
35}
36
37#[derive(Debug, Serialize, Deserialize)]
38pub struct NyarChunk {
39    pub code: Vec<u8>,
40    pub locals: u16,
41    pub upvalues: u16,
42    pub max_stack: u16,
43    pub handlers: Vec<NyarHandler>,
44    pub lines: Vec<(u32, u32)>,
45}
46
47impl Clone for NyarChunk {
48    fn clone(&self) -> Self {
49        Self {
50            code: self.code.clone(),
51            locals: self.locals,
52            upvalues: self.upvalues,
53            max_stack: self.max_stack,
54            handlers: self.handlers.clone(),
55            lines: self.lines.clone(),
56        }
57    }
58}
59
60impl Default for NyarChunk {
61    fn default() -> Self {
62        Self { code: Vec::new(), locals: 0, upvalues: 0, max_stack: 0, handlers: Vec::new(), lines: Vec::new() }
63    }
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct NyarModule {
68    pub name: QualifiedName,
69    pub version: u16,
70    pub flags: u32,
71    pub timestamp: u64,
72    pub constants: Vec<NyarConstant>,
73    pub effects: Vec<QualifiedName>,
74    pub chunks: Vec<NyarChunk>,
75    pub classes: Vec<NyarClassInfo>,
76    pub traits: Vec<NyarTraitInfo>,
77    pub impls: Vec<NyarImplInfo>,
78    pub imports: Vec<NyarImportInfo>,
79    pub exports: Vec<NyarExportInfo>,
80}
81
82impl Default for NyarModule {
83    fn default() -> Self {
84        Self {
85            name: QualifiedName::new(vec![], "main".to_string()),
86            version: 1,
87            flags: 0,
88            timestamp: 0,
89            constants: Vec::new(),
90            effects: Vec::new(),
91            chunks: Vec::new(),
92            classes: Vec::new(),
93            traits: Vec::new(),
94            impls: Vec::new(),
95            imports: Vec::new(),
96            exports: Vec::new(),
97        }
98    }
99}
100
101/// Nyar 常量池项
102#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
103#[serde(tag = "kind", content = "value")]
104pub enum NyarConstant {
105    /// 空常量
106    None,
107    /// 整数常量
108    Int(i64),
109    /// 浮点数常量
110    Float(u64), // Use u64 bits for Eq/Hash
111    /// 字符串常量
112    String(String),
113    /// 限定名称常量
114    QualifiedName(QualifiedName),
115}
116
117impl NyarConstant {
118    pub fn float(f: f64) -> Self {
119        Self::Float(f.to_bits())
120    }
121    pub fn get_float(&self) -> Option<f64> {
122        if let Self::Float(v) = self {
123            Some(f64::from_bits(*v))
124        }
125        else {
126            None
127        }
128    }
129}
130
131/// 类型信息
132#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
133pub struct NyarClassInfo {
134    pub name: QualifiedName,
135    pub fields: Vec<String>,
136}
137
138/// 特征信息
139#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
140pub struct NyarTraitInfo {
141    pub name: QualifiedName,
142    pub methods: Vec<String>,
143}
144
145/// 实现信息
146#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
147pub struct NyarImplInfo {
148    pub class_idx: u16,
149    pub trait_idx: u16,
150    pub methods: Vec<u16>,
151}
152
153/// 导入信息
154#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
155pub struct NyarImportInfo {
156    pub provider: String,
157    pub symbol: QualifiedName,
158}
159
160/// 导出信息
161#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
162pub struct NyarExportInfo {
163    pub symbol: QualifiedName,
164    pub chunk_idx: u16,
165}