Skip to content

Commit a80ef80

Browse files
committed
MethodBuiltins: fix __repr__
1 parent f36e4f0 commit a80ef80

File tree

1 file changed

+23
-13
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method

1 file changed

+23
-13
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/MethodBuiltins.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,17 @@
4646
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4747
import com.oracle.graal.python.builtins.PythonBuiltins;
4848
import com.oracle.graal.python.builtins.objects.PNone;
49-
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
5049
import com.oracle.graal.python.builtins.objects.function.PKeyword;
5150
import com.oracle.graal.python.builtins.objects.module.PythonModule;
5251
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
5352
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
5453
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
55-
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
5654
import com.oracle.graal.python.nodes.ErrorMessages;
57-
import com.oracle.graal.python.nodes.SpecialAttributeNames;
5855
import com.oracle.graal.python.nodes.attributes.GetAttributeNode;
5956
import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetDefaultsNode;
6057
import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetKeywordDefaultsNode;
6158
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
59+
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
6260
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6361
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
6462
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
@@ -136,13 +134,25 @@ protected Object doIt(VirtualFrame frame, PMethod self, Object key,
136134
@Builtin(name = __REPR__, minNumOfPositionalArgs = 1)
137135
@GenerateNodeFactory
138136
public abstract static class ReprNode extends PythonUnaryBuiltinNode {
139-
@Specialization(limit = "3")
140-
Object reprMethod(VirtualFrame frame, PMethod self,
141-
@CachedLibrary("self.getSelf()") PythonObjectLibrary lib,
142-
@Cached("create(__QUALNAME__)") GetAttributeNode getNameAttrNode,
143-
@Cached GetNameNode getTypeNameNode) {
144-
String typeName = getTypeNameNode.execute(lib.getLazyPythonClass(self.getSelf()));
145-
return strFormat("<bound method %s of %s object at 0x%x>", getNameAttrNode.executeObject(frame, self.getFunction()), typeName, PythonAbstractObject.systemHashCode(self.getSelf()));
137+
@Specialization
138+
Object reprMethod(VirtualFrame frame, PMethod method,
139+
@Cached("create(__REPR__)") LookupAndCallUnaryNode callReprNode,
140+
@Cached CastToJavaStringNode toJavaStringNode,
141+
@CachedLibrary(limit = "1") PythonObjectLibrary pol) {
142+
Object self = method.getSelf();
143+
Object func = method.getFunction();
144+
String defname = "?";
145+
146+
Object funcName = pol.lookupAttribute(func, __QUALNAME__);
147+
if (funcName == PNone.NO_VALUE) {
148+
funcName = pol.lookupAttribute(func, __NAME__);
149+
}
150+
151+
try {
152+
return strFormat("<bound method %s of %s>", toJavaStringNode.execute(funcName), callReprNode.executeObject(frame, self));
153+
} catch (CannotCastException e) {
154+
return strFormat("<bound method %s of %s>", defname, callReprNode.executeObject(frame, self));
155+
}
146156
}
147157

148158
@TruffleBoundary
@@ -202,15 +212,15 @@ PMethod doGeneric(@SuppressWarnings("unused") PMethod self, Object obj, @Suppres
202212
public abstract static class MethodName extends PythonUnaryBuiltinNode {
203213
@Specialization
204214
Object getName(VirtualFrame frame, PMethod method,
205-
@Cached("create(__NAME__)") GetAttributeNode getNameAttrNode) {
215+
@Cached("create(__NAME__)") GetAttributeNode getNameAttrNode) {
206216
return getNameAttrNode.executeObject(frame, method.getFunction());
207217
}
208218
}
209219

210220
@Builtin(name = __QUALNAME__, minNumOfPositionalArgs = 1, isGetter = true)
211221
@GenerateNodeFactory
212222
public abstract static class MethodQualName extends PythonUnaryBuiltinNode {
213-
@Specialization
223+
@Specialization(limit = "3")
214224
Object getQualName(VirtualFrame frame, PMethod method,
215225
@Cached("create(__QUALNAME__)") GetAttributeNode getQualNameAttrNode,
216226
@Cached("create(__NAME__)") GetAttributeNode getNameAttrNode,
@@ -223,7 +233,7 @@ Object getQualName(VirtualFrame frame, PMethod method,
223233
return selfName;
224234
}
225235

226-
Object type = isTypeNode.execute(self) ? self: pol.getLazyPythonClass(self);
236+
Object type = isTypeNode.execute(self) ? self : pol.getLazyPythonClass(self);
227237
String typeQualName;
228238
try {
229239
typeQualName = castToJavaStringNode.execute(getQualNameAttrNode.executeObject(frame, type));

0 commit comments

Comments
 (0)