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