|
77 | 77 | import com.oracle.graal.python.builtins.Python3Core;
|
78 | 78 | import com.oracle.graal.python.builtins.PythonBuiltinClassType;
|
79 | 79 | import com.oracle.graal.python.builtins.PythonBuiltins;
|
| 80 | +import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IsInstanceNode; |
| 81 | +import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins; |
80 | 82 | import com.oracle.graal.python.builtins.modules.SysModuleBuiltins;
|
81 | 83 | import com.oracle.graal.python.builtins.objects.PNone;
|
82 | 84 | import com.oracle.graal.python.builtins.objects.PNotImplemented;
|
83 | 85 | import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
|
84 | 86 | import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
|
| 87 | +import com.oracle.graal.python.builtins.objects.bytes.BytesBuiltinsFactory.LStripNodeFactory; |
| 88 | +import com.oracle.graal.python.builtins.objects.bytes.BytesBuiltinsFactory.RStripNodeFactory; |
85 | 89 | import com.oracle.graal.python.builtins.objects.common.IndexNodes;
|
86 | 90 | import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
|
87 | 91 | import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
|
|
99 | 103 | import com.oracle.graal.python.lib.PyNumberAsSizeNode;
|
100 | 104 | import com.oracle.graal.python.lib.PyNumberIndexNode;
|
101 | 105 | import com.oracle.graal.python.lib.PyObjectGetItem;
|
| 106 | +import static com.oracle.graal.python.nodes.BuiltinNames.DECODE; |
102 | 107 | import com.oracle.graal.python.nodes.ErrorMessages;
|
| 108 | +import static com.oracle.graal.python.nodes.ErrorMessages.DECODER_RETURNED_P_INSTEAD_OF_BYTES; |
103 | 109 | import com.oracle.graal.python.nodes.PRaiseNode;
|
104 | 110 | import com.oracle.graal.python.nodes.SpecialAttributeNames;
|
105 | 111 | import com.oracle.graal.python.nodes.SpecialMethodNames;
|
@@ -264,6 +270,48 @@ public static Object repr(PBytes self,
|
264 | 270 | }
|
265 | 271 | }
|
266 | 272 |
|
| 273 | + @Builtin(name = DECODE, minNumOfPositionalArgs = 1, parameterNames = {"$self", "encoding", "errors"}, doc = "Decode the bytes using the codec registered for encoding.\n\n" + |
| 274 | + "encoding\n" + |
| 275 | + " The encoding with which to decode the bytes.\n" + |
| 276 | + "errors\n" + |
| 277 | + " The error handling scheme to use for the handling of decoding errors.\n" + |
| 278 | + " The default is 'strict' meaning that decoding errors raise a\n" + |
| 279 | + " UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n" + |
| 280 | + " as well as any other name registered with codecs.register_error that\n" + |
| 281 | + " can handle UnicodeDecodeErrors.") |
| 282 | + @ArgumentClinic(name = "encoding", conversion = ArgumentClinic.ClinicConversion.String, defaultValue = "\"utf-8\"") |
| 283 | + @ArgumentClinic(name = "errors", conversion = ArgumentClinic.ClinicConversion.String, defaultValue = "\"strict\"") |
| 284 | + @GenerateNodeFactory |
| 285 | + abstract static class DecodeNode extends PythonTernaryClinicBuiltinNode { |
| 286 | + |
| 287 | + @Override |
| 288 | + protected ArgumentClinicProvider getArgumentClinic() { |
| 289 | + return BytesBuiltinsClinicProviders.DecodeNodeClinicProviderGen.INSTANCE; |
| 290 | + } |
| 291 | + |
| 292 | + @Specialization |
| 293 | + public Object decode(VirtualFrame frame, PBytesLike self, String encoding, String errors, |
| 294 | + @Cached CodecsModuleBuiltins.DecodeNode decodeNode, |
| 295 | + @Cached IsInstanceNode isInstanceNode) { |
| 296 | + Object result = decodeNode.executeWithStrings(frame, self, encoding, errors); |
| 297 | + if (!isInstanceNode.executeWith(frame, result, PythonBuiltinClassType.PString)) { |
| 298 | + throw raise(TypeError, DECODER_RETURNED_P_INSTEAD_OF_BYTES, encoding, result); |
| 299 | + } |
| 300 | + return result; |
| 301 | + } |
| 302 | + } |
| 303 | + |
| 304 | + @Builtin(name = "strip", minNumOfPositionalArgs = 1, parameterNames = {"$self", "what"}) |
| 305 | + @GenerateNodeFactory |
| 306 | + abstract static class StripNode extends PythonBinaryBuiltinNode { |
| 307 | + @Specialization |
| 308 | + public Object strip(VirtualFrame frame, PBytesLike self, Object what, |
| 309 | + @Cached LStripNode lstripNode, |
| 310 | + @Cached RStripNode rstripNode) { |
| 311 | + return rstripNode.execute(frame, lstripNode.execute(frame, self, what), what); |
| 312 | + } |
| 313 | + } |
| 314 | + |
267 | 315 | // bytes.translate(table, delete=b'')
|
268 | 316 | @Builtin(name = "translate", minNumOfPositionalArgs = 2, parameterNames = {"self", "table", "delete"})
|
269 | 317 | @GenerateNodeFactory
|
@@ -2235,6 +2283,10 @@ protected int findIndex(byte[] bs, byte[] stripBs, int stripBsLen) {
|
2235 | 2283 | @GenerateNodeFactory
|
2236 | 2284 | abstract static class LStripNode extends AStripNode {
|
2237 | 2285 |
|
| 2286 | + static LStripNode create() { |
| 2287 | + return LStripNodeFactory.create(); |
| 2288 | + } |
| 2289 | + |
2238 | 2290 | @Override
|
2239 | 2291 | protected byte[] getResultBytes(byte[] bs, int i) {
|
2240 | 2292 | byte[] out;
|
@@ -2268,6 +2320,10 @@ int start(byte[] bs) {
|
2268 | 2320 | @GenerateNodeFactory
|
2269 | 2321 | abstract static class RStripNode extends AStripNode {
|
2270 | 2322 |
|
| 2323 | + static RStripNode create() { |
| 2324 | + return RStripNodeFactory.create(); |
| 2325 | + } |
| 2326 | + |
2271 | 2327 | @Override
|
2272 | 2328 | protected byte[] getResultBytes(byte[] bs, int i) {
|
2273 | 2329 | byte[] out;
|
|
0 commit comments