Re: [Oorexx-devel] StackFrame of INTERNALLCALL within a method missing target ?

2024-04-25 Thread Rony G. Flatscher

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 ?

2024-04-25 Thread Rick McGuire
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