From: Marc R. <re...@gm...> - 2022-06-17 08:50:08
|
I've updated branch interactive-trace. You now have access to method variables and arguments, you can view or modify their values. Accessing properties still throws an exception. On the interactive trace *-> prompt you can now: press [Enter] to trace interactively type '=' to reinterpret current clause type '-[n]' to show previous n clause(s), shows current clause if n is absent type '+[n]' to show next n clause(s), shows next clause if n is absent type 'trace off' to stop tracing any other clause entered must be either an assignment or a SAY instruction I've turned away of touching existing code as much as possible, so albeit experimental, impact on existing code is limited to nonexistent. A sample run : << $ cat trace.nrx class trace method main(args=String[]) static say 'interactively tracing..' trace int i=0 say 'i='i do say 'Hello world'||'!'.copies(i) end trace off x=traces(9) say 'x:'x xx=traced(9) say 'xx.prop:'xx.prop loop while i < 5 trace int i=i+1 say 'i='i say 'Hello world'||'!'.copies(i) end method traces(arg=Rexx) static trace int say 'method traced called' say 'traced:'arg return arg class traced properties public prop = 9 method traced(arg=Rexx) trace int say 'prop:'prop say 'class traced constructed' say 'traced:'arg $ nrc -exec trace NetRexx portable processor 4.04-alpha build 1,558-20220616-1912 Copyright (c) RexxLA, 2011,2022. All rights reserved. Parts Copyright (c) IBM Corporation, 1995,2008. Program trace.nrx === class trace === function main(String[]) function traces(Rexx) === class traced === constructor traced(Rexx) ===== Exec: trace ===== interactively tracing.. *-> --- trace.nrx 6 *=* i=0 >v> i "0" *-> say i 0 *-> i=3 *-> say i 3 *-> 7 *=* say 'i='i >>> "i=3" i=3 *-> 8 *=* do *-> 9 *=* say 'Hello world'||'!'.copies(i) >>> "3" >>> "Hello world!!!" Hello world!!! *-> 10 *=* end *-> 11 *=* trace off *-> 25 *=* say 'method traced called' >>> "method traced called" method traced called *-> -3 method traces(arg=Rexx) static trace int say "method traced called" *-> say arg 9 *-> arg=8 *-> 26 *=* say 'traced:'arg >>> "traced:8" traced:8 *-> 27 *=* return arg >>> "8" *-> x:8 *-> 35 *=* say 'prop:'prop >>> "prop:9" prop:9 *-> 36 *=* say 'class traced constructed' >>> "class traced constructed" class traced constructed *-> -3 trace int say "prop:"prop say "class traced constructed" *-> -5 prop=9 method traced(arg=Rexx) trace int say "prop:"prop say "class traced constructed" *-> say arg 9 *-> arg=8 *-> say arg 8 *-> 37 *=* say 'traced:'arg >>> "traced:8" traced:8 *-> xx.prop:9 *-> 18 *=* i=i+1 >v> i "4" *-> 19 *=* say 'i='i >>> "i=4" i=4 *-> trace off Hello world!!!! *-> 18 *=* i=i+1 >v> i "5" *-> 19 *=* say 'i='i >>> "i=5" i=5 *-> 20 *=* say 'Hello world'||'!'.copies(i) >>> "5" >>> "Hello world!!!!!" Hello world!!!!! *-> 16 *=* loop while i < 5 >>> "0" *-> 21 *=* end *-> Processing of 'trace.nrx' complete [2 classes] >> Please test; Marc On 6/7/22 13:42, Marc Remes wrote: > I've submitted branch interactive-trace, an *experimental* *experiment* to mimic Classic Rexx interactive trace capabilities. > > The new 'TRACE INT' instruction will intercept and pause execution during interpretation and present a '*->' prompt to the user. > Pressing [Enter] will interpret next clause > Typing '=' will reinterpret current clause > Typing '?' will show usage > Typing 'TRACE OFF' will stop interactive trace and will continue normally with next clause > Typing anything else is currently 'not supported'. > > TRACE INT is only active when interpreting NetRexx code, otherwise a warning 'TRACE INT ignored when compiling' is shown. > > An example: > << > $ cat trace.nrx > > class trace > > method main(args=String[]) static > say 'interactively tracing..' > trace int > i=0 > say 'i='i > do > say 'Hello world'||'!'.copies(i) > end > trace off > loop while i < 5 > trace int > i=i+1 > say 'i='i > say 'Hello world'||'!'.copies(i) > end >>> > > Sample run: > << > $ nrc -exec trace > NetRexx portable processor 4.04-alpha build 1,400-20220530-2046 > Copyright (c) RexxLA, 2011,2022. All rights reserved. > Parts Copyright (c) IBM Corporation, 1995,2008. > Program trace.nrx > === class trace === > function main(String[]) > ===== Exec: trace ===== > interactively tracing.. > *-> > --- trace.nrx > 6 *=* i=0 > >v> i "0" > *-> > 7 *=* say 'i='i > >>> "i=0" > i=0 > *-> trace off > Hello world > *-> > 14 *=* i=i+1 > >v> i "1" > *-> trace off > i=1 > Hello world! > *-> > 14 *=* i=i+1 > >v> i "2" > *-> = > *=* i=i+1 > >v> i "3" > *-> > 15 *=* say 'i='i > >>> "i=3" > i=3 > *-> > 16 *=* say 'Hello world'||'!'.copies(i) > >>> "3" > >>> "Hello world!!!" > Hello world!!! > *-> > 12 *=* loop while i < 5 > >>> "1" > *-> trace off > *-> > 14 *=* i=i+1 > >v> i "4" > *-> trace off > i=4 > Hello world!!!! > *-> trace off > i=5 > Hello world!!!!! > Processing of 'trace.nrx' complete >>> > > Do not reinterprete a clause that changes 'level' depth: > << > $ nrc -exec trace > NetRexx portable processor 4.04-alpha build 1,400-20220530-2046 > Copyright (c) RexxLA, 2011,2022. All rights reserved. > Parts Copyright (c) IBM Corporation, 1995,2008. > Program trace.nrx > === class trace === > function main(String[]) > ===== Exec: trace ===== > interactively tracing.. > *-> > --- trace.nrx > 6 *=* i=0 > >v> i "0" > *-> > 7 *=* say 'i='i > >>> "i=0" > i=0 > *-> > 8 *=* do > *-> > 9 *=* say 'Hello world'||'!'.copies(i) > >>> "0" > >>> "Hello world" > Hello world > *-> > 10 *=* end > *-> = > *=* end > *-> = > *=* end > Exception in thread "main" java.lang.NullPointerException: Cannot read field "prev" because "<parameter1>.curlevel" is null > at org.netrexx.process.RxInterpreter.poplevel(RxInterpreter.java:1590) > at org.netrexx.process.NrEnd.interpret(NrEnd.java:174) > at org.netrexx.process.RxInterpreter.runfree(RxInterpreter.java:1314) > at org.netrexx.process.RxInterpreter.callMethod(RxInterpreter.java:1180) > at org.netrexx.process.RxInterpreter.callMethod(RxInterpreter.java:835) > at org.netrexx.process.RxTranslator.exec(RxTranslator.java:791) > at org.netrexx.process.NetRexxC.process(NetRexxC.java:536) > at org.netrexx.process.NetRexxC.main2(NetRexxC.java:345) > at org.netrexx.process.NetRexxC.main2(NetRexxC.java:324) > at org.netrexx.process.NetRexxC.main2(NetRexxC.java:320) > at org.netrexx.process.NetRexxC.main(NetRexxC.java:174) >>> > As such, the code is to be considered experimental.. > > Pressing [Enter] without interfering with execution should not have other impact than 'pausing' execution. > > Obviously, 'not supported' should be replaced by interpreting the provided 'trace' clause in the context of the current program with access to the current varpool. > Unfortunately, this is not trivial, at least with my understanding of Mike's code. > > Marc > > > > > |