diff --git a/Cargo.lock b/Cargo.lock index 097bb71a..577782c2 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 350b97b1..65786a48 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 fc7cb633..677813e7 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 5bf0d0cb..c43e0c20 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 ec3a9358..228d07d9 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 1b7c760b..d031e2df 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 86c513e1..afa526cc 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 e091524c..9eb4bc97 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 25c09430..b012dcef 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 d9837425..9d2aed67 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 593f577c..70202878 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 0e1419ec..01676a2e 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 792ca00c..5cc565c7 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 c4c27e5c..06a2a275 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 2f2e1193..d76a21ec 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 4b9d8e0c..763d1bd7 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 24776208..2adcb3af 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 7ebb2a50..df76d008 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 eb117932..bca50e79 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 bac18e96..08c4e2b2 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 47863593..5a7fa78e 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 c88ae0b8..47be17de 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 87d09c43..23a3cdf7 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 ed17e8f0..3ca30a2e 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 e369f03f..5fa85aa7 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 2ac14cf1..3d07a57c 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 3db3ca7e..4eb54abd 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 44af2963..6a377b82 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 dd40f007..ef120d74 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 1948fa9a..c423a159 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 6e373d3b..cf02625a 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 eee2ebb6..d9fd56b1 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 c9656d7e..0c0abfd6 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 0ed3e356..461af9e4 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 cc067b45..e58795e3 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 015064b8..0acda96d 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 138e4b5d..9cf01ac0 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 fe84d56a..c2110538 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 c81fac38..8ff13e5a 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 b09fce73..c97a24a3 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 701c06a8..810a465e 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 00000000..a60f3d7f --- /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 0b6229be..a3cd23ff 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 0d446b6c..f90f1a96 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 805d4997..92d5add7 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