diff options
Diffstat (limited to 'gdb/guile')
-rw-r--r-- | gdb/guile/scm-param.c | 62 |
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)) |