Skip to content

Commit d82ed73

Browse files
committed
optimize table perf
1 parent dad564f commit d82ed73

2 files changed

Lines changed: 47 additions & 33 deletions

File tree

crates/luars/src/lua_value/lua_table/native_table.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -414,12 +414,12 @@ impl NativeTable {
414414
/// Performs at most one chain walk and reports whether the operation fully
415415
/// completed on the fast path or must be finished through a C-Lua-like
416416
/// encoded continuation.
417-
#[inline(never)]
418-
pub fn pset_shortstr(&mut self, key: &LuaValue, value: LuaValue) -> ShortStrSetResult {
417+
#[inline]
418+
pub fn pset_shortstr(&mut self, key: &LuaValue, value: &LuaValue) -> ShortStrSetResult {
419419
self.pset_shortstr_parts(key, value.value, value.tt)
420420
}
421421

422-
#[inline(always)]
422+
#[inline]
423423
pub(crate) fn pset_shortstr_parts(
424424
&mut self,
425425
key: &LuaValue,
@@ -547,11 +547,11 @@ impl NativeTable {
547547
((node as usize) - (self.node as usize)) / std::mem::size_of::<Node>()
548548
}
549549

550-
#[inline(never)]
550+
#[inline]
551551
pub fn finish_shortstr_set(
552552
&mut self,
553553
key: &LuaValue,
554-
value: LuaValue,
554+
value: &LuaValue,
555555
result: ShortStrSetResult,
556556
) -> (bool, isize) {
557557
match result {
@@ -563,15 +563,15 @@ impl NativeTable {
563563
unsafe {
564564
let node = self.node.add(node_index);
565565
(*node).set_key(*key);
566-
(*node).set_value(value);
566+
(*node).set_value_parts(value.value, value.tt);
567567
}
568568
(new_key, 0)
569569
}
570570
ShortStrSetResult::FinishNewKey => self.insert_new_shortstr(key, value),
571571
}
572572
}
573573

574-
fn insert_new_shortstr(&mut self, key: &LuaValue, value: LuaValue) -> (bool, isize) {
574+
fn insert_new_shortstr(&mut self, key: &LuaValue, value: &LuaValue) -> (bool, isize) {
575575
debug_assert!(key.is_short_string());
576576
debug_assert!(!value.is_nil());
577577

@@ -589,7 +589,7 @@ impl NativeTable {
589589
(true, mem_delta)
590590
}
591591

592-
fn insert_new_shortstr_no_rehash(&mut self, key: &LuaValue, value: LuaValue) -> bool {
592+
fn insert_new_shortstr_no_rehash(&mut self, key: &LuaValue, value: &LuaValue) -> bool {
593593
debug_assert!(self.has_hash());
594594
debug_assert!(key.is_short_string());
595595
debug_assert!(!value.is_nil());
@@ -599,14 +599,14 @@ impl NativeTable {
599599

600600
if (*mp).key_tt == LUA_VNIL {
601601
(*mp).set_key(*key);
602-
(*mp).set_value(value);
602+
(*mp).set_value_parts(value.value, value.tt);
603603
(*mp).next = 0;
604604
return true;
605605
}
606606

607607
if (*mp).val_tt == LUA_VNIL {
608608
(*mp).set_key(*key);
609-
(*mp).set_value(value);
609+
(*mp).set_value_parts(value.value, value.tt);
610610
return true;
611611
}
612612

@@ -623,7 +623,7 @@ impl NativeTable {
623623
(*free_node).next += Self::node_offset(free_node, mp);
624624
}
625625
(*mp).set_key(*key);
626-
(*mp).set_value(value);
626+
(*mp).set_value_parts(value.value, value.tt);
627627
(*mp).next = 0;
628628
return true;
629629
}
@@ -632,7 +632,7 @@ impl NativeTable {
632632

633633
if let Some(free_node) = self.getfreepos() {
634634
(*free_node).set_key(*key);
635-
(*free_node).set_value(value);
635+
(*free_node).set_value_parts(value.value, value.tt);
636636
if (*mp).next != 0 {
637637
(*free_node).next =
638638
Self::node_offset(free_node, mp.offset((*mp).next as isize));
@@ -875,7 +875,7 @@ impl NativeTable {
875875
if (*old_n).key_tt == LUA_VSHRSTR {
876876
let key = LuaValue::from_raw((*old_n).key_data, (*old_n).key_tt);
877877
let value = LuaValue::from_raw((*old_n).val_data, (*old_n).val_tt);
878-
let inserted = self.insert_new_shortstr_no_rehash(&key, value);
878+
let inserted = self.insert_new_shortstr_no_rehash(&key, &value);
879879
debug_assert!(
880880
inserted,
881881
"freshly resized hash must fit live short-string keys"
@@ -1711,8 +1711,8 @@ impl NativeTable {
17111711
}
17121712

17131713
if key.is_short_string() {
1714-
let result = self.pset_shortstr(&key, value);
1715-
return self.finish_shortstr_set(&key, value, result);
1714+
let result = self.pset_shortstr(&key, &value);
1715+
return self.finish_shortstr_set(&key, &value, result);
17161716
}
17171717

17181718
// Not in array range - use hash part

crates/luars/src/lua_vm/execute/table_ops.rs

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -282,17 +282,20 @@ pub(crate) fn op_set_tabup(
282282
meta = table.meta_ptr();
283283
if meta.is_null() || meta.as_mut_ref().data.no_tm(TmKind::NewIndex.into()) {
284284
let (new_key, delta, is_collectable) = if instr.get_k() {
285-
let rc = *k_val(constants, c);
286-
let pset_result = table.impl_table.pset_shortstr(key, rc);
287-
let (new_key, delta) = table.impl_table.finish_shortstr_set(key, rc, pset_result);
288-
(new_key, delta, rc.is_collectable())
285+
let rc_value = k_val(constants, c);
286+
let pset_result = table.impl_table.pset_shortstr(key, rc_value);
287+
let (new_key, delta) =
288+
table
289+
.impl_table
290+
.finish_shortstr_set(key, rc_value, pset_result);
291+
(new_key, delta, rc_value.is_collectable())
289292
} else {
290293
let rc = (*base_stk).offset(c as usize);
291-
let pset_result = table.impl_table.pset_shortstr(key, rc.get());
294+
let pset_result = table.impl_table.pset_shortstr(key, rc.get_ref());
292295
let (new_key, delta) =
293296
table
294297
.impl_table
295-
.finish_shortstr_set(key, rc.get(), pset_result);
298+
.finish_shortstr_set(key, rc.get_ref(), pset_result);
296299
(new_key, delta, rc.is_collectable())
297300
};
298301
if new_key {
@@ -446,17 +449,25 @@ pub(crate) fn op_set_table(
446449
{
447450
let key = rb.get_ref();
448451
let (new_key, delta, needs_barrier) = if instr.get_k() {
449-
let rc = *k_val(constants, c);
450-
let pset_result = table.impl_table.pset_shortstr(key, rc);
451-
let (new_key, delta) = table.impl_table.finish_shortstr_set(key, rc, pset_result);
452-
(new_key, delta, rc.is_collectable() || key.is_collectable())
452+
let rc_value = k_val(constants, c);
453+
let pset_result = table.impl_table.pset_shortstr(key, rc_value);
454+
let (new_key, delta) =
455+
table
456+
.impl_table
457+
.finish_shortstr_set(key, rc_value, pset_result);
458+
(
459+
new_key,
460+
delta,
461+
rc_value.is_collectable() || key.is_collectable(),
462+
)
453463
} else {
454464
let rc = base.offset(c as usize);
455-
let pset_result = table.impl_table.pset_shortstr(key, rc.get());
465+
466+
let pset_result = table.impl_table.pset_shortstr(key, rc.get_ref());
456467
let (new_key, delta) =
457468
table
458469
.impl_table
459-
.finish_shortstr_set(key, rc.get(), pset_result);
470+
.finish_shortstr_set(key, rc.get_ref(), pset_result);
460471
(new_key, delta, (rc.is_collectable() || rb.is_collectable()))
461472
};
462473
if new_key {
@@ -645,17 +656,20 @@ pub(crate) fn op_set_field(
645656
meta = table.meta_ptr();
646657
if meta.is_null() || meta.as_mut_ref().data.no_tm(TmKind::NewIndex.into()) {
647658
let (new_key, delta, is_collectable) = if instr.get_k() {
648-
let rc = *k_val(constants, c);
649-
let pset_result = table.impl_table.pset_shortstr(key, rc);
650-
let (new_key, delta) = table.impl_table.finish_shortstr_set(key, rc, pset_result);
651-
(new_key, delta, rc.is_collectable())
659+
let rc_value = k_val(constants, c);
660+
let pset_result = table.impl_table.pset_shortstr(key, rc_value);
661+
let (new_key, delta) =
662+
table
663+
.impl_table
664+
.finish_shortstr_set(key, rc_value, pset_result);
665+
(new_key, delta, rc_value.is_collectable())
652666
} else {
653667
let rc = (*base_stk).offset(c as usize);
654-
let pset_result = table.impl_table.pset_shortstr(key, rc.get());
668+
let pset_result = table.impl_table.pset_shortstr(key, rc.get_ref());
655669
let (new_key, delta) =
656670
table
657671
.impl_table
658-
.finish_shortstr_set(key, rc.get(), pset_result);
672+
.finish_shortstr_set(key, rc.get_ref(), pset_result);
659673
(new_key, delta, rc.is_collectable())
660674
};
661675
if new_key {

0 commit comments

Comments
 (0)