From: Rony G. F. <Ron...@wu...> - 2022-06-18 11:26:57
|
On 17.06.2022 18:20, René Jansen wrote: > Wow! +1 Very nice! ---rony >> On 17 Jun 2022, at 16:38, Marc Remes <re...@gm...> wrote: >> >> Latest push fixes access to properties >> >>> On 6/17/22 10:49, Marc Remes wrote: >>> 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 >>>> >>>> >>>> |