This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFA] Fix pascal behavior for class fields
- From: "Pierre Muller" <pierre dot muller at ics-cnrs dot unistra dot fr>
- To: "'gdb-patches'" <gdb-patches at sourceware dot org>
- Date: Thu, 8 Jan 2015 09:53:13 +0100
- Subject: [RFA] Fix pascal behavior for class fields
- Authentication-results: sourceware.org; auth=none
This is the problem that triggered my previous RFA,
as I discovered it while debugging this problem.
In the pascal parser, there is special code
that will try to emulate case-insensivity despite the
fact that pascal is not registered as a 'case-insensitive' language.
This code does not work as expected for fields of a class,
for which exact casing is currently required.
See:
https://sourceware.org/bugzilla/show_bug.cgi?id=17815
for source code:
# Compile attached source code, using Free Pascal compiler
fpc -gs -Mobjfpc test-class-pascal.pas
# Debug it
gdb ./test-class-pascal
.......
(gdb) b TA__CHECK
Breakpoint 1 at 0x40154c: file test-class-pascal.pas, line 23.
(gdb) r
Starting program: E:\pas\test\test-class-pascal.exe
[New Thread 6700.0x1ae0]
Breakpoint 1, TA__CHECK (B=0x1572ee0, this=<error reading variable>)
at test-class-pascal.pas:23
23 check:=(x < b.x);
(gdb) p this
$1 = (TA) 0x1572ed0
(gdb) p this^
warning: can't find linker symbol for virtual table for `TA' value
$2 = {<TOBJECT> = {_vptr$ = {0x408014, 0x43}}, X = 67, Y = 33}
(gdb) p X
warning: can't find linker symbol for virtual table for `TA' value
$3 = 67
(gdb) p B.X
warning: can't find linker symbol for virtual table for `TA' value
$4 = -1
(gdb) p b.x
warning: can't find linker symbol for virtual table for `TA' value
$5 = -1
(gdb) p x
Type TA has no component named x.
(gdb)
The patch below fixes this odd behavior,
if there is no approval nor comments about it,
I will commit it in a few days (before 7.9 branching)
as pascal language maintainer.
But, of course, don't hesitate to give feedback!
Pierre Muller
2015-01-07 Pierre Muller <muller@sourceware.org>
PR pascal/17815
* p-exp.y (yylex): Remember the case pattern that allowed finding
a field of this.
diff --git a/gdb/p-exp.y b/gdb/p-exp.y
index a1c78bf..3a4905a 100644
--- a/gdb/p-exp.y
+++ b/gdb/p-exp.y
@@ -1598,7 +1598,7 @@ yylex (void)
VAR_DOMAIN, &is_a_field_of_this);
}
- if (is_a_field)
+ if (is_a_field || (is_a_field_of_this.type != NULL))
{
tempbuf = (char *) realloc (tempbuf, namelen + 1);
strncpy (tempbuf, tmp, namelen);
@@ -1606,7 +1606,11 @@ yylex (void)
yylval.sval.ptr = tempbuf;
yylval.sval.length = namelen;
free (uptokstart);
- return FIELDNAME;
+ yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
+ if (is_a_field)
+ return FIELDNAME;
+ else
+ return NAME;
}
/* Call lookup_symtab, not lookup_partial_symtab, in case there are
no psymtabs (coff, xcoff, or some future change to blow away the
@@ -1739,7 +1743,6 @@ 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.type != NULL;
return NAME;
}
}