Re: [Oorexx-devel] StackFrame of INTERNALLCALL within a method missing target ?
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 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 I3G A1L1 *] 29 *-* return hey() *[R1 T1 I4 G A2 L0 ] 33 *-* hey: [R1 T1 I4 G A2 L0 ] 34 *-* return dumpStackFrames(.context~stackframes)* [R1 T1 I3G A1L0]___ Oorexx-devel mailing list Oorexx-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/oorexx-devel
Re: [Oorexx-devel] StackFrame of INTERNALLCALL within a method missing target ?
That is correct. The stackframe is for an internal call, so it does not have a target object. Rick On Thu, Apr 25, 2024 at 6:27 AM Rony G. Flatscher 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 stackframestrace > offarr=.array~new.traceObject~collector=arr.traceObject~option='F'say > .context~nametrace all > sf1=hey()trace offsaysay "stackframes:"say sf1 > line="-"~copies(79)say line > sf2=.test~new~ohasaysay "stackframes:"say sf2say lineexithey: > return dumpStackFrames(.context~stackframes) > ::class test::method ohatrace all > return hey()trace off exithey: > 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 I3G A1L1 *] 29 *-* return hey()*[R1 T1 I4G > A2L0] 33 *-* hey: > [R1 T1 I4G A2L0] 34 *-* return > dumpStackFrames(.context~stackframes)* > [R1 T1 I3G A1L0] 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 > ___ Oorexx-devel mailing list Oorexx-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/oorexx-devel