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; }
/* 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); }
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; }