static void kp_cdata_value(ktap_state_t *ks, ktap_val_t *val, void **out_addr, size_t *out_size, void **temp) { ktap_cdata_t *cd; csymbol *cs; ffi_type type; switch (ttypenv(val)) { case KTAP_TYPE_BOOLEAN: *out_addr = &bvalue(val); *out_size = sizeof(int); return; case KTAP_TYPE_LIGHTUSERDATA: *out_addr = pvalue(val); *out_size = sizeof(void *); return; case KTAP_TYPE_NUMBER: *out_addr = &nvalue(val); *out_size = sizeof(ktap_number); return; case KTAP_TYPE_STRING: *temp = (void *)svalue(val); *out_addr = temp; *out_size = sizeof(void *); return; } cd = cdvalue(val); cs = cd_csym(ks, cd); type = csym_type(cs); *out_size = csym_size(ks, cs); switch (type) { case FFI_VOID: kp_error(ks, "Error: Cannot copy data from void type\n"); return; case FFI_UINT8: case FFI_INT8: case FFI_UINT16: case FFI_INT16: case FFI_UINT32: case FFI_INT32: case FFI_UINT64: case FFI_INT64: *out_addr = &cd_int(cd); return; case FFI_PTR: *out_addr = &cd_ptr(cd); return; case FFI_STRUCT: case FFI_UNION: *out_addr = cd_record(cd); return; case FFI_FUNC: case FFI_UNKNOWN: kp_error(ks, "Error: internal error for csymbol %s\n", csym_name(cs)); return; } }
void kp_obj_show(ktap_state_t *ks, const ktap_val_t *v) { switch (itype(v)) { case KTAP_TNIL: kp_puts(ks, "nil"); break; case KTAP_TTRUE: kp_puts(ks, "true"); break; case KTAP_TFALSE: kp_puts(ks, "false"); break; case KTAP_TNUM: kp_printf(ks, "%ld", nvalue(v)); break; case KTAP_TLIGHTUD: kp_printf(ks, "lightud 0x%lx", (unsigned long)pvalue(v)); break; case KTAP_TCFUNC: kp_printf(ks, "cfunction 0x%lx", (unsigned long)fvalue(v)); break; case KTAP_TFUNC: kp_printf(ks, "function 0x%lx", (unsigned long)gcvalue(v)); break; case KTAP_TSTR: kp_puts(ks, svalue(v)); break; case KTAP_TTAB: kp_printf(ks, "table 0x%lx", (unsigned long)hvalue(v)); break; #ifdef CONFIG_KTAP_FFI case KTAP_TCDATA: kp_cdata_dump(ks, cdvalue(v)); break; #endif case KTAP_TEVENTSTR: /* check event context */ if (!ks->current_event) { kp_error(ks, "cannot stringify event str in invalid context\n"); return; } kp_transport_event_write(ks, ks->current_event); break; case KTAP_TKSTACK: kp_transport_print_kstack(ks, v->val.stack.depth, v->val.stack.skip); break; default: kp_error(ks, "print unknown value type: %d\n", itype(v)); break; } }
void kp_obj_show(ktap_state *ks, const ktap_value *v) { switch (ttype(v)) { case KTAP_TYPE_NIL: kp_puts(ks, "nil"); break; case KTAP_TYPE_NUMBER: kp_printf(ks, "%ld", nvalue(v)); break; case KTAP_TYPE_BOOLEAN: kp_puts(ks, (bvalue(v) == 1) ? "true" : "false"); break; case KTAP_TYPE_LIGHTUSERDATA: kp_printf(ks, "0x%lx", (unsigned long)pvalue(v)); break; case KTAP_TYPE_CFUNCTION: kp_printf(ks, "0x%lx", (unsigned long)fvalue(v)); break; case KTAP_TYPE_SHRSTR: case KTAP_TYPE_LNGSTR: kp_puts(ks, svalue(v)); break; case KTAP_TYPE_TABLE: kp_tab_dump(ks, hvalue(v)); break; #ifdef CONFIG_KTAP_FFI case KTAP_TYPE_CDATA: kp_cdata_dump(ks, cdvalue(v)); break; #endif case KTAP_TYPE_EVENT: kp_transport_event_write(ks, evalue(v)); break; case KTAP_TYPE_BTRACE: btrace_dump(ks, btvalue(v)); break; case KTAP_TYPE_PTABLE: kp_ptab_dump(ks, phvalue(v)); break; case KTAP_TYPE_STATDATA: kp_statdata_dump(ks, sdvalue(v)); break; default: kp_error(ks, "print unknown value type: %d\n", ttype(v)); break; } }
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; }
static csymbol *ffi_get_arg_csym(ktap_state_t *ks, csymbol_func *csf, int idx) { StkId arg; csymbol *cs; if (idx < csymf_arg_nr(csf)) return csymf_arg(ks, csf, idx); arg = kp_arg(ks, idx + 1); cs = id_to_csym(ks, ffi_get_csym_id(ks, "void *")); switch (ttypenv(arg)) { case KTAP_TYPE_LIGHTUSERDATA: case KTAP_TYPE_BOOLEAN: case KTAP_TYPE_NUMBER: case KTAP_TYPE_STRING: return cs; case KTAP_TYPE_CDATA: return cd_csym(ks, cdvalue(arg)); default: kp_error(ks, "Error: Cannot get type for arg %d\n", idx); return cs; } }
/* Notice: Even if the types are matched, there may exist the lost of * data in the unpack process due to precision */ int kp_cdata_type_match(ktap_state_t *ks, csymbol *cs, ktap_val_t *val) { ffi_type type; type = csym_type(cs); if (type == FFI_FUNC) goto error; switch (ttypenv(val)) { case KTAP_TYPE_LIGHTUSERDATA: if (type != FFI_PTR) goto error; break; case KTAP_TYPE_BOOLEAN: case KTAP_TYPE_NUMBER: if (type != FFI_UINT8 && type != FFI_INT8 && type != FFI_UINT16 && type != FFI_INT16 && type != FFI_UINT32 && type != FFI_INT32 && type != FFI_UINT64 && type != FFI_INT64) goto error; break; case KTAP_TYPE_STRING: if (type != FFI_PTR && type != FFI_UINT8 && type != FFI_INT8) goto error; break; case KTAP_TYPE_CDATA: if (cs != cd_csym(ks, cdvalue(val))) goto error; break; default: goto error; } return 0; error: return -1; }