Index: gdb/p-exp.y |
diff --git a/gdb/p-exp.y b/gdb/p-exp.y |
index 5d344a47310c975a78bab7a7b48910dedf24dded..7b15dcea331e9eb9fbc6bd6769a3c5d884367ff8 100644 |
--- a/gdb/p-exp.y |
+++ b/gdb/p-exp.y |
@@ -1,5 +1,5 @@ |
/* YACC parser for Pascal expressions, for GDB. |
- Copyright (C) 2000, 2006-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2000-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -44,7 +44,7 @@ |
%{ |
#include "defs.h" |
-#include "gdb_string.h" |
+#include <string.h> |
#include <ctype.h> |
#include "expression.h" |
#include "value.h" |
@@ -55,6 +55,7 @@ |
#include "symfile.h" /* Required by objfiles.h. */ |
#include "objfiles.h" /* For have_full_symbols and have_partial_symbols. */ |
#include "block.h" |
+#include "completer.h" |
#define parse_type builtin_type (parse_gdbarch) |
@@ -124,7 +125,7 @@ static int yylex (void); |
void yyerror (char *); |
-static char * uptok (char *, int); |
+static char *uptok (const char *, int); |
%} |
/* Although the yacc "value" of an expression is not used, |
@@ -158,7 +159,7 @@ static char * uptok (char *, int); |
%{ |
/* YYSTYPE gets defined by %union */ |
-static int parse_number (char *, int, int, YYSTYPE *); |
+static int parse_number (const char *, int, int, YYSTYPE *); |
static struct type *current_type; |
static struct internalvar *intvar; |
@@ -315,8 +316,7 @@ exp : field_exp FIELDNAME |
exp : field_exp name |
- { mark_struct_expression (); |
- write_exp_elt_opcode (STRUCTOP_STRUCT); |
+ { write_exp_elt_opcode (STRUCTOP_STRUCT); |
write_exp_string ($2); |
write_exp_elt_opcode (STRUCTOP_STRUCT); |
search_field = 0; |
@@ -331,7 +331,12 @@ exp : field_exp name |
} |
} |
; |
- |
+exp : field_exp name COMPLETE |
+ { mark_struct_expression (); |
+ write_exp_elt_opcode (STRUCTOP_STRUCT); |
+ write_exp_string ($2); |
+ write_exp_elt_opcode (STRUCTOP_STRUCT); } |
+ ; |
exp : field_exp COMPLETE |
{ struct stoken s; |
mark_struct_expression (); |
@@ -352,9 +357,12 @@ exp : exp '[' |
if (arrayfieldindex) |
{ |
struct stoken stringsval; |
- stringsval.ptr = alloca (strlen (arrayname) + 1); |
+ char *buf; |
+ |
+ buf = alloca (strlen (arrayname) + 1); |
+ stringsval.ptr = buf; |
stringsval.length = strlen (arrayname); |
- strcpy (stringsval.ptr, arrayname); |
+ strcpy (buf, arrayname); |
current_type = TYPE_FIELD_TYPE (current_type, |
arrayfieldindex - 1); |
write_exp_elt_opcode (STRUCTOP_STRUCT); |
@@ -577,13 +585,15 @@ exp : VARIABLE |
exp : SIZEOF '(' type ')' %prec UNARY |
{ write_exp_elt_opcode (OP_LONG); |
write_exp_elt_type (parse_type->builtin_int); |
+ current_type = parse_type->builtin_int; |
CHECK_TYPEDEF ($3); |
write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3)); |
write_exp_elt_opcode (OP_LONG); } |
; |
exp : SIZEOF '(' exp ')' %prec UNARY |
- { write_exp_elt_opcode (UNOP_SIZEOF); } |
+ { write_exp_elt_opcode (UNOP_SIZEOF); |
+ current_type = parse_type->builtin_int; } |
exp : STRING |
{ /* C strings are converted into array constants with |
@@ -591,7 +601,8 @@ exp : STRING |
the array upper bound is the string length. |
There is no such thing in C as a completely empty |
string. */ |
- char *sp = $1.ptr; int count = $1.length; |
+ const char *sp = $1.ptr; int count = $1.length; |
+ |
while (count-- > 0) |
{ |
write_exp_elt_opcode (OP_LONG); |
@@ -658,7 +669,7 @@ block : BLOCKNAME |
block : block COLONCOLON name |
{ struct symbol *tem |
= lookup_symbol (copy_name ($3), $1, |
- VAR_DOMAIN, (int *) NULL); |
+ VAR_DOMAIN, NULL); |
if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK) |
error (_("No function \"%s\" in specified context."), |
copy_name ($3)); |
@@ -668,7 +679,7 @@ block : block COLONCOLON name |
variable: block COLONCOLON name |
{ struct symbol *sym; |
sym = lookup_symbol (copy_name ($3), $1, |
- VAR_DOMAIN, (int *) NULL); |
+ VAR_DOMAIN, NULL); |
if (sym == 0) |
error (_("No symbol \"%s\" in specified context."), |
copy_name ($3)); |
@@ -700,11 +711,11 @@ variable: qualified_name |
{ |
char *name = copy_name ($2); |
struct symbol *sym; |
- struct minimal_symbol *msymbol; |
+ struct bound_minimal_symbol msymbol; |
sym = |
lookup_symbol (name, (const struct block *) NULL, |
- VAR_DOMAIN, (int *) NULL); |
+ VAR_DOMAIN, NULL); |
if (sym) |
{ |
write_exp_elt_opcode (OP_VAR_VALUE); |
@@ -714,8 +725,8 @@ variable: qualified_name |
break; |
} |
- msymbol = lookup_minimal_symbol (name, NULL, NULL); |
- if (msymbol != NULL) |
+ msymbol = lookup_bound_minimal_symbol (name); |
+ if (msymbol.minsym != NULL) |
write_exp_msymbol (msymbol); |
else if (!have_full_symbols () |
&& !have_partial_symbols ()) |
@@ -779,12 +790,12 @@ variable: name_not_typename |
} |
else |
{ |
- struct minimal_symbol *msymbol; |
+ struct bound_minimal_symbol msymbol; |
char *arg = copy_name ($1.stoken); |
msymbol = |
- lookup_minimal_symbol (arg, NULL, NULL); |
- if (msymbol != NULL) |
+ lookup_bound_minimal_symbol (arg); |
+ if (msymbol.minsym != NULL) |
write_exp_msymbol (msymbol); |
else if (!have_full_symbols () |
&& !have_partial_symbols ()) |
@@ -854,7 +865,7 @@ name_not_typename : NAME |
/*** Needs some error checking for the float case ***/ |
static int |
-parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere) |
+parse_number (const char *p, int len, int parsed_float, YYSTYPE *putithere) |
{ |
/* FIXME: Shouldn't these be unsigned? We don't deal with negative values |
here, and we do kind of silly things like cast to unsigned. */ |
@@ -1100,7 +1111,7 @@ static const struct token tokentab2[] = |
/* Allocate uppercased var: */ |
/* make an uppercased copy of tokstart. */ |
static char * |
-uptok (char *tokstart, int namelen) |
+uptok (const char *tokstart, int namelen) |
{ |
int i; |
char *uptokstart = (char *)malloc(namelen+1); |
@@ -1115,11 +1126,6 @@ uptok (char *tokstart, int namelen) |
return uptokstart; |
} |
-/* This is set if the previously-returned token was a structure |
- operator '.'. This is used only when parsing to |
- do field name completion. */ |
-static int last_was_structop; |
- |
/* Read one token, getting characters through lexptr. */ |
static int |
@@ -1128,21 +1134,20 @@ yylex (void) |
int c; |
int namelen; |
unsigned int i; |
- char *tokstart; |
+ const char *tokstart; |
char *uptokstart; |
- char *tokptr; |
+ const char *tokptr; |
int explen, tempbufindex; |
static char *tempbuf; |
static int tempbufsize; |
- int saw_structop = last_was_structop; |
- last_was_structop = 0; |
retry: |
prev_lexptr = lexptr; |
tokstart = lexptr; |
explen = strlen (lexptr); |
+ |
/* See if it is a special token of length 3. */ |
if (explen > 2) |
for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++) |
@@ -1172,7 +1177,7 @@ yylex (void) |
switch (c = *tokstart) |
{ |
case 0: |
- if (saw_structop && search_field) |
+ if (search_field && parse_completion) |
return COMPLETE; |
else |
return 0; |
@@ -1237,8 +1242,6 @@ yylex (void) |
/* Might be a floating point number. */ |
if (lexptr[1] < '0' || lexptr[1] > '9') |
{ |
- if (in_parse_field) |
- last_was_structop = 1; |
goto symbol; /* Nope, must be a symbol. */ |
} |
@@ -1257,7 +1260,7 @@ yylex (void) |
{ |
/* It's a number. */ |
int got_dot = 0, got_e = 0, toktype; |
- char *p = tokstart; |
+ const char *p = tokstart; |
int hex = input_radix > 10; |
if (c == '0' && (p[1] == 'x' || p[1] == 'X')) |
@@ -1361,7 +1364,7 @@ yylex (void) |
/* Do nothing, loop will terminate. */ |
break; |
case '\\': |
- tokptr++; |
+ ++tokptr; |
c = parse_escape (parse_gdbarch, &tokptr); |
if (c == -1) |
{ |
@@ -1483,7 +1486,7 @@ yylex (void) |
static const char this_name[] = "this"; |
if (lookup_symbol (this_name, expression_context_block, |
- VAR_DOMAIN, (int *) NULL)) |
+ VAR_DOMAIN, NULL)) |
{ |
free (uptokstart); |
return THIS; |
@@ -1499,17 +1502,17 @@ yylex (void) |
if (*tokstart == '$') |
{ |
- char c; |
+ char *tmp; |
+ |
/* $ is the normal prefix for pascal hexadecimal values |
but this conflicts with the GDB use for debugger variables |
so in expression to enter hexadecimal values |
we still need to use C syntax with 0xff */ |
write_dollar_variable (yylval.sval); |
- c = tokstart[namelen]; |
- tokstart[namelen] = 0; |
- intvar = lookup_only_internalvar (++tokstart); |
- --tokstart; |
- tokstart[namelen] = c; |
+ tmp = alloca (namelen + 1); |
+ memcpy (tmp, tokstart, namelen); |
+ tmp[namelen] = '\0'; |
+ intvar = lookup_only_internalvar (tmp + 1); |
free (uptokstart); |
return VARIABLE; |
} |
@@ -1522,20 +1525,20 @@ yylex (void) |
{ |
char *tmp = copy_name (yylval.sval); |
struct symbol *sym; |
- int is_a_field_of_this = 0; |
+ struct field_of_this_result is_a_field_of_this; |
int is_a_field = 0; |
int hextype; |
if (search_field && current_type) |
is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL); |
- if (is_a_field || in_parse_field) |
+ if (is_a_field) |
sym = NULL; |
else |
sym = lookup_symbol (tmp, expression_context_block, |
VAR_DOMAIN, &is_a_field_of_this); |
/* second chance uppercased (as Free Pascal does). */ |
- if (!sym && !is_a_field_of_this && !is_a_field) |
+ if (!sym && is_a_field_of_this.type == NULL && !is_a_field) |
{ |
for (i = 0; i <= namelen; i++) |
{ |
@@ -1544,20 +1547,14 @@ yylex (void) |
} |
if (search_field && current_type) |
is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL); |
- if (is_a_field || in_parse_field) |
+ if (is_a_field) |
sym = NULL; |
else |
sym = lookup_symbol (tmp, expression_context_block, |
VAR_DOMAIN, &is_a_field_of_this); |
- if (sym || is_a_field_of_this || is_a_field) |
- for (i = 0; i <= namelen; i++) |
- { |
- if ((tokstart[i] >= 'a' && tokstart[i] <= 'z')) |
- tokstart[i] -= ('a'-'A'); |
- } |
} |
/* Third chance Capitalized (as GPC does). */ |
- if (!sym && !is_a_field_of_this && !is_a_field) |
+ if (!sym && is_a_field_of_this.type == NULL && !is_a_field) |
{ |
for (i = 0; i <= namelen; i++) |
{ |
@@ -1572,29 +1569,18 @@ yylex (void) |
} |
if (search_field && current_type) |
is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL); |
- if (is_a_field || in_parse_field) |
+ if (is_a_field) |
sym = NULL; |
else |
sym = lookup_symbol (tmp, expression_context_block, |
VAR_DOMAIN, &is_a_field_of_this); |
- if (sym || is_a_field_of_this || is_a_field) |
- for (i = 0; i <= namelen; i++) |
- { |
- if (i == 0) |
- { |
- if ((tokstart[i] >= 'a' && tokstart[i] <= 'z')) |
- tokstart[i] -= ('a'-'A'); |
- } |
- else |
- if ((tokstart[i] >= 'A' && tokstart[i] <= 'Z')) |
- tokstart[i] -= ('A'-'a'); |
- } |
} |
if (is_a_field) |
{ |
tempbuf = (char *) realloc (tempbuf, namelen + 1); |
- strncpy (tempbuf, tokstart, namelen); tempbuf [namelen] = 0; |
+ strncpy (tempbuf, tmp, namelen); |
+ tempbuf [namelen] = 0; |
yylval.sval.ptr = tempbuf; |
yylval.sval.length = namelen; |
free (uptokstart); |
@@ -1607,7 +1593,7 @@ yylex (void) |
|| lookup_symtab (tmp)) |
{ |
yylval.ssym.sym = sym; |
- yylval.ssym.is_a_field_of_this = is_a_field_of_this; |
+ yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL; |
free (uptokstart); |
return BLOCKNAME; |
} |
@@ -1623,8 +1609,8 @@ yylex (void) |
distinction) named x, then this code incorrectly thinks we |
are dealing with nested types rather than a member function. */ |
- char *p; |
- char *namestart; |
+ const char *p; |
+ const char *namestart; |
struct symbol *best_sym; |
/* Look ahead to detect nested types. This probably should be |
@@ -1673,7 +1659,7 @@ yylex (void) |
memcpy (tmp1, namestart, p - namestart); |
tmp1[p - namestart] = '\0'; |
cur_sym = lookup_symbol (ncopy, expression_context_block, |
- VAR_DOMAIN, (int *) NULL); |
+ VAR_DOMAIN, NULL); |
if (cur_sym) |
{ |
if (SYMBOL_CLASS (cur_sym) == LOC_TYPEDEF) |
@@ -1722,7 +1708,7 @@ yylex (void) |
if (hextype == INT) |
{ |
yylval.ssym.sym = sym; |
- yylval.ssym.is_a_field_of_this = is_a_field_of_this; |
+ yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL; |
free (uptokstart); |
return NAME_OR_INT; |
} |
@@ -1731,7 +1717,7 @@ yylex (void) |
free(uptokstart); |
/* Any other kind of symbol. */ |
yylval.ssym.sym = sym; |
- yylval.ssym.is_a_field_of_this = is_a_field_of_this; |
+ yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL; |
return NAME; |
} |
} |