gccrs: Refactor dynamic object fat pointers and vtable generation
gccrs refactors vtable generation for dynamic objects, improving fat pointer structure and metadata.
This commit refactors how gccrs handles dynamic object fat pointers and generates virtual method tables (vtables). The fat pointer is now strictly two words, and vtables are generated as separate global static structs containing trait object metadata like ‘size’, ‘align’, and ‘drop_in_place’, alongside trait methods. A caching mechanism prevents duplicate vtable generation.
In Details
The vtable structure for dynamic objects in gccrs has been significantly revised. Instead of being embedded directly in the fat pointer as an array, vtables are now separate global static structs correctly organized with drop_in_place, size, align, and method pointers. The Context in rust-compile-context.h now includes insert_vtable and lookup_vtable for caching, preventing redundant vtable generation for the same Type-Trait combinations.
- fat pointer
- A pointer in Rust that, in addition to pointing to data, also carries auxiliary information, such as a pointer to a vtable for dynamic dispatch.
- vtable
- Virtual Method Table. A table used in dynamic dispatch (polymorphism) that stores pointers to virtual functions (methods) for a class or trait implementation.
- dynamic dispatch
- A mechanism where the specific function to be called is determined at runtime, rather than at compile time. This is common with trait objects in Rust.
- trait object
- A trait object in Rust allows for dynamic dispatch. It's a type that implements a specific trait, and its concrete type is not known at compile time.