On 25.04.2024 12:46, Rick McGuire wrote:
That is correct. The stackframe is for an internal call, so it does not have a 
target object.

Would it be possible to make the method's context available in special cases like this? (In these cases the the StackFrame EXECUTABLE entry is a method object, but the important context information like the method's name used to invoke it and the target object of that method unfortunately is currently not available.)

Would it be possible to make e.g. the method's traceentry stackframe (in which the internal label is defined and gets called) in such an INTERNALCALL stackframe available? Maybe with a name like METHODCONTEXT in case it is an INTERNALCALL with an EXECUTABLE being a method, .nil else?

---rony



On Thu, Apr 25, 2024 at 6:27 AM Rony G. Flatscher <rony.flatsc...@wu.ac.at> 
wrote:

    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