Skip to content

Commit a702f14

Browse files
committed
use LazyPythonClass in more places
1 parent cfb1d1c commit a702f14

File tree

122 files changed

+1325
-979
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+1325
-979
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/datatype/PRangeTests.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@
3535
import com.oracle.graal.python.builtins.objects.range.PRange;
3636
import com.oracle.graal.python.nodes.control.GetIteratorNode;
3737
import com.oracle.graal.python.nodes.control.GetNextNode;
38+
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
3839
import com.oracle.graal.python.runtime.exception.PException;
3940
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
4041
import com.oracle.graal.python.test.PythonTests;
4142
import com.oracle.truffle.api.frame.VirtualFrame;
4243
import com.oracle.truffle.api.nodes.Node;
4344
import com.oracle.truffle.api.nodes.RootNode;
4445
import com.oracle.truffle.api.nodes.UnexpectedResultException;
45-
import com.oracle.truffle.api.profiles.ConditionProfile;
4646

4747
public class PRangeTests {
4848
@Before
@@ -75,14 +75,14 @@ public void loopWithOnlyStop() throws UnexpectedResultException {
7575
Object iter = getIter.executeWith(range);
7676
GetNextNode next = GetNextNode.create();
7777
testRoot.doInsert(next);
78-
ConditionProfile errorProfile = ConditionProfile.createBinaryProfile();
78+
IsBuiltinClassProfile errorProfile = IsBuiltinClassProfile.create();
7979

8080
while (true) {
8181
try {
8282
int item = next.executeInt(iter);
8383
assertEquals(index, item);
8484
} catch (PException e) {
85-
e.expectStopIteration(PythonLanguage.getCore(), errorProfile);
85+
e.expectStopIteration(errorProfile);
8686
break;
8787
}
8888
index++;
@@ -99,14 +99,14 @@ public void loopWithStep() throws UnexpectedResultException {
9999
Object iter = getIter.executeWith(range);
100100
GetNextNode next = GetNextNode.create();
101101
testRoot.doInsert(next);
102-
ConditionProfile errorProfile = ConditionProfile.createBinaryProfile();
102+
IsBuiltinClassProfile errorProfile = IsBuiltinClassProfile.create();
103103

104104
while (true) {
105105
try {
106106
int item = next.executeInt(iter);
107107
assertEquals(index, item);
108108
} catch (PException e) {
109-
e.expectStopIteration(PythonLanguage.getCore(), errorProfile);
109+
e.expectStopIteration(errorProfile);
110110
break;
111111
}
112112
index += 2;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,5 @@
4343
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
4444

4545
public interface BoundBuiltinCallable<T> {
46-
T boundToObject(Object binding, PythonObjectFactory factory);
46+
T boundToObject(PythonBuiltinClassType binding, PythonObjectFactory factory);
4747
}

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

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,6 @@
2525
*/
2626
package com.oracle.graal.python.builtins;
2727

28-
import static com.oracle.graal.python.nodes.BuiltinNames.FOREIGN;
29-
import static com.oracle.graal.python.nodes.BuiltinNames.MODULE;
30-
import static com.oracle.graal.python.nodes.BuiltinNames.OBJECT;
31-
import static com.oracle.graal.python.nodes.BuiltinNames.TYPE;
3228
import static com.oracle.graal.python.nodes.BuiltinNames.__BUILTINS_PATCHES__;
3329
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__PACKAGE__;
3430

@@ -135,7 +131,7 @@
135131
import com.oracle.graal.python.runtime.PythonOptions;
136132
import com.oracle.graal.python.runtime.PythonParser;
137133
import com.oracle.graal.python.runtime.exception.PException;
138-
import com.oracle.graal.python.runtime.exception.PythonErrorType;
134+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
139135
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
140136
import com.oracle.truffle.api.CallTarget;
141137
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
@@ -269,7 +265,7 @@ public final class Python3Core implements PythonCore {
269265
};
270266

271267
// not using EnumMap, HashMap, etc. to allow this to fold away during partial evaluation
272-
@CompilationFinal(dimensions = 1) private final PythonBuiltinClass[] builtinTypes = new PythonBuiltinClass[PythonBuiltinClassType.values().length];
268+
@CompilationFinal(dimensions = 1) private final PythonBuiltinClass[] builtinTypes = new PythonBuiltinClass[PythonBuiltinClassType.VALUES.length];
273269

274270
private final Map<String, PythonModule> builtinModules = new HashMap<>();
275271
@CompilationFinal private PythonModule builtinsModule;
@@ -331,7 +327,6 @@ private void initializeJavaCore() {
331327
private void initializePythonCore() {
332328
String coreHome = PythonCore.getCoreHomeOrFail();
333329
loadFile("builtins", coreHome);
334-
findKnownExceptionTypes();
335330
for (String s : CORE_FILES) {
336331
loadFile(s, coreHome);
337332
}
@@ -430,19 +425,14 @@ public PythonModule getBuiltins() {
430425
return builtinsModule;
431426
}
432427

433-
public PythonClass getErrorClass(PythonErrorType type) {
434-
return errorClasses[type.ordinal()];
435-
}
436-
437428
@Override
438429
@TruffleBoundary
439-
public PException raise(PythonErrorType type, String format, Object... args) {
430+
public PException raise(PythonBuiltinClassType type, String format, Object... args) {
440431
PBaseException instance;
441-
PythonClass exceptionType = getErrorClass(type);
442432
if (format != null) {
443-
instance = factory.createBaseException(exceptionType, format, args);
433+
instance = factory.createBaseException(type, format, args);
444434
} else {
445-
instance = factory.createBaseException(exceptionType);
435+
instance = factory.createBaseException(type);
446436
}
447437
throw PException.fromObject(instance, null);
448438
}
@@ -462,8 +452,8 @@ public void exportCInterface(PythonContext context) {
462452
env.exportSymbol("python_builtins", builtinsModule);
463453

464454
// export all exception classes for the C API
465-
for (PythonErrorType errorType : PythonErrorType.VALUES) {
466-
PythonClass errorClass = getErrorClass(errorType);
455+
for (PythonBuiltinClassType errorType : PythonBuiltinClassType.EXCEPTIONS) {
456+
PythonClass errorClass = lookupType(errorType);
467457
env.exportSymbol("python_" + errorClass.getName(), errorClass);
468458
}
469459
}
@@ -484,7 +474,7 @@ private PythonClass initializeBuiltinClass(PythonBuiltinClassType type) {
484474

485475
private void initializeTypes() {
486476
// create class objects for builtin types
487-
for (PythonBuiltinClassType builtinClass : PythonBuiltinClassType.values()) {
477+
for (PythonBuiltinClassType builtinClass : PythonBuiltinClassType.VALUES) {
488478
initializeBuiltinClass(builtinClass);
489479
}
490480
// n.b.: the builtin modules and classes and their constructors are initialized first here,
@@ -497,11 +487,13 @@ private void initializeTypes() {
497487
}
498488
}
499489
// publish builtin types in the "builtins" module
500-
for (PythonBuiltinClassType builtinClass : PythonBuiltinClassType.values()) {
490+
for (PythonBuiltinClassType builtinClass : PythonBuiltinClassType.VALUES) {
501491
String module = builtinClass.getPublicInModule();
492+
PythonBuiltinClass clazz = lookupType(builtinClass);
502493
if (module != null) {
503-
lookupBuiltinModule(module).setAttribute(builtinClass.getShortName(), lookupType(builtinClass));
494+
lookupBuiltinModule(module).setAttribute(builtinClass.getName(), clazz);
504495
}
496+
clazz.setAttribute("__module__", module == null ? "builtins" : module);
505497
}
506498
// now initialize well-known objects
507499
pyTrue = new PInt(lookupType(PythonBuiltinClassType.Boolean), BigInteger.ONE);
@@ -551,10 +543,11 @@ private void addBuiltinsTo(PythonObject obj, PythonBuiltins builtins) {
551543
for (Entry<String, BoundBuiltinCallable<?>> entry : builtinFunctions.entrySet()) {
552544
String methodName = entry.getKey();
553545
Object value;
546+
assert obj instanceof PythonModule || obj instanceof PythonBuiltinClass : "unexpected object while adding builtins";
554547
if (obj instanceof PythonModule) {
555548
value = factory.createBuiltinMethod(obj, (PBuiltinFunction) entry.getValue());
556549
} else {
557-
value = entry.getValue().boundToObject(obj, factory());
550+
value = entry.getValue().boundToObject(((PythonBuiltinClass) obj).getType(), factory());
558551
}
559552
obj.setAttribute(methodName, value);
560553
}
@@ -608,13 +601,6 @@ private void loadFile(String s, String prefix) {
608601
callTarget.call(PArguments.withGlobals(mod));
609602
}
610603

611-
private void findKnownExceptionTypes() {
612-
errorClasses = new PythonClass[PythonErrorType.VALUES.length];
613-
for (PythonErrorType type : PythonErrorType.VALUES) {
614-
errorClasses[type.ordinal()] = (PythonClass) builtinsModule.getAttribute(type.name());
615-
}
616-
}
617-
618604
@TruffleBoundary
619605
private PDict createEnvironDict() {
620606
Map<String, String> getenv = System.getenv();

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

Lines changed: 163 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public enum PythonBuiltinClassType implements LazyPythonClass {
3939
GetSetDescriptor("get_set_desc"),
4040
PArray("array", "array"),
4141
PArrayIterator("arrayiterator"),
42-
PBaseException("BaseException", "builtins"),
4342
PIterator("iterator"),
4443
PBuiltinFunction("method_descriptor"),
4544
PBuiltinMethod("builtin_function_or_method"),
@@ -85,27 +84,100 @@ public enum PythonBuiltinClassType implements LazyPythonClass {
8584
Super("super", "builtins"),
8685
PCode("code"),
8786
PZip("zip", "builtins"),
88-
PBuffer("buffer");
87+
PBuffer("buffer"),
88+
89+
// Errors and exceptions:
90+
91+
// everything after BaseException is considered to be an exception
92+
PBaseException("BaseException", "builtins"),
93+
SystemExit("SystemExit", "builtins"),
94+
KeyboardInterrupt("KeyboardInterrupt", "builtins"),
95+
GeneratorExit("GeneratorExit", "builtins"),
96+
Exception("Exception", "builtins"),
97+
StopIteration("StopIteration", "builtins"),
98+
ArithmeticError("ArithmeticError", "builtins"),
99+
FloatingPointError("FloatingPointError", "builtins"),
100+
OverflowError("OverflowError", "builtins"),
101+
ZeroDivisionError("ZeroDivisionError", "builtins"),
102+
AssertionError("AssertionError", "builtins"),
103+
AttributeError("AttributeError", "builtins"),
104+
BufferError("BufferError", "builtins"),
105+
EOFError("EOFError", "builtins"),
106+
ImportError("ImportError", "builtins"),
107+
ModuleNotFoundError("ModuleNotFoundError", "builtins"),
108+
LookupError("LookupError", "builtins"),
109+
IndexError("IndexError", "builtins"),
110+
KeyError("KeyError", "builtins"),
111+
MemoryError("MemoryError", "builtins"),
112+
NameError("NameError", "builtins"),
113+
UnboundLocalError("UnboundLocalError", "builtins"),
114+
OSError("OSError", "builtins"),
115+
IOError("IOError", "builtins"),
116+
BlockingIOError("BlockingIOError", "builtins"),
117+
ChildProcessError("ChildProcessError", "builtins"),
118+
ConnectionError("ConnectionError", "builtins"),
119+
BrokenPipeError("BrokenPipeError", "builtins"),
120+
ConnectionAbortedError("ConnectionAbortedError", "builtins"),
121+
ConnectionRefusedError("ConnectionRefusedError", "builtins"),
122+
ConnectionResetError("ConnectionResetError", "builtins"),
123+
FileExistsError("FileExistsError", "builtins"),
124+
FileNotFoundError("FileNotFoundError", "builtins"),
125+
InterruptedError("InterruptedError", "builtins"),
126+
IsADirectoryError("IsADirectoryError", "builtins"),
127+
NotADirectoryError("NotADirectoryError", "builtins"),
128+
PermissionError("PermissionError", "builtins"),
129+
ProcessLookupError("ProcessLookupError", "builtins"),
130+
TimeoutError("TimeoutError", "builtins"),
89131

90-
private final String shortName;
132+
// todo: all OS errors
133+
134+
ReferenceError("ReferenceError", "builtins"),
135+
RuntimeError("RuntimeError", "builtins"),
136+
NotImplementedError("NotImplementedError", "builtins"),
137+
SyntaxError("SyntaxError", "builtins"),
138+
IndentationError("IndentationError", "builtins"),
139+
TabError("TabError", "builtins"),
140+
SystemError("SystemError", "builtins"),
141+
TypeError("TypeError", "builtins"),
142+
ValueError("ValueError", "builtins"),
143+
UnicodeError("UnicodeError", "builtins"),
144+
UnicodeDecodeError("UnicodeDecodeError", "builtins"),
145+
UnicodeEncodeError("UnicodeEncodeError", "builtins"),
146+
UnicodeTranslateError("UnicodeTranslateError", "builtins"),
147+
RecursionError("RecursionError", "builtins"),
148+
149+
// warnings
150+
Warning("Warning", "builtins"),
151+
BytesWarning("BytesWarning", "builtins"),
152+
DeprecationWarning("DeprecationWarning", "builtins"),
153+
FutureWarning("FutureWarning", "builtins"),
154+
ImportWarning("ImportWarning", "builtins"),
155+
PendingDeprecationWarning("PendingDeprecationWarning", "builtins"),
156+
ResourceWarning("ResourceWarning", "builtins"),
157+
RuntimeWarning("RuntimeWarning", "builtins"),
158+
SyntaxWarning("SyntaxWarning", "builtins"),
159+
UnicodeWarning("UnicodeWarning", "builtins"),
160+
UserWarning("UserWarning", "builtins");
161+
162+
private final String name;
91163
private final Shape instanceShape;
92164
private final String publicInModule;
93165

94166
// initialized in static constructor
95167
@CompilationFinal private PythonBuiltinClassType base;
96168

97-
PythonBuiltinClassType(String shortName, String publicInModule) {
98-
this.shortName = shortName;
169+
PythonBuiltinClassType(String name, String publicInModule) {
170+
this.name = name;
99171
this.publicInModule = publicInModule;
100172
this.instanceShape = com.oracle.graal.python.builtins.objects.type.PythonClass.freshShape();
101173
}
102174

103-
PythonBuiltinClassType(String shortName) {
104-
this(shortName, null);
175+
PythonBuiltinClassType(String name) {
176+
this(name, null);
105177
}
106178

107-
public String getShortName() {
108-
return shortName;
179+
public String getName() {
180+
return name;
109181
}
110182

111183
public PythonBuiltinClassType getBase() {
@@ -119,19 +191,99 @@ public String getPublicInModule() {
119191
@Override
120192
public String toString() {
121193
CompilerAsserts.neverPartOfCompilation();
122-
return shortName;
194+
return name;
123195
}
124196

125197
public Shape getInstanceShape() {
126198
return instanceShape;
127199
}
128200

201+
public static final PythonBuiltinClassType[] VALUES = values();
202+
public static final PythonBuiltinClassType[] EXCEPTIONS;
203+
129204
static {
205+
// fill the EXCEPTIONS array
206+
207+
EXCEPTIONS = new PythonBuiltinClassType[VALUES.length - PBaseException.ordinal()];
208+
for (int i = 0; i < EXCEPTIONS.length; i++) {
209+
EXCEPTIONS[i] = VALUES[i + PBaseException.ordinal()];
210+
}
211+
212+
// set the base classes (and check uniqueness):
213+
130214
HashSet<String> set = new HashSet<>();
131215
for (PythonBuiltinClassType type : values()) {
132-
assert set.add(type.shortName) : type.name();
216+
assert set.add(type.name) : type.name();
133217
type.base = PythonObject;
134218
}
219+
135220
Boolean.base = PInt;
221+
222+
SystemExit.base = PBaseException;
223+
KeyboardInterrupt.base = PBaseException;
224+
GeneratorExit.base = PBaseException;
225+
Exception.base = PBaseException;
226+
StopIteration.base = Exception;
227+
ArithmeticError.base = Exception;
228+
FloatingPointError.base = ArithmeticError;
229+
OverflowError.base = ArithmeticError;
230+
ZeroDivisionError.base = ArithmeticError;
231+
AssertionError.base = Exception;
232+
AttributeError.base = Exception;
233+
BufferError.base = Exception;
234+
EOFError.base = Exception;
235+
ImportError.base = Exception;
236+
ModuleNotFoundError.base = ImportError;
237+
LookupError.base = Exception;
238+
IndexError.base = LookupError;
239+
KeyError.base = LookupError;
240+
MemoryError.base = Exception;
241+
NameError.base = Exception;
242+
UnboundLocalError.base = NameError;
243+
OSError.base = Exception;
244+
IOError.base = Exception;
245+
BlockingIOError.base = OSError;
246+
ChildProcessError.base = OSError;
247+
ConnectionError.base = OSError;
248+
BrokenPipeError.base = OSError;
249+
ConnectionAbortedError.base = OSError;
250+
ConnectionRefusedError.base = OSError;
251+
ConnectionResetError.base = OSError;
252+
FileExistsError.base = OSError;
253+
FileNotFoundError.base = OSError;
254+
InterruptedError.base = OSError;
255+
IsADirectoryError.base = OSError;
256+
NotADirectoryError.base = OSError;
257+
PermissionError.base = OSError;
258+
ProcessLookupError.base = OSError;
259+
TimeoutError.base = OSError;
260+
261+
ReferenceError.base = Exception;
262+
RuntimeError.base = Exception;
263+
NotImplementedError.base = Exception;
264+
SyntaxError.base = Exception;
265+
IndentationError.base = SyntaxError;
266+
TabError.base = IndentationError;
267+
SystemError.base = Exception;
268+
TypeError.base = Exception;
269+
ValueError.base = Exception;
270+
UnicodeError.base = ValueError;
271+
UnicodeDecodeError.base = UnicodeError;
272+
UnicodeEncodeError.base = UnicodeError;
273+
UnicodeTranslateError.base = UnicodeError;
274+
RecursionError.base = RuntimeError;
275+
276+
// warnings
277+
Warning.base = Exception;
278+
BytesWarning.base = Warning;
279+
DeprecationWarning.base = Warning;
280+
FutureWarning.base = Warning;
281+
ImportWarning.base = Warning;
282+
PendingDeprecationWarning.base = Warning;
283+
ResourceWarning.base = Warning;
284+
RuntimeWarning.base = Warning;
285+
SyntaxWarning.base = Warning;
286+
UnicodeWarning.base = Warning;
287+
UserWarning.base = Warning;
136288
}
137289
}

0 commit comments

Comments
 (0)