aboutsummaryrefslogtreecommitdiff
path: root/gdb/guile
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/guile')
-rw-r--r--gdb/guile/scm-param.c62
1 files changed, 35 insertions, 27 deletions
diff --git a/gdb/guile/scm-param.c b/gdb/guile/scm-param.c
index 0ae368a..17746da 100644
--- a/gdb/guile/scm-param.c
+++ b/gdb/guile/scm-param.c
@@ -44,7 +44,7 @@ union pascm_variable
unsigned int uintval;
/* Hold a string, for the various string types. */
- char *stringval;
+ std::string *stringval;
/* Hold a string, for enums. */
const char *cstringval;
@@ -57,10 +57,7 @@ union pascm_variable
2) Call register-parameter! to add the parameter to gdb.
It is done this way so that the constructor, make-parameter, doesn't have
any side-effects. This means that the smob needs to store everything
- that was passed to make-parameter.
-
- N.B. There is no free function for this smob.
- All objects pointed to by this smob must live in GC space. */
+ that was passed to make-parameter. */
struct param_smob
{
@@ -120,7 +117,6 @@ struct param_smob
static setting
make_setting (param_smob *s)
{
-
if (var_type_uses<bool> (s->type))
return setting (s->type, &s->value.boolval);
else if (var_type_uses<int> (s->type))
@@ -129,8 +125,8 @@ make_setting (param_smob *s)
return setting (s->type, &s->value.autoboolval);
else if (var_type_uses<unsigned int> (s->type))
return setting (s->type, &s->value.uintval);
- else if (var_type_uses<char *> (s->type))
- return setting (s->type, &s->value.stringval);
+ else if (var_type_uses<std::string> (s->type))
+ return setting (s->type, s->value.stringval);
else if (var_type_uses<const char *> (s->type))
return setting (s->type, &s->value.cstringval);
else
@@ -432,14 +428,14 @@ add_setshow_generic (enum var_types param_type, enum command_class cmd_class,
case var_string:
commands = add_setshow_string_cmd (cmd_name, cmd_class,
- &self->value.stringval, set_doc,
+ self->value.stringval, set_doc,
show_doc, help_doc, set_func,
show_func, set_list, show_list);
break;
case var_string_noescape:
commands = add_setshow_string_noescape_cmd (cmd_name, cmd_class,
- &self->value.stringval,
+ self->value.stringval,
set_doc, show_doc, help_doc,
set_func, show_func, set_list,
show_list);
@@ -448,7 +444,7 @@ add_setshow_generic (enum var_types param_type, enum command_class cmd_class,
case var_optional_filename:
commands = add_setshow_optional_filename_cmd (cmd_name, cmd_class,
- &self->value.stringval,
+ self->value.stringval,
set_doc, show_doc, help_doc,
set_func, show_func,
set_list, show_list);
@@ -456,7 +452,7 @@ add_setshow_generic (enum var_types param_type, enum command_class cmd_class,
case var_filename:
commands = add_setshow_filename_cmd (cmd_name, cmd_class,
- &self->value.stringval, set_doc,
+ self->value.stringval, set_doc,
show_doc, help_doc, set_func,
show_func, set_list, show_list);
break;
@@ -602,14 +598,14 @@ pascm_param_value (const setting &var, int arg_pos, const char *func_name)
case var_string_noescape:
case var_optional_filename:
case var_filename:
- case var_enum:
{
- const char *str;
- if (var.type () == var_enum)
- str = var.get<const char *> ();
- else
- str = var.get<char *> ();
+ const std::string &str = var.get<std::string> ();
+ return gdbscm_scm_from_host_string (str.c_str (), str.length ());
+ }
+ case var_enum:
+ {
+ const char *str = var.get<const char *> ();
if (str == nullptr)
str = "";
return gdbscm_scm_from_host_string (str, strlen (str));
@@ -682,13 +678,7 @@ pascm_set_param_value_x (param_smob *p_smob,
value, arg_pos, func_name,
_("string or #f for non-PARAM_FILENAME parameters"));
if (gdbscm_is_false (value))
- {
- xfree (var.get<char *> ());
- if (var.type () == var_optional_filename)
- var.set<char *> (xstrdup (""));
- else
- var.set<char *> (nullptr);
- }
+ var.set<std::string> ("");
else
{
SCM exception;
@@ -697,8 +687,7 @@ pascm_set_param_value_x (param_smob *p_smob,
= gdbscm_scm_to_host_string (value, nullptr, &exception);
if (string == nullptr)
gdbscm_throw (exception);
- xfree (var.get<char *> ());
- var.set<char *> (string.release ());
+ var.set<std::string> (string.release ());
}
break;
@@ -798,6 +787,21 @@ pascm_set_param_value_x (param_smob *p_smob,
gdb_assert_not_reached ("bad parameter type");
}
}
+
+/* Free function for a param_smob. */
+static size_t
+pascm_free_parameter_smob (SCM self)
+{
+ param_smob *p_smob = (param_smob *) SCM_SMOB_DATA (self);
+
+ if (var_type_uses<std::string> (p_smob->type))
+ {
+ delete p_smob->value.stringval;
+ p_smob->value.stringval = nullptr;
+ }
+
+ return 0;
+}
/* Parameter Scheme functions. */
@@ -954,6 +958,10 @@ gdbscm_make_parameter (SCM name_scm, SCM rest)
p_smob->set_func = set_func;
p_smob->show_func = show_func;
+ scm_set_smob_free (parameter_smob_tag, pascm_free_parameter_smob);
+ if (var_type_uses<std::string> (p_smob->type))
+ p_smob->value.stringval = new std::string;
+
if (initial_value_arg_pos > 0)
{
if (gdbscm_is_procedure (initial_value_scm))