summaryrefslogtreecommitdiff
path: root/py/gc_long_lived.c
AgeCommit message (Collapse)Author
2020-03-03Remove debug externScott Shawcroft
2020-02-25Support importing native modules in native packages.Scott Shawcroft
This only fixes the `import` portion. It doesn't actually change reference behavior because modules within a package could already be referenced through the parent package even though an error should have been thrown.
2019-11-22* only make objects long lived if they are on the GC heapDavid Grimes
2019-02-01Never long live the main dictionary.Scott Shawcroft
It's contents change often and may be referenced elsewhere. Fixes #1443
2018-07-25Merge remote-tracking branch 'adafruit/3.x' into import_mergeScott Shawcroft
2018-07-19Prevent repetitive recursive scanning of dicts when making them long-livedDan Halbert
2018-07-03Analysis fixes and long lived tweaks.Scott Shawcroft
2018-03-25Don't assume the type of the prop->proxy objectsJeff Epler
This fixes a crash running the cpydiff/core_class_superproperty.py test, but it does not fix the difference to cpython3. Closes: #705
2018-01-24Fix the initial state and polish a couple comments.Scott Shawcroft
2018-01-24Introduce a long lived section of the heap.Scott Shawcroft
This adapts the allocation process to start from either end of the heap when searching for free space. The default behavior is identical to the existing behavior where it starts with the lowest block and looks higher. Now it can also look from the highest block and lower depending on the long_lived parameter to gc_alloc. As the heap fills, the two sections may overlap. When they overlap, a collect may be triggered in order to keep the long lived section compact. However, free space is always eligable for each type of allocation. By starting from either of the end of the heap we have ability to separate short lived objects from long lived ones. This separation reduces heap fragmentation because long lived objects are easy to densely pack. Most objects are short lived initially but may be made long lived when they are referenced by a type or module. This involves copying the memory and then letting the collect phase free the old portion. QSTR pools and chunks are always long lived because they are never freed. The reallocation, collection and free processes are largely unchanged. They simply also maintain an index to the highest free block as well as the lowest. These indices are used to speed up the allocation search until the next collect. In practice, this change may slightly slow down import statements with the benefit that memory is much less fragmented afterwards. For example, a test import into a 20k heap that leaves ~6k free previously had the largest continuous free space of ~400 bytes. After this change, the largest continuous free space is over 3400 bytes.