diff options
Diffstat (limited to 'vendor/github.com/chenzhuoyu/iasm/x86_64/eface.go')
| -rw-r--r-- | vendor/github.com/chenzhuoyu/iasm/x86_64/eface.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/vendor/github.com/chenzhuoyu/iasm/x86_64/eface.go b/vendor/github.com/chenzhuoyu/iasm/x86_64/eface.go new file mode 100644 index 000000000..b5607e8f9 --- /dev/null +++ b/vendor/github.com/chenzhuoyu/iasm/x86_64/eface.go @@ -0,0 +1,63 @@ +package x86_64 + +import ( + `reflect` + `unsafe` +) + +type _GoType struct { + size uintptr + pdata uintptr + hash uint32 + flags uint8 + align uint8 + falign uint8 + kflags uint8 + traits unsafe.Pointer + gcdata *byte + str int32 + ptrx int32 +} + +const ( + _KindMask = (1 << 5) - 1 +) + +func (self *_GoType) kind() reflect.Kind { + return reflect.Kind(self.kflags & _KindMask) +} + +type _GoSlice struct { + ptr unsafe.Pointer + len int + cap int +} + +type _GoEface struct { + vt *_GoType + ptr unsafe.Pointer +} + +func (self *_GoEface) kind() reflect.Kind { + if self.vt != nil { + return self.vt.kind() + } else { + return reflect.Invalid + } +} + +func (self *_GoEface) toInt64() int64 { + if self.vt.size == 8 { + return *(*int64)(self.ptr) + } else if self.vt.size == 4 { + return int64(*(*int32)(self.ptr)) + } else if self.vt.size == 2 { + return int64(*(*int16)(self.ptr)) + } else { + return int64(*(*int8)(self.ptr)) + } +} + +func efaceOf(v interface{}) _GoEface { + return *(*_GoEface)(unsafe.Pointer(&v)) +} |
