@@ -180,10 +180,7 @@ func (d *Debugger) preHook(i *interpreter, n ast.Node) {
180
180
if l .File == nil {
181
181
return
182
182
}
183
- vs , err := valueToString (d .interpreter , d .lastEvaluation )
184
- if err != nil {
185
- return
186
- }
183
+ vs := debugValueToString (d .lastEvaluation )
187
184
if d .singleStep {
188
185
d .singleStep = false
189
186
d .events <- & DebugEventStop {
@@ -282,9 +279,9 @@ func (d *Debugger) ClearBreakpoints(file string) {
282
279
func (d * Debugger ) LookupValue (val string ) (string , error ) {
283
280
switch val {
284
281
case "self" :
285
- return valueToString (d .interpreter , d . interpreter . stack .getSelfBinding ().self )
282
+ return debugValueToString (d .interpreter . stack .getSelfBinding ().self ), nil
286
283
case "super" :
287
- return valueToString (d .interpreter , d . interpreter . stack .getSelfBinding ().super ().self )
284
+ return debugValueToString (d .interpreter . stack .getSelfBinding ().super ().self ), nil
288
285
default :
289
286
v := d .interpreter .stack .lookUpVar (ast .Identifier (val ))
290
287
if v != nil {
@@ -305,7 +302,7 @@ func (d *Debugger) LookupValue(val string) (string, error) {
305
302
}
306
303
v .content = e
307
304
}
308
- return valueToString ( d . interpreter , v .content )
305
+ return debugValueToString ( v .content ), nil
309
306
}
310
307
}
311
308
return "" , fmt .Errorf ("invalid identifier %s" , val )
@@ -347,3 +344,58 @@ func (d *Debugger) StackTrace() []TraceFrame {
347
344
trace [len (trace )- 1 ].Loc = * d .current .Loc ()
348
345
return trace
349
346
}
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