// Call JS function with arguments. // Arguments is converted as following table. // Go: Javascript // uint, int, float: number // []byte, string: string // bool: boolean func (fc *JSFunction) Call(args ...interface{}) (interface{}, error) { var cargs *C.v7_val_t if len(args) == 0 { _cargs := C.v7_create_undefined() cargs = &_cargs } else { var cobj *C.v7_val_t _cargs := C.v7_create_array(fc.ctx.rctx) for _, arg := range args { switch arg.(type) { case uint: obj := C.v7_create_number(C.double(arg.(uint))) cobj = &obj case uint32: obj := C.v7_create_number(C.double(arg.(uint32))) cobj = &obj case uint64: obj := C.v7_create_number(C.double(arg.(uint64))) cobj = &obj case int: obj := C.v7_create_number(C.double(arg.(int))) cobj = &obj case int32: obj := C.v7_create_number(C.double(arg.(int32))) cobj = &obj case int64: obj := C.v7_create_number(C.double(arg.(int64))) cobj = &obj case float32: obj := C.v7_create_number(C.double(arg.(float32))) cobj = &obj case float64: obj := C.v7_create_number(C.double(arg.(float64))) cobj = &obj case []byte, string: ptr := C.CString(arg.(string)) defer C.free(unsafe.Pointer(ptr)) obj := C.v7_create_string(fc.ctx.rctx, ptr, C.size_t(len(arg.(string))), 0) cobj = &obj case bool: obj := C.v7_create_boolean(arg.(C.int)) cobj = &obj default: return nil, fmt.Errorf("Unsupported type %T", arg) } C.v7_array_push(fc.ctx.rctx, _cargs, *cobj) } cargs = &_cargs } var result C.v7_val_t err := wrapCError(C.v7_apply(fc.ctx.rctx, &result, fc.value, C.v7_create_undefined(), *cargs)) if err != nil { return nil, err } return toValue(fc.ctx, result) }
/* * CreateString copies the Go string twice */ func (v7 *V7) CreateString(str string) Val { cs := C.CString(str) defer C.free(unsafe.Pointer(cs)) return Val(C.v7_create_string((*C.struct_v7)(v7), cs, C.size_t(len(str)), 1 /*copy*/)) }