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

ComponenteDescripción
ShapeId(u32)Identificador único de shape (Copy + Hash, usable como clave)
ShapeEstructura de campos: campo_a_indice (nombre→índice O(1)), indice_a_campo (índice→nombre), clase_origen, parent opcional y transiciones cacheadas
ShapeRegistryMantiene todos los shapes vivos, asigna ShapeIds y maneja las transiciones de campos dinámicos

API Pública

FunciónDescripción
get_or_create(clase) -> ShapeIdRetorna el shape base de una clase o lo crea
add_campo(nombre) -> usizeAgrega 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.

💡 El patrón de transiciones con shape padre cacheado evita generar un shape nuevo por cada objeto distinto: el mismo ShapeId se comparte entre todos los objetos con idéntica estructura.