diff --git a/Cargo.lock b/Cargo.lock index 097bb71..577782c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1111,11 +1111,19 @@ version = "0.1.0" dependencies = [ "oxide_bytecode", "oxide_code_cache", + "oxide_ir", "oxide_log", "oxide_parser", "rustc-hash", "serde", "serde_json", +] + +[[package]] +name = "oxide_ir" +version = "0.1.0" +dependencies = [ + "oxide_bytecode", "smallvec", ] diff --git a/Cargo.toml b/Cargo.toml index 350b97b..65786a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ members = [ "crates/oxide_code_cache", "crates/oxide_log", "crates/oxide_compiler", + "crates/oxide_ir", "crates/oxide_types", "crates/oxide_vm", "crates/oxide_kernel", @@ -29,6 +30,7 @@ oxc_ast = "0.134.0" oxc_span = "0.134.0" oxc_diagnostics = "0.134.0" oxc_syntax = "0.134.0" +oxide_ir = { path = "crates/oxide_ir" } clap = { version = "4", features = ["derive"] } rustyline = "14" ansi_term = "0.12" diff --git a/crates/oxide_compiler/Cargo.toml b/crates/oxide_compiler/Cargo.toml index fc7cb63..677813e 100644 --- a/crates/oxide_compiler/Cargo.toml +++ b/crates/oxide_compiler/Cargo.toml @@ -10,10 +10,10 @@ description = "OxideJS - AST to bytecode compiler" oxide_bytecode = { path = "../oxide_bytecode" } oxide_parser = { path = "../oxide_parser" } oxide_log = { path = "../oxide_log" } +oxide_ir.workspace = true serde.workspace = true serde_json.workspace = true rustc-hash.workspace = true -smallvec.workspace = true [dev-dependencies] oxide_code_cache = { path = "../oxide_code_cache" } diff --git a/crates/oxide_compiler/src/class/emit.rs b/crates/oxide_compiler/src/class/emit.rs index 5bf0d0c..c43e0c2 100644 --- a/crates/oxide_compiler/src/class/emit.rs +++ b/crates/oxide_compiler/src/class/emit.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler, FunctionBodyContext}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; use oxide_parser::{Class, ClassElement, MethodDefinitionKind, PropertyKey}; diff --git a/crates/oxide_compiler/src/class/field.rs b/crates/oxide_compiler/src/class/field.rs index ec3a935..228d07d 100644 --- a/crates/oxide_compiler/src/class/field.rs +++ b/crates/oxide_compiler/src/class/field.rs @@ -1,5 +1,5 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::operand::Operand; +use oxide_ir::operand::Operand; use oxide_parser::{ClassElement, PropertyKey}; impl Compiler { diff --git a/crates/oxide_compiler/src/class/method.rs b/crates/oxide_compiler/src/class/method.rs index 1b7c760..d031e2d 100644 --- a/crates/oxide_compiler/src/class/method.rs +++ b/crates/oxide_compiler/src/class/method.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler, FunctionBodyContext}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::{ClassElement, MethodDefinitionKind, PropertyKey}; diff --git a/crates/oxide_compiler/src/class/prototype.rs b/crates/oxide_compiler/src/class/prototype.rs index 86c513e..afa526c 100644 --- a/crates/oxide_compiler/src/class/prototype.rs +++ b/crates/oxide_compiler/src/class/prototype.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; diff --git a/crates/oxide_compiler/src/compiler.rs b/crates/oxide_compiler/src/compiler.rs index e091524..9eb4bc9 100644 --- a/crates/oxide_compiler/src/compiler.rs +++ b/crates/oxide_compiler/src/compiler.rs @@ -1,10 +1,10 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use crate::emit_ctx::{LabelCtx, ScopeCtx}; -use crate::ir::inst::Inst; -use crate::ir::lower::lower; -use crate::ir::operand::{LabelId, Operand}; -use crate::ir::IRFunction; +use oxide_ir::inst::Inst; +use oxide_ir::lower::lower; +use oxide_ir::operand::{LabelId, Operand}; +use oxide_ir::IRFunction; use crate::symbol_table::{Binding, SymbolTable}; use oxide_bytecode::module::CompiledModule; use oxide_bytecode::module::UpvalueCapture; @@ -464,7 +464,7 @@ impl CompileCtx { /// 组装 IRFunction(两出口共用),take 走编译产物状态。 /// `parent_ctx` 用于补全 upvalue_captures 的 enclosing_reg(父符号表在父 emit 完成后完整)。 - fn assemble_ir(&mut self, param_layout: crate::ir::ParamLayout, parent_ctx: Option<&CompileCtx>) -> IRFunction { + fn assemble_ir(&mut self, param_layout: oxide_ir::ParamLayout, parent_ctx: Option<&CompileCtx>) -> IRFunction { let upvalue_captures = self .current_upvalue_captures .iter() @@ -716,7 +716,7 @@ impl Compiler { } let ir = ctx.assemble_ir( - crate::ir::ParamLayout { + oxide_ir::ParamLayout { base: param_base as u32, count: param_specs.len() as u32, }, @@ -889,7 +889,7 @@ impl Compiler { crate::compiler_debug!("compile: done, {} instructions, {} constants", ctx.insts.len(), ctx.constants.len()); let ir = ctx.assemble_ir( - crate::ir::ParamLayout { + oxide_ir::ParamLayout { base: ctx.scopes.builtin_reg_map.len() as u32, count: 0, }, diff --git a/crates/oxide_compiler/src/emit_ctx.rs b/crates/oxide_compiler/src/emit_ctx.rs index 25c0943..b012dce 100644 --- a/crates/oxide_compiler/src/emit_ctx.rs +++ b/crates/oxide_compiler/src/emit_ctx.rs @@ -7,7 +7,7 @@ //! `CompileCtx`. use crate::compiler::LabelScope; -use crate::ir::operand::LabelId; +use oxide_ir::operand::LabelId; use crate::symbol_table::SymbolTable; /// Jump-target / labeled-statement resolution state. diff --git a/crates/oxide_compiler/src/expr/assignment.rs b/crates/oxide_compiler/src/expr/assignment.rs index d983742..9d2aed6 100644 --- a/crates/oxide_compiler/src/expr/assignment.rs +++ b/crates/oxide_compiler/src/expr/assignment.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::AssignmentOperator; diff --git a/crates/oxide_compiler/src/expr/call.rs b/crates/oxide_compiler/src/expr/call.rs index 593f577..7020287 100644 --- a/crates/oxide_compiler/src/expr/call.rs +++ b/crates/oxide_compiler/src/expr/call.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::Expression; diff --git a/crates/oxide_compiler/src/expr/function/mod.rs b/crates/oxide_compiler/src/expr/function/mod.rs index 0e1419e..01676a2 100644 --- a/crates/oxide_compiler/src/expr/function/mod.rs +++ b/crates/oxide_compiler/src/expr/function/mod.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler, ParamSpec}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_parser::{Class, Expression, Statement}; impl Compiler { diff --git a/crates/oxide_compiler/src/expr/identifier.rs b/crates/oxide_compiler/src/expr/identifier.rs index 792ca00..5cc565c 100644 --- a/crates/oxide_compiler/src/expr/identifier.rs +++ b/crates/oxide_compiler/src/expr/identifier.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; impl Compiler { diff --git a/crates/oxide_compiler/src/expr/literal.rs b/crates/oxide_compiler/src/expr/literal.rs index c4c27e5..06a2a27 100644 --- a/crates/oxide_compiler/src/expr/literal.rs +++ b/crates/oxide_compiler/src/expr/literal.rs @@ -1,6 +1,6 @@ use crate::compiler::{is_int_literal, CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::Expression; diff --git a/crates/oxide_compiler/src/expr/member/mod.rs b/crates/oxide_compiler/src/expr/member/mod.rs index 2f2e119..d76a21e 100644 --- a/crates/oxide_compiler/src/expr/member/mod.rs +++ b/crates/oxide_compiler/src/expr/member/mod.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::Expression; diff --git a/crates/oxide_compiler/src/expr/object/array.rs b/crates/oxide_compiler/src/expr/object/array.rs index 4b9d8e0..763d1bd 100644 --- a/crates/oxide_compiler/src/expr/object/array.rs +++ b/crates/oxide_compiler/src/expr/object/array.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; impl Compiler { diff --git a/crates/oxide_compiler/src/expr/object/object_literal.rs b/crates/oxide_compiler/src/expr/object/object_literal.rs index 2477620..2adcb3a 100644 --- a/crates/oxide_compiler/src/expr/object/object_literal.rs +++ b/crates/oxide_compiler/src/expr/object/object_literal.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::{Expression, ObjectPropertyKind, PropertyKey, PropertyKind}; diff --git a/crates/oxide_compiler/src/expr/operator/mod.rs b/crates/oxide_compiler/src/expr/operator/mod.rs index 7ebb2a5..df76d00 100644 --- a/crates/oxide_compiler/src/expr/operator/mod.rs +++ b/crates/oxide_compiler/src/expr/operator/mod.rs @@ -1,6 +1,6 @@ use crate::compiler::{is_side_effect_free, BinaryOperator, CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::{ChainElement, Expression, LogicalOperator, SimpleAssignmentTarget, UnaryOperator, UpdateOperator}; diff --git a/crates/oxide_compiler/src/expr/template/tagged.rs b/crates/oxide_compiler/src/expr/template/tagged.rs index eb11793..bca50e7 100644 --- a/crates/oxide_compiler/src/expr/template/tagged.rs +++ b/crates/oxide_compiler/src/expr/template/tagged.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; impl Compiler { diff --git a/crates/oxide_compiler/src/expr/template/template_literal.rs b/crates/oxide_compiler/src/expr/template/template_literal.rs index bac18e9..08c4e2b 100644 --- a/crates/oxide_compiler/src/expr/template/template_literal.rs +++ b/crates/oxide_compiler/src/expr/template/template_literal.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; impl Compiler { diff --git a/crates/oxide_compiler/src/expr/this.rs b/crates/oxide_compiler/src/expr/this.rs index 4786359..5a7fa78 100644 --- a/crates/oxide_compiler/src/expr/this.rs +++ b/crates/oxide_compiler/src/expr/this.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; impl Compiler { diff --git a/crates/oxide_compiler/src/lib.rs b/crates/oxide_compiler/src/lib.rs index c88ae0b..47be17d 100644 --- a/crates/oxide_compiler/src/lib.rs +++ b/crates/oxide_compiler/src/lib.rs @@ -7,7 +7,6 @@ pub mod compiler_log; pub mod emit_ctx; pub mod expr; pub mod hash; -pub mod ir; pub mod prepass; pub mod shared; pub mod stmt; diff --git a/crates/oxide_compiler/src/shared/binding.rs b/crates/oxide_compiler/src/shared/binding.rs index 87d09c4..23a3cdf 100644 --- a/crates/oxide_compiler/src/shared/binding.rs +++ b/crates/oxide_compiler/src/shared/binding.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::{ diff --git a/crates/oxide_compiler/src/shared/chain.rs b/crates/oxide_compiler/src/shared/chain.rs index ed17e8f..3ca30a2 100644 --- a/crates/oxide_compiler/src/shared/chain.rs +++ b/crates/oxide_compiler/src/shared/chain.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::{LabelId, Operand}; +use oxide_ir::inst::Inst; +use oxide_ir::operand::{LabelId, Operand}; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::{ChainElement, Expression, LogicalOperator, PropertyKey}; diff --git a/crates/oxide_compiler/src/shared/class_field.rs b/crates/oxide_compiler/src/shared/class_field.rs index e369f03..5fa85aa 100644 --- a/crates/oxide_compiler/src/shared/class_field.rs +++ b/crates/oxide_compiler/src/shared/class_field.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; use oxide_parser::{Expression, PropertyKey}; diff --git a/crates/oxide_compiler/src/shared/class_key.rs b/crates/oxide_compiler/src/shared/class_key.rs index 2ac14cf..3d07a57 100644 --- a/crates/oxide_compiler/src/shared/class_key.rs +++ b/crates/oxide_compiler/src/shared/class_key.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_parser::PropertyKey; diff --git a/crates/oxide_compiler/src/stmt/basic/break_continue.rs b/crates/oxide_compiler/src/stmt/basic/break_continue.rs index 3db3ca7..4eb54ab 100644 --- a/crates/oxide_compiler/src/stmt/basic/break_continue.rs +++ b/crates/oxide_compiler/src/stmt/basic/break_continue.rs @@ -1,5 +1,5 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; +use oxide_ir::inst::Inst; impl Compiler { pub(crate) fn emit_break_statement( diff --git a/crates/oxide_compiler/src/stmt/basic/return_stmt.rs b/crates/oxide_compiler/src/stmt/basic/return_stmt.rs index 44af296..6a377b8 100644 --- a/crates/oxide_compiler/src/stmt/basic/return_stmt.rs +++ b/crates/oxide_compiler/src/stmt/basic/return_stmt.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; use oxide_parser::Statement; diff --git a/crates/oxide_compiler/src/stmt/control.rs b/crates/oxide_compiler/src/stmt/control.rs index dd40f00..ef120d7 100644 --- a/crates/oxide_compiler/src/stmt/control.rs +++ b/crates/oxide_compiler/src/stmt/control.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::Statement; diff --git a/crates/oxide_compiler/src/stmt/declaration/class_decl.rs b/crates/oxide_compiler/src/stmt/declaration/class_decl.rs index 1948fa9..c423a15 100644 --- a/crates/oxide_compiler/src/stmt/declaration/class_decl.rs +++ b/crates/oxide_compiler/src/stmt/declaration/class_decl.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; use oxide_parser::{Statement, VariableDeclarationKind}; diff --git a/crates/oxide_compiler/src/stmt/declaration/function_decl.rs b/crates/oxide_compiler/src/stmt/declaration/function_decl.rs index 6e373d3..cf02625 100644 --- a/crates/oxide_compiler/src/stmt/declaration/function_decl.rs +++ b/crates/oxide_compiler/src/stmt/declaration/function_decl.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler, ParamSpec}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; use oxide_parser::Statement; diff --git a/crates/oxide_compiler/src/stmt/declaration/var.rs b/crates/oxide_compiler/src/stmt/declaration/var.rs index eee2ebb..d9fd56b 100644 --- a/crates/oxide_compiler/src/stmt/declaration/var.rs +++ b/crates/oxide_compiler/src/stmt/declaration/var.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::{BindingPattern, Expression, Statement, VariableDeclarationKind}; diff --git a/crates/oxide_compiler/src/stmt/exception/throw.rs b/crates/oxide_compiler/src/stmt/exception/throw.rs index c9656d7..0c0abfd 100644 --- a/crates/oxide_compiler/src/stmt/exception/throw.rs +++ b/crates/oxide_compiler/src/stmt/exception/throw.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; use oxide_parser::Statement; diff --git a/crates/oxide_compiler/src/stmt/exception/try_catch.rs b/crates/oxide_compiler/src/stmt/exception/try_catch.rs index 0ed3e35..461af9e 100644 --- a/crates/oxide_compiler/src/stmt/exception/try_catch.rs +++ b/crates/oxide_compiler/src/stmt/exception/try_catch.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; use oxide_parser::{Statement, VariableDeclarationKind}; diff --git a/crates/oxide_compiler/src/stmt/iteration/do_while.rs b/crates/oxide_compiler/src/stmt/iteration/do_while.rs index cc067b4..e58795e 100644 --- a/crates/oxide_compiler/src/stmt/iteration/do_while.rs +++ b/crates/oxide_compiler/src/stmt/iteration/do_while.rs @@ -1,5 +1,5 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; +use oxide_ir::inst::Inst; use oxide_parser::Statement; impl Compiler { diff --git a/crates/oxide_compiler/src/stmt/iteration/for_.rs b/crates/oxide_compiler/src/stmt/iteration/for_.rs index 015064b..0acda96 100644 --- a/crates/oxide_compiler/src/stmt/iteration/for_.rs +++ b/crates/oxide_compiler/src/stmt/iteration/for_.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::module::Constant; use oxide_bytecode::opcode::OpCode; use oxide_parser::{BindingPattern, ForStatementInit, Statement, VariableDeclarationKind}; diff --git a/crates/oxide_compiler/src/stmt/iteration/for_in.rs b/crates/oxide_compiler/src/stmt/iteration/for_in.rs index 138e4b5..9cf01ac 100644 --- a/crates/oxide_compiler/src/stmt/iteration/for_in.rs +++ b/crates/oxide_compiler/src/stmt/iteration/for_in.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; use oxide_parser::{ForStatementLeft, Statement, VariableDeclarationKind}; diff --git a/crates/oxide_compiler/src/stmt/iteration/for_of.rs b/crates/oxide_compiler/src/stmt/iteration/for_of.rs index fe84d56..c211053 100644 --- a/crates/oxide_compiler/src/stmt/iteration/for_of.rs +++ b/crates/oxide_compiler/src/stmt/iteration/for_of.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; use oxide_parser::{ForStatementLeft, Statement}; diff --git a/crates/oxide_compiler/src/stmt/iteration/while_loop.rs b/crates/oxide_compiler/src/stmt/iteration/while_loop.rs index c81fac3..8ff13e5 100644 --- a/crates/oxide_compiler/src/stmt/iteration/while_loop.rs +++ b/crates/oxide_compiler/src/stmt/iteration/while_loop.rs @@ -1,5 +1,5 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; +use oxide_ir::inst::Inst; use oxide_parser::Statement; impl Compiler { diff --git a/crates/oxide_compiler/src/stmt/switch.rs b/crates/oxide_compiler/src/stmt/switch.rs index b09fce7..c97a24a 100644 --- a/crates/oxide_compiler/src/stmt/switch.rs +++ b/crates/oxide_compiler/src/stmt/switch.rs @@ -1,6 +1,6 @@ use crate::compiler::{CompileCtx, Compiler}; -use crate::ir::inst::Inst; -use crate::ir::operand::Operand; +use oxide_ir::inst::Inst; +use oxide_ir::operand::Operand; use oxide_bytecode::opcode::OpCode; use oxide_parser::Statement; diff --git a/crates/oxide_compiler/tests/lowering_tests.rs b/crates/oxide_compiler/tests/lowering_tests.rs index 701c06a..810a465 100644 --- a/crates/oxide_compiler/tests/lowering_tests.rs +++ b/crates/oxide_compiler/tests/lowering_tests.rs @@ -2,10 +2,10 @@ use oxide_bytecode::module::{CompiledModule, Constant}; use oxide_bytecode::opcode::{self, OpCode}; -use oxide_compiler::ir::inst::Inst; -use oxide_compiler::ir::lower::lower; -use oxide_compiler::ir::operand::Operand; -use oxide_compiler::ir::IRFunction; +use oxide_ir::inst::Inst; +use oxide_ir::lower::lower; +use oxide_ir::operand::Operand; +use oxide_ir::IRFunction; fn base_module() -> IRFunction { IRFunction::new() @@ -166,7 +166,7 @@ fn module_fields_are_copied_through() { let mut f = base_module(); f.insts.push(Inst::new(OpCode::NOP, Operand::None, Operand::None, Operand::None)); f.constants.push(Constant::Int(42)); - f.param_layout = oxide_compiler::ir::ParamLayout { base: 2, count: 3 }; + f.param_layout = oxide_ir::ParamLayout { base: 2, count: 3 }; f.n_registers = 8; f.is_arrow = true; f.builtin_reg_map.push(("Math".to_string(), 1)); @@ -250,7 +250,7 @@ fn ir_function_domain_assemble_default_clone() { let mut f = IRFunction::new(); f.insts.push(Inst::new(OpCode::NOP, Operand::None, Operand::None, Operand::None)); f.constants.push(Constant::Int(1)); - f.param_layout = oxide_compiler::ir::ParamLayout { base: 0, count: 1 }; + f.param_layout = oxide_ir::ParamLayout { base: 0, count: 1 }; f.n_registers = 2; f.is_arrow = true; f.builtin_reg_map.push(("Math".to_string(), 1)); diff --git a/crates/oxide_ir/Cargo.toml b/crates/oxide_ir/Cargo.toml new file mode 100644 index 0000000..a60f3d7 --- /dev/null +++ b/crates/oxide_ir/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "oxide_ir" +version.workspace = true +edition.workspace = true +license.workspace = true +rust-version.workspace = true +description = "OxideJS - IR intermediate representation and lowering to bytecode" + +[dependencies] +oxide_bytecode = { path = "../oxide_bytecode" } +smallvec.workspace = true diff --git a/crates/oxide_compiler/src/ir/inst.rs b/crates/oxide_ir/src/inst.rs similarity index 99% rename from crates/oxide_compiler/src/ir/inst.rs rename to crates/oxide_ir/src/inst.rs index 0b6229b..a3cd23f 100644 --- a/crates/oxide_compiler/src/ir/inst.rs +++ b/crates/oxide_ir/src/inst.rs @@ -6,7 +6,7 @@ use oxide_bytecode::opcode::OpCode; use smallvec::SmallVec; -use super::operand::{LabelId, Operand}; +use crate::operand::{LabelId, Operand}; #[derive(Debug, Clone, PartialEq, Eq)] pub struct Inst { diff --git a/crates/oxide_compiler/src/ir/mod.rs b/crates/oxide_ir/src/lib.rs similarity index 99% rename from crates/oxide_compiler/src/ir/mod.rs rename to crates/oxide_ir/src/lib.rs index 0d446b6..f90f1a9 100644 --- a/crates/oxide_compiler/src/ir/mod.rs +++ b/crates/oxide_ir/src/lib.rs @@ -17,7 +17,7 @@ pub mod operand; use oxide_bytecode::module::{Constant, UpvalueCapture}; -use self::inst::Inst; +use crate::inst::Inst; /// 参数段布局:base 起 count 个寄存器连续(VM 调用契约),RegAlloc 输入。 #[derive(Debug, Clone, Copy, PartialEq, Eq)] diff --git a/crates/oxide_compiler/src/ir/lower.rs b/crates/oxide_ir/src/lower.rs similarity index 98% rename from crates/oxide_compiler/src/ir/lower.rs rename to crates/oxide_ir/src/lower.rs index 805d499..92d5add 100644 --- a/crates/oxide_compiler/src/ir/lower.rs +++ b/crates/oxide_ir/src/lower.rs @@ -7,9 +7,9 @@ use oxide_bytecode::module::CompiledModule; use oxide_bytecode::opcode::{self, OpCode}; -use super::inst::Inst; -use super::operand::Operand; -use super::IRFunction; +use crate::inst::Inst; +use crate::operand::Operand; +use crate::IRFunction; /// IRFunction → CompiledModule。错误消息与现状(退役前 compiler.rs)逐字一致。 pub fn lower(f: &IRFunction) -> Result { diff --git a/crates/oxide_compiler/src/ir/operand.rs b/crates/oxide_ir/src/operand.rs similarity index 100% rename from crates/oxide_compiler/src/ir/operand.rs rename to crates/oxide_ir/src/operand.rs