[pypy-commit] lang-smalltalk storage: Added a suppress_process_switch flag as a hack to enable the -r flag in the Squeak image.

anton_gulenko noreply at buildbot.pypy.org
Thu Jul 10 12:56:53 CEST 2014


Author: Anton Gulenko <anton.gulenko at googlemail.com>
Branch: storage
Changeset: r876:f77d391e1255
Date: 2014-07-07 18:46 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/f77d391e1255/

Log:	Added a suppress_process_switch flag as a hack to enable the -r flag
	in the Squeak image.

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -86,6 +86,7 @@
                     s_new_context = s_sender
                 s_new_context.push(nlr.value)
             except ProcessSwitch, p:
+                assert not self.space.suppress_process_switch, "ProcessSwitch should be disabled..."
                 if self.trace:
                     print "====== Switched process from: %s" % s_new_context.short_str()
                     print "====== to: %s " % p.s_new_context.short_str()
diff --git a/spyvm/objspace.py b/spyvm/objspace.py
--- a/spyvm/objspace.py
+++ b/spyvm/objspace.py
@@ -21,6 +21,9 @@
         
         self.make_bootstrap_classes()
         self.make_bootstrap_objects()
+        
+        # This is a hack; see compile_code() in targetimageloadingsmalltalk.py
+        self.suppress_process_switch = False
 
     def find_executable(self, executable):
         if os.sep in executable or (os.name == "nt" and ":" in executable):
diff --git a/spyvm/wrapper.py b/spyvm/wrapper.py
--- a/spyvm/wrapper.py
+++ b/spyvm/wrapper.py
@@ -93,8 +93,9 @@
         active_priority = active_process.priority()
         priority = self.priority()
         if priority > active_priority:
-            active_process.deactivate(s_current_frame)
-            self.activate()
+            if not self.space.suppress_process_switch:
+                active_process.deactivate(s_current_frame)
+                self.activate()
         else:
             self.put_to_sleep()
 
@@ -103,10 +104,11 @@
 
     def suspend(self, s_current_frame):
         if self.is_active_process():
-            assert self.my_list().is_nil(self.space)
-            w_process = scheduler(self.space).pop_highest_priority_process()
-            self.deactivate(s_current_frame, put_to_sleep=False)
-            ProcessWrapper(self.space, w_process).activate()
+            if not self.space.suppress_process_switch:
+                assert self.my_list().is_nil(self.space)
+                w_process = scheduler(self.space).pop_highest_priority_process()
+                self.deactivate(s_current_frame, put_to_sleep=False)
+                ProcessWrapper(self.space, w_process).activate()
         else:
             if not self.my_list().is_nil(self.space):
                 process_list = ProcessListWrapper(self.space, self.my_list())
diff --git a/targetimageloadingsmalltalk.py b/targetimageloadingsmalltalk.py
--- a/targetimageloadingsmalltalk.py
+++ b/targetimageloadingsmalltalk.py
@@ -172,13 +172,22 @@
     space = interp.space
     w_receiver_class = w_receiver.getclass(space)
     try:
-        w_result = interp.perform(
-            w_receiver_class,
-            "compile:classified:notifying:",
-            w_arguments = [space.wrap_string("%s\r\n%s" % (selector, code)),
-            space.wrap_string("spy-run-code"),
-            space.w_nil]
-        )
+        try:
+            # The suppress_process_switch flag is a hack/workaround to enable compiling code
+            # before having initialized the image cleanly. The problem is that the TimingSemaphore is not yet
+            # registered (primitive 136 not called), so the idle process will never be left once it is entered.
+            # TODO - Find a way to cleanly initialize the image, without executing the active_context of the image.
+            # Instead, we want to execute our own context. Then remove this flag (and all references to it)
+            interp.space.suppress_process_switch = True
+            w_result = interp.perform(
+                w_receiver_class,
+                "compile:classified:notifying:",
+                w_arguments = [space.wrap_string("%s\r\n%s" % (selector, code)),
+                space.wrap_string("spy-run-code"),
+                space.w_nil]
+            )
+        finally:
+            interp.space.suppress_process_switch = False
         # TODO - is this expected in every image?
         if not isinstance(w_result, model.W_BytesObject) or w_result.as_string() != selector:
             print "Compilation failed, unexpected result: %s" % result_string(w_result)


More information about the pypy-commit mailing list