X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fparse.c;h=4191fc62d12fe9953e5a23a2b41df1c30633d676;hb=f42bf748e417cf9120fc57d144b6eaaf3adda247;hp=09fb0b37a95089cb7320556d71f9f4e8c61dc333;hpb=7556d4a4f6c3181204e9575c08c661a632cafb5d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/parse.c b/gdb/parse.c index 09fb0b37a9..4191fc62d1 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -1,6 +1,6 @@ /* Parse expressions for GDB. - Copyright (C) 1986-2015 Free Software Foundation, Inc. + Copyright (C) 1986-2016 Free Software Foundation, Inc. Modified from expread.y by the Department of Computer Science at the State University of New York at Buffalo, 1991. @@ -142,7 +142,7 @@ start_arglist (void) { struct funcall *newobj; - newobj = (struct funcall *) xmalloc (sizeof (struct funcall)); + newobj = XNEW (struct funcall); newobj->next = funcall_chain; newobj->arglist_len = arglist_len; arglist_len = 0; @@ -189,8 +189,9 @@ initialize_expout (struct parser_state *ps, size_t initial_size, { ps->expout_size = initial_size; ps->expout_ptr = 0; - ps->expout = xmalloc (sizeof (struct expression) - + EXP_ELEM_TO_BYTES (ps->expout_size)); + ps->expout + = (struct expression *) xmalloc (sizeof (struct expression) + + EXP_ELEM_TO_BYTES (ps->expout_size)); ps->expout->language_defn = lang; ps->expout->gdbarch = gdbarch; } @@ -585,7 +586,7 @@ mark_completion_tag (enum type_code tag, const char *ptr, int length) || tag == TYPE_CODE_STRUCT || tag == TYPE_CODE_ENUM); expout_tag_completion_type = tag; - expout_completion_name = xmalloc (length + 1); + expout_completion_name = (char *) xmalloc (length + 1); memcpy (expout_completion_name, ptr, length); expout_completion_name[length] = '\0'; } @@ -615,7 +616,7 @@ mark_completion_tag (enum type_code tag, const char *ptr, int length) void write_dollar_variable (struct parser_state *ps, struct stoken str) { - struct symbol *sym = NULL; + struct block_symbol sym; struct bound_minimal_symbol msym; struct internalvar *isym = NULL; @@ -672,11 +673,11 @@ write_dollar_variable (struct parser_state *ps, struct stoken str) sym = lookup_symbol (copy_name (str), (struct block *) NULL, VAR_DOMAIN, NULL); - if (sym) + if (sym.symbol) { write_exp_elt_opcode (ps, OP_VAR_VALUE); - write_exp_elt_block (ps, block_found); /* set by lookup_symbol */ - write_exp_elt_sym (ps, sym); + write_exp_elt_block (ps, sym.block); + write_exp_elt_sym (ps, sym.symbol); write_exp_elt_opcode (ps, OP_VAR_VALUE); return; } @@ -795,7 +796,7 @@ copy_name (struct stoken token) if (namecopy_size < token.length + 1) { namecopy_size = token.length + 1; - namecopy = xrealloc (namecopy, token.length + 1); + namecopy = (char *) xrealloc (namecopy, token.length + 1); } memcpy (namecopy, token.ptr, token.length); @@ -1005,8 +1006,9 @@ operator_length_standard (const struct expression *expr, int endpos, case OP_F90_RANGE: oplen = 3; + range_type = (enum f90_range_type) + longest_to_int (expr->elts[endpos - 2].longconst); - range_type = longest_to_int (expr->elts[endpos - 2].longconst); switch (range_type) { case LOW_BOUND_DEFAULT: @@ -1133,7 +1135,6 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, const struct block *block, int comma, int void_context_p, int *out_subexp) { - volatile struct gdb_exception except; struct cleanup *old_chain, *inner_chain; const struct language_defn *lang = NULL; struct parser_state ps; @@ -1215,12 +1216,12 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, inner_chain = make_cleanup_restore_current_language (); set_language (lang->la_language); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (lang->la_parser (&ps)) lang->la_error (NULL); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { if (! parse_completion) { @@ -1228,6 +1229,7 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, throw_exception (except); } } + END_CATCH reallocate_expout (&ps); @@ -1268,6 +1270,28 @@ parse_expression (const char *string) return exp; } +/* Same as parse_expression, but using the given language (LANG) + to parse the expression. */ + +struct expression * +parse_expression_with_language (const char *string, enum language lang) +{ + struct cleanup *old_chain = NULL; + struct expression *expr; + + if (current_language->la_language != lang) + { + old_chain = make_cleanup_restore_current_language (); + set_language (lang); + } + + expr = parse_expression (string); + + if (old_chain != NULL) + do_cleanups (old_chain); + return expr; +} + /* Parse STRING as an expression. If parsing ends in the middle of a field reference, return the type of the left-hand-side of the reference; furthermore, if the parsing ends in the field name, @@ -1283,17 +1307,17 @@ parse_expression_for_completion (const char *string, char **name, struct expression *exp = NULL; struct value *val; int subexp; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { parse_completion = 1; exp = parse_exp_in_context (&string, 0, 0, 0, 0, &subexp); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { /* Nothing, EXP remains NULL. */ } + END_CATCH parse_completion = 0; if (exp == NULL) @@ -1350,7 +1374,7 @@ parse_float (const char *p, int len, DOUBLEST *d, const char **suffix) char *copy; int n, num; - copy = xmalloc (len + 1); + copy = (char *) xmalloc (len + 1); memcpy (copy, p, len); copy[len] = 0; @@ -1416,8 +1440,8 @@ type_stack_reserve (struct type_stack *stack, int howmuch) stack->size *= 2; if (stack->size < howmuch) stack->size = howmuch; - stack->elements = xrealloc (stack->elements, - stack->size * sizeof (union type_stack_elt)); + stack->elements = XRESIZEVEC (union type_stack_elt, stack->elements, + stack->size); } } @@ -1597,7 +1621,7 @@ get_type_stack (void) void type_stack_cleanup (void *arg) { - struct type_stack *stack = arg; + struct type_stack *stack = (struct type_stack *) arg; xfree (stack->elements); xfree (stack); @@ -1874,7 +1898,7 @@ exp_iterate (struct expression *exp, static int exp_uses_objfile_iter (struct objfile *exp_objfile, void *objfile_voidp) { - struct objfile *objfile = objfile_voidp; + struct objfile *objfile = (struct objfile *) objfile_voidp; if (exp_objfile->separate_debug_objfile_backlink) exp_objfile = exp_objfile->separate_debug_objfile_backlink;