mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-27 04:01:11 +08:00
refactor: 可选链跳转改经 fixup 延迟发射
This commit is contained in:
@@ -124,12 +124,11 @@ impl Compiler {
|
|||||||
let value_reg = self.emit_chain_element(&chain.expression, Some(short_label), ctx)?;
|
let value_reg = self.emit_chain_element(&chain.expression, Some(short_label), ctx)?;
|
||||||
let result_reg = ctx.alloc_reg();
|
let result_reg = ctx.alloc_reg();
|
||||||
ctx.emit(opcode::encode(OpCode::LOAD_VAR, result_reg, value_reg, 0));
|
ctx.emit(opcode::encode(OpCode::LOAD_VAR, result_reg, value_reg, 0));
|
||||||
let end_pos = ctx.resolve_label(end_label)?;
|
ctx.emit_jmp_labeled(end_label);
|
||||||
let offset = (end_pos as isize) - (ctx.bytecode.len() as isize);
|
ctx.labels.label_map.insert(short_label, ctx.bytecode.len());
|
||||||
let offset = ctx.checked_jump_offset(offset);
|
|
||||||
ctx.emit(opcode::encode_jmp(offset));
|
|
||||||
let undefined_idx = ctx.add_constant(Constant::Undefined);
|
let undefined_idx = ctx.add_constant(Constant::Undefined);
|
||||||
ctx.emit_load_const(result_reg, undefined_idx);
|
ctx.emit_load_const(result_reg, undefined_idx);
|
||||||
|
ctx.labels.label_map.insert(end_label, ctx.bytecode.len());
|
||||||
Ok(result_reg)
|
Ok(result_reg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -171,12 +171,9 @@ impl Compiler {
|
|||||||
|
|
||||||
impl Compiler {
|
impl Compiler {
|
||||||
fn emit_optional_guard(&self, reg: u8, short_label: Label, ctx: &mut CompileCtx) -> Result<(), String> {
|
fn emit_optional_guard(&self, reg: u8, short_label: Label, ctx: &mut CompileCtx) -> Result<(), String> {
|
||||||
let short_pos = ctx.resolve_label(short_label)?;
|
|
||||||
let dup_reg = ctx.alloc_reg();
|
let dup_reg = ctx.alloc_reg();
|
||||||
ctx.emit(opcode::encode(OpCode::LOAD_VAR, dup_reg, reg, 0));
|
ctx.emit(opcode::encode(OpCode::LOAD_VAR, dup_reg, reg, 0));
|
||||||
let offset = (short_pos as isize) - (ctx.bytecode.len() as isize);
|
ctx.emit_jmp_if_nullish_labeled(dup_reg, short_label);
|
||||||
let offset = ctx.checked_jump_offset(offset);
|
|
||||||
ctx.emit(opcode::encode_jmp_if_nullish(dup_reg, offset));
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -344,27 +341,11 @@ impl Compiler {
|
|||||||
&self, op: LogicalOperator, test_reg: u8, store_label: Label, end_label: Label, ctx: &mut CompileCtx,
|
&self, op: LogicalOperator, test_reg: u8, store_label: Label, end_label: Label, ctx: &mut CompileCtx,
|
||||||
) -> Result<(), String> {
|
) -> Result<(), String> {
|
||||||
match op {
|
match op {
|
||||||
LogicalOperator::And => {
|
LogicalOperator::And => ctx.emit_jmp_if_false_labeled(test_reg, end_label),
|
||||||
let end_pos = ctx.resolve_label(end_label)?;
|
LogicalOperator::Or => ctx.emit_jmp_if_true_labeled(test_reg, end_label),
|
||||||
let offset = (end_pos as isize) - (ctx.bytecode.len() as isize);
|
|
||||||
let offset = ctx.checked_jump_offset(offset);
|
|
||||||
ctx.emit(opcode::encode_jmp_if_false(test_reg, offset));
|
|
||||||
}
|
|
||||||
LogicalOperator::Or => {
|
|
||||||
let end_pos = ctx.resolve_label(end_label)?;
|
|
||||||
let offset = (end_pos as isize) - (ctx.bytecode.len() as isize);
|
|
||||||
let offset = ctx.checked_jump_offset(offset);
|
|
||||||
ctx.emit(opcode::encode_jmp_if_true(test_reg, offset));
|
|
||||||
}
|
|
||||||
LogicalOperator::Coalesce => {
|
LogicalOperator::Coalesce => {
|
||||||
let store_pos = ctx.resolve_label(store_label)?;
|
ctx.emit_jmp_if_nullish_labeled(test_reg, store_label);
|
||||||
let offset = (store_pos as isize) - (ctx.bytecode.len() as isize);
|
ctx.emit_jmp_labeled(end_label);
|
||||||
let offset = ctx.checked_jump_offset(offset);
|
|
||||||
ctx.emit(opcode::encode_jmp_if_nullish(test_reg, offset));
|
|
||||||
let end_pos = ctx.resolve_label(end_label)?;
|
|
||||||
let offset = (end_pos as isize) - (ctx.bytecode.len() as isize);
|
|
||||||
let offset = ctx.checked_jump_offset(offset);
|
|
||||||
ctx.emit(opcode::encode_jmp(offset));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
Reference in New Issue
Block a user