IslandOfCode / jVTLlib

A simple VTL (Validation and Transformation Language) Interpreter in java library form. Still in development, but usable for BIRD 1.0 database instruction.
Apache License 2.0
0 stars 2 forks source link

Gestione variabili mappate named Function #4

Open IslandOfCode opened 6 years ago

IslandOfCode commented 6 years ago

TD;LR Nel caso di variabili con lo stesso nome dentro e fuori una funzione, queste verranno prima sovrascritte e poi rimosse dalla memoria.

Il commit https://github.com/IslandOfCode/jVTLlib/commit/e3ffb79b3af324b5c197bb3e34e6a4afa8bc4e8b ha rotto il sistema di gestione delle variabili nell'esecuzione di una funzione.

In precedenza, MEMORY veniva clonata e inserita nello stack SCOPE. Alla fine dell'esecuzione della funzione, veniva effettuato un pop per ripristinarla. L'operazione risultava necessaria per creare uno spazio isolato (scope appunto) per l'esecuzione dell'espressione. Questo creava però un overhead elevatissimo, soprattutto quando MEMORY conteneva DataSet di dimensioni consistenti.

La patch ha risolto questo problema, ma ne ha creato uno ancora più grave. Semplicemente si limita ad inserire le variabili mappate in MEMORY, senza ripulire quest'ultima prima, accorpando di fatto i due spazi di memoria. Alla fine dell'esecuzione, le variabili vengono rimosse da MEMORY, ristabilendo la situazione iniziale.

Qui nasce il problema. Se una variabile mappata ha una chiave (nome) che coincide con una variabile già presente in MEMORY, quest'ultima verrà sovrascritta quando viene eseguito: this.MEMORY.putAll(M); Non solo, alla fine dell'esecuzione della funzione, tutte le variabili in M verranno rimosse tramite ciclo for, eliminando quindi anche la variabilein oggetto.