Skip to content

Commit 6b1f8a4

Browse files
committed
Push SequenceStorage.getInternalArrayObject down
1 parent 1eee1c3 commit 6b1f8a4

File tree

10 files changed

+52
-95
lines changed

10 files changed

+52
-95
lines changed

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

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@
6464
import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError;
6565
import static com.oracle.graal.python.runtime.exception.PythonErrorType.OSError;
6666
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
67+
import static com.oracle.graal.python.util.PythonUtils.EMPTY_BYTE_ARRAY;
68+
import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY;
6769
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
6870
import static com.oracle.graal.python.util.PythonUtils.tsArray;
6971
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
@@ -81,9 +83,9 @@
8183
import com.oracle.graal.python.builtins.PythonBuiltins;
8284
import com.oracle.graal.python.builtins.objects.PNone;
8385
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
86+
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
8487
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
8588
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes;
86-
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
8789
import com.oracle.graal.python.builtins.objects.function.PArguments;
8890
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
8991
import com.oracle.graal.python.builtins.objects.function.PFunction;
@@ -121,6 +123,8 @@
121123
import com.oracle.graal.python.runtime.exception.PythonErrorType;
122124
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
123125
import com.oracle.graal.python.runtime.sequence.PSequence;
126+
import com.oracle.graal.python.runtime.sequence.storage.BasicSequenceStorage;
127+
import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage;
124128
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
125129
import com.oracle.graal.python.util.PythonUtils;
126130
import com.oracle.truffle.api.CompilerDirectives;
@@ -1142,11 +1146,19 @@ static boolean keyInfo(Object receiver, long member, TruffleString info,
11421146
@TypeSystemReference(PythonArithmeticTypes.class)
11431147
public abstract static class StorageNode extends PythonUnaryBuiltinNode {
11441148
@Specialization
1149+
@TruffleBoundary
11451150
static Object doSequence(PSequence seq,
1146-
@Bind("this") Node inliningTarget,
1147-
@Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode) {
1148-
SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, seq);
1149-
return PythonContext.get(inliningTarget).getEnv().asGuestValue(storage.getInternalArrayObject());
1151+
@Bind("this") Node inliningTarget) {
1152+
SequenceStorage storage = seq.getSequenceStorage();
1153+
Object arrayObject;
1154+
if (storage instanceof EmptySequenceStorage) {
1155+
arrayObject = seq instanceof PBytesLike ? EMPTY_BYTE_ARRAY : EMPTY_OBJECT_ARRAY;
1156+
} else if (storage instanceof BasicSequenceStorage basicStorage) {
1157+
arrayObject = basicStorage.getInternalArrayObject();
1158+
} else {
1159+
throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.NotImplementedError, ErrorMessages.GETTING_POLYGLOT_STORAGE_FOR_NATIVE_STORAGE_NOT_IMPLEMENTED);
1160+
}
1161+
return PythonContext.get(inliningTarget).getEnv().asGuestValue(arrayObject);
11501162
}
11511163

11521164
@Fallback

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PySequenceArrayWrapper.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.StorageToNativeNodeGen;
4949
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
5050
import com.oracle.graal.python.runtime.sequence.PSequence;
51+
import com.oracle.graal.python.runtime.sequence.storage.BasicSequenceStorage;
52+
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
5153
import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage;
5254
import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage;
5355
import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage;
@@ -62,7 +64,6 @@
6264
import com.oracle.truffle.api.dsl.GenerateUncached;
6365
import com.oracle.truffle.api.dsl.Specialization;
6466
import com.oracle.truffle.api.nodes.Node;
65-
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
6667

