对编译器和虚拟机进行重构,以支持闭包和垃圾回收功能
- 去除了不再使用的结构,并更新了编译器以处理新的闭包语义。 - 改进了 Compiler,使其能够生成带有源位置跟踪的指令。 - 在 FunctionObject 和 VM 中引入了作用域变量管理,以支持动态闭包。 - 实现了使用标记-扫描(Mark-And-Sweep) (Tri-Color tracing) 算法的垃圾回收机制,包括对作用域变量的处理。 - 在 VM 中增加了函数加载和作用域变量检索的支持。 - 更新了对象模型,包括引入 InstanceObject 并改进内存管理。 - 添加了用于调试的全局变量打印功能。
This commit is contained in:
@@ -1,26 +1,40 @@
|
||||
/*!
|
||||
@file src/Object/FunctionObject.hpp
|
||||
@brief 函数对象定义
|
||||
@author PuqiAR (im@puqiar.top)
|
||||
@date 2026-02-28
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Object/ObjectBase.hpp>
|
||||
#include <Bytecode/Bytecode.hpp>
|
||||
|
||||
namespace Fig
|
||||
{
|
||||
// 运行时闭包对象 (24字节 Base + 8字节 Proto指针 = 32 bytes)
|
||||
// Upvalue (Stack Open / Heap Closed)
|
||||
struct Upvalue
|
||||
{
|
||||
Value *location; // Open 状态指向 VM 的 registerBase[x],Closed 状态指向下面的 closedValue
|
||||
Value closedValue; // 栈帧销毁时,数据物理迁移至此
|
||||
Upvalue *next; // 侵入式链表,供 VM 追踪当前 Open 的 Upvalue
|
||||
std::uint32_t refCount = 0; // 多少个闭包正在使用
|
||||
};
|
||||
|
||||
struct Proto;
|
||||
struct FunctionObject final : public Object
|
||||
{
|
||||
String name; // 调试使用
|
||||
Proto *proto; // 指向编译器生成的只读字节码与常量池
|
||||
std::uint8_t paraCount;
|
||||
String name;
|
||||
Proto *proto; // 静态只读字节码
|
||||
std::uint8_t paraCount;
|
||||
std::uint32_t upvalueCount; // 捕获数量
|
||||
|
||||
// TODO: 实现闭包时 加一个 Upvalue 指针数组
|
||||
// Value* upvalues;
|
||||
// 柔性数组
|
||||
Upvalue *upvalues[];
|
||||
|
||||
FunctionObject(const String &_name, Proto *_proto, std::uint32_t _upvalueCount) :
|
||||
name(_name), proto(_proto), paraCount(_proto->numParams), upvalueCount(_upvalueCount)
|
||||
{
|
||||
type = ObjectType::Function;
|
||||
}
|
||||
|
||||
~FunctionObject() = default;
|
||||
};
|
||||
} // namespace Fig
|
||||
Reference in New Issue
Block a user