[pypy-commit] lang-smalltalk default: fixed generation replacing the set with a dictionary
lwassermann
noreply at buildbot.pypy.org
Mon Mar 11 11:48:34 CET 2013
Author: Lars Wassermann <lars.wassermann at gmail.com>
Branch:
Changeset: r164:ac2243dae585
Date: 2013-03-11 11:48 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/ac2243dae585/
Log: fixed generation replacing the set with a dictionary
diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -295,7 +295,7 @@
code = s_method.primitive
if interp.should_trace():
print "%sActually calling primitive %d" % (interp._last_indent, code,)
- func = primitives.prim_table[code]
+ func = primitives.prim_holder.prim_table[code]
try:
# note: argcount does not include rcvr
return func(interp, self, argcount)
diff --git a/spyvm/objspace.py b/spyvm/objspace.py
--- a/spyvm/objspace.py
+++ b/spyvm/objspace.py
@@ -295,7 +295,7 @@
s.space = space
s.version = shadow.Version()
s._w_self = w_class
- s.subclass_s = set()
+ s.subclass_s = {}
s._s_superclass = None
s.store_w_superclass(w_superclass)
s.name = name
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -35,6 +35,12 @@
# Squeak has primitives all the way up to 575
# So all optional primitives will default to the bytecode implementation
prim_table = [make_failing(i) for i in range(576)]
+
+class PrimitiveHolder(object):
+ _immutable_fields_ = ["prim_table[*]"]
+
+prim_holder = PrimitiveHolder()
+prim_holder.prim_table = prim_table
# clean up namespace:
del i
prim_table_implemented_only = []
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -81,7 +81,7 @@
# fields added here should also be in objspace.py:56ff, 300ff
self.name = ''
self._s_superclass = None
- self.subclass_s = set()
+ self.subclass_s = {}
AbstractCachingShadow.__init__(self, space, w_self)
def getname(self):
@@ -247,8 +247,11 @@
self._s_superclass = s_scls
self._s_superclass.attach_s_class(self)
- def attach_s_class(self, s_other): self.subclass_s.add(s_other)
- def detach_s_class(self, s_other): self.subclass_s.remove(s_other)
+ def attach_s_class(self, s_other):
+ self.subclass_s[s_other] = None
+
+ def detach_s_class(self, s_other):
+ del self.subclass_s[s_other]
def changed(self):
self.superclass_changed(Version())
@@ -270,9 +273,10 @@
jit.promote(self)
version = self.version
jit.promote(version)
- return self.safe_lookup(w_selector, version)
+ w_method = self.safe_lookup(w_selector, version)
+ return w_method.as_compiledmethod_get_shadow(self.space)
- @jit.unroll_safe
+ @jit.elidable
def safe_lookup(self, w_selector, version):
assert version is self.version
look_in_shadow = self
@@ -280,7 +284,7 @@
while look_in_shadow is not None:
w_method = look_in_shadow.s_methoddict().find_selector(w_selector)
if w_method is not None:
- return w_method.as_compiledmethod_get_shadow(self.space)
+ return w_method
look_in_shadow = look_in_shadow._s_superclass
raise MethodNotFound(self, w_selector)
@@ -946,6 +950,14 @@
return self._w_self
def getliteral(self, index):
+ jit.promote(self)
+ version = self.version
+ jit.promote(version)
+ return self.safe_getliteral(index, version)
+
+ @jit.elidable
+ def safe_getliteral(self, index, version):
+ assert version is self.version
return self.literals[index]
def getliteralsymbol(self, index):
diff --git a/spyvm/test/test_miniimage.py b/spyvm/test/test_miniimage.py
--- a/spyvm/test/test_miniimage.py
+++ b/spyvm/test/test_miniimage.py
@@ -298,6 +298,9 @@
perform(w(10).getclass(space), "compile:classified:notifying:", w(sourcecode), w('pypy'), w(None))
assert perform(w(10), "fib").is_same_object(w(89))
+def test_get_env():
+ import pdb; pdb.set_trace()
+
def test_step_run_something():
from spyvm.test import test_miniimage
setup_module(test_miniimage, filename='running-something-mini.image')
More information about the pypy-commit
mailing list