[Jastadd] Bugg i cirkulära attribut?

From: Jesper Mattsson <jesper.mattsson_at_modelon.com>
Date: Wed, 7 Dec 2011 07:32:51 -0800

Hej

Jag tror att jag hittat en bugg i cirkulära attribut, men det skulle kunna vara vi som gjort fel istället.

De inblandade noderna är:

· En FIdUseExp

· En FIdUse (barn till FIdUseExp)

· En FVariable (resultatet av myFV() på FIdUse-noden)

· En FIntegerLitExp (barn till FVariable)
Alla de inblandade noderna har is$Final = false.

Problemet uppstår i attributet isCircular() (ovidkommande detaljer borttagna):
syn lazy boolean FExp.isCircular() circular [true] = false;
eq FIdUseExp.isCircular() = getFIdUse().isCircular();
syn boolean FIdUse.isCircular() = myFV().isCircular();
syn lazy boolean FVariable.isCircular() = getBindingExp().isCircular(); // (getBindingExp() -> FIntegerLitExp i detta fall)
(FIntegerLitExp använder defenition från FExp.)

Vi hamnar sen i (från call stack, de övre anropar de undre genom sin isCircular_compute()):
FIdUseExp.isCircular():
...
      if(isFinal && num == state().boundariesCrossed) {
      isCircular_computed = true;
      state.LAST_CYCLE = true;
> isCircular_compute();
      state.LAST_CYCLE = false;
      }
...

FIdUseExp.isCircular():
...
    if(state.IN_CIRCLE) {
      interruptedCircle = true;
      state.IN_CIRCLE = false;
      state.pushEvalStack();
    }
> boolean isCircular_value = isCircular_compute();
...

FVariable.isCircular():
...
      do {
        isCircular_visited = state.CIRCLE_INDEX;
        state.CHANGE = false;
> boolean new_isCircular_value = isCircular_compute();
        if (new_isCircular_value!=isCircular_value)
          state.CHANGE = true;
        isCircular_value = new_isCircular_value;
        state.CIRCLE_INDEX++;
      } while (state.CHANGE);
...

FIntegerLitExp.isCircular():
...
      if (state.LAST_CYCLE) {
        isCircular_computed = true;
        return isCircular_compute();
      }
...

När den kommer in i FIntegerLitExp.isCircular() är isCircular_initialized = false (vilket verkar konstigt), och isCircular_value sätts därför till true. Sen sätts isCircular_computed till true, men isCircular_value sätts inte till resultatet av isCircular_compute(). Därmed blir det fel svar.

Jesper

Jesper MATTSSON, MSc
Software Developer & IT Administrator

Phone direct: +46 73 324 5909
Email: jesper.mattsson_at_modelon.com<mailto:jesper.mattsson_at_modelon.com>

[cid:image001.png_at_01CCB4FA.68D4C520]
________________________________
Modelon AB
Ideon Science Park
SE-223 70 Lund, Sweden

Phone: +46 46 286 2200
Fax: +46 46 286 2201


Web: http://www.modelon.com<http://www.modelon.com/>







image001.png
(image/png attachment: image001.png)

Received on Wed Dec 07 2011 - 16:34:27 CET

This archive was generated by hypermail 2.3.0 : Wed Apr 16 2014 - 17:19:06 CEST