/* Implementation of the GDB variable objects API.
- Copyright (C) 1999-2013 Free Software Foundation, Inc.
+ Copyright (C) 1999-2014 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "valprint.h"
#include "gdb_assert.h"
-#include "gdb_string.h"
+#include <string.h>
#include "gdb_regex.h"
#include "varobj.h"
char *varobj_format_string[] =
{ "natural", "binary", "decimal", "hexadecimal", "octal" };
-/* String representations of gdb's known languages. */
-char *varobj_language_string[] = { "C", "C++", "Java" };
-
/* True if we want to allow Python-based pretty-printing. */
static int pretty_printing = 0;
/* Language-related operations for this variable and its
children. */
- const struct lang_varobj_ops *lang;
+ const struct lang_varobj_ops *lang_ops;
/* The varobj for this root node. */
struct varobj *rootvar;
/* Language-specific routines. */
-static enum varobj_languages variable_language (struct varobj *var);
-
static int number_of_children (struct varobj *);
static char *name_of_variable (struct varobj *);
#endif /* HAVE_PYTHON */
-/* Array of known source language routines. */
-static const struct lang_varobj_ops *languages[vlang_end] = {
- &c_varobj_ops,
- &cplus_varobj_ops,
- &java_varobj_ops,
- &ada_varobj_ops,
-};
-
/* Private data */
/* Mappings of varobj_display_formats enums to gdb's format codes. */
struct frame_id old_id = null_frame_id;
struct block *block;
const char *p;
- enum varobj_languages lang;
struct value *value = NULL;
volatile struct gdb_exception except;
CORE_ADDR pc;
}
/* Set language info */
- lang = variable_language (var);
- var->root->lang = languages[lang];
+ var->root->lang_ops = var->root->exp->language_defn->la_varobj_ops;
install_new_value (var, value, 1 /* Initial assignment */);
char *
varobj_get_type (struct varobj *var)
{
- /* For the "fake" variables, do not return a type. (It's type is
+ /* For the "fake" variables, do not return a type. (Its type is
NULL, too.)
Do not return a type for invalid variables as well. */
if (CPLUS_FAKE_CHILD (var) || !var->root->is_valid)
when creating varobj, so here it should be
child varobj. */
gdb_assert (!is_root_p (var));
- return (*var->root->lang->path_expr_of_child) (var);
+ return (*var->root->lang_ops->path_expr_of_child) (var);
}
}
-enum varobj_languages
+const struct language_defn *
varobj_get_language (struct varobj *var)
{
- return variable_language (var);
+ return var->root->exp->language_defn;
}
int
if (var->num_children < 0)
return 0;
- if (var->root->lang->value_has_mutated)
- return var->root->lang->value_has_mutated (var, new_value, new_type);
+ if (var->root->lang_ops->value_has_mutated)
+ return var->root->lang_ops->value_has_mutated (var, new_value, new_type);
else
return 0;
}
if (new)
new_type = value_type (new);
else
- new_type = v->root->lang->type_of_child (v->parent, v->index);
+ new_type = v->root->lang_ops->type_of_child (v->parent, v->index);
if (varobj_value_has_mutated (v, new, new_type))
{
child->type = value_actual_type (value, 0, NULL);
else
/* Otherwise, we must compute the type. */
- child->type = (*child->root->lang->type_of_child) (child->parent,
- child->index);
+ child->type = (*child->root->lang_ops->type_of_child) (child->parent,
+ child->index);
install_new_value (child, value, 1);
return child;
struct varobj *var = new_variable ();
var->root = (struct varobj_root *) xmalloc (sizeof (struct varobj_root));
- var->root->lang = NULL;
+ var->root->lang_ops = NULL;
var->root->exp = NULL;
var->root->valid_block = NULL;
var->root->frame = null_frame_id;
/* Common entry points */
-/* Get the language of variable VAR. */
-static enum varobj_languages
-variable_language (struct varobj *var)
-{
- enum varobj_languages lang;
-
- switch (var->root->exp->language_defn->la_language)
- {
- default:
- case language_c:
- lang = vlang_c;
- break;
- case language_cplus:
- lang = vlang_cplus;
- break;
- case language_java:
- lang = vlang_java;
- break;
- case language_ada:
- lang = vlang_ada;
- break;
- }
-
- return lang;
-}
-
/* Return the number of children for a given variable.
The result of this function is defined by the language
implementation. The number of children returned by this function
static int
number_of_children (struct varobj *var)
{
- return (*var->root->lang->number_of_children) (var);
+ return (*var->root->lang_ops->number_of_children) (var);
}
/* What is the expression for the root varobj VAR? Returns a malloc'd
static char *
name_of_variable (struct varobj *var)
{
- return (*var->root->lang->name_of_variable) (var);
+ return (*var->root->lang_ops->name_of_variable) (var);
}
/* What is the name of the INDEX'th child of VAR? Returns a malloc'd
static char *
name_of_child (struct varobj *var, int index)
{
- return (*var->root->lang->name_of_child) (var, index);
+ return (*var->root->lang_ops->name_of_child) (var, index);
}
/* If frame associated with VAR can be found, switch
{
struct value *value;
- value = (*parent->root->lang->value_of_child) (parent, index);
+ value = (*parent->root->lang_ops->value_of_child) (parent, index);
return value;
}
{
if (var->dynamic->pretty_printer != NULL)
return varobj_value_get_print_value (var->value, var->format, var);
- return (*var->root->lang->value_of_variable) (var, format);
+ return (*var->root->lang_ops->value_of_variable) (var, format);
}
else
return NULL;
int
varobj_value_is_changeable_p (struct varobj *var)
{
- return var->root->lang->value_is_changeable_p (var);
+ return var->root->lang_ops->value_is_changeable_p (var);
}
/* Return 1 if that varobj is floating, that is is always evaluated in the