[pypy-commit] lang-smalltalk storage: Changed the receiver of top-level methods (executed with -r) to nil (like a DoIt in the workspace).

anton_gulenko noreply at buildbot.pypy.org
Wed May 7 21:16:21 CEST 2014


Author: Anton Gulenko <anton.gulenko at googlemail.com>
Branch: storage
Changeset: r809:6b8d21d604c3
Date: 2014-05-07 16:43 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/6b8d21d604c3/

Log:	Changed the receiver of top-level methods (executed with -r) to nil
	(like a DoIt in the workspace).

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -108,7 +108,7 @@
                 self.step(s_context)
             except Return, nlr:
                 if nlr.s_target_context is not s_context:
-                    if not s_context.is_closure_context() and s_context.w_method().primitive() == 198:
+                    if not s_context.is_closure_context() and method.primitive() == 198:
                         s_context.activate_unwind_context(self)
                     s_context.mark_returned()
                     raise nlr
@@ -201,18 +201,19 @@
                                             "asSymbol")
         else:
             w_selector = selector
-
+        
         w_method = model.W_CompiledMethod(self.space, header=512)
         w_method.literalatput0(self.space, 1, w_selector)
         assert len(arguments_w) <= 7
         w_method.setbytes([chr(131), chr(len(arguments_w) << 5 + 0), chr(124)]) #returnTopFromMethod
+        w_method.set_lookup_class_and_name(w_receiver.getclass(self.space), "Interpreter.perform")
         s_frame = MethodContextShadow(self.space, None, w_method, w_receiver, [])
         s_frame.push(w_receiver)
         s_frame.push_all(list(arguments_w))
-
+        
         self.interrupt_check_counter = self.interrupt_counter_size
         return self.interpret_toplevel(s_frame.w_self())
-        
+    
 class ReturnFromTopLevel(Exception):
     _attrs_ = ["object"]
     def __init__(self, object):
diff --git a/spyvm/test/jit.py b/spyvm/test/jit.py
--- a/spyvm/test/jit.py
+++ b/spyvm/test/jit.py
@@ -52,7 +52,7 @@
     s_frame = shadow.MethodContextShadow(space, None, w_method, w_receiver, [])
     w_frame = s_frame.w_self()
     def interp_execute_frame():
-        return interp.loop(w_frame)
+        return interp.interpret_toplevel(w_frame)
     return interp_execute_frame
 
 # ==== The following will pre-load images and build a jit based on methods from the entry-point module
diff --git a/targetimageloadingsmalltalk.py b/targetimageloadingsmalltalk.py
--- a/targetimageloadingsmalltalk.py
+++ b/targetimageloadingsmalltalk.py
@@ -68,26 +68,29 @@
 
 def _run_code(interp, code, as_benchmark=False):
     import time
-    selector = "codeTest%d" % int(time.time())
+    selector = "DoIt%d" % int(time.time())
     space = interp.space
+    w_receiver = space.w_nil
+    w_receiver_class = w_receiver.getclass(space)
     try:
         w_result = interp.perform(
-            space.w_SmallInteger,
+            w_receiver_class,
             "compile:classified:notifying:",
             space.wrap_string("%s\r\n%s" % (selector, code)),
             space.wrap_string("spy-run-code"),
             space.w_nil
         )
+        w_receiver_class.as_class_get_shadow(space).s_methoddict().sync_method_cache()
     except interpreter.ReturnFromTopLevel, e:
         print e.object
         return 1
     except error.Exit, e:
         print e.msg
         return 1
-
+    
     if not as_benchmark:
         try:
-            w_result = interp.perform(space.wrap_int(0), selector)
+            w_result = interp.perform(w_receiver, selector)
         except interpreter.ReturnFromTopLevel, e:
             print e.object
             return 1


More information about the pypy-commit mailing list