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