InterSystems Oficial
· Maio 9, 2023 2min de leitura

Melhorias na forma como as classes do IRIS são geradas e chamadas

Queria avisar sobre uma melhoria na forma como geramos e chamamos o código de método no IRIS 2023.1.

Uma classe no IRIS é composta de dois componentes de tempo de execução principais:

  1. Descritor de classe - Uma lista altamente otimizada de parâmetros de classe, métodos e propriedades que compõem a classe junto com os atributos associados a cada um deles, por exemplo, ambiente público/privado.
  2. Código ObjectScript - Um grupo de rotinas que contém o código ObjectScript a ser executado quando um método é chamado.

Quando você chama um método de uma classe/objeto, o código dispatch procura o método no descritor de classe e verifica se você tem permissão para chamá-lo. Em seguida, configura o contexto de classe correto (atualizando $this no processo) e, por fim, chama o código ObjectScript na rotina de classe associada.

A maneira que o ObjectScript é gerado no IRIS 2023.1 foi otimizada para garantir o dispatch desse código pelo descritor de classe, a aplicação de todas as verificações corretas e a execução do ObjectScript com o contexto de classe correto. Antes dessa mudança, era possível chamar o código ObjectScript manual e diretamente, o que poderia gerar resultados inválidos e a capacidade de executar código ObjectScript que não deveria ser permitido.

Um resultado dessa mudança é que qualquer tentativa de chamar o código do método ObjectScript diretamente (o que nunca foi permitido de forma oficial) gerará um erro <NOLINE> a partir do IRIS 2023.1. O código que faz isso deve ser ajustado para chamar o método pela classe/objeto.

Detalhes

Antes do IRIS 2023.1, quando você compilava uma classe User.Test.cls com um método como:

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

O código ObjectScript gerado apareceria na rotina "User.Test.1" como:

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

Como essa é uma rotina INT regular, você invoca esse rótulo com "Do zTest^User.Test.1()". No entanto, isso contornava o dispatch correto pelo descritor de classe. Então, ele não verificava se você podia chamar esse método, se era particular, e não configurava o contexto de classe/objeto. Portanto, a lógica nesse método que depende do contexto de classe/objeto falharia ou obteria resultados imprevisíveis.

No IRIS 2023.1, vamos gerar:

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

Esse rótulo só pode ser chamado pelo descritor de classe, e qualquer tentativa de chamada direta obterá agora um erro de tempo de execução <NOLINE>. Antes, para qualquer método que não fosse %, o nome do rótulo tinha o prefixo "z" para indicar que não deveria ser chamado diretamente. Agora, para os métodos de bloco de procedimento, não adicionamos mais o prefixo "z", já que é explícito que esses rótulos não podem ser chamados, e isso melhora a legibilidade do código gerado.

Discussão (0)1
Entre ou crie uma conta para continuar