From cd24cfaa4f49cd34f25ef0bd97f8e52fc885b0b1 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 16 Feb 2011 10:13:53 +0000 Subject: [PATCH] * value.c (value_available_contents_eq): Remove redundant local variables. Fix available contents comparision. * value.h (value_available_contents_eq): Extend describing comment. --- gdb/ChangeLog | 8 ++++++++ gdb/value.c | 21 ++++++--------------- gdb/value.h | 21 +++++++++++++++------ 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 41f7a861d3..f026bad267 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2011-02-16 Pedro Alves + Jan Kratochvil + + * 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 * thread.c (info_threads_command): Add missing i18n markup and remove diff --git a/gdb/value.c b/gdb/value.c index 2e07a85cdd..d2863db1aa 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -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; diff --git a/gdb/value.h b/gdb/value.h index b8ce97b4a0..e019e56676 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -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 -- 2.34.1