示例#1
0
文件: cdata.c 项目: ktap/ktap
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;
	}
}
示例#2
0
文件: kp_obj.c 项目: awreece/ktap
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;
	}
}
示例#3
0
文件: kp_obj.c 项目: WinLinKer/ktap
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;
	}
}
示例#4
0
文件: lib_ffi.c 项目: lianghu/ktap
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;
}
示例#5
0
文件: ffi_call.c 项目: awreece/ktap
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;
	}
}
示例#6
0
文件: cdata.c 项目: ktap/ktap
/* 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;
}