InterSystems Official
· 27 mar, 2023 Lectura de 3 min

Mejoras en la generación e invocación de las clases de IRIS

Me gustaría adelantaros una mejora sobre cómo generamos e invocamos el código de los métodos en IRIS 2023.1.

Una clase en IRIS se compone de dos componentes de runtime principales:

  1. Descriptor de Clase (Class Descriptor) - Una lista de métodos muy optimizada, propiedades, parámetros de clase que configura y parametriza la clase, junto con atributos asociados con cada uno de estos, por ejemplo configuración pública/privada.
  2. Código de ObjectScript (ObjectScript code) - Un conjunto de rutinas que contienen el código de ObjectScript para ser ejecutado cuando se invoca un método.

Cuando llamas a un método de una clase/objeto, el controlador del código o dispatcher comprueba el descriptor de clase para encontrar el método, después verifica si estás autorizado o no para invocar a dicho método, luego configura el contexto de clase correcto (actualizando $this en el proceso) y finalmente llama al código de ObjectScript en la rutina de clase asociada.

La forma en que se genera ObjectScript en IRIS 2023.1 ha sido mejorada para asegurarnos de que siempre enviemos las llamadas al código a través del descriptor de clase y a continuación realizar las comprobaciones correctas para posteriormente ejecutar el ObjectScript con el contexto de clase correcto. Antes de este cambio, era posible llamar manualmente al código de ObjectScript directamente, lo que podía llevar a invalidar resultados y a la posibilidad de ejecutar código de ObjectScript para el que no se tuviera permisos.

Un resultado de este cambio es que cualquier intento de llamar al código de un método de ObjectScript directamente (lo que nunca fue permitido oficialmente) notificará un error <NOLINE> a partir de la versión de IRIS 2023.1. El código que haga esto debería ajustarse para invocar el método a través de la clase/objeto.

Detalles

Antes de IRIS 2023.1, cuando compilabas una clase User.Test.cls con un método como:

method Test() {
  Write "Test",!
}

El código de ObjectScript generado aparecería en la rutina 'User.Test.1' como:

zTest() public {
  Write "Test",!
}

Como esto es una rutina INT regular, podrías invocar este método con 'Do zTest^User.Test.1()'. Mediante este modo de invocación evitarías la comprobación que realiza el dispatcher a través del descriptor de clase, por lo que no se realizaría la comprobación de los permisos del usuario para ejectuar dicho método si era privado y no se configuró el contexto de la clase/objeto. Por ello, en caso de que la lógica de este método dependa del contexto de la clase/objeto, fallará o llevará a resultados impredecibles.

A partir de la versión de IRIS 2023.1 el método que se generará será el siguiente:

Test() methodimpl {
 Write "Test",!
}

Esta etiqueta solo se puede invocar a través del descriptor de clase y cualquier intento de llamarla directamente ahora obtendrá un error <NOLINE> en tiempo de ejecución. Además, previamente para cualquier método 'no-%', utilizábamos en el nombre el prefijo 'z' para indicar que ese método/etiqueta no debería ser llamado directamente. Ahora por los métodos de bloque de procedimiento, ya no añadimos más este prefijo 'z', ya que estas etiquetas son explícitamente no invocables y esto mejora la legibilidad del código generado.

Comentarios (1)1
Inicie sesión o regístrese para continuar