6768
/**
6869
* Wraps a sequence object (like a list) such that it behaves like a bare C array.
@@ -82,16 +83,16 @@ public static NativeSequenceStorage executeUncached(SequenceStorage object, bool
8283
return ToNativeStorageNodeGen.getUncached().execute(null, object, isBytesLike);
8384
}
8485

85-
@Specialization(guards = {"!isNative(s)", "!isEmptySequenceStorage(s)", "!isMroSequenceStorage(s)"})
86-
static NativeSequenceStorage doManaged(Node inliningTarget, SequenceStorage s, boolean isBytesLike,
87-
@Cached InlinedConditionProfile isObjectArrayProfile,
86+
@Specialization(guards = "!isMroSequenceStorage(s)")
87+
static NativeSequenceStorage doManaged(Node inliningTarget, BasicSequenceStorage s, boolean isBytesLike,
8888
@Shared("storageToNativeNode") @Cached SequenceStorageNodes.StorageToNativeNode storageToNativeNode,
89-
@Cached SequenceStorageNodes.GetInternalArrayNode getInternalArrayNode) {
90-
Object array = getInternalArrayNode.execute(inliningTarget, s);
89+
@Cached SequenceStorageNodes.GetInternalObjectArrayNode getInternalArrayNode) {
90+
Object array;
9191
if (isBytesLike) {
92-
assert array instanceof byte[];
93-
} else if (!isObjectArrayProfile.profile(inliningTarget, array instanceof Object[])) {
94-
array = generalize(s);
92+
ByteSequenceStorage byteStorage = (ByteSequenceStorage) s;
93+
array = byteStorage.getInternalByteArray();
94+
} else {
95+
array = getInternalArrayNode.execute(inliningTarget, s);
9596
}
9697
return storageToNativeNode.execute(inliningTarget, array, s.length());
9798
}
@@ -116,11 +117,6 @@ static NativeSequenceStorage doMroSequenceStorage(Node inliningTarget, MroSequen
116117
}
117118
}
118119

119-
@TruffleBoundary
120-
private static Object generalize(SequenceStorage s) {
121-
return s.getInternalArray();
122-
}
123-
124120
@Specialization
125121
static NativeSequenceStorage doNative(NativeSequenceStorage s, @SuppressWarnings("unused") boolean isBytesLike) {
126122
return s;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java

Lines changed: 15 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1701,9 +1701,8 @@ protected static boolean isSimple(Object bytes) {
17011701
}
17021702

17031703
@Specialization(guards = "isByteSequenceStorage(bytes)")
1704-
static byte[] doBytes(Node inliningTarget, PBytesLike bytes,
1705-
@Cached SequenceStorageNodes.GetInternalArrayNode internalArray) {
1706-
return (byte[]) internalArray.execute(inliningTarget, bytes.getSequenceStorage());
1704+
static byte[] doBytes(PBytesLike bytes) {
1705+
return ((ByteSequenceStorage) bytes.getSequenceStorage()).getInternalByteArray();
17071706
}
17081707

17091708
@Specialization(guards = "!isSimple(bytes)")
@@ -1838,10 +1837,10 @@ static SequenceStorage doRightEmpty(@SuppressWarnings("unused") EmptySequenceSto
18381837
@Specialization(guards = {"dest == left", "left.getClass() == right.getClass()", "cachedClass == left.getClass()"}, limit = "1")
18391838
static SequenceStorage doManagedManagedSameTypeInplace(@SuppressWarnings("unused") BasicSequenceStorage dest, BasicSequenceStorage left, BasicSequenceStorage right,
18401839
@Bind("this") Node inliningTarget,
1841-
@Cached("left.getClass()") Class<? extends SequenceStorage> cachedClass,
1840+
@Cached("left.getClass()") Class<? extends BasicSequenceStorage> cachedClass,
18421841
@Shared @Cached SetLenNode setLenNode) {
1843-
SequenceStorage leftProfiled = cachedClass.cast(left);
1844-
SequenceStorage rightProfiled = cachedClass.cast(right);
1842+
BasicSequenceStorage leftProfiled = cachedClass.cast(left);
1843+
BasicSequenceStorage rightProfiled = cachedClass.cast(right);
18451844
Object arr1 = leftProfiled.getInternalArrayObject();
18461845
int len1 = leftProfiled.length();
18471846
Object arr2 = rightProfiled.getInternalArrayObject();
@@ -1854,11 +1853,11 @@ static SequenceStorage doManagedManagedSameTypeInplace(@SuppressWarnings("unused
18541853
@Specialization(guards = {"dest != left", "dest.getClass() == left.getClass()", "left.getClass() == right.getClass()", "cachedClass == dest.getClass()"}, limit = "1")
18551854
static SequenceStorage doManagedManagedSameType(BasicSequenceStorage dest, BasicSequenceStorage left, BasicSequenceStorage right,
18561855
@Bind("this") Node inliningTarget,
1857-
@Cached("left.getClass()") Class<? extends SequenceStorage> cachedClass,
1856+
@Cached("left.getClass()") Class<? extends BasicSequenceStorage> cachedClass,
18581857
@Shared @Cached SetLenNode setLenNode) {
1859-
SequenceStorage destProfiled = cachedClass.cast(dest);
1860-
SequenceStorage leftProfiled = cachedClass.cast(left);
1861-
SequenceStorage rightProfiled = cachedClass.cast(right);
1858+
BasicSequenceStorage destProfiled = cachedClass.cast(dest);
1859+
BasicSequenceStorage leftProfiled = cachedClass.cast(left);
1860+
BasicSequenceStorage rightProfiled = cachedClass.cast(right);
18621861
Object arr1 = leftProfiled.getInternalArrayObject();
18631862
int len1 = leftProfiled.length();
18641863
Object arr2 = rightProfiled.getInternalArrayObject();
@@ -1871,10 +1870,10 @@ static SequenceStorage doManagedManagedSameType(BasicSequenceStorage dest, Basic
18711870
@Specialization(guards = {"dest.getClass() == right.getClass()", "cachedClass == dest.getClass()"}, limit = "1")
18721871
static SequenceStorage doEmptyManagedSameType(BasicSequenceStorage dest, @SuppressWarnings("unused") EmptySequenceStorage left, BasicSequenceStorage right,
18731872
@Bind("this") Node inliningTarget,
1874-
@Cached("dest.getClass()") Class<? extends SequenceStorage> cachedClass,
1873+
@Cached("dest.getClass()") Class<? extends BasicSequenceStorage> cachedClass,
18751874
@Shared @Cached SetLenNode setLenNode) {
1876-
SequenceStorage destProfiled = cachedClass.cast(dest);
1877-
SequenceStorage rightProfiled = cachedClass.cast(right);
1875+
BasicSequenceStorage destProfiled = cachedClass.cast(dest);
1876+
BasicSequenceStorage rightProfiled = cachedClass.cast(right);
18781877
Object arr2 = rightProfiled.getInternalArrayObject();
18791878
int len2 = rightProfiled.length();
18801879
PythonUtils.arraycopy(arr2, 0, destProfiled.getInternalArrayObject(), 0, len2);
@@ -1885,10 +1884,10 @@ static SequenceStorage doEmptyManagedSameType(BasicSequenceStorage dest, @Suppre
18851884
@Specialization(guards = {"dest.getClass() == left.getClass()", "cachedClass == dest.getClass()"}, limit = "1")
18861885
static SequenceStorage doManagedEmptySameType(BasicSequenceStorage dest, BasicSequenceStorage left, @SuppressWarnings("unused") EmptySequenceStorage right,
18871886
@Bind("this") Node inliningTarget,
1888-
@Cached("left.getClass()") Class<? extends SequenceStorage> cachedClass,
1887+
@Cached("left.getClass()") Class<? extends BasicSequenceStorage> cachedClass,
18891888
@Shared @Cached SetLenNode setLenNode) {
1890-
SequenceStorage destProfiled = cachedClass.cast(dest);
1891-
SequenceStorage leftProfiled = cachedClass.cast(left);
1889+
BasicSequenceStorage destProfiled = cachedClass.cast(dest);
1890+
BasicSequenceStorage leftProfiled = cachedClass.cast(left);
18921891
Object arr1 = leftProfiled.getInternalArrayObject();
18931892
int len1 = leftProfiled.length();
18941893
PythonUtils.arraycopy(arr1, 0, destProfiled.getInternalArrayObject(), 0, len1);
@@ -2842,27 +2841,6 @@ static NativeSequenceStorage doNativeByte(Node inliningTarget, NativeSequenceSto
28422841
}
28432842
}
28442843

2845-
@GenerateUncached
2846-
@GenerateInline
2847-
@GenerateCached(false)
2848-
@ImportStatic(SequenceStorageBaseNode.class)
2849-
public abstract static class GetInternalArrayNode extends Node {
2850-
2851-
public abstract Object execute(Node inliningTarget, SequenceStorage s);
2852-
2853-
@Specialization(limit = "MAX_SEQUENCE_STORAGES", guards = "s.getClass() == cachedClass")
2854-
static Object doSpecial(SequenceStorage s,
2855-
@Cached("s.getClass()") Class<? extends SequenceStorage> cachedClass) {
2856-
return cachedClass.cast(s).getInternalArrayObject();
2857-
}
2858-
2859-
@Specialization(replaces = "doSpecial")
2860-
@TruffleBoundary
2861-
static Object doGeneric(SequenceStorage s) {
2862-
return s.getInternalArrayObject();
2863-
}
2864-
}
2865-
28662844
@GenerateUncached
28672845
@GenerateInline
28682846
@GenerateCached(false)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/PList.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ public final void setSequenceStorage(SequenceStorage newStorage) {
8080
}
8181

8282
@Override
83-
public final String toString() {
83+
public String toString() {
8484
CompilerAsserts.neverPartOfCompilation();
85-
return store.toString();
85+
return String.format("list(%s)", store);
8686
}
8787

8888
@Ignore

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/PTuple.java

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -61,27 +61,7 @@ public PTuple(Object cls, Shape instanceShape, SequenceStorage store) {
6161
@Override
6262
public String toString() {
6363
CompilerAsserts.neverPartOfCompilation();
64-
if (store instanceof ObjectSequenceStorage) {
65-
StringBuilder buf = new StringBuilder("(");
66-
Object[] array = store.getInternalArray();
67-
for (int i = 0; i < array.length - 1; i++) {
68-
buf.append(array[i]);
69-
buf.append(", ");
70-
}
71-
72-
if (array.length > 0) {
73-
buf.append(array[array.length - 1]);
74-
}
75-
76-
if (array.length == 1) {
77-
buf.append(",");
78-
}
79-
80-
buf.append(")");
81-
return buf.toString();
82-
} else {
83-
return String.format("tuple(%s)", store);
84-
}
64+
return String.format("tuple(%s)", store);
8565
}
8666

8767
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -970,6 +970,7 @@ public abstract class ErrorMessages {
970970
public static final TruffleString COPYREG_SLOTNAMES_DIDN_T_RETURN_A_LIST_OR_NONE = tsLiteral("copyreg._slotnames didn't return a list or None");
971971
public static final TruffleString CASTING_A_NATIVE_INT_OBJECT_IS_NOT_IMPLEMENTED_YET = tsLiteral("casting a native int object is not implemented yet");
972972
public static final TruffleString PUTTING_NON_MODULE_OBJECTS_IN_SYS_MODULES_IS_NOT_SUPPORTED = tsLiteral("Putting non-module objects in sys.modules is not supported");
973+
public static final TruffleString GETTING_POLYGLOT_STORAGE_FOR_NATIVE_STORAGE_NOT_IMPLEMENTED = tsLiteral("Getting polyglot storage for native storage not implemented");
973974

974975
// SSL errors
975976
public static final TruffleString SSL_SESSION_CLOSED = tsLiteral("SSL/TLS session closed cleanly.");

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/BasicSequenceStorage.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ public abstract class BasicSequenceStorage extends SequenceStorage {
4040

4141
public abstract SequenceStorage copy();
4242

43+
/**
44+
* Get internal array object without copying. Note: The length must be taken from the sequence
45+
* storage object.
46+
*/
47+
public abstract Object getInternalArrayObject();
48+
4349
public abstract Object getCopyOfInternalArrayObject();
4450

4551
public abstract void setInternalArrayObject(Object arrayObject);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/EmptySequenceStorage.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,6 @@ public boolean equals(SequenceStorage other) {
9393
return other == EmptySequenceStorage.INSTANCE;
9494
}
9595

96-
@Override
97-
public Object getInternalArrayObject() {
98-
return null;
99-
}
100-
10196
@Override
10297
public ListStorageType getElementType() {
10398
return ListStorageType.Empty;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/NativeSequenceStorage.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,6 @@ public final Object getIndicativeValue() {
127127
return null;
128128
}
129129

130-
@Override
131-
public final Object getInternalArrayObject() {
132-
return ptr;
133-
}
134-
135130
@Override
136131
public String toString() {
137132
return getClass().getSimpleName() + "(ptr=" + CApiContext.asHex(ptr) + ", length=" + length + ", capacity=" + capacity + ", ownsMemory=" + hasReference() + ")";

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/SequenceStorage.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,6 @@ public final int getCapacity() {
7777
return capacity;
7878
}
7979

80-
/**
81-
* Get internal array object without copying. Note: The length must be taken from the sequence
82-
* storage object.
83-
*/
84-
public abstract Object getInternalArrayObject();
85-
8680
public abstract ListStorageType getElementType();
8781

8882
public abstract Object[] getInternalArray();

0 commit comments

Comments
 (0)