Skip to content

Commit 24d288e

Browse files
committed
Avoid needless refcount operations in native storage insert
1 parent cf4ad2b commit 24d288e

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

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

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4070,16 +4070,33 @@ static SequenceStorage doNativeInt(Node inliningTarget, NativeIntSequenceStorage
40704070
}
40714071

40724072
@Specialization
4073-
protected static SequenceStorage doNativeStorage(Node inliningTarget, NativeSequenceStorage storage, int index, Object value,
4073+
protected static SequenceStorage doNativeObjectStorage(Node inliningTarget, NativeObjectSequenceStorage storage, int index, Object value,
40744074
@Exclusive @Cached EnsureCapacityNode ensureCapacityNode,
4075-
@Cached(inline = false) GetItemScalarNode getItem,
4076-
@Cached SetItemScalarNode setItem) {
4075+
@Cached(inline = false) CStructAccess.ReadPointerNode readPointerNode,
4076+
@Cached(inline = false) CStructAccess.WritePointerNode writePointerNode,
4077+
@Cached PythonToNativeNewRefNode toNative) {
40774078
int newLength = storage.length() + 1;
40784079
ensureCapacityNode.execute(inliningTarget, storage, newLength);
40794080
for (int i = storage.length(); i > index; i--) {
4080-
setItem.execute(inliningTarget, storage, i, getItem.execute(inliningTarget, storage, i - 1));
4081+
writePointerNode.writeArrayElement(storage.getPtr(), i, readPointerNode.readArrayElement(storage.getPtr(), i - 1));
40814082
}
4082-
setItem.execute(inliningTarget, storage, index, value);
4083+
writePointerNode.writeArrayElement(storage.getPtr(), index, toNative.execute(value));
4084+
storage.setNewLength(newLength);
4085+
return storage;
4086+
}
4087+
4088+
@Specialization
4089+
protected static SequenceStorage doNativeByteStorage(Node inliningTarget, NativeByteSequenceStorage storage, int index, Object value,
4090+
@Exclusive @Cached EnsureCapacityNode ensureCapacityNode,
4091+
@Cached(inline = false) CStructAccess.ReadByteNode readByteNode,
4092+
@Cached(inline = false) CStructAccess.WriteByteNode writeByteNode,
4093+
@Cached CastToByteNode castToByteNode) {
4094+
int newLength = storage.length() + 1;
4095+
ensureCapacityNode.execute(inliningTarget, storage, newLength);
4096+
for (int i = storage.length(); i > index; i--) {
4097+
writeByteNode.writeArrayElement(storage.getPtr(), i, readByteNode.readArrayElement(storage.getPtr(), i - 1));
4098+
}
4099+
writeByteNode.writeArrayElement(storage.getPtr(), index, castToByteNode.execute(null, value));
40834100
storage.setNewLength(newLength);
40844101
return storage;
40854102
}

0 commit comments

Comments
 (0)