mirror of
https://github.com/loro-dev/loro.git
synced 2025-02-06 12:25:03 +00:00
Fix potential movable list bug (#354)
* fix: upgrade wasm-bindgen to fix str free err * chore: fix ci * fix: potential bug in movable list op group
This commit is contained in:
parent
0660b1a1be
commit
a9484b48a2
1 changed files with 36 additions and 10 deletions
|
@ -295,8 +295,13 @@ impl OpGroupTrait for MovableListOpGroup {
|
||||||
let full_id = op.id_full();
|
let full_id = op.id_full();
|
||||||
let mapping = self
|
let mapping = self
|
||||||
.elem_mappings
|
.elem_mappings
|
||||||
.get_mut(elem_id)
|
.entry(*elem_id)
|
||||||
.unwrap()
|
.or_insert_with(|| {
|
||||||
|
MovableListTarget::Multiple(Box::new(MultipleInner {
|
||||||
|
poses: BTreeSet::default(),
|
||||||
|
values: BTreeSet::default(),
|
||||||
|
}))
|
||||||
|
})
|
||||||
.upgrade(*elem_id);
|
.upgrade(*elem_id);
|
||||||
mapping.values.insert(GroupedMapOpInfo {
|
mapping.values.insert(GroupedMapOpInfo {
|
||||||
value: value.clone(),
|
value: value.clone(),
|
||||||
|
@ -309,21 +314,42 @@ impl OpGroupTrait for MovableListOpGroup {
|
||||||
for (i, v) in self.arena.iter_value_slice(slice.to_range()).enumerate() {
|
for (i, v) in self.arena.iter_value_slice(slice.to_range()).enumerate() {
|
||||||
let id = start_id.inc(i as i32);
|
let id = start_id.inc(i as i32);
|
||||||
let full_id = op.id_full().inc(i as i32);
|
let full_id = op.id_full().inc(i as i32);
|
||||||
self.elem_mappings.insert(
|
if let Some(target) = self.elem_mappings.get_mut(&id) {
|
||||||
id,
|
let inner = target.upgrade(id);
|
||||||
MovableListTarget::One {
|
inner.poses.insert(GroupedMapOpInfo {
|
||||||
value: v,
|
value: (),
|
||||||
counter: full_id.counter,
|
counter: full_id.counter,
|
||||||
},
|
lamport: full_id.lamport,
|
||||||
);
|
peer: full_id.peer,
|
||||||
|
});
|
||||||
|
inner.values.insert(GroupedMapOpInfo {
|
||||||
|
value: v.clone(),
|
||||||
|
counter: full_id.counter,
|
||||||
|
lamport: full_id.lamport,
|
||||||
|
peer: full_id.peer,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
self.elem_mappings.insert(
|
||||||
|
id,
|
||||||
|
MovableListTarget::One {
|
||||||
|
value: v,
|
||||||
|
counter: full_id.counter,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
crate::container::list::list_op::InnerListOp::Move { from_id, .. } => {
|
crate::container::list::list_op::InnerListOp::Move { from_id, .. } => {
|
||||||
let full_id = op.id_full();
|
let full_id = op.id_full();
|
||||||
let mapping = self
|
let mapping = self
|
||||||
.elem_mappings
|
.elem_mappings
|
||||||
.get_mut(from_id)
|
.entry(*from_id)
|
||||||
.unwrap()
|
.or_insert_with(|| {
|
||||||
|
MovableListTarget::Multiple(Box::new(MultipleInner {
|
||||||
|
poses: BTreeSet::default(),
|
||||||
|
values: BTreeSet::default(),
|
||||||
|
}))
|
||||||
|
})
|
||||||
.upgrade(*from_id);
|
.upgrade(*from_id);
|
||||||
mapping.poses.insert(GroupedMapOpInfo {
|
mapping.poses.insert(GroupedMapOpInfo {
|
||||||
value: (),
|
value: (),
|
||||||
|
|
Loading…
Reference in a new issue