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íaFuncionesImplementació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ónDescripción
obtener_entero(valor) -> i64Extrae un entero i64 de un ValorFast (con manejo de NaN tagging)
obtener_texto(valor) -> StringExtrae un String de un ValorFast
obtener_booleano(valor) -> boolExtrae un booleano de un ValorFast
obtener_decimal(valor) -> f64Extrae 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.