While experimenting and analyzing various traces I stumbled over the following: if calling a label within a method the stackframes for the called internal routine miss the reference to the method's TARGET object (and therefore to the method and scope), rather the TARGET entry is set to .nil (which is fine for PROGRAM and ROUTINE).

Here an example program calling a label in the main program (prolog) and calling a label from within a method:

   -- test INTERNALCALL's stackframes trace off arr=.array~new 
.traceObject~collector=arr
   .traceObject~option='F' say .context~name trace all sf1=hey() trace off say say 
"stackframes:"
   say sf1 line="-"~copies(79) say line sf2=.test~new~oha say say 
"stackframes:" say sf2 say line
   exit hey: return dumpStackFrames(.context~stackframes) ::class test ::method 
oha trace all
   return hey() trace off exit hey: return 
dumpStackFrames(.context~stackframes) ::routine
   dumpStackFrames trace off use arg stackframes mb=.MutableBuffer~new do 
counter c sf over
   stackFrames call dumpSF mb, c, sf end return mb~string ::routine dumpSF 
trace off use strict arg
   mb, c, SF crlf="0d0a"x tab="09"x target=sf~target mb~append("... stackFrame # ", c, 
": ", -
   "line=", "[",sf~line, "]", " name=", "[",sf~name, "]", crlf, - tab, "type=", "[",sf~type, 
"]", "
   target=", "[",target~string, "] ", crlf, - tab, "executable~package~name=",
   "[",sf~executable~package~name, "]", crlf, - tab, "traceline=", "[", sf~traceline, 
"]", crlf,
   crlf) return ::routine pp trace off return "["arg(1)"]"

Running it yields the following output:

   [R1   T1   I1   ]                     9 *-* sf1=hey()
   [R1   T1   I2   ]                    23 *-*   hey:
   [R1   T1   I2   ]                    24 *-*   return 
dumpStackFrames(.context~stackframes)
   [R1   T1   I1   ]                    10 *-* trace off

   stackframes:
   ... stackFrame # 1: line=[24] name=[HEY]
            type=[INTERNALCALL] target=[The NIL object]
            executable~package~name=[G:\test\orx\trace\bug\test_stackframe.rex]
            traceline=[    24 *-*   return 
dumpStackFrames(.context~stackframes)]

   ... stackFrame # 2: line=[9] name=[G:\test\orx\trace\bug\test_stackframe.rex]
            type=[PROGRAM] target=[The NIL object]
            executable~package~name=[G:\test\orx\trace\bug\test_stackframe.rex]
            traceline=[     9 *-* sf1=hey()]


   
-------------------------------------------------------------------------------
   [R1   T1   I3    G A1    L1   *]     29 *-* return hey()
   *[R1 T1 I4 G A2 L0 ] 33 *-* hey: [R1 T1 I4 G A2 L0 ] 34 *-* return
   dumpStackFrames(.context~stackframes)*
   [R1   T1   I3    G A1    L0    ]        <I< Method "OHA" with scope "TEST" in package 
"G:\test\orx\trace\bug\test_stackframe.rex".

   stackframes:
   ... stackFrame # 1: line=[34] name=[HEY]
            type=[INTERNALCALL]*target=[The NIL object]*
            executable~package~name=[G:\test\orx\trace\bug\test_stackframe.rex]
            traceline=[    34 *-*   return 
dumpStackFrames(.context~stackframes)]

   ... stackFrame # 2: line=[29] name=[OHA]
            type=[METHOD]*target=[a TEST]*
            executable~package~name=[G:\test\orx\trace\bug\test_stackframe.rex]
            traceline=[    29 *-* return hey()]

   ... stackFrame # 3: line=[16] 
name=[G:\test\orx\trace\bug\test_stackframe.rex]
            type=[PROGRAM] target=[The NIL object]
            executable~package~name=[G:\test\orx\trace\bug\test_stackframe.rex]
            traceline=[    16 *-* sf2=.test~new~oha]


   
-------------------------------------------------------------------------------

The call to the label "hey" within the method reveals in full format that the attributepool id gets changed from "A1" ("a TEST" target) to "A2" ("The NIL object").

Shouldn't the TARGET entry of called labels/internal routines within a method supply the reference to the context object ("a TEST") rather than .nil ("The NIL object")?

---rony

_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to