4141package com .oracle .graal .python .builtins .modules ;
4242
4343import static com .oracle .graal .python .builtins .PythonBuiltinClassType .ValueError ;
44+ import static com .oracle .graal .python .nodes .SpecialMethodNames .__GETATTR__ ;
4445import static com .oracle .graal .python .runtime .exception .PythonErrorType .TypeError ;
4546
4647import java .util .List ;
5051import com .oracle .graal .python .builtins .PythonBuiltinClassType ;
5152import com .oracle .graal .python .builtins .PythonBuiltins ;
5253import com .oracle .graal .python .builtins .objects .PNone ;
54+ import com .oracle .graal .python .builtins .objects .module .PythonModule ;
5355import com .oracle .graal .python .builtins .objects .object .PythonObjectLibrary ;
5456import com .oracle .graal .python .builtins .objects .str .PString ;
5557import com .oracle .graal .python .nodes .ErrorMessages ;
6163import com .oracle .graal .python .nodes .util .CastToJavaStringNode ;
6264import com .oracle .graal .python .runtime .PythonCore ;
6365import com .oracle .graal .python .runtime .exception .PythonErrorType ;
66+ import com .oracle .truffle .api .CompilerDirectives ;
67+ import com .oracle .truffle .api .CompilerDirectives .CompilationFinal ;
6468import com .oracle .truffle .api .TruffleLanguage .Env ;
6569import com .oracle .truffle .api .dsl .Cached ;
6670import com .oracle .truffle .api .dsl .Fallback ;
6771import com .oracle .truffle .api .dsl .GenerateNodeFactory ;
6872import com .oracle .truffle .api .dsl .NodeFactory ;
6973import com .oracle .truffle .api .dsl .Specialization ;
74+ import com .oracle .truffle .api .frame .VirtualFrame ;
7075import com .oracle .truffle .api .interop .TruffleObject ;
7176import com .oracle .truffle .api .library .CachedLibrary ;
7277
73- @ CoreFunctions (defineModule = "java" )
78+ @ CoreFunctions (defineModule = JavaModuleBuiltins . JAVA )
7479public class JavaModuleBuiltins extends PythonBuiltins {
80+ protected static final String JAVA = "java" ;
81+
7582 @ Override
7683 protected List <? extends NodeFactory <? extends PythonBuiltinBaseNode >> getNodeFactories () {
7784 return JavaModuleBuiltinsFactory .getFactories ();
@@ -83,6 +90,13 @@ public void initialize(PythonCore core) {
8390 builtinConstants .put ("__path__" , "java!" );
8491 }
8592
93+ @ Override
94+ public void postInitialize (PythonCore core ) {
95+ super .postInitialize (core );
96+ PythonModule javaModule = core .lookupBuiltinModule (JAVA );
97+ javaModule .setAttribute (__GETATTR__ , javaModule .getAttribute (GetAttrNode .JAVA_GETATTR ));
98+ }
99+
86100 @ Builtin (name = "type" , minNumOfPositionalArgs = 1 )
87101 @ GenerateNodeFactory
88102 abstract static class TypeNode extends PythonUnaryBuiltinNode {
@@ -219,4 +233,30 @@ boolean fallback(Object object, Object klass) {
219233 throw raise (TypeError , ErrorMessages .UNSUPPORTED_INSTANCEOF , object , klass );
220234 }
221235 }
236+
237+ @ Builtin (name = GetAttrNode .JAVA_GETATTR , minNumOfPositionalArgs = 1 , maxNumOfPositionalArgs = 2 , declaresExplicitSelf = true )
238+ @ GenerateNodeFactory
239+ abstract static class GetAttrNode extends PythonBuiltinNode {
240+
241+ protected static final String JAVA_GETATTR = "java_getattr" ;
242+ private static final String JAVA_PKG_LOADER = "JavaPackageLoader" ;
243+ private static final String MAKE_GETATTR = "_make_getattr" ;
244+
245+ @ CompilationFinal protected Object getAttr ;
246+
247+ private Object getAttr (VirtualFrame frame , PythonModule mod , PythonObjectLibrary lib ) {
248+ if (getAttr == null ) {
249+ CompilerDirectives .transferToInterpreterAndInvalidate ();
250+ Object javaLoader = lib .lookupAttributeStrict (mod , frame , JAVA_PKG_LOADER );
251+ getAttr = lib .lookupAndCallRegularMethod (javaLoader , frame , MAKE_GETATTR , JAVA );
252+ }
253+ return getAttr ;
254+ }
255+
256+ @ Specialization
257+ Object none (VirtualFrame frame , PythonModule mod , Object name ,
258+ @ CachedLibrary (limit = "3" ) PythonObjectLibrary lib ) {
259+ return lib .callObject (getAttr (frame , mod , lib ), frame , name );
260+ }
261+ }
222262}
0 commit comments