Skip to content

Commit 060ba80

Browse files
committed
ModuleBuiltins: __repr__ delegate to importlib._bootstrap._module_repr
1 parent eed2e77 commit 060ba80

File tree

1 file changed

+35
-0
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module

1 file changed

+35
-0
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/ModuleBuiltins.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,12 @@
4848
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTRIBUTE__;
4949
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTR__;
5050
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
51+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
5152
import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError;
5253

5354
import java.util.List;
5455

56+
import com.oracle.graal.python.PythonLanguage;
5557
import com.oracle.graal.python.builtins.Builtin;
5658
import com.oracle.graal.python.builtins.CoreFunctions;
5759
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
@@ -66,17 +68,26 @@
6668
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6769
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
6870
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
71+
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6972
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
7073
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
7174
import com.oracle.graal.python.nodes.util.CannotCastException;
7275
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
76+
import com.oracle.graal.python.runtime.PythonContext;
7377
import com.oracle.graal.python.runtime.exception.PException;
7478
import com.oracle.truffle.api.dsl.Cached;
79+
import com.oracle.truffle.api.dsl.CachedContext;
7580
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
7681
import com.oracle.truffle.api.dsl.NodeFactory;
7782
import com.oracle.truffle.api.dsl.Specialization;
7883
import com.oracle.truffle.api.dsl.TypeSystemReference;
7984
import com.oracle.truffle.api.frame.VirtualFrame;
85+
import com.oracle.truffle.api.interop.ArityException;
86+
import com.oracle.truffle.api.interop.InteropLibrary;
87+
import com.oracle.truffle.api.interop.UnknownIdentifierException;
88+
import com.oracle.truffle.api.interop.UnsupportedMessageException;
89+
import com.oracle.truffle.api.interop.UnsupportedTypeException;
90+
import com.oracle.truffle.api.library.CachedLibrary;
8091
import com.oracle.truffle.api.profiles.ConditionProfile;
8192

8293
@CoreFunctions(extendClasses = PythonBuiltinClassType.PythonModule)
@@ -87,6 +98,30 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
8798
return ModuleBuiltinsFactory.getFactories();
8899
}
89100

101+
@Builtin(name = __REPR__, minNumOfPositionalArgs = 1, declaresExplicitSelf = true)
102+
@GenerateNodeFactory
103+
public abstract static class ModuleReprNode extends PythonUnaryBuiltinNode {
104+
@Specialization
105+
public Object repr(PythonModule self,
106+
@CachedLibrary(limit = "1") InteropLibrary lib,
107+
@CachedContext(PythonLanguage.class) PythonContext context) {
108+
// PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
109+
PythonModule builtins = context.getCore().getBuiltins();
110+
try {
111+
Object __import__ = lib.readMember(builtins, "__import__");
112+
Object module_repr = importFrom( __import__, "importlib._bootstrap", "_module_repr", lib);
113+
return lib.execute(module_repr, self);
114+
} catch (UnknownIdentifierException | UnsupportedMessageException | UnsupportedTypeException | ArityException e) {
115+
return self.toString();
116+
}
117+
}
118+
119+
private Object importFrom(Object importBuiltinFunction, String moduleName, String from, InteropLibrary lib) throws UnsupportedTypeException, ArityException, UnsupportedMessageException, UnknownIdentifierException {
120+
Object _bootstrap = lib.execute(importBuiltinFunction, moduleName, PNone.NONE, PNone.NONE, factory().createList(new Object[]{from}));
121+
return lib.readMember(_bootstrap, from);
122+
}
123+
}
124+
90125
@Builtin(name = __INIT__, minNumOfPositionalArgs = 2, declaresExplicitSelf = true, parameterNames = {"self", "name", "doc"})
91126
@GenerateNodeFactory
92127
@TypeSystemReference(PythonArithmeticTypes.class)

0 commit comments

Comments
 (0)