Skip to content

Commit 385993c

Browse files
committed
efficient way of creating bytes/bytearray from each other
1 parent 7326ea9 commit 385993c

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import com.oracle.graal.python.builtins.objects.PNotImplemented;
6969
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
7070
import com.oracle.graal.python.builtins.objects.bytes.BytesUtils;
71+
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
7172
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
7273
import com.oracle.graal.python.builtins.objects.bytes.PIBytesLike;
7374
import com.oracle.graal.python.builtins.objects.cell.PCell;
@@ -134,6 +135,7 @@
134135
import com.oracle.graal.python.runtime.exception.PException;
135136
import com.oracle.graal.python.runtime.exception.PythonErrorType;
136137
import com.oracle.graal.python.runtime.sequence.PSequence;
138+
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
137139
import com.oracle.truffle.api.CompilerAsserts;
138140
import com.oracle.truffle.api.CompilerDirectives;
139141
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
@@ -166,6 +168,8 @@ protected abstract static class CreateByteOrByteArrayNode extends PythonBuiltinN
166168
@Child private IsIndexNode isIndexNode;
167169
@Child private CastToIndexNode castToIndexNode;
168170

171+
private final IsBuiltinClassProfile isClassProfile = IsBuiltinClassProfile.create();
172+
169173
@SuppressWarnings("unused")
170174
protected Object create(PythonClass cls, byte[] barr) {
171175
throw new AssertionError("should not reach");
@@ -193,6 +197,24 @@ public Object fromString(PythonClass cls, String source, PNone encoding, PNone e
193197
throw raise(PythonErrorType.TypeError, "string argument without an encoding");
194198
}
195199

200+
protected boolean isSimpleBytes(PBytes iterable) {
201+
return isClassProfile.profileObject(iterable, PythonBuiltinClassType.PBytes) && iterable.getSequenceStorage() instanceof ByteSequenceStorage;
202+
}
203+
204+
@Specialization(guards = {"isSimpleBytes(iterable)", "isNoValue(encoding)", "isNoValue(errors)"})
205+
public Object bytearray(PythonClass cls, PBytes iterable, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors) {
206+
return create(cls, (byte[]) ((ByteSequenceStorage) iterable.getSequenceStorage()).getCopyOfInternalArrayObject());
207+
}
208+
209+
protected boolean isSimpleBytes(PByteArray iterable) {
210+
return isClassProfile.profileObject(iterable, PythonBuiltinClassType.PByteArray) && iterable.getSequenceStorage() instanceof ByteSequenceStorage;
211+
}
212+
213+
@Specialization(guards = {"isSimpleBytes(iterable)", "isNoValue(encoding)", "isNoValue(errors)"})
214+
public Object bytearray(PythonClass cls, PByteArray iterable, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors) {
215+
return create(cls, (byte[]) ((ByteSequenceStorage) iterable.getSequenceStorage()).getCopyOfInternalArrayObject());
216+
}
217+
196218
@Specialization(guards = {"!isInt(iterable)", "!isNoValue(iterable)", "isNoValue(encoding)", "isNoValue(errors)"})
197219
public Object bytearray(PythonClass cls, Object iterable, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors,
198220
@Cached("create()") GetIteratorNode getIteratorNode,

0 commit comments

Comments
 (0)