Skip to content

Commit 32d84e2

Browse files
committed
[GR-53462]: checking storage size instead of internal array size
PullRequest: graalpython/3361
2 parents 005eb4d + 755623e commit 32d84e2

File tree

10 files changed

+64
-42
lines changed

10 files changed

+64
-42
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -495,12 +495,13 @@ static void doCustom(TruffleDecoder decoder, TruffleString errorAction, Object i
495495
Object exceptionObject = raiseDecodingErrorNode.makeDecodeException(inliningTarget, decoder, inputObject);
496496
Object restuple = callNode.execute(errorHandler, exceptionObject);
497497

498-
Object[] t = null;
499-
if (PGuards.isPTuple(restuple)) {
500-
t = getArray.execute(inliningTarget, ((PTuple) restuple).getSequenceStorage());
498+
if (!PGuards.isPTuple(restuple)) {
499+
throw raiseNode.get(inliningTarget).raise(TypeError, DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE);
501500
}
501+
SequenceStorage storage = ((PTuple) restuple).getSequenceStorage();
502+
Object[] t = getArray.execute(inliningTarget, storage);
502503

503-
if (t == null || t.length != 2) {
504+
if (storage.length() != 2) {
504505
throw raiseNode.get(inliningTarget).raise(TypeError, DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE);
505506
}
506507
int newpos = asIntNode.execute(null, inliningTarget, t[1]);

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2023, Oracle and/or its affiliates.
2+
* Copyright (c) 2024, Oracle and/or its affiliates.
33
* Copyright (c) 2013, Regents of the University of California
44
*
55
* All rights reserved.
@@ -107,6 +107,7 @@
107107
import com.oracle.graal.python.runtime.PythonContext;
108108
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
109109
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
110+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
110111
import com.oracle.graal.python.util.PythonUtils;
111112
import com.oracle.truffle.api.CompilerAsserts;
112113
import com.oracle.truffle.api.CompilerDirectives;
@@ -768,10 +769,11 @@ private void writeComplexObject(Object v, int flag) {
768769
}
769770
} else if (PyListCheckExactNode.executeUncached(v)) {
770771
writeByte(TYPE_LIST | flag);
772+
SequenceStorage storage = SequenceNodes.GetSequenceStorageNode.executeUncached(v);
771773
Object[] items = GetInternalObjectArrayNode.executeUncached(SequenceNodes.GetSequenceStorageNode.executeUncached(v));
772-
writeSize(items.length);
773-
for (Object item : items) {
774-
writeObject(item);
774+
writeSize(storage.length());
775+
for (int i = 0; i < storage.length(); i++) {
776+
writeObject(items[i]);
775777
}
776778
} else if (v instanceof PDict && PyDictCheckExactNode.executeUncached(v)) {
777779
HashingStorage dictStorage = ((PDict) v).getDictStorage();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteCodecUtil.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
8888
import com.oracle.graal.python.runtime.exception.PException;
8989
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
90+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
9091
import com.oracle.truffle.api.dsl.Bind;
9192
import com.oracle.truffle.api.dsl.Cached;
9293
import com.oracle.truffle.api.dsl.GenerateCached;
@@ -256,8 +257,9 @@ static int encerror(VirtualFrame frame, MultibyteCodec codec,
256257
boolean isUnicode = false;
257258
if (!isError) {
258259
PTuple tuple = (PTuple) retobj;
259-
Object[] array = getArray.execute(inliningTarget, tuple.getSequenceStorage());
260-
isError = array.length != 2;
260+
SequenceStorage storage = tuple.getSequenceStorage();
261+
Object[] array = getArray.execute(inliningTarget, storage);
262+
isError = storage.length() != 2;
261263
if (!isError) {
262264
tobj = array[0];
263265
newposobj = array[1];
@@ -390,8 +392,9 @@ static void decerror(VirtualFrame frame, MultibyteCodec codec,
390392
Object newposobj = null;
391393
if (!isError) {
392394
PTuple tuple = (PTuple) retobj;
393-
Object[] array = getArray.execute(inliningTarget, tuple.getSequenceStorage());
394-
isError = array.length != 2;
395+
SequenceStorage storage = tuple.getSequenceStorage();
396+
Object[] array = getArray.execute(inliningTarget, storage);
397+
isError = storage.length() != 2;
395398
if (!isError) {
396399
retuni = array[0];
397400
newposobj = array[1];

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataBuiltins.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
import com.oracle.graal.python.nodes.object.GetClassNode;
8888
import com.oracle.graal.python.runtime.PythonContext;
8989
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
90+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
9091
import com.oracle.truffle.api.CompilerDirectives;
9192
import com.oracle.truffle.api.dsl.Bind;
9293
import com.oracle.truffle.api.dsl.Cached;
@@ -210,8 +211,9 @@ static Object PyCData_setstate(VirtualFrame frame, CDataObject self, PTuple args
210211
@Cached PyNumberAsSizeNode asSizeNode,
211212
@Cached HashingStorageAddAllToOther addAllToOtherNode,
212213
@Cached PRaiseNode.Lazy raiseNode) {
213-
Object[] array = getArray.execute(inliningTarget, args.getSequenceStorage());
214-
if (array.length < 3 || !PGuards.isDict(array[0]) || !PGuards.isInteger(array[2])) {
214+
SequenceStorage storage = args.getSequenceStorage();
215+
Object[] array = getArray.execute(inliningTarget, storage);
216+
if (storage.length() < 3 || !PGuards.isDict(array[0]) || !PGuards.isInteger(array[2])) {
215217
throw raiseNode.get(inliningTarget).raise(TypeError);
216218
}
217219
PDict dict = (PDict) array[0];

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrBuiltins.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
import com.oracle.graal.python.runtime.PythonContext;
136136
import com.oracle.graal.python.runtime.exception.PException;
137137
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
138+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
138139
import com.oracle.truffle.api.CompilerDirectives;
139140
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
140141
import com.oracle.truffle.api.dsl.Bind;
@@ -445,8 +446,9 @@ static Object PyCFuncPtr_set_argtypes(VirtualFrame frame, PyCFuncPtrObject self,
445446
@Shared @Cached PyObjectLookupAttr lookupAttr,
446447
@Shared @Cached GetInternalObjectArrayNode getArray,
447448
@Shared @Cached PRaiseNode.Lazy raiseNode) {
449+
SequenceStorage storage = value.getSequenceStorage();
448450
Object[] ob = getArray.execute(inliningTarget, value.getSequenceStorage());
449-
self.converters = converters_from_argtypes(frame, inliningTarget, ob, raiseNode, lookupAttr);
451+
self.converters = converters_from_argtypes(frame, inliningTarget, ob, storage.length(), raiseNode, lookupAttr);
450452
self.argtypes = ob;
451453
return PNone.NONE;
452454
}
@@ -457,8 +459,9 @@ static Object PyCFuncPtr_set_argtypes(VirtualFrame frame, PyCFuncPtrObject self,
457459
@Shared @Cached PyObjectLookupAttr lookupAttr,
458460
@Shared @Cached GetInternalObjectArrayNode getArray,
459461
@Shared @Cached PRaiseNode.Lazy raiseNode) {
462+
SequenceStorage storage = value.getSequenceStorage();
460463
Object[] ob = getArray.execute(inliningTarget, value.getSequenceStorage());
461-
self.converters = converters_from_argtypes(frame, inliningTarget, ob, raiseNode, lookupAttr);
464+
self.converters = converters_from_argtypes(frame, inliningTarget, ob, storage.length(), raiseNode, lookupAttr);
462465
self.argtypes = ob;
463466
return PNone.NONE;
464467
}
@@ -646,9 +649,10 @@ Object[] _build_callargs(VirtualFrame frame, Node inliningTarget, PyCFuncPtrObje
646649
* This way seems to be ~2 us faster than the PyArg_ParseTuple calls below.
647650
*/
648651
/* We HAVE already checked that the tuple can be parsed with "i|ZO", so... */
649-
Object[] item = getArray.execute(inliningTarget, ((PTuple) paramflags[i]).getSequenceStorage());
652+
SequenceStorage storage = ((PTuple) paramflags[i]).getSequenceStorage();
653+
Object[] item = getArray.execute(inliningTarget, storage);
650654
Object ob;
651-
int tsize = item.length;
655+
int tsize = storage.length();
652656
int flag = castToJavaIntExactNode.execute(inliningTarget, item[0]);
653657
TruffleString name = tsize > 1 ? castToTruffleStringNode.execute(inliningTarget, item[1]) : null;
654658
Object defval = tsize > 2 ? item[2] : null;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrTypeBuiltins.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -78,6 +78,7 @@
7878
import com.oracle.graal.python.nodes.object.SetDictNode;
7979
import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
8080
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
81+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
8182
import com.oracle.truffle.api.dsl.Bind;
8283
import com.oracle.truffle.api.dsl.Cached;
8384
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -168,8 +169,9 @@ static Object PyCFuncPtrType_new(VirtualFrame frame, Object type, Object[] args,
168169
if (!PGuards.isPTuple(ob)) {
169170
throw raiseNode.get(inliningTarget).raise(TypeError, ARGTYPES_MUST_BE_A_SEQUENCE_OF_TYPES);
170171
}
171-
Object[] obtuple = getArray.execute(inliningTarget, ((PTuple) ob).getSequenceStorage());
172-
Object[] converters = converters_from_argtypes(frame, inliningTarget, obtuple, raiseNode, lookupAttr);
172+
SequenceStorage storage = ((PTuple) ob).getSequenceStorage();
173+
Object[] obtuple = getArray.execute(inliningTarget, storage);
174+
Object[] converters = converters_from_argtypes(frame, inliningTarget, obtuple, storage.length(), raiseNode, lookupAttr);
173175
stgdict.argtypes = obtuple;
174176
stgdict.converters = converters;
175177
}
@@ -188,10 +190,9 @@ static Object PyCFuncPtrType_new(VirtualFrame frame, Object type, Object[] args,
188190
return result;
189191
}
190192

191-
static Object[] converters_from_argtypes(VirtualFrame frame, Node inliningTarget, Object[] args,
193+
static Object[] converters_from_argtypes(VirtualFrame frame, Node inliningTarget, Object[] args, int nArgs,
192194
PRaiseNode.Lazy raiseNode,
193195
PyObjectLookupAttr lookupAttr) {
194-
int nArgs = args.length;
195196
Object[] converters = new Object[nArgs];
196197

197198
for (int i = 0; i < nArgs; ++i) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StructUnionTypeBuiltins.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
106106
import com.oracle.graal.python.runtime.exception.PException;
107107
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
108+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
108109
import com.oracle.truffle.api.dsl.Bind;
109110
import com.oracle.truffle.api.dsl.Cached;
110111
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -347,8 +348,9 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O
347348
if (!PGuards.isPTuple(pair)) {
348349
fieldsError(raiseNode.get(inliningTarget));
349350
}
350-
Object[] tuple = getArray.execute(inliningTarget, ((PTuple) pair).getSequenceStorage());
351-
int tupleLen = tuple.length;
351+
SequenceStorage storage = ((PTuple) pair).getSequenceStorage();
352+
Object[] tuple = getArray.execute(inliningTarget, storage);
353+
int tupleLen = storage.length();
352354
if (tupleLen < 2 || !PGuards.isString(tuple[0]) || (tupleLen > 2 && !PGuards.isInteger(tuple[2]))) {
353355
fieldsError(raiseNode.get(inliningTarget));
354356
}
@@ -557,8 +559,9 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O
557559
if (!PGuards.isPTuple(pair)) {
558560
fieldsError(raiseNode.get(inliningTarget));
559561
}
560-
Object[] tuple = getArray.execute(inliningTarget, ((PTuple) pair).getSequenceStorage());
561-
int tupleLen = tuple.length;
562+
SequenceStorage storage = ((PTuple) pair).getSequenceStorage();
563+
Object[] tuple = getArray.execute(inliningTarget, storage);
564+
int tupleLen = storage.length();
562565
if (tupleLen < 2 || !PGuards.isString(tuple[0]) || (tupleLen > 2 && !PGuards.isInteger(tuple[2]))) {
563566
fieldsError(raiseNode.get(inliningTarget));
564567
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BytesIOBuiltins.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
import com.oracle.graal.python.runtime.IndirectCallData;
116116
import com.oracle.graal.python.runtime.exception.PException;
117117
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
118+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
118119
import com.oracle.graal.python.util.ArrayBuilder;
119120
import com.oracle.graal.python.util.PythonUtils;
120121
import com.oracle.truffle.api.CompilerDirectives;
@@ -651,8 +652,9 @@ static Object doit(VirtualFrame frame, PBytesIO self, PTuple state,
651652
@Cached HashingStorageAddAllToOther addAllToOtherNode,
652653
@Cached PRaiseNode.Lazy raiseNode) {
653654
self.checkExports(inliningTarget, raiseNode);
654-
Object[] array = getArray.execute(inliningTarget, state.getSequenceStorage());
655-
if (array.length < 3) {
655+
SequenceStorage storage = state.getSequenceStorage();
656+
Object[] array = getArray.execute(inliningTarget, storage);
657+
if (storage.length() < 3) {
656658
return notTuple(self, state, raiseNode.get(inliningTarget));
657659
}
658660
/*

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/StringIOBuiltins.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -118,6 +118,7 @@
118118
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
119119
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
120120
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
121+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
121122
import com.oracle.truffle.api.CompilerDirectives;
122123
import com.oracle.truffle.api.dsl.Bind;
123124
import com.oracle.truffle.api.dsl.Cached;
@@ -656,8 +657,9 @@ static Object doit(VirtualFrame frame, PStringIO self, PTuple state,
656657
@Cached TruffleStringBuilder.AppendStringNode appendStringNode,
657658
@Cached HashingStorageAddAllToOther addAllToOtherNode,
658659
@Cached PRaiseNode.Lazy raiseNode) {
659-
Object[] array = getArray.execute(inliningTarget, state.getSequenceStorage());
660-
if (array.length < 4) {
660+
SequenceStorage storage = state.getSequenceStorage();
661+
Object[] array = getArray.execute(inliningTarget, storage);
662+
if (storage.length() < 4) {
661663
return notTuple(self, state, raiseNode.get(inliningTarget));
662664
}
663665
initNode.execute(frame, self, array[0], array[1]);

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -933,10 +933,11 @@ static PythonAbstractClass[] doNative(Node inliningTarget, PythonNativeClass obj
933933
@Cached InlinedExactClassProfile resultTypeProfile,
934934
@Cached GetInternalObjectArrayNode toArrayNode) {
935935
Object result = resultTypeProfile.profile(inliningTarget, getTpBasesNode.readFromObj(obj, PyTypeObject__tp_bases));
936-
if (result instanceof PTuple) {
937-
Object[] values = toArrayNode.execute(inliningTarget, ((PTuple) result).getSequenceStorage());
936+
if (result instanceof PTuple tuple) {
937+
SequenceStorage storage = tuple.getSequenceStorage();
938+
Object[] values = toArrayNode.execute(inliningTarget, storage);
938939
try {
939-
return cast(values);
940+
return cast(values, storage);
940941
} catch (ClassCastException e) {
941942
throw raise.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, ErrorMessages.UNSUPPORTED_OBJ_IN, "tp_bases");
942943
}
@@ -945,9 +946,9 @@ static PythonAbstractClass[] doNative(Node inliningTarget, PythonNativeClass obj
945946
}
946947

947948
// TODO: get rid of this
948-
private static PythonAbstractClass[] cast(Object[] arr) {
949-
PythonAbstractClass[] bases = new PythonAbstractClass[arr.length];
950-
for (int i = 0; i < arr.length; i++) {
949+
private static PythonAbstractClass[] cast(Object[] arr, SequenceStorage storage) {
950+
PythonAbstractClass[] bases = new PythonAbstractClass[storage.length()];
951+
for (int i = 0; i < storage.length(); i++) {
951952
bases[i] = (PythonAbstractClass) arr[i];
952953
}
953954
return bases;
@@ -1616,7 +1617,8 @@ static PythonAbstractClass[] invokeMro(PythonAbstractClass cls) {
16161617
if (mroMeth instanceof PFunction) {
16171618
Object mroObj = CallUnaryMethodNode.getUncached().executeObject(mroMeth, cls);
16181619
if (mroObj instanceof PSequence mroSequence) {
1619-
return mroCheck(cls, GetInternalObjectArrayNode.executeUncached(mroSequence.getSequenceStorage()));
1620+
SequenceStorage mroStorage = mroSequence.getSequenceStorage();
1621+
return mroCheck(cls, GetInternalObjectArrayNode.executeUncached(mroStorage), mroStorage);
16201622
}
16211623
throw PRaiseNode.getUncached().raise(TypeError, ErrorMessages.OBJ_NOT_ITERABLE, cls);
16221624
}
@@ -1663,10 +1665,10 @@ private static PythonAbstractClass[] computeMethodResolutionOrder(PythonAbstract
16631665
return currentMRO;
16641666
}
16651667

1666-
private static PythonAbstractClass[] mroCheck(Object cls, Object[] mro) {
1667-
List<PythonAbstractClass> resultMro = new ArrayList<>(mro.length);
1668+
private static PythonAbstractClass[] mroCheck(Object cls, Object[] mro, SequenceStorage storage) {
1669+
List<PythonAbstractClass> resultMro = new ArrayList<>(storage.length());
16681670
Object solid = GetSolidBaseNode.executeUncached(cls);
1669-
for (int i = 0; i < mro.length; i++) {
1671+
for (int i = 0; i < storage.length(); i++) {
16701672
Object object = mro[i];
16711673
if (object == null) {
16721674
continue;

0 commit comments

Comments
 (0)