Пример #1
0
Файл: value.c Проект: 5py/ltrace
size_t
value_size(struct value *val, struct value_dict *arguments)
{
	if (val->size != (size_t)-1)
		return val->size;

	if (val->type->type != ARGTYPE_ARRAY)
		return val->size = type_sizeof(val->inferior, val->type);

	struct value length;
	if (expr_eval(val->type->u.array_info.length, val,
		      arguments, &length) < 0)
		return (size_t)-1;

	size_t l;
	int o = value_extract_word(&length, (long *)&l, arguments);
	value_destroy(&length);

	if (o < 0)
		return (size_t)-1;

	size_t elt_size = type_sizeof(val->inferior,
				      val->type->u.array_info.elt_type);
	if (elt_size == (size_t)-1)
		return (size_t)-1;

	return val->size = elt_size * l;
}
Пример #2
0
/* LHS->zero(RHS).  Looks for a length of zero-terminated array, but
 * looks no further than first RHS bytes.  */
static int
zero_callback(struct value *ret_value, struct value *lhs,
	      struct value *rhs, struct value_dict *arguments, void *data)
{
	long l;
	if (value_extract_word(rhs, &l, arguments) < 0)
		return -1;
	if (l < 0)
		/* It might just be a positive value >2GB, but that's
		 * not likely.  */
		report_global_error("maximum array length seems negative");
	size_t max = (size_t)l;
	return zero_callback_max(ret_value, lhs, arguments, max, data);
}
Пример #3
0
Файл: value.c Проект: 5py/ltrace
int
value_init_deref(struct value *ret_val, struct value *valp)
{
	assert(valp->type->type == ARGTYPE_POINTER);

	/* Note: extracting a pointer value should not need value_dict
	 * with function arguments.  */
	long l;
	if (value_extract_word(valp, &l, NULL) < 0)
		return -1;

	/* We need "long" to be long enough to hold platform
	 * pointers.  */
	typedef char assert__long_enough_long[-(sizeof(l) < sizeof(void *))];

	value_common_init(ret_val, valp->inferior, valp,
			  valp->type->u.ptr_info.info, 0);
	ret_val->u.value = l; /* Set the address.  */
	ret_val->where = VAL_LOC_INFERIOR;
	return 0;
}