重构类型系统并改进诊断功能
- 更新了类型系统,新增了类型并优化了结构。 - 引入了基类型和派生类,用于函数、结构体和接口类型。 - 实现了类型上下文,用于管理内置类型和类型解析。 - 添加了诊断类,用于收集和报告警告和错误。 - 通过改进错误处理增强了虚拟机执行,以应对递归限制问题。 - 实现了反汇编器,将字节码转换为代码,以改善调试和分析。 - 添加了新的抽象语法树节点,用于成员表达式、对象初始化、接口和结构体定义。 - 引入了语义错误测试,包括重定义、未声明的变量和无效的结构字段。
This commit is contained in:
@@ -1,87 +1,83 @@
|
||||
/*!
|
||||
@file src/Bytecode/Bytecode.hpp
|
||||
@brief 字节码Bytecode定义
|
||||
@author PuqiAR (im@puqiar.top)
|
||||
@date 2026-02-18
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#pragma once
|
||||
#include <cstdint>
|
||||
|
||||
namespace Fig
|
||||
{
|
||||
|
||||
// 定长 32-bit
|
||||
using Instruction = std::uint32_t;
|
||||
|
||||
enum class OpCode : std::uint8_t
|
||||
{
|
||||
Exit, // 结束运行
|
||||
|
||||
LoadK, // iABx 模式: R[A] = Constants[Bx]
|
||||
LoadTrue, // iABC: R[A] = true
|
||||
LoadFalse, // iABC: R[A] = false
|
||||
LoadNull, // iABC: R[A] = null
|
||||
Exit,
|
||||
Exit_MaxRecursionDepthExceeded,
|
||||
|
||||
FastCall, // iABC: A: ProtoIdx, B: 函数起始寄存器
|
||||
Call, // 动态派发 iABC: A: 函数体对象寄存器 B: 函数起始寄存器
|
||||
Return, // iABC 模式: 返回 R[A] 的值
|
||||
LoadK,
|
||||
LoadTrue,
|
||||
LoadFalse,
|
||||
LoadNull,
|
||||
|
||||
LoadFn, // 惰性装修, iABx: R[A] = new FunctionObject...
|
||||
FastCall,
|
||||
Call,
|
||||
Return,
|
||||
|
||||
Jmp, // iAsBx: ip += sBx 无条件跳转
|
||||
JmpIfFalse, // iAsBx: 如果 R[A] 为假, ip += sBx
|
||||
LoadFn,
|
||||
|
||||
Mov, // iABx: R[A] = R[Bx]
|
||||
Jmp,
|
||||
JmpIfFalse,
|
||||
|
||||
Add, // iABC: R[A] = R[B] + R[C]
|
||||
Sub, // iABC: R[A] = R[B] - R[C]
|
||||
Mul, // iABC: R[A] = R[B] * R[C]
|
||||
Div, // iABC: R[A] = R[B] / R[C]
|
||||
Mod, // iABC: R[A] = R[B] % R[C]
|
||||
BitXor, // iABC: R[A] = R[B] ^ R[C]
|
||||
Mov,
|
||||
|
||||
IntFastAdd, // iABC: R[A] (Int) = R[B] (Int) + R[C] (Int)
|
||||
IntFastSub, // iABC: R[A] (Int) = R[B] (Int) - R[C] (Int)
|
||||
IntFastMul, // iABC: R[A] (Int) = R[B] (Int) * R[C] (Int)
|
||||
IntFastDiv, // iABC: R[A] (Double) = R[B] (Int) / R[C] (Int)
|
||||
Add,
|
||||
Sub,
|
||||
Mul,
|
||||
Div,
|
||||
Mod,
|
||||
BitXor,
|
||||
|
||||
Equal, // iABC: R[A] = R[B] == R[C]
|
||||
NotEqual, // iABC: R[A] = R[B] != R[C]
|
||||
Greater, // iABC: R[A] = R[B] > R[C]
|
||||
Less, // iABC: R[A] = R[B] < R[C]
|
||||
GreaterEqual, // iABC: R[A] = R[B] >= R[C]
|
||||
LessEqual, // iABC: R[A] = R[B] <= R[C]
|
||||
IntFastAdd,
|
||||
IntFastSub,
|
||||
IntFastMul,
|
||||
IntFastDiv,
|
||||
|
||||
Count, // 哨兵
|
||||
Equal,
|
||||
NotEqual,
|
||||
Greater,
|
||||
Less,
|
||||
GreaterEqual,
|
||||
LessEqual,
|
||||
|
||||
GetGlobal,
|
||||
SetGlobal,
|
||||
GetUpval,
|
||||
SetUpval,
|
||||
Copy,
|
||||
|
||||
Count
|
||||
};
|
||||
|
||||
namespace Op
|
||||
{
|
||||
// [OpCode: 8] [A: 8] [Bx: 16]
|
||||
[[nodiscard]] inline constexpr Instruction iABx(OpCode op, std::uint8_t a, std::uint16_t bx)
|
||||
{
|
||||
return static_cast<std::uint32_t>(op) | (static_cast<std::uint32_t>(a) << 8)
|
||||
| (static_cast<std::uint32_t>(bx) << 16);
|
||||
}
|
||||
|
||||
// [OpCode: 8] [A: 8] [B: 8] [C: 8]
|
||||
[[nodiscard]] inline constexpr Instruction iABC(
|
||||
OpCode op, std::uint8_t a, std::uint8_t b, std::uint8_t c)
|
||||
[[nodiscard]] inline constexpr Instruction iABC(OpCode op, std::uint8_t a, std::uint8_t b, std::uint8_t c)
|
||||
{
|
||||
return static_cast<std::uint32_t>(op) | (static_cast<std::uint32_t>(a) << 8)
|
||||
| (static_cast<std::uint32_t>(b) << 16) | (static_cast<std::uint32_t>(c) << 24);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
inline constexpr Instruction iAsBx(OpCode op, std::uint8_t a, std::int16_t sbx)
|
||||
[[nodiscard]] inline constexpr Instruction iAsBx(OpCode op, std::uint8_t a, std::int16_t sbx)
|
||||
{
|
||||
return static_cast<std::uint32_t>(op) | (static_cast<std::uint32_t>(a) << 8)
|
||||
| (static_cast<std::uint32_t>(static_cast<std::uint16_t>(sbx)) << 16);
|
||||
}
|
||||
} // namespace Op
|
||||
} // namespace Fig
|
||||
} // namespace Fig
|
||||
|
||||
Reference in New Issue
Block a user