Skip to content

Commit 50cd661

Browse files
timfelcosminbasca
authored andcommitted
make builtins extensible on the classpath
1 parent 27f1315 commit 50cd661

File tree

5 files changed

+55
-17
lines changed

5 files changed

+55
-17
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
com.oracle.graal.python.test.advance.CustomModule
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.oracle.graal.python.test.advance;
2+
3+
import org.junit.Test;
4+
5+
import com.oracle.graal.python.test.PythonTests;
6+
7+
public class CustomBuiltinsTest extends PythonTests {
8+
@Test
9+
public void testCustomBuiltinModule() {
10+
assertPrints("success", "import CustomModule; print(CustomModule.success)");
11+
}
12+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.oracle.graal.python.test.advance;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import com.oracle.graal.python.builtins.CoreFunctions;
7+
import com.oracle.graal.python.builtins.PythonBuiltins;
8+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
9+
import com.oracle.graal.python.runtime.PythonCore;
10+
import com.oracle.truffle.api.dsl.NodeFactory;
11+
12+
@CoreFunctions(defineModule = "CustomModule")
13+
public class CustomModule extends PythonBuiltins {
14+
15+
@Override
16+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
17+
return new ArrayList<>();
18+
}
19+
20+
@Override
21+
public void initialize(PythonCore core) {
22+
super.initialize(core);
23+
this.builtinConstants.put("success", "success");
24+
}
25+
}

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

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import java.util.ServiceLoader;
4343

4444
import com.oracle.graal.python.PythonLanguage;
45-
import com.oracle.graal.python.builtins.PythonBuiltins.PythonBuiltinProvider;
4645
import com.oracle.graal.python.builtins.modules.ArrayModuleBuiltins;
4746
import com.oracle.graal.python.builtins.modules.AstModuleBuiltins;
4847
import com.oracle.graal.python.builtins.modules.AtexitModuleBuiltins;
@@ -142,6 +141,7 @@
142141
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
143142
import com.oracle.truffle.api.TruffleFile;
144143
import com.oracle.truffle.api.TruffleLanguage.Env;
144+
import com.oracle.truffle.api.TruffleOptions;
145145
import com.oracle.truffle.api.nodes.Node;
146146
import com.oracle.truffle.api.source.Source;
147147
import com.oracle.truffle.api.source.SourceSection;
@@ -189,8 +189,9 @@ public final class Python3Core implements PythonCore {
189189
"_sre",
190190
};
191191

192-
private static final PythonBuiltins[] BUILTINS;
193-
static {
192+
private final PythonBuiltins[] builtins;
193+
194+
private static final PythonBuiltins[] initializeBuiltins() {
194195
List<PythonBuiltins> builtins = new ArrayList<>();
195196
builtins.addAll(Arrays.asList(new PythonBuiltins[]{
196197
new BuiltinConstructors(),
@@ -272,11 +273,13 @@ public final class Python3Core implements PythonCore {
272273
new MemoryviewBuiltins(),
273274
new SuperBuiltins(),
274275
}));
275-
ServiceLoader<PythonBuiltinProvider> providers = ServiceLoader.load(PythonBuiltinProvider.class);
276-
for (PythonBuiltins.PythonBuiltinProvider provider : providers) {
277-
builtins.add(provider.createInstance());
276+
if (!TruffleOptions.AOT) {
277+
ServiceLoader<PythonBuiltins> providers = ServiceLoader.load(PythonBuiltins.class);
278+
for (PythonBuiltins builtin : providers) {
279+
builtins.add(builtin);
280+
}
278281
}
279-
BUILTINS = builtins.toArray(new PythonBuiltins[builtins.size()]);
282+
return builtins.toArray(new PythonBuiltins[builtins.size()]);
280283
}
281284

282285
// not using EnumMap, HashMap, etc. to allow this to fold away during partial evaluation
@@ -302,6 +305,7 @@ public final class Python3Core implements PythonCore {
302305

303306
public Python3Core(PythonParser parser) {
304307
this.parser = parser;
308+
this.builtins = initializeBuiltins();
305309
}
306310

307311
@Override
@@ -495,7 +499,7 @@ private void initializeTypes() {
495499
// n.b.: the builtin modules and classes and their constructors are initialized first here,
496500
// so we have the mapping from java classes to python classes and builtin names to modules
497501
// available.
498-
for (PythonBuiltins builtin : BUILTINS) {
502+
for (PythonBuiltins builtin : builtins) {
499503
CoreFunctions annotation = builtin.getClass().getAnnotation(CoreFunctions.class);
500504
if (annotation.defineModule().length() > 0) {
501505
createModule(annotation.defineModule());
@@ -514,7 +518,7 @@ private void initializeTypes() {
514518
}
515519

516520
private void populateBuiltins() {
517-
for (PythonBuiltins builtin : BUILTINS) {
521+
for (PythonBuiltins builtin : builtins) {
518522
builtin.initialize(this);
519523
CoreFunctions annotation = builtin.getClass().getAnnotation(CoreFunctions.class);
520524
if (annotation.defineModule().length() > 0) {
@@ -545,14 +549,14 @@ private PythonModule createModule(String name) {
545549
return mod;
546550
}
547551

548-
private void addBuiltinsTo(PythonObject obj, PythonBuiltins builtins) {
549-
Map<String, Object> builtinConstants = builtins.getBuiltinConstants();
552+
private void addBuiltinsTo(PythonObject obj, PythonBuiltins builtinsForObj) {
553+
Map<String, Object> builtinConstants = builtinsForObj.getBuiltinConstants();
550554
for (Map.Entry<String, Object> entry : builtinConstants.entrySet()) {
551555
String constantName = entry.getKey();
552556
obj.setAttribute(constantName, entry.getValue());
553557
}
554558

555-
Map<String, BoundBuiltinCallable<?>> builtinFunctions = builtins.getBuiltinFunctions();
559+
Map<String, BoundBuiltinCallable<?>> builtinFunctions = builtinsForObj.getBuiltinFunctions();
556560
for (Entry<String, BoundBuiltinCallable<?>> entry : builtinFunctions.entrySet()) {
557561
String methodName = entry.getKey();
558562
Object value;
@@ -565,7 +569,7 @@ private void addBuiltinsTo(PythonObject obj, PythonBuiltins builtins) {
565569
obj.setAttribute(methodName, value);
566570
}
567571

568-
Map<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> builtinClasses = builtins.getBuiltinClasses();
572+
Map<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> builtinClasses = builtinsForObj.getBuiltinClasses();
569573
for (Entry<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> entry : builtinClasses.entrySet()) {
570574
boolean isPublic = entry.getValue().getValue();
571575
if (isPublic) {

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,6 @@
4848
import com.oracle.truffle.api.dsl.NodeFactory;
4949

5050
public abstract class PythonBuiltins {
51-
public static interface PythonBuiltinProvider {
52-
public abstract PythonBuiltins createInstance();
53-
}
54-
5551
protected final Map<String, Object> builtinConstants = new HashMap<>();
5652
private final Map<String, BoundBuiltinCallable<?>> builtinFunctions = new HashMap<>();
5753
private final Map<PythonBuiltinClass, Map.Entry<PythonBuiltinClassType[], Boolean>> builtinClasses = new HashMap<>();

0 commit comments

Comments
 (0)