aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/valops.c36
-rw-r--r--gdb/value.h2
3 files changed, 32 insertions, 12 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 37c37a9..ace1c49 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2002-10-13 Adam Fedor <fedor@gnu.org>
+ * valops.c (value_of_local): New function.
+ (value_of_this): Use it.
+ * value.h (value_of_local): Declared.
+
+2002-10-13 Adam Fedor <fedor@gnu.org>
+
* parse.c: (length_of_subexp, prefixify_subexp): Handle
OP_MSGCALL, OP_SELECTOR, OP_NSSTRING, and OP_SELF.
diff --git a/gdb/valops.c b/gdb/valops.c
index eaf4295..e91e231 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -3306,18 +3306,17 @@ value_full_object (struct value *argp, struct type *rtype, int xfull, int xtop,
-/* C++: return the value of the class instance variable, if one exists.
+/* Return the value of the local variable, if one exists.
Flag COMPLAIN signals an error if the request is made in an
inappropriate context. */
struct value *
-value_of_this (int complain)
+value_of_local (const char *name, int complain)
{
struct symbol *func, *sym;
struct block *b;
int i;
- static const char funny_this[] = "this";
- struct value *this;
+ struct value * ret;
if (selected_frame == 0)
{
@@ -3331,7 +3330,7 @@ value_of_this (int complain)
if (!func)
{
if (complain)
- error ("no `this' in nameless context");
+ error ("no %s in nameless context", name);
else
return 0;
}
@@ -3341,26 +3340,39 @@ value_of_this (int complain)
if (i <= 0)
{
if (complain)
- error ("no args, no `this'");
+ error ("no args, no %s", name);
else
return 0;
}
/* Calling lookup_block_symbol is necessary to get the LOC_REGISTER
symbol instead of the LOC_ARG one (if both exist). */
- sym = lookup_block_symbol (b, funny_this, NULL, VAR_NAMESPACE);
+ sym = lookup_block_symbol (b, name, NULL, VAR_NAMESPACE);
if (sym == NULL)
{
if (complain)
- error ("current stack frame not in method");
+ error ("current stack frame does not contain a variable named \"%s\"", name);
else
return NULL;
}
- this = read_var_value (sym, selected_frame);
- if (this == 0 && complain)
- error ("`this' argument at unknown address");
- return this;
+ ret = read_var_value (sym, selected_frame);
+ if (ret == 0 && complain)
+ error ("%s argument unreadable", name);
+ return ret;
+}
+
+/* C++/Objective-C: return the value of the class instance variable,
+ if one exists. Flag COMPLAIN signals an error if the request is
+ made in an inappropriate context. */
+
+struct value *
+value_of_this (int complain)
+{
+ if (current_language->la_language == language_objc)
+ return value_of_local ("self", complain);
+ else
+ return value_of_local ("this", complain);
}
/* Create a slice (sub-string, sub-array) of ARRAY, that is LENGTH elements
diff --git a/gdb/value.h b/gdb/value.h
index efabecb..a38b576 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -566,4 +566,6 @@ extern CORE_ADDR default_push_arguments (int nargs, struct value ** args,
CORE_ADDR sp, int struct_return,
CORE_ADDR struct_addr);
+extern struct value *value_of_local (const char *name, int complain);
+
#endif /* !defined (VALUE_H) */