feat: 增加 CreateClosure 字节码,函数字面量每次执行创建新闭包
This commit is contained in:
@@ -254,6 +254,11 @@ impl CompileCtx {
|
||||
self.emit(opcode::encode(OpCode::LOAD_CONST, reg, (idx & 0xFF) as u8, ((idx >> 8) & 0xFF) as u8));
|
||||
}
|
||||
|
||||
pub(crate) fn emit_create_closure(&mut self, reg: u8, sub_idx: u32) {
|
||||
let idx = sub_idx as u16;
|
||||
self.emit(opcode::encode(OpCode::CREATE_CLOSURE, reg, (idx & 0xFF) as u8, ((idx >> 8) & 0xFF) as u8));
|
||||
}
|
||||
|
||||
pub(crate) fn count_word(&mut self) {
|
||||
self.projected_pc += 1;
|
||||
}
|
||||
|
||||
@@ -37,9 +37,8 @@ impl Compiler {
|
||||
// 1-indexed: 0 = no sub_module (sentinel)
|
||||
let sub_idx = ctx.sub_modules.len() as u32;
|
||||
|
||||
let const_idx = ctx.add_constant(Constant::BytecodeFunc(sub_idx));
|
||||
let r = ctx.alloc_reg();
|
||||
ctx.emit_load_const(r, const_idx);
|
||||
ctx.emit_create_closure(r, sub_idx);
|
||||
Ok(r)
|
||||
}
|
||||
|
||||
@@ -72,9 +71,8 @@ impl Compiler {
|
||||
// 1-indexed: 0 = no sub_module (sentinel)
|
||||
let sub_idx = ctx.sub_modules.len() as u32;
|
||||
|
||||
let const_idx = ctx.add_constant(Constant::BytecodeFunc(sub_idx));
|
||||
let r = ctx.alloc_reg();
|
||||
ctx.emit_load_const(r, const_idx);
|
||||
ctx.emit_create_closure(r, sub_idx);
|
||||
Ok(r)
|
||||
}
|
||||
|
||||
|
||||
@@ -811,8 +811,7 @@ impl Compiler {
|
||||
ctor_module.function_name = ctor_name.clone();
|
||||
ctx.sub_modules.push(ctor_module);
|
||||
|
||||
let ctor_idx = ctx.add_constant(Constant::BytecodeFunc(ctx.sub_modules.len() as u32));
|
||||
ctx.emit_load_const(ctor_reg, ctor_idx);
|
||||
ctx.emit_create_closure(ctor_reg, ctx.sub_modules.len() as u32);
|
||||
ctx.emit(opcode::encode(OpCode::NEW_OBJECT, proto_reg, 0, 0));
|
||||
|
||||
if let Some(super_reg) = super_reg {
|
||||
@@ -947,9 +946,8 @@ impl Compiler {
|
||||
method_module.needs_home_object = true;
|
||||
ctx.sub_modules.push(method_module);
|
||||
|
||||
let method_idx = ctx.add_constant(Constant::BytecodeFunc(ctx.sub_modules.len() as u32));
|
||||
let method_reg = ctx.alloc_reg();
|
||||
ctx.emit_load_const(method_reg, method_idx);
|
||||
ctx.emit_create_closure(method_reg, ctx.sub_modules.len() as u32);
|
||||
ctx.emit(opcode::encode(OpCode::SET_HOME_OBJECT, method_reg, home_reg, 0));
|
||||
Ok(method_reg)
|
||||
}
|
||||
|
||||
@@ -77,8 +77,7 @@ impl Compiler {
|
||||
|
||||
let var_reg = ctx.lookup(&name)?;
|
||||
ctx.reserve_reg(var_reg);
|
||||
let const_idx = ctx.add_constant(Constant::BytecodeFunc(sub_idx));
|
||||
ctx.emit_load_const(var_reg, const_idx);
|
||||
ctx.emit_create_closure(var_reg, sub_idx);
|
||||
ctx.emit(opcode::encode(OpCode::STORE_VAR, var_reg, var_reg, 0));
|
||||
|
||||
Ok(None)
|
||||
|
||||
Reference in New Issue
Block a user