From patchwork Wed Nov 9 23:07:08 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 17363 Received: (qmail 18482 invoked by alias); 9 Nov 2016 23:07:56 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 18441 invoked by uid 89); 9 Nov 2016 23:07:55 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=no version=3.3.2 spammy=*tail, rust, Too, sk:express X-HELO: gproxy9-pub.mail.unifiedlayer.com Received: from gproxy9-pub.mail.unifiedlayer.com (HELO gproxy9-pub.mail.unifiedlayer.com) (69.89.20.122) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with SMTP; Wed, 09 Nov 2016 23:07:45 +0000 Received: (qmail 21442 invoked by uid 0); 9 Nov 2016 23:07:44 -0000 Received: from unknown (HELO cmgw3) (10.0.90.84) by gproxy9.mail.unifiedlayer.com with SMTP; 9 Nov 2016 23:07:44 -0000 Received: from box522.bluehost.com ([74.220.219.122]) by cmgw3 with id 5z7C1u00J2f2jeq01z7FcG; Wed, 09 Nov 2016 16:07:15 -0700 X-Authority-Analysis: v=2.1 cv=WL/sABcR c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=L24OOQBejmoA:10 a=zstS-IiYAAAA:8 a=FtWkQYdhwzcykdPeIUkA:9 a=BpGLveZU4XRrCzeE:21 a=FrGZ-GsraBs8JwQ1:21 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 97-118-168-190.hlrn.qwest.net ([97.118.168.190]:42762 helo=bapiya.localdomain) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_1) (envelope-from ) id 1c4bxX-0005uE-Kh; Wed, 09 Nov 2016 16:07:11 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [FYI 2/2] Remove some cleanups from the rust code Date: Wed, 9 Nov 2016 16:07:08 -0700 Message-Id: <1478732828-14454-3-git-send-email-tom@tromey.com> In-Reply-To: <1478732828-14454-1-git-send-email-tom@tromey.com> References: <1478732828-14454-1-git-send-email-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1c4bxX-0005uE-Kh X-Source-Sender: 97-118-168-190.hlrn.qwest.net (bapiya.localdomain) [97.118.168.190]:42762 X-Source-Auth: tom+tromey.com X-Email-Count: 3 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== This removes some cleanups from the rust code, in favor of C++ objects with destructors. 2016-11-09 Tom Tromey * 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. --- gdb/ChangeLog | 8 +++++ gdb/rust-exp.y | 94 ++++++++++++++++++++++----------------------------------- gdb/rust-lang.c | 8 ++--- 3 files changed, 47 insertions(+), 63 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 66a711a..09daeb7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2016-11-09 Tom Tromey + * 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-09 Tom Tromey + * rust-lang.c (rust_get_disr_info): Use std::string in one more spot. diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y index 5f44089..e2ce8e2 100644 --- a/gdb/rust-exp.y +++ b/gdb/rust-exp.y @@ -974,15 +974,13 @@ super_name (const struct rust_op *ident, unsigned int n_supers) { int i; int len; - VEC (int) *offsets = NULL; + std::vector offsets; unsigned int current_len; - struct cleanup *cleanup; - cleanup = make_cleanup (VEC_cleanup (int), &offsets); current_len = cp_find_first_component (scope); while (scope[current_len] != '\0') { - VEC_safe_push (int, offsets, current_len); + offsets.push_back (current_len); gdb_assert (scope[current_len] == ':'); /* The "::". */ current_len += 2; @@ -990,13 +988,11 @@ super_name (const struct rust_op *ident, unsigned int n_supers) + current_len); } - len = VEC_length (int, offsets); + len = offsets.size (); if (n_supers >= len) error (_("Too many super:: uses from '%s'"), scope); - offset = VEC_index (int, offsets, len - n_supers); - - do_cleanups (cleanup); + offset = offsets[len - n_supers]; } else offset = strlen (scope); @@ -1424,13 +1420,11 @@ lex_number (void) int is_integer = 0; int could_be_decimal = 1; int implicit_i32 = 0; - char *type_name = NULL; + const char *type_name = NULL; struct type *type; int end_index; int type_index = -1; - int i, out; - char *number; - struct cleanup *cleanup = make_cleanup (null_cleanup, NULL); + int i; match = regexec (&number_regex, lexptr, ARRAY_SIZE (subexps), subexps, 0); /* Failure means the regexp is broken. */ @@ -1492,29 +1486,28 @@ lex_number (void) } /* Compute the type name if we haven't already. */ + std::string type_name_holder; if (type_name == NULL) { gdb_assert (type_index != -1); - type_name = xstrndup (lexptr + subexps[type_index].rm_so, - (subexps[type_index].rm_eo - - subexps[type_index].rm_so)); - make_cleanup (xfree, type_name); + type_name_holder = std::string (lexptr + subexps[type_index].rm_so, + (subexps[type_index].rm_eo + - subexps[type_index].rm_so)); + type_name = type_name_holder.c_str (); } /* Look up the type. */ type = rust_type (type_name); /* Copy the text of the number and remove the "_"s. */ - number = xstrndup (lexptr, end_index); - make_cleanup (xfree, number); - for (i = out = 0; number[i]; ++i) + std::string number; + for (i = 0; i < end_index && lexptr[i]; ++i) { - if (number[i] == '_') + if (lexptr[i] == '_') could_be_decimal = 0; else - number[out++] = number[i]; + number.push_back (lexptr[i]); } - number[out] = '\0'; /* Advance past the match. */ lexptr += subexps[0].rm_eo; @@ -1524,6 +1517,8 @@ lex_number (void) { uint64_t value; int radix = 10; + int offset = 0; + if (number[0] == '0') { if (number[1] == 'x') @@ -1534,12 +1529,12 @@ lex_number (void) radix = 2; if (radix != 10) { - number += 2; + offset = 2; 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) type = rust_type ("i64"); @@ -1548,11 +1543,10 @@ lex_number (void) } 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; } - do_cleanups (cleanup); 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 types. */ -static VEC (type_ptr) * +static std::vector convert_params_to_types (struct parser_state *state, VEC (rust_op_ptr) *params) { int i; const struct rust_op *op; - VEC (type_ptr) *result = NULL; - struct cleanup *cleanup = make_cleanup (VEC_cleanup (type_ptr), &result); + std::vector result; 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; } @@ -2022,40 +2014,33 @@ convert_ast_to_type (struct parser_state *state, case TYPE_CODE_FUNC: { - VEC (type_ptr) *args - = convert_params_to_types (state, *operation->right.params); - struct cleanup *cleanup - = make_cleanup (VEC_cleanup (type_ptr), &args); + std::vector args + (convert_params_to_types (state, *operation->right.params)); struct type **argtypes = NULL; type = convert_ast_to_type (state, operation->left.op); - if (!VEC_empty (type_ptr, args)) - argtypes = VEC_address (type_ptr, args); + if (!args.empty ()) + argtypes = args.data (); result - = lookup_function_type_with_arguments (type, - VEC_length (type_ptr, args), + = lookup_function_type_with_arguments (type, args.size (), argtypes); result = lookup_pointer_type (result); - - do_cleanups (cleanup); } break; case TYPE_CODE_STRUCT: { - VEC (type_ptr) *args - = convert_params_to_types (state, *operation->left.params); - struct cleanup *cleanup - = make_cleanup (VEC_cleanup (type_ptr), &args); + std::vector args + (convert_params_to_types (state, *operation->left.params)); int i; struct type *type; const char *name; 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) obstack_1grow (&work_obstack, ','); @@ -2070,8 +2055,6 @@ convert_ast_to_type (struct parser_state *state, result = rust_lookup_type (name, expression_context_block); if (result == NULL) error (_("could not find tuple type '%s'"), name); - - do_cleanups (cleanup); } break; @@ -2090,24 +2073,21 @@ convert_ast_to_type (struct parser_state *state, static const char * convert_name (struct parser_state *state, const struct rust_op *operation) { - VEC (type_ptr) *types; - struct cleanup *cleanup; int i; - struct type *type; gdb_assert (operation->opcode == OP_VAR_VALUE); if (operation->right.params == NULL) return operation->left.sval.ptr; - types = convert_params_to_types (state, *operation->right.params); - cleanup = make_cleanup (VEC_cleanup (type_ptr), &types); + std::vector types + (convert_params_to_types (state, *operation->right.params)); obstack_grow_str (&work_obstack, operation->left.sval.ptr); 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) obstack_1grow (&work_obstack, ','); @@ -2116,8 +2096,6 @@ convert_name (struct parser_state *state, const struct rust_op *operation) } obstack_grow_str0 (&work_obstack, ">"); - do_cleanups (cleanup); - return (const char *) obstack_finish (&work_obstack); } diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 7d4bfc3..4ba4263 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -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, strlen (RUST_ENUM_PREFIX)) == 0) { - char *tail, *token, *name, *saveptr = NULL; + char *tail, *token, *saveptr = NULL; unsigned long fieldno; struct type *member_type; LONGEST value; @@ -158,9 +158,8 @@ rust_get_disr_info (struct type *type, const gdb_byte *valaddr, /* Optimized enums have only one field. */ member_type = TYPE_FIELD_TYPE (type, 0); - name = xstrdup (TYPE_FIELD_NAME (type, 0)); - cleanup = make_cleanup (xfree, name); - tail = name + strlen (RUST_ENUM_PREFIX); + gdb::unique_xmalloc_ptr name (xstrdup (TYPE_FIELD_NAME (type, 0))); + tail = name.get () + strlen (RUST_ENUM_PREFIX); /* The location of the value that doubles as a discriminant is 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)))); } - do_cleanups (cleanup); return ret; }