eface.go raw

   1  //
   2  // Copyright 2024 CloudWeGo Authors
   3  //
   4  // Licensed under the Apache License, Version 2.0 (the "License");
   5  // you may not use this file except in compliance with the License.
   6  // You may obtain a copy of the License at
   7  //
   8  //     http://www.apache.org/licenses/LICENSE-2.0
   9  //
  10  // Unless required by applicable law or agreed to in writing, software
  11  // distributed under the License is distributed on an "AS IS" BASIS,
  12  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13  // See the License for the specific language governing permissions and
  14  // limitations under the License.
  15  //
  16  
  17  package x86_64
  18  
  19  import (
  20  	"reflect"
  21  	"unsafe"
  22  )
  23  
  24  type _GoType struct {
  25  	size   uintptr
  26  	pdata  uintptr
  27  	hash   uint32
  28  	flags  uint8
  29  	align  uint8
  30  	falign uint8
  31  	kflags uint8
  32  	traits unsafe.Pointer
  33  	gcdata *byte
  34  	str    int32
  35  	ptrx   int32
  36  }
  37  
  38  const (
  39  	_KindMask = (1 << 5) - 1
  40  )
  41  
  42  func (self *_GoType) kind() reflect.Kind {
  43  	return reflect.Kind(self.kflags & _KindMask)
  44  }
  45  
  46  type _GoSlice struct {
  47  	ptr unsafe.Pointer
  48  	len int
  49  	cap int
  50  }
  51  
  52  type _GoEface struct {
  53  	vt  *_GoType
  54  	ptr unsafe.Pointer
  55  }
  56  
  57  func (self *_GoEface) kind() reflect.Kind {
  58  	if self.vt != nil {
  59  		return self.vt.kind()
  60  	} else {
  61  		return reflect.Invalid
  62  	}
  63  }
  64  
  65  func (self *_GoEface) toInt64() int64 {
  66  	if self.vt.size == 8 {
  67  		return *(*int64)(self.ptr)
  68  	} else if self.vt.size == 4 {
  69  		return int64(*(*int32)(self.ptr))
  70  	} else if self.vt.size == 2 {
  71  		return int64(*(*int16)(self.ptr))
  72  	} else {
  73  		return int64(*(*int8)(self.ptr))
  74  	}
  75  }
  76  
  77  func efaceOf(v interface{}) _GoEface {
  78  	return *(*_GoEface)(unsafe.Pointer(&v))
  79  }
  80