Opened 14 years ago
Closed 14 years ago
#1209 closed defect (fixed)
Lost messages when the use of the :: operator is concatenated
Reported by: | Pedro Gea | Owned by: | Víctor de Buen Remiro |
---|---|---|---|
Priority: | highest | Milestone: | Mantainance |
Component: | Kernel | Version: | head |
Severity: | blocker | Keywords: | |
Cc: |
Description
Acabo de darme cuenta de que se están perdiendo mensajes cuando varias llamadas se concatenan mediante el uso del operador ::
.
Véase por ejemplo:
NameBlock modulo = [[ NameBlock submodulo = [[ Real Funcion(Real a) { 2*a } ]]; NameBlock GetSubmodulo(Real void) { WriteLn("Estás accediendo al submódulo.", "W"); submodulo } ]]; Real modulo::GetSubmodulo(?)::Funcion(3);
La última llamada no muestra la advertencia:
Warning: [2] Estás accediendo al submódulo.
que sin embargo sí se muestra al hacer sólo:
NameBlock modulo::GetSubmodulo(?);
Change History (4)
comment:1 Changed 14 years ago by
Priority: | normal → highest |
---|---|
Severity: | normal → blocker |
comment:2 Changed 14 years ago by
comment:4 Changed 14 years ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
En primer lugar voy a explicar el problema del operador especial ::
.
La parte izquierda puede ser tres cosas: un NameBlock, un Set o un Class.
El último caso es fácil de detectar en el árbol porque es una rama de un solo token de tipo "TYPE" y subtipo "CLASS". Sólo hay que comprobar que efectivamente existe una clase con su nombre.
Sin embargo es imposible determinar a priori si la rama izquierda del árbol me va a dar un NameBlock o un Set, o algo que no me sirve y que haya que mostrar error.
Lo que hacía antes es evaluación tentativa con salida oculta, es decir, deshabilitando las funciones que sacan los mensajes para que no se mostraran los errores. Primero probaba para GraNameBlock() y si fallaba repetía con GraSet(). Si también fallaba pues se muestra error y ya está. Podría haber evaluado con Anything pero eso implica probar todos los tipos cuando en realidad sólo dos valen y eso implica demasiado coste adicional, teniendo en cuenta la cantidad de veces que se usa este operador.
La solución que vamos a probar consiste en primero ver si se trata de una rama con un sólo token que sea de tipo ARGUMENT, que eso se averigua muy rápido. Si es así busco, no evalúo que sería más lento, en las gramáticas NameBlock y Set, lo cual ocurre en el 99% de los casos.
Si no se trata de una rama de ese tipo entonces ya hay que evaluar con Anything que es lo que es bastante más lento porque busca en todas las gramáticas, pero como se va a hacer pocas veces no debería notarse demasiado.
(In [3559]) Refs #1209