InterSystems officiel
· Fév 28, 2023 3m de lecture

Améliorations de la façon dont les classes IRIS sont générées et appelées

Je voulais donner un aperçu d'une amélioration de la façon dont nous générons et appelons le code de méthode dans IRIS 2023.1.

Une classe dans IRIS est composée de deux composants d'exécution principaux :

  1. Descripteur de classe - une liste hautement optimisée de méthodes, propriétés, paramètres de classe qui composent la classe ainsi que les attributs associés à chacun d'entre eux, par ex. cadre public/privé.
  2. Code ObjectScript : ensemble de routines contenant le code ObjectScript à exécuter lorsqu'une méthode est appelée.

Lorsque vous appelez une méthode d'une classe/objet, le code de dispatch regarde dans le descripteur de classe pour trouver la méthode, puis il vérifie si vous êtes autorisé à l'appeler ou non, puis il configure le contexte de classe correct (en mettant à jour $this dans le process) et enfin il appelle le code ObjectScript dans la routine de classe associée.

La façon dont l'ObjectScript est généré dans IRIS 2023.1 a été améliorée pour garantir que nous distribuons toujours ce code via le descripteur de classe et appliquons ainsi toutes les vérifications correctes, puis exécutons l'ObjectScript avec le contexte de classe correct. Avant cette modification, il était possible d'appeler manuellement le code ObjectScript directement, ce qui pouvait entraîner des résultats non valides et la possibilité d'exécuter du code ObjectScript qui ne devrait pas être autorisé.

Le résultat de ce changement est que toute tentative d'appeler directement le code de la méthode ObjectScript (ce qui n'a jamais été officiellement autorisé) signalera une erreur <NOLINE> à partir d'IRIS 2023.1, le code faisant cela doit être ajusté pour appeler la méthode via la classe/l'objet .

Détails

Avant IRIS 2023.1, lorsque vous compiliez une classe User.Test.cls avec une méthode telle que :

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

Le code ObjectScript généré apparaîtrait dans la routine 'User.Test.1' comme :

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

Comme il s'agit d'une routine INT normale, vous invoquez cette étiquette avec 'Do zTest^User.Test.1()', mais cela a contourné l'envoi correct via le descripteur de classe, donc n'a pas vérifié si vous étiez autorisé à appeler cette méthode si c'était private, et il n'a pas configuré le contexte de classe/objet, de sorte que la logique de cette méthode qui s'appuie sur le contexte de classe/objet échouerait ou obtiendrait des résultats imprévisibles.

Dans IRIS 2023.1, nous allons générer :

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

Cette étiquette ne peut être appelée que via le descripteur de classe et toute tentative de l'appeler directement obtiendra désormais une erreur d'exécution <NOLINE>. De plus, auparavant, pour toute méthode non-%, nous préfixions le nom de l'étiquette avec 'z' pour indiquer que l'étiquette ne doit pas être appelée directement, maintenant pour les méthodes de bloc de procédure, nous n'ajoutons plus ce préfixe 'z' car ces étiquettes ne sont explicitement pas appelables et cela améliore la lisibilité du code généré.

Discussion (0)2
Connectez-vous ou inscrivez-vous pour continuer