Skip to content
  • Damien George's avatar
    py: Introduce a Python stack for scoped allocation. · 02d830c0
    Damien George authored
    This patch introduces the MICROPY_ENABLE_PYSTACK option (disabled by
    default) which enables a "Python stack" that allows to allocate and free
    memory in a scoped, or Last-In-First-Out (LIFO) way, similar to alloca().
    
    A new memory allocation API is introduced along with this Py-stack.  It
    includes both "local" and "nonlocal" LIFO allocation.  Local allocation is
    intended to be equivalent to using alloca(), whereby the same function must
    free the memory.  Nonlocal allocation is where another function may free
    the memory, so long as it's still LIFO.
    
    Follow-up patches will convert all uses of alloca() and VLA to the new
    scoped allocation API.  The old behaviour (using alloca()) will still be
    available, but when MICROPY_ENABLE_PYSTACK is enabled then alloca() is no
    longer required or used.
    
    The benefits of enabling this option are (or will be once subsequent
    patches are made to convert alloca()/VLA):
    - Toolchains without alloca() can use this feature to obtain correct and
      efficient scoped memory allocation (compared to using the heap instead
      of alloca(), which is slower).
    - Even if alloca() is available, enabling the Py-stack gives slightly more
      efficient use of stack space when calling nested Python functions, due to
      the way that compilers implement alloca().
    - Enabling the Py-stack with the stackless mode allows for even more
      efficient stack usage, as well as retaining high performance (because the
      heap is no longer used to build and destroy stackless code states).
    - With Py-stack and stackless enabled, Python-calling-Python is no longer
      recursive in the C mp_execute_bytecode function.
    
    The micropython.pystack_use() function is included to measure usage of the
    Python stack.
    02d830c0