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  }