|
55 | 55 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_UNICODE_PTR;
|
56 | 56 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer;
|
57 | 57 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
|
58 |
| -import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed; |
59 | 58 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
|
60 | 59 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t;
|
61 | 60 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.SIZE_T;
|
|
103 | 102 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.UnicodeFromFormatNode;
|
104 | 103 | import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper;
|
105 | 104 | import com.oracle.graal.python.builtins.objects.cext.capi.UnicodeObjectNodes.UnicodeAsWideCharNode;
|
106 |
| -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; |
107 | 105 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes;
|
108 | 106 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.Charsets;
|
109 | 107 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EncodeNativeStringNode;
|
110 | 108 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.GetByteArrayNode;
|
111 | 109 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.UnicodeFromWcharNode;
|
| 110 | +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; |
| 111 | +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; |
| 112 | +import com.oracle.graal.python.builtins.objects.dict.PDict; |
112 | 113 | import com.oracle.graal.python.builtins.objects.ints.PInt;
|
113 | 114 | import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
|
114 | 115 | import com.oracle.graal.python.builtins.objects.str.NativeCharSequence;
|
|
130 | 131 | import com.oracle.graal.python.nodes.PGuards;
|
131 | 132 | import com.oracle.graal.python.nodes.PRaiseNode;
|
132 | 133 | import com.oracle.graal.python.nodes.StringLiterals;
|
| 134 | +import com.oracle.graal.python.nodes.attributes.ReadAttributeFromDynamicObjectNode; |
133 | 135 | import com.oracle.graal.python.nodes.call.CallNode;
|
134 | 136 | import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
|
135 | 137 | import com.oracle.graal.python.nodes.object.GetClassNode;
|
@@ -278,26 +280,38 @@ protected boolean isStringSubtype(Object obj, GetClassNode getClassNode, IsSubty
|
278 | 280 | }
|
279 | 281 | }
|
280 | 282 |
|
281 |
| - @CApiBuiltin(ret = PyObjectBorrowed, args = {ArgDescriptor.PyObject}, call = Ignored) |
282 |
| - abstract static class PyTruffleUnicode_InternInPlace extends CApiUnaryBuiltinNode { |
283 |
| - @Specialization(guards = {"!isTruffleString(obj)", "isStringSubtype(obj, getClassNode, isSubtypeNode)"}) |
284 |
| - Object intern(Object obj, |
285 |
| - @Cached InternNode internNode, |
286 |
| - @SuppressWarnings("unused") @Cached GetClassNode getClassNode, |
287 |
| - @SuppressWarnings("unused") @Cached IsSubtypeNode isSubtypeNode) { |
288 |
| - return internNode.execute(null, obj); |
| 283 | + @CApiBuiltin(ret = PyObject, args = {PyObject, PyObject}, call = Ignored) |
| 284 | + abstract static class PyTruffleUnicode_LookupAndIntern extends CApiBinaryBuiltinNode { |
| 285 | + @Specialization |
| 286 | + Object withTS(PDict dict, TruffleString str, |
| 287 | + @Shared @Cached InternNode internNode, |
| 288 | + @Shared @Cached HashingStorageGetItem getItem, |
| 289 | + @Shared @Cached HashingStorageSetItem setItem) { |
| 290 | + Object interned = getItem.execute(dict.getDictStorage(), str); |
| 291 | + if (interned == null) { |
| 292 | + interned = internNode.execute(null, str); |
| 293 | + dict.setDictStorage(setItem.execute(dict.getDictStorage(), str, interned)); |
| 294 | + } |
| 295 | + return interned; |
289 | 296 | }
|
290 | 297 |
|
291 |
| - @Specialization(guards = {"!isTruffleString(obj)", "!isStringSubtype(obj, getClassNode, isSubtypeNode)"}) |
292 |
| - Object intern(@SuppressWarnings("unused") Object obj, |
293 |
| - @SuppressWarnings("unused") @Cached GetClassNode getClassNode, |
294 |
| - @SuppressWarnings("unused") @Cached IsSubtypeNode isSubtypeNode) { |
295 |
| - assert false; |
296 |
| - return PNone.NONE; |
| 298 | + @Specialization |
| 299 | + Object withPString(PDict dict, PString str, |
| 300 | + @Cached ReadAttributeFromDynamicObjectNode readNode, |
| 301 | + @Shared @Cached InternNode internNode, |
| 302 | + @Shared @Cached HashingStorageGetItem getItem, |
| 303 | + @Shared @Cached HashingStorageSetItem setItem) { |
| 304 | + boolean isInterned = readNode.execute(str, PString.INTERNED) != PNone.NO_VALUE; |
| 305 | + if (isInterned) { |
| 306 | + return str; |
| 307 | + } |
| 308 | + return withTS(dict, str.getValueUncached(), internNode, getItem, setItem); |
297 | 309 | }
|
298 | 310 |
|
299 |
| - protected boolean isStringSubtype(Object obj, GetClassNode getClassNode, IsSubtypeNode isSubtypeNode) { |
300 |
| - return isSubtypeNode.execute(getClassNode.execute(obj), PythonBuiltinClassType.PString); |
| 311 | + @Fallback |
| 312 | + Object nil(@SuppressWarnings("unused") Object dict, |
| 313 | + @SuppressWarnings("unused") Object obj) { |
| 314 | + return PNone.NONE; |
301 | 315 | }
|
302 | 316 | }
|
303 | 317 |
|
|
0 commit comments