|
1 | 1 | /*
|
2 |
| - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. |
| 2 | + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. |
3 | 3 | * Copyright (c) 2014, Regents of the University of California
|
4 | 4 | *
|
5 | 5 | * All rights reserved.
|
|
61 | 61 | import com.oracle.graal.python.builtins.objects.dict.PDict;
|
62 | 62 | import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator;
|
63 | 63 | import com.oracle.graal.python.builtins.objects.list.PList;
|
| 64 | +import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; |
64 | 65 | import com.oracle.graal.python.nodes.PNodeWithContext;
|
| 66 | +import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; |
65 | 67 | import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
|
66 | 68 | import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
|
67 | 69 | import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
|
68 | 70 | import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
|
69 | 71 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
|
70 | 72 | import com.oracle.graal.python.runtime.exception.PythonErrorType;
|
| 73 | +import static com.oracle.graal.python.runtime.exception.PythonErrorType.SystemError; |
71 | 74 | import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
|
72 | 75 | import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
|
73 | 76 | import com.oracle.truffle.api.CompilerDirectives;
|
|
77 | 80 | import com.oracle.truffle.api.dsl.GenerateNodeFactory;
|
78 | 81 | import com.oracle.truffle.api.dsl.NodeFactory;
|
79 | 82 | import com.oracle.truffle.api.dsl.Specialization;
|
| 83 | +import com.oracle.truffle.api.profiles.ConditionProfile; |
80 | 84 |
|
81 | 85 | @CoreFunctions(extendClasses = PythonBuiltinClassType.PBytes)
|
82 | 86 | public class BytesBuiltins extends PythonBuiltins {
|
@@ -260,6 +264,20 @@ public Object add(PBytes left, PIBytesLike right,
|
260 | 264 | return factory().createBytes(res);
|
261 | 265 | }
|
262 | 266 |
|
| 267 | + @Specialization |
| 268 | + public Object add(PBytes self, PMemoryView other, |
| 269 | + @Cached("create(TOBYTES)") LookupAndCallUnaryNode toBytesNode, |
| 270 | + @Cached("createBinaryProfile()") ConditionProfile isBytesProfile, |
| 271 | + @Cached("create()") SequenceStorageNodes.ConcatNode concatNode) { |
| 272 | + |
| 273 | + Object bytesObj = toBytesNode.executeObject(other); |
| 274 | + if (isBytesProfile.profile(bytesObj instanceof PBytes)) { |
| 275 | + SequenceStorage res = concatNode.execute(self.getSequenceStorage(), ((PBytes) bytesObj).getSequenceStorage()); |
| 276 | + return factory().createByteArray(res); |
| 277 | + } |
| 278 | + throw raise(SystemError, "could not get bytes of memoryview"); |
| 279 | + } |
| 280 | + |
263 | 281 | @SuppressWarnings("unused")
|
264 | 282 | @Fallback
|
265 | 283 | public Object add(Object self, Object other) {
|
|
0 commit comments