mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-02 17:50:16 +02:00
compiler: move ansistring codepage number replacement code from the asm generator to one level up. output both 0 and CP_NONE ansistring constants as constants with codepage 0. codepage 0 means CP_ACP and it will be properly understood of RTL routines while codepage CP_NONE means no codepage. For delphi unicode mode output them in compiler codepage as before.
git-svn-id: trunk@19459 -
This commit is contained in:
parent
9bc540e1c2
commit
b1b0b2bb1f
@ -59,10 +59,6 @@ uses
|
||||
current_asmdata.getdatalabel(referencelab);
|
||||
list.concat(tai_label.create(referencelab));
|
||||
end;
|
||||
if (encoding=0) then
|
||||
encoding:=CP_NONE;
|
||||
if (encoding=CP_NONE) and (m_systemcodepage in current_settings.modeswitches) then
|
||||
encoding:=current_settings.sourcecodepage;
|
||||
list.concat(tai_const.create_16bit(encoding));
|
||||
list.concat(tai_const.create_16bit(1));
|
||||
{$ifdef cpu64bitaddr}
|
||||
|
@ -258,6 +258,7 @@ implementation
|
||||
href: treference;
|
||||
pool: THashSet;
|
||||
entry: PHashSetItem;
|
||||
cp: tstringencoding;
|
||||
|
||||
const
|
||||
PoolMap: array[tconststringtype] of TConstPoolType = (
|
||||
@ -282,12 +283,21 @@ implementation
|
||||
pool := current_asmdata.ConstPools[PoolMap[cst_type]];
|
||||
|
||||
if cst_type in [cst_widestring, cst_unicodestring] then
|
||||
entry := pool.FindOrAdd(pcompilerwidestring(value_str)^.data, len*cwidechartype.size)
|
||||
entry := pool.FindOrAdd(pcompilerwidestring(value_str)^.data,len*cwidechartype.size)
|
||||
else
|
||||
if cst_type = cst_ansistring then
|
||||
entry := PHashSetItem(TTagHashSet(pool).FindOrAdd(value_str, len, tstringdef(resultdef).encoding))
|
||||
begin
|
||||
cp:=tstringdef(resultdef).encoding;
|
||||
{ force output of RawByteString constants in CP_ACP codepage }
|
||||
if cp=CP_NONE then
|
||||
cp:=0;
|
||||
{ for delphiuncode mode output CP_ACP constants in the compiler codepage }
|
||||
if (cp=0) and (m_systemcodepage in current_settings.modeswitches) then
|
||||
cp:=current_settings.sourcecodepage;
|
||||
entry := PHashSetItem(TTagHashSet(pool).FindOrAdd(value_str,len,cp))
|
||||
end
|
||||
else
|
||||
entry := pool.FindOrAdd(value_str, len);
|
||||
entry := pool.FindOrAdd(value_str,len);
|
||||
|
||||
lab_str := TAsmLabel(entry^.Data); // is it needed anymore?
|
||||
|
||||
@ -300,7 +310,7 @@ implementation
|
||||
if len=0 then
|
||||
InternalError(2008032301) { empty string should be handled above }
|
||||
else
|
||||
lastlabel:=emit_ansistring_const(current_asmdata.AsmLists[al_typedconsts],value_str,len,tstringdef(resultdef).encoding);
|
||||
lastlabel:=emit_ansistring_const(current_asmdata.AsmLists[al_typedconsts],value_str,len,cp);
|
||||
end;
|
||||
cst_unicodestring,
|
||||
cst_widestring:
|
||||
|
Loading…
Reference in New Issue
Block a user