[pypy-commit] pypy erase-raw-mem: (arigato, alex, fijal) exception catching magic

alex_gaynor noreply at buildbot.pypy.org
Tue Mar 13 01:33:51 CET 2012


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: erase-raw-mem
Changeset: r53399:9391e8143f32
Date: 2012-03-12 17:33 -0700
http://bitbucket.org/pypy/pypy/changeset/9391e8143f32/

Log:	(arigato, alex, fijal) exception catching magic

diff --git a/pypy/rlib/rerased_raw.py b/pypy/rlib/rerased_raw.py
--- a/pypy/rlib/rerased_raw.py
+++ b/pypy/rlib/rerased_raw.py
@@ -79,25 +79,30 @@
 
     def rtyper_new(self, hop):
         [v_arg] = hop.inputargs(lltype.Signed)
+        hop.exception_cannot_occur()
         return hop.gendirectcall(self.ll_new, v_arg)
 
     def rtype_method_getint(self, hop):
         [v_arr, v_idx] = hop.inputargs(self, lltype.Signed)
+        hop.exception_cannot_occur()
         return hop.genop("getarrayitem", [v_arr, v_idx], resulttype=lltype.Signed)
 
     def rtype_method_setint(self, hop):
         [v_arr, v_idx, v_value] = hop.inputargs(self, lltype.Signed, lltype.Signed)
+        hop.exception_cannot_occur()
         hop.genop("setarrayitem", [v_arr, v_idx, v_value])
 
     def rtype_method_getinstance(self, hop):
         v_arr = hop.inputarg(self, arg=0)
         v_idx = hop.inputarg(lltype.Signed, arg=1)
+        hop.exception_cannot_occur()
         v_result = hop.genop("getarrayitem", [v_arr, v_idx], resulttype=lltype.Signed)
         v_addr = hop.genop("cast_int_to_adr", [v_result], resulttype=llmemory.Address)
         return hop.genop("cast_adr_to_ptr", [v_addr], resulttype=hop.r_result.lowleveltype)
 
     def rtype_method_setinstance(self, hop):
         [v_arr, v_idx, v_instance] = hop.inputargs(self, lltype.Signed, hop.args_r[2])
+        hop.exception_cannot_occur()
         v_addr = hop.genop("cast_ptr_to_adr", [v_instance], resulttype=llmemory.Address)
         v_result = hop.genop("cast_adr_to_int", [v_addr, hop.inputconst(lltype.Void, "symbolic")], resulttype=lltype.Signed)
         hop.genop("setarrayitem", [v_arr, v_idx, v_result])
diff --git a/pypy/rlib/test/test_rerased_raw.py b/pypy/rlib/test/test_rerased_raw.py
--- a/pypy/rlib/test/test_rerased_raw.py
+++ b/pypy/rlib/test/test_rerased_raw.py
@@ -46,3 +46,22 @@
 
         res = self.interpret(f, [27])
         assert res == 27
+
+    def test_exception_catching(self):
+        class A(object):
+            def __init__(self, v):
+                self.v = v
+
+        def f(x):
+            try:
+                storage = rerased_raw.UntypedStorage(2)
+                storage.setint(0, x)
+                value1 = storage.getint(0)
+                storage.setinstance(1, A(x))
+                value2 = storage.getinstance(1, A)
+                return value1 + value2.v
+            except Exception:
+                return 50000
+
+        res = self.interpret(f, [4])
+        assert res == 8


More information about the pypy-commit mailing list