Remove some cleanups from the rust code
This removes some cleanups from the rust code, in favor of C++ objects with destructors. 2016-11-12 Tom Tromey <tom@tromey.com> * rust-exp.y (super_name): Use std::vector. (lex_number): Use std::string. (convert_params_to_types): Return std::vector. (convert_ast_to_type, convert_name): Update. * rust-lang.c (rust_get_disr_info): Use unique_xmalloc_ptr.
This commit is contained in:
parent
d93f4d96bb
commit
8001f1183f
3 changed files with 47 additions and 63 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2016-11-12 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* rust-exp.y (super_name): Use std::vector.
|
||||||
|
(lex_number): Use std::string.
|
||||||
|
(convert_params_to_types): Return std::vector.
|
||||||
|
(convert_ast_to_type, convert_name): Update.
|
||||||
|
* rust-lang.c (rust_get_disr_info): Use unique_xmalloc_ptr.
|
||||||
|
|
||||||
2016-11-12 Tom Tromey <tom@tromey.com>
|
2016-11-12 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* rust-lang.c (rust_get_disr_info): Use std::string in one more
|
* rust-lang.c (rust_get_disr_info): Use std::string in one more
|
||||||
|
|
|
@ -974,15 +974,13 @@ super_name (const struct rust_op *ident, unsigned int n_supers)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int len;
|
int len;
|
||||||
VEC (int) *offsets = NULL;
|
std::vector<int> offsets;
|
||||||
unsigned int current_len;
|
unsigned int current_len;
|
||||||
struct cleanup *cleanup;
|
|
||||||
|
|
||||||
cleanup = make_cleanup (VEC_cleanup (int), &offsets);
|
|
||||||
current_len = cp_find_first_component (scope);
|
current_len = cp_find_first_component (scope);
|
||||||
while (scope[current_len] != '\0')
|
while (scope[current_len] != '\0')
|
||||||
{
|
{
|
||||||
VEC_safe_push (int, offsets, current_len);
|
offsets.push_back (current_len);
|
||||||
gdb_assert (scope[current_len] == ':');
|
gdb_assert (scope[current_len] == ':');
|
||||||
/* The "::". */
|
/* The "::". */
|
||||||
current_len += 2;
|
current_len += 2;
|
||||||
|
@ -990,13 +988,11 @@ super_name (const struct rust_op *ident, unsigned int n_supers)
|
||||||
+ current_len);
|
+ current_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
len = VEC_length (int, offsets);
|
len = offsets.size ();
|
||||||
if (n_supers >= len)
|
if (n_supers >= len)
|
||||||
error (_("Too many super:: uses from '%s'"), scope);
|
error (_("Too many super:: uses from '%s'"), scope);
|
||||||
|
|
||||||
offset = VEC_index (int, offsets, len - n_supers);
|
offset = offsets[len - n_supers];
|
||||||
|
|
||||||
do_cleanups (cleanup);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
offset = strlen (scope);
|
offset = strlen (scope);
|
||||||
|
@ -1424,13 +1420,11 @@ lex_number (void)
|
||||||
int is_integer = 0;
|
int is_integer = 0;
|
||||||
int could_be_decimal = 1;
|
int could_be_decimal = 1;
|
||||||
int implicit_i32 = 0;
|
int implicit_i32 = 0;
|
||||||
char *type_name = NULL;
|
const char *type_name = NULL;
|
||||||
struct type *type;
|
struct type *type;
|
||||||
int end_index;
|
int end_index;
|
||||||
int type_index = -1;
|
int type_index = -1;
|
||||||
int i, out;
|
int i;
|
||||||
char *number;
|
|
||||||
struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
|
|
||||||
|
|
||||||
match = regexec (&number_regex, lexptr, ARRAY_SIZE (subexps), subexps, 0);
|
match = regexec (&number_regex, lexptr, ARRAY_SIZE (subexps), subexps, 0);
|
||||||
/* Failure means the regexp is broken. */
|
/* Failure means the regexp is broken. */
|
||||||
|
@ -1492,29 +1486,28 @@ lex_number (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute the type name if we haven't already. */
|
/* Compute the type name if we haven't already. */
|
||||||
|
std::string type_name_holder;
|
||||||
if (type_name == NULL)
|
if (type_name == NULL)
|
||||||
{
|
{
|
||||||
gdb_assert (type_index != -1);
|
gdb_assert (type_index != -1);
|
||||||
type_name = xstrndup (lexptr + subexps[type_index].rm_so,
|
type_name_holder = std::string (lexptr + subexps[type_index].rm_so,
|
||||||
(subexps[type_index].rm_eo
|
(subexps[type_index].rm_eo
|
||||||
- subexps[type_index].rm_so));
|
- subexps[type_index].rm_so));
|
||||||
make_cleanup (xfree, type_name);
|
type_name = type_name_holder.c_str ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Look up the type. */
|
/* Look up the type. */
|
||||||
type = rust_type (type_name);
|
type = rust_type (type_name);
|
||||||
|
|
||||||
/* Copy the text of the number and remove the "_"s. */
|
/* Copy the text of the number and remove the "_"s. */
|
||||||
number = xstrndup (lexptr, end_index);
|
std::string number;
|
||||||
make_cleanup (xfree, number);
|
for (i = 0; i < end_index && lexptr[i]; ++i)
|
||||||
for (i = out = 0; number[i]; ++i)
|
|
||||||
{
|
{
|
||||||
if (number[i] == '_')
|
if (lexptr[i] == '_')
|
||||||
could_be_decimal = 0;
|
could_be_decimal = 0;
|
||||||
else
|
else
|
||||||
number[out++] = number[i];
|
number.push_back (lexptr[i]);
|
||||||
}
|
}
|
||||||
number[out] = '\0';
|
|
||||||
|
|
||||||
/* Advance past the match. */
|
/* Advance past the match. */
|
||||||
lexptr += subexps[0].rm_eo;
|
lexptr += subexps[0].rm_eo;
|
||||||
|
@ -1524,6 +1517,8 @@ lex_number (void)
|
||||||
{
|
{
|
||||||
uint64_t value;
|
uint64_t value;
|
||||||
int radix = 10;
|
int radix = 10;
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
if (number[0] == '0')
|
if (number[0] == '0')
|
||||||
{
|
{
|
||||||
if (number[1] == 'x')
|
if (number[1] == 'x')
|
||||||
|
@ -1534,12 +1529,12 @@ lex_number (void)
|
||||||
radix = 2;
|
radix = 2;
|
||||||
if (radix != 10)
|
if (radix != 10)
|
||||||
{
|
{
|
||||||
number += 2;
|
offset = 2;
|
||||||
could_be_decimal = 0;
|
could_be_decimal = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
value = strtoul (number, NULL, radix);
|
value = strtoul (number.c_str () + offset, NULL, radix);
|
||||||
if (implicit_i32 && value >= ((uint64_t) 1) << 31)
|
if (implicit_i32 && value >= ((uint64_t) 1) << 31)
|
||||||
type = rust_type ("i64");
|
type = rust_type ("i64");
|
||||||
|
|
||||||
|
@ -1548,11 +1543,10 @@ lex_number (void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rustyylval.typed_val_float.dval = strtod (number, NULL);
|
rustyylval.typed_val_float.dval = strtod (number.c_str (), NULL);
|
||||||
rustyylval.typed_val_float.type = type;
|
rustyylval.typed_val_float.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
do_cleanups (cleanup);
|
|
||||||
return is_integer ? (could_be_decimal ? DECIMAL_INTEGER : INTEGER) : FLOAT;
|
return is_integer ? (could_be_decimal ? DECIMAL_INTEGER : INTEGER) : FLOAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1959,18 +1953,16 @@ static const char *convert_name (struct parser_state *state,
|
||||||
/* Convert a vector of rust_ops representing types to a vector of
|
/* Convert a vector of rust_ops representing types to a vector of
|
||||||
types. */
|
types. */
|
||||||
|
|
||||||
static VEC (type_ptr) *
|
static std::vector<struct type *>
|
||||||
convert_params_to_types (struct parser_state *state, VEC (rust_op_ptr) *params)
|
convert_params_to_types (struct parser_state *state, VEC (rust_op_ptr) *params)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
const struct rust_op *op;
|
const struct rust_op *op;
|
||||||
VEC (type_ptr) *result = NULL;
|
std::vector<struct type *> result;
|
||||||
struct cleanup *cleanup = make_cleanup (VEC_cleanup (type_ptr), &result);
|
|
||||||
|
|
||||||
for (i = 0; VEC_iterate (rust_op_ptr, params, i, op); ++i)
|
for (i = 0; VEC_iterate (rust_op_ptr, params, i, op); ++i)
|
||||||
VEC_safe_push (type_ptr, result, convert_ast_to_type (state, op));
|
result.push_back (convert_ast_to_type (state, op));
|
||||||
|
|
||||||
discard_cleanups (cleanup);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2022,40 +2014,33 @@ convert_ast_to_type (struct parser_state *state,
|
||||||
|
|
||||||
case TYPE_CODE_FUNC:
|
case TYPE_CODE_FUNC:
|
||||||
{
|
{
|
||||||
VEC (type_ptr) *args
|
std::vector<struct type *> args
|
||||||
= convert_params_to_types (state, *operation->right.params);
|
(convert_params_to_types (state, *operation->right.params));
|
||||||
struct cleanup *cleanup
|
|
||||||
= make_cleanup (VEC_cleanup (type_ptr), &args);
|
|
||||||
struct type **argtypes = NULL;
|
struct type **argtypes = NULL;
|
||||||
|
|
||||||
type = convert_ast_to_type (state, operation->left.op);
|
type = convert_ast_to_type (state, operation->left.op);
|
||||||
if (!VEC_empty (type_ptr, args))
|
if (!args.empty ())
|
||||||
argtypes = VEC_address (type_ptr, args);
|
argtypes = args.data ();
|
||||||
|
|
||||||
result
|
result
|
||||||
= lookup_function_type_with_arguments (type,
|
= lookup_function_type_with_arguments (type, args.size (),
|
||||||
VEC_length (type_ptr, args),
|
|
||||||
argtypes);
|
argtypes);
|
||||||
result = lookup_pointer_type (result);
|
result = lookup_pointer_type (result);
|
||||||
|
|
||||||
do_cleanups (cleanup);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_CODE_STRUCT:
|
case TYPE_CODE_STRUCT:
|
||||||
{
|
{
|
||||||
VEC (type_ptr) *args
|
std::vector<struct type *> args
|
||||||
= convert_params_to_types (state, *operation->left.params);
|
(convert_params_to_types (state, *operation->left.params));
|
||||||
struct cleanup *cleanup
|
|
||||||
= make_cleanup (VEC_cleanup (type_ptr), &args);
|
|
||||||
int i;
|
int i;
|
||||||
struct type *type;
|
struct type *type;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
obstack_1grow (&work_obstack, '(');
|
obstack_1grow (&work_obstack, '(');
|
||||||
for (i = 0; VEC_iterate (type_ptr, args, i, type); ++i)
|
for (i = 0; i < args.size (); ++i)
|
||||||
{
|
{
|
||||||
std::string type_name = type_to_string (type);
|
std::string type_name = type_to_string (args[i]);
|
||||||
|
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
obstack_1grow (&work_obstack, ',');
|
obstack_1grow (&work_obstack, ',');
|
||||||
|
@ -2070,8 +2055,6 @@ convert_ast_to_type (struct parser_state *state,
|
||||||
result = rust_lookup_type (name, expression_context_block);
|
result = rust_lookup_type (name, expression_context_block);
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
error (_("could not find tuple type '%s'"), name);
|
error (_("could not find tuple type '%s'"), name);
|
||||||
|
|
||||||
do_cleanups (cleanup);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2090,24 +2073,21 @@ convert_ast_to_type (struct parser_state *state,
|
||||||
static const char *
|
static const char *
|
||||||
convert_name (struct parser_state *state, const struct rust_op *operation)
|
convert_name (struct parser_state *state, const struct rust_op *operation)
|
||||||
{
|
{
|
||||||
VEC (type_ptr) *types;
|
|
||||||
struct cleanup *cleanup;
|
|
||||||
int i;
|
int i;
|
||||||
struct type *type;
|
|
||||||
|
|
||||||
gdb_assert (operation->opcode == OP_VAR_VALUE);
|
gdb_assert (operation->opcode == OP_VAR_VALUE);
|
||||||
|
|
||||||
if (operation->right.params == NULL)
|
if (operation->right.params == NULL)
|
||||||
return operation->left.sval.ptr;
|
return operation->left.sval.ptr;
|
||||||
|
|
||||||
types = convert_params_to_types (state, *operation->right.params);
|
std::vector<struct type *> types
|
||||||
cleanup = make_cleanup (VEC_cleanup (type_ptr), &types);
|
(convert_params_to_types (state, *operation->right.params));
|
||||||
|
|
||||||
obstack_grow_str (&work_obstack, operation->left.sval.ptr);
|
obstack_grow_str (&work_obstack, operation->left.sval.ptr);
|
||||||
obstack_1grow (&work_obstack, '<');
|
obstack_1grow (&work_obstack, '<');
|
||||||
for (i = 0; VEC_iterate (type_ptr, types, i, type); ++i)
|
for (i = 0; i < types.size (); ++i)
|
||||||
{
|
{
|
||||||
std::string type_name = type_to_string (type);
|
std::string type_name = type_to_string (types[i]);
|
||||||
|
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
obstack_1grow (&work_obstack, ',');
|
obstack_1grow (&work_obstack, ',');
|
||||||
|
@ -2116,8 +2096,6 @@ convert_name (struct parser_state *state, const struct rust_op *operation)
|
||||||
}
|
}
|
||||||
obstack_grow_str0 (&work_obstack, ">");
|
obstack_grow_str0 (&work_obstack, ">");
|
||||||
|
|
||||||
do_cleanups (cleanup);
|
|
||||||
|
|
||||||
return (const char *) obstack_finish (&work_obstack);
|
return (const char *) obstack_finish (&work_obstack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -145,7 +145,7 @@ rust_get_disr_info (struct type *type, const gdb_byte *valaddr,
|
||||||
if (strncmp (TYPE_FIELD_NAME (type, 0), RUST_ENUM_PREFIX,
|
if (strncmp (TYPE_FIELD_NAME (type, 0), RUST_ENUM_PREFIX,
|
||||||
strlen (RUST_ENUM_PREFIX)) == 0)
|
strlen (RUST_ENUM_PREFIX)) == 0)
|
||||||
{
|
{
|
||||||
char *tail, *token, *name, *saveptr = NULL;
|
char *tail, *token, *saveptr = NULL;
|
||||||
unsigned long fieldno;
|
unsigned long fieldno;
|
||||||
struct type *member_type;
|
struct type *member_type;
|
||||||
LONGEST value;
|
LONGEST value;
|
||||||
|
@ -158,9 +158,8 @@ rust_get_disr_info (struct type *type, const gdb_byte *valaddr,
|
||||||
/* Optimized enums have only one field. */
|
/* Optimized enums have only one field. */
|
||||||
member_type = TYPE_FIELD_TYPE (type, 0);
|
member_type = TYPE_FIELD_TYPE (type, 0);
|
||||||
|
|
||||||
name = xstrdup (TYPE_FIELD_NAME (type, 0));
|
gdb::unique_xmalloc_ptr<char> name (xstrdup (TYPE_FIELD_NAME (type, 0)));
|
||||||
cleanup = make_cleanup (xfree, name);
|
tail = name.get () + strlen (RUST_ENUM_PREFIX);
|
||||||
tail = name + strlen (RUST_ENUM_PREFIX);
|
|
||||||
|
|
||||||
/* The location of the value that doubles as a discriminant is
|
/* The location of the value that doubles as a discriminant is
|
||||||
stored in the name of the field, as
|
stored in the name of the field, as
|
||||||
|
@ -203,7 +202,6 @@ rust_get_disr_info (struct type *type, const gdb_byte *valaddr,
|
||||||
+ rust_last_path_segment (TYPE_NAME (TYPE_FIELD_TYPE (type, 0))));
|
+ rust_last_path_segment (TYPE_NAME (TYPE_FIELD_TYPE (type, 0))));
|
||||||
}
|
}
|
||||||
|
|
||||||
do_cleanups (cleanup);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue