|
1 | 1 | use serde::ser::{Serialize, SerializeMap, Serializer};
|
2 | 2 |
|
3 |
| -use crate::fast_hash_map::FastHashMap; |
| 3 | +use crate::fast_hash_map::FastIndexSet; |
4 | 4 |
|
5 | 5 | /// The stack table stores the tree of stack nodes of a thread. The shape of the tree is encoded in
|
6 | 6 | /// the prefix column: Root stack nodes have null as their prefix, and every non-root stack has the
|
@@ -40,40 +40,28 @@ use crate::fast_hash_map::FastHashMap;
|
40 | 40 | /// would be lost if it wasn't inherited into the nsAttrAndChildArray::InsertChildAt stack before
|
41 | 41 | /// transforms are applied.
|
42 | 42 | #[derive(Debug, Clone, Default)]
|
43 |
| -pub struct StackTable { |
44 |
| - stack_prefixes: Vec<Option<usize>>, |
45 |
| - stack_frames: Vec<usize>, |
46 |
| - |
47 |
| - // (parent stack, frame_index) -> stack index |
48 |
| - index: FastHashMap<(Option<usize>, usize), usize>, |
49 |
| -} |
| 43 | +pub struct StackTable(FastIndexSet<(Option<usize>, usize)>); |
50 | 44 |
|
51 | 45 | impl StackTable {
|
52 | 46 | pub fn new() -> Self {
|
53 | 47 | Default::default()
|
54 | 48 | }
|
55 | 49 |
|
56 | 50 | pub fn index_for_stack(&mut self, prefix: Option<usize>, frame: usize) -> usize {
|
57 |
| - match self.index.get(&(prefix, frame)) { |
58 |
| - Some(stack) => *stack, |
59 |
| - None => { |
60 |
| - let stack = self.stack_prefixes.len(); |
61 |
| - self.stack_prefixes.push(prefix); |
62 |
| - self.stack_frames.push(frame); |
63 |
| - self.index.insert((prefix, frame), stack); |
64 |
| - stack |
65 |
| - } |
66 |
| - } |
| 51 | + let (stack_index, _is_new) = self.0.insert_full((prefix, frame)); |
| 52 | + stack_index |
67 | 53 | }
|
68 | 54 | }
|
69 | 55 |
|
70 | 56 | impl Serialize for StackTable {
|
71 | 57 | fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
|
72 |
| - let len = self.stack_prefixes.len(); |
| 58 | + let len = self.0.len(); |
73 | 59 | let mut map = serializer.serialize_map(Some(3))?;
|
74 | 60 | map.serialize_entry("length", &len)?;
|
75 |
| - map.serialize_entry("prefix", &self.stack_prefixes)?; |
76 |
| - map.serialize_entry("frame", &self.stack_frames)?; |
| 61 | + let prefix_col: Vec<_> = self.0.iter().map(|(prefix, _)| *prefix).collect(); |
| 62 | + let frame_col: Vec<_> = self.0.iter().map(|(_, frame)| *frame).collect(); |
| 63 | + map.serialize_entry("prefix", &prefix_col)?; |
| 64 | + map.serialize_entry("frame", &frame_col)?; |
77 | 65 | map.end()
|
78 | 66 | }
|
79 | 67 | }
|
0 commit comments