void kp_cdata_dump(ktap_state_t *ks, ktap_cdata_t *cd) { switch (cd_type(ks, cd)) { case FFI_UINT8: case FFI_INT8: kp_printf(ks, "c int(0x%01x)", cd_int(cd)); break; case FFI_UINT16: case FFI_INT16: kp_printf(ks, "c int(0x%02x)", cd_int(cd)); break; case FFI_UINT32: case FFI_INT32: kp_printf(ks, "c int(0x%04x)", cd_int(cd)); break; case FFI_UINT64: case FFI_INT64: kp_printf(ks, "c int(0x%08x)", cd_int(cd)); break; case FFI_PTR: kp_printf(ks, "c pointer(0x%p)", cd_ptr(cd)); break; case FFI_STRUCT: kp_printf(ks, "c struct(0x%p)", cd_struct(cd)); break; case FFI_UNION: kp_printf(ks, "c union(0x%p)", cd_union(cd)); break; default: kp_printf(ks, "unsupported cdata type %d!\n", cd_type(ks, cd)); } }
static int kplib_ffi_free(ktap_state *ks) { int n = kp_arg_nr(ks); ktap_cdata *cd; if (n != 1) { set_nil(ks->top++); kp_error(ks, "wrong number of arguments\n"); return 1; } kp_arg_check(ks, 1, KTAP_TYPE_CDATA); cd = cdvalue(kp_arg(ks, 1)); if (cd_type(ks, cd) != FFI_PTR) kp_error(ks, "could free pointer cdata only\n"); kp_cdata_free_ptr(ks, cd); return 0; }