Skip to main content

cita_vm/state/
object_entry.rs

1use crate::state::account::StateObject;
2
3#[derive(Eq, PartialEq, Clone, Debug)]
4pub enum ObjectStatus {
5    Clean,
6    Dirty,
7    Committed,
8}
9
10#[derive(Debug, Clone)]
11pub struct StateObjectEntry {
12    /// State object entry. `None` if account known to be non-existant.
13    pub state_object: Option<StateObject>,
14    pub status: ObjectStatus,
15}
16
17impl StateObjectEntry {
18    /// Create a new entry with status `Clean`.
19    pub fn new_clean(state_object: Option<StateObject>) -> StateObjectEntry {
20        StateObjectEntry {
21            state_object,
22            status: ObjectStatus::Clean,
23        }
24    }
25
26    /// Create a new entry with status `Dirty`.
27    pub fn new_dirty(state_object: Option<StateObject>) -> StateObjectEntry {
28        StateObjectEntry {
29            state_object,
30            status: ObjectStatus::Dirty,
31        }
32    }
33
34    /// Return true is status == Dirty.
35    pub fn is_dirty(&self) -> bool {
36        self.status == ObjectStatus::Dirty
37    }
38
39    /// Clone dirty data into new `ObjectEntry`. This includes
40    /// account data and modified storage keys.
41    pub fn clone_dirty(&self) -> StateObjectEntry {
42        StateObjectEntry {
43            state_object: self.state_object.as_ref().map(StateObject::clone_dirty),
44            status: self.status.clone(),
45        }
46    }
47
48    /// Merge with others.
49    pub fn merge(&mut self, other: StateObjectEntry) {
50        self.status = other.status;
51        match other.state_object {
52            Some(acc) => {
53                if let Some(ref mut ours) = self.state_object {
54                    ours.merge(acc);
55                } else {
56                    self.state_object = Some(acc);
57                }
58            }
59            None => self.state_object = None,
60        }
61    }
62}