@@ -180,10 +180,7 @@ func (d *Debugger) preHook(i *interpreter, n ast.Node) {
180180 if l .File == nil {
181181 return
182182 }
183- vs , err := valueToString (d .interpreter , d .lastEvaluation )
184- if err != nil {
185- return
186- }
183+ vs := debugValueToString (d .lastEvaluation )
187184 if d .singleStep {
188185 d .singleStep = false
189186 d .events <- & DebugEventStop {
@@ -282,9 +279,9 @@ func (d *Debugger) ClearBreakpoints(file string) {
282279func (d * Debugger ) LookupValue (val string ) (string , error ) {
283280 switch val {
284281 case "self" :
285- return valueToString (d .interpreter , d . interpreter . stack .getSelfBinding ().self )
282+ return debugValueToString (d .interpreter . stack .getSelfBinding ().self ), nil
286283 case "super" :
287- return valueToString (d .interpreter , d . interpreter . stack .getSelfBinding ().super ().self )
284+ return debugValueToString (d .interpreter . stack .getSelfBinding ().super ().self ), nil
288285 default :
289286 v := d .interpreter .stack .lookUpVar (ast .Identifier (val ))
290287 if v != nil {
@@ -305,7 +302,7 @@ func (d *Debugger) LookupValue(val string) (string, error) {
305302 }
306303 v .content = e
307304 }
308- return valueToString ( d . interpreter , v .content )
305+ return debugValueToString ( v .content ), nil
309306 }
310307 }
311308 return "" , fmt .Errorf ("invalid identifier %s" , val )
@@ -347,3 +344,58 @@ func (d *Debugger) StackTrace() []TraceFrame {
347344 trace [len (trace )- 1 ].Loc = * d .current .Loc ()
348345 return trace
349346}
347+
348+ func debugValueToString (v value ) string {
349+ switch i := v .(type ) {
350+ case * valueFlatString :
351+ return "\" " + i .getGoString () + "\" "
352+ case * valueObject :
353+ if i == nil {
354+ return "{}"
355+ }
356+ var sb strings.Builder
357+ sb .WriteString ("{" )
358+ firstLine := true
359+ for k , v := range i .cache {
360+ if k .depth != 0 {
361+ continue
362+ }
363+ if ! firstLine {
364+ sb .WriteString (", " )
365+ firstLine = true
366+ }
367+ sb .WriteString (k .field )
368+ sb .WriteString (": " )
369+ sb .WriteString (debugValueToString (v ))
370+ }
371+ sb .WriteString ("}" )
372+ return sb .String ()
373+ case * valueArray :
374+ var sb strings.Builder
375+ sb .WriteString ("[" )
376+ for i , e := range i .elements {
377+ if i > 0 {
378+ sb .WriteString (", " )
379+ }
380+ sb .WriteString (debugValueToString (e .content ))
381+ }
382+ sb .WriteString ("]" )
383+ return sb .String ()
384+ case * valueNumber :
385+ return fmt .Sprintf ("%f" , i .value )
386+ case * valueBoolean :
387+ return fmt .Sprintf ("%t" , i .value )
388+ case * valueFunction :
389+ var sb strings.Builder
390+ sb .WriteString ("function(" )
391+ for i , p := range i .parameters () {
392+ if i > 0 {
393+ sb .WriteString (", " )
394+ }
395+ sb .WriteString (string (p .name ))
396+ }
397+ sb .WriteString (")" )
398+ return sb .String ()
399+ }
400+ return fmt .Sprintf ("%T%+v" , v , v )
401+ }
0 commit comments