Skip to content

Commit 4863dc5

Browse files
committed
delay setting __getattr__ for java module
1 parent 49aff3b commit 4863dc5

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JavaModuleBuiltins.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
package com.oracle.graal.python.builtins.modules;
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
44+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTR__;
4445
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
4546

4647
import java.util.List;
@@ -50,6 +51,7 @@
5051
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5152
import com.oracle.graal.python.builtins.PythonBuiltins;
5253
import com.oracle.graal.python.builtins.objects.PNone;
54+
import com.oracle.graal.python.builtins.objects.module.PythonModule;
5355
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
5456
import com.oracle.graal.python.builtins.objects.str.PString;
5557
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -61,17 +63,22 @@
6163
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
6264
import com.oracle.graal.python.runtime.PythonCore;
6365
import com.oracle.graal.python.runtime.exception.PythonErrorType;
66+
import com.oracle.truffle.api.CompilerDirectives;
67+
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
6468
import com.oracle.truffle.api.TruffleLanguage.Env;
6569
import com.oracle.truffle.api.dsl.Cached;
6670
import com.oracle.truffle.api.dsl.Fallback;
6771
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
6872
import com.oracle.truffle.api.dsl.NodeFactory;
6973
import com.oracle.truffle.api.dsl.Specialization;
74+
import com.oracle.truffle.api.frame.VirtualFrame;
7075
import com.oracle.truffle.api.interop.TruffleObject;
7176
import com.oracle.truffle.api.library.CachedLibrary;
7277

73-
@CoreFunctions(defineModule = "java")
78+
@CoreFunctions(defineModule = JavaModuleBuiltins.JAVA)
7479
public 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
}

graalpython/lib-graalpython/java.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,3 @@ def find_spec(self, fullname, path, target=None):
199199

200200

201201
sys.meta_path.append(JavaImportFinder())
202-
__getattr__ = JavaPackageLoader._make_getattr("java")

0 commit comments

Comments
 (0)