Пример #1
0
static int kplib_ffi_cast(ktap_state *ks)
{
	int n = kp_arg_nr(ks);
	unsigned long addr;
	csymbol_id cs_id;
	ktap_cdata *cd;

	if (unlikely(n != 2)) {
		/* this is not likely to happen since ffi.cast arguments are
		 * generated by compiler */
		set_nil(ks->top++);
		kp_error(ks, "wrong number of arguments\n");
		return 1;
	}

	kp_arg_check(ks, 1, KTAP_TYPE_NUMBER);
	kp_arg_check(ks, 2, KTAP_TYPE_NUMBER);

	cs_id = nvalue(kp_arg(ks, 1));
	addr = nvalue(kp_arg(ks, 2));

	if (unlikely(cs_id > max_csym_id(ks)))
		kp_error(ks, "invalid csymbol id\n");

	cd = kp_cdata_new_record(ks, (void *)addr, cs_id);
	set_cdata(ks->top, cd);
	incr_top(ks);
	return 1;
}
Пример #2
0
static int kplib_ffi_new(ktap_state *ks)
{
	int n = kp_arg_nr(ks), array_size;
	csymbol_id cs_id;
	ktap_cdata *cd;

	if (unlikely(n != 2)) {
		/* this is not likely to happen since ffi.new arguments are
		 * generated by compiler */
		set_nil(ks->top++);
		kp_error(ks, "wrong number of arguments\n");
		return 1;
	}

	kp_arg_check(ks, 1, KTAP_TYPE_NUMBER);
	kp_arg_check(ks, 2, KTAP_TYPE_NUMBER);

	cs_id = nvalue(kp_arg(ks, 1));
	array_size = nvalue(kp_arg(ks, 2));

	if (unlikely(cs_id > max_csym_id(ks)))
		kp_error(ks, "invalid csymbol id\n");

	kp_verbose_printf(ks, "ffi.new symbol %s with length %d\n",
			id_to_csym(ks, cs_id)->name, array_size);

	cd = kp_cdata_new_ptr(ks, NULL, array_size, cs_id, 1);
	set_cdata(ks->top, cd);
	incr_top(ks);

	return 1;
}
Пример #3
0
static int kplib_ffi_new(ktap_state_t *ks)
{
	int n = kp_arg_nr(ks);
	csymbol_id cs_id = kp_arg_checknumber(ks, 1);
	int array_size = kp_arg_checknumber(ks, 2);
	int is_array = kp_arg_checknumber(ks, 3);
	ktap_cdata_t *cd;

	if (unlikely(n != 3)) {
		/* this is not likely to happen since ffi.new arguments are
		 * generated by compiler */
		set_nil(ks->top++);
		kp_error(ks, "wrong number of arguments\n");
		return 1;
	}

	if (unlikely(cs_id > max_csym_id(ks)))
		kp_error(ks, "invalid csymbol id\n");

	kp_verbose_printf(ks, "ffi.new symbol %s with length %d\n",
			id_to_csym(ks, cs_id)->name, array_size);

	if (is_array)
		cd = kp_cdata_new_ptr(ks, NULL, array_size, cs_id, 1);
	else
		cd = kp_cdata_new_by_id(ks, NULL, cs_id);
	set_cdata(ks->top, cd);
	incr_top(ks);

	return 1;
}