本文整理汇总了Golang中debug/dwarf.Type类的典型用法代码### 示例。如果您正苦于以下问题:Golang Type类的具体用法?Golang Type怎么用?Golang Type使用的例子?那么恭喜您, 这里精选的类代码### 示例或许可以为您提供帮助。

在下文中一共展示了Type类的8个代码### 示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码### 示例。

示例1: newVariable

func newVariable(name string, addr uintptr, dwarfType dwarf.Type, thread *Thread) (*Variable, error) {
    v := &Variable{
        Name:      name,
        Addr:      addr,
        dwarfType: dwarfType,
        thread:    thread,
        Type:      dwarfType.String(),
    }

    switch t := dwarfType.(type) {
    case *dwarf.StructType:
        if strings.HasPrefix(t.StructName, "[]") {
            err := v.loadSliceInfo(t)
            if err != nil {
                return nil, err
            }
        }
    case *dwarf.ArrayType:
        v.base = v.Addr
        v.Len = t.Count
        v.Cap = -1
        v.fieldType = t.Type
        v.stride = 0

        if t.Count > 0 {
            v.stride = t.ByteSize / t.Count
        }
    }

    return v, nil
}

开发者ID:rdterner,项目名称:delve,代码行数:31,代码来源:variables.go

示例2: readSlice

func (thread *Thread) readSlice(addr uintptr, t *dwarf.StructType) (string, error) {
    var sliceLen, sliceCap int64
    var arrayAddr uintptr
    var arrayType dwarf.Type
    for _, f := range t.Field {
        switch f.Name {
        case "array":
            val, err := thread.readMemory(addr+uintptr(f.ByteOffset), thread.dbp.arch.PtrSize())
            if err != nil {
                return "", err
            }
            arrayAddr = uintptr(binary.LittleEndian.Uint64(val))
            // Dereference array type to get value type
            ptrType, ok := f.Type.(*dwarf.PtrType)
            if !ok {
                return "", fmt.Errorf("Invalid type %s in slice array", f.Type)
            }
            arrayType = ptrType.Type
        case "len":
            lstr, err := thread.extractValue(nil, int64(addr+uintptr(f.ByteOffset)), f.Type, true)
            if err != nil {
                return "", err
            }
            sliceLen, err = strconv.ParseInt(lstr, 10, 64)
            if err != nil {
                return "", err
            }
        case "cap":
            cstr, err := thread.extractValue(nil, int64(addr+uintptr(f.ByteOffset)), f.Type, true)
            if err != nil {
                return "", err
            }
            sliceCap, err = strconv.ParseInt(cstr, 10, 64)
            if err != nil {
                return "", err
            }
        }
    }

    stride := arrayType.Size()
    if _, ok := arrayType.(*dwarf.PtrType); ok {
        stride = int64(thread.dbp.arch.PtrSize())
    }
    vals, err := thread.readArrayValues(arrayAddr, sliceLen, stride, arrayType)
    if err != nil {
        return "", err
    }

    return fmt.Sprintf("[]%s len: %d, cap: %d, [%s]", arrayType, sliceLen, sliceCap, strings.Join(vals, ",")), nil
}

开发者ID:rsrsps,项目名称:delve,代码行数:50,代码来源:variables.go

示例3: Type

