in cmd/viewcore/html.go [223:349]
func htmlObject(w http.ResponseWriter, c *gocore.Process, name string, a core.Address, t *gocore.Type, live map[core.Address]bool) {
switch t.Kind {
case gocore.KindBool:
v := c.Process().ReadUint8(a) != 0
fmt.Fprintf(w, "<tr><td>%s</td><td colspan=\"2\">%s</td><td>%t</td></tr>\n", name, html.EscapeString(t.String()), v)
case gocore.KindInt:
var v int64
switch t.Size {
case 1:
v = int64(c.Process().ReadInt8(a))
case 2:
v = int64(c.Process().ReadInt16(a))
case 4:
v = int64(c.Process().ReadInt32(a))
case 8:
v = c.Process().ReadInt64(a)
}
fmt.Fprintf(w, "<tr><td>%s</td><td colspan=\"2\">%s</td><td>%d</td></tr>\n", name, html.EscapeString(t.String()), v)
case gocore.KindUint:
var v uint64
switch t.Size {
case 1:
v = uint64(c.Process().ReadUint8(a))
case 2:
v = uint64(c.Process().ReadUint16(a))
case 4:
v = uint64(c.Process().ReadUint32(a))
case 8:
v = c.Process().ReadUint64(a)
}
fmt.Fprintf(w, "<tr><td>%s</td><td colspan=\"2\">%s</td><td>%d</td></tr>\n", name, html.EscapeString(t.String()), v)
case gocore.KindFloat:
var v float64
switch t.Size {
case 4:
v = float64(math.Float32frombits(c.Process().ReadUint32(a)))
case 8:
v = math.Float64frombits(c.Process().ReadUint64(a))
}
fmt.Fprintf(w, "<tr><td>%s</td><td colspan=\"2\">%s</td><td>%f</td></tr>\n", name, html.EscapeString(t.String()), v)
case gocore.KindComplex:
var v complex128
switch t.Size {
case 8:
v = complex128(complex(
math.Float32frombits(c.Process().ReadUint32(a)),
math.Float32frombits(c.Process().ReadUint32(a.Add(4)))))
case 16:
v = complex(
math.Float64frombits(c.Process().ReadUint64(a)),
math.Float64frombits(c.Process().ReadUint64(a.Add(8))))
}
fmt.Fprintf(w, "<tr><td>%s</td><td colspan=\"2\">%s</td><td>%f</td></tr>\n", name, html.EscapeString(t.String()), v)
case gocore.KindEface:
fmt.Fprintf(w, "<tr><td rowspan=\"2\">%s</td><td rowspan=\"2\">interface{}</td><td>*runtime._type</td><td>%s</td>", name, htmlPointerAt(c, a, live))
if live == nil || live[a] {
dt := c.DynamicType(t, a)
if dt != nil {
fmt.Fprintf(w, "<td>%s</td>", dt.Name)
}
}
fmt.Fprintf(w, "</tr>\n")
fmt.Fprintf(w, "<tr><td>unsafe.Pointer</td><td>%s</td></tr>\n", htmlPointerAt(c, a.Add(c.Process().PtrSize()), live))
case gocore.KindIface:
fmt.Fprintf(w, "<tr><td rowspan=\"2\">%s</td><td rowspan=\"2\">interface{...}</td><td>*runtime.itab</td><td>%s</td>", name, htmlPointerAt(c, a, live))
if live == nil || live[a] {
dt := c.DynamicType(t, a)
if dt != nil {
fmt.Fprintf(w, "<td>%s</td>", dt.Name)
}
}
fmt.Fprintf(w, "</tr>\n")
fmt.Fprintf(w, "<tr><td>unsafe.Pointer</td><td>%s</td></tr>\n", htmlPointerAt(c, a.Add(c.Process().PtrSize()), live))
case gocore.KindPtr:
fmt.Fprintf(w, "<tr><td>%s</td><td colspan=\"2\">%s</td><td>%s</td></tr>\n", name, html.EscapeString(t.String()), htmlPointerAt(c, a, live))
case gocore.KindFunc:
fmt.Fprintf(w, "<tr><td>%s</td><td colspan=\"2\">%s</td><td>%s</td>", name, html.EscapeString(t.String()), htmlPointerAt(c, a, live))
if fn := c.Process().ReadPtr(a); fn != 0 {
pc := c.Process().ReadPtr(fn)
if f := c.FindFunc(pc); f != nil && f.Entry() == pc {
fmt.Fprintf(w, "<td>%s</td>", f.Name())
}
}
fmt.Fprintf(w, "</tr>\n")
case gocore.KindString:
n := c.Process().ReadInt(a.Add(c.Process().PtrSize()))
fmt.Fprintf(w, "<tr><td rowspan=\"2\">%s</td><td rowspan=\"2\">string</td><td>*uint8</td><td>%s</td>", name, htmlPointerAt(c, a, live))
if live == nil || live[a] {
if n > 0 {
n2 := n
ddd := ""
if n > 100 {
n2 = 100
ddd = "..."
}
b := make([]byte, n2)
c.Process().ReadAt(b, c.Process().ReadPtr(a))
fmt.Fprintf(w, "<td rowspan=\"2\">\"%s\"%s</td>", html.EscapeString(string(b)), ddd)
} else {
fmt.Fprintf(w, "<td rowspan=\"2\">\"\"</td>")
}
}
fmt.Fprintf(w, "</tr>\n")
fmt.Fprintf(w, "<tr><td>int</td><td>%d</td></tr>\n", n)
case gocore.KindSlice:
fmt.Fprintf(w, "<tr><td rowspan=\"3\">%s</td><td rowspan=\"3\">%s</td><td>*%s</td><td>%s</td></tr>\n", name, t, t.Elem, htmlPointerAt(c, a, live))
fmt.Fprintf(w, "<tr><td>int</td><td>%d</td></tr>\n", c.Process().ReadInt(a.Add(c.Process().PtrSize())))
fmt.Fprintf(w, "<tr><td>int</td><td>%d</td></tr>\n", c.Process().ReadInt(a.Add(c.Process().PtrSize()*2)))
case gocore.KindArray:
s := t.Elem.Size
n := t.Count
if n*s > 16384 {
n = (16384 + s - 1) / s
}
for i := int64(0); i < n; i++ {
htmlObject(w, c, fmt.Sprintf("%s[%d]", name, i), a.Add(i*s), t.Elem, live)
}
if n*s != t.Size {
fmt.Fprintf(w, "<tr><td>...</td><td>...</td><td>...</td></tr>\n")
}
case gocore.KindStruct:
for _, f := range t.Fields {
htmlObject(w, c, name+"."+f.Name, a.Add(f.Off), f.Type, live)
}
}
}