func (ir *Interpreter) tclObjToGoValue(obj *C.Tcl_Obj, typ reflect.Type) (reflect.Value, C.int) { var status C.int v := reflect.New(typ).Elem() switch typ.Kind() { case reflect.Int: var out C.Tcl_WideInt status = C.Tcl_GetWideIntFromObj(ir.C, obj, &out) if status == C.TCL_OK { v.SetInt(int64(out)) } case reflect.String: v.SetString(C.GoString(C.Tcl_GetString(obj))) case reflect.Float32, reflect.Float64: var out C.double status = C.Tcl_GetDoubleFromObj(ir.C, obj, &out) if status == C.TCL_OK { v.SetFloat(float64(out)) } default: msg := C.CString(fmt.Sprintf("Cannot convert Tcl object to Go type: %s", typ)) C._gotk_c_tcl_set_result(ir.C, msg) status = C.TCL_ERROR } return v, status }
func (ir *interpreter) tcl_obj_to_go_value(obj *C.Tcl_Obj, v reflect.Value) error { var status C.int switch v.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: var out C.Tcl_WideInt status = C.Tcl_GetWideIntFromObj(ir.C, obj, &out) if status == C.TCL_OK { v.SetInt(int64(out)) } case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: var out C.Tcl_WideInt status = C.Tcl_GetWideIntFromObj(ir.C, obj, &out) if status == C.TCL_OK { v.SetUint(uint64(out)) } case reflect.String: var n C.int out := C.Tcl_GetStringFromObj(obj, &n) v.SetString(C.GoStringN(out, n)) case reflect.Float32, reflect.Float64: var out C.double status = C.Tcl_GetDoubleFromObj(ir.C, obj, &out) if status == C.TCL_OK { v.SetFloat(float64(out)) } case reflect.Bool: var out C.int status = C.Tcl_GetBooleanFromObj(ir.C, obj, &out) if status == C.TCL_OK { v.SetBool(out == 1) } default: return fmt.Errorf("gothic: cannot convert TCL object to Go type: %s", v.Type()) } if status != C.TCL_OK { return errors.New(C.GoString(C.Tcl_GetStringResult(ir.C))) } return nil }