perf: 数组迭代方法元素读取走密集直读快路径

This commit is contained in:
2026-08-13 18:12:49 +08:00
parent 7f1374a5f1
commit cd9132fb14
2 changed files with 60 additions and 1 deletions
+9 -1
View File
@@ -109,10 +109,18 @@ fn get_this_arraylike<H: VmHost>(vm: &mut H, val: JsValue) -> Result<(*mut JsObj
/// 从 arraylike 读取 index 位置元素(按规范 Get:访问器/原型链/异常完整传播)。
#[inline(always)]
fn arraylike_get<H: VmHost>(vm: &mut H, ptr: *mut JsObject, i: usize) -> Result<JsValue, JsValue> {
// 真数组密集直读快路径:无元素 meta(无 hole / accessor,O(1) 空指针判定)且
// 索引在元素区内时,直接读数据槽,免每元素构造数字串 + 属性键转换。
// 语义与 ordinary_get 一致:`array_elements_meta_vec().is_none()` 保证该索引
// 恒为数据属性(见 vm_props.rs ordinary_get_inner 数组分支)。
let obj = unsafe { &*ptr };
if obj.is_array() && obj.array_elements_meta_vec().is_none() && i < obj.array_prop_count as usize {
return Ok(obj.get_prop_at(i));
}
let key_str = vm.new_string(&i.to_string());
let key_si = vm.property_key_si(key_str);
let recv = JsValue::from_js_object(ptr);
match vm.ordinary_get(unsafe { &*ptr }, key_si, recv) {
match vm.ordinary_get(obj, key_si, recv) {
Ok(v) => Ok(v),
Err(msg) => Err(from_engine_error(vm, &msg)),
}