|
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