Skip to content

Commit b6ef949

Browse files
committed
[GR-30482] PyObjectStr
PullRequest: graalpython/1806
2 parents 832a803 + b0b8eca commit b6ef949

34 files changed

+595
-327
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@
5959
import com.oracle.graal.python.nodes.PRaiseNode;
6060
import com.oracle.graal.python.runtime.GilNode;
6161
import com.oracle.graal.python.runtime.PythonContext;
62-
import com.oracle.graal.python.util.PythonUtils;
6362
import com.oracle.truffle.api.CompilerAsserts;
6463
import com.oracle.truffle.api.CompilerDirectives;
6564
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
@@ -744,14 +743,6 @@ public static boolean isExceptionType(PythonBuiltinClassType type) {
744743
return type.isException;
745744
}
746745

747-
/**
748-
* Must be kept in sync with TypeBuiltins.ReprNode
749-
*/
750-
@ExportMessage
751-
String asPStringWithState(@SuppressWarnings("unused") ThreadState state) {
752-
return PythonUtils.format("<class '%s'>", getPrintName());
753-
}
754-
755746
@ExportMessage
756747
public Object lookupAndCallSpecialMethodWithState(ThreadState state, String methodName, Object[] arguments,
757748
@CachedLibrary("this") PythonObjectLibrary plib,

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,8 @@
3535
import java.util.Map.Entry;
3636

3737
import com.oracle.graal.python.builtins.objects.PNone;
38-
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor;
3938
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4039
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
41-
import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
4240
import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
4341
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4442
import com.oracle.graal.python.util.BiConsumer;
@@ -77,24 +75,12 @@ public void initialize(Python3Core core) {
7775
}
7876
RootCallTarget callTarget = core.getLanguage().createCachedCallTarget(l -> new BuiltinFunctionRootNode(l, builtin, factory, declaresExplicitSelf), factory.getNodeClass(),
7977
builtin.name());
80-
if (SpecialMethodSlot.findSpecialSlot(builtin.name()) != null) {
81-
for (PythonBuiltinClassType type : annotation.extendClasses()) {
82-
BuiltinMethodDescriptor descriptor = BuiltinMethodDescriptor.get(factory, type);
83-
if (descriptor != null) {
84-
core.getLanguage().registerBuiltinDescriptorCallTarget(descriptor, callTarget);
85-
}
86-
}
87-
}
8878
Object builtinDoc = builtin.doc().isEmpty() ? PNone.NONE : builtin.doc();
8979
if (constructsClass != PythonBuiltinClassType.nil) {
9080
assert !builtin.isGetter() && !builtin.isSetter() && !builtin.isClassmethod() && !builtin.isStaticmethod();
9181
// we explicitly do not make these "staticmethods" here, since CPython also doesn't
9282
// for builtin types
9383
PBuiltinFunction newFunc = core.factory().createBuiltinFunction(__NEW__, constructsClass, numDefaults(builtin), callTarget);
94-
BuiltinMethodDescriptor descriptor = BuiltinMethodDescriptor.get(newFunc);
95-
if (descriptor != null) {
96-
core.getLanguage().registerBuiltinDescriptorCallTarget(descriptor, callTarget);
97-
}
9884
PythonBuiltinClass builtinClass = core.lookupType(constructsClass);
9985
builtinClass.setAttributeUnsafe(__NEW__, newFunc);
10086
builtinClass.setAttribute(__DOC__, builtinDoc);

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@
203203
import com.oracle.graal.python.lib.PyNumberIndexNode;
204204
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
205205
import com.oracle.graal.python.lib.PyObjectSizeNode;
206+
import com.oracle.graal.python.lib.PyObjectStrAsObjectNode;
206207
import com.oracle.graal.python.nodes.BuiltinNames;
207208
import com.oracle.graal.python.nodes.ErrorMessages;
208209
import com.oracle.graal.python.nodes.PGuards;
@@ -1888,17 +1889,18 @@ Object strNoArgs(Object strClass, PNone arg, Object encoding, Object errors) {
18881889
}
18891890

18901891
@Specialization(guards = {"!isNativeClass(strClass)", "!isNoValue(obj)", "isNoValue(encoding)", "isNoValue(errors)"})
1891-
Object strOneArg(Object strClass, Object obj, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors,
1892-
@CachedLibrary(limit = "2") PythonObjectLibrary lib) {
1893-
Object result = lib.asPString(obj);
1892+
Object strOneArg(VirtualFrame frame, Object strClass, Object obj, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors,
1893+
@Cached PyObjectStrAsObjectNode strNode) {
1894+
Object result = strNode.execute(frame, obj);
18941895

18951896
// try to return a primitive if possible
18961897
if (getIsStringProfile().profile(result instanceof String)) {
18971898
return asPString(strClass, (String) result);
18981899
}
18991900

19001901
if (isPrimitiveProfile.profileClass(strClass, PythonBuiltinClassType.PString)) {
1901-
// PythonObjectLibrary guarantees that the returned object is an instanceof of 'str'
1902+
// PyObjectStrAsObjectNode guarantees that the returned object is an instanceof of
1903+
// 'str'
19021904
return result;
19031905
} else {
19041906
try {
@@ -1943,12 +1945,12 @@ private Object decodeBytes(VirtualFrame frame, Object strClass, PBytes obj, Obje
19431945
* into a natively allocated subtype structure
19441946
*/
19451947
@Specialization(guards = {"isNativeClass(cls)", "isSubtypeOfString(frame, isSubtype, cls)", "isNoValue(encoding)", "isNoValue(errors)"})
1946-
static Object doNativeSubclass(@SuppressWarnings("unused") VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") Object encoding,
1948+
static Object doNativeSubclass(VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") Object encoding,
19471949
@SuppressWarnings("unused") Object errors,
19481950
@Cached @SuppressWarnings("unused") IsSubtypeNode isSubtype,
1949-
@CachedLibrary(limit = "2") PythonObjectLibrary lib,
1951+
@Cached PyObjectStrAsObjectNode strNode,
19501952
@Cached CExtNodes.StringSubtypeNew subtypeNew) {
1951-
return subtypeNew.call(cls, lib.asPString(obj));
1953+
return subtypeNew.call(cls, strNode.execute(frame, obj));
19521954
}
19531955

19541956
protected static boolean isSubtypeOfString(VirtualFrame frame, IsSubtypeNode isSubtypeNode, Object cls) {

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

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
import com.oracle.graal.python.annotations.ArgumentClinic;
8787
import com.oracle.graal.python.builtins.Builtin;
8888
import com.oracle.graal.python.builtins.CoreFunctions;
89+
import com.oracle.graal.python.builtins.Python3Core;
8990
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
9091
import com.oracle.graal.python.builtins.PythonBuiltins;
9192
import com.oracle.graal.python.builtins.modules.BuiltinFunctionsFactory.GetAttrNodeFactory;
@@ -124,7 +125,11 @@
124125
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode;
125126
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
126127
import com.oracle.graal.python.lib.PyNumberIndexNode;
128+
import com.oracle.graal.python.lib.PyObjectAsciiNode;
129+
import com.oracle.graal.python.lib.PyObjectReprAsObjectNode;
127130
import com.oracle.graal.python.lib.PyObjectSizeNode;
131+
import com.oracle.graal.python.lib.PyObjectStrAsJavaStringNode;
132+
import com.oracle.graal.python.lib.PyObjectStrAsObjectNode;
128133
import com.oracle.graal.python.nodes.BuiltinNames;
129134
import com.oracle.graal.python.nodes.ErrorMessages;
130135
import com.oracle.graal.python.nodes.GraalPythonTranslationErrorNode;
@@ -183,7 +188,6 @@
183188
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
184189
import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext;
185190
import com.oracle.graal.python.runtime.PythonContext;
186-
import com.oracle.graal.python.builtins.Python3Core;
187191
import com.oracle.graal.python.runtime.PythonOptions;
188192
import com.oracle.graal.python.runtime.PythonParser.ParserMode;
189193
import com.oracle.graal.python.runtime.exception.PException;
@@ -829,6 +833,7 @@ PCode generic(VirtualFrame frame, Object wSource, Object wFilename, Object wMode
829833
@Cached CastToJavaStringNode castStr,
830834
@Cached CastToJavaIntExactNode castInt,
831835
@Cached CodecsModuleBuiltins.HandleDecodingErrorNode handleDecodingErrorNode,
836+
@Cached PyObjectStrAsJavaStringNode asStrNode,
832837
@CachedLibrary("wSource") InteropLibrary interopLib,
833838
@CachedLibrary(limit = "4") PythonObjectLibrary lib,
834839
@Cached WarnNode warnNode) {
@@ -870,7 +875,7 @@ PCode generic(VirtualFrame frame, Object wSource, Object wFilename, Object wMode
870875
}
871876
checkOptimize(optimize, kwOptimize);
872877
}
873-
String source = sourceAsString(wSource, filename, interopLib, lib, handleDecodingErrorNode);
878+
String source = sourceAsString(frame, wSource, filename, interopLib, lib, handleDecodingErrorNode, asStrNode);
874879
checkSource(source);
875880
return compile(source, filename, mode, flags, kwDontInherit, optimize);
876881
}
@@ -894,7 +899,8 @@ private void checkFlags(int flags) {
894899
}
895900

896901
// modeled after _Py_SourceAsString
897-
String sourceAsString(Object source, String filename, InteropLibrary interopLib, PythonObjectLibrary pyLib, CodecsModuleBuiltins.HandleDecodingErrorNode handleDecodingErrorNode) {
902+
String sourceAsString(VirtualFrame frame, Object source, String filename, InteropLibrary interopLib, PythonObjectLibrary pyLib,
903+
CodecsModuleBuiltins.HandleDecodingErrorNode handleDecodingErrorNode, PyObjectStrAsJavaStringNode asStrNode) {
898904
if (interopLib.isString(source)) {
899905
try {
900906
return interopLib.asString(source);
@@ -919,7 +925,7 @@ String sourceAsString(Object source, String filename, InteropLibrary interopLib,
919925
handleDecodingErrorNode.execute(decoder, "strict", source);
920926
throw CompilerDirectives.shouldNotReachHere();
921927
} catch (PException e) {
922-
throw raiseInvalidSyntax(filename, "(unicode error) %s", pyLib.asPString(e.getEscapedException()));
928+
throw raiseInvalidSyntax(filename, "(unicode error) %s", asStrNode.execute(frame, e.getEscapedException()));
923929
}
924930
}
925931
return decoder.getString();
@@ -1527,23 +1533,23 @@ public abstract static class PrintNode extends PythonBuiltinNode {
15271533
PNone printNoKeywords(VirtualFrame frame, Object[] values, @SuppressWarnings("unused") PNone sep, @SuppressWarnings("unused") PNone end, @SuppressWarnings("unused") PNone file,
15281534
@SuppressWarnings("unused") PNone flush,
15291535
@CachedLibrary(limit = "3") PythonObjectLibrary lib,
1530-
@CachedLibrary(limit = "3") PythonObjectLibrary valueLib) {
1536+
@Cached PyObjectStrAsObjectNode strNode) {
15311537
Object stdout = getStdout();
1532-
return printAllGiven(frame, values, DEFAULT_SEPARATOR, DEFAULT_END, stdout, false, lib, valueLib);
1538+
return printAllGiven(frame, values, DEFAULT_SEPARATOR, DEFAULT_END, stdout, false, lib, strNode);
15331539
}
15341540

15351541
@Specialization(guards = {"!isNone(file)", "!isNoValue(file)"})
15361542
PNone printAllGiven(VirtualFrame frame, Object[] values, String sep, String end, Object file, boolean flush,
15371543
@CachedLibrary(limit = "3") PythonObjectLibrary lib,
1538-
@CachedLibrary(limit = "3") PythonObjectLibrary valueLib) {
1544+
@Cached PyObjectStrAsObjectNode strNode) {
15391545
int lastValue = values.length - 1;
15401546
Object writeMethod = lib.lookupAttributeStrict(file, frame, "write");
15411547
for (int i = 0; i < lastValue; i++) {
1542-
lib.callObject(writeMethod, frame, valueLib.asPString(values[i]));
1548+
lib.callObject(writeMethod, frame, strNode.execute(frame, values[i]));
15431549
lib.callObject(writeMethod, frame, sep);
15441550
}
15451551
if (lastValue >= 0) {
1546-
lib.callObject(writeMethod, frame, valueLib.asPString(values[lastValue]));
1552+
lib.callObject(writeMethod, frame, strNode.execute(frame, values[lastValue]));
15471553
}
15481554
lib.callObject(writeMethod, frame, end);
15491555
if (flush) {
@@ -1560,7 +1566,7 @@ PNone printGeneric(VirtualFrame frame, Object[] values, Object sepIn, Object end
15601566
@Cached("createIfTrueNode()") CoerceToBooleanNode castFlush,
15611567
@Cached PRaiseNode raiseNode,
15621568
@CachedLibrary(limit = "4") PythonObjectLibrary lib,
1563-
@CachedLibrary(limit = "3") PythonObjectLibrary valueLib) {
1569+
@Cached PyObjectStrAsObjectNode strNode) {
15641570
String sep;
15651571
try {
15661572
sep = sepIn instanceof PNone ? DEFAULT_SEPARATOR : castSep.execute(sepIn);
@@ -1587,7 +1593,7 @@ PNone printGeneric(VirtualFrame frame, Object[] values, Object sepIn, Object end
15871593
} else {
15881594
flush = castFlush.executeBoolean(frame, flushIn);
15891595
}
1590-
return printAllGiven(frame, values, sep, end, file, flush, lib, valueLib);
1596+
return printAllGiven(frame, values, sep, end, file, flush, lib, strNode);
15911597
}
15921598

15931599
private Object getStdout() {
@@ -1628,7 +1634,7 @@ abstract static class ReprNode extends PythonUnaryBuiltinNode {
16281634

16291635
@Specialization
16301636
static Object repr(VirtualFrame frame, Object obj,
1631-
@Cached ObjectNodes.ReprAsObjectNode reprNode) {
1637+
@Cached PyObjectReprAsObjectNode reprNode) {
16321638
return reprNode.execute(frame, obj);
16331639
}
16341640
}
@@ -1671,7 +1677,7 @@ abstract static class AsciiNode extends PythonUnaryBuiltinNode {
16711677

16721678
@Specialization
16731679
public static String ascii(VirtualFrame frame, Object obj,
1674-
@Cached ObjectNodes.AsciiNode asciiNode) {
1680+
@Cached PyObjectAsciiNode asciiNode) {
16751681
return asciiNode.execute(frame, obj);
16761682
}
16771683
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@
4949
import com.oracle.graal.python.builtins.objects.PNone;
5050
import com.oracle.graal.python.builtins.objects.module.PythonModule;
5151
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
52+
import com.oracle.graal.python.lib.PyObjectStrAsJavaStringNode;
5253
import com.oracle.graal.python.nodes.PGuards;
5354
import com.oracle.graal.python.nodes.PNodeWithRaise;
5455
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
55-
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
5656
import com.oracle.graal.python.runtime.PythonContext;
5757
import com.oracle.truffle.api.dsl.Cached;
5858
import com.oracle.truffle.api.dsl.CachedContext;
@@ -88,10 +88,10 @@ public abstract static class GetPreferredEncoding extends PNodeWithRaise {
8888
static String getpreferredencoding(VirtualFrame frame,
8989
@CachedContext(PythonLanguage.class) PythonContext context,
9090
@CachedLibrary(limit = "2") PythonObjectLibrary lib,
91-
@Cached CastToJavaStringNode castToJavaStringNode) {
91+
@Cached PyObjectStrAsJavaStringNode strNode) {
9292
PythonModule codecs = context.getCore().lookupBuiltinModule("_codecs_truffle");
9393
Object e = lib.lookupAndCallRegularMethod(codecs, frame, "_getpreferredencoding");
94-
return castToJavaStringNode.execute(lib.asPString(e));
94+
return strNode.execute(frame, e);
9595
}
9696
}
9797

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONEncoderBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,10 +304,10 @@ private void appendList(PJSONEncoder encoder, StringBuilder builder, PSequence l
304304
e.expectStopIteration(stopListIterationProfile);
305305
break;
306306
}
307-
if (first) {
307+
if (!first) {
308308
builder.append(encoder.itemSeparator);
309-
first = false;
310309
}
310+
first = false;
311311
appendListObj(encoder, builder, item);
312312
}
313313
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMANodes.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,14 @@
101101
import com.oracle.graal.python.builtins.objects.ints.PInt;
102102
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
103103
import com.oracle.graal.python.lib.PyObjectSizeNode;
104+
import com.oracle.graal.python.lib.PyObjectStrAsJavaStringNode;
104105
import com.oracle.graal.python.nodes.PGuards;
105106
import com.oracle.graal.python.nodes.PNodeWithRaise;
106107
import com.oracle.graal.python.nodes.PRaiseNode;
107108
import com.oracle.graal.python.nodes.subscript.GetItemNode;
108109
import com.oracle.graal.python.nodes.util.CannotCastException;
109110
import com.oracle.graal.python.nodes.util.CastToJavaLongExactNode;
110111
import com.oracle.graal.python.nodes.util.CastToJavaLongLossyNode;
111-
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
112112
import com.oracle.graal.python.runtime.NFILZMASupport;
113113
import com.oracle.graal.python.runtime.NativeLibrary;
114114
import com.oracle.graal.python.runtime.PythonContext;
@@ -269,13 +269,12 @@ public OptionsState execute(Object key, OptionsState s) {
269269

270270
@Specialization(limit = "2")
271271
OptionsState doit(Object key, OptionsState s,
272-
@Cached CastToJavaStringNode castStr,
272+
@Cached PyObjectStrAsJavaStringNode strNode,
273273
@Cached CastToJavaLongLossyNode toLong,
274274
@Cached ConditionProfile errProfile,
275-
@CachedLibrary("key") PythonObjectLibrary lib,
276275
@CachedLibrary("s.dictStorage") HashingStorageLibrary hlib,
277276
@Cached PRaiseNode raise) {
278-
String skey = castStr.execute(lib.asPString(key));
277+
String skey = strNode.execute(null, key);
279278
int idx = getOptionIndex(skey, s);
280279
if (errProfile.profile(idx == -1)) {
281280
throw raise.raise(ValueError, "Invalid filter specifier for %s filter", s.filterType);

0 commit comments

Comments
 (0)