From 31bf1957835100fb9b75243614c21ea7375ea9aa Mon Sep 17 00:00:00 2001 From: Michael Simacek Date: Fri, 13 Feb 2026 13:08:20 +0100 Subject: [PATCH] Remove infrequent fast paths from list creation --- .../src/tests/test_list.py | 33 ++- .../objects/common/SequenceStorageNodes.java | 280 +----------------- .../builtins/objects/list/ListBuiltins.java | 40 +-- .../nodes/bytecode/SequenceFromStackNode.java | 19 +- .../storage/SequenceStorageFactory.java | 4 +- 5 files changed, 50 insertions(+), 326 deletions(-) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_list.py b/graalpython/com.oracle.graal.python.test/src/tests/test_list.py index 2ae9a7522d..f81a919fbb 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_list.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_list.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2025, Oracle and/or its affiliates. +# Copyright (c) 2018, 2026, Oracle and/or its affiliates. # Copyright (C) 1996-2017 Python Software Foundation # # Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -992,5 +992,36 @@ def __eq__(self,other) : assert l2 == [0] +def test_list_create(): + def gen(items): + yield from items + + o = object() + + ast_no = 0 + def test_list_ctor(t1, t2): + nonlocal ast_no + # Run several times to transition to cached + # Use eval with a number to force a new AST + # Test both builtin iterator and generic paths + ast_no += 1 + for i in range(13): + t = t1 if i < 11 else t2 + res = eval(f"list(it{ast_no})", {f'it{ast_no}': t}) + assert tuple(res) == t + ast_no += 1 + for i in range(13): + t = t1 if i < 11 else t2 + res = eval(f"list(it{ast_no})", {f'it{ast_no}': gen(t)}) + assert tuple(res) == t + + test_list_ctor((1, 2, 3), (1, o, 3)) + test_list_ctor((1, 2, 3), (1, 2 ** 32, 3)) + test_list_ctor((1, 2, 3), (1, 2 ** 64, 3)) + test_list_ctor((1, 2 ** 32, 3), (1, 2 ** 64, 3)) + test_list_ctor((1.0, 2.0, 3.0), (2.0, o, 3.0)) + test_list_ctor((True, False, True), (True, o, True)) + + if __name__ == '__main__': unittest.main() diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java index 1ae8b6a088..0bce7392c5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. + * Copyright (c) 2018, 2026, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -74,8 +74,6 @@ import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.ToByteArrayNodeGen; import com.oracle.graal.python.builtins.objects.floats.PFloat; import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.iterator.IteratorBuiltins.NextHelperNode; -import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes.BuiltinIteratorLengthHint; import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes.GetInternalIteratorSequenceStorage; import com.oracle.graal.python.builtins.objects.iterator.PBuiltinIterator; import com.oracle.graal.python.builtins.objects.list.PList; @@ -4184,31 +4182,6 @@ protected SequenceStorage createStorage(VirtualFrame frame, Object iterator, int } return new BoolSequenceStorage(elements, i); } - case Byte: { - byte[] elements = new byte[size]; - array = elements; - while (true) { - Object next; - try { - next = nextNode.execute(frame, inliningTarget, iterator); - } catch (IteratorExhausted e) { - LoopNode.reportLoopCount(this, i); - break; - } - int value = PGuards.expectInteger(next); - byte bvalue; - try { - bvalue = PInt.byteValueExact(value); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = bvalue; - } catch (OverflowException e) { - throw new UnexpectedResultException(value); - } - } - return new ByteSequenceStorage(elements, i); - } case Int: { int[] elements = new int[size]; array = elements; @@ -4336,190 +4309,6 @@ private SequenceStorage genericFallback(VirtualFrame frame, Object iterator, Obj } } - /** - * This version is specific to builtin iterators and looks for STOP_MARKER instead of - * StopIteration. - */ - protected static SequenceStorage createStorageFromBuiltin(VirtualFrame frame, PBuiltinIterator iterator, int len, StorageType type, NextHelperNode nextNode, - IsBuiltinObjectProfile errorProfile, Node inliningTarget, InlinedCountingConditionProfile growArrayProfile, InlinedLoopConditionProfile loopProfile) { - final int size = len > 0 ? len : START_SIZE; - int i = 0; - boolean exhausted = false; - if (type == Uninitialized || type == Empty) { - Object[] elements = new Object[size]; - while (loopProfile.profile(inliningTarget, !exhausted)) { - try { - Object value = nextNode.execute(frame, inliningTarget, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = value; - } catch (IteratorExhausted e) { - exhausted = true; - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - exhausted = true; - } - } - return SequenceStorageFactory.createStorage(PythonUtils.arrayCopyOf(elements, i)); - } else { - Object array = null; - try { - switch (type) { - case Boolean: { - boolean[] elements = new boolean[size]; - array = elements; - while (loopProfile.profile(inliningTarget, !exhausted)) { - try { - Object value = nextNode.execute(frame, inliningTarget, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - array = elements; - } - elements[i] = PGuards.expectBoolean(value); - } catch (IteratorExhausted e) { - exhausted = true; - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - exhausted = true; - } - } - return new BoolSequenceStorage(elements, i); - } - case Byte: { - byte[] elements = new byte[size]; - array = elements; - while (loopProfile.profile(inliningTarget, !exhausted)) { - try { - Object value = nextNode.execute(frame, inliningTarget, iterator); - byte bvalue; - try { - bvalue = PInt.byteValueExact(PGuards.expectInteger(value)); - } catch (OverflowException e) { - throw new UnexpectedResultException(value); - } - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = bvalue; - } catch (IteratorExhausted e) { - exhausted = true; - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - exhausted = true; - } - } - return new ByteSequenceStorage(elements, i); - } - case Int: { - int[] elements = new int[size]; - array = elements; - while (loopProfile.profile(inliningTarget, !exhausted)) { - try { - Object value = nextNode.execute(frame, inliningTarget, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = PGuards.expectInteger(value); - } catch (IteratorExhausted e) { - exhausted = true; - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - exhausted = true; - } - } - return new IntSequenceStorage(elements, i); - } - case Long: { - long[] elements = new long[size]; - array = elements; - while (loopProfile.profile(inliningTarget, !exhausted)) { - try { - Object value = nextNode.execute(frame, inliningTarget, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = PGuards.expectLong(value); - } catch (IteratorExhausted e) { - exhausted = true; - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - exhausted = true; - } - } - return new LongSequenceStorage(elements, i); - } - case Double: { - double[] elements = new double[size]; - array = elements; - while (loopProfile.profile(inliningTarget, !exhausted)) { - try { - Object value = nextNode.execute(frame, inliningTarget, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = PGuards.expectDouble(value); - } catch (IteratorExhausted e) { - exhausted = true; - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - exhausted = true; - } - } - return new DoubleSequenceStorage(elements, i); - } - case Generic: { - Object[] elements = new Object[size]; - while (loopProfile.profile(inliningTarget, !exhausted)) { - try { - Object value = nextNode.execute(frame, inliningTarget, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = value; - } catch (IteratorExhausted e) { - exhausted = true; - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - exhausted = true; - } - } - return new ObjectSequenceStorage(elements, i); - } - default: - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new RuntimeException("unexpected state"); - } - } catch (UnexpectedResultException e) { - return genericFallback(frame, iterator, array, i - 1, e.getResult(), nextNode, inliningTarget, errorProfile); - } - } - } - - private static SequenceStorage genericFallback(VirtualFrame frame, PBuiltinIterator iterator, Object array, int count, Object result, NextHelperNode nextNode, Node inliningTarget, - IsBuiltinObjectProfile errorProfile) { - Object[] elements = new Object[Array.getLength(array) * 2]; - int i = 0; - for (; i < count; i++) { - elements[i] = Array.get(array, i); - } - elements[i++] = result; - while (true) { - try { - Object value = nextNode.execute(frame, inliningTarget, iterator); - if (i >= elements.length) { - elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = value; - } catch (IteratorExhausted e) { - break; - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - } - } - return new ObjectSequenceStorage(elements, i); - } - @SuppressWarnings("truffle-static-method") public abstract static class CreateStorageFromIteratorNodeCached extends CreateStorageFromIteratorNode { @@ -4528,16 +4317,16 @@ public abstract static class CreateStorageFromIteratorNodeCached extends CreateS private static final int MAX_PREALLOCATE_SIZE = 32; @CompilationFinal int startSizeProfiled = START_SIZE; - public boolean isBuiltinIterator(GetClassNode getClass, Node inliningTarget, Object iterator) { + boolean isBuiltinIterator(GetClassNode getClass, Node inliningTarget, Object iterator) { return iterator instanceof PBuiltinIterator && getClass.execute(inliningTarget, iterator) == PythonBuiltinClassType.PIterator; } - public static SequenceStorage getSequenceStorage(Node inliningTarget, GetInternalIteratorSequenceStorage node, PBuiltinIterator iterator) { + static SequenceStorage getSequenceStorage(Node inliningTarget, GetInternalIteratorSequenceStorage node, PBuiltinIterator iterator) { return iterator.index != 0 || iterator.isExhausted() ? null : node.execute(inliningTarget, iterator); } - @Specialization(guards = {"isBuiltinIterator(getClassNode, inliningTarget, it)", "storage != null"}, limit = "3") - public static SequenceStorage createBuiltinFastPath(PBuiltinIterator it, @SuppressWarnings("unused") int len, + @Specialization(guards = {"isBuiltinIterator(getClassNode, inliningTarget, it)", "storage != null"}, limit = "1") + static SequenceStorage createBuiltinFastPath(PBuiltinIterator it, @SuppressWarnings("unused") int len, @Bind Node inliningTarget, @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Cached GetInternalIteratorSequenceStorage getIterSeqStorageNode, @@ -4547,57 +4336,16 @@ public static SequenceStorage createBuiltinFastPath(PBuiltinIterator it, @Suppre return copyNode.execute(inliningTarget, storage); } - @Specialization(replaces = "createBuiltinFastPath", guards = {"isBuiltinIterator(getClassNode, inliningTarget, iterator)", "len < 0"}, limit = "3") - public SequenceStorage createBuiltinUnknownLen(VirtualFrame frame, PBuiltinIterator iterator, @SuppressWarnings("unused") int len, - @Bind Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, - @Cached BuiltinIteratorLengthHint lengthHint, - @Exclusive @Cached InlinedLoopConditionProfile loopProfile, - @Exclusive @Cached IsBuiltinObjectProfile errorProfile, - @Exclusive @Cached InlinedCountingConditionProfile arrayGrowProfile, - @Exclusive @Cached GetElementType getElementType, - @Exclusive @Cached NextHelperNode nextNode) { - int expectedLen = lengthHint.execute(inliningTarget, iterator); - if (expectedLen < 0) { - expectedLen = startSizeProfiled; - } - SequenceStorage s = createStorageFromBuiltin(frame, iterator, expectedLen, expectedElementType, nextNode, errorProfile, inliningTarget, arrayGrowProfile, loopProfile); - return profileResult(getElementType, inliningTarget, s, true); - } - - @Specialization(replaces = "createBuiltinFastPath", guards = {"isBuiltinIterator(getClassNode, inliningTarget, iterator)", "len >= 0"}, limit = "3") - public SequenceStorage createBuiltinKnownLen(VirtualFrame frame, PBuiltinIterator iterator, int len, - @Bind Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, - @Exclusive @Cached InlinedLoopConditionProfile loopProfile, - @Exclusive @Cached IsBuiltinObjectProfile errorProfile, - @Exclusive @Cached InlinedCountingConditionProfile arrayGrowProfile, - @Exclusive @Cached GetElementType getElementType, - @Exclusive @Cached NextHelperNode nextNode) { - SequenceStorage s = createStorageFromBuiltin(frame, iterator, len, expectedElementType, nextNode, errorProfile, inliningTarget, arrayGrowProfile, loopProfile); - return profileResult(getElementType, inliningTarget, s, false); - } - - @Specialization(guards = {"!isBuiltinIterator(getClassNode, inliningTarget, iterator)", "len < 0"}) - public SequenceStorage createGenericUnknownLen(VirtualFrame frame, Object iterator, @SuppressWarnings("unused") int len, - @Bind Node inliningTarget, - @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, - @Shared("arrayGrowProfile") @Cached InlinedCountingConditionProfile arrayGrowProfile, - @Shared @Cached GetElementType getElementType, - @Shared @Cached PyIterNextNode nextNode) { - SequenceStorage s = createStorage(frame, iterator, startSizeProfiled, expectedElementType, nextNode, inliningTarget, arrayGrowProfile); - return profileResult(getElementType, inliningTarget, s, true); - } - - @Specialization(guards = {"!isBuiltinIterator(getClassNode, inliningTarget, iterator)", "len >= 0"}) - public SequenceStorage createGenericKnownLen(VirtualFrame frame, Object iterator, int len, + @Specialization + SequenceStorage createGeneric(VirtualFrame frame, Object iterator, int len, @Bind Node inliningTarget, - @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, - @Shared("arrayGrowProfile") @Cached InlinedCountingConditionProfile arrayGrowProfile, - @Shared @Cached GetElementType getElementType, - @Shared @Cached PyIterNextNode nextNode) { - SequenceStorage s = createStorage(frame, iterator, len, expectedElementType, nextNode, inliningTarget, arrayGrowProfile); - return profileResult(getElementType, inliningTarget, s, false); + @Cached InlinedConditionProfile haveLenProfile, + @Cached InlinedCountingConditionProfile arrayGrowProfile, + @Cached GetElementType getElementType, + @Cached PyIterNextNode nextNode) { + boolean haveLen = haveLenProfile.profile(inliningTarget, len >= 0); + SequenceStorage s = createStorage(frame, iterator, haveLen ? len : startSizeProfiled, expectedElementType, nextNode, inliningTarget, arrayGrowProfile); + return profileResult(getElementType, inliningTarget, s, !haveLen); } private SequenceStorage profileResult(GetElementType getElementType, Node inliningTarget, SequenceStorage storage, boolean profileLength) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java index f8def72a7c..a8875923f5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2025, Oracle and/or its affiliates. + * Copyright (c) 2017, 2026, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -39,7 +39,6 @@ import static com.oracle.graal.python.runtime.exception.PythonErrorType.MemoryError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.List; @@ -70,7 +69,6 @@ import com.oracle.graal.python.builtins.objects.iterator.PLongSequenceIterator; import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator; import com.oracle.graal.python.builtins.objects.range.PIntRange; -import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; @@ -92,7 +90,6 @@ import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.builtins.ListNodes; -import com.oracle.graal.python.nodes.builtins.ListNodes.AppendNode; import com.oracle.graal.python.nodes.builtins.ListNodes.ClearListStorageNode; import com.oracle.graal.python.nodes.builtins.ListNodes.GetClassForNewListNode; import com.oracle.graal.python.nodes.builtins.ListNodes.GetListStorageNode; @@ -105,7 +102,6 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.graal.python.runtime.object.PFactory; @@ -137,7 +133,6 @@ import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleStringBuilder; import com.oracle.truffle.api.strings.TruffleStringBuilderUTF32; -import com.oracle.truffle.api.strings.TruffleStringIterator; /** * NOTE: self can either be a PList or a foreign list (hasArrayElements()). @@ -242,37 +237,6 @@ public TruffleString repr(VirtualFrame frame, Object self, @GenerateNodeFactory public abstract static class ListInitNode extends PythonBinaryBuiltinNode { - @Specialization - static PNone initTruffleString(PList list, TruffleString value, - @Bind Node inliningTarget, - @Shared @Cached ClearListStorageNode clearStorageNode, - @Shared("cpIt") @Cached TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, - @Shared("cpItNext") @Cached TruffleStringIterator.NextNode nextNode, - @Shared("fromCp") @Cached TruffleString.FromCodePointNode fromCodePointNode, - @Shared("appendNode") @Cached AppendNode appendNode) { - clearStorageNode.execute(inliningTarget, list); - TruffleStringIterator iterator = createCodePointIteratorNode.execute(value, TS_ENCODING); - while (iterator.hasNext()) { - // TODO: GR-37219: use SubstringNode with lazy=true? - int cp = nextNode.execute(iterator, TS_ENCODING); - appendNode.execute(list, fromCodePointNode.execute(cp, TS_ENCODING, true)); - } - return PNone.NONE; - } - - // @Exclusive to address warning - @Specialization - static PNone initPString(PList list, PString value, - @Bind Node inliningTarget, - @Cached CastToTruffleStringNode castStr, - @Exclusive @Cached ClearListStorageNode clearStorageNode, - @Shared("cpIt") @Cached TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, - @Shared("cpItNext") @Cached TruffleStringIterator.NextNode nextNode, - @Shared("fromCp") @Cached TruffleString.FromCodePointNode fromCodePointNode, - @Shared("appendNode") @Cached AppendNode appendNode) { - return initTruffleString(list, castStr.execute(inliningTarget, value), inliningTarget, clearStorageNode, createCodePointIteratorNode, nextNode, fromCodePointNode, appendNode); - } - @Specialization(guards = "isNoValue(none)") static PNone init(Object list, PNone none, @Bind Node inliningTarget, @@ -299,7 +263,7 @@ static PNone listRange(PList list, PIntRange range, return PNone.NONE; } - @Specialization(guards = {"!isNoValue(iterable)", "!isString(iterable)", "!isPIntRange(iterable)"}) + @Specialization(guards = {"!isNoValue(iterable)", "!isPIntRange(iterable)"}) static PNone listIterable(VirtualFrame frame, PList list, Object iterable, @Bind Node inliningTarget, // exclusive for truffle-interpreted-performance diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SequenceFromStackNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SequenceFromStackNode.java index 46e2687944..5da2c6e35f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SequenceFromStackNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SequenceFromStackNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,7 +49,6 @@ import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.sequence.storage.ArrayBasedSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.BoolSequenceStorage; -import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.DoubleSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.IntSequenceStorage; @@ -120,22 +119,6 @@ protected SequenceStorage createSequenceStorageForDirect(VirtualFrame frame, int storage = new BoolSequenceStorage(elements, length); break; } - case Byte: { - byte[] elements = new byte[getCapacityEstimate()]; - array = elements; - for (int i = start; i < stop; i++, j++) { - int element = castInt(frame.getObject(i)); - if (element <= Byte.MAX_VALUE && element >= Byte.MIN_VALUE) { - elements[j] = (byte) element; - frame.setObject(i, null); - } else { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new UnexpectedResultException(element); - } - } - storage = new ByteSequenceStorage(elements, length); - break; - } case Int: { int[] elements = new int[getCapacityEstimate()]; array = elements; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/SequenceStorageFactory.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/SequenceStorageFactory.java index 9f6c79e5ea..00ae70afde 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/SequenceStorageFactory.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/SequenceStorageFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2026, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -50,8 +50,6 @@ public static SequenceStorage createStorage(Object[] values) { return new LongSequenceStorage(specializeToLong(values)); } else if (canSpecializeToBool(values)) { return new BoolSequenceStorage(specializeToBool(values)); - } else if (canSpecializeToByte(values)) { - return new ByteSequenceStorage(specializeToByte(values)); } else { return new ObjectSequenceStorage(values); }