|
98 | 98 | import java.util.Arrays;
|
99 | 99 | import java.util.List;
|
100 | 100 |
|
| 101 | +import com.oracle.graal.python.annotations.ArgumentClinic; |
101 | 102 | import com.oracle.graal.python.builtins.Builtin;
|
102 | 103 | import com.oracle.graal.python.builtins.CoreFunctions;
|
103 | 104 | import com.oracle.graal.python.builtins.PythonBuiltinClassType;
|
|
106 | 107 | import com.oracle.graal.python.builtins.objects.PNone;
|
107 | 108 | import com.oracle.graal.python.builtins.objects.PNotImplemented;
|
108 | 109 | import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
|
109 |
| -import com.oracle.graal.python.builtins.objects.bytes.BytesNodes.ConvertToByteObjectBytesNode; |
| 110 | +import com.oracle.graal.python.builtins.objects.bytes.BytesNodesFactory; |
| 111 | +import com.oracle.graal.python.builtins.objects.bytes.PByteArray; |
110 | 112 | import com.oracle.graal.python.builtins.objects.bytes.PBytes;
|
111 | 113 | import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
|
112 | 114 | import com.oracle.graal.python.builtins.objects.cell.PCell;
|
|
199 | 201 | import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
|
200 | 202 | import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
|
201 | 203 | import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode;
|
| 204 | +import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; |
202 | 205 | import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
|
203 | 206 | import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
|
| 207 | +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; |
204 | 208 | import com.oracle.graal.python.nodes.object.GetClassNode;
|
205 | 209 | import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
|
206 | 210 | import com.oracle.graal.python.nodes.subscript.SliceLiteralNode;
|
|
215 | 219 | import com.oracle.graal.python.runtime.PythonCore;
|
216 | 220 | import com.oracle.graal.python.runtime.exception.PException;
|
217 | 221 | import com.oracle.graal.python.runtime.object.PythonObjectFactory;
|
| 222 | +import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; |
218 | 223 | import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage;
|
219 | 224 | import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
|
220 |
| -import com.oracle.graal.python.util.PythonUtils; |
221 | 225 | import com.oracle.graal.python.util.OverflowException;
|
| 226 | +import com.oracle.graal.python.util.PythonUtils; |
222 | 227 | import com.oracle.truffle.api.Assumption;
|
223 | 228 | import com.oracle.truffle.api.CompilerAsserts;
|
224 | 229 | import com.oracle.truffle.api.CompilerDirectives;
|
@@ -258,23 +263,49 @@ public void initialize(PythonCore core) {
|
258 | 263 | }
|
259 | 264 |
|
260 | 265 | // bytes([source[, encoding[, errors]]])
|
261 |
| - @Builtin(name = BYTES, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 4, constructsClass = PythonBuiltinClassType.PBytes) |
| 266 | + @Builtin(name = BYTES, minNumOfPositionalArgs = 1, parameterNames = {"$self", "source", "encoding", "errors"}, constructsClass = PythonBuiltinClassType.PBytes) |
| 267 | + @ArgumentClinic(name = "encoding", customConversion = "createExpectStringNodeEncoding") |
| 268 | + @ArgumentClinic(name = "errors", customConversion = "createExpectStringNodeErrors") |
262 | 269 | @GenerateNodeFactory
|
263 |
| - public abstract static class BytesNode extends PythonBuiltinNode { |
264 |
| - @Specialization |
265 |
| - public Object createBytes(VirtualFrame frame, Object cls, Object source, Object encoding, Object errors, |
266 |
| - @Cached ConvertToByteObjectBytesNode toBytesNode) { |
267 |
| - return factory().createBytes(cls, toBytesNode.execute(frame, source, encoding, errors)); |
| 270 | + public abstract static class BytesNode extends PythonQuaternaryClinicBuiltinNode { |
| 271 | + |
| 272 | + @Override |
| 273 | + protected ArgumentClinicProvider getArgumentClinic() { |
| 274 | + return BuiltinConstructorsClinicProviders.BytesNodeClinicProviderGen.INSTANCE; |
| 275 | + } |
| 276 | + |
| 277 | + public static BytesNodes.ExpectStringNode createExpectStringNodeEncoding() { |
| 278 | + return BytesNodesFactory.ExpectStringNodeGen.create(2, "bytes()"); |
| 279 | + } |
| 280 | + |
| 281 | + public static BytesNodes.ExpectStringNode createExpectStringNodeErrors() { |
| 282 | + return BytesNodesFactory.ExpectStringNodeGen.create(3, "bytes()"); |
| 283 | + } |
| 284 | + |
| 285 | + @SuppressWarnings("unused") |
| 286 | + @Specialization(guards = "isNoValue(source)") |
| 287 | + public PBytes byteDone(VirtualFrame frame, Object cls, PNone source, PNone encoding, PNone errors) { |
| 288 | + return factory().createBytes(cls, PythonUtils.EMPTY_BYTE_ARRAY); |
| 289 | + } |
| 290 | + |
| 291 | + @Specialization(guards = "!isNone(source)") |
| 292 | + public PBytes doInit(VirtualFrame frame, Object cls, Object source, Object encoding, Object errors, |
| 293 | + @Cached BytesNodes.BytesInitNode toBytesNode) { |
| 294 | + return factory().createBytes(cls, new ByteSequenceStorage(toBytesNode.execute(frame, source, encoding, errors))); |
| 295 | + } |
| 296 | + |
| 297 | + @Specialization(guards = "isNone(source)") |
| 298 | + public PBytes sourceNone(Object cls, Object source, @SuppressWarnings("unused") Object encoding, @SuppressWarnings("unused") Object errors) { |
| 299 | + throw raise(TypeError, ErrorMessages.CANNOT_CONVERT_P_OBJ_TO_S, source, cls); |
268 | 300 | }
|
269 | 301 | }
|
270 | 302 |
|
271 |
| - // bytearray([source[, encoding[, errors]]]) |
272 |
| - @Builtin(name = BYTEARRAY, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 4, constructsClass = PythonBuiltinClassType.PByteArray) |
| 303 | + @Builtin(name = BYTEARRAY, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PByteArray) |
273 | 304 | @GenerateNodeFactory
|
274 | 305 | @TypeSystemReference(PythonArithmeticTypes.class)
|
275 | 306 | public abstract static class ByteArrayNode extends PythonBuiltinNode {
|
276 | 307 | @Specialization
|
277 |
| - public Object createByteArray(Object cls, @SuppressWarnings("unused") Object source, @SuppressWarnings("unused") Object encoding, @SuppressWarnings("unused") Object errors) { |
| 308 | + public PByteArray setEmpty(Object cls, @SuppressWarnings("unused") Object arg) { |
278 | 309 | // data filled in subsequent __init__ call - see BytesBuiltins.InitNode
|
279 | 310 | return factory().createByteArray(cls, PythonUtils.EMPTY_BYTE_ARRAY);
|
280 | 311 | }
|
|
0 commit comments