Registro de Funciones Nativas (FFI Bridge)
Archivo: src/native_registry.rs (4707 líneas)
¿Por qué existe?
Es el puente FFI (Foreign Function Interface) entre la VM de Forja y el mundo Rust nativo. Con más de 5000 líneas, es uno de los archivos más grandes del compilador. Registra cientos de funciones nativas que pueden ser llamadas desde código Forja, abarcando desde operaciones de E/S hasta criptografía, redes y más.
Estructura
El NativeRegistry mantiene un HashMap que mapea nombres de funciones (como "_archivo_leer") a punteros de función Rust. Cuando la VM encuentra una llamada a una función nativa, busca en este registro y ejecuta la función Rust correspondiente.
Categorías de funciones registradas
| Categoría | Funciones | Implementación |
|---|---|---|
| Archivos (I/O) | _archivo_* (12 funciones) | archivo.fa — leer, escribir, eliminar, renombrar, etc. |
| Red (TCP/UDP) | _socket_* (10 funciones) | sockets.fa — conectar, enviar, recibir, bind, listen |
| HTTP | _http_* (8 funciones) | cliente_http.fa — requests GET/POST/PUT/DELETE |
| HTTP/2 | _h2_* (16 funciones) | cliente_h2.fa, servidor_h2.fa — conexiones, streams, push |
| HTTP/3 | _h3_* (8 funciones) | cliente_h3.fa — conexiones QUIC |
| WebSocket | _ws_* (6 funciones) | websocket.fa — conexiones WebSocket |
| Servidor Web | _servidor_* (10 funciones) | servidor_web.fa — servidor HTTP/1.1 |
| SQLite | _sqlite_* (8 funciones) | sqlite.fa — abrir, ejecutar, consultar, parámetros |
| Criptografía | _crypto_* (20+ funciones) | crypto.fa — AES, ChaCha20, RSA, etc. |
| Hash | _hash_* (10 funciones) | hash.fa — SHA-256, SHA-3, BLAKE3, HMAC |
| JSON | _json_* (6 funciones) | json.fa — parsear, serializar |
| TOML | _toml_* (4 funciones) | toml.fa — parsear, serializar |
| CSV | _csv_* (6 funciones) | csv.fa — leer, escribir, parsear |
| Base64 | _b64_* (2 funciones) | codificacion.fa — codificar, decodificar |
| Hex | _hex_* (2 funciones) | hex.fa — codificar, decodificar |
| UUID | _uuid_* (2 funciones) | codificacion.fa — generar UUID v4 |
| Tiempo | _tiempo_* (4 funciones) | fecha.fa — ahora, formato, diferencia |
| Procesos | _proceso_* (6 funciones) | proceso.fa — ejecutar, spawn, señales |
| Entorno | _env_* (4 funciones) | env.fa — obtener, asignar, listar |
| Matemáticas | _math_* (20+ funciones) | matematica.fa — sen, cos, sqrt, log, etc. |
| Concurrencia | _hilo_* (8 funciones) | concurrencia.fa — hilos, canales, select |
| Atomics | _atomic_* (6 funciones) | atomicos.fa — enteros y banderas atómicas |
| Terminal | _terminal_* (4 funciones) | terminal.fa — modo raw, tamaño, teclas |
| MMAP | _mmap_* (6 funciones) | mmap.fa — mapear, leer, escribir, sincronizar |
| Logging | _log_* (5 funciones) | log.fa — info, warn, error, debug |
| Ruta | _ruta_* (4 funciones) | ruta.fa — join, dirname, basename, ext |
| Señales | _señal_* (4 funciones) | señales.fa — manejar señales del SO |
| Pruebas | _prueba_* (6 funciones) | prueba.fa — afirmar, igual, verdadero, falso |
| Perfilado | _perfil_* (4 funciones) | perfilado.fa — medir, reportar |
Funciones auxiliares del registro
| Función | Descripción |
|---|---|
obtener_entero(valor) -> i64 | Extrae un entero i64 de un ValorFast (con manejo de NaN tagging) |
obtener_texto(valor) -> String | Extrae un String de un ValorFast |
obtener_booleano(valor) -> bool | Extrae un booleano de un ValorFast |
obtener_decimal(valor) -> f64 | Extrae un decimal f64 de un ValorFast |
obtener_lista(valor) -> Vec<i64> | Extrae una lista de handles desde un ValorFast |
crear_valor(ValorFast::* ) | Crea valores Forja desde Rust (entero, texto, decimal, booleano, nulo) |
🔧 Arquitectura: Cada módulo de la stdlib (
*.fa) tiene una función registrar_* que se llama durante la inicialización. Por ejemplo, registrar_sqlite(reg) registra todas las funciones _sqlite_*. El registro centralizado en native_registry permite que la VM encuentre cualquier función nativa con una sola búsqueda en el HashMap.