From 26441edcbc2fa4ef0799a0fbfaca58697c4dc275 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Mon, 12 Oct 2026 04:01:14 +0000 Subject: [PATCH] =?UTF-8?q?perf:=20=E7=B1=BB=E7=A7=81=E6=9C=89=E5=90=8D?= =?UTF-8?q?=E4=BD=9C=E7=94=A8=E5=9F=9F=E5=AE=B9=E5=99=A8=E6=94=B9=E5=93=88?= =?UTF-8?q?=E5=B8=8C=E8=A1=A8=EF=BC=8C=E7=82=B9=E6=9F=A5=E7=94=B1=E7=BA=BF?= =?UTF-8?q?=E6=80=A7=E6=89=AB=E6=8F=8F=E6=94=B9=20O(1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 40 +++++++++++------------ Cargo.toml | 2 +- crates/oxide_emit/src/class/emit.rs | 6 ++-- crates/oxide_emit/src/compile_ctx.rs | 4 +-- crates/oxide_emit/src/emit_ctx.rs | 9 +++-- crates/oxide_emit/src/shared/class_key.rs | 7 ++-- 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 07af3306..3bf2a0a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.16.3" +version = "0.16.4" dependencies = [ "chrono", "fast-float", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.16.3" +version = "0.16.4" dependencies = [ "num-bigint", "oxide_log", @@ -1193,7 +1193,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.16.3" +version = "0.16.4" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.16.3" +version = "0.16.4" dependencies = [ "ansi_term", "bumpalo", @@ -1228,7 +1228,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.16.3" +version = "0.16.4" dependencies = [ "lru", "oxide_bytecode", @@ -1237,7 +1237,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.16.3" +version = "0.16.4" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1257,7 +1257,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.16.3" +version = "0.16.4" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1271,7 +1271,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.16.3" +version = "0.16.4" dependencies = [ "num-bigint", "oxc_allocator", @@ -1286,7 +1286,7 @@ dependencies = [ [[package]] name = "oxide_engine" -version = "0.16.3" +version = "0.16.4" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1298,7 +1298,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.16.3" +version = "0.16.4" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1307,7 +1307,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bumpalo", "dashmap", @@ -1321,7 +1321,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.16.3" +version = "0.16.4" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1333,7 +1333,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.16.3" +version = "0.16.4" dependencies = [ "tracing", "tracing-appender", @@ -1342,11 +1342,11 @@ dependencies = [ [[package]] name = "oxide_net" -version = "0.16.3" +version = "0.16.4" [[package]] name = "oxide_parser" -version = "0.16.3" +version = "0.16.4" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1361,7 +1361,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.16.3" +version = "0.16.4" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1377,7 +1377,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.16.3" +version = "0.16.4" dependencies = [ "num-bigint", "num-traits", @@ -1390,7 +1390,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.16.3" +version = "0.16.4" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1410,7 +1410,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bumpalo", "dashmap", @@ -1423,7 +1423,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 5674b86d..22fde606 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ members = [ ] [workspace.package] -version = "0.16.3" +version = "0.16.4" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_emit/src/class/emit.rs b/crates/oxide_emit/src/class/emit.rs index d8305f21..77a1bc40 100644 --- a/crates/oxide_emit/src/class/emit.rs +++ b/crates/oxide_emit/src/class/emit.rs @@ -167,10 +167,8 @@ impl Emitter { let mut stacked_names = saved_private_names.clone(); let mut stacked_kinds = saved_private_kinds.clone(); for (n, id, kind, is_static) in &private_names { - stacked_names.retain(|(en, _)| en != n); - stacked_kinds.retain(|(en, _, _, _)| en != n); - stacked_names.push((n.clone(), *id)); - stacked_kinds.push((n.clone(), *kind, *is_static, private_brand_id.unwrap_or(0))); + stacked_names.insert(n.clone(), *id); + stacked_kinds.insert(n.clone(), (*kind, *is_static, private_brand_id.unwrap_or(0))); } ctx.scopes.private_name_map = stacked_names; ctx.scopes.private_element_kinds = stacked_kinds; diff --git a/crates/oxide_emit/src/compile_ctx.rs b/crates/oxide_emit/src/compile_ctx.rs index dce7ce0e..f40abea1 100644 --- a/crates/oxide_emit/src/compile_ctx.rs +++ b/crates/oxide_emit/src/compile_ctx.rs @@ -266,8 +266,8 @@ impl CompileCtx { scopes: ScopeCtx { symbols: SymbolTable::new(), builtin_reg_map: Vec::new(), - private_name_map: Vec::new(), - private_element_kinds: Vec::new(), + private_name_map: HashMap::new(), + private_element_kinds: HashMap::new(), private_brand_id: None, next_private_name_id: 1, }, diff --git a/crates/oxide_emit/src/emit_ctx.rs b/crates/oxide_emit/src/emit_ctx.rs index 318a3e29..c76664ce 100644 --- a/crates/oxide_emit/src/emit_ctx.rs +++ b/crates/oxide_emit/src/emit_ctx.rs @@ -5,6 +5,8 @@ //! `PatternCtx` 为解构工作预留。执行流字段(insts/registers/pc 等)仍 //! 平铺在 `CompileCtx` 上。 +use std::collections::HashMap; + use crate::symbol_table::SymbolTable; use oxide_ir::operand::LabelId; use oxide_parser::MethodDefinitionKind; @@ -147,12 +149,13 @@ impl LabelCtx { pub(crate) struct ScopeCtx { pub(crate) symbols: SymbolTable, pub(crate) builtin_reg_map: Vec<(String, u32)>, - pub(crate) private_name_map: Vec<(String, u32)>, - /// 私有元素类型(name, kind,static 标志,声明类 brand id)。kind=None 表示 + /// 私有名 → 私有名 id。 + pub(crate) private_name_map: HashMap, + /// 私有元素类型(kind,static 标志,声明类 brand id)。kind=None 表示 /// 字段;instance 字段的私有访问走 PrivateFieldFind 原型链查找,不加 brand /// 检查。brand_id 是声明该私有名的类的 brand id:跨类访问时 brand 检查须 /// 定位声明类(而非访问发生处类)的 brand 对象。 - pub(crate) private_element_kinds: Vec<(String, Option, bool, u32)>, + pub(crate) private_element_kinds: HashMap, bool, u32)>, /// 当前类的私有 brand 私有名 id:私有方法/访问器访问时对实例做 brand 检查。 pub(crate) private_brand_id: Option, pub(crate) next_private_name_id: u32, diff --git a/crates/oxide_emit/src/shared/class_key.rs b/crates/oxide_emit/src/shared/class_key.rs index 121c8b35..55be0536 100644 --- a/crates/oxide_emit/src/shared/class_key.rs +++ b/crates/oxide_emit/src/shared/class_key.rs @@ -12,8 +12,8 @@ impl Emitter { pub(crate) fn private_name_id(&self, name: &str, ctx: &CompileCtx) -> Result { ctx.scopes .private_name_map - .iter() - .find_map(|(n, id)| (n == name).then_some(*id)) + .get(name) + .copied() .ok_or_else(|| format!("private name #{name} is not defined")) } @@ -36,8 +36,7 @@ impl Emitter { pub(crate) fn private_access_brand( &self, _obj_reg: u32, name: &str, ctx: &mut CompileCtx, ) -> Result<(u32, u32), String> { - let entry = ctx.scopes.private_element_kinds.iter().find(|(n, _, _, _)| n == name); - let Some((_, kind, is_static, brand_id)) = entry else { + let Some((kind, is_static, brand_id)) = ctx.scopes.private_element_kinds.get(name) else { return Ok((0, 0)); }; if kind.is_none() && !is_static {