* valops.c (value_cast): When casting a pointer to an integer,
authorJim Blandy <jimb@codesourcery.com>
Tue, 10 Jul 2001 21:15:28 +0000 (21:15 +0000)
committerJim Blandy <jimb@codesourcery.com>
Tue, 10 Jul 2001 21:15:28 +0000 (21:15 +0000)
don't convert it to an address.

gdb/ChangeLog
gdb/valops.c

index 81098a8d94685b18e694f22bd7ffc5090a5ffbe4..f439aedfa9548df54f781f18ee51aa01c66dab9b 100644 (file)
@@ -1,3 +1,8 @@
+2001-07-10  Jim Blandy  <jimb@redhat.com>
+
+       * valops.c (value_cast): When casting a pointer to an integer,
+       don't convert it to an address.
+
 2001-07-10  Andrew Cagney  <ac131313@redhat.com>
 
        * remote-utils.h (struct serial): Declare as opaque.  Remove
index 7cc025d4eff3e5992cd9570bc4f54382cc739e57..dc987c4aba84355b78eb68d255ea8eb52f172c4f 100644 (file)
@@ -281,7 +281,18 @@ value_cast (struct type *type, register value_ptr arg2)
              break;            /* fall out and go to normal handling */
            }
        }
-      longest = value_as_long (arg2);
+
+      /* When we cast pointers to integers, we mustn't use
+         POINTER_TO_ADDRESS to find the address the pointer
+         represents, as value_as_long would.  GDB should evaluate
+         expressions just as the compiler would --- and the compiler
+         sees a cast as a simple reinterpretation of the pointer's
+         bits.  */
+      if (code2 == TYPE_CODE_PTR)
+        longest = extract_unsigned_integer (VALUE_CONTENTS (arg2),
+                                            TYPE_LENGTH (type2));
+      else
+        longest = value_as_long (arg2);
       return value_from_longest (type, convert_to_boolean ?
                                 (LONGEST) (longest ? 1 : 0) : longest);
     }