[pypy-commit] lang-smalltalk default: merge the different approaches to exiting using a new exception: Exit

lwassermann noreply at buildbot.pypy.org
Wed Apr 17 18:27:49 CEST 2013


Author: Lars Wassermann <lars.wassermann at gmail.com>
Branch: 
Changeset: r292:0cff3f71df5a
Date: 2013-04-17 17:11 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/0cff3f71df5a/

Log:	merge the different approaches to exiting using a new exception:
	Exit implemented Quit-Primitive (139)

diff --git a/spyvm/display.py b/spyvm/display.py
--- a/spyvm/display.py
+++ b/spyvm/display.py
@@ -80,9 +80,8 @@
                                 else:
                                     pass # XXX: Todo?
                     elif c_type == RSDL.QUIT:
-                        from spyvm.interpreter import ReturnFromTopLevel
-                        print "Window closed.."
-                        raise SystemExit()
+                        from spyvm.error import Exit
+                        raise Exit("Window closed..")
         finally:
             lltype.free(event, flavor='raw')
 
diff --git a/spyvm/error.py b/spyvm/error.py
--- a/spyvm/error.py
+++ b/spyvm/error.py
@@ -24,4 +24,8 @@
         self.msg = msg
 
 class BlockCannotReturnError(SmalltalkException):
-	pass
\ No newline at end of file
+	pass
+
+class Exit(Exception):
+    def __init__(self, msg):
+        self.msg = msg
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -325,10 +325,9 @@
 
 @expose_primitive(FAIL)
 def func(interp, s_frame, argcount):
-    from spyvm.interpreter import ReturnFromTopLevel
+    from spyvm.error import Exit
     if s_frame.w_method()._likely_methodname == 'doesNotUnderstand:':
-        print 'Probably Debugger called...'
-        raise ReturnFromTopLevel(interp.space.wrap_string("debugger called"))
+        raise Exit('Probably Debugger called...')
     raise PrimitiveFailedError()
 
 # ___________________________________________________________________________
@@ -743,10 +742,14 @@
 
 @expose_primitive(QUIT, unwrap_spec=[object])
 def func(interp, s_frame, w_rcvr):
-    raise PrimitiveNotYetWrittenError()
+    from spyvm.error import Exit
+    raise Exit('Quit-Primitive called..')
 
 @expose_primitive(EXIT_TO_DEBUGGER, unwrap_spec=[object])
 def func(interp, s_frame, w_rcvr):
+    from rpython.rlib import objectmodel
+    if not objectmodel.we_are_translated():
+        import pdb; pdb.set_trace()
     raise PrimitiveNotYetWrittenError()
 
 @expose_primitive(CHANGE_CLASS, unwrap_spec=[object, object], no_result=True)
diff --git a/targetimageloadingsmalltalk.py b/targetimageloadingsmalltalk.py
--- a/targetimageloadingsmalltalk.py
+++ b/targetimageloadingsmalltalk.py
@@ -4,7 +4,8 @@
 from rpython.rlib.streamio import open_file_as_stream
 from rpython.rlib import jit
 
-from spyvm import model, interpreter, squeakimage, objspace, wrapper, model
+from spyvm import model, interpreter, squeakimage, objspace, wrapper, model, \
+                error
 from spyvm.tool.analyseimage import create_image
 
 
@@ -15,6 +16,8 @@
         w_result = interp.perform(w_object, benchmark)
     except interpreter.ReturnFromTopLevel, e:
         w_result = e.object
+    except error.Exit, e:
+        print e.msg
     t2 = time.time()
     if w_result:
         if isinstance(w_result, model.W_BytesObject):
@@ -30,7 +33,10 @@
     w_ctx = ap.suspended_context()
     assert isinstance(w_ctx, model.W_PointersObject)
     ap.store_suspended_context(space.w_nil)
-    interp.interpret_with_w_frame(w_ctx)
+    try:
+        interp.interpret_with_w_frame(w_ctx)
+    except error.Exit, e:
+        print e.msg
     return 0
 
 


More information about the pypy-commit mailing list