[pypy-commit] pypy default: support IOError in rpython
bdkearns
noreply at buildbot.pypy.org
Fri Sep 5 20:19:02 CEST 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch:
Changeset: r73320:14a5e9603b7a
Date: 2014-09-05 13:35 -0400
http://bitbucket.org/pypy/pypy/changeset/14a5e9603b7a/
Log: support IOError in rpython
diff --git a/rpython/annotator/builtin.py b/rpython/annotator/builtin.py
--- a/rpython/annotator/builtin.py
+++ b/rpython/annotator/builtin.py
@@ -255,6 +255,10 @@
BUILTIN_ANALYZERS[original] = value
+ at analyzer_for(getattr(IOError.__init__, 'im_func', IOError.__init__))
+def IOError_init(s_self, *args):
+ pass
+
@analyzer_for(getattr(OSError.__init__, 'im_func', OSError.__init__))
def OSError_init(s_self, *args):
pass
diff --git a/rpython/annotator/classdef.py b/rpython/annotator/classdef.py
--- a/rpython/annotator/classdef.py
+++ b/rpython/annotator/classdef.py
@@ -438,8 +438,9 @@
# ____________________________________________________________
FORCE_ATTRIBUTES_INTO_CLASSES = {
+ IOError: {'errno': SomeInteger()},
OSError: {'errno': SomeInteger()},
- }
+}
try:
WindowsError
diff --git a/rpython/rtyper/rbuiltin.py b/rpython/rtyper/rbuiltin.py
--- a/rpython/rtyper/rbuiltin.py
+++ b/rpython/rtyper/rbuiltin.py
@@ -264,6 +264,17 @@
def rtype_object__init__(hop):
hop.exception_cannot_occur()
+def rtype_IOError__init__(hop):
+ hop.exception_cannot_occur()
+ if hop.nb_args == 2:
+ raise TyperError("IOError() should not be called with "
+ "a single argument")
+ if hop.nb_args >= 3:
+ v_self = hop.args_v[0]
+ r_self = hop.args_r[0]
+ v_errno = hop.inputarg(lltype.Signed, arg=1)
+ r_self.setfield(v_self, 'errno', v_errno, hop.llops)
+
def rtype_OSError__init__(hop):
hop.exception_cannot_occur()
if hop.nb_args == 2:
@@ -333,6 +344,9 @@
original = getattr(__builtin__, name[14:])
BUILTIN_TYPER[original] = value
+BUILTIN_TYPER[getattr(IOError.__init__, 'im_func', IOError.__init__)] = (
+ rtype_IOError__init__)
+
BUILTIN_TYPER[getattr(OSError.__init__, 'im_func', OSError.__init__)] = (
rtype_OSError__init__)
diff --git a/rpython/rtyper/test/test_exception.py b/rpython/rtyper/test/test_exception.py
--- a/rpython/rtyper/test/test_exception.py
+++ b/rpython/rtyper/test/test_exception.py
@@ -36,14 +36,23 @@
class TestException(BaseRtypingTest):
def test_exception_with_arg(self):
def g(n):
+ raise IOError(n, "?")
+ def h(n):
raise OSError(n, "?")
def f(n):
try:
g(n)
+ except IOError, e:
+ assert e.errno == 42
+ else:
+ assert False
+ try:
+ h(n)
except OSError, e:
- return e.errno
- res = self.interpret(f, [42])
- assert res == 42
+ assert e.errno == 42
+ else:
+ assert False
+ self.interpret(f, [42])
def test_catch_incompatible_class(self):
class MyError(Exception):
More information about the pypy-commit
mailing list