[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