first commit
This commit is contained in:
76
internal/winmd/methoddef.go
Normal file
76
internal/winmd/methoddef.go
Normal file
@ -0,0 +1,76 @@
|
||||
package winmd
|
||||
|
||||
import (
|
||||
"github.com/tdakkota/win32metadata/md"
|
||||
"github.com/tdakkota/win32metadata/types"
|
||||
)
|
||||
|
||||
// GetMethodOverloadName finds and returns the overload attribute for the given method
|
||||
func GetMethodOverloadName(ctx *types.Context, methodDef *types.MethodDef) string {
|
||||
cAttrTable := ctx.Table(md.CustomAttribute)
|
||||
for i := uint32(0); i < cAttrTable.RowCount(); i++ {
|
||||
var cAttr types.CustomAttribute
|
||||
if err := cAttr.FromRow(cAttrTable.Row(i)); err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
// - Parent: The owner of the Attribute must be the given func
|
||||
if cAttrParentTable, _ := cAttr.Parent.Table(); cAttrParentTable != md.MethodDef {
|
||||
continue
|
||||
}
|
||||
|
||||
var parentMethodDef types.MethodDef
|
||||
row, ok := cAttr.Parent.Row(ctx)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if err := parentMethodDef.FromRow(row); err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
// does the blob belong to the method we're looking for?
|
||||
if parentMethodDef.Name != methodDef.Name || string(parentMethodDef.Signature) != string(methodDef.Signature) {
|
||||
continue
|
||||
}
|
||||
|
||||
// - Type: the attribute type must be the given type
|
||||
// the cAttr.Type table can be either a MemberRef or a MethodRef.
|
||||
// Since we are looking for a type, we will only consider the MemberRef.
|
||||
if cAttrTypeTable, _ := cAttr.Type.Table(); cAttrTypeTable != md.MemberRef {
|
||||
continue
|
||||
}
|
||||
|
||||
var attrTypeMemberRef types.MemberRef
|
||||
row, ok = cAttr.Type.Row(ctx)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if err := attrTypeMemberRef.FromRow(row); err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
// we need to check the MemberRef Class
|
||||
// the value can belong to several tables, but we are only going to check for TypeRef
|
||||
if classTable, _ := attrTypeMemberRef.Class.Table(); classTable != md.TypeRef {
|
||||
continue
|
||||
}
|
||||
|
||||
var attrTypeRef types.TypeRef
|
||||
row, ok = attrTypeMemberRef.Class.Row(ctx)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if err := attrTypeRef.FromRow(row); err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if attrTypeRef.TypeNamespace+"."+attrTypeRef.TypeName == AttributeTypeOverloadAttribute {
|
||||
// Metadata values start with 0x01 0x00 and ends with 0x00 0x00
|
||||
mdVal := cAttr.Value[2 : len(cAttr.Value)-2]
|
||||
// the next value is the length of the string
|
||||
mdVal = mdVal[1:]
|
||||
return string(mdVal)
|
||||
}
|
||||
}
|
||||
return methodDef.Name
|
||||
}
|
Reference in New Issue
Block a user