Shapes y Estructura de Objetos
Archivo: src/shape.rs (121 líneas)
¿Por qué existe?
Describe la estructura de campos de un objeto de forma desacoplada de sus datos. Normalmente hay un Shape por clase, pero pueden existir shapes derivados cuando se agregan campos dinámicamente (transiciones). El acceso a campos se resuelve por nombre → índice (HashMap), dando acceso O(1) a la representación interna de campos. ShapeId sustituye el uso directo de SymId como shape.
Arquitectura
| Componente | Descripción |
|---|---|
ShapeId(u32) | Identificador único de shape (Copy + Hash, usable como clave) |
Shape | Estructura de campos: campo_a_indice (nombre→índice O(1)), indice_a_campo (índice→nombre), clase_origen, parent opcional y transiciones cacheadas |
ShapeRegistry | Mantiene todos los shapes vivos, asigna ShapeIds y maneja las transiciones de campos dinámicos |
API Pública
| Función | Descripción |
|---|---|
get_or_create(clase) -> ShapeId | Retorna el shape base de una clase o lo crea |
add_campo(nombre) -> usize | Agrega un campo al shape y retorna su índice |
get_idx(nombre) -> Option<usize> | Resuelve el índice de un campo por nombre |
add_campo_dinamico(shape_id, campo) -> (ShapeId, usize) | Agrega un campo dinámico creando un shape derivado del actual (con parent al shape original) y cachea la transición en el padre |
reset() | Limpia todos los shapes y reinicia el contador de IDs |
Transiciones
Cuando un objeto agrega un campo que su shape no tiene, add_campo_dinamico crea un nuevo shape derivado: copia los campos del padre, agrega el nuevo y guarda la transición campo → nuevo ShapeId en el shape padre. Si la transición ya existe o el campo ya está presente, se reutiliza el shape existente. Esto permite agregar campos dinámicos sin reasignar toda la estructura.
Cómo se integra
El registry mantiene el mapa clase_a_shape (clase → shape base) y es consultado por el compilador y la VM para compilar accesos a campos a índices directos, y para resolver campos dinámicos en tiempo de ejecución.
ShapeId se comparte entre todos los objetos con idéntica estructura.