use crate::compiler::Label; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::{self, OpCode}; use oxide_parser::{ AssignmentOperator, AssignmentTarget, AssignmentTargetMaybeDefault, AssignmentTargetProperty, BindingPattern, ChainElement, Class, ClassElement, Expression, ForStatementInit, ForStatementLeft, LogicalOperator, MethodDefinitionKind, ObjectAssignmentTarget, PropertyKey, PropertyKind, SimpleAssignmentTarget, Statement, UnaryOperator, UpdateOperator, VariableDeclarationKind, }; use crate::compiler::{ is_int_literal, is_side_effect_free, BinaryOperator, CompileCtx, Compiler, FunctionBodyContext, ParamSpec, }; mod expr; mod stmt; impl Compiler { 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(); ctx.emit(opcode::encode(OpCode::LOAD_VAR, dup_reg, reg, 0)); let offset = (short_pos as isize) - (ctx.bytecode.len() as isize); let offset = ctx.checked_jump_offset(offset); ctx.emit(opcode::encode_jmp_if_nullish(dup_reg, offset)); Ok(()) } fn emit_static_member_get_preserve_base( &self, member: &oxide_parser::StaticMemberExpression, short_label: Option