* value.c (value_available_contents_eq): Remove redundant local

variables.  Fix available contents comparision.
	* value.h (value_available_contents_eq): Extend describing
	comment.
This commit is contained in:
Pedro Alves 2011-02-16 10:13:53 +00:00
parent 60bbf3380a
commit cd24cfaa4f
3 changed files with 29 additions and 21 deletions

View file

@ -1,3 +1,11 @@
2011-02-16 Pedro Alves <pedro@codesourcery.com>
Jan Kratochvil <jan.kratochvil@redhat.com>
* value.c (value_available_contents_eq): Remove redundant local
variables. Fix available contents comparision.
* value.h (value_available_contents_eq): Extend describing
comment.
2011-02-16 Yao Qi <yao@codesourcery.com>
* thread.c (info_threads_command): Add missing i18n markup and remove

View file

@ -533,21 +533,13 @@ value_available_contents_eq (const struct value *val1, int offset1,
const struct value *val2, int offset2,
int length)
{
int org_len = length;
int org_offset1 = offset1;
int org_offset2 = offset2;
int idx1 = 0, idx2 = 0;
int prev_avail;
/* This routine is used by printing routines, where we should
already have read the value. Note that we only know whether a
value chunk is available if we've tried to read it. */
gdb_assert (!val1->lazy && !val2->lazy);
/* The offset from either ORG_OFFSET1 or ORG_OFFSET2 where the
available contents we haven't compared yet start. */
prev_avail = 0;
while (length > 0)
{
range_s *r1, *r2;
@ -561,9 +553,9 @@ value_available_contents_eq (const struct value *val1, int offset1,
/* The usual case is for both values to be completely available. */
if (idx1 == -1 && idx2 == -1)
return (memcmp (val1->contents + org_offset1 + prev_avail,
val2->contents + org_offset2 + prev_avail,
org_len - prev_avail) == 0);
return (memcmp (val1->contents + offset1,
val2->contents + offset2,
length) == 0);
/* The contents only match equal if the available set matches as
well. */
else if (idx1 == -1 || idx2 == -1)
@ -596,12 +588,11 @@ value_available_contents_eq (const struct value *val1, int offset1,
return 0;
/* Compare the _available_ contents. */
if (memcmp (val1->contents + org_offset1 + prev_avail,
val2->contents + org_offset2 + prev_avail,
l2 - prev_avail) != 0)
if (memcmp (val1->contents + offset1,
val2->contents + offset2,
l1) != 0)
return 0;
prev_avail += h1;
length -= h1;
offset1 += h1;
offset2 += h1;

View file

@ -379,12 +379,21 @@ extern void mark_value_bytes_unavailable (struct value *value,
int offset, int length);
/* Compare LENGTH bytes of VAL1's contents starting at OFFSET1 with
LENGTH bytes of VAL2's contents starting at OFFSET2. Returns true
iff the set of available contents match. Unavailable contents
compare equal with unavailable contents, and different with any
available byte. For example, if 'x's represent an unavailable
byte, and 'V' and 'Z' represent different available bytes, in a
value with length 16:
LENGTH bytes of VAL2's contents starting at OFFSET2.
Note that "contents" refers to the whole value's contents
(value_contents_all), without any embedded offset adjustment. For
example, to compare a complete object value with itself, including
its enclosing type chunk, you'd do:
int len = TYPE_LENGTH (check_typedef (value_enclosing_type (val)));
value_available_contents (val, 0, val, 0, len);
Returns true iff the set of available contents match. Unavailable
contents compare equal with unavailable contents, and different
with any available byte. For example, if 'x's represent an
unavailable byte, and 'V' and 'Z' represent different available
bytes, in a value with length 16:
offset: 0 4 8 12 16
contents: xxxxVVVVxxxxVVZZ