From e265bceae639418453736faa40a2ac6bea04f339 Mon Sep 17 00:00:00 2001 From: feliam Date: Tue, 30 Jun 2020 15:15:54 -0300 Subject: [PATCH] Specialized iterative serialization for Array (#1756) * Specialized itereative serialization for Array * lint --- manticore/core/smtlib/expression.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/manticore/core/smtlib/expression.py b/manticore/core/smtlib/expression.py index 39838f015..f63a5c1de 100644 --- a/manticore/core/smtlib/expression.py +++ b/manticore/core/smtlib/expression.py @@ -966,6 +966,27 @@ def index(self): def value(self): return self.operands[2] + def __getstate__(self): + state = {} + array = self + items = [] + while isinstance(array, ArrayStore): + items.append((array.index, array.value)) + array = array.array + state["_array"] = array + state["_items"] = items + return state + + def __setstate__(self, state): + array = state["_array"] + for index, value in reversed(state["_items"][0:]): + array = array.store(index, value) + self._index_bits = array.index_bits + self._index_max = array.index_max + self._value_bits = array.value_bits + index, value = state["_items"][0] + self._operands = (array, index, value) + class ArraySlice(ArrayOperation): def __init__( @@ -1126,7 +1147,6 @@ def __getstate__(self): state["_array"] = self._array state["name"] = self.name state["_concrete_cache"] = self._concrete_cache - state["_written"] = self._written return state def __setstate__(self, state): @@ -1134,7 +1154,7 @@ def __setstate__(self, state): self._array = state["_array"] self._name = state["name"] self._concrete_cache = state["_concrete_cache"] - self._written = state["_written"] + self._written = None def __copy__(self): return ArrayProxy(self)