Skip to content

Commit 2b4d753

Browse files
authored
fix: use debugValueToString for debugger operations (#759)
The `valueToString` operation introduced by #742 is incompatible with the way the implementation from #739 as it tries to manifest an object from stack while the implementation needed by the debugger returns the value as-is without further evaluation.
1 parent 214a617 commit 2b4d753

File tree

1 file changed

+59
-7
lines changed

1 file changed

+59
-7
lines changed

debugger.go

+59-7
Original file line numberDiff line numberDiff line change
@@ -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) {
282279
func (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

Comments
 (0)