STATIC void call_py_func(ffi_cif *cif, void *ret, void** args, mp_obj_t func) { mp_obj_t pyargs[cif->nargs]; for (int i = 0; i < cif->nargs; i++) { pyargs[i] = mp_obj_new_int(*(int*)args[i]); } mp_obj_t res = mp_call_function_n_kw(func, cif->nargs, 0, pyargs); *(ffi_arg*)ret = mp_obj_int_get(res); }
mp_obj_t ffifunc_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { mp_obj_ffifunc_t *self = self_in; assert(n_kw == 0); assert(n_args == self->cif.nargs); ffi_arg values[n_args]; void *valueptrs[n_args]; int i; for (i = 0; i < n_args; i++) { mp_obj_t a = args[i]; if (a == mp_const_none) { values[i] = 0; } else if (MP_OBJ_IS_INT(a)) { values[i] = mp_obj_int_get(a); } else if (MP_OBJ_IS_STR(a)) { const char *s = mp_obj_str_get_str(a); values[i] = (ffi_arg)s; } else if (((mp_obj_base_t*)a)->type->buffer_p.get_buffer != NULL) { mp_obj_base_t *o = (mp_obj_base_t*)a; mp_buffer_info_t bufinfo; int ret = o->type->buffer_p.get_buffer(o, &bufinfo, MP_BUFFER_READ); // TODO: MP_BUFFER_READ? if (ret != 0 || bufinfo.buf == NULL) { goto error; } values[i] = (ffi_arg)bufinfo.buf; } else if (MP_OBJ_IS_TYPE(a, &fficallback_type)) { mp_obj_fficallback_t *p = a; values[i] = (ffi_arg)p->func; } else { goto error; } valueptrs[i] = &values[i]; } // If ffi_arg is not big enough to hold a double, then we must pass along a // pointer to a memory location of the correct size. // TODO check if this needs to be done for other types which don't fit into // ffi_arg. if (sizeof(ffi_arg) == 4 && self->rettype == 'd') { double retval; ffi_call(&self->cif, self->func, &retval, valueptrs); return mp_obj_new_float(retval); } else { ffi_arg retval; ffi_call(&self->cif, self->func, &retval, valueptrs); return return_ffi_value(retval, self->rettype); } error: nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "Don't know how to pass object to native function")); }
void mp_binary_set_val(char typecode, void *p, int index, mp_obj_t val_in) { machine_int_t val = 0; if (MP_OBJ_IS_INT(val_in)) { val = mp_obj_int_get(val_in); } switch (typecode) { case 'b': ((int8_t*)p)[index] = val; break; case BYTEARRAY_TYPECODE: case 'B': val = ((uint8_t*)p)[index] = val; break; case 'h': val = ((int16_t*)p)[index] = val; break; case 'H': val = ((uint16_t*)p)[index] = val; break; case 'i': case 'l': ((int32_t*)p)[index] = val; break; case 'I': case 'L': ((uint32_t*)p)[index] = val; break; #if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE case 'q': case 'Q': assert(0); ((long long*)p)[index] = val; break; #endif #if MICROPY_ENABLE_FLOAT case 'f': ((float*)p)[index] = mp_obj_float_get(val_in); break; case 'd': ((double*)p)[index] = mp_obj_float_get(val_in); break; #endif } }
STATIC mp_obj_t socket_setsockopt(uint n_args, const mp_obj_t *args) { mp_obj_socket_t *self = args[0]; int level = MP_OBJ_SMALL_INT_VALUE(args[1]); int option = mp_obj_get_int(args[2]); const void *optval; socklen_t optlen; if (MP_OBJ_IS_INT(args[3])) { int val = mp_obj_int_get(args[3]); optval = &val; optlen = sizeof(val); } else { mp_buffer_info_t bufinfo; mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ); optval = bufinfo.buf; optlen = bufinfo.len; } int r = setsockopt(self->fd, level, option, optval, optlen); RAISE_ERRNO(r, errno); return mp_const_none; }
mp_obj_t mod_ffi_as_bytearray(mp_obj_t ptr, mp_obj_t size) { return mp_obj_new_bytearray_by_ref(mp_obj_int_get(size), (void*)mp_obj_int_get(ptr)); }