Object conversion model ======================= Base object types ----------------- Pandemonium Variant - standalone: bool, int, real - pointer to builtin type (e.g. ``Matrix32``, ``AABB``, etc.) - pointer to generic ``Object`` Python mp_obj_t - standalone: bool, small int, real (depend of implementation), qstr - pointer to generic struct (must have ``mp_obj_base_t base`` as first attribute) .. note: Variant and mp_obj_t instances are only used by copy, no memory management needed on themselves. Naming conventions: - GST: Pandemonium STandalone - GPB: Pandemonium Pointer Builtin - GPO: Pandemonium Pointer Object - PST: Python STandalone - PPB: Python Pointer Binding (proxy to Pandemonium data) - PPE: Python Pointer Exposed (defined with `@exposed` decorator) - PPI: Python Pointer Internal Variant memory management ------------------------- For GPO, Variant contains a raw pointer on the Object and (not necessary) a reference on the Object. - If a reference is present, ref counting is at work. - If not, user need to do manual memory management by calling ``free`` method. For GPB, there is 3 possibilities: - No allocated memory for data (e.g. ``Rect2``), so nothing is done. - Data is stored in a memory pool (e.g. ``Dictionary``), so data's destructor is called which make use of ref counting to know what to do. - Classic C++ allocation for data (e.g. ``Matrix3``) so regular ``delete`` is called on it. Conversions implicating a standalone ------------------------------------ Standalone doesn't need garbage collection and doesn't hold reference on other objects. Hence conversion is trivial. Conversion Pandemonium -> Python -------------------------- Each GPB has a corresponding PPB, acting like a proxy from within the Python interpreter. GPO binding is done dynamically with the ``DynamicBinder`` using Pandemonium introspection (i.e. ``ObjectTypeDB``). It is possible in the future that to create static proxy for core GPO and rely on dynamic method as a fall-back for unknown classes (i.g. added by 3rd party). Conversion Python -> Pandemonium -------------------------- PPB -> GPB described earlier. PPI objects cannot be converted back to Pandemonium. PPE instance are exposed as ``PyInstance`` (class exposed as ``PyScript``).