Skip to content

Commit 32b0bdb

Browse files
committed
Push SequenceStorage.getInternalArray down
1 parent 8168fe5 commit 32b0bdb

File tree

10 files changed

+47
-78
lines changed

10 files changed

+47
-78
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@
152152
import com.oracle.graal.python.runtime.PythonContext;
153153
import com.oracle.graal.python.runtime.exception.PException;
154154
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
155+
import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage;
155156
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
156157
import com.oracle.graal.python.util.CharsetMapping;
157158
import com.oracle.graal.python.util.CharsetMapping.NormalizeEncodingNameNode;
@@ -1082,7 +1083,9 @@ abstract static class ForgetCodecNode extends PythonUnaryBuiltinNode {
10821083
@Specialization
10831084
Object forget(VirtualFrame frame, PBytesLike encoding,
10841085
@Cached AsciiDecodeNode asciiDecodeNode) {
1085-
forget((TruffleString) ((PTuple) asciiDecodeNode.execute(frame, encoding, PNone.NO_VALUE)).getSequenceStorage().getInternalArray()[0]);
1086+
PTuple decodeResult = (PTuple) asciiDecodeNode.execute(frame, encoding, PNone.NO_VALUE);
1087+
ObjectSequenceStorage resultStorage = (ObjectSequenceStorage) decodeResult.getSequenceStorage();
1088+
forget((TruffleString) resultStorage.getItemNormalized(0));
10861089
return PNone.NONE;
10871090
}
10881091

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@
7878
import java.util.List;
7979
import java.util.logging.Level;
8080

81-
import com.oracle.graal.python.runtime.PythonImageBuildOptions;
8281
import org.graalvm.home.Version;
8382
import org.graalvm.nativeimage.ImageInfo;
8483

@@ -104,6 +103,7 @@
104103
import com.oracle.graal.python.builtins.objects.common.EmptyStorage;
105104
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
106105
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen;
106+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
107107
import com.oracle.graal.python.builtins.objects.dict.PDict;
108108
import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum;
109109
import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.ErrorAndMessagePair;
@@ -144,6 +144,7 @@
144144
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
145145
import com.oracle.graal.python.runtime.PosixSupportLibrary;
146146
import com.oracle.graal.python.runtime.PythonContext;
147+
import com.oracle.graal.python.runtime.PythonImageBuildOptions;
147148
import com.oracle.graal.python.runtime.PythonOptions;
148149
import com.oracle.graal.python.runtime.exception.PException;
149150
import com.oracle.graal.python.runtime.exception.PythonExitException;
@@ -359,14 +360,13 @@ private static boolean getImporter(PythonModule sysModule, TruffleString inputFi
359360
Object importer = null;
360361
Object pathHooks = sysModule.getAttribute(T_PATH_HOOKS);
361362
Object pathImporterCache = sysModule.getAttribute(T_PATH_IMPORTER_CACHE);
362-
if (pathHooks instanceof PList && pathImporterCache instanceof PDict) {
363-
PDict pathImporterCacheDict = (PDict) pathImporterCache;
363+
if (pathHooks instanceof PList pathHooksList && pathImporterCache instanceof PDict pathImporterCacheDict) {
364364
importer = pathImporterCacheDict.getItem(inputFilePath);
365365
if (importer == null) {
366366
/* set path_importer_cache[p] to None to avoid recursion */
367367
pathImporterCacheDict.setItem(inputFilePath, PNone.NONE);
368-
SequenceStorage storage = ((PList) pathHooks).getSequenceStorage();
369-
Object[] hooks = storage.getInternalArray();
368+
SequenceStorage storage = pathHooksList.getSequenceStorage();
369+
Object[] hooks = SequenceStorageNodes.GetInternalObjectArrayNode.executeUncached(storage);
370370
int numHooks = storage.length();
371371
for (int i = 0; i < numHooks; i++) {
372372
try {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
5959
import com.oracle.truffle.api.TruffleLogger;
6060
import com.oracle.truffle.api.dsl.Cached;
61-
import com.oracle.truffle.api.dsl.Cached.Shared;
61+
import com.oracle.truffle.api.dsl.Cached.Exclusive;
6262
import com.oracle.truffle.api.dsl.GenerateCached;
6363
import com.oracle.truffle.api.dsl.GenerateInline;
6464
import com.oracle.truffle.api.dsl.GenerateUncached;
@@ -85,7 +85,7 @@ public static NativeSequenceStorage executeUncached(SequenceStorage object, bool
8585

8686
@Specialization(guards = "!isMroSequenceStorage(s)")
8787
static NativeSequenceStorage doManaged(Node inliningTarget, BasicSequenceStorage s, boolean isBytesLike,
88-
@Shared("storageToNativeNode") @Cached SequenceStorageNodes.StorageToNativeNode storageToNativeNode,
88+
@Exclusive @Cached SequenceStorageNodes.StorageToNativeNode storageToNativeNode,
8989
@Cached SequenceStorageNodes.GetInternalObjectArrayNode getInternalArrayNode) {
9090
Object array;
9191
if (isBytesLike) {
@@ -124,7 +124,7 @@ static NativeSequenceStorage doNative(NativeSequenceStorage s, @SuppressWarnings
124124

125125
@Specialization
126126
static NativeSequenceStorage doEmptyStorage(Node inliningTarget, @SuppressWarnings("unused") EmptySequenceStorage s, boolean isBytesLike,
127-
@Shared("storageToNativeNode") @Cached SequenceStorageNodes.StorageToNativeNode storageToNativeNode) {
127+
@Exclusive @Cached SequenceStorageNodes.StorageToNativeNode storageToNativeNode) {
128128
return storageToNativeNode.execute(inliningTarget, isBytesLike ? PythonUtils.EMPTY_BYTE_ARRAY : PythonUtils.EMPTY_OBJECT_ARRAY, 0);
129129
}
130130

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

Lines changed: 25 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2621,27 +2621,19 @@ static NativeObjectSequenceStorage doNative(NativeObjectSequenceStorage s, @Supp
26212621
return s;
26222622
}
26232623

2624-
@Specialization(guards = "isAssignCompatibleNode.execute(inliningTarget, s, indicationStorage)")
2625-
static TypedSequenceStorage doTyped(@SuppressWarnings("unused") Node inliningTarget, TypedSequenceStorage s, @SuppressWarnings("unused") SequenceStorage indicationStorage,
2626-
// dummy profile, so that we can @Share it to generate better code
2627-
@Shared @Cached InlinedExactClassProfile selfProfile,
2628-
@Shared("isAssignCompatibleNode") @Cached @SuppressWarnings("unused") IsAssignCompatibleNode isAssignCompatibleNode) {
2629-
return s;
2630-
}
2631-
2632-
@Specialization(guards = "isFallbackCase(inliningTarget, s, value, isAssignCompatibleNode)")
2633-
static ObjectSequenceStorage doTyped(Node inliningTarget, SequenceStorage s, @SuppressWarnings("unused") Object value,
2634-
@Shared @Cached InlinedExactClassProfile selfProfile,
2635-
@Shared("isAssignCompatibleNode") @Cached @SuppressWarnings("unused") IsAssignCompatibleNode isAssignCompatibleNode) {
2636-
SequenceStorage profiled = selfProfile.profile(inliningTarget, s);
2637-
if (profiled instanceof BasicSequenceStorage) {
2638-
return new ObjectSequenceStorage(profiled.getInternalArray());
2624+
@Specialization(guards = "isFallbackCase(s, value)")
2625+
static SequenceStorage doGeneric(Node inliningTarget, SequenceStorage s, Object value,
2626+
@Cached GetInternalObjectArrayNode getInternalObjectArrayNode,
2627+
@Cached IsAssignCompatibleNode isAssignCompatibleNode) {
2628+
if (value instanceof SequenceStorage other) {
2629+
if (isAssignCompatibleNode.execute(inliningTarget, s, other)) {
2630+
return s;
2631+
}
26392632
}
2640-
// TODO copy all values
2641-
return new ObjectSequenceStorage(DEFAULT_CAPACITY);
2633+
return new ObjectSequenceStorage(getInternalObjectArrayNode.execute(inliningTarget, s));
26422634
}
26432635

2644-
protected static boolean isFallbackCase(Node inliningTarget, SequenceStorage s, Object value, IsAssignCompatibleNode isAssignCompatibleNode) {
2636+
protected static boolean isFallbackCase(SequenceStorage s, Object value) {
26452637
// there are explicit specializations for all cases with EmptySequenceStorage
26462638
if (s instanceof EmptySequenceStorage || s instanceof ObjectSequenceStorage || s instanceof NativeSequenceStorage) {
26472639
return false;
@@ -2650,7 +2642,7 @@ protected static boolean isFallbackCase(Node inliningTarget, SequenceStorage s,
26502642
(value instanceof Byte || value instanceof Integer || value instanceof Long)) {
26512643
return false;
26522644
}
2653-
return !(value instanceof SequenceStorage) || !isAssignCompatibleNode.execute(inliningTarget, s, (SequenceStorage) value);
2645+
return true;
26542646
}
26552647

26562648
public static ListGeneralizationNode create() {
@@ -2898,30 +2890,24 @@ public static Object[] executeUncached(SequenceStorage s) {
28982890
}
28992891

29002892
@Specialization(limit = "MAX_SEQUENCE_STORAGES", guards = "s.getClass() == cachedClass")
2901-
static Object[] doTyped(TypedSequenceStorage s,
2902-
@Cached("s.getClass()") Class<? extends SequenceStorage> cachedClass) {
2903-
return cachedClass.cast(s).getInternalArray();
2904-
}
2905-
2906-
@Specialization(replaces = "doTyped")
2907-
@TruffleBoundary
2908-
static Object[] doTypedUncached(TypedSequenceStorage s) {
2909-
return s.getInternalArray();
2910-
}
2911-
2912-
@Specialization
2913-
static Object[] doEmpty(EmptySequenceStorage s) {
2914-
return s.getCopyOfInternalArray();
2893+
static Object[] doTyped(BasicSequenceStorage s,
2894+
@Cached("s.getClass()") Class<? extends BasicSequenceStorage> cachedClass) {
2895+
return cachedClass.cast(s).getCopyOfInternalArray();
29152896
}
29162897

29172898
@Specialization
2918-
static Object[] doNative(NativeSequenceStorage s) {
2919-
return s.getCopyOfInternalArray();
2899+
static Object[] doEmpty(@SuppressWarnings("unused") EmptySequenceStorage s) {
2900+
return PythonUtils.EMPTY_OBJECT_ARRAY;
29202901
}
29212902

29222903
@Specialization
2923-
static Object[] doGeneric(ObjectSequenceStorage s) {
2924-
return s.getCopyOfInternalArray();
2904+
static Object[] doNative(NativeSequenceStorage s,
2905+
@Cached GetNativeItemScalarNode getNativeItemScalarNode) {
2906+
Object[] result = new Object[s.length()];
2907+
for (int i = 0; i < s.length(); i++) {
2908+
result[i] = getNativeItemScalarNode.execute(s, i);
2909+
}
2910+
return result;
29252911
}
29262912
}
29272913

@@ -3312,8 +3298,8 @@ static Object[] doNativeObject(Node inliningTarget, NativeSequenceStorage s,
33123298
}
33133299

33143300
@Specialization
3315-
static Object[] doEmptySequenceStorage(EmptySequenceStorage s) {
3316-
return s.getInternalArray();
3301+
static Object[] doEmptySequenceStorage(@SuppressWarnings("unused") EmptySequenceStorage s) {
3302+
return PythonUtils.EMPTY_OBJECT_ARRAY;
33173303
}
33183304

33193305
@Specialization(replaces = {"doObjectSequenceStorage", "doTypedSequenceStorage", "doNativeObject", "doEmptySequenceStorage"})

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TeeDataObjectBuiltins.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
import com.oracle.graal.python.builtins.PythonBuiltins;
6060
import com.oracle.graal.python.builtins.modules.BuiltinFunctions.LenNode;
6161
import com.oracle.graal.python.builtins.objects.PNone;
62-
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetSequenceStorageNode;
62+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
6363
import com.oracle.graal.python.builtins.objects.list.PList;
6464
import com.oracle.graal.python.builtins.objects.object.PythonObject;
6565
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
@@ -128,7 +128,7 @@ private static void init(PTeeDataObject self, Object it, PTeeDataObject nxt) {
128128
static Object init(VirtualFrame frame, PTeeDataObject self, Object it, PList values, Object nxt,
129129
@Bind("this") Node inliningTarget,
130130
@Cached LenNode lenNode,
131-
@Cached GetSequenceStorageNode getStorageNode,
131+
@Cached SequenceStorageNodes.GetInternalObjectArrayNode getInternalObjectArrayNode,
132132
@Cached InlinedBranchProfile numreadLCProfile,
133133
@Cached PRaiseNode.Lazy raiseNode) {
134134
int numread = (int) lenNode.execute(frame, values);
@@ -143,7 +143,7 @@ static Object init(VirtualFrame frame, PTeeDataObject self, Object it, PList val
143143
throw raiseNode.get(inliningTarget).raise(ValueError, TDATAOBJECT_SHOULDNT_HAVE_NEXT);
144144
}
145145
self.setIt(it);
146-
Object[] valuesArray = getStorageNode.execute(inliningTarget, values).getInternalArray();
146+
Object[] valuesArray = getInternalObjectArrayNode.execute(inliningTarget, values.getSequenceStorage());
147147
Object[] obj = new Object[LINKCELLS];
148148
PythonUtils.arraycopy(valuesArray, 0, obj, 0, numread);
149149
self.setValues(obj);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1586,8 +1586,8 @@ static PythonAbstractClass[] invokeMro(PythonAbstractClass cls) {
15861586
Object mroMeth = LookupAttributeInMRONode.Dynamic.getUncached().execute(type, T_MRO);
15871587
if (mroMeth instanceof PFunction) {
15881588
Object mroObj = CallUnaryMethodNode.getUncached().executeObject(mroMeth, cls);
1589-
if (mroObj instanceof PSequence) {
1590-
return mroCheck(cls, ((PSequence) mroObj).getSequenceStorage().getInternalArray());
1589+
if (mroObj instanceof PSequence mroSequence) {
1590+
return mroCheck(cls, GetInternalObjectArrayNode.executeUncached(mroSequence.getSequenceStorage()));
15911591
}
15921592
throw PRaiseNode.getUncached().raise(TypeError, ErrorMessages.OBJ_NOT_ITERABLE, cls);
15931593
}
@@ -2470,7 +2470,7 @@ private static void copyDictSlots(VirtualFrame frame, Node inliningTarget, TypeN
24702470
private static PTuple copySlots(Node inliningTarget, TypeNewContext ctx, TruffleString className, SequenceStorage slotList, int slotlen, PDict namespace,
24712471
PythonObjectFactory factory) {
24722472
int nslots = slotlen - PInt.intValue(ctx.addDict) - PInt.intValue(ctx.addWeak);
2473-
SequenceStorage newSlots = new ObjectSequenceStorage(nslots);
2473+
ObjectSequenceStorage newSlots = new ObjectSequenceStorage(nslots);
24742474
int j = 0;
24752475
for (int i = 0; i < slotlen; i++) {
24762476
// the cast is ensured by the previous loop

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

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

4141
public abstract SequenceStorage copy();
4242

43+
public abstract Object[] getInternalArray();
44+
45+
public abstract Object[] getCopyOfInternalArray();
46+
4347
/**
4448
* Get internal array object without copying. Note: The length must be taken from the sequence
4549
* storage object.

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,6 @@ public Object getIndicativeValue() {
7272
return null;
7373
}
7474

75-
@Override
76-
public Object[] getInternalArray() {
77-
return PythonUtils.EMPTY_OBJECT_ARRAY;
78-
}
79-
80-
@Override
81-
public Object[] getCopyOfInternalArray() {
82-
return PythonUtils.EMPTY_OBJECT_ARRAY;
83-
}
84-
8575
@Override
8676
public SequenceStorage getSliceInBound(int start, int stop, int step, int len) {
8777
assert start == stop && stop == 0;

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,6 @@ public final void setNewLength(int length) {
9797
}
9898
}
9999

100-
@Override
101-
public final Object[] getInternalArray() {
102-
throw CompilerDirectives.shouldNotReachHere();
103-
}
104-
105-
@Override
106-
public final Object[] getCopyOfInternalArray() {
107-
throw CompilerDirectives.shouldNotReachHere();
108-
}
109-
110100
@Override
111101
public final SequenceStorage getSliceInBound(int start, int stop, int step, int len) {
112102
throw CompilerDirectives.shouldNotReachHere();

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,6 @@ public final int getCapacity() {
7979

8080
public abstract ListStorageType getElementType();
8181

82-
public abstract Object[] getInternalArray();
83-
84-
public abstract Object[] getCopyOfInternalArray();
85-
8682
public abstract SequenceStorage getSliceInBound(int start, int stop, int step, int len);
8783

8884
public abstract SequenceStorage generalizeFor(Object value, SequenceStorage other);

0 commit comments

Comments
 (0)