Skip to content

Commit 4338e8b

Browse files
committed
[hotfix] Shared ASTs
PullRequest: graalpython/156
2 parents 309b0fe + cde9409 commit 4338e8b

File tree

85 files changed

+748
-351
lines changed

Some content is hidden

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

85 files changed

+748
-351
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,14 @@ static void initialize_type_structure(PyTypeObject* structure, const char* typna
6565
type_handle->tp_basicsize = basicsize;
6666
}
6767

68+
#define ctor_hidden(a) __attribute__((constructor (10 ## a
69+
#define ctor(a) ctor_hidden(a))))
70+
#define init_hidden(a, b) initialize ## a ## _ ## b ## _gen
71+
#define init(a, b) init_hidden(a, b)
72+
6873
#define initialize_type(typeobject, typename, struct) \
69-
__attribute__((constructor)) \
70-
static void initialize_ ## typeobject ## _gen(void) { \
74+
ctor(__COUNTER__) \
75+
static void init(__COUNTER__, typeobject)(void) { \
7176
initialize_type_structure(&typeobject, \
7277
#typename, \
7378
polyglot_ ## struct ## _typeid()); \
@@ -158,7 +163,7 @@ static void initialize_bufferprocs() {
158163
polyglot_invoke(PY_TRUFFLE_CEXT, "PyTruffle_SetBufferProcs", native_to_java((PyObject*)&PyBuffer_Type), (getbufferproc)bufferdecorator_getbuffer, (releasebufferproc)NULL);
159164
}
160165

161-
__attribute__((constructor))
166+
__attribute__((constructor (20000)))
162167
static void initialize_capi() {
163168
// initialize global variables like '_Py_NoneStruct', etc.
164169
initialize_globals();

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/PythonTests.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,28 @@ public class PythonTests {
8484
public static void enterContext(String... newArgs) {
8585
PythonTests.outArray.reset();
8686
PythonTests.errArray.reset();
87-
if (context != null) {
88-
closeContext();
89-
}
87+
Context prevContext = context;
9088
context = Context.newBuilder().engine(engine).allowAllAccess(true).arguments("python", newArgs).build();
9189
context.initialize("python");
90+
if (prevContext != null) {
91+
closeContext(prevContext);
92+
}
9293
context.enter();
9394
}
9495

96+
private static void closeContext(Context ctxt) {
97+
try {
98+
ctxt.leave();
99+
} catch (RuntimeException e) {
100+
}
101+
ctxt.close();
102+
}
103+
95104
public static void closeContext() {
96-
context.leave();
97-
context.close();
98-
context = null;
105+
if (context != null) {
106+
closeContext(context);
107+
context = null;
108+
}
99109
}
100110

101111
public static void assertBenchNoError(Path scriptName, String[] args) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.net.URL;
3030
import java.text.MessageFormat;
3131
import java.util.ArrayList;
32+
import java.util.concurrent.ConcurrentHashMap;
3233

3334
import org.graalvm.options.OptionDescriptors;
3435

@@ -46,18 +47,22 @@
4647
import com.oracle.graal.python.nodes.PNode;
4748
import com.oracle.graal.python.nodes.call.InvokeNode;
4849
import com.oracle.graal.python.nodes.control.TopLevelExceptionHandler;
50+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
51+
import com.oracle.graal.python.nodes.object.GetClassNode;
4952
import com.oracle.graal.python.nodes.statement.ImportNode;
5053
import com.oracle.graal.python.parser.PythonParserImpl;
5154
import com.oracle.graal.python.runtime.PythonContext;
5255
import com.oracle.graal.python.runtime.PythonCore;
5356
import com.oracle.graal.python.runtime.PythonOptions;
5457
import com.oracle.graal.python.runtime.PythonParser.ParserMode;
5558
import com.oracle.graal.python.runtime.exception.PException;
59+
import com.oracle.truffle.api.Assumption;
5660
import com.oracle.truffle.api.CallTarget;
5761
import com.oracle.truffle.api.CompilerAsserts;
5862
import com.oracle.truffle.api.CompilerDirectives;
5963
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
6064
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
65+
import com.oracle.truffle.api.RootCallTarget;
6166
import com.oracle.truffle.api.Scope;
6267
import com.oracle.truffle.api.Truffle;
6368
import com.oracle.truffle.api.TruffleFile;
@@ -76,7 +81,7 @@
7681
import com.oracle.truffle.api.source.Source;
7782
import com.oracle.truffle.api.source.Source.SourceBuilder;
7883

79-
@TruffleLanguage.Registration(id = PythonLanguage.ID, name = PythonLanguage.NAME, version = PythonLanguage.VERSION, mimeType = PythonLanguage.MIME_TYPE, interactive = true, internal = false, contextPolicy = TruffleLanguage.ContextPolicy.EXCLUSIVE)
84+
@TruffleLanguage.Registration(id = PythonLanguage.ID, name = PythonLanguage.NAME, version = PythonLanguage.VERSION, mimeType = PythonLanguage.MIME_TYPE, interactive = true, internal = false, contextPolicy = TruffleLanguage.ContextPolicy.SHARED)
8085
@ProvidedTags({StandardTags.CallTag.class, StandardTags.StatementTag.class, StandardTags.RootTag.class, StandardTags.TryBlockTag.class, DebuggerTags.AlwaysHalt.class})
8186
public final class PythonLanguage extends TruffleLanguage<PythonContext> {
8287
public static final String ID = "python";
@@ -89,8 +94,11 @@ public final class PythonLanguage extends TruffleLanguage<PythonContext> {
8994
public static final String MIME_TYPE = "text/x-python";
9095
public static final String EXTENSION = ".py";
9196

97+
public static Assumption singleContextAssumption = Truffle.getRuntime().createAssumption("Only a single context is active");
98+
9299
@CompilationFinal private boolean nativeBuildTime = TruffleOptions.AOT;
93100
private final NodeFactory nodeFactory;
101+
public final ConcurrentHashMap<Class<? extends PythonBuiltinBaseNode>, RootCallTarget> builtinCallTargetCache = new ConcurrentHashMap<>();
94102

95103
public PythonLanguage() {
96104
this.nodeFactory = NodeFactory.create(this);
@@ -298,7 +306,7 @@ protected Object findMetaObject(PythonContext context, Object value) {
298306
value instanceof Number ||
299307
value instanceof String ||
300308
value instanceof Boolean) {
301-
return getCore().lookupType(value.getClass());
309+
return GetClassNode.getItSlowPath(value);
302310
}
303311
}
304312
return null;
@@ -394,4 +402,10 @@ private static Source newSource(PythonContext ctxt, SourceBuilder srcBuilder, St
394402
public boolean isNativeBuildTime() {
395403
return nativeBuildTime;
396404
}
405+
406+
@Override
407+
protected void initializeMultipleContexts() {
408+
super.initializeMultipleContexts();
409+
singleContextAssumption.invalidate();
410+
}
397411
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535

3636
String doc() default "";
3737

38-
Class<?>[] constructsClass() default {};
38+
PythonBuiltinClassType[] constructsClass() default {};
3939

40-
Class<?>[] base() default {};
40+
PythonBuiltinClassType[] base() default {};
4141

4242
int fixedNumOfArguments() default 0;
4343

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@
3434

3535
String publicName() default "";
3636

37-
Class<?>[] extendClasses() default {};
37+
PythonBuiltinClassType[] extendClasses() default {};
3838
}

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

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__PACKAGE__;
3434

3535
import java.io.IOException;
36+
import java.math.BigInteger;
3637
import java.net.MalformedURLException;
3738
import java.net.URL;
3839
import java.util.Arrays;
@@ -98,6 +99,7 @@
9899
import com.oracle.graal.python.builtins.objects.generator.GeneratorBuiltins;
99100
import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptorTypeBuiltins;
100101
import com.oracle.graal.python.builtins.objects.ints.IntBuiltins;
102+
import com.oracle.graal.python.builtins.objects.ints.PInt;
101103
import com.oracle.graal.python.builtins.objects.iterator.ForeignIteratorBuiltins;
102104
import com.oracle.graal.python.builtins.objects.iterator.IteratorBuiltins;
103105
import com.oracle.graal.python.builtins.objects.iterator.PZipBuiltins;
@@ -137,7 +139,6 @@
137139
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
138140
import com.oracle.truffle.api.TruffleFile;
139141
import com.oracle.truffle.api.TruffleLanguage.Env;
140-
import com.oracle.truffle.api.interop.TruffleObject;
141142
import com.oracle.truffle.api.nodes.Node;
142143
import com.oracle.truffle.api.source.Source;
143144

@@ -273,6 +274,8 @@ public final class Python3Core implements PythonCore {
273274
@CompilationFinal private PythonBuiltinClass objectClass;
274275
@CompilationFinal private PythonBuiltinClass moduleClass;
275276
@CompilationFinal private PythonBuiltinClass foreignClass;
277+
@CompilationFinal private PInt pyTrue;
278+
@CompilationFinal private PInt pyFalse;
276279

277280
@CompilationFinal(dimensions = 1) private PythonClass[] errorClasses;
278281
private final PythonParser parser;
@@ -408,11 +411,6 @@ public PythonBuiltinClass lookupType(PythonBuiltinClassType type) {
408411
return builtinTypes[type.ordinal()];
409412
}
410413

411-
@TruffleBoundary
412-
public PythonBuiltinClass lookupType(Class<? extends Object> clazz) {
413-
return lookupType(PythonBuiltinClassType.fromClass(clazz));
414-
}
415-
416414
@TruffleBoundary
417415
public String[] builtinModuleNames() {
418416
return builtinModules.keySet().toArray(new String[0]);
@@ -494,11 +492,11 @@ private void initializeTypes() {
494492
foreignClass = new PythonBuiltinClass(typeClass, FOREIGN, objectClass);
495493
typeClass.unsafeSetSuperClass(objectClass);
496494
// Prepare core classes that are required all for core setup
497-
addType(PythonClass.class, typeClass);
498-
addType(PythonBuiltinClass.class, typeClass);
499-
addType(PythonObject.class, objectClass);
500-
addType(PythonModule.class, moduleClass);
501-
addType(TruffleObject.class, foreignClass);
495+
addType(PythonBuiltinClassType.PythonClass, typeClass);
496+
addType(PythonBuiltinClassType.PythonBuiltinClass, typeClass);
497+
addType(PythonBuiltinClassType.PythonObject, objectClass);
498+
addType(PythonBuiltinClassType.PythonModule, moduleClass);
499+
addType(PythonBuiltinClassType.TruffleObject, foreignClass);
502500
// n.b.: the builtin modules and classes and their constructors are initialized first here,
503501
// so we have the mapping from java classes to python classes and builtin names to modules
504502
// available.
@@ -508,13 +506,16 @@ private void initializeTypes() {
508506
createModule(annotation.defineModule());
509507
}
510508
builtin.initializeClasses(this);
511-
for (Entry<PythonBuiltinClass, Entry<Class<?>[], Boolean>> entry : builtin.getBuiltinClasses().entrySet()) {
509+
for (Entry<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> entry : builtin.getBuiltinClasses().entrySet()) {
512510
PythonBuiltinClass pythonClass = entry.getKey();
513-
for (Class<?> klass : entry.getValue().getKey()) {
511+
for (PythonBuiltinClassType klass : entry.getValue().getKey()) {
514512
addType(klass, pythonClass);
515513
}
516514
}
517515
}
516+
// now initialize well-known objects
517+
pyTrue = new PInt(lookupType(PythonBuiltinClassType.Boolean), BigInteger.ONE);
518+
pyFalse = new PInt(lookupType(PythonBuiltinClassType.Boolean), BigInteger.ZERO);
518519
}
519520

520521
private void populateBuiltins() {
@@ -524,7 +525,7 @@ private void populateBuiltins() {
524525
if (annotation.defineModule().length() > 0) {
525526
addBuiltinsTo(builtinModules.get(annotation.defineModule()), builtin);
526527
}
527-
for (Class<?> klass : annotation.extendClasses()) {
528+
for (PythonBuiltinClassType klass : annotation.extendClasses()) {
528529
addBuiltinsTo(lookupType(klass), builtin);
529530
}
530531
}
@@ -540,8 +541,9 @@ private void populateBuiltins() {
540541
builtinModules.put("_frozen_importlib", bootstrap);
541542
}
542543

543-
private void addType(Class<? extends Object> clazz, PythonBuiltinClass typ) {
544-
builtinTypes[PythonBuiltinClassType.fromClass(clazz).ordinal()] = typ;
544+
private void addType(PythonBuiltinClassType klass, PythonBuiltinClass typ) {
545+
builtinTypes[klass.ordinal()] = typ;
546+
typ.setType(klass);
545547
}
546548

547549
private PythonModule createModule(String name) {
@@ -572,8 +574,8 @@ private void addBuiltinsTo(PythonObject obj, PythonBuiltins builtins) {
572574
obj.setAttribute(methodName, value);
573575
}
574576

575-
Map<PythonBuiltinClass, Entry<Class<?>[], Boolean>> builtinClasses = builtins.getBuiltinClasses();
576-
for (Entry<PythonBuiltinClass, Entry<Class<?>[], Boolean>> entry : builtinClasses.entrySet()) {
577+
Map<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> builtinClasses = builtins.getBuiltinClasses();
578+
for (Entry<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> entry : builtinClasses.entrySet()) {
577579
boolean isPublic = entry.getValue().getValue();
578580
if (isPublic) {
579581
PythonBuiltinClass pythonClass = entry.getKey();
@@ -646,4 +648,12 @@ public void setContext(PythonContext context) {
646648
assert singletonContext == null;
647649
singletonContext = context;
648650
}
651+
652+
public PInt getTrue() {
653+
return pyTrue;
654+
}
655+
656+
public PInt getFalse() {
657+
return pyFalse;
658+
}
649659
}

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

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
*/
2626
package com.oracle.graal.python.builtins;
2727

28-
import java.util.HashMap;
29-
3028
import com.oracle.truffle.api.CompilerAsserts;
3129

3230
public enum PythonBuiltinClassType {
@@ -95,11 +93,9 @@ public enum PythonBuiltinClassType {
9593
PZip(com.oracle.graal.python.builtins.objects.iterator.PZip.class, "zip"),
9694
PBuffer(com.oracle.graal.python.builtins.objects.memoryview.PBuffer.class, "buffer");
9795

98-
private final Class<?> clazz;
9996
private final String shortName;
10097

101-
PythonBuiltinClassType(Class<?> clazz, String shortName) {
102-
this.clazz = clazz;
98+
PythonBuiltinClassType(@SuppressWarnings("unused") Class<?> clazz, String shortName) {
10399
this.shortName = shortName;
104100
}
105101

@@ -108,21 +104,4 @@ public String toString() {
108104
CompilerAsserts.neverPartOfCompilation();
109105
return shortName;
110106
}
111-
112-
private static final HashMap<Class<?>, PythonBuiltinClassType> fromJavaClass = new HashMap<>();
113-
114-
static {
115-
for (PythonBuiltinClassType builtinClass : values()) {
116-
fromJavaClass.put(builtinClass.clazz, builtinClass);
117-
}
118-
fromJavaClass.put(String.class, PString);
119-
fromJavaClass.put(Integer.class, PInt);
120-
fromJavaClass.put(Long.class, PInt);
121-
fromJavaClass.put(Double.class, PFloat);
122-
}
123-
124-
public static PythonBuiltinClassType fromClass(Class<?> clazz) {
125-
assert fromJavaClass.containsKey(clazz) : clazz + " is not in list of known classes";
126-
return fromJavaClass.get(clazz);
127-
}
128107
}

0 commit comments

Comments
 (0)