[pypy-commit] lang-smalltalk storage: Fixed RPython compile error regarding constructors. Reduced code duplication.
anton_gulenko
noreply at buildbot.pypy.org
Mon Mar 31 19:40:36 CEST 2014
Author: Anton Gulenko <anton.gulenko at googlemail.com>
Branch: storage
Changeset: r728:6558ff7c5237
Date: 2014-03-31 15:31 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/6558ff7c5237/
Log: Fixed RPython compile error regarding constructors. Reduced code
duplication.
diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -559,7 +559,8 @@
def initialize_storage(self, space, size, weak=False):
from spyvm.shadow import empty_storage
- self.store_shadow(empty_storage(space, size, weak)(space, self, size))
+ storage = empty_storage(space, self, size, weak)
+ self.store_shadow(storage)
self.log_storage("Initialized")
def fillin(self, space, g_self):
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -56,6 +56,8 @@
class AbstractStorageShadow(AbstractShadow):
_attrs_ = []
repr_classname = "AbstractStorageShadow"
+ def __init__(self, space, w_self, size):
+ AbstractShadow.__init__(self, space, w_self)
def store(self, n0, w_val):
if self.can_contain(w_val):
return self.do_store(n0, w_val)
@@ -73,7 +75,7 @@
_attrs_ = ['_size']
_immutable_fields_ = ['_size']
def __init__(self, space, w_self, size):
- AbstractShadow.__init__(self, space, w_self)
+ AbstractStorageShadow.__init__(self, space, w_self, size)
self._size = size
def fetch(self, n0):
if n0 >= self._size:
@@ -95,7 +97,7 @@
_immutable_fields_ = ['storage']
def __init__(self, space, w_self, size):
- AbstractStorageShadow.__init__(self, space, w_self)
+ AbstractStorageShadow.__init__(self, space, w_self, size)
self.storage = [self.nil_value] * size
def size(self):
@@ -162,14 +164,14 @@
def unwrap(space, w_val):
return space.unwrap_float(w_val)
-def empty_storage(space, size, weak=False):
+def empty_storage(space, w_self, size, weak=False):
if weak:
- return WeakListStorageShadow
+ return WeakListStorageShadow(space, w_self, size)
else:
if no_specialized_storage:
- return ListStorageShadow
+ return ListStorageShadow(space, w_self, size)
else:
- return AllNilStorageShadow
+ return AllNilStorageShadow(space, w_self, size)
def find_storage_for_objects(space, vars):
if no_specialized_storage:
@@ -201,15 +203,23 @@
# If this happens, please look for a bug in the code above.
assert False, "No strategy could be found for list..."
-
-class ListStorageShadow(AbstractShadow):
+
+class ListStorageMixin(object):
+ def __init__(self, space, w_self, size):
+ AbstractStorageShadow.__init__(self, space, w_self, size)
+ self.initialize_storage(size)
+ def size(self):
+ return len(self.storage)
+ def copy_from(self, other_shadow):
+ if self.size() != other_shadow.size():
+ self.initialize_storage(other_shadow.size())
+ AbstractShadow.copy_from(self, other_shadow)
+
+class ListStorageShadow(AbstractStorageShadow):
_attrs_ = ['storage']
_immutable_fields_ = ['storage']
repr_classname = "ListStorageShadow"
-
- def __init__(self, space, w_self, size):
- AbstractShadow.__init__(self, space, w_self)
- self.initialize_storage(size)
+ import_from_mixin(ListStorageMixin)
def initialize_storage(self, size):
self.storage = [self.space.w_nil] * size
@@ -217,30 +227,21 @@
return self.storage[n0]
def store(self, n0, w_value):
self.storage[n0] = w_value
- def size(self):
- return len(self.storage)
- def copy_from(self, other_shadow):
- if self.size() != other_shadow.size():
- self.initialize_storage(other_shadow.size())
- AbstractShadow.copy_from(self, other_shadow)
-class WeakListStorageShadow(AbstractShadow):
+class WeakListStorageShadow(AbstractStorageShadow):
_attrs_ = ['storage']
_immutable_fields_ = ['storage']
repr_classname = "WeakListStorageShadow"
+ import_from_mixin(ListStorageMixin)
- def __init__(self, space, w_self, size):
- AbstractShadow.__init__(self, space, w_self)
- self.storage = [weakref.ref(space.w_nil)] * size
-
+ def initialize_storage(self, size):
+ self.storage = [weakref.ref(self.space.w_nil)] * size
def fetch(self, n0):
weakobj = self.storage[n0]
return weakobj() or self.space.w_nil
def store(self, n0, w_value):
assert w_value is not None
self.storage[n0] = weakref.ref(w_value)
- def size(self):
- return len(self.storage)
class AbstractCachingShadow(ListStorageShadow):
_immutable_fields_ = ['version?']
More information about the pypy-commit
mailing list