David Butler wrote:
Hi all
I picked up this weird code generation problem (it was also present in
2.0.0). I reported it as bug 4277 today. Unfortunately I can only
reproduce it in a specific context, so please e-mail me for the unit.
The problem is when you define an array of constant strings.
For example:
const
RFCMonthNames : Array[1..12] of String = (
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
is usually assembled as something like:
TC_P$TESTARRAY_RFCMONTHNAMES
DD _$PROGRAM$_L4, _$PROGRAM$_L5, _$PROGRAM$_L6, _$PROGRAM$_L7, ......
DD -1,3
_$PROGRAM$_L4: DB "Jan",0 DD -1,3
_$PROGRAM$_L5: DB "Feb",0 DD -1,3
....
which is correct, but the exact same code (in a different unit) is
compiled differently, causing access violations when accessed:
TC_CDATETIME_RFCMONTHNAMES
DD _$CDATETIME$_L2046
DD -1,3
_$CDATETIME$_L2046:
DB "Jan",0
DD _$CDATETIME$_L2047
DD -1,3
_$CDATETIME$_L2047:
DB "Feb",0
DD _$CDATETIME$_L2048
DD -1,3
_$CDATETIME$_L2048:
DB "Mar",0
DD _$CDATETIME$_L2049
DD -1,3
_$CDATETIME$_L2049:
DB "Apr",0
........
Regards
David
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel
There are two kinds of strings, shortstrings (max. 256 bytes) and
ansistrings (any length, allocated on the heap). May be they're mixed,
because the declaration "string" might use a shortstring in one unit, an
ansistring in another, depending on compiler switches like "$H" or
"$LONGSTRINGS".
Such mixing would very likely cause access violations. Try e. g. to
change all declarations to "shortstring", which is enough for short
month names.
hth,
Anton.
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel