Skip to content

Commit 6b778ca

Browse files
committed
avoid calling toString in various places
1 parent 7d3be8a commit 6b778ca

File tree

6 files changed

+35
-40
lines changed

6 files changed

+35
-40
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictBuiltins.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.ContainsKeyNode;
5656
import com.oracle.graal.python.builtins.objects.function.PKeyword;
5757
import com.oracle.graal.python.builtins.objects.str.PString;
58+
import com.oracle.graal.python.nodes.PGuards;
5859
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
5960
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
6061
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
@@ -265,8 +266,19 @@ Object getItem(PDict self, Object key,
265266
public abstract static class MissingNode extends PythonBuiltinNode {
266267
@SuppressWarnings("unused")
267268
@Specialization
268-
Object run(Object self, Object key) {
269-
throw raise(KeyError, "%s", key.toString());
269+
Object run(Object self, String key) {
270+
throw raise(KeyError, "%s", key);
271+
}
272+
273+
@SuppressWarnings("unused")
274+
@Specialization(guards = "!isString(key)")
275+
Object run(Object self, Object key,
276+
@Cached("create(__REPR__)") LookupAndCallUnaryNode specialNode) {
277+
Object name = specialNode.executeObject(key);
278+
if (!PGuards.isString(name)) {
279+
throw raise(TypeError, "__repr__ returned non-string (type %p)", name);
280+
}
281+
throw raise(KeyError, "%s", name);
270282
}
271283
}
272284

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectBuiltins.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,15 @@
7575
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
7676
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
7777
import com.oracle.graal.python.nodes.object.GetClassNode;
78+
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
7879
import com.oracle.truffle.api.CompilerDirectives;
7980
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
8081
import com.oracle.truffle.api.dsl.Cached;
8182
import com.oracle.truffle.api.dsl.Fallback;
8283
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
8384
import com.oracle.truffle.api.dsl.NodeFactory;
8485
import com.oracle.truffle.api.dsl.Specialization;
86+
import com.oracle.truffle.api.dsl.TypeSystemReference;
8587
import com.oracle.truffle.api.nodes.UnexpectedResultException;
8688
import com.oracle.truffle.api.profiles.BranchProfile;
8789
import com.oracle.truffle.api.profiles.ConditionProfile;
@@ -166,17 +168,14 @@ public Object str(Object self,
166168
}
167169

168170
@Builtin(name = __REPR__, fixedNumOfArguments = 1)
171+
@TypeSystemReference(PythonArithmeticTypes.class)
169172
@GenerateNodeFactory
170173
public abstract static class ReprNode extends PythonUnaryBuiltinNode {
171174
@Specialization
172-
Object repr(PythonNativeObject self,
175+
@TruffleBoundary
176+
Object repr(Object self,
173177
@Cached("create()") GetClassNode getClass) {
174-
return "<" + getClass.execute(self).getName() + " object at 0x" + self.hashCode() + ">";
175-
}
176-
177-
@Fallback
178-
public Object repr(Object self) {
179-
return self.toString();
178+
return String.format("<%s object at 0x%x>", getClass.execute(self).getName(), self.hashCode());
180179
}
181180
}
182181

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/PythonBuiltinBaseNode.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,33 +38,14 @@
3838
*/
3939
package com.oracle.graal.python.nodes.function;
4040

41-
import com.oracle.graal.python.builtins.objects.function.PArguments;
42-
import com.oracle.graal.python.builtins.objects.function.PythonCallable;
43-
import com.oracle.graal.python.builtins.objects.object.PythonObject;
4441
import com.oracle.graal.python.nodes.BuiltinNames;
4542
import com.oracle.graal.python.nodes.PBaseNode;
4643
import com.oracle.graal.python.nodes.PGuards;
4744
import com.oracle.graal.python.nodes.SpecialAttributeNames;
4845
import com.oracle.graal.python.nodes.SpecialMethodNames;
49-
import com.oracle.graal.python.nodes.call.InvokeNode;
5046
import com.oracle.graal.python.runtime.PythonOptions;
51-
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
5247
import com.oracle.truffle.api.dsl.ImportStatic;
5348

5449
@ImportStatic({PGuards.class, PythonOptions.class, SpecialMethodNames.class, SpecialAttributeNames.class, BuiltinNames.class})
5550
public abstract class PythonBuiltinBaseNode extends PBaseNode {
56-
@TruffleBoundary
57-
public static String callAttributeSlowPath(PythonObject obj, String attributeId) {
58-
Object object = obj.getPythonClass().getAttribute(attributeId);
59-
PythonCallable callable;
60-
if (object instanceof PythonCallable) {
61-
callable = (PythonCallable) object;
62-
} else {
63-
callable = PythonCallable.require(obj.getAttribute(attributeId));
64-
}
65-
Object[] arguments = PArguments.create(1);
66-
PArguments.setArgument(arguments, 0, obj);
67-
InvokeNode invokeNode = InvokeNode.create(callable);
68-
return invokeNode.invoke(arguments).toString();
69-
}
7051
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetClassNode.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
package com.oracle.graal.python.nodes.object;
4040

4141
import com.oracle.graal.python.PythonLanguage;
42+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4243
import com.oracle.graal.python.builtins.objects.PEllipsis;
4344
import com.oracle.graal.python.builtins.objects.PNone;
4445
import com.oracle.graal.python.builtins.objects.PNotImplemented;
@@ -51,6 +52,7 @@
5152
import com.oracle.graal.python.builtins.objects.str.PString;
5253
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
5354
import com.oracle.graal.python.builtins.objects.type.PythonClass;
55+
import com.oracle.graal.python.nodes.BuiltinNames;
5456
import com.oracle.graal.python.nodes.PGuards;
5557
import com.oracle.graal.python.nodes.PNode;
5658
import com.oracle.graal.python.runtime.exception.PException;
@@ -199,4 +201,12 @@ public static PythonClass getItSlowPath(Object o) {
199201
}
200202
return PythonLanguage.getCore().lookupType(o.getClass());
201203
}
204+
205+
@TruffleBoundary
206+
public static String getNameSlowPath(Object o) {
207+
if (PGuards.isForeignObject(o)) {
208+
return BuiltinNames.FOREIGN;
209+
}
210+
return PythonBuiltinClassType.fromClass(o.getClass()).name();
211+
}
202212
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/formatting/ErrorMessageFormatter.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import java.util.regex.Matcher;
4343
import java.util.regex.Pattern;
4444

45-
import com.oracle.graal.python.builtins.objects.type.PythonClass;
4645
import com.oracle.graal.python.nodes.object.GetClassNode;
4746

4847
/**
@@ -81,13 +80,13 @@ public String format(GetClassNode getClassNode, String format, Object... args) {
8180
while (m.find(idx)) {
8281
String group = m.group();
8382
if ("%p".equals(group)) {
84-
String name = getClass(getClassNode, args[matchIdx]).getName();
83+
String name = getClassName(getClassNode, args[matchIdx]);
8584
sb.replace(m.start() + offset, m.end() + offset, name);
8685
offset += name.length() - (m.end() - m.start());
8786
args[matchIdx] = REMOVED_MARKER;
8887
removedCnt++;
8988
} else if ("%P".equals(group)) {
90-
String name = getClass(getClassNode, args[matchIdx]).toString();
89+
String name = "<class \'" + getClassName(getClassNode, args[matchIdx]) + "\'>";
9190
sb.replace(m.start() + offset, m.end() + offset, name);
9291
offset += name.length() - (m.end() - m.start());
9392
args[matchIdx] = REMOVED_MARKER;
@@ -103,11 +102,11 @@ public String format(GetClassNode getClassNode, String format, Object... args) {
103102
return String.format(sb.toString(), compact(args, removedCnt));
104103
}
105104

106-
private static PythonClass getClass(GetClassNode getClassNode, Object obj) {
105+
private static String getClassName(GetClassNode getClassNode, Object obj) {
107106
if (getClassNode != null) {
108-
return getClassNode.execute(obj);
107+
return getClassNode.execute(obj).getName();
109108
}
110-
return GetClassNode.getItSlowPath(obj);
109+
return GetClassNode.getNameSlowPath(obj);
111110
}
112111

113112
private static Object[] compact(Object[] args, int removedCnt) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/PSequence.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,10 @@
2525
*/
2626
package com.oracle.graal.python.runtime.sequence;
2727

28-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
29-
3028
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
31-
import com.oracle.graal.python.builtins.objects.object.PythonObject;
3229
import com.oracle.graal.python.builtins.objects.slice.PSlice;
3330
import com.oracle.graal.python.builtins.objects.slice.PSlice.SliceInfo;
3431
import com.oracle.graal.python.builtins.objects.type.PythonClass;
35-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
3632
import com.oracle.graal.python.runtime.JavaTypeConversions;
3733
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
3834
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
@@ -73,8 +69,6 @@ public static String toString(Object item) {
7369
return "'" + item.toString() + "'";
7470
} else if (item instanceof Boolean) {
7571
return ((boolean) item ? "True" : "False");
76-
} else if (item instanceof PythonObject) {
77-
return PythonBuiltinNode.callAttributeSlowPath((PythonObject) item, __REPR__);
7872
} else if (item instanceof Double) {
7973
return JavaTypeConversions.doubleToString((double) item);
8074
} else {

0 commit comments

Comments
 (0)