The GitHub Actions job "CI" on tvm-ffi.git/2026-02-27/slots has failed. Run started by GitHub user junrushao (triggered by junrushao).
Head commit for run: 7d9de2a643fca66bd269ec195b50e8143582e98d / Junru Shao <[email protected]> feat(python)!: enforce __slots__=() for Object subclasses via _ObjectSlotsMeta Architecture: - Split Cython `Object` into two layers: `CObject` (extension type owning the raw `void* chandle`) and `Object` (Python class with `_ObjectSlotsMeta` metaclass that auto-injects `__slots__=()`). - `_ObjectSlotsMeta(ABCMeta)` intercepts `__new__` to inject `__slots__=()` into any subclass namespace that omits it, preventing per-instance `__dict__` allocation across the entire Object hierarchy. - Removed the `slots: bool = True` keyword argument from `_ObjectSlotsMeta.__new__`/`__init__`; subclasses that need a `__dict__` declare `__slots__ = ("__dict__",)` explicitly — no metaclass opt-out. - `Module` uses `__slots__ = ("__dict__",)` to allow dynamic attribute caching; `__getattr__` simplified to store directly in `__dict__` and let normal attribute lookup serve as the cache on subsequent access. - `CObject.__init__` now raises `TypeError`, guarding against accidental creation of NULL-handle objects from Python. - `object_repr()` replaces the module-global `_REPR_PRINT` lazy cache with a local import from `_ffi_api`, eliminating mutable global state. - Fallback class generation simplified: set attributes directly on the already-created class instead of rebuilding `__dict__` and re-calling `type()`. Public Interfaces: - New exported Cython type `CObject` (base extension type). - `Object` is now a Python class (metaclass=`_ObjectSlotsMeta`) extending `CObject`; `isinstance(x, Object)` still works for `CObject` instances via custom `__instancecheck__`/`__subclasscheck__`. - `_ObjectSlotsMeta` no longer accepts `slots` keyword argument. - New public function `object_repr(obj: CObject) -> str`. - `__object_repr__` removed (was module-private). - `core.pyi` updated to reflect the new two-level hierarchy. - `DLDeviceType`: added `kDLMAIA=17`, renumbered `kDLTrn` from 17 to 18. UI/UX: - Object subclasses can no longer carry arbitrary instance attributes; any `obj.foo = bar` on an unslotted attribute now raises `AttributeError`. - `Module.__getattr__` stores looked-up functions in `__dict__` directly; subsequent access hits `__dict__` without entering `__getattr__` again. Behavioral Changes: - All `Object`-derived classes automatically receive `__slots__=()` unless they explicitly declare their own. - Subclasses that need per-instance state (e.g. `Module`) declare `__slots__ = ("__dict__",)` to opt in to a `__dict__`. - `Error`, `Function`, `Tensor`, `OpaquePyObject` now extend `CObject` directly (Cython extension types cannot use a Python metaclass). - Container `__repr__` methods (Array, List, Map, Dict) removed; inherited `CObject.__repr__` delegates to `object_repr()`. - `ffi.Shape` added to the set of deep-copy-supported containers in `_setup_copy_methods`. - `_deepcopy_supported` uses direct `_ffi_api.DeepCopy` import instead of `lru_cache`-wrapped `get_global_func`. - `AccessPath.__init__` no longer calls `super().__init__()` (which now raises `TypeError`). Docs: - Inline docstrings updated for `CObject`, `Object`, `object_repr`. - Removed stale note forbidding `__dict__` in `__slots__` from Object docstring. - No external doc updates; gap: `docs/concepts/` object docs should mention the two-level CObject/Object split. Tests: - Executed: `uv run pytest -vvs tests/python` - Result: 532 passed, 23 skipped, 1 xfailed Untested Edge Cases: - Third-party code that sets arbitrary attributes on Object subclasses will break; low risk since this is an intentional invariant enforcement. - `_ObjectSlotsMeta.__instancecheck__` performance under deep inheritance hierarchies; low risk, ABCMeta has its own caching. BREAKING CHANGE: All `Object` subclasses now enforce `__slots__=()` by default. Code that dynamically sets instance attributes on Object-derived classes will raise `AttributeError`. Migrate by declaring needed slots explicitly (e.g., `__slots__ = ("my_attr",)` or `__slots__ = ("__dict__",)`) or storing state in a separate non-Object container. `_ObjectSlotsMeta` no longer accepts `slots` keyword argument. `DLDeviceType.kDLTrn` renumbered from 17 to 18; `kDLMAIA=17` added. Report URL: https://github.com/apache/tvm-ffi/actions/runs/22500041781 With regards, GitHub Actions via GitBox --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
