PR 12590
[deliverable/binutils-gdb.git] / gdb / value.c
index d2863db1aa2cd18bbccbf73af5d483e0bbfa1bc7..2acb1df75db986a310fa0d52ccbbf007557574cd 100644 (file)
@@ -41,7 +41,7 @@
 #include "cli/cli-decode.h"
 #include "exceptions.h"
 #include "python/python.h"
-
+#include <ctype.h>
 #include "tracepoint.h"
 
 /* Prototypes for exported functions.  */
@@ -844,11 +844,15 @@ value_contents_all (struct value *value)
   return result;
 }
 
-/* Copy LENGTH bytes of SRC value's contents starting at SRC_OFFSET,
-   into DST value's contents, starting at DST_OFFSET.  If unavailable
-   contents are being copied from SRC, the corresponding DST contents
-   are marked unavailable accordingly.  Neither DST nor SRC may be
-   lazy values.  */
+/* Copy LENGTH bytes of SRC value's (all) contents
+   (value_contents_all) starting at SRC_OFFSET, into DST value's (all)
+   contents, starting at DST_OFFSET.  If unavailable contents are
+   being copied from SRC, the corresponding DST contents are marked
+   unavailable accordingly.  Neither DST nor SRC may be lazy
+   values.
+
+   It is assumed the contents of DST in the [DST_OFFSET,
+   DST_OFFSET+LENGTH) range are wholly available.  */
 
 void
 value_contents_copy_raw (struct value *dst, int dst_offset,
@@ -863,6 +867,11 @@ value_contents_copy_raw (struct value *dst, int dst_offset,
      mean we'd be copying garbage.  */
   gdb_assert (!dst->lazy && !src->lazy);
 
+  /* The overwritten DST range gets unavailability ORed in, not
+     replaced.  Make sure to remember to implement replacing if it
+     turns out actually necessary.  */
+  gdb_assert (value_bytes_available (dst, dst_offset, length));
+
   /* Copy the data.  */
   memcpy (value_contents_all_raw (dst) + dst_offset,
          value_contents_all_raw (src) + src_offset,
@@ -883,12 +892,16 @@ value_contents_copy_raw (struct value *dst, int dst_offset,
     }
 }
 
-/* Copy LENGTH bytes of SRC value's contents starting at SRC_OFFSET
-   byte, into DST value's contents, starting at DST_OFFSET.  If
-   unavailable contents are being copied from SRC, the corresponding
-   DST contents are marked unavailable accordingly.  DST must not be
-   lazy.  If SRC is lazy, it will be fetched now.  If SRC is not valid
-   (is optimized out), an error is thrown.  */
+/* Copy LENGTH bytes of SRC value's (all) contents
+   (value_contents_all) starting at SRC_OFFSET byte, into DST value's
+   (all) contents, starting at DST_OFFSET.  If unavailable contents
+   are being copied from SRC, the corresponding DST contents are
+   marked unavailable accordingly.  DST must not be lazy.  If SRC is
+   lazy, it will be fetched now.  If SRC is not valid (is optimized
+   out), an error is thrown.
+
+   It is assumed the contents of DST in the [DST_OFFSET,
+   DST_OFFSET+LENGTH) range are wholly available.  */
 
 void
 value_contents_copy (struct value *dst, int dst_offset,
@@ -2978,6 +2991,59 @@ value_from_decfloat (struct type *type, const gdb_byte *dec)
   return val;
 }
 
+/* Extract a value from the history file.  Input will be of the form
+   $digits or $$digits.  See block comment above 'write_dollar_variable'
+   for details.  */
+
+struct value *
+value_from_history_ref (char *h, char **endp)
+{
+  int index, len;
+
+  if (h[0] == '$')
+    len = 1;
+  else
+    return NULL;
+
+  if (h[1] == '$')
+    len = 2;
+
+  /* Find length of numeral string.  */
+  for (; isdigit (h[len]); len++)
+    ;
+
+  /* Make sure numeral string is not part of an identifier.  */
+  if (h[len] == '_' || isalpha (h[len]))
+    return NULL;
+
+  /* Now collect the index value.  */
+  if (h[1] == '$')
+    {
+      if (len == 2)
+       {
+         /* For some bizarre reason, "$$" is equivalent to "$$1", 
+            rather than to "$$0" as it ought to be!  */
+         index = -1;
+         *endp += len;
+       }
+      else
+       index = -strtol (&h[2], endp, 10);
+    }
+  else
+    {
+      if (len == 1)
+       {
+         /* "$" is equivalent to "$0".  */
+         index = 0;
+         *endp += len;
+       }
+      else
+       index = strtol (&h[1], endp, 10);
+    }
+
+  return access_value_history (index);
+}
+
 struct value *
 coerce_ref (struct value *arg)
 {
This page took 0.023908 seconds and 4 git commands to generate.