close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 14 years ago

Closed 14 years ago

Last modified 14 years ago

#1104 closed defect (fixed)

Error typing returned instances with the class name

Reported by: Pedro Gea Owned by: Víctor de Buen Remiro
Priority: normal Milestone: OOP Implementation
Component: OOP Version:
Severity: major Keywords:
Cc:

Description

Se encuentra un error al intentar tipar la instancia que devuelve una función con el nombre de la clase:

Class @ClaseA {
  Real valueA
};

NameBlock nb = [[
  Set instance. = [[ @ClaseA instance = [[ Real valueA = 1 ]] ]];
  @ClaseA GetInstance(Real void) { instance.[1] }
]];

//@ClassA nb::GetInstance(?); //<- esto falla
NameBlock nb::GetInstance(?); //<- esto no falla

Change History (12)

comment:1 Changed 14 years ago by Víctor de Buen Remiro

Resolution: invalid
Status: newclosed

Esto falla porque no existe @ClassA sino @ClaseA}}}

comment:2 Changed 14 years ago by Pedro Gea

Resolution: invalid
Status: closedreopened

Ciertamente no estuve nada fino explicando el error. Lo corrijo.

El error ocurre sólo cuando la clase fue declarada dentro de un nameblock:

NameBlock Modulo = [[
  Class @ClaseA {
    Real valueA
  }
]];

NameBlock nb = [[
  Set instance. = [[ Modulo::@ClaseA instance = [[ Real valueA = 1 ]] ]];
  Modulo::@ClaseA GetInstance(Real void) { instance.[1] }
]];

// Modulo::@ClaseA nb::GetInstance(?); //<- esto falla
NameBlock nb::GetInstance(?); //<- esto no falla

comment:3 Changed 14 years ago by Víctor de Buen Remiro

De acuerdo. En realidad se trata de un error del parser ya conocido que tiene que ver con los tickets #843 y #959. Llevo ya tiempo detrás de este error pero es bastante duro como todas las cosas que tienen que ver con el parser.

Por si te vale de algo mientras tanto sugiero usar esto otro que también va y es más claro que tipar con NameBlock

  Modulo::@ClaseA b = nb::GetInstance(?);

comment:4 Changed 14 years ago by Víctor de Buen Remiro

(In [3246]) Refs #1104

comment:5 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: reopenedclosed

(In [3247]) Fixes #1104

comment:6 Changed 14 years ago by Pedro Gea

Resolution: fixed
Status: closedreopened

El error descrito:

NameBlock Modulo = [[
  Class @ClaseA {
    Real valueA
  }
]];

NameBlock nb = [[
  Set instance. = [[ Modulo::@ClaseA instance = [[ Real valueA = 1 ]] ]];
  Modulo::@ClaseA GetInstance(Real void) { instance.[1] }
]];

Modulo::@ClaseA nb::GetInstance(?); //<- esto falla

sigue ocurriendo.

Nótese que la advertencia:

Warning: [] La función :: ha fallado en : 
Modulo::@ClaseA nb::GetInstance(?)

parece indicar que no existe el método GetInstance de nb. Supongo que es algún problema al buscar un método que se llame GetInstance y que devuelva una instancia de Modulo::@ClaseA.

comment:7 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: reopenedclosed

(In [3276]) Fixes #1104

comment:8 Changed 14 years ago by Víctor de Buen Remiro

Ha sido duro pero al final creo que lo he conseguido retorciendo una vez más el parser ([3276#file0]), que estaba diseñado en origen para una sintaxis mucho más sencilla, en la que los operadores monarios, como lo es un nombre de clase usado como tipo de datos, no podían ser resultado de una expresión binaria como el ::.

La función BParser::ParseDelayed detecta las situaciones del tipo

  • <Container>::...::<@Tipo> <Container>::...::<Method>(<arguments>)
  • <Container>::...::<@Tipo> <Container>::...::<Member>

y rebaja artificialmente la precedencia del segundo sintagma (argumento compuesto de la operación) para que quede supeditado al primero (operador monario compuesto) en el árbol sintáctico.

Por otra parte una vez construido el árbol correctamente también ha habido que retocar la función de evaluación del operador "::" ([3276#file2]) que no preveía tampoco esta situación.

Por último había otro problema en la evaluación de bloques de sentencias, tanto globales como locales, en los que el tipo esperado sólo puede cambiarse mediante el tipado explícito el cual se reconocía sólo a primer nivel del árbol, es decir, mirando si el primer token es un nombre de tipo. Ese tipo de reconocimiento ahora sunpondría una revisión del árbol mucho más compleja por lo que se ha optado por relajar la condición de tipado haciéndola opcional en las funciones de evaluación.

Para ello ha habido que añadir un argumento opcional bool forceType con valor por defecto true a la las funciones de evaluación genérica ([3276#file3]), de tal forma que si se le pasa false no se hace la comprobación de tipo del resultado.

comment:9 Changed 14 years ago by Víctor de Buen Remiro

(In [3277]) Refs #1104
Wrong typed If

comment:10 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: closedreopened

Ahora el siguiente código da error

NameBlock NB = 
[[
  Class @A { Real a };
  Class @A.Null : @A { 
    Static @A.Null New(Real void)
    {
      @A.Null null = [[ Real a= 0 ]];
      null
    }
  }
]];
  
NB::@A A = [[ Real a = 1 ]];
NB::@A A := NB::@A.Null::New(?);
NB::@A A1 = NB::@A.Null::New(?);

comment:11 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: reopenedclosed

(In [3348]) Fixes #1104

comment:12 Changed 14 years ago by Víctor de Buen Remiro

(In [3352]) Refs #1104

Note: See TracTickets for help on using tickets.