Skip to main content

nyar_assembler/program/
types.rs

1use gaia_types::{GaiaError, QualifiedName};
2use serde::{Deserialize, Serialize};
3
4/// 异常处理器
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
6pub struct NyarHandler {
7    pub start: u32,
8    pub end: u32,
9    pub target: u32,
10    pub error_type: u16,
11}
12
13#[derive(Debug, Serialize, Deserialize)]
14pub struct NyarChunk {
15    pub code: Vec<u8>,
16    pub locals: u16,
17    pub upvalues: u16,
18    pub max_stack: u16,
19    pub handlers: Vec<NyarHandler>,
20    pub lines: Vec<(u32, u32)>,
21}
22
23impl Clone for NyarChunk {
24    fn clone(&self) -> Self {
25        Self {
26            code: self.code.clone(),
27            locals: self.locals,
28            upvalues: self.upvalues,
29            max_stack: self.max_stack,
30            handlers: self.handlers.clone(),
31            lines: self.lines.clone(),
32        }
33    }
34}
35
36impl Default for NyarChunk {
37    fn default() -> Self {
38        Self {
39            code: Vec::new(),
40            locals: 0,
41            upvalues: 0,
42            max_stack: 0,
43            handlers: Vec::new(),
44            lines: Vec::new(),
45        }
46    }
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct NyarModule {
51    pub name: QualifiedName,
52    pub version: u16,
53    pub flags: u32,
54    pub timestamp: u64,
55    pub constants: Vec<NyarConstant>,
56    pub effects: Vec<QualifiedName>,
57    pub chunks: Vec<NyarChunk>,
58    pub classes: Vec<NyarClassInfo>,
59    pub traits: Vec<NyarTraitInfo>,
60    pub impls: Vec<NyarImplInfo>,
61    pub imports: Vec<NyarImportInfo>,
62    pub exports: Vec<NyarExportInfo>,
63}
64
65impl Default for NyarModule {
66    fn default() -> Self {
67        Self {
68            name: QualifiedName::new(vec![], "main".to_string()),
69            version: 1,
70            flags: 0,
71            timestamp: 0,
72            constants: Vec::new(),
73            effects: Vec::new(),
74            chunks: Vec::new(),
75            classes: Vec::new(),
76            traits: Vec::new(),
77            impls: Vec::new(),
78            imports: Vec::new(),
79            exports: Vec::new(),
80        }
81    }
82}
83
84/// Nyar 常量池项
85#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
86#[serde(tag = "kind", content = "value")]
87pub enum NyarConstant {
88    /// 空常量
89    None,
90    /// 整数常量
91    Int(i64),
92    /// 浮点数常量
93    Float(u64), // Use u64 bits for Eq/Hash
94    /// 字符串常量
95    String(String),
96    /// 限定名称常量
97    QualifiedName(QualifiedName),
98}
99
100impl NyarConstant {
101    pub fn float(f: f64) -> Self {
102        Self::Float(f.to_bits())
103    }
104    pub fn get_float(&self) -> Option<f64> {
105        if let Self::Float(v) = self {
106            Some(f64::from_bits(*v))
107        } else {
108            None
109        }
110    }
111}
112
113/// 类型信息
114#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
115pub struct NyarClassInfo {
116    pub name: QualifiedName,
117    pub fields: Vec<String>,
118}
119
120/// 特征信息
121#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
122pub struct NyarTraitInfo {
123    pub name: QualifiedName,
124    pub methods: Vec<String>,
125}
126
127/// 实现信息
128#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
129pub struct NyarImplInfo {
130    pub class_idx: u16,
131    pub trait_idx: u16,
132    pub methods: Vec<u16>,
133}
134
135/// 导入信息
136#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
137pub struct NyarImportInfo {
138    pub provider: String,
139    pub symbol: QualifiedName,
140}
141
142/// 导出信息
143#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
144pub struct NyarExportInfo {
145    pub symbol: QualifiedName,
146    pub chunk_idx: u16,
147}
148
149/// 上值引用
150#[repr(C)]
151#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
152pub struct NyarUpvalueRef {
153    /// 是否为局部变量
154    pub is_local: bool,
155    /// 索引
156    pub index: u8,
157}
158
159/// Nyar 操作码枚举
160#[repr(u8)]
161#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
162pub enum NyarOpcode {
163    /// 无操作
164    Nop = 0x00,
165    /// 入栈
166    Push = 0x01,
167    /// 出栈
168    Pop = 0x02,
169    /// 复制栈顶
170    Dup = 0x03,
171    /// 交换栈顶
172    Swap = 0x04,
173    /// 加载局部变量
174    LoadLocal = 0x05,
175    /// 存储局部变量
176    StoreLocal = 0x06,
177    /// 加载全局变量
178    LoadGlobal = 0x07,
179    /// 存储全局变量
180    StoreGlobal = 0x08,
181    /// 加载上值 (Upvalue)
182    LoadUpvalue = 0x09,
183    /// 存储上值 (Upvalue)
184    StoreUpvalue = 0x0A,
185    /// 关闭上值
186    CloseUpvalues = 0x0B,
187    /// 无条件跳转
188    Jump = 0x0C,
189    /// 为假时跳转
190    JumpIfFalse = 0x0D,
191    /// 为真时跳转
192    JumpIfTrue = 0x0E,
193    /// 为空时跳转
194    JumpIfNull = 0x0F,
195    /// 入栈空值
196    PushNone = 0x10,
197    /// 返回
198    Return = 0x13,
199    /// 创建闭包
200    MakeClosure = 0x15,
201
202    /// 函数调用
203    Call = 0x20,
204    /// 虚函数调用
205    CallVirtual = 0x21,
206    /// 动态调用
207    CallDynamic = 0x22,
208    /// 闭包调用
209    CallClosure = 0x23,
210    /// 方法调用
211    InvokeMethod = 0x24,
212    /// 符号调用
213    CallSymbol = 0x25,
214    /// FFI 调用
215    FFICall = 0xF0,
216    /// 尾调用
217    TailCall = 0x14,
218    /// 闭包尾调用
219    TailCallClosure = 0x16,
220
221    /// 获取字段
222    GetField = 0x30,
223    /// 设置字段
224    SetField = 0x31,
225    /// 创建对象
226    NewObject = 0x32,
227    /// 创建数组
228    NewArray = 0x33,
229    /// 获取元素
230    GetElement = 0x34,
231    /// 设置元素
232    SetElement = 0x35,
233    /// 创建元组
234    MakeTuple = 0x36,
235    /// 是否存在键
236    HasKey = 0x37,
237    /// 匹配变体
238    MatchVariant = 0x38,
239    /// 获取大小
240    SizeOf = 0x39,
241    /// 创建动态对象
242    NewDynObject = 0x3A,
243    /// 移除键
244    RemoveKey = 0x3B,
245    /// 创建列表
246    NewList = 0x3C,
247    /// 左侧入队
248    PushElementLeft = 0x3D,
249    /// 左侧出队
250    PopElementLeft = 0x3E,
251    /// 元素入队右侧
252    PushElementRight = 0x3F,
253    /// 元素出队右侧
254    PopElementRight = 0x40,
255    /// 获取类型
256    TypeOf = 0x41,
257    /// 类型实例判断
258    InstanceOf = 0x42,
259    /// 检查转换
260    CheckCast = 0x43,
261    /// 类型转换
262    Cast = 0x44,
263    /// 初始化
264    Initiate = 0x45,
265    /// 终止
266    Finalize = 0x46,
267    /// 执行副作用 (Effect)
268    Perform = 0x50,
269    /// 注册副作用处理器
270    WithHandler = 0x51,
271    /// 继续副作用执行
272    ResumeWith = 0x52,
273    /// 捕获延续 (Continuation)
274    CaptureCont = 0x53,
275    /// 等待 (Await)
276    Await = 0x54,
277    /// 阻塞等待 (BlockOn)
278    BlockOn = 0x55,
279    /// 匹配副作用
280    MatchEffect = 0x56,
281    /// 获取虚表
282    GetWitnessTable = 0x60,
283    /// 虚表方法调用
284    WitnessMethod = 0x61,
285    /// 打开存在类型
286    OpenExistential = 0x62,
287    /// 关闭存在类型
288    CloseExistential = 0x63,
289    /// 引用 (Quote)
290    Quote = 0x70,
291    /// 拼接 (Splice)
292    Splice = 0x71,
293    /// 求值 (Eval)
294    Eval = 0x72,
295    /// 宏展开
296    ExpandMacro = 0x73,
297
298    /// 新建通道
299    NewChannel = 0x57,
300    /// 发送通道消息
301    SendChannel = 0x58,
302    /// 接收通道消息
303    RecvChannel = 0x59,
304    /// 选择通道
305    SelectChannel = 0x5A,
306    /// 新建查询
307    NewQuery = 0x5B,
308    /// 执行查询
309    QueryExec = 0x5C,
310    /// 新建时钟
311    NewClock = 0x5D,
312    /// 时钟等待
313    ClockWait = 0x5E,
314
315    /// I32 扩展指令
316    I32Ext = 0xC1,
317    /// I64 扩展指令
318    I64Ext = 0xC2,
319    /// F32 扩展指令
320    F32Ext = 0xC3,
321    /// F64 扩展指令
322    F64Ext = 0xC4,
323    /// 大整数扩展指令
324    BigIntExt = 0xC5,
325    /// 字符串扩展指令
326    StringExt = 0xC6,
327
328    /// 停机
329    Halt = 0xFF,
330}
331
332/// Nyar 指令枚举
333#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
334pub enum NyarInstruction {
335    /// 无操作
336    Nop,
337    /// 入栈常量,参数为常量池索引
338    Push(u16),
339    /// 入栈空值
340    PushNone,
341    /// 栈顶出栈
342    Pop,
343    /// 复制栈顶元素,参数为相对于栈顶的深度
344    Dup(u8),
345    /// 交换栈顶两个元素,参数为相对于栈顶的深度
346    Swap(u8),
347    /// 加载局部变量,参数为局部变量索引
348    LoadLocal(u8),
349    /// 存储局部变量,参数为局部变量索引
350    StoreLocal(u8),
351    /// 加载全局变量,参数为全局变量名索引
352    LoadGlobal(u16),
353    /// 存储全局变量,参数为全局变量名索引
354    StoreGlobal(u16),
355    /// 加载上值,参数为上值索引
356    LoadUpvalue(u8),
357    /// 存储上值,参数为上值索引
358    StoreUpvalue(u8),
359    /// 关闭所有开启的上值
360    CloseUpvalues,
361    /// 无条件跳转,参数为相对偏移量
362    Jump(i16),
363    /// 如果栈顶为假则跳转
364    JumpIfFalse(i16),
365    /// 如果栈顶为真则跳转
366    JumpIfTrue(i16),
367    /// 如果栈顶为空则跳转
368    JumpIfNull(i16),
369    /// 函数返回
370    Return,
371    /// 创建闭包,参数为函数体索引和上值引用列表
372    MakeClosure(u16, Vec<NyarUpvalueRef>),
373    /// 尾递归调用,参数为函数名索引和参数数量
374    TailCall(u16, u8),
375    /// 闭包尾递归调用,参数为参数数量
376    TailCallClosure(u8),
377    /// 函数调用,参数为函数名索引和参数数量
378    Call(u16, u8),
379    /// 虚函数调用,参数为函数名索引和参数数量
380    CallVirtual(u16, u8),
381    /// 动态调用,参数为函数名索引和参数数量
382    CallDynamic(u16, u8),
383    /// 闭包调用,参数为参数数量
384    CallClosure(u8),
385    /// 方法调用,参数为函数名索引和参数数量
386    InvokeMethod(u16, u8),
387    /// 符号调用,参数为符号名索引和参数数量
388    CallSymbol(u16, u8),
389    /// 获取对象字段,参数为字段名索引
390    GetField(u16),
391    /// 设置对象字段,参数为字段名索引
392    SetField(u16),
393    /// 创建新对象,参数为类型名索引
394    NewObject(u16),
395    /// 创建新数组,参数为长度
396    NewArray(u16),
397    /// 获取容器元素
398    GetElement,
399    /// 设置容器元素
400    SetElement,
401    /// 创建动态对象
402    NewDynObject,
403    /// 移除容器中的键
404    RemoveKey,
405    /// 初始化对象
406    Initiate(u8),
407    /// 终止对象生命周期
408    Finalize,
409    /// 创建新列表
410    NewList(u16),
411    /// 元素入队左侧
412    PushElementLeft,
413    /// 元素出队左侧
414    PopElementLeft,
415    /// 元素入队右侧
416    PushElementRight,
417    /// 元素出队右侧
418    PopElementRight,
419    /// 创建元组,参数为元素数量
420    MakeTuple(u8),
421    /// 判断是否存在键
422    HasKey,
423    /// 匹配枚举变体,参数为变体索引
424    MatchVariant(u16),
425    /// 获取容器大小
426    SizeOf,
427    /// 获取元素类型
428    TypeOf,
429    /// 判断是否为类型实例
430    InstanceOf(u16),
431    /// 检查类型转换
432    CheckCast(u16),
433    /// 强制类型转换
434    Cast(u16),
435    /// 执行副作用,参数为副作用名称索引和参数数量
436    Perform(u16, u8),
437    /// 注册副作用处理器,参数为处理器函数索引
438    WithHandler(u16),
439    /// 恢复延续执行
440    ResumeWith,
441    /// 捕获延续
442    CaptureCont,
443    /// 等待异步操作
444    Await,
445    /// 阻塞等待异步操作
446    BlockOn,
447    /// 匹配副作用处理结果
448    MatchEffect(u16),
449    /// 获取虚表索引
450    GetWitnessTable(u16, u16),
451    /// 调用虚表方法,参数为方法索引
452    WitnessMethod(u16),
453    /// 打开存在类型
454    OpenExistential,
455    /// 关闭存在类型
456    CloseExistential,
457    /// 引用 LIR 代码块
458    Quote(u32),
459    /// 拼接 LIR 表达式
460    Splice,
461    /// 对 LIR 表达式求值
462    Eval(u8),
463    /// 宏展开,参数为宏名称索引
464    ExpandMacro(u16, u8),
465    /// FFI 调用
466    FFICall(u16, u8),
467    /// 停机
468    Halt,
469
470    // --- Arithmetic and Logic Extensions ---
471    
472    /// I32 常量
473    I32Const(i32),
474    /// I32 加法
475    I32Add,
476    /// I32 减法
477    I32Sub,
478    /// I32 乘法
479    I32Mul,
480    /// I32 有符号除法
481    I32DivS,
482    /// I32 无符号除法
483    I32DivU,
484    /// I32 有符号取模
485    I32RemS,
486    /// I32 无符号取模
487    I32RemU,
488    /// I32 按位与
489    I32And,
490    /// I32 按位或
491    I32Or,
492    /// I32 按位异或
493    I32Xor,
494    /// I32 左移
495    I32Shl,
496    /// I32 有符号右移
497    I32ShrS,
498    /// I32 无符号右移
499    I32ShrU,
500    /// I32 按位取反
501    I32Not,
502    /// I32 取负
503    I32Neg,
504    /// I32 等于
505    I32Eq,
506    /// I32 不等于
507    I32Ne,
508    /// I32 有符号小于
509    I32LtS,
510    /// I32 无符号小于
511    I32LtU,
512    /// I32 有符号小于等于
513    I32LeS,
514    /// I32 无符号小于等于
515    I32LeU,
516    /// I32 有符号大于
517    I32GtS,
518    /// I32 无符号大于
519    I32GtU,
520    /// I32 有符号大于等于
521    I32GeS,
522    /// I32 无符号大于等于
523    I32GeU,
524    /// I32 转 F32 (有符号)
525    I32ToF32S,
526    /// I32 转 F32 (无符号)
527    I32ToF32U,
528    /// I32 转 F64 (有符号)
529    I32ToF64S,
530    /// I32 转 F64 (无符号)
531    I32ToF64U,
532    /// I32 加法 (饱和有符号)
533    I32AddSatS,
534    /// I32 加法 (饱和无符号)
535    I32AddSatU,
536    /// I32 减法 (饱和有符号)
537    I32SubSatS,
538    /// I32 减法 (饱和无符号)
539    I32SubSatU,
540    /// I32 符号扩展为 I64
541    I32Extend64S,
542    /// I32 零扩展为 I64
543    I32Extend64U,
544    /// I32 截断 I64 (低位)
545    I32Trunc64SLow,
546    /// I32 截断 I64 (有符号)
547    I32Trunc64S,
548    /// I32 截断 I64 (无符号)
549    I32Trunc64U,
550
551    /// I64 常量
552    I64Const(i64),
553    /// I64 加法
554    I64Add,
555    /// I64 减法
556    I64Sub,
557    /// I64 乘法
558    I64Mul,
559    /// I64 有符号除法
560    I64DivS,
561    /// I64 无符号除法
562    I64DivU,
563    /// I64 有符号取模
564    I64RemS,
565    /// I64 无符号取模
566    I64RemU,
567    /// I64 按位与
568    I64And,
569    /// I64 按位或
570    I64Or,
571    /// I64 按位异或
572    I64Xor,
573    /// I64 左移
574    I64Shl,
575    /// I64 有符号右移
576    I64ShrS,
577    /// I64 无符号右移
578    I64ShrU,
579    /// I64 按位取反
580    I64Not,
581    /// I64 取负
582    I64Neg,
583    /// I64 等于
584    I64Eq,
585    /// I64 不等于
586    I64Ne,
587    /// I64 有符号小于
588    I64LtS,
589    /// I64 无符号小于
590    I64LtU,
591    /// I64 有符号小于等于
592    I64LeS,
593    /// I64 无符号小于等于
594    I64LeU,
595    /// I64 有符号大于
596    I64GtS,
597    /// I64 无符号大于
598    I64GtU,
599    /// I64 有符号大于等于
600    I64GeS,
601    /// I64 无符号大于等于
602    I64GeU,
603    /// I64 转 F32 (有符号)
604    I64ToF32S,
605    /// I64 转 F32 (无符号)
606    I64ToF32U,
607    /// I64 转 F64 (有符号)
608    I64ToF64S,
609    /// I64 转 F64 (无符号)
610    I64ToF64U,
611    /// I64 加法 (饱和有符号)
612    I64AddSatS,
613    /// I64 加法 (饱和无符号)
614    I64AddSatU,
615
616    /// F32 常量
617    F32Const(f32),
618    /// F32 加法
619    F32Add,
620    /// F32 减法
621    F32Sub,
622    /// F32 乘法
623    F32Mul,
624    /// F32 除法
625    F32Div,
626    /// F32 取负
627    F32Neg,
628    /// F32 等于
629    F32Eq,
630    /// F32 不等于
631    F32Ne,
632    /// F32 小于
633    F32Lt,
634    /// F32 小于等于
635    F32Le,
636    /// F32 大于
637    F32Gt,
638    /// F32 大于等于
639    F32Ge,
640    /// F32 转 I32 (有符号)
641    F32ToI32S,
642    /// F32 转 I32 (无符号)
643    F32ToI32U,
644    /// F32 转 I64 (有符号)
645    F32ToI64S,
646    /// F32 转 I64 (无符号)
647    F32ToI64U,
648    /// F32 转 F64
649    F32ToF64,
650
651    /// F64 常量
652    F64Const(f64),
653    /// F64 加法
654    F64Add,
655    /// F64 减法
656    F64Sub,
657    /// F64 乘法
658    F64Mul,
659    /// F64 除法
660    F64Div,
661    /// F64 取负
662    F64Neg,
663    /// F64 等于
664    F64Eq,
665    /// F64 不等于
666    F64Ne,
667    /// F64 小于
668    F64Lt,
669    /// F64 小于等于
670    F64Le,
671    /// F64 大于
672    F64Gt,
673    /// F64 大于等于
674    F64Ge,
675    /// F64 转 I32 (有符号)
676    F64ToI32S,
677    /// F64 转 I32 (无符号)
678    F64ToI32U,
679    /// F64 转 I64 (有符号)
680    F64ToI64S,
681    /// F64 转 I64 (无符号)
682    F64ToI64U,
683    /// F64 转 F32
684    F64ToF32,
685
686    /// 大整数常量
687    BigIntConst {
688        /// 符号 (0: 正, 1: 负)
689        sign: u8,
690        /// 原始字节数据
691        bytes: Vec<u8>,
692    },
693    /// 大整数加法
694    BigIntAdd,
695    /// 大整数减法
696    BigIntSub,
697    /// 大整数乘法
698    BigIntMul,
699    /// 大整数除法
700    BigIntDiv,
701    /// 大整数取模
702    BigIntMod,
703    /// 大整数取负
704    BigIntNeg,
705    /// 大整数等于
706    BigIntEq,
707    /// 大整数不等于
708    BigIntNe,
709    /// 大整数小于
710    BigIntLt,
711    /// 大整数小于等于
712    BigIntLe,
713    /// 大整数大于
714    BigIntGt,
715    /// 大整数大于等于
716    BigIntGe,
717    /// 大整数转 I64
718    BigIntToI64,
719    /// I64 转 大整数
720    BigIntFromI64,
721    /// 大整数转字符串
722    BigIntToString,
723
724    /// 字符串常量
725    StringConst(String),
726    /// 字符串拼接
727    StringConcat,
728    /// 字符串长度 (字节)
729    StringLenBytes,
730    /// 字符串长度 (字符)
731    StringLenChars,
732    /// 字符串等于
733    StringEq,
734    /// 字符串不等于
735    StringNe,
736    /// 字符串小于
737    StringLt,
738    /// 字符串小于等于
739    StringLe,
740    /// 字符串大于
741    StringGt,
742    /// 字符串大于等于
743    StringGe,
744    /// 字符串截取
745    StringSubstr,
746
747    /// 新建通道
748    NewChannel(u16),
749    /// 发送通道消息
750    SendChannel,
751    /// 接收通道消息
752    RecvChannel,
753    /// 选择通道
754    SelectChannel(u8),
755    /// 新建查询
756    NewQuery(u16),
757    /// 执行查询
758    QueryExec,
759    /// 新建时钟
760    NewClock,
761    /// 时钟等待
762    ClockWait,
763}