// Type returns a *Type with the same memory layout as
// dtype when used as the type of a variable or a struct field.
func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type {
    if t, ok := c.m[dtype]; ok {
        if t.Go == nil {
            fatalf("%s: type conversion loop at %s", lineno(pos), dtype)
        }
        return t
    }

    t := new(Type)
    t.Size = dtype.Size() // note: wrong for array of pointers, corrected below
    t.Align = -1
    t.C = &TypeRepr{Repr: dtype.Common().Name}
    c.m[dtype] = t

    switch dt := dtype.(type) {
    default:
        fatalf("%s: unexpected type: %s", lineno(pos), dtype)

    case *dwarf.AddrType:
        if t.Size != c.ptrSize {
            fatalf("%s: unexpected: %d-byte address type - %s", lineno(pos), t.Size, dtype)
        }
        t.Go = c.uintptr
        t.Align = t.Size

    case *dwarf.ArrayType:
        if dt.StrideBitSize > 0 {
            // Cannot represent bit-sized elements in Go.
            t.Go = c.Opaque(t.Size)
            break
        }
        count := dt.Count
        if count == -1 {
            // Indicates flexible array member, which Go doesn't support.
            // Translate to zero-length array instead.
            count = 0
        }
        sub := c.Type(dt.Type, pos)
        t.Align = sub.Align
        t.Go = &ast.ArrayType{
            Len: c.intExpr(count),
            Elt: sub.Go,
        }
        // Recalculate t.Size now that we know sub.Size.
        t.Size = count * sub.Size
        t.C.Set("__typeof__(%s[%d])", sub.C, dt.Count)

    case *dwarf.BoolType:
        t.Go = c.bool
        t.Align = 1

    case *dwarf.CharType:
        if t.Size != 1 {
            fatalf("%s: unexpected: %d-byte char type - %s", lineno(pos), t.Size, dtype)
        }
        t.Go = c.int8
        t.Align = 1

    case *dwarf.EnumType:
        if t.Align = t.Size; t.Align >= c.ptrSize {
            t.Align = c.ptrSize
        }
        t.C.Set("enum " + dt.EnumName)
        signed := 0
        t.EnumValues = make(map[string]int64)
        for _, ev := range dt.Val {
            t.EnumValues[ev.Name] = ev.Val
            if ev.Val < 0 {
                signed = signedDelta
            }
        }
        switch t.Size + int64(signed) {
        default:
            fatalf("%s: unexpected: %d-byte enum type - %s", lineno(pos), t.Size, dtype)
        case 1:
            t.Go = c.uint8
        case 2:
            t.Go = c.uint16
        case 4:
            t.Go = c.uint32
        case 8:
            t.Go = c.uint64
        case 1 + signedDelta:
            t.Go = c.int8
        case 2 + signedDelta:
            t.Go = c.int16
        case 4 + signedDelta:
            t.Go = c.int32
        case 8 + signedDelta:
            t.Go = c.int64
        }

    case *dwarf.FloatType:
        switch t.Size {
        default:
            fatalf("%s: unexpected: %d-byte float type - %s", lineno(pos), t.Size, dtype)
        case 4:
            t.Go = c.float32
//.........这里部分代码省略.........

开发者ID:GoProjectOwner,项目名称:go,代码行数:101,代码来源:gcc.go

示例4: Type

// Type returns a *Type with the same memory layout as
// dtype when used as the type of a variable or a struct field.
func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type {
    if t, ok := c.m[dtype]; ok {
        if t.Go == nil {
            fatalf("%s: type conversion loop at %s", lineno(pos), dtype)
        }
        return t
    }

    // clang won't generate DW_AT_byte_size for pointer types,
    // so we have to fix it here.
    if dt, ok := base(dtype).(*dwarf.PtrType); ok && dt.ByteSize == -1 {
        dt.ByteSize = c.ptrSize
    }

    t := new(Type)
    t.Size = dtype.Size() // note: wrong for array of pointers, corrected below
    t.Align = -1
    t.C = &TypeRepr{Repr: dtype.Common().Name}
    c.m[dtype] = t

    switch dt := dtype.(type) {
    default:
        fatalf("%s: unexpected type: %s", lineno(pos), dtype)

    case *dwarf.AddrType:
        if t.Size != c.ptrSize {
            fatalf("%s: unexpected: %d-byte address type - %s", lineno(pos), t.Size, dtype)
        }
        t.Go = c.uintptr
        t.Align = t.Size

    case *dwarf.ArrayType:
        if dt.StrideBitSize > 0 {
            // Cannot represent bit-sized elements in Go.
            t.Go = c.Opaque(t.Size)
            break
        }
        gt := &ast.ArrayType{
            Len: c.intExpr(dt.Count),
        }
        t.Go = gt // publish before recursive call
        sub := c.Type(dt.Type, pos)
        t.Align = sub.Align
        gt.Elt = sub.Go
        t.C.Set("__typeof__(%s[%d])", sub.C, dt.Count)

    case *dwarf.BoolType:
        t.Go = c.bool
        t.Align = 1

    case *dwarf.CharType:
        if t.Size != 1 {
            fatalf("%s: unexpected: %d-byte char type - %s", lineno(pos), t.Size, dtype)
        }
        t.Go = c.int8
        t.Align = 1

    case *dwarf.EnumType:
        if t.Align = t.Size; t.Align >= c.ptrSize {
            t.Align = c.ptrSize
        }
        t.C.Set("enum " + dt.EnumName)
        signed := 0
        t.EnumValues = make(map[string]int64)
        for _, ev := range dt.Val {
            t.EnumValues[ev.Name] = ev.Val
            if ev.Val < 0 {
                signed = signedDelta
            }
        }
        switch t.Size + int64(signed) {
        default:
            fatalf("%s: unexpected: %d-byte enum type - %s", lineno(pos), t.Size, dtype)
        case 1:
            t.Go = c.uint8
        case 2:
            t.Go = c.uint16
        case 4:
            t.Go = c.uint32
        case 8:
            t.Go = c.uint64
        case 1 + signedDelta:
            t.Go = c.int8
        case 2 + signedDelta:
            t.Go = c.int16
        case 4 + signedDelta:
            t.Go = c.int32
        case 8 + signedDelta:
            t.Go = c.int64
        }

    case *dwarf.FloatType:
        switch t.Size {
        default:
            fatalf("%s: unexpected: %d-byte float type - %s", lineno(pos), t.Size, dtype)
        case 4:
            t.Go = c.float32
        case 8:
//.........这里部分代码省略.........

开发者ID:rosrad,项目名称:go-rep,代码行数:101,代码来源:gcc.go

示例5: Type

// Type returns a *Type with the same memory layout as
// dtype when used as the type of a variable or a struct field.
func (c *typeConv) Type(dtype dwarf.Type) *Type {
    if t, ok := c.m[dtype]; ok {
        if t.Go == nil {
            fatalf("type conversion loop at %s", dtype)
        }
        return t
    }

    t := new(Type)
    t.Size = dtype.Size()
    t.Align = -1
    t.C = &TypeRepr{Repr: dtype.Common().Name}
    c.m[dtype] = t

    if t.Size < 0 {
        // Unsized types are [0]byte
        t.Size = 0
        t.Go = c.Opaque(0)
        if t.C.Empty() {
            t.C.Set("void")
        }
        return t
    }

    switch dt := dtype.(type) {
    default:
        fatalf("unexpected type: %s", dtype)

    case *dwarf.AddrType:
        if t.Size != c.ptrSize {
            fatalf("unexpected: %d-byte address type - %s", t.Size, dtype)
        }
        t.Go = c.uintptr
        t.Align = t.Size

    case *dwarf.ArrayType:
        if dt.StrideBitSize > 0 {
            // Cannot represent bit-sized elements in Go.
            t.Go = c.Opaque(t.Size)
            break
        }
        gt := &ast.ArrayType{
            Len: c.intExpr(dt.Count),
        }
        t.Go = gt // publish before recursive call
        sub := c.Type(dt.Type)
        t.Align = sub.Align
        gt.Elt = sub.Go
        t.C.Set("typeof(%s[%d])", sub.C, dt.Count)

    case *dwarf.BoolType:
        t.Go = c.bool
        t.Align = c.ptrSize

    case *dwarf.CharType:
        if t.Size != 1 {
            fatalf("unexpected: %d-byte char type - %s", t.Size, dtype)
        }
        t.Go = c.int8
        t.Align = 1

    case *dwarf.EnumType:
        if t.Align = t.Size; t.Align >= c.ptrSize {
            t.Align = c.ptrSize
        }
        t.C.Set("enum " + dt.EnumName)
        signed := 0
        t.EnumValues = make(map[string]int64)
        for _, ev := range dt.Val {
            t.EnumValues[ev.Name] = ev.Val
            if ev.Val < 0 {
                signed = signedDelta
            }
        }
        switch t.Size + int64(signed) {
        default:
            fatalf("unexpected: %d-byte enum type - %s", t.Size, dtype)
        case 1:
            t.Go = c.uint8
        case 2:
            t.Go = c.uint16
        case 4:
            t.Go = c.uint32
        case 8:
            t.Go = c.uint64
        case 1 + signedDelta:
            t.Go = c.int8
        case 2 + signedDelta:
            t.Go = c.int16
        case 4 + signedDelta:
            t.Go = c.int32
        case 8 + signedDelta:
            t.Go = c.int64
        }

    case *dwarf.FloatType:
        switch t.Size {
        default:
//.........这里部分代码省略.........

开发者ID:WXB506,项目名称:golang,代码行数:101,代码来源:gcc.go

最后编辑: kuteng  文档更新时间: 2021-08-23 19:14   作者:kuteng