summaryrefslogtreecommitdiff
path: root/tests/micropython/heapalloc_slice.py
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2022-12-05 17:01:30 +1100
committerDamien George <damien@micropython.org>2025-07-16 00:12:47 +1000
commit5e9189d6d1c00c92694888bf9c74276779c40716 (patch)
tree46ac68ccf7dcf59bf53b2efea4c76fb267db133f /tests/micropython/heapalloc_slice.py
parentaa2362d4de3bed960b65c5e6e66544f68f2e7ed1 (diff)
py/vm: Avoid heap-allocating slices when subscripting built-ins.
This commit adds a fast-path optimisation for when a BUILD_SLICE is immediately followed by a LOAD/STORE_SUBSCR for a native type, to avoid needing to allocate the slice on the heap. In some cases (e.g. `a[1:3] = x`) this can result in no allocations at all. We can't do this for instance types because the get/set/delattr implementation may keep a reference to the slice. Adds more tests to the basic slice tests to ensure that a stack-allocated slice never makes it to Python, and also a heapalloc test that verifies (when using bytecode) that assigning to a slice is no-alloc. This work was funded through GitHub Sponsors. Signed-off-by: Jim Mussared <jim.mussared@gmail.com> Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'tests/micropython/heapalloc_slice.py')
-rw-r--r--tests/micropython/heapalloc_slice.py18
1 files changed, 18 insertions, 0 deletions
diff --git a/tests/micropython/heapalloc_slice.py b/tests/micropython/heapalloc_slice.py
new file mode 100644
index 000000000..62d96595c
--- /dev/null
+++ b/tests/micropython/heapalloc_slice.py
@@ -0,0 +1,18 @@
+# slice operations that don't require allocation
+try:
+ from micropython import heap_lock, heap_unlock
+except (ImportError, AttributeError):
+ heap_lock = heap_unlock = lambda: 0
+
+b = bytearray(range(10))
+
+m = memoryview(b)
+
+heap_lock()
+
+b[3:5] = b"aa"
+m[5:7] = b"bb"
+
+heap_unlock()
+
+print(b)