PDA

Ver la Versión Completa : EXEC RUST en manejadores: handle 0 is not live


Eslopes
8 de agosto de 2026, 22:53
PowerRustCOBOL 1.61.2 - corrección

Commit: A handler's EXEC RUST block failed with "handle 0 is not live" (1.61.2)

Dos defectos coincidían en el mismo manejador de eventos generado por el RAD, y ambos daban el mismo mensaje:

FFI failed: EXEC RUST cannot bind COBOL-TEXT: handle 0 is not live

1. Los elementos OBJECT REFERENCE del propio manejador no recibían objeto. Un manejador de eventos es un programa anidado con su propia WORKING-STORAGE, y sólo se construían los objetos de los elementos del programa más externo. Un elemento declarado dentro del manejador se quedaba sin handle, así que el primer bloque que intentaba enlazarlo fallaba. El mismo bloque funcionaba en cuanto el elemento se movía al formulario y se marcaba GLOBAL, y por eso el fallo parecía un problema del bloque y no de la declaración. Ahora cada programa anidado obtiene sus propios objetos, creados una vez y conservados entre llamadas igual que el elemento, y la CLASS se resuelve también con el REPOSITORY del programa que lo contiene (un manejador generado no declara ninguno).

2. MOVE / SET sobre un elemento OBJECT REFERENCE destruía el objeto. El valor se escribía en el almacenamiento del elemento, que es justamente donde vive el handle: al sobrescribirlo, el objeto quedaba inalcanzable y el siguiente bloque daba el error de arriba. SET cobol-text TO TextBox-1::Text - la forma de pasar a un bloque lo que escribe el operador - caía en esto siempre. Ahora la escritura atraviesa el handle y llega al objeto. Escribir un valor en una clase sin forma escalar (una colección, o un tipo propio) se informa como error de tipo indicando el elemento y su clase, en lugar de romper el handle en silencio.

Ejemplo


IDENTIFICATION DIVISION.
PROGRAM-ID. BUTTON-1--ONCLICK IS COMMON PROGRAM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 cobol-text USAGE IS OBJECT REFERENCE RUST-STRING.
01 rust-result USAGE IS OBJECT REFERENCE RUST-STRING.
PROCEDURE DIVISION.
MAIN.
SET cobol-text TO TextBox-1::Text
EXEC RUST
*rust_result = format!("{} dice hola", cobol_text);
END-EXEC
SET Label-1::Caption TO rust-result
GOBACK.


Las clases que admiten esa escritura son las que tienen un único valor escalar: RUST-STRING, cualquier ancho entero, los flotantes y RUST-BOOL.

Documentación: PowerRustCOBOL/docs/developers-guide-en.md at main · CloudLandBeta/PowerRustCOBOL · GitHub (https://github.com/CloudLandBeta/PowerRustCOBOL/blob/main/docs/developers-guide-en.md)

Anthropic Claude Codex Agent