* Removed 'first' field and 'packed' attribute from TAnsiRec and TUnicodeRec. Removing 'packed' should yield more efficient code on alignment-sensitive targets, while removing 'first' effectively makes two records identical to each other. Further cleanup is possible, but let's see the test suite results before proceeding.

git-svn-id: trunk@20275 -
This commit is contained in:
sergei 2012-02-07 16:23:50 +00:00
parent c44ce80585
commit 180686e429
2 changed files with 11 additions and 15 deletions

View File

@ -35,7 +35,7 @@
Type Type
PAnsiRec = ^TAnsiRec; PAnsiRec = ^TAnsiRec;
TAnsiRec = Packed Record TAnsiRec = Record
CodePage : TSystemCodePage; CodePage : TSystemCodePage;
ElementSize : Word; ElementSize : Word;
{$ifdef CPU64} {$ifdef CPU64}
@ -44,12 +44,10 @@ Type
{$endif CPU64} {$endif CPU64}
Ref : SizeInt; Ref : SizeInt;
Len : SizeInt; Len : SizeInt;
First : AnsiChar;
end; end;
Const Const
AnsiRecLen = SizeOf(TAnsiRec); AnsiFirstOff = SizeOf(TAnsiRec);
AnsiFirstOff = SizeOf(TAnsiRec)-1;
{**************************************************************************** {****************************************************************************
Internal functions, not in interface. Internal functions, not in interface.
@ -64,15 +62,15 @@ Var
P : Pointer; P : Pointer;
begin begin
{ request a multiple of 16 because the heap manager alloctes anyways chunks of 16 bytes } { request a multiple of 16 because the heap manager alloctes anyways chunks of 16 bytes }
GetMem(P,Len+AnsiRecLen); GetMem(P,Len+(AnsiFirstOff+sizeof(char)));
If P<>Nil then If P<>Nil then
begin begin
PAnsiRec(P)^.Ref:=1; { Set reference count } PAnsiRec(P)^.Ref:=1; { Set reference count }
PAnsiRec(P)^.Len:=0; { Initial length } PAnsiRec(P)^.Len:=0; { Initial length }
PAnsiRec(P)^.CodePage:=DefaultSystemCodePage; PAnsiRec(P)^.CodePage:=DefaultSystemCodePage;
PAnsiRec(P)^.ElementSize:=SizeOf(AnsiChar); PAnsiRec(P)^.ElementSize:=SizeOf(AnsiChar);
PAnsiRec(P)^.First:=#0; { Terminating #0 }
inc(p,AnsiFirstOff); { Points to string now } inc(p,AnsiFirstOff); { Points to string now }
PAnsiChar(P)^:=#0; { Terminating #0 }
end; end;
NewAnsiString:=P; NewAnsiString:=P;
end; end;
@ -692,11 +690,11 @@ begin
begin begin
Temp:=Pointer(s)-AnsiFirstOff; Temp:=Pointer(s)-AnsiFirstOff;
lens:=MemSize(Temp); lens:=MemSize(Temp);
lena:=AnsiRecLen+L; lena:=AnsiFirstOff+L+sizeof(AnsiChar);
{ allow shrinking string if that saves at least half of current size } { allow shrinking string if that saves at least half of current size }
if (lena>lens) or ((lens>32) and (lena<=(lens div 2))) then if (lena>lens) or ((lens>32) and (lena<=(lens div 2))) then
begin begin
reallocmem(Temp,AnsiRecLen+L); reallocmem(Temp,lena);
Pointer(S):=Temp+AnsiFirstOff; Pointer(S):=Temp+AnsiFirstOff;
end; end;
end end

View File

@ -35,7 +35,7 @@
Type Type
PUnicodeRec = ^TUnicodeRec; PUnicodeRec = ^TUnicodeRec;
TUnicodeRec = Packed Record TUnicodeRec = Record
CodePage : TSystemCodePage; CodePage : TSystemCodePage;
ElementSize : Word; ElementSize : Word;
{$ifdef CPU64} {$ifdef CPU64}
@ -44,12 +44,10 @@ Type
{$endif CPU64} {$endif CPU64}
Ref : SizeInt; Ref : SizeInt;
Len : SizeInt; Len : SizeInt;
First : UnicodeChar;
end; end;
Const Const
UnicodeRecLen = SizeOf(TUnicodeRec); UnicodeFirstOff = SizeOf(TUnicodeRec);
UnicodeFirstOff = SizeOf(TUnicodeRec)-sizeof(UnicodeChar);
{ {
Default UnicodeChar <-> Char conversion is to only convert the Default UnicodeChar <-> Char conversion is to only convert the
@ -170,15 +168,15 @@ Function NewUnicodeString(Len : SizeInt) : Pointer;
Var Var
P : Pointer; P : Pointer;
begin begin
GetMem(P,Len*sizeof(UnicodeChar)+UnicodeRecLen); GetMem(P,Len*sizeof(UnicodeChar)+(UnicodeFirstOff+sizeof(UnicodeChar)));
If P<>Nil then If P<>Nil then
begin begin
PUnicodeRec(P)^.Len:=Len; { Initial length } PUnicodeRec(P)^.Len:=Len; { Initial length }
PUnicodeRec(P)^.Ref:=1; { Initial Refcount } PUnicodeRec(P)^.Ref:=1; { Initial Refcount }
PUnicodeRec(P)^.CodePage:=DefaultUnicodeCodePage; PUnicodeRec(P)^.CodePage:=DefaultUnicodeCodePage;
PUnicodeRec(P)^.ElementSize:=SizeOf(UnicodeChar); PUnicodeRec(P)^.ElementSize:=SizeOf(UnicodeChar);
PUnicodeRec(P)^.First:=#0; { Terminating #0 }
inc(p,UnicodeFirstOff); { Points to string now } inc(p,UnicodeFirstOff); { Points to string now }
PUnicodeChar(P)^:=#0; { Terminating #0 }
end end
else else
UnicodeStringError; UnicodeStringError;
@ -848,7 +846,7 @@ begin
begin begin
Temp:=Pointer(s)-UnicodeFirstOff; Temp:=Pointer(s)-UnicodeFirstOff;
lens:=MemSize(Temp); lens:=MemSize(Temp);
lena:=SizeUInt(L*sizeof(UnicodeChar)+UnicodeRecLen); lena:=SizeUInt(L*sizeof(UnicodeChar)+(UnicodeFirstOff+sizeof(UnicodeChar)));
if (lena>lens) or ((lens>32) and (lena<=(lens div 2))) then if (lena>lens) or ((lens>32) and (lena<=(lens div 2))) then
begin begin
reallocmem(Temp, lena); reallocmem(Temp, lena);