Skip to content

Commit 813ff3a

Browse files
committed
Avoid decrefing uninitialized native memory when appending/extending lists
1 parent 0d561b8 commit 813ff3a

File tree

1 file changed

+65
-87
lines changed

1 file changed

+65
-87
lines changed

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

Lines changed: 65 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@
9191
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.RepeatNodeGen;
9292
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.SetItemDynamicNodeGen;
9393
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.SetItemNodeGen;
94-
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.SetItemScalarNodeGen;
9594
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.SetItemSliceNodeGen;
9695
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.SetLenNodeGen;
9796
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.StorageToNativeNodeGen;
@@ -1166,9 +1165,9 @@ public static SequenceStorageNodes.SetItemNode createForList() {
11661165
}
11671166
}
11681167

1169-
@GenerateUncached
1168+
@GenerateCached(false)
11701169
@ImportStatic({SequenceStorageBaseNode.class, PGuards.class})
1171-
public abstract static class SetItemScalarNode extends Node {
1170+
public abstract static class AbstractSetItemScalarNode extends Node {
11721171

11731172
public abstract void execute(SequenceStorage s, int idx, Object value);
11741173

@@ -1250,22 +1249,42 @@ protected static void doObject(ObjectSequenceStorage storage, int idx, Object va
12501249
storage.setItemNormalized(idx, value);
12511250
}
12521251

1252+
@Fallback
1253+
@SuppressWarnings("unused")
1254+
static void doError(SequenceStorage s, int idx, Object item) {
1255+
throw new SequenceStoreException(item);
1256+
}
1257+
}
1258+
1259+
@GenerateUncached
1260+
public abstract static class SetItemScalarNode extends AbstractSetItemScalarNode {
1261+
12531262
@InliningCutoff
12541263
@Specialization
12551264
protected static void doNative(NativeSequenceStorage storage, int idx, Object value,
12561265
@Cached SetNativeItemScalarNode setItem) {
12571266
setItem.execute(storage, idx, value);
12581267
}
12591268

1260-
@Fallback
1261-
@SuppressWarnings("unused")
1262-
static void doError(SequenceStorage s, int idx, Object item) {
1263-
throw new SequenceStoreException(item);
1269+
@NeverDefault
1270+
public static SetItemScalarNode create() {
1271+
return SequenceStorageNodesFactory.SetItemScalarNodeGen.create();
1272+
}
1273+
}
1274+
1275+
@GenerateUncached
1276+
public abstract static class InitializeItemScalarNode extends AbstractSetItemScalarNode {
1277+
1278+
@InliningCutoff
1279+
@Specialization
1280+
protected static void doNative(NativeSequenceStorage storage, int idx, Object value,
1281+
@Cached InitializeNativeItemScalarNode initializeItem) {
1282+
initializeItem.execute(storage, idx, value);
12641283
}
12651284

12661285
@NeverDefault
1267-
public static SetItemScalarNode create() {
1268-
return SetItemScalarNodeGen.create();
1286+
public static InitializeItemScalarNode create() {
1287+
return SequenceStorageNodesFactory.InitializeItemScalarNodeGen.create();
12691288
}
12701289
}
12711290

@@ -2014,11 +2033,6 @@ static boolean isByteSequenceStorage(SequenceStorage s) {
20142033

20152034
abstract static class ConcatBaseNode extends SequenceStorageBaseNode {
20162035

2017-
@Child private SetItemScalarNode setItemNode;
2018-
@Child private GetItemScalarNode getItemNode;
2019-
@Child private GetItemScalarNode getRightItemNode;
2020-
@Child private SetLenNode setLenNode;
2021-
20222036
public abstract SequenceStorage execute(SequenceStorage dest, SequenceStorage left, SequenceStorage right);
20232037

20242038
@Specialization(guards = "!isNative(right)")
@@ -2046,22 +2060,24 @@ static SequenceStorage doRightEmpty(@SuppressWarnings("unused") EmptySequenceSto
20462060
}
20472061

20482062
@Specialization(guards = {"dest == left", "left.getClass() == right.getClass()", "cachedClass == left.getClass()"}, limit = "1")
2049-
SequenceStorage doManagedManagedSameTypeInplace(@SuppressWarnings("unused") BasicSequenceStorage dest, BasicSequenceStorage left, BasicSequenceStorage right,
2050-
@Cached("left.getClass()") Class<? extends SequenceStorage> cachedClass) {
2063+
static SequenceStorage doManagedManagedSameTypeInplace(@SuppressWarnings("unused") BasicSequenceStorage dest, BasicSequenceStorage left, BasicSequenceStorage right,
2064+
@Cached("left.getClass()") Class<? extends SequenceStorage> cachedClass,
2065+
@Shared @Cached SetLenNode setLenNode) {
20512066
SequenceStorage leftProfiled = cachedClass.cast(left);
20522067
SequenceStorage rightProfiled = cachedClass.cast(right);
20532068
Object arr1 = leftProfiled.getInternalArrayObject();
20542069
int len1 = leftProfiled.length();
20552070
Object arr2 = rightProfiled.getInternalArrayObject();
20562071
int len2 = rightProfiled.length();
20572072
PythonUtils.arraycopy(arr2, 0, arr1, len1, len2);
2058-
getSetLenNode().execute(leftProfiled, len1 + len2);
2073+
setLenNode.execute(leftProfiled, len1 + len2);
20592074
return leftProfiled;
20602075
}
20612076

20622077
@Specialization(guards = {"dest != left", "dest.getClass() == left.getClass()", "left.getClass() == right.getClass()", "cachedClass == dest.getClass()"}, limit = "1")
2063-
SequenceStorage doManagedManagedSameType(BasicSequenceStorage dest, BasicSequenceStorage left, BasicSequenceStorage right,
2064-
@Cached("left.getClass()") Class<? extends SequenceStorage> cachedClass) {
2078+
static SequenceStorage doManagedManagedSameType(BasicSequenceStorage dest, BasicSequenceStorage left, BasicSequenceStorage right,
2079+
@Cached("left.getClass()") Class<? extends SequenceStorage> cachedClass,
2080+
@Shared @Cached SetLenNode setLenNode) {
20652081
SequenceStorage destProfiled = cachedClass.cast(dest);
20662082
SequenceStorage leftProfiled = cachedClass.cast(left);
20672083
SequenceStorage rightProfiled = cachedClass.cast(right);
@@ -2070,91 +2086,68 @@ SequenceStorage doManagedManagedSameType(BasicSequenceStorage dest, BasicSequenc
20702086
Object arr2 = rightProfiled.getInternalArrayObject();
20712087
int len2 = rightProfiled.length();
20722088
concat(destProfiled.getInternalArrayObject(), arr1, len1, arr2, len2);
2073-
getSetLenNode().execute(destProfiled, len1 + len2);
2089+
setLenNode.execute(destProfiled, len1 + len2);
20742090
return destProfiled;
20752091
}
20762092

20772093
@Specialization(guards = {"dest.getClass() == right.getClass()", "cachedClass == dest.getClass()"}, limit = "1")
2078-
SequenceStorage doEmptyManagedSameType(BasicSequenceStorage dest, @SuppressWarnings("unused") EmptySequenceStorage left, BasicSequenceStorage right,
2079-
@Cached("dest.getClass()") Class<? extends SequenceStorage> cachedClass) {
2094+
static SequenceStorage doEmptyManagedSameType(BasicSequenceStorage dest, @SuppressWarnings("unused") EmptySequenceStorage left, BasicSequenceStorage right,
2095+
@Cached("dest.getClass()") Class<? extends SequenceStorage> cachedClass,
2096+
@Shared @Cached SetLenNode setLenNode) {
20802097
SequenceStorage destProfiled = cachedClass.cast(dest);
20812098
SequenceStorage rightProfiled = cachedClass.cast(right);
20822099
Object arr2 = rightProfiled.getInternalArrayObject();
20832100
int len2 = rightProfiled.length();
20842101
PythonUtils.arraycopy(arr2, 0, destProfiled.getInternalArrayObject(), 0, len2);
2085-
getSetLenNode().execute(destProfiled, len2);
2102+
setLenNode.execute(destProfiled, len2);
20862103
return destProfiled;
20872104
}
20882105

20892106
@Specialization(guards = {"dest.getClass() == left.getClass()", "cachedClass == dest.getClass()"}, limit = "1")
2090-
SequenceStorage doManagedEmptySameType(BasicSequenceStorage dest, BasicSequenceStorage left, @SuppressWarnings("unused") EmptySequenceStorage right,
2091-
@Cached("left.getClass()") Class<? extends SequenceStorage> cachedClass) {
2107+
static SequenceStorage doManagedEmptySameType(BasicSequenceStorage dest, BasicSequenceStorage left, @SuppressWarnings("unused") EmptySequenceStorage right,
2108+
@Cached("left.getClass()") Class<? extends SequenceStorage> cachedClass,
2109+
@Shared @Cached SetLenNode setLenNode) {
20922110
SequenceStorage destProfiled = cachedClass.cast(dest);
20932111
SequenceStorage leftProfiled = cachedClass.cast(left);
20942112
Object arr1 = leftProfiled.getInternalArrayObject();
20952113
int len1 = leftProfiled.length();
20962114
PythonUtils.arraycopy(arr1, 0, destProfiled.getInternalArrayObject(), 0, len1);
2097-
getSetLenNode().execute(destProfiled, len1);
2115+
setLenNode.execute(destProfiled, len1);
20982116
return destProfiled;
20992117
}
21002118

21012119
@Specialization(guards = "dest == left")
2102-
SequenceStorage doGenericInplace(@SuppressWarnings("unused") SequenceStorage dest, SequenceStorage left, SequenceStorage right) {
2120+
static SequenceStorage doGenericInplace(@SuppressWarnings("unused") SequenceStorage dest, SequenceStorage left, SequenceStorage right,
2121+
@Shared @Cached GetItemScalarNode getItemRightNode,
2122+
@Shared @Cached InitializeItemScalarNode initalizeItemNode,
2123+
@Shared @Cached SetLenNode setLenNode) {
21032124
int len1 = left.length();
21042125
int len2 = right.length();
21052126
for (int i = 0; i < len2; i++) {
2106-
getSetItemNode().execute(left, i + len1, getGetRightItemNode().execute(right, i));
2127+
initalizeItemNode.execute(left, i + len1, getItemRightNode.execute(right, i));
21072128
}
2108-
getSetLenNode().execute(left, len1 + len2);
2129+
setLenNode.execute(left, len1 + len2);
21092130
return left;
21102131
}
21112132

21122133
@Specialization(guards = "dest != left")
2113-
SequenceStorage doGeneric(SequenceStorage dest, SequenceStorage left, SequenceStorage right) {
2134+
static SequenceStorage doGeneric(SequenceStorage dest, SequenceStorage left, SequenceStorage right,
2135+
@Exclusive @Cached GetItemScalarNode getItemLeftNode,
2136+
@Shared @Cached GetItemScalarNode getItemRightNode,
2137+
@Shared @Cached InitializeItemScalarNode initalizeItemNode,
2138+
@Shared @Cached SetLenNode setLenNode) {
21142139
int len1 = left.length();
21152140
int len2 = right.length();
21162141
for (int i = 0; i < len1; i++) {
2117-
getSetItemNode().execute(dest, i, getGetItemNode().execute(left, i));
2142+
initalizeItemNode.execute(dest, i, getItemLeftNode.execute(left, i));
21182143
}
21192144
for (int i = 0; i < len2; i++) {
2120-
getSetItemNode().execute(dest, i + len1, getGetRightItemNode().execute(right, i));
2145+
initalizeItemNode.execute(dest, i + len1, getItemRightNode.execute(right, i));
21212146
}
2122-
getSetLenNode().execute(dest, len1 + len2);
2147+
setLenNode.execute(dest, len1 + len2);
21232148
return dest;
21242149
}
21252150

2126-
private SetItemScalarNode getSetItemNode() {
2127-
if (setItemNode == null) {
2128-
CompilerDirectives.transferToInterpreterAndInvalidate();
2129-
setItemNode = insert(SetItemScalarNode.create());
2130-
}
2131-
return setItemNode;
2132-
}
2133-
2134-
private GetItemScalarNode getGetItemNode() {
2135-
if (getItemNode == null) {
2136-
CompilerDirectives.transferToInterpreterAndInvalidate();
2137-
getItemNode = insert(GetItemScalarNode.create());
2138-
}
2139-
return getItemNode;
2140-
}
2141-
2142-
private GetItemScalarNode getGetRightItemNode() {
2143-
if (getRightItemNode == null) {
2144-
CompilerDirectives.transferToInterpreterAndInvalidate();
2145-
getRightItemNode = insert(GetItemScalarNode.create());
2146-
}
2147-
return getRightItemNode;
2148-
}
2149-
2150-
private SetLenNode getSetLenNode() {
2151-
if (setLenNode == null) {
2152-
CompilerDirectives.transferToInterpreterAndInvalidate();
2153-
setLenNode = insert(SetLenNode.create());
2154-
}
2155-
return setLenNode;
2156-
}
2157-
21582151
private static void concat(Object dest, Object arr1, int len1, Object arr2, int len2) {
21592152
PythonUtils.arraycopy(arr1, 0, dest, 0, len1);
21602153
PythonUtils.arraycopy(arr2, 0, dest, len1, len2);
@@ -2892,12 +2885,12 @@ static SequenceStorage doEmpty(EmptySequenceStorage s, Object val, GenNodeSuppli
28922885
return recursive.execute(newStorage, val, genNodeSupplier);
28932886
}
28942887

2895-
@Specialization
2896-
static SequenceStorage doManaged(BasicSequenceStorage s, Object val, GenNodeSupplier genNodeSupplier,
2888+
@Fallback
2889+
static SequenceStorage doNonEmpty(SequenceStorage s, Object val, GenNodeSupplier genNodeSupplier,
28972890
@Bind("this") Node inliningTarget,
2898-
@Shared @Cached EnsureCapacityNode ensureCapacity,
2899-
@Shared @Cached SetLenNode setLenNode,
2900-
@Shared @Cached SetItemScalarNode setItemNode,
2891+
@Cached EnsureCapacityNode ensureCapacity,
2892+
@Cached SetLenNode setLenNode,
2893+
@Cached InitializeItemScalarNode initializeItemNode,
29012894
@Shared("genNode") @Cached DoGeneralizationNode doGenNode) {
29022895
int len = s.length();
29032896
int newLen = len + 1;
@@ -2906,14 +2899,14 @@ static SequenceStorage doManaged(BasicSequenceStorage s, Object val, GenNodeSupp
29062899
ensureCapacity.execute(inliningTarget, s, len + 1);
29072900
}
29082901
try {
2909-
setItemNode.execute(s, len, val);
2902+
initializeItemNode.execute(s, len, val);
29102903
setLenNode.execute(s, len + 1);
29112904
return s;
29122905
} catch (SequenceStoreException e) {
29132906
SequenceStorage generalized = doGenNode.execute(genNodeSupplier, s, e.getIndicationValue());
29142907
ensureCapacity.execute(inliningTarget, generalized, len + 1);
29152908
try {
2916-
setItemNode.execute(generalized, len, val);
2909+
initializeItemNode.execute(generalized, len, val);
29172910
setLenNode.execute(generalized, len + 1);
29182911
return generalized;
29192912
} catch (SequenceStoreException e1) {
@@ -2923,21 +2916,6 @@ static SequenceStorage doManaged(BasicSequenceStorage s, Object val, GenNodeSupp
29232916
}
29242917
}
29252918

2926-
@Specialization
2927-
static SequenceStorage doNative(NativeSequenceStorage s, Object val, @SuppressWarnings("unused") GenNodeSupplier genNodeSupplier,
2928-
@Bind("this") Node inliningTarget,
2929-
@Shared @Cached EnsureCapacityNode ensureCapacity,
2930-
@Shared @Cached SetLenNode setLenNode,
2931-
@Shared @Cached SetItemScalarNode setItemNode) {
2932-
assert s.getElementType() == Generic;
2933-
int index = s.length();
2934-
int newLength = s.length() + 1;
2935-
SequenceStorage resized = ensureCapacity.execute(inliningTarget, s, newLength);
2936-
setLenNode.execute(resized, newLength);
2937-
setItemNode.execute(resized, index, val);
2938-
return resized;
2939-
}
2940-
29412919
@NeverDefault
29422920
public static AppendNode create() {
29432921
return AppendNodeGen.create();

0 commit comments

Comments
 (0)