/
cpool.go
44 lines (40 loc) · 1.03 KB
/
cpool.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package bytecode
import "fmt"
func typenameString(c *CpoolInfo, info MultinameInfo) string {
var str string
name := c.Multinames[info.Name]
str += c.Strings[name.Name]
str += "<"
for i, p := range info.Params {
if i > 0 {
str += ", "
}
str += c.MultinameString(p)
}
str += ">"
return str
}
// MultinameString converts a multiname to a string
func (c *CpoolInfo) MultinameString(m uint32) string {
if int(m) >= len(c.Multinames) {
return ""
}
info := c.Multinames[m]
switch info.Kind {
case MultinameKindQName, MultinameKindQNameA:
return c.Strings[info.Name]
case MultinameKindRTQName, MultinameKindRTQNameA:
return fmt.Sprintf("[*].%v", c.Strings[info.Name])
case MultinameKindRTQNameL, MultinameKindRTQNameLA:
return fmt.Sprint("[*].[*]")
case MultinameKindTypename:
return typenameString(c, info)
default:
return fmt.Sprint(c.Strings[info.Name])
}
}
// NamespaceString converts a namespace to a string
func (c *CpoolInfo) NamespaceString(n uint32) string {
info := c.Namespaces[n]
return c.Strings[info.Name]
}