Skip to content

Commit bf1520d

Browse files
committed
[GR-13350] __new__ method of OSError works as a factory
PullRequest: graalpython/360
2 parents 9613737 + 137f2e8 commit bf1520d

File tree

9 files changed

+457
-158
lines changed

9 files changed

+457
-158
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/module/PosixTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void open() {
7575

7676
@Test
7777
public void openFail() {
78-
assertLastLineErrorContains("OSError",
78+
assertLastLineErrorContains("FileNotFoundError",
7979
"import posix; print(posix.open('prettysurethisisnthere', 0) > 2)");
8080
}
8181

graalpython/com.oracle.graal.python.test/src/tests/test_exception.py

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
# Copyright (c) 2018, Oracle and/or its affiliates.
1+
# Copyright (c) 2018, 2019, Oracle and/or its affiliates.
22
# Copyright (C) 1996-2017 Python Software Foundation
33
#
44
# Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
55

66
import unittest
77
import sys
8+
import errno
89

910
class ExceptionTests(unittest.TestCase):
1011

@@ -50,3 +51,60 @@ class MyException(Exception):
5051
self.assertIsInstance(e, MyException)
5152
# TODO this dosn't work yet
5253
#self.assertEqual(e.__traceback__, tb)
54+
55+
def test_aliases(self):
56+
self.assertTrue (IOError is OSError)
57+
self.assertTrue (EnvironmentError is OSError)
58+
59+
def test_new_oserror(self):
60+
self.assertTrue(type(OSError(2)) is OSError)
61+
self.assertTrue(type(OSError(errno.EISDIR)) is OSError)
62+
self.assertTrue(type(OSError(2, "a message")) is FileNotFoundError)
63+
64+
self.assertTrue(type(OSError(errno.EISDIR, "a message")) is IsADirectoryError)
65+
self.assertTrue(type(OSError(errno.EAGAIN, "a message")) is BlockingIOError)
66+
self.assertTrue(type(OSError(errno.EALREADY, "a message")) is BlockingIOError)
67+
self.assertTrue(type(OSError(errno.EINPROGRESS, "a message")) is BlockingIOError)
68+
self.assertTrue(type(OSError(errno.EWOULDBLOCK, "a message")) is BlockingIOError)
69+
self.assertTrue(type(OSError(errno.EPIPE, "a message")) is BrokenPipeError)
70+
self.assertTrue(type(OSError(errno.ESHUTDOWN, "a message")) is BrokenPipeError)
71+
self.assertTrue(type(OSError(errno.ECHILD, "a message")) is ChildProcessError)
72+
self.assertTrue(type(OSError(errno.ECONNABORTED, "a message")) is ConnectionAbortedError)
73+
self.assertTrue(type(OSError(errno.ECONNREFUSED, "a message")) is ConnectionRefusedError)
74+
self.assertTrue(type(OSError(errno.ECONNRESET, "a message")) is ConnectionResetError)
75+
self.assertTrue(type(OSError(errno.EEXIST, "a message")) is FileExistsError)
76+
self.assertTrue(type(OSError(errno.ENOENT, "a message")) is FileNotFoundError)
77+
self.assertTrue(type(OSError(errno.ENOTDIR, "a message")) is NotADirectoryError)
78+
self.assertTrue(type(OSError(errno.EINTR, "a message")) is InterruptedError)
79+
self.assertTrue(type(OSError(errno.EACCES, "a message")) is PermissionError)
80+
self.assertTrue(type(OSError(errno.EPERM, "a message")) is PermissionError)
81+
self.assertTrue(type(OSError(errno.ESRCH, "a message")) is ProcessLookupError)
82+
self.assertTrue(type(OSError(errno.ETIMEDOUT, "a message")) is TimeoutError)
83+
84+
def test_oserror_empty_attributes(self):
85+
e = OSError(errno.EISDIR)
86+
self.assertEqual(e.errno, None)
87+
self.assertEqual(e.strerror, None)
88+
self.assertEqual(e.filename, None)
89+
self.assertEqual(e.filename2, None)
90+
91+
def test_oserror_two_attributes(self):
92+
e = OSError(errno.EISDIR, "message")
93+
self.assertEqual(e.errno, 21)
94+
self.assertEqual(e.strerror, "message")
95+
self.assertEqual(e.filename, None)
96+
self.assertEqual(e.filename2, None)
97+
98+
def test_oserror_four_attribute(self):
99+
e = OSError(errno.EISDIR, "message", "file1")
100+
self.assertEqual(e.errno, 21)
101+
self.assertEqual(e.strerror, "message")
102+
self.assertEqual(e.filename, "file1")
103+
self.assertEqual(e.filename2, None)
104+
105+
def test_oserror_four_attribute(self):
106+
e = OSError(errno.EISDIR, "message", "file1", None, "file2")
107+
self.assertEqual(e.errno, 21)
108+
self.assertEqual(e.strerror, "message")
109+
self.assertEqual(e.filename, "file1")
110+
self.assertEqual(e.filename2, "file2")

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2018, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2019, Oracle and/or its affiliates.
33
* Copyright (c) 2013, Regents of the University of California
44
*
55
* All rights reserved.
@@ -122,7 +122,6 @@ public enum PythonBuiltinClassType implements LazyPythonClass {
122122
NameError("NameError", "builtins"),
123123
UnboundLocalError("UnboundLocalError", "builtins"),
124124
OSError("OSError", "builtins"),
125-
IOError("IOError", "builtins"),
126125
BlockingIOError("BlockingIOError", "builtins"),
127126
ChildProcessError("ChildProcessError", "builtins"),
128127
ConnectionError("ConnectionError", "builtins"),
@@ -253,7 +252,6 @@ public Shape getInstanceShape() {
253252
NameError.base = Exception;
254253
UnboundLocalError.base = NameError;
255254
OSError.base = Exception;
256-
IOError.base = Exception;
257255
BlockingIOError.base = OSError;
258256
ChildProcessError.base = OSError;
259257
ConnectionError.base = OSError;
Lines changed: 16 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -40,11 +40,13 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules;
4242

43+
import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum;
4344
import java.util.ArrayList;
4445
import java.util.List;
4546

4647
import com.oracle.graal.python.builtins.CoreFunctions;
4748
import com.oracle.graal.python.builtins.PythonBuiltins;
49+
import com.oracle.graal.python.builtins.objects.dict.PDict;
4850
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4951
import com.oracle.graal.python.runtime.PythonCore;
5052
import com.oracle.truffle.api.dsl.NodeFactory;
@@ -56,145 +58,22 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
5658
return new ArrayList<>();
5759
}
5860

59-
/**
60-
* Generated using the following:
61-
*
62-
* <pre>
63-
* grep -RPo "#define\s+([A-Z]+)\s+(\d+)" /usr/include/asm-generic/errno* | awk '{print "builtinConstants.put(\"" $2 "\", " $3 ");"}'
64-
* </pre>
65-
*/
6661
@Override
6762
public void initialize(PythonCore core) {
6863
super.initialize(core);
69-
builtinConstants.put("EPERM", 1);
70-
builtinConstants.put("ENOENT", 2);
71-
builtinConstants.put("ESRCH", 3);
72-
builtinConstants.put("EINTR", 4);
73-
builtinConstants.put("EIO", 5);
74-
builtinConstants.put("ENXIO", 6);
75-
builtinConstants.put("ENOEXEC", 8);
76-
builtinConstants.put("EBADF", 9);
77-
builtinConstants.put("ECHILD", 10);
78-
builtinConstants.put("EAGAIN", 11);
79-
builtinConstants.put("ENOMEM", 12);
80-
builtinConstants.put("EACCES", 13);
81-
builtinConstants.put("EFAULT", 14);
82-
builtinConstants.put("ENOTBLK", 15);
83-
builtinConstants.put("EBUSY", 16);
84-
builtinConstants.put("EEXIST", 17);
85-
builtinConstants.put("EXDEV", 18);
86-
builtinConstants.put("ENODEV", 19);
87-
builtinConstants.put("ENOTDIR", 20);
88-
builtinConstants.put("EISDIR", 21);
89-
builtinConstants.put("EINVAL", 22);
90-
builtinConstants.put("ENFILE", 23);
91-
builtinConstants.put("EMFILE", 24);
92-
builtinConstants.put("ENOTTY", 25);
93-
builtinConstants.put("ETXTBSY", 26);
94-
builtinConstants.put("EFBIG", 27);
95-
builtinConstants.put("ENOSPC", 28);
96-
builtinConstants.put("ESPIPE", 29);
97-
builtinConstants.put("EROFS", 30);
98-
builtinConstants.put("EMLINK", 31);
99-
builtinConstants.put("EPIPE", 32);
100-
builtinConstants.put("EDOM", 33);
101-
builtinConstants.put("ERANGE", 34);
102-
builtinConstants.put("EDEADLK", 35);
103-
builtinConstants.put("ENAMETOOLONG", 36);
104-
builtinConstants.put("ENOLCK", 37);
105-
builtinConstants.put("ENOSYS", 38);
106-
builtinConstants.put("ENOTEMPTY", 39);
107-
builtinConstants.put("ELOOP", 40);
108-
builtinConstants.put("ENOMSG", 42);
109-
builtinConstants.put("EIDRM", 43);
110-
builtinConstants.put("ECHRNG", 44);
111-
builtinConstants.put("ELNRNG", 48);
112-
builtinConstants.put("EUNATCH", 49);
113-
builtinConstants.put("ENOCSI", 50);
114-
builtinConstants.put("EBADE", 52);
115-
builtinConstants.put("EBADR", 53);
116-
builtinConstants.put("EXFULL", 54);
117-
builtinConstants.put("ENOANO", 55);
118-
builtinConstants.put("EBADRQC", 56);
119-
builtinConstants.put("EBADSLT", 57);
120-
builtinConstants.put("EBFONT", 59);
121-
builtinConstants.put("ENOSTR", 60);
122-
builtinConstants.put("ENODATA", 61);
123-
builtinConstants.put("ETIME", 62);
124-
builtinConstants.put("ENOSR", 63);
125-
builtinConstants.put("ENONET", 64);
126-
builtinConstants.put("ENOPKG", 65);
127-
builtinConstants.put("EREMOTE", 66);
128-
builtinConstants.put("ENOLINK", 67);
129-
builtinConstants.put("EADV", 68);
130-
builtinConstants.put("ESRMNT", 69);
131-
builtinConstants.put("ECOMM", 70);
132-
builtinConstants.put("EPROTO", 71);
133-
builtinConstants.put("EMULTIHOP", 72);
134-
builtinConstants.put("EDOTDOT", 73);
135-
builtinConstants.put("EBADMSG", 74);
136-
builtinConstants.put("EOVERFLOW", 75);
137-
builtinConstants.put("ENOTUNIQ", 76);
138-
builtinConstants.put("EBADFD", 77);
139-
builtinConstants.put("EREMCHG", 78);
140-
builtinConstants.put("ELIBACC", 79);
141-
builtinConstants.put("ELIBBAD", 80);
142-
builtinConstants.put("ELIBSCN", 81);
143-
builtinConstants.put("ELIBMAX", 82);
144-
builtinConstants.put("ELIBEXEC", 83);
145-
builtinConstants.put("EILSEQ", 84);
146-
builtinConstants.put("ERESTART", 85);
147-
builtinConstants.put("ESTRPIPE", 86);
148-
builtinConstants.put("EUSERS", 87);
149-
builtinConstants.put("ENOTSOCK", 88);
150-
builtinConstants.put("EDESTADDRREQ", 89);
151-
builtinConstants.put("EMSGSIZE", 90);
152-
builtinConstants.put("EPROTOTYPE", 91);
153-
builtinConstants.put("ENOPROTOOPT", 92);
154-
builtinConstants.put("EPROTONOSUPPORT", 93);
155-
builtinConstants.put("ESOCKTNOSUPPORT", 94);
156-
builtinConstants.put("EOPNOTSUPP", 95);
157-
builtinConstants.put("EPFNOSUPPORT", 96);
158-
builtinConstants.put("EAFNOSUPPORT", 97);
159-
builtinConstants.put("EADDRINUSE", 98);
160-
builtinConstants.put("EADDRNOTAVAIL", 99);
161-
builtinConstants.put("ENETDOWN", 100);
162-
builtinConstants.put("ENETUNREACH", 101);
163-
builtinConstants.put("ENETRESET", 102);
164-
builtinConstants.put("ECONNABORTED", 103);
165-
builtinConstants.put("ECONNRESET", 104);
166-
builtinConstants.put("ENOBUFS", 105);
167-
builtinConstants.put("EISCONN", 106);
168-
builtinConstants.put("ENOTCONN", 107);
169-
builtinConstants.put("ESHUTDOWN", 108);
170-
builtinConstants.put("ETOOMANYREFS", 109);
171-
builtinConstants.put("ETIMEDOUT", 110);
172-
builtinConstants.put("ECONNREFUSED", 111);
173-
builtinConstants.put("EHOSTDOWN", 112);
174-
builtinConstants.put("EHOSTUNREACH", 113);
175-
builtinConstants.put("EALREADY", 114);
176-
builtinConstants.put("EINPROGRESS", 115);
177-
builtinConstants.put("ESTALE", 116);
178-
builtinConstants.put("EUCLEAN", 117);
179-
builtinConstants.put("ENOTNAM", 118);
180-
builtinConstants.put("ENAVAIL", 119);
181-
builtinConstants.put("EISNAM", 120);
182-
builtinConstants.put("EREMOTEIO", 121);
183-
builtinConstants.put("EDQUOT", 122);
184-
builtinConstants.put("ENOMEDIUM", 123);
185-
builtinConstants.put("EMEDIUMTYPE", 124);
186-
builtinConstants.put("ECANCELED", 125);
187-
builtinConstants.put("ENOKEY", 126);
188-
builtinConstants.put("EKEYEXPIRED", 127);
189-
builtinConstants.put("EKEYREVOKED", 128);
190-
builtinConstants.put("EKEYREJECTED", 129);
191-
builtinConstants.put("EOWNERDEAD", 130);
192-
builtinConstants.put("ENOTRECOVERABLE", 131);
193-
builtinConstants.put("ERFKILL", 132);
194-
builtinConstants.put("EHWPOISON", 133);
64+
PDict errorCode = core.factory().createDict();
19565

196-
// added manually
197-
builtinConstants.put("EAGAIN", 11);
198-
builtinConstants.put("EWOULDBLOCK", 11);
66+
for (OSErrorEnum value : OSErrorEnum.values()) {
67+
// if more OSError have the same number -> the last one wins
68+
addConstant(value.getNumber(), value.name(), errorCode);
69+
}
70+
71+
// publish the dictionary with mapping code -> string name
72+
builtinConstants.put("errorcode", errorCode);
73+
}
74+
75+
private void addConstant(int number, String name, PDict dict) {
76+
builtinConstants.put(name, number);
77+
dict.setItem(number, name);
19978
}
20079
}

0 commit comments

Comments
 (0)