Skip to content

Commit 7d6c595

Browse files
committed
Avoid needless refcount operations in native storage delete
1 parent 24d288e commit 7d6c595

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3597,7 +3597,7 @@ static void doLastItem(Node inliningTarget, SequenceStorage s, @SuppressWarnings
35973597
setLenNode.execute(inliningTarget, s, s.length() - 1);
35983598
}
35993599

3600-
@Specialization(guards = "!isForeignSequenceStorage(s)")
3600+
@Specialization(guards = {"!isNativeObjectStorage(s)", "!isForeignSequenceStorage(s)"})
36013601
static void doGeneric(Node inliningTarget, SequenceStorage s, int idx,
36023602
@Cached GetItemScalarNode getItemNode,
36033603
@Cached SetItemScalarNode setItemNode,
@@ -3610,6 +3610,21 @@ static void doGeneric(Node inliningTarget, SequenceStorage s, int idx,
36103610
setLenNode.execute(inliningTarget, s, len - 1);
36113611
}
36123612

3613+
@Specialization
3614+
static void doNativeObjectStorage(Node inliningTarget, NativeObjectSequenceStorage s, int idx,
3615+
@Cached(inline = false) CStructAccess.ReadPointerNode readPointerNode,
3616+
@Cached(inline = false) CStructAccess.WritePointerNode writePointerNode,
3617+
@Cached CExtNodes.XDecRefPointerNode decRefNode) {
3618+
int len = s.length();
3619+
Object deleted = readPointerNode.readArrayElement(s.getPtr(), idx);
3620+
for (int i = idx; i < len - 1; i++) {
3621+
writePointerNode.writeArrayElement(s.getPtr(), i, readPointerNode.readArrayElement(s.getPtr(), i + 1));
3622+
}
3623+
writePointerNode.writeArrayElement(s.getPtr(), len - 1, 0L);
3624+
s.setNewLength(len - 1);
3625+
decRefNode.execute(inliningTarget, deleted);
3626+
}
3627+
36133628
@Specialization
36143629
static void doForeign(Node inliningTarget, ForeignSequenceStorage s, int idx,
36153630
@Cached ForeignSequenceStorage.RemoveNode removeNode) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
import com.oracle.graal.python.runtime.sequence.storage.ForeignSequenceStorage;
114114
import com.oracle.graal.python.runtime.sequence.storage.IntSequenceStorage;
115115
import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage;
116+
import com.oracle.graal.python.runtime.sequence.storage.NativeObjectSequenceStorage;
116117
import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage;
117118
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
118119
import com.oracle.graal.python.util.OverflowException;
@@ -297,6 +298,10 @@ public static boolean isForeignSequenceStorage(SequenceStorage sequenceStorage)
297298
return sequenceStorage instanceof ForeignSequenceStorage;
298299
}
299300

301+
public static boolean isNativeObjectStorage(SequenceStorage sequenceStorage) {
302+
return sequenceStorage instanceof NativeObjectSequenceStorage;
303+
}
304+
300305
public static boolean isList(Object o) {
301306
return o instanceof PList;
302307
}

0 commit comments

Comments
 (0)