100
100
import com .oracle .graal .python .builtins .objects .function .PBuiltinFunction ;
101
101
import com .oracle .graal .python .builtins .objects .function .PFunction ;
102
102
import com .oracle .graal .python .builtins .objects .generator .GeneratorBuiltins ;
103
- import com .oracle .graal .python .builtins .objects .getsetdescriptor .GetSetDescriptor ;
104
103
import com .oracle .graal .python .builtins .objects .getsetdescriptor .GetSetDescriptorTypeBuiltins ;
105
104
import com .oracle .graal .python .builtins .objects .ints .IntBuiltins ;
106
105
import com .oracle .graal .python .builtins .objects .ints .PInt ;
112
111
import com .oracle .graal .python .builtins .objects .list .PList ;
113
112
import com .oracle .graal .python .builtins .objects .mappingproxy .MappingproxyBuiltins ;
114
113
import com .oracle .graal .python .builtins .objects .memoryview .BufferBuiltins ;
114
+ import com .oracle .graal .python .builtins .objects .method .AbstractMethodBuiltins ;
115
+ import com .oracle .graal .python .builtins .objects .method .BuiltinMethodBuiltins ;
115
116
import com .oracle .graal .python .builtins .objects .method .MethodBuiltins ;
116
117
import com .oracle .graal .python .builtins .objects .module .PythonModule ;
117
118
import com .oracle .graal .python .builtins .objects .object .ObjectBuiltins ;
@@ -232,7 +233,9 @@ public final class Python3Core implements PythonCore {
232
233
new AbstractFunctionBuiltins (),
233
234
new FunctionBuiltins (),
234
235
new BuiltinFunctionBuiltins (),
236
+ new AbstractMethodBuiltins (),
235
237
new MethodBuiltins (),
238
+ new BuiltinMethodBuiltins (),
236
239
new CodeBuiltins (),
237
240
new FrameBuiltins (),
238
241
new MappingproxyBuiltins (),
@@ -621,9 +624,14 @@ private void initializeTypes() {
621
624
addType (PythonObject .class , getObjectClass ());
622
625
addType (PythonModule .class , getModuleClass ());
623
626
addType (TruffleObject .class , getForeignClass ());
624
- // n.b.: the builtin classes and their constructors are initialized first here, so we set up
625
- // the mapping from java classes to python classes.
627
+ // n.b.: the builtin modules and classes and their constructors are initialized first here,
628
+ // so we have the mapping from java classes to python classes and builtin names to modules
629
+ // available.
626
630
for (PythonBuiltins builtin : BUILTINS ) {
631
+ CoreFunctions annotation = builtin .getClass ().getAnnotation (CoreFunctions .class );
632
+ if (annotation .defineModule ().length () > 0 ) {
633
+ createModule (annotation .defineModule ());
634
+ }
627
635
builtin .initializeClasses (this );
628
636
for (Entry <PythonBuiltinClass , Entry <Class <?>[], Boolean >> entry : builtin .getBuiltinClasses ().entrySet ()) {
629
637
PythonBuiltinClass pythonClass = entry .getKey ();
@@ -639,109 +647,64 @@ private void populateBuiltins() {
639
647
builtin .initialize (this );
640
648
CoreFunctions annotation = builtin .getClass ().getAnnotation (CoreFunctions .class );
641
649
if (annotation .defineModule ().length () > 0 ) {
642
- createModule (annotation .defineModule (), true , builtin );
643
- } else if (annotation .extendModule ().length () > 0 ) {
644
- addBuiltinsToModule (builtinModules .get (annotation .extendModule ()), builtin );
645
- } else if (annotation .extendClasses ().length > 0 ) {
646
- for (Class <?> klass : annotation .extendClasses ()) {
647
- addMethodsToType (klass , builtin );
648
- }
650
+ addBuiltinsTo (builtinModules .get (annotation .defineModule ()), builtin );
651
+ }
652
+ for (Class <?> klass : annotation .extendClasses ()) {
653
+ addBuiltinsTo (lookupType (klass ), builtin );
649
654
}
650
655
}
651
656
652
657
// core machinery
653
- createModule ("_descriptor" , true );
654
- createModule ("_warnings" , true );
655
- PythonModule bootstrapExternal = createModule ("importlib._bootstrap_external" , "importlib" );
658
+ createModule ("_descriptor" );
659
+ createModule ("_warnings" );
660
+ PythonModule bootstrapExternal = createModule ("importlib._bootstrap_external" );
661
+ bootstrapExternal .setAttribute (__PACKAGE__ , "importlib" );
656
662
builtinModules .put ("_frozen_importlib_external" , bootstrapExternal );
657
- PythonModule bootstrap = createModule ("importlib._bootstrap" , "importlib" );
663
+ PythonModule bootstrap = createModule ("importlib._bootstrap" );
664
+ bootstrap .setAttribute (__PACKAGE__ , "importlib" );
658
665
builtinModules .put ("_frozen_importlib" , bootstrap );
659
666
}
660
667
661
668
private void addType (Class <? extends Object > clazz , PythonBuiltinClass typ ) {
662
669
builtinTypes [PythonBuiltinClassType .fromClass (clazz ).ordinal ()] = typ ;
663
670
}
664
671
665
- private PythonModule createModule (String name , String pkg , PythonBuiltins ... builtins ) {
666
- PythonModule mod = createModule (name , true , builtins );
667
- mod .setAttribute (__PACKAGE__ , pkg );
668
- return mod ;
669
- }
670
-
671
- public PythonModule createModule (String name , boolean add , PythonBuiltins ... builtins ) {
672
- PythonModule mod = factory ().createPythonModule (name );
673
- for (PythonBuiltins builtin : builtins ) {
674
- addBuiltinsToModule (mod , builtin );
675
- }
676
- if (add ) {
672
+ private PythonModule createModule (String name ) {
673
+ PythonModule mod = builtinModules .get (name );
674
+ if (mod == null ) {
675
+ mod = factory ().createPythonModule (name );
677
676
builtinModules .put (name , mod );
678
677
}
679
678
return mod ;
680
679
}
681
680
682
- private PythonBuiltinClass addMethodsToType (Class <?> javaClass , PythonBuiltins ... builtins ) {
683
- return addMethodsToType (lookupType (javaClass ), builtins );
684
- }
685
-
686
- private PythonBuiltinClass addMethodsToType (PythonBuiltinClass clazz , PythonBuiltins ... builtins ) {
687
- for (PythonBuiltins builtin : builtins ) {
688
- addBuiltinsToClass (clazz , builtin );
689
- }
690
- return clazz ;
691
- }
692
-
693
- private void addBuiltinsToModule (PythonModule mod , PythonBuiltins builtins ) {
681
+ private void addBuiltinsTo (PythonObject obj , PythonBuiltins builtins ) {
694
682
Map <String , Object > builtinConstants = builtins .getBuiltinConstants ();
695
683
for (Map .Entry <String , Object > entry : builtinConstants .entrySet ()) {
696
684
String constantName = entry .getKey ();
697
- Object obj = entry .getValue ();
698
- mod .setAttribute (constantName , obj );
685
+ obj .setAttribute (constantName , entry .getValue ());
699
686
}
700
687
701
- Map <String , PBuiltinFunction > builtinFunctions = builtins .getBuiltinFunctions ();
702
- for (Map . Entry <String , PBuiltinFunction > entry : builtinFunctions .entrySet ()) {
688
+ Map <String , BoundBuiltinCallable <?> > builtinFunctions = builtins .getBuiltinFunctions ();
689
+ for (Entry <String , BoundBuiltinCallable <?> > entry : builtinFunctions .entrySet ()) {
703
690
String methodName = entry .getKey ();
704
- PBuiltinFunction function = entry .getValue ();
705
- mod .setAttribute (methodName , function );
691
+ Object value ;
692
+ if (obj instanceof PythonModule ) {
693
+ value = factory .createBuiltinMethod (obj , (PBuiltinFunction ) entry .getValue ());
694
+ } else {
695
+ value = entry .getValue ().boundToObject (obj , factory ());
696
+ }
697
+ obj .setAttribute (methodName , value );
706
698
}
707
699
708
700
Map <PythonBuiltinClass , Entry <Class <?>[], Boolean >> builtinClasses = builtins .getBuiltinClasses ();
709
701
for (Entry <PythonBuiltinClass , Entry <Class <?>[], Boolean >> entry : builtinClasses .entrySet ()) {
710
702
boolean isPublic = entry .getValue ().getValue ();
711
- Class <?>[] javaClasses = entry .getValue ().getKey ();
712
- PythonBuiltinClass pythonClass = entry .getKey ();
713
703
if (isPublic ) {
714
- mod .setAttribute (pythonClass .getName (), pythonClass );
715
- }
716
- for (Class <?> klass : javaClasses ) {
717
- addType (klass , pythonClass );
718
- }
719
- }
720
- }
721
-
722
- private void addBuiltinsToClass (PythonBuiltinClass clazz , PythonBuiltins builtins ) {
723
- Map <String , Object > builtinConstants = builtins .getBuiltinConstants ();
724
- for (Map .Entry <String , Object > entry : builtinConstants .entrySet ()) {
725
- String className = entry .getKey ();
726
- Object obj = entry .getValue ();
727
- if (obj instanceof GetSetDescriptor && ((GetSetDescriptor ) obj ).getType () != clazz ) {
728
- // GetSetDescriptors need to be copied per class
729
- clazz .setAttributeUnsafe (className , factory ().createGetSetDescriptor (
730
- ((GetSetDescriptor ) obj ).getGet (),
731
- ((GetSetDescriptor ) obj ).getSet (),
732
- ((GetSetDescriptor ) obj ).getName (),
733
- clazz ));
734
- } else {
735
- clazz .setAttributeUnsafe (className , obj );
704
+ PythonBuiltinClass pythonClass = entry .getKey ();
705
+ obj .setAttribute (pythonClass .getName (), pythonClass );
736
706
}
737
707
}
738
-
739
- Map <String , PBuiltinFunction > builtinFunctions = builtins .getBuiltinFunctions ();
740
- for (Map .Entry <String , PBuiltinFunction > entry : builtinFunctions .entrySet ()) {
741
- String className = entry .getKey ();
742
- PBuiltinFunction function = entry .getValue ();
743
- clazz .setAttributeUnsafe (className , function );
744
- }
745
708
}
746
709
747
710
public Source getCoreSource (String basename ) {
0 commit comments