33
33
import java .math .BigInteger ;
34
34
import java .net .MalformedURLException ;
35
35
import java .net .URL ;
36
+ import java .util .ArrayList ;
36
37
import java .util .Arrays ;
37
38
import java .util .HashMap ;
39
+ import java .util .List ;
38
40
import java .util .Map ;
39
41
import java .util .Map .Entry ;
42
+ import java .util .ServiceLoader ;
40
43
41
44
import com .oracle .graal .python .PythonLanguage ;
42
45
import com .oracle .graal .python .builtins .modules .ArrayModuleBuiltins ;
138
141
import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
139
142
import com .oracle .truffle .api .TruffleFile ;
140
143
import com .oracle .truffle .api .TruffleLanguage .Env ;
144
+ import com .oracle .truffle .api .TruffleOptions ;
141
145
import com .oracle .truffle .api .nodes .Node ;
142
146
import com .oracle .truffle .api .source .Source ;
143
147
import com .oracle .truffle .api .source .SourceSection ;
@@ -185,86 +189,96 @@ public final class Python3Core implements PythonCore {
185
189
"_sre" ,
186
190
};
187
191
188
- private final PythonBuiltins [] BUILTINS = new PythonBuiltins []{
189
- new BuiltinConstructors (),
190
- new BuiltinFunctions (),
191
- new InteropModuleBuiltins (),
192
- new ObjectBuiltins (),
193
- new CellBuiltins (),
194
- new BoolBuiltins (),
195
- new FloatBuiltins (),
196
- new BytesBuiltins (),
197
- new ComplexBuiltins (),
198
- new ByteArrayBuiltins (),
199
- new TypeBuiltins (),
200
- new IntBuiltins (),
201
- new TruffleObjectBuiltins (),
202
- new ListBuiltins (),
203
- new DictBuiltins (),
204
- new DictViewBuiltins (),
205
- new DictValuesBuiltins (),
206
- new DictKeysIteratorBuiltins (),
207
- new DictValuesIteratorBuiltins (),
208
- new DictItemsIteratorBuiltins (),
209
- new RangeBuiltins (),
210
- new SliceBuiltins (),
211
- new TupleBuiltins (),
212
- new StringBuiltins (),
213
- new SetBuiltins (),
214
- new FrozenSetBuiltins (),
215
- new IteratorBuiltins (),
216
- new ReversedBuiltins (),
217
- new PZipBuiltins (),
218
- new EnumerateBuiltins (),
219
- new SentinelIteratorBuiltins (),
220
- new ForeignIteratorBuiltins (),
221
- new GeneratorBuiltins (),
222
- new AbstractFunctionBuiltins (),
223
- new FunctionBuiltins (),
224
- new BuiltinFunctionBuiltins (),
225
- new AbstractMethodBuiltins (),
226
- new MethodBuiltins (),
227
- new BuiltinMethodBuiltins (),
228
- new CodeBuiltins (),
229
- new FrameBuiltins (),
230
- new MappingproxyBuiltins (),
231
- new GetSetDescriptorTypeBuiltins (),
232
- new BaseExceptionBuiltins (),
233
- new PosixModuleBuiltins (),
234
- new ImpModuleBuiltins (),
235
- new ArrayModuleBuiltins (),
236
- new ArrayBuiltins (),
237
- new TimeModuleBuiltins (),
238
- new MathModuleBuiltins (),
239
- new MarshalModuleBuiltins (),
240
- new RandomModuleBuiltins (),
241
- new RandomBuiltins (),
242
- new TruffleCextBuiltins (),
243
- new WeakRefModuleBuiltins (),
244
- new ReferenceTypeBuiltins (),
245
- new IOModuleBuiltins (),
246
- new StringModuleBuiltins (),
247
- new ItertoolsModuleBuiltins (),
248
- new FunctoolsModuleBuiltins (),
249
- new ErrnoModuleBuiltins (),
250
- new CodecsModuleBuiltins (),
251
- new CollectionsModuleBuiltins (),
252
- new JavaModuleBuiltins (),
253
- new SREModuleBuiltins (),
254
- new AstModuleBuiltins (),
255
- new SelectModuleBuiltins (),
256
- new SignalModuleBuiltins (),
257
- new TracebackBuiltins (),
258
- new GcModuleBuiltins (),
259
- new AtexitModuleBuiltins (),
260
- new FaulthandlerModuleBuiltins (),
261
- new UnicodeDataModuleBuiltins (),
262
- new LocaleModuleBuiltins (),
263
- new SysModuleBuiltins (),
264
- new BufferBuiltins (),
265
- new MemoryviewBuiltins (),
266
- new SuperBuiltins (),
267
- };
192
+ private final PythonBuiltins [] builtins ;
193
+
194
+ private static final PythonBuiltins [] initializeBuiltins () {
195
+ List <PythonBuiltins > builtins = new ArrayList <>(Arrays .asList (
196
+ new BuiltinConstructors (),
197
+ new BuiltinFunctions (),
198
+ new InteropModuleBuiltins (),
199
+ new ObjectBuiltins (),
200
+ new CellBuiltins (),
201
+ new BoolBuiltins (),
202
+ new FloatBuiltins (),
203
+ new BytesBuiltins (),
204
+ new ComplexBuiltins (),
205
+ new ByteArrayBuiltins (),
206
+ new TypeBuiltins (),
207
+ new IntBuiltins (),
208
+ new TruffleObjectBuiltins (),
209
+ new ListBuiltins (),
210
+ new DictBuiltins (),
211
+ new DictViewBuiltins (),
212
+ new DictValuesBuiltins (),
213
+ new DictKeysIteratorBuiltins (),
214
+ new DictValuesIteratorBuiltins (),
215
+ new DictItemsIteratorBuiltins (),
216
+ new RangeBuiltins (),
217
+ new SliceBuiltins (),
218
+ new TupleBuiltins (),
219
+ new StringBuiltins (),
220
+ new SetBuiltins (),
221
+ new FrozenSetBuiltins (),
222
+ new IteratorBuiltins (),
223
+ new ReversedBuiltins (),
224
+ new PZipBuiltins (),
225
+ new EnumerateBuiltins (),
226
+ new SentinelIteratorBuiltins (),
227
+ new ForeignIteratorBuiltins (),
228
+ new GeneratorBuiltins (),
229
+ new AbstractFunctionBuiltins (),
230
+ new FunctionBuiltins (),
231
+ new BuiltinFunctionBuiltins (),
232
+ new AbstractMethodBuiltins (),
233
+ new MethodBuiltins (),
234
+ new BuiltinMethodBuiltins (),
235
+ new CodeBuiltins (),
236
+ new FrameBuiltins (),
237
+ new MappingproxyBuiltins (),
238
+ new GetSetDescriptorTypeBuiltins (),
239
+ new BaseExceptionBuiltins (),
240
+ new PosixModuleBuiltins (),
241
+ new ImpModuleBuiltins (),
242
+ new ArrayModuleBuiltins (),
243
+ new ArrayBuiltins (),
244
+ new TimeModuleBuiltins (),
245
+ new MathModuleBuiltins (),
246
+ new MarshalModuleBuiltins (),
247
+ new RandomModuleBuiltins (),
248
+ new RandomBuiltins (),
249
+ new TruffleCextBuiltins (),
250
+ new WeakRefModuleBuiltins (),
251
+ new ReferenceTypeBuiltins (),
252
+ new IOModuleBuiltins (),
253
+ new StringModuleBuiltins (),
254
+ new ItertoolsModuleBuiltins (),
255
+ new FunctoolsModuleBuiltins (),
256
+ new ErrnoModuleBuiltins (),
257
+ new CodecsModuleBuiltins (),
258
+ new CollectionsModuleBuiltins (),
259
+ new JavaModuleBuiltins (),
260
+ new SREModuleBuiltins (),
261
+ new AstModuleBuiltins (),
262
+ new SelectModuleBuiltins (),
263
+ new SignalModuleBuiltins (),
264
+ new TracebackBuiltins (),
265
+ new GcModuleBuiltins (),
266
+ new AtexitModuleBuiltins (),
267
+ new FaulthandlerModuleBuiltins (),
268
+ new UnicodeDataModuleBuiltins (),
269
+ new LocaleModuleBuiltins (),
270
+ new SysModuleBuiltins (),
271
+ new BufferBuiltins (),
272
+ new MemoryviewBuiltins (),
273
+ new SuperBuiltins ()));
274
+ if (!TruffleOptions .AOT ) {
275
+ ServiceLoader <PythonBuiltins > providers = ServiceLoader .load (PythonBuiltins .class );
276
+ for (PythonBuiltins builtin : providers ) {
277
+ builtins .add (builtin );
278
+ }
279
+ }
280
+ return builtins .toArray (new PythonBuiltins [builtins .size ()]);
281
+ }
268
282
269
283
// not using EnumMap, HashMap, etc. to allow this to fold away during partial evaluation
270
284
@ CompilationFinal (dimensions = 1 ) private final PythonBuiltinClass [] builtinTypes = new PythonBuiltinClass [PythonBuiltinClassType .VALUES .length ];
@@ -289,6 +303,7 @@ public final class Python3Core implements PythonCore {
289
303
290
304
public Python3Core (PythonParser parser ) {
291
305
this .parser = parser ;
306
+ this .builtins = initializeBuiltins ();
292
307
}
293
308
294
309
@ Override
@@ -482,7 +497,7 @@ private void initializeTypes() {
482
497
// n.b.: the builtin modules and classes and their constructors are initialized first here,
483
498
// so we have the mapping from java classes to python classes and builtin names to modules
484
499
// available.
485
- for (PythonBuiltins builtin : BUILTINS ) {
500
+ for (PythonBuiltins builtin : builtins ) {
486
501
CoreFunctions annotation = builtin .getClass ().getAnnotation (CoreFunctions .class );
487
502
if (annotation .defineModule ().length () > 0 ) {
488
503
createModule (annotation .defineModule ());
@@ -501,7 +516,7 @@ private void initializeTypes() {
501
516
}
502
517
503
518
private void populateBuiltins () {
504
- for (PythonBuiltins builtin : BUILTINS ) {
519
+ for (PythonBuiltins builtin : builtins ) {
505
520
builtin .initialize (this );
506
521
CoreFunctions annotation = builtin .getClass ().getAnnotation (CoreFunctions .class );
507
522
if (annotation .defineModule ().length () > 0 ) {
@@ -532,14 +547,14 @@ private PythonModule createModule(String name) {
532
547
return mod ;
533
548
}
534
549
535
- private void addBuiltinsTo (PythonObject obj , PythonBuiltins builtins ) {
536
- Map <String , Object > builtinConstants = builtins .getBuiltinConstants ();
550
+ private void addBuiltinsTo (PythonObject obj , PythonBuiltins builtinsForObj ) {
551
+ Map <String , Object > builtinConstants = builtinsForObj .getBuiltinConstants ();
537
552
for (Map .Entry <String , Object > entry : builtinConstants .entrySet ()) {
538
553
String constantName = entry .getKey ();
539
554
obj .setAttribute (constantName , entry .getValue ());
540
555
}
541
556
542
- Map <String , BoundBuiltinCallable <?>> builtinFunctions = builtins .getBuiltinFunctions ();
557
+ Map <String , BoundBuiltinCallable <?>> builtinFunctions = builtinsForObj .getBuiltinFunctions ();
543
558
for (Entry <String , BoundBuiltinCallable <?>> entry : builtinFunctions .entrySet ()) {
544
559
String methodName = entry .getKey ();
545
560
Object value ;
@@ -552,7 +567,7 @@ private void addBuiltinsTo(PythonObject obj, PythonBuiltins builtins) {
552
567
obj .setAttribute (methodName , value );
553
568
}
554
569
555
- Map <PythonBuiltinClass , Entry <PythonBuiltinClassType [], Boolean >> builtinClasses = builtins .getBuiltinClasses ();
570
+ Map <PythonBuiltinClass , Entry <PythonBuiltinClassType [], Boolean >> builtinClasses = builtinsForObj .getBuiltinClasses ();
556
571
for (Entry <PythonBuiltinClass , Entry <PythonBuiltinClassType [], Boolean >> entry : builtinClasses .entrySet ()) {
557
572
boolean isPublic = entry .getValue ().getValue ();
558
573
if (isPublic ) {
0 commit comments