#UI_ENHANCEMENT by cg
authorClaus Gittinger <cg@exept.de>
Mon, 07 May 2018 08:30:48 +0200
changeset 22754 9c5bf1789616
parent 22753 62881b8bd163
child 22755 6514a3df6a10
#UI_ENHANCEMENT by cg class: ReadEvalPrintLoop changed: #basicReadEvalPrintLoopWithInput:output:error:compiler:prompt:print: #cmd_help: #cmd_setOrClear:to: #cmd_show:
ReadEvalPrintLoop.st
--- a/ReadEvalPrintLoop.st	Mon May 07 08:17:02 2018 +0200
+++ b/ReadEvalPrintLoop.st	Mon May 07 08:30:48 2018 +0200
@@ -556,14 +556,14 @@
         packages ........... available packages to load
         all ................ all of the above
     #set/clear <flag> ... set or clear a flag
+        print .............. print return values
+        nodebug ............ no debugger on error
+        confirmdebug ....... ask for debugger on error
         trace .............. tracing execution
         timing ............. timing execution
         profiling .......... show execution profile
         chunkFormat ........ traditional bang chunk format input mode
         editor ............. command used with #edit directive
-        nodebug ............ no debugger on error
-        confirmdebugger .... ask for debugger on error
-        print .............. print return values
     #debug ................. enter a MiniDebugger
     #edit <what> ........ open an external editor 
         class .............. on a class
@@ -741,7 +741,7 @@
     ].
     self errorStream 
         showCR:'? usage: set/clear <flag>';
-        showCR:'? (<flag> must be one of: trace, times, profile, chunk, editor, nodebug, confirmdebug, print)'.
+        showCR:'? (<flag> must be one of: print, nodebug, confirmdebug, trace, times, profile, chunk, editor)'.
     self cmd_show:('flags' readStream).
 
     "Modified: / 08-11-2016 / 22:49:17 / cg"
@@ -809,14 +809,15 @@
         (showAll or:[ what startsWith:'flag' ]) ifTrue:[
             errStream cr; showCR:'Flags:'; showCR:'------'.
             errStream
+                showCR:('print:       ',self printFlag printString);
+                showCR:('nodebug:     ',self noDebugger printString);
+                showCR:('confirmdebug:',self confirmDebugger printString);
                 showCR:('trace :      ',(traceFlag ? false) printString);
                 showCR:('timing:      ',(timingFlag ? false) printString);
                 showCR:('profiling:   ',(profilingFlag ? false) printString);
                 showCR:('chunkFormat: ',(doChunkFormat ? false) printString);
                 showCR:('editor:      ',self editorCommand printString);
-                showCR:('nodebug:     ',self noDebugger printString);
-                showCR:('confirmdebug:',self confirmDebugger printString);
-                showCR:('print:       ',self printFlag printString).
+                yourself.
             ok := true.
         ].
     ].
@@ -1075,9 +1076,11 @@
         ) ifTrue:[
             "abortAll is handled, but not asked for here!!"
             AbortAllOperationRequest handle:[:ex |
+                ObjectMemory sendTraceOff.
                 error nextPutLine:('Evaluation aborted.')
             ] do:[
                 (Error, ControlInterrupt) handle:[:ex |
+                    ObjectMemory sendTraceOff.
                     prompt isNil ifTrue:[
                         ex reject
                     ].
@@ -1099,45 +1102,57 @@
                     ].
                     ex return.
                 ] do:[
-                    |value ms us|
+                    |value ms us mthd codeBlock|
+
+                    traceFlag == true ifTrue:[
+                        mthd := Compiler
+                                    compile:('[',chunk,']') forClass:nil 
+                                    inCategory:'doit' notifying:self 
+                                    install:false.
 
-                    profilingFlag == true ifTrue:[ 
-                        MessageTally spyDetailedOn:[
-                            value := (compilerClass new requestor:self) 
-                                        evaluate:chunk
-                                        compile:true.
-                        ].    
-                        (doPrint and:[self printFlag]) ifTrue:[
+                        mthd isMethod ifTrue:[
+                            codeBlock := mthd valueWithReceiver:nil arguments:nil.
+                            [
+                                ObjectMemory sendTraceOn.
+                                codeBlock value.
+                            ] ensure:[
+                                ObjectMemory sendTraceOff.
+                            ]
+                        ].
+                    ] ifFalse:[
+                        profilingFlag == true ifTrue:[ 
+                            MessageTally spyDetailedOn:[
+                                value := (compilerClass new requestor:self) 
+                                            evaluate:chunk
+                                            compile:true.
+                            ].    
+                        ] ifFalse:[    
+                            us := Time microsecondsToRun:[
+                                value := (compilerClass new requestor:self)
+                                            evaluate:chunk compile:true.
+                            ].
+
+                            timingFlag == true ifTrue:[
+                                'execution time: ' printOn:error.
+                                us < 1000 ifTrue:[
+                                    us < 1 ifTrue:[
+                                        'too small to measure (<1us)' printOn:error.
+                                    ] ifFalse:[
+                                        us printOn:output. 'us' printOn:error.
+                                    ]
+                                ] ifFalse:[
+                                    ((us / 1000) asFixedPoint:2) printOn:output. 'ms' printOn:error.
+                                ].
+                                error cr.
+                            ].
+                        ].
+                    ].
+                    (doPrint and:[self printFlag]) ifTrue:[
+                        value isVoid ifFalse:[
                             '-> (Return value): ' print.
                             value displayString printOn:output. output cr.
                             output flush.
                         ].
-                    ] ifFalse:[    
-                        us := Time microsecondsToRun:[
-                            value := (compilerClass new requestor:self)
-                                        evaluate:chunk compile:true.
-                        ].
-                        (doPrint and:[self printFlag]) ifTrue:[
-                            value isVoid ifFalse:[
-                                '-> (Return value): ' print.
-                                value displayString printOn:output. output cr.
-                                output flush.
-                            ].
-                        ].
-
-                        timingFlag == true ifTrue:[
-                            'execution time: ' printOn:error.
-                            us < 1000 ifTrue:[
-                                us < 1 ifTrue:[
-                                    'too small to measure (<1us)' printOn:error.
-                                ] ifFalse:[
-                                    us printOn:output. 'us' printOn:error.
-                                ]
-                            ] ifFalse:[
-                                ((us / 1000) asFixedPoint:2) printOn:output. 'ms' printOn:error.
-                            ].
-                            error cr.
-                        ].
                     ].
                     Workspace notNil ifTrue:[
                         Workspace rememberResultAsWorkspaceVariable:value.