github.com/gotranspile/cxgo@v0.3.7/runtime/libc/stdarg.go (about) 1 package libc 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 type ArgList struct { 9 cur int 10 typ interface{} 11 args []interface{} 12 } 13 14 func (va *ArgList) Start(typ interface{}, rest []interface{}) { 15 va.cur = 0 16 va.typ = typ 17 va.args = rest 18 } 19 20 func (va *ArgList) Args() []interface{} { 21 return va.args 22 } 23 24 func (va *ArgList) Arg() interface{} { 25 if va.cur >= len(va.args) { 26 return nil 27 } 28 cur := va.args[va.cur] 29 va.cur++ 30 return cur 31 } 32 33 func (va *ArgList) ArgUintptr() uintptr { 34 v := va.Arg() 35 switch v := v.(type) { 36 case nil: 37 return 0 38 case uintptr: 39 return v 40 case int: 41 return uintptr(v) 42 case uint: 43 return uintptr(v) 44 case int32: 45 return uintptr(v) 46 case uint32: 47 return uintptr(v) 48 } 49 rv := reflect.ValueOf(v) 50 switch rv.Kind() { 51 case reflect.Ptr, reflect.UnsafePointer: 52 return rv.Pointer() 53 } 54 panic(fmt.Errorf("unsupported type: %T", v)) 55 } 56 57 func (va *ArgList) End() { 58 va.cur = 0 59 va.typ = nil 60 va.args = nil 61 } 62 63 func ArgCopy(dst, src *ArgList) { 64 dst.cur = src.cur 65 dst.typ = src.typ 66 dst.args = append([]interface{}{}, src.args...) 67 }