Menu

#2003 GUARD ON WHEN issue

5.2.0
closed
nobody
None
complete
1
2026-04-19
2025-03-26
Erich
No

GUARD ON WHEN allows method to run concurrently, even when it should always block out others.
Below code samples demonstrates the issue: variable n should count from 0 to 9

use arg n = 10
b = .Buffer~new
append = .Message~new(b, "ADD")
do n
  append~reply
end

::class Buffer

::method init
  expose n
  n = 0

::method add unguarded
  expose n
  guard on when n = n
  say "n" n
  n = n + 1

Discussion

  • Rony G. Flatscher

    As you are using reply it may be helpful to get to see the entire trace intermediate of running the program. The upcoming tool "tracetool.rex" was used for creating the tracelog and then format it with a custom formatting that displays all TraceLog information.

    You will see that blocking takes place with attribute "n" having the value '1' at the point in time (guard on when n=n). It seems that in the "say" statement the value of the attribute "n" does not refer to the now current value of that attribute, if it got increased in another thread.

     
  • Per Olov Jonsson

    This is how it looks like on an Intel Mac running Sequoia

    po@POs-16-Core-Pro Downloads % rexx test
    n 0
    n 1
    n 1
    n 2
    n 1
    n 1
    n 1
    n 1
    n 1
    n 5
    po@POs-16-Core-Pro Downloads %

     
    • Rony G. Flatscher

      Running it on Windows with 5.2 yields:

      n 0
      n 1
      n 1
      n 1
      n 1
      n 1
      n 1
      n 1
      n 1
      n 1
      

      Adding as the first line ".traceObject~option='F'" and as the last line "::options trace r" yields:

           1 *-* .traceObject~option="F"
      [R1   T1   I1   ]                       3 *-* use arg n = 10
      [R1   T1   I1   ]                         >>>   "10"
      [R1   T1   I1   ]                       4 *-* b = .Buffer~new
      [R1   T1   I2    Gu A1    L0     ]        >I> Method "INIT" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T1   I2    G  A1    L1   * ]     13 *-* expose n
      [R1   T1   I2    G  A1    L1   * ]     14 *-* n = 0
      [R1   T1   I2    G  A1    L1   * ]        >>>   "0"
      [R1   T1   I2    Gu A1    L0     ]        <I< Method "INIT" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T1   I1   ]                         >>>   "a BUFFER"
      [R1   T1   I1   ]                       5 *-* append = .Message~new(b, "ADD")
      [R1   T1   I1   ]                         >>>   "a Message"
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T1   I1   ]                         >K>   "FOR" => "10"
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T1   I1   ]                       8 *-* end
      [R1   T2   I3    U  A1    L0     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T2   I3    U  A1    L0     ]     17 *-* expose n
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T2   I3    U  A1    L0     ]     18 *-* guard on when n = n
      [R1   T1   I1   ]                       8 *-* end
      [R1   T3   I4    U  A1    L0     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T2   I3    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T3   I4    U  A1    L1     ]     17 *-* expose n
      [R1   T2   I3    Ug A1    L1   * ]     19 *-* say "n" n
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T3   I4    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T2   I3    Ug A1    L1   * ]        >>>   "n 0"
      n 0[R1   T1   I1   ]                       8 *-* end
      
      [R1   T4   I5    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T2   I3    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T4   I5    U  A1    L1     ]     17 *-* expose n
      [R1   T2   I3    Ug A1    L1   * ]        >>>   "1"
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T4   I5    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T2   I3    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T3   I4    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T1   I1   ]                       8 *-* end
      [R1   T5   I6    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T3   I4    Ug A1    L1   * ]     19 *-* say "n" n
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T5   I6    U  A1    L1     ]     17 *-* expose n
      [R1   T3   I4    Ug A1    L1   * ]        >>>   "n 1"
      n 1
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T5   I6    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T3   I4    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T1   I1   ]                       8 *-* end
      [R1   T2   I7    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T3   I4    Ug A1    L1   * ]        >>>   "2"
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T2   I7    U  A1    L1     ]     17 *-* expose n
      [R1   T3   I4    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T4   I5    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T5   I6    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T2   I7    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T4   I5    Ug A1    L1   * ]     19 *-* say "n" n
      [R1   T5   I6    Ug A1    L1   * ]     19 *-* say "n" n
      [R1   T1   I1   ]                       8 *-* end
      [R1   T3   I8    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T4   I5    Ug A1    L1   * ]        >>>   "n 2"
      n 2[R1   T5   I6    Ug A1    L1   * ]        >>>   "n 2"
      
      n 2
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T3   I8    U  A1    L1     ]     17 *-* expose n
      [R1   T4   I5    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T5   I6    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T3   I8    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T4   I5    Ug A1    L1   * ]        >>>   "3"
      [R1   T5   I6    Ug A1    L1   * ]        >>>   "3"
      [R1   T1   I1   ]                       8 *-* end
      [R1   T3   I8    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T2   I7    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T6   I9    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T4   I5    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T2   I7    Ug A1    L1   * ]     19 *-* say "n" n
      [R1   T3   I8    Ug A1    L1   * ]     19 *-* say "n" n
      [R1   T5   I6    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T3   I8    Ug A1    L1   * ]        >>>   "n 3"
      [R1   T1   I1   ]                       6 *-* do nn 3
      
      [R1   T2   I7    Ug A1    L1   * ]        >>>   "n 3"
      n 3
      [R1   T6   I9    U  A1    L1     ]     17 *-* expose n
      [R1   T2   I7    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T3   I8    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T6   I9    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T2   I7    Ug A1    L1   * ]        >>>   "4"
      [R1   T1   I1   ]                       8 *-* end
      [R1   T3   I8    Ug A1    L1   * ]        >>>   "4"
      [R1   T4   I10   U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T3   I8    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T6   I9    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T2   I7    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T6   I9    Ug A1    L1   * ]     19 *-* say "n" n
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T4   I10   U  A1    L1     ]     17 *-* expose n
      [R1   T6   I9    Ug A1    L1   * ]        >>>   "n 4"
      n 4[R1   T1   I1   ]                       7 *-*   append~reply
      
      [R1   T4   I10   U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T6   I9    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T1   I1   ]                       8 *-* end
      [R1   T5   I11   U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T6   I9    Ug A1    L1   * ]        >>>   "5"
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T5   I11   U  A1    L1     ]     17 *-* expose n
      [R1   T6   I9    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T4   I10   Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T5   I11   U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T4   I10   Ug A1    L1   * ]     19 *-* say "n" n
      [R1   T1   I1   ]                       8 *-* end
      [R1   T3   I12   U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T4   I10   Ug A1    L1   * ]        >>>   "n 5"
      n 5[R1   T1   I1   ]                       6 *-* do n
      
      [R1   T3   I12   U  A1    L1     ]     17 *-* expose n
      [R1   T4   I10   Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T3   I12   U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T4   I10   Ug A1    L1   * ]        >>>   "6"
      [R1   T4   I10   U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T5   I11   Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T3   I12   Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T5   I11   Ug A1    L1   * ]     19 *-* say "n" n
      [R1   T3   I12   Ug A1    L1   * ]     19 *-* say "n" n
      [R1   T5   I11   Ug A1    L1   * ]        >>>   "n 6"
      n 6
      [R1   T3   I12   Ug A1    L1   * ]        >>>   "n 6"
      n 6
      [R1   T5   I11   Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T3   I12   Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T5   I11   Ug A1    L1   * ]        >>>   "7"
      [R1   T3   I12   Ug A1    L1   * ]        >>>   "7"
      [R1   T5   I11   U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T3   I12   U  A1    L0     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      
       
  • Rony G. Flatscher

    Changing the program a little bit:

    .traceObject~option="F"
    
    use arg n = 10
    b = .Buffer~new
    append = .Message~new(b, "ADD")
    do n
      append~reply
    end
    
    ::class Buffer
    
    ::method init
      expose n
      n = 0
    
    ::method add unguarded
      expose n
      guard on when n = n
      say ".line=".line":" "n" n
      n = n + 1
      say ".line=".line":" "n" n "(after adding 1)"
    
    -- ::options trace r
    

    yields:

    .line=19: n 0
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=21: n 1 (after adding 1)
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=21: n 2 (after adding 1)
    .line=21: n 3 (after adding 1)
    .line=21: n 9 (after adding 1)
    .line=21: n 4 (after adding 1)
    .line=21: n 5 (after adding 1)
    .line=21: n 7 (after adding 1)
    .line=21: n 6 (after adding 1)
    .line=21: n 10 (after adding 1)
    .line=21: n 8 (after adding 1)
    
     
    • Rony G. Flatscher

      Uncommenting the ::options directive to get trace r yields:

           1 *-* .traceObject~option="F"
      [R1   T1   I1   ]                       3 *-* use arg n = 10
      [R1   T1   I1   ]                         >>>   "10"
      [R1   T1   I1   ]                       4 *-* b = .Buffer~new
      [R1   T1   I2    Gu A1    L0     ]        >I> Method "INIT" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T1   I2    G  A1    L1   * ]     13 *-* expose n
      [R1   T1   I2    G  A1    L1   * ]     14 *-* n = 0
      [R1   T1   I2    G  A1    L1   * ]        >>>   "0"
      [R1   T1   I2    Gu A1    L0     ]        <I< Method "INIT" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T1   I1   ]                         >>>   "a BUFFER"
      [R1   T1   I1   ]                       5 *-* append = .Message~new(b, "ADD")
      [R1   T1   I1   ]                         >>>   "a Message"
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T1   I1   ]                         >K>   "FOR" => "10"
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T1   I1   ]                       8 *-* end
      [R1   T2   I3    U  A1    L0     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T2   I3    U  A1    L0     ]     17 *-* expose n
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T2   I3    U  A1    L0     ]     18 *-* guard on when n = n
      [R1   T1   I1   ]                       8 *-* end
      [R1   T3   I4    U  A1    L0     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T2   I3    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T3   I4    U  A1    L1     ]     17 *-* expose n
      [R1   T2   I3    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T3   I4    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T2   I3    Ug A1    L1   * ]        >>>   ".line=19: n 0"
      .line=19: n 0
      [R1   T1   I1   ]                       8 *-* end
      [R1   T4   I5    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T2   I3    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T4   I5    U  A1    L1     ]     17 *-* expose n
      [R1   T2   I3    Ug A1    L1   * ]        >>>   "1"
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T4   I5    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T2   I3    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
      [R1   T3   I4    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T1   I1   ]                       8 *-* end
      [R1   T5   I6    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T2   I3    Ug A1    L1   * ]        >>>   ".line=21: n 1 (after adding 1)"
      .line=21: n 1 (after adding 1)
      [R1   T3   I4    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T5   I6    U  A1    L1     ]     17 *-* expose n
      [R1   T2   I3    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T3   I4    Ug A1    L1   * ]        >>>   ".line=19: n 1"
      .line=19: n 1[R1   T1   I1   ]                       7 *-*   append~reply
      
      [R1   T5   I6    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T3   I4    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T1   I1   ]                       8 *-* end
      [R1   T2   I7    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T3   I4    Ug A1    L1   * ]        >>>   "2"
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T2   I7    U  A1    L1     ]     17 *-* expose n
      [R1   T3   I4    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
      [R1   T4   I5    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T5   I6    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T2   I7    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T3   I4    Ug A1    L1   * ]        >>>   ".line=21: n 2 (after adding 1)"
      .line=21: n 2 (after adding 1)
      [R1   T4   I5    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
      [R1   T5   I6    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
      [R1   T1   I1   ]                       8 *-* end
      [R1   T6   I8    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T3   I4    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T4   I5    Ug A1    L1   * ]        >>>   ".line=19: n 2"
      .line=19: n 2[R1   T5   I6    Ug A1    L1   * ]        >>>   ".line=19: n 2"
      
      [R1   T1   I1   ]                       6 *-* do n.line=19: n 2
      
      [R1   T6   I8    U  A1    L1     ]     17 *-* expose n
      [R1   T4   I5    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T5   I6    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T6   I8    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T4   I5    Ug A1    L1   * ]        >>>   "3"
      [R1   T1   I1   ]                       8 *-* end
      [R1   T3   I9    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T5   I6    Ug A1    L1   * ]        >>>   "3"
      [R1   T4   I5    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
      [R1   T6   I8    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T2   I7    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T3   I9    U  A1    L1     ]     17 *-* expose n
      [R1   T5   I6    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
      [R1   T4   I5    Ug A1    L1   * ]        >>>   ".line=21: n 3 (after adding 1)"
      .line=21: n 3 (after adding 1)
      [R1   T6   I8    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
      [R1   T5   I6    Ug A1    L1   * ]        >>>   ".line=21: n 3 (after adding 1)"
      .line=21: n 3 (after adding 1)[R1   T2   I7    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
      
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T3   I9    U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T5   I6    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T4   I5    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T6   I8    Ug A1    L1   * ]        >>>   ".line=19: n 3"
      .line=19: n 3
      [R1   T2   I7    Ug A1    L1   * ]        >>>   ".line=19: n 3"
      .line=19: n 3
      [R1   T1   I1   ]                       8 *-* end
      [R1   T7   I10   U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T6   I8    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T2   I7    Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T7   I10   U  A1    L1     ]     17 *-* expose n
      [R1   T6   I8    Ug A1    L1   * ]        >>>   "4"
      [R1   T2   I7    Ug A1    L1   * ]        >>>   "4"
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T3   I9    Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T7   I10   U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T6   I8    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
      [R1   T3   I9    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
      [R1   T2   I7    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
      [R1   T1   I1   ]                       8 *-* end
      [R1   T5   I11   U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T3   I9    Ug A1    L1   * ]        >>>   ".line=19: n 4"
      .line=19: n 4[R1   T6   I8    Ug A1    L1   * ]        >>>   ".line=21: n 4 (after adding 1)"
      
      [R1   T3   I9    Ug A1    L1   * ]     20 *-* n = n + 1
      .line=21: n 4 (after adding 1)
      [R1   T2   I7    Ug A1    L1   * ]        >>>   ".line=21: n 4 (after adding 1)"
      .line=21: n 4 (after adding 1)[R1   T1   I1   ]                       6 *-* do n
      
      [R1   T3   I9    Ug A1    L1   * ]        >>>   "5"
      [R1   T5   I11   U  A1    L1     ]     17 *-* expose n
      [R1   T3   I9    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
      [R1   T6   I8    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T2   I7    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T1   I1   ]                       7 *-*   append~reply
      [R1   T7   I10   Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T5   I11   U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T3   I9    Ug A1    L1   * ]        >>>   ".line=21: n 5 (after adding 1)"
      .line=21: n 5 (after adding 1)
      [R1   T1   I1   ]                       8 *-* end
      [R1   T7   I10   Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
      [R1   T4   I12   U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T7   I10   Ug A1    L1   * ]        >>>   ".line=19: n 5"
      .line=19: n 5
      [R1   T3   I9    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T1   I1   ]                       6 *-* do n
      [R1   T4   I12   U  A1    L1     ]     17 *-* expose n
      [R1   T7   I10   Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T4   I12   U  A1    L1     ]     18 *-* guard on when n = n
      [R1   T7   I10   Ug A1    L1   * ]        >>>   "6"
      [R1   T7   I10   Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
      [R1   T5   I11   Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T4   I12   Ug A1    L1   * ]        >K>   "WHEN" => "1"
      [R1   T7   I10   Ug A1    L1   * ]        >>>   ".line=21: n 6 (after adding 1)"
      .line=21: n 6 (after adding 1)
      [R1   T5   I11   Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
      [R1   T4   I12   Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
      [R1   T7   I10   U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      [R1   T5   I11   Ug A1    L1   * ]        >>>   ".line=19: n 6"
      .line=19: n 6
      [R1   T4   I12   Ug A1    L1   * ]        >>>   ".line=19: n 6"
      .line=19: n 6
      [R1   T5   I11   Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T4   I12   Ug A1    L1   * ]     20 *-* n = n + 1
      [R1   T5   I11   Ug A1    L1   * ]        >>>   "7"
      [R1   T4   I12   Ug A1    L1   * ]        >>>   "7"
      [R1   T5   I11   Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
      [R1   T4   I12   Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
      [R1   T5   I11   Ug A1    L1   * ]        >>>   ".line=21: n 7 (after adding 1)"
      .line=21: n 7 (after adding 1)[R1   T4   I12   Ug A1    L1   * ]        >>>   ".line=21: n 7 (after adding 1)"
      
      .line=21: n 7 (after adding 1)[R1   T5   I11   U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      
      [R1   T4   I12   U  A1    L0     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
      
       
      • Rony G. Flatscher

        And here intermediate trace (::options trace i):

            1 *-* .traceObject~option="F"
               >E>   .TRACEOBJECT => "The TraceObject class"
               >L>   "F"
               >A>   "F"
        [R1   T1   I1   ]                       3 *-* use arg n = 10
        [R1   T1   I1   ]                         >L>   "10"
        [R1   T1   I1   ]                         >>>   "10"
        [R1   T1   I1   ]                         >=>   N <= "10"
        [R1   T1   I1   ]                       4 *-* b = .Buffer~new
        [R1   T1   I1   ]                         >E>   .BUFFER => "The BUFFER class"
        [R1   T1   I2    Gu A1    L0     ]        >I> Method "INIT" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T1   I2    G  A1    L1   * ]     13 *-* expose n
        [R1   T1   I2    G  A1    L1   * ]     14 *-* n = 0
        [R1   T1   I2    G  A1    L1   * ]        >L>   "0"
        [R1   T1   I2    G  A1    L1   * ]        >>>   "0"
        [R1   T1   I2    G  A1    L1   * ]        >=>   N <= "0"
        [R1   T1   I2    Gu A1    L0     ]        <I< Method "INIT" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T1   I1   ]                         >M>   "NEW" => "a BUFFER"
        [R1   T1   I1   ]                         >>>   "a BUFFER"
        [R1   T1   I1   ]                         >=>   B <= "a BUFFER"
        [R1   T1   I1   ]                       5 *-* append = .Message~new(b, "ADD")
        [R1   T1   I1   ]                         >E>   .MESSAGE => "The Message class"
        [R1   T1   I1   ]                         >V>   B => "a BUFFER"
        [R1   T1   I1   ]                         >A>   "a BUFFER"
        [R1   T1   I1   ]                         >L>   "ADD"
        [R1   T1   I1   ]                         >A>   "ADD"
        [R1   T1   I1   ]                         >M>   "NEW" => "a Message"
        [R1   T1   I1   ]                         >>>   "a Message"
        [R1   T1   I1   ]                         >=>   APPEND <= "a Message"
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T1   I1   ]                         >V>   N => "10"
        [R1   T1   I1   ]                         >K>   "FOR" => "10"
        [R1   T1   I1   ]                       7 *-*   append~reply
        [R1   T1   I1   ]                         >V>     APPEND => "a Message"
        [R1   T1   I1   ]                         >M>     "REPLY" => "a Message"
        [R1   T2   I3    U  A1    L0     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T1   I1   ]                       8 *-* end
        [R1   T2   I3    U  A1    L0     ]     17 *-* expose n
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T2   I3    U  A1    L0     ]     18 *-* guard on when n = n
        [R1   T1   I1   ]                       7 *-*   append~reply
        [R1   T2   I3    Ug A1    L1   * ]        >V>   N => "0"
        [R1   T1   I1   ]                         >V>     APPEND => "a Message"
        [R1   T2   I3    Ug A1    L1   * ]        >V>   N => "0"
        [R1   T1   I1   ]                         >M>     "REPLY" => "a Message"
        [R1   T3   I4    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T2   I3    Ug A1    L1   * ]        >O>   "=" => "1"
        [R1   T1   I1   ]                       8 *-* end
        [R1   T3   I4    U  A1    L1     ]     17 *-* expose n
        [R1   T2   I3    Ug A1    L1   * ]        >K>   "WHEN" => "1"
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T3   I4    U  A1    L1     ]     18 *-* guard on when n = n
        [R1   T2   I3    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
        [R1   T1   I1   ]                       7 *-*   append~reply
        [R1   T2   I3    Ug A1    L1   * ]        >L>   ".line="
        [R1   T1   I1   ]                         >V>     APPEND => "a Message"
        [R1   T2   I3    Ug A1    L1   * ]        >E>   .LINE => "19"
        [R1   T1   I1   ]                         >M>     "REPLY" => "a Message"
        [R1   T4   I5    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T2   I3    Ug A1    L1   * ]        >O>   "" => ".line=19"
        [R1   T1   I1   ]                       8 *-* end
        [R1   T4   I5    U  A1    L1     ]     17 *-* expose n
        [R1   T2   I3    Ug A1    L1   * ]        >L>   ":"
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T4   I5    U  A1    L1     ]     18 *-* guard on when n = n
        [R1   T2   I3    Ug A1    L1   * ]        >O>   "" => ".line=19:"
        [R1   T1   I1   ]                       7 *-*   append~reply
        [R1   T2   I3    Ug A1    L1   * ]        >L>   "n"
        [R1   T1   I1   ]                         >V>     APPEND => "a Message"
        [R1   T2   I3    Ug A1    L1   * ]        >O>   " " => ".line=19: n"
        [R1   T1   I1   ]                         >M>     "REPLY" => "a Message"
        [R1   T5   I6    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T2   I3    Ug A1    L1   * ]        >V>   N => "0"
        [R1   T1   I1   ]                       8 *-* end
        [R1   T5   I6    U  A1    L1     ]     17 *-* expose n
        [R1   T2   I3    Ug A1    L1   * ]        >O>   " " => ".line=19: n 0"
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T5   I6    U  A1    L1     ]     18 *-* guard on when n = n
        [R1   T2   I3    Ug A1    L1   * ]        >>>   ".line=19: n 0"
        .line=19: n 0
        [R1   T1   I1   ]                       7 *-*   append~reply
        [R1   T2   I3    Ug A1    L1   * ]     20 *-* n = n + 1
        [R1   T1   I1   ]                         >V>     APPEND => "a Message"
        [R1   T2   I3    Ug A1    L1   * ]        >V>   N => "0"
        [R1   T1   I1   ]                         >M>     "REPLY" => "a Message"
        [R1   T6   I7    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T2   I3    Ug A1    L1   * ]        >L>   "1"
        [R1   T1   I1   ]                       8 *-* end
        [R1   T6   I7    U  A1    L1     ]     17 *-* expose n
        [R1   T2   I3    Ug A1    L1   * ]        >O>   "+" => "1"
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T6   I7    U  A1    L1     ]     18 *-* guard on when n = n
        [R1   T2   I3    Ug A1    L1   * ]        >>>   "1"
        [R1   T1   I1   ]                       7 *-*   append~reply
        [R1   T2   I3    Ug A1    L1   * ]        >=>   N <= "1"
        [R1   T6   I7    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T5   I6    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T3   I4    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T4   I5    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T1   I1   ]                         >V>     APPEND => "a Message"
        [R1   T2   I3    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
        [R1   T6   I7    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T5   I6    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T3   I4    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T4   I5    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T1   I1   ]                         >M>     "REPLY" => "a Message"
        [R1   T7   I8    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T2   I3    Ug A1    L1   * ]        >L>   ".line="
        [R1   T6   I7    Ug A1    L1   * ]        >O>   "=" => "1"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   "=" => "1"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   "=" => "1"
        [R1   T4   I5    Ug A1    L1   * ]        >O>   "=" => "1"
        [R1   T1   I1   ]                       8 *-* end
        [R1   T7   I8    U  A1    L1     ]     17 *-* expose n
        [R1   T2   I3    Ug A1    L1   * ]        >E>   .LINE => "21"
        [R1   T6   I7    Ug A1    L1   * ]        >K>   "WHEN" => "1"
        [R1   T5   I6    Ug A1    L1   * ]        >K>   "WHEN" => "1"
        [R1   T3   I4    Ug A1    L1   * ]        >K>   "WHEN" => "1"
        [R1   T4   I5    Ug A1    L1   * ]        >K>   "WHEN" => "1"
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T7   I8    U  A1    L1     ]     18 *-* guard on when n = n
        [R1   T2   I3    Ug A1    L1   * ]        >O>   "" => ".line=21"
        [R1   T6   I7    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
        [R1   T5   I6    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
        [R1   T3   I4    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
        [R1   T4   I5    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
        [R1   T1   I1   ]                       7 *-*   append~reply
        [R1   T2   I3    Ug A1    L1   * ]        >L>   ":"
        [R1   T6   I7    Ug A1    L1   * ]        >L>   ".line="
        [R1   T5   I6    Ug A1    L1   * ]        >L>   ".line="
        [R1   T3   I4    Ug A1    L1   * ]        >L>   ".line="
        [R1   T4   I5    Ug A1    L1   * ]        >L>   ".line="
        [R1   T1   I1   ]                         >V>     APPEND => "a Message"
        [R1   T2   I3    Ug A1    L1   * ]        >O>   "" => ".line=21:"
        [R1   T6   I7    Ug A1    L1   * ]        >E>   .LINE => "19"
        [R1   T5   I6    Ug A1    L1   * ]        >E>   .LINE => "19"
        [R1   T3   I4    Ug A1    L1   * ]        >E>   .LINE => "19"
        [R1   T4   I5    Ug A1    L1   * ]        >E>   .LINE => "19"
        [R1   T1   I1   ]                         >M>     "REPLY" => "a Message"
        [R1   T8   I9    U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T2   I3    Ug A1    L1   * ]        >L>   "n"
        [R1   T6   I7    Ug A1    L1   * ]        >O>   "" => ".line=19"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   "" => ".line=19"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   "" => ".line=19"
        [R1   T4   I5    Ug A1    L1   * ]        >O>   "" => ".line=19"
        [R1   T1   I1   ]                       8 *-* end
        [R1   T8   I9    U  A1    L1     ]     17 *-* expose n
        [R1   T2   I3    Ug A1    L1   * ]        >O>   " " => ".line=21: n"
        [R1   T6   I7    Ug A1    L1   * ]        >L>   ":"
        [R1   T5   I6    Ug A1    L1   * ]        >L>   ":"
        [R1   T3   I4    Ug A1    L1   * ]        >L>   ":"
        [R1   T4   I5    Ug A1    L1   * ]        >L>   ":"
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T8   I9    U  A1    L1     ]     18 *-* guard on when n = n
        [R1   T2   I3    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T6   I7    Ug A1    L1   * ]        >O>   "" => ".line=19:"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   "" => ".line=19:"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   "" => ".line=19:"
        [R1   T4   I5    Ug A1    L1   * ]        >O>   "" => ".line=19:"
        [R1   T1   I1   ]                       7 *-*   append~reply
        [R1   T2   I3    Ug A1    L1   * ]        >O>   " " => ".line=21: n 1"
        [R1   T6   I7    Ug A1    L1   * ]        >L>   "n"
        [R1   T5   I6    Ug A1    L1   * ]        >L>   "n"
        [R1   T3   I4    Ug A1    L1   * ]        >L>   "n"
        [R1   T4   I5    Ug A1    L1   * ]        >L>   "n"
        [R1   T1   I1   ]                         >V>     APPEND => "a Message"
        [R1   T2   I3    Ug A1    L1   * ]        >L>   "(after adding 1)"
        [R1   T6   I7    Ug A1    L1   * ]        >O>   " " => ".line=19: n"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   " " => ".line=19: n"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   " " => ".line=19: n"
        [R1   T4   I5    Ug A1    L1   * ]        >O>   " " => ".line=19: n"
        [R1   T1   I1   ]                         >M>     "REPLY" => "a Message"
        [R1   T9   I10   U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T2   I3    Ug A1    L1   * ]        >O>   " " => ".line=21: n 1 (after adding 1)"
        [R1   T6   I7    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T5   I6    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T3   I4    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T4   I5    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T1   I1   ]                       8 *-* end
        [R1   T9   I10   U  A1    L1     ]     17 *-* expose n
        [R1   T2   I3    Ug A1    L1   * ]        >>>   ".line=21: n 1 (after adding 1)"
        .line=21: n 1 (after adding 1)
        [R1   T6   I7    Ug A1    L1   * ]        >O>   " " => ".line=19: n 1"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   " " => ".line=19: n 1"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   " " => ".line=19: n 1"
        [R1   T3   I4    Ug A1    L1   * ]        >>>   ".line=19: n 1"
        .line=19: n 1
        [R1   T4   I5    Ug A1    L1   * ]        >O>   " " => ".line=19: n 1"
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T9   I10   U  A1    L1     ]     18 *-* guard on when n = n
        [R1   T2   I3    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T6   I7    Ug A1    L1   * ]        >>>   ".line=19: n 1"
        .line=19: n 1
        [R1   T5   I6    Ug A1    L1   * ]        >>>   ".line=19: n 1"
        .line=19: n 1
        [R1   T3   I4    Ug A1    L1   * ]     20 *-* n = n + 1
        [R1   T4   I5    Ug A1    L1   * ]        >>>   ".line=19: n 1"
        .line=19: n 1
        [R1   T1   I1   ]                       7 *-*   append~reply
        [R1   T6   I7    Ug A1    L1   * ]     20 *-* n = n + 1
        [R1   T5   I6    Ug A1    L1   * ]     20 *-* n = n + 1
        [R1   T3   I4    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T4   I5    Ug A1    L1   * ]     20 *-* n = n + 1
        [R1   T1   I1   ]                         >V>     APPEND => "a Message"
        [R1   T6   I7    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T5   I6    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T3   I4    Ug A1    L1   * ]        >L>   "1"
        [R1   T4   I5    Ug A1    L1   * ]        >V>   N => "1"
        [R1   T1   I1   ]                         >M>     "REPLY" => "a Message"
        [R1   T2   I11   U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T6   I7    Ug A1    L1   * ]        >L>   "1"
        [R1   T5   I6    Ug A1    L1   * ]        >L>   "1"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   "+" => "2"
        [R1   T4   I5    Ug A1    L1   * ]        >L>   "1"
        [R1   T1   I1   ]                       8 *-* end
        [R1   T2   I11   U  A1    L1     ]     17 *-* expose n
        [R1   T6   I7    Ug A1    L1   * ]        >O>   "+" => "2"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   "+" => "2"
        [R1   T3   I4    Ug A1    L1   * ]        >>>   "2"
        [R1   T4   I5    Ug A1    L1   * ]        >O>   "+" => "2"
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T2   I11   U  A1    L1     ]     18 *-* guard on when n = n
        [R1   T6   I7    Ug A1    L1   * ]        >>>   "2"
        [R1   T7   I8    Ug A1    L1   * ]        >V>   N => "2"
        [R1   T5   I6    Ug A1    L1   * ]        >>>   "2"
        [R1   T8   I9    Ug A1    L1   * ]        >V>   N => "2"
        [R1   T9   I10   Ug A1    L1   * ]        >V>   N => "2"
        [R1   T7   I8    Ug A1    L1   * ]        >V>   N => "2"
        [R1   T3   I4    Ug A1    L1   * ]        >=>   N <= "2"
        [R1   T9   I10   Ug A1    L1   * ]        >V>   N => "2"
        [R1   T2   I11   Ug A1    L1   * ]        >V>   N => "2"
        [R1   T4   I5    Ug A1    L1   * ]        >>>   "2"
        [R1   T6   I7    Ug A1    L1   * ]        >=>   N <= "2"
        [R1   T2   I11   Ug A1    L1   * ]        >V>   N => "2"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   "=" => "1"
        [R1   T7   I8    Ug A1    L1   * ]        >O>   "=" => "1"
        [R1   T5   I6    Ug A1    L1   * ]        >=>   N <= "2"
        [R1   T1   I1   ]                       7 *-*   append~reply
        [R1   T7   I8    Ug A1    L1   * ]        >K>   "WHEN" => "1"
        [R1   T3   I4    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
        [R1   T9   I10   Ug A1    L1   * ]        >K>   "WHEN" => "1"
        [R1   T2   I11   Ug A1    L1   * ]        >O>   "=" => "1"
        [R1   T4   I5    Ug A1    L1   * ]        >=>   N <= "2"
        [R1   T6   I7    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
        [R1   T8   I9    Ug A1    L1   * ]        >V>   N => "2"
        [R1   T2   I11   Ug A1    L1   * ]        >K>   "WHEN" => "1"
        [R1   T9   I10   Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
        [R1   T5   I6    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
        [R1   T1   I1   ]                         >V>     APPEND => "a Message"
        [R1   T7   I8    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
        [R1   T3   I4    Ug A1    L1   * ]        >L>   ".line="
        [R1   T9   I10   Ug A1    L1   * ]        >L>   ".line="
        [R1   T2   I11   Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
        [R1   T4   I5    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
        [R1   T8   I9    Ug A1    L1   * ]        >O>   "=" => "1"
        [R1   T6   I7    Ug A1    L1   * ]        >L>   ".line="
        [R1   T2   I11   Ug A1    L1   * ]        >L>   ".line="
        [R1   T9   I10   Ug A1    L1   * ]        >E>   .LINE => "19"
        [R1   T5   I6    Ug A1    L1   * ]        >L>   ".line="
        [R1   T10  I12   U  A1    L1     ]        >I> Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T7   I8    Ug A1    L1   * ]        >L>   ".line="
        [R1   T3   I4    Ug A1    L1   * ]        >E>   .LINE => "21"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   "" => ".line=19"
        [R1   T2   I11   Ug A1    L1   * ]        >E>   .LINE => "19"
        [R1   T4   I5    Ug A1    L1   * ]        >L>   ".line="
        [R1   T1   I1   ]                         >M>     "REPLY" => "a Message"
        [R1   T8   I9    Ug A1    L1   * ]        >K>   "WHEN" => "1"
        [R1   T6   I7    Ug A1    L1   * ]        >E>   .LINE => "21"
        [R1   T2   I11   Ug A1    L1   * ]        >O>   "" => ".line=19"
        [R1   T9   I10   Ug A1    L1   * ]        >L>   ":"
        [R1   T5   I6    Ug A1    L1   * ]        >E>   .LINE => "21"
        [R1   T10  I12   U  A1    L1     ]     17 *-* expose n
        [R1   T7   I8    Ug A1    L1   * ]        >E>   .LINE => "19"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   "" => ".line=19:"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   "" => ".line=21"
        [R1   T4   I5    Ug A1    L1   * ]        >E>   .LINE => "21"
        [R1   T1   I1   ]                       8 *-* end
        [R1   T2   I11   Ug A1    L1   * ]        >L>   ":"
        [R1   T8   I9    Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
        [R1   T2   I11   Ug A1    L1   * ]        >O>   "" => ".line=19:"
        [R1   T6   I7    Ug A1    L1   * ]        >O>   "" => ".line=21"
        [R1   T9   I10   Ug A1    L1   * ]        >L>   "n"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   "" => ".line=21"
        [R1   T10  I12   U  A1    L1     ]     18 *-* guard on when n = n
        [R1   T7   I8    Ug A1    L1   * ]        >O>   "" => ".line=19"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   " " => ".line=19: n"
        [R1   T3   I4    Ug A1    L1   * ]        >L>   ":"
        [R1   T4   I5    Ug A1    L1   * ]        >O>   "" => ".line=21"
        [R1   T1   I1   ]                       6 *-* do n
        [R1   T8   I9    Ug A1    L1   * ]        >L>   ".line="
        [R1   T2   I11   Ug A1    L1   * ]        >L>   "n"
        [R1   T6   I7    Ug A1    L1   * ]        >L>   ":"
        [R1   T9   I10   Ug A1    L1   * ]        >V>   N => "2"
        [R1   T5   I6    Ug A1    L1   * ]        >L>   ":"
        [R1   T7   I8    Ug A1    L1   * ]        >L>   ":"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   " " => ".line=19: n 2"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   "" => ".line=21:"
        [R1   T4   I5    Ug A1    L1   * ]        >L>   ":"
        [R1   T8   I9    Ug A1    L1   * ]        >E>   .LINE => "19"
        [R1   T2   I11   Ug A1    L1   * ]        >O>   " " => ".line=19: n"
        [R1   T6   I7    Ug A1    L1   * ]        >O>   "" => ".line=21:"
        [R1   T9   I10   Ug A1    L1   * ]        >>>   ".line=19: n 2"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   "" => ".line=21:".line=19: n 2
        
        [R1   T7   I8    Ug A1    L1   * ]        >O>   "" => ".line=19:"
        [R1   T9   I10   Ug A1    L1   * ]     20 *-* n = n + 1
        [R1   T3   I4    Ug A1    L1   * ]        >L>   "n"
        [R1   T4   I5    Ug A1    L1   * ]        >O>   "" => ".line=21:"
        [R1   T8   I9    Ug A1    L1   * ]        >O>   "" => ".line=19"
        [R1   T2   I11   Ug A1    L1   * ]        >V>   N => "2"
        [R1   T6   I7    Ug A1    L1   * ]        >L>   "n"
        [R1   T5   I6    Ug A1    L1   * ]        >L>   "n"
        [R1   T7   I8    Ug A1    L1   * ]        >L>   "n"
        [R1   T9   I10   Ug A1    L1   * ]        >V>   N => "2"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   " " => ".line=21: n"
        [R1   T4   I5    Ug A1    L1   * ]        >L>   "n"
        [R1   T8   I9    Ug A1    L1   * ]        >L>   ":"
        [R1   T2   I11   Ug A1    L1   * ]        >O>   " " => ".line=19: n 2"
        [R1   T6   I7    Ug A1    L1   * ]        >O>   " " => ".line=21: n"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   " " => ".line=21: n"
        [R1   T7   I8    Ug A1    L1   * ]        >O>   " " => ".line=19: n"
        [R1   T9   I10   Ug A1    L1   * ]        >L>   "1"
        [R1   T3   I4    Ug A1    L1   * ]        >V>   N => "2"
        [R1   T4   I5    Ug A1    L1   * ]        >O>   " " => ".line=21: n"
        [R1   T8   I9    Ug A1    L1   * ]        >O>   "" => ".line=19:"
        [R1   T2   I11   Ug A1    L1   * ]        >>>   ".line=19: n 2"
        .line=19: n 2
        [R1   T6   I7    Ug A1    L1   * ]        >V>   N => "2"
        [R1   T5   I6    Ug A1    L1   * ]        >V>   N => "2"
        [R1   T7   I8    Ug A1    L1   * ]        >V>   N => "2"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   "+" => "3"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   " " => ".line=21: n 2"
        [R1   T4   I5    Ug A1    L1   * ]        >V>   N => "2"
        [R1   T8   I9    Ug A1    L1   * ]        >L>   "n"
        [R1   T2   I11   Ug A1    L1   * ]     20 *-* n = n + 1
        [R1   T6   I7    Ug A1    L1   * ]        >O>   " " => ".line=21: n 2"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   " " => ".line=21: n 2"
        [R1   T7   I8    Ug A1    L1   * ]        >O>   " " => ".line=19: n 2"
        [R1   T9   I10   Ug A1    L1   * ]        >>>   "3"
        [R1   T3   I4    Ug A1    L1   * ]        >L>   "(after adding 1)"
        [R1   T4   I5    Ug A1    L1   * ]        >O>   " " => ".line=21: n 2"
        [R1   T8   I9    Ug A1    L1   * ]        >O>   " " => ".line=19: n"
        [R1   T2   I11   Ug A1    L1   * ]        >V>   N => "2"
        [R1   T6   I7    Ug A1    L1   * ]        >L>   "(after adding 1)"
        [R1   T5   I6    Ug A1    L1   * ]        >L>   "(after adding 1)"
        [R1   T7   I8    Ug A1    L1   * ]        >>>   ".line=19: n 2"
        .line=19: n 2[R1   T9   I10   Ug A1    L1   * ]        >=>   N <= "3"
        
        [R1   T10  I12   Ug A1    L1   * ]        >V>   N => "3"
        [R1   T3   I4    Ug A1    L1   * ]        >O>   " " => ".line=21: n 2 (after adding 1)"
        [R1   T4   I5    Ug A1    L1   * ]        >L>   "(after adding 1)"
        [R1   T8   I9    Ug A1    L1   * ]        >V>   N => "3"
        [R1   T2   I11   Ug A1    L1   * ]        >L>   "1"
        [R1   T6   I7    Ug A1    L1   * ]        >O>   " " => ".line=21: n 2 (after adding 1)"
        [R1   T5   I6    Ug A1    L1   * ]        >O>   " " => ".line=21: n 2 (after adding 1)"
        [R1   T7   I8    Ug A1    L1   * ]     20 *-* n = n + 1
        [R1   T9   I10   Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
        [R1   T10  I12   Ug A1    L1   * ]        >V>   N => "3"
        [R1   T3   I4    Ug A1    L1   * ]        >>>   ".line=21: n 2 (after adding 1)"
        .line=21: n 2 (after adding 1)
        [R1   T4   I5    Ug A1    L1   * ]        >O>   " " => ".line=21: n 2 (after adding 1)"
        [R1   T8   I9    Ug A1    L1   * ]        >O>   " " => ".line=19: n 3"
        [R1   T2   I11   Ug A1    L1   * ]        >O>   "+" => "3"
        [R1   T6   I7    Ug A1    L1   * ]        >>>   ".line=21: n 2 (after adding 1)"
        .line=21: n 2 (after adding 1)
        [R1   T5   I6    Ug A1    L1   * ]        >>>   ".line=21: n 2 (after adding 1)"
        .line=21: n 2 (after adding 1)
        [R1   T7   I8    Ug A1    L1   * ]        >V>   N => "3"
        [R1   T6   I7    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T9   I10   Ug A1    L1   * ]        >L>   ".line="
        [R1   T10  I12   Ug A1    L1   * ]        >O>   "=" => "1"
        [R1   T3   I4    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T4   I5    Ug A1    L1   * ]        >>>   ".line=21: n 2 (after adding 1)"
        [R1   T8   I9    Ug A1    L1   * ]        >>>   ".line=19: n 3".line=21: n 2 (after adding 1)
        
        [R1   T2   I11   Ug A1    L1   * ]        >>>   "3"
        .line=19: n 3[R1   T7   I8    Ug A1    L1   * ]        >L>   "1"
        
        [R1   T10  I12   Ug A1    L1   * ]        >K>   "WHEN" => "1"
        [R1   T5   I6    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T7   I8    Ug A1    L1   * ]        >O>   "+" => "4"
        [R1   T9   I10   Ug A1    L1   * ]        >E>   .LINE => "21"
        [R1   T10  I12   Ug A1    L1   * ]     19 *-* say ".line=".line":" "n" n
        [R1   T4   I5    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T2   I11   Ug A1    L1   * ]        >=>   N <= "3"
        [R1   T8   I9    Ug A1    L1   * ]     20 *-* n = n + 1
        [R1   T10  I12   Ug A1    L1   * ]        >L>   ".line="
        [R1   T7   I8    Ug A1    L1   * ]        >>>   "4"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   "" => ".line=21"
        [R1   T10  I12   Ug A1    L1   * ]        >E>   .LINE => "19"
        [R1   T2   I11   Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
        [R1   T8   I9    Ug A1    L1   * ]        >V>   N => "3"
        [R1   T10  I12   Ug A1    L1   * ]        >O>   "" => ".line=19"
        [R1   T7   I8    Ug A1    L1   * ]        >=>   N <= "4"
        [R1   T9   I10   Ug A1    L1   * ]        >L>   ":"
        [R1   T10  I12   Ug A1    L1   * ]        >L>   ":"
        [R1   T2   I11   Ug A1    L1   * ]        >L>   ".line="
        [R1   T8   I9    Ug A1    L1   * ]        >L>   "1"
        [R1   T10  I12   Ug A1    L1   * ]        >O>   "" => ".line=19:"
        [R1   T7   I8    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   "" => ".line=21:"
        [R1   T10  I12   Ug A1    L1   * ]        >L>   "n"
        [R1   T2   I11   Ug A1    L1   * ]        >E>   .LINE => "21"
        [R1   T8   I9    Ug A1    L1   * ]        >O>   "+" => "4"
        [R1   T10  I12   Ug A1    L1   * ]        >O>   " " => ".line=19: n"
        [R1   T7   I8    Ug A1    L1   * ]        >L>   ".line="
        [R1   T9   I10   Ug A1    L1   * ]        >L>   "n"
        [R1   T10  I12   Ug A1    L1   * ]        >V>   N => "4"
        [R1   T2   I11   Ug A1    L1   * ]        >O>   "" => ".line=21"
        [R1   T8   I9    Ug A1    L1   * ]        >>>   "4"
        [R1   T10  I12   Ug A1    L1   * ]        >O>   " " => ".line=19: n 4"
        [R1   T7   I8    Ug A1    L1   * ]        >E>   .LINE => "21"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   " " => ".line=21: n"
        [R1   T10  I12   Ug A1    L1   * ]        >>>   ".line=19: n 4"
        [R1   T2   I11   Ug A1    L1   * ]        >L>   ":".line=19: n 4
        
        [R1   T8   I9    Ug A1    L1   * ]        >=>   N <= "4"
        [R1   T10  I12   Ug A1    L1   * ]     20 *-* n = n + 1
        [R1   T7   I8    Ug A1    L1   * ]        >O>   "" => ".line=21"
        [R1   T9   I10   Ug A1    L1   * ]        >V>   N => "4"
        [R1   T10  I12   Ug A1    L1   * ]        >V>   N => "4"
        [R1   T2   I11   Ug A1    L1   * ]        >O>   "" => ".line=21:"
        [R1   T8   I9    Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
        [R1   T10  I12   Ug A1    L1   * ]        >L>   "1"
        [R1   T7   I8    Ug A1    L1   * ]        >L>   ":"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   " " => ".line=21: n 4"
        [R1   T10  I12   Ug A1    L1   * ]        >O>   "+" => "5"
        [R1   T2   I11   Ug A1    L1   * ]        >L>   "n"
        [R1   T8   I9    Ug A1    L1   * ]        >L>   ".line="
        [R1   T10  I12   Ug A1    L1   * ]        >>>   "5"
        [R1   T7   I8    Ug A1    L1   * ]        >O>   "" => ".line=21:"
        [R1   T9   I10   Ug A1    L1   * ]        >L>   "(after adding 1)"
        [R1   T10  I12   Ug A1    L1   * ]        >=>   N <= "5"
        [R1   T2   I11   Ug A1    L1   * ]        >O>   " " => ".line=21: n"
        [R1   T8   I9    Ug A1    L1   * ]        >E>   .LINE => "21"
        [R1   T10  I12   Ug A1    L1   * ]     21 *-* say ".line=".line":" "n" n "(after adding 1)"
        [R1   T7   I8    Ug A1    L1   * ]        >L>   "n"
        [R1   T9   I10   Ug A1    L1   * ]        >O>   " " => ".line=21: n 4 (after adding 1)"
        [R1   T10  I12   Ug A1    L1   * ]        >L>   ".line="
        [R1   T2   I11   Ug A1    L1   * ]        >V>   N => "5"
        [R1   T8   I9    Ug A1    L1   * ]        >O>   "" => ".line=21"
        [R1   T10  I12   Ug A1    L1   * ]        >E>   .LINE => "21"
        [R1   T7   I8    Ug A1    L1   * ]        >O>   " " => ".line=21: n"
        [R1   T9   I10   Ug A1    L1   * ]        >>>   ".line=21: n 4 (after adding 1)"
        [R1   T10  I12   Ug A1    L1   * ]        >O>   "" => ".line=21".line=21: n 4 (after adding 1)
        
        [R1   T2   I11   Ug A1    L1   * ]        >O>   " " => ".line=21: n 5"
        [R1   T8   I9    Ug A1    L1   * ]        >L>   ":"
        [R1   T10  I12   Ug A1    L1   * ]        >L>   ":"
        [R1   T7   I8    Ug A1    L1   * ]        >V>   N => "5"
        [R1   T10  I12   Ug A1    L1   * ]        >O>   "" => ".line=21:"
        [R1   T9   I10   U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T2   I11   Ug A1    L1   * ]        >L>   "(after adding 1)"
        [R1   T8   I9    Ug A1    L1   * ]        >O>   "" => ".line=21:"
        [R1   T7   I8    Ug A1    L1   * ]        >O>   " " => ".line=21: n 5"
        [R1   T10  I12   Ug A1    L1   * ]        >L>   "n"
        [R1   T2   I11   Ug A1    L1   * ]        >O>   " " => ".line=21: n 5 (after adding 1)"
        [R1   T8   I9    Ug A1    L1   * ]        >L>   "n"
        [R1   T7   I8    Ug A1    L1   * ]        >L>   "(after adding 1)"
        [R1   T10  I12   Ug A1    L1   * ]        >O>   " " => ".line=21: n"
        [R1   T2   I11   Ug A1    L1   * ]        >>>   ".line=21: n 5 (after adding 1)"
        .line=21: n 5 (after adding 1)
        [R1   T8   I9    Ug A1    L1   * ]        >O>   " " => ".line=21: n"
        [R1   T7   I8    Ug A1    L1   * ]        >O>   " " => ".line=21: n 5 (after adding 1)"
        [R1   T10  I12   Ug A1    L1   * ]        >V>   N => "5"
        [R1   T2   I11   U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T8   I9    Ug A1    L1   * ]        >V>   N => "5"
        [R1   T7   I8    Ug A1    L1   * ]        >>>   ".line=21: n 5 (after adding 1)"
        .line=21: n 5 (after adding 1)
        [R1   T10  I12   Ug A1    L1   * ]        >O>   " " => ".line=21: n 5"
        [R1   T8   I9    Ug A1    L1   * ]        >O>   " " => ".line=21: n 5"
        [R1   T7   I8    U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T10  I12   Ug A1    L1   * ]        >L>   "(after adding 1)"
        [R1   T8   I9    Ug A1    L1   * ]        >L>   "(after adding 1)"
        [R1   T10  I12   Ug A1    L1   * ]        >O>   " " => ".line=21: n 5 (after adding 1)"
        [R1   T8   I9    Ug A1    L1   * ]        >O>   " " => ".line=21: n 5 (after adding 1)"
        [R1   T10  I12   Ug A1    L1   * ]        >>>   ".line=21: n 5 (after adding 1)"
        .line=21: n 5 (after adding 1)
        [R1   T8   I9    Ug A1    L1   * ]        >>>   ".line=21: n 5 (after adding 1)"
        .line=21: n 5 (after adding 1)
        [R1   T10  I12   U  A1    L1     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        [R1   T8   I9    U  A1    L0     ]        <I< Method "ADD" with scope "BUFFER" in package "G:\test\orx\mt\erich\bug2003\test.rex".
        
         
  • Enrico Sorichetti

    got curious ... running Erich' s snippet I get

    [enrico@enrico-mbp zz]$rexx ze
    n 0
    n 1
    n 2
    n 2
    n 2n 2n 2

    n 4
    n 2
    n 3
    [enrico@enrico-mbp zz]$rexx ze
    n 0
    n 1
    n 2
    n 2
    n 3
    n 3
    n 3
    n 3n 3

    n 4
    [enrico@enrico-mbp zz]$rexx ze
    n 0
    n 1
    n 2
    n 2
    n 3
    n 4
    n 4
    n 5
    n 4
    n 5
    [enrico@enrico-mbp zz]$

    and running Rony' s snippet I get
    [enrico@enrico-mbp zz]$rexx zrgf
    .line=19: n 0
    .line=21: n 1 (after adding 1)
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=19: n 2
    .line=21: n 2 (after adding 1)
    .line=21: n 3 (after adding 1)
    .line=21: n 5 (after adding 1).line=19: n 3

    .line=19: n 3
    .line=21: n 4 (after adding 1).line=21: n 7 (after adding 1)

    .line=21: n 6 (after adding 1)
    .line=21: n 8 (after adding 1)
    .line=21: n 9 (after adding 1)
    .line=21: n 10 (after adding 1)
    [enrico@enrico-mbp zz]$rexx zrgf
    .line=19: n 0
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=21: n 2 (after adding 1)
    .line=19: n 2
    .line=21: n 3 (after adding 1)
    .line=21: n 4 (after adding 1)
    .line=21: n 5 (after adding 1)
    .line=19: n 5
    .line=19: n 5
    .line=19: n 5
    .line=19: n 5
    .line=21: n 5 (after adding 1)
    .line=21: n 8 (after adding 1)
    .line=21: n 6 (after adding 1)
    .line=21: n 7 (after adding 1)
    .line=21: n 9 (after adding 1)
    .line=21: n 10 (after adding 1)
    [enrico@enrico-mbp zz]$rexx zrgf
    .line=19: n 0
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=19: n 1
    .line=21: n 1 (after adding 1)
    .line=19: n 1
    .line=21: n 2 (after adding 1)
    .line=19: n 4.line=19: n 3

    .line=21: n 3 (after adding 1)
    .line=21: n 4 (after adding 1)
    .line=21: n 5 (after adding 1).line=21: n 7 (after adding 1)

    .line=19: n 4
    .line=21: n 8 (after adding 1)
    .line=21: n 6 (after adding 1)
    .line=19: n 5
    .line=21: n 9 (after adding 1)
    .line=21: n 10 (after adding 1)
    [enrico@enrico-mbp zz]$

    have a nice weekend :-)
    enrico

     
  • jfaucher

    jfaucher - 2026-03-06

    Two candidate fixes provided by AI Claude Opus 4.6 Max, with the help of Josep Maria.
    Rick, please let me know if one of them is acceptable.

    Description

    The 5.0 refactoring unified waitReserve() and guardWait() onto the same guardSem, which was a reasonable simplification. But it created an invisible coupling: when a guarded variable changes value during yieldControl(), the guardPost() broadcast — intended only for GUARD WHEN expression re-evaluation — also wakes threads that are waiting to acquire the scope lock. Those threads then returned from reserve() believing they held the lock, when in fact the previous holder hadn't released it yet.

    Approach 2 (less impacting)

    The fix is just three lines changed in VariableDictionary::reserve() — moving the waitReserve() call into a do/while loop that checks whether release() has actually handed us the lock.

    Attached: bug#2003_approach2.patch
    Tests ok on macOS, Windows 11 ARM and WSL Ubuntu ARM.

    Approach 1 (add a third semaphore)

    Separate semaphores (restore 4.2 Semantics) would be a cleaner long-term solution, since the do/while still causes unnecessary wake-up cycles under contention.
    Add a third semaphore specifically for scope lock waiting. This cleanly separates the two signal paths.

    Attached: bug#2003_approach1.patch
    Tests ok on macOS, Windows 11 ARM and WSL Ubuntu ARM.

     
    👍
    1
  • jfaucher

    jfaucher - 2026-03-10

    After benchmarks, Approach 2 is abandoned.
    Approach 1 remains a candidate fix.
    The attached benchmark-v3.pdf contains the benchmark results on macOS.

    Same rexxcps results for unpatched ooRexx 5 and patched ooRexx 5.

    guard_when-5.rex is the code provided by Erich.
    guard_when-4.rex is the same code adapted for ooRexx 4.2 (no bug).

    Summary of available patches:

    bug#2003_approach1.patch    attached to the ticket
    bug#2003_approach1-v1.patch deactivate the call of reserveSem.post() in Activity::run()
    bug#2003_approach1-v2.patch lazy activation of reserveSem
    

    No significant performance gain with patch v1 and patch v2, so not attached.

     
  • jfaucher

    jfaucher - 2026-03-18

    Another benchmark is the test suite.
    Execution times may vary by several seconds between runs, but the overall trend shows no performance regression.
    Attached: durations on macOS.

     
  • jfaucher

    jfaucher - 2026-03-18
    • status: open --> pending
    • Pending work items: none --> complete
    • Group: 5.1.0 --> 5.2.0
     
  • jfaucher

    jfaucher - 2026-03-18

    Commit: [r13114]

     

    Related

    Commit: [r13114]

  • Rony G. Flatscher

    • Status: pending --> closed
     

Anonymous
Anonymous

Add attachments
Cancel





MongoDB Logo MongoDB