func testparse(c *Class, members []member_info, method bool, t *testing.T) { for i := range members { var p descriptors.DESCRIPTORS desc := c.Constant_pool.Lut(members[i].Descriptor_index).String() if !p.Parse(desc) || p.RootNode().Range.End != len(desc) { t.Errorf("Failed to parse descriptor: %s\n%s\n%s", p.Error(), desc, p.RootNode()) } var p2 signatures.SIGNATURES for _, attr := range members[i].Attributes { if c.Constant_pool.Lut(attr.Attribute_name_index).String() == "Signature" { br := util.BinaryReader{bytes.NewReader(attr.Info), util.BigEndian} if i16, err := br.Uint16(); err != nil { t.Error(err) } else { sign := c.Constant_pool.Lut(u2(i16)).String() p2.SetData(sign) var ret bool if method { ret = p2.MethodTypeSignature() } else { ret = p2.FieldTypeSignature() } p2.RootNode().UpdateRange() if !ret || p2.RootNode().Range.End != len(sign) { t.Errorf("Failed to parse signature: %s\n%s\n%s", p2.Error(), desc, p2.RootNode()) } } } } } }
func (a *attribute_info) String(c *ConstantPool) (ret string) { ret = c.Lut(a.Attribute_name_index).String() switch n := c.Lut(a.Attribute_name_index).String(); n { case "Signature", "SourceFile": ret += "=" br := util.BinaryReader{bytes.NewReader(a.Info), util.BigEndian} if i16, err := br.Uint16(); err != nil { ret += err.Error() } else { ret += c.Lut(u2(i16)).String() } case "Code": ret += " (" var cl Code_attribute br := util.BinaryReader{bytes.NewReader(a.Info), util.BigEndian} if err := br.ReadInterface(&cl); err != nil { ret += err.Error() } else { for _, a2 := range cl.Attributes { ret += fmt.Sprintf(" %s", c.Lut(a2.Attribute_name_index)) } } ret += " )" } return ret }
func (m *MetadataUtil) ReadIndex(br *util.BinaryReader, size uint) (uint32, error) { if size == 2 { if v, e := br.Uint16(); e != nil { return 0, e } else { return uint32(v), nil } } return br.Uint32() }