mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 14:49:11 +02:00
- removed buggy i386-specific FPC_CHARARRAY_TO_SHORTSTR
* fixed generic FPC_CHARARRAY_TO_SHORTSTR (web bug #2382) * fixed some potential range errors in indexchar/word/dword
This commit is contained in:
parent
b2eea6a1d8
commit
15419c49a6
@ -940,46 +940,6 @@ function fpc_pchar_to_shortstr(p:pchar):shortstring;[public,alias:'FPC_PCHAR_TO_
|
|||||||
function fpc_pchar_length(p:pchar):longint;assembler;[public,alias:'FPC_PCHAR_LENGTH']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
function fpc_pchar_length(p:pchar):longint;assembler;[public,alias:'FPC_PCHAR_LENGTH']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
||||||
{$include strlen.inc}
|
{$include strlen.inc}
|
||||||
|
|
||||||
{$define FPC_SYSTEM_HAS_FPC_CHARARRAY_TO_SHORTSTR}
|
|
||||||
function fpc_chararray_to_shortstr(const arr: array of char):shortstring;[public,alias:'FPC_CHARARRAY_TO_SHORTSTR']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
|
||||||
begin
|
|
||||||
asm
|
|
||||||
cld
|
|
||||||
movl arr,%esi
|
|
||||||
movl arr+4,%ecx
|
|
||||||
{$ifdef hascompilerproc}
|
|
||||||
{ previous implementations passed length(arr), with compilerproc }
|
|
||||||
{ we only have high(arr), so add one (JM) }
|
|
||||||
incl %ecx
|
|
||||||
{$endif hascompilerproc}
|
|
||||||
orl %esi,%esi
|
|
||||||
jnz .LStrCharArrayNotNil
|
|
||||||
movl $0,%ecx
|
|
||||||
.LStrCharArrayNotNil:
|
|
||||||
andl $255,%ecx
|
|
||||||
movl %ecx,%eax
|
|
||||||
movl __RESULT,%edi
|
|
||||||
stosb
|
|
||||||
cmpl $7,%eax
|
|
||||||
jl .LStrCharArray2
|
|
||||||
movl %edi,%ecx { Align on 32bits }
|
|
||||||
negl %ecx
|
|
||||||
andl $3,%ecx
|
|
||||||
subl %ecx,%eax
|
|
||||||
rep
|
|
||||||
movsb
|
|
||||||
movl %eax,%ecx
|
|
||||||
andl $3,%eax
|
|
||||||
shrl $2,%ecx
|
|
||||||
rep
|
|
||||||
movsl
|
|
||||||
.LStrCharArray2:
|
|
||||||
movl %eax,%ecx
|
|
||||||
rep
|
|
||||||
movsb
|
|
||||||
end ['ECX','EAX','ESI','EDI'];
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
{$define FPC_SYSTEM_HAS_GET_FRAME}
|
{$define FPC_SYSTEM_HAS_GET_FRAME}
|
||||||
function get_frame:longint;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
|
function get_frame:longint;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
|
||||||
@ -1214,7 +1174,12 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.38 2003-01-06 23:03:13 mazen
|
Revision 1.39 2003-02-18 17:56:06 jonas
|
||||||
|
- removed buggy i386-specific FPC_CHARARRAY_TO_SHORTSTR
|
||||||
|
* fixed generic FPC_CHARARRAY_TO_SHORTSTR (web bug 2382)
|
||||||
|
* fixed some potential range errors in indexchar/word/dword
|
||||||
|
|
||||||
|
Revision 1.38 2003/01/06 23:03:13 mazen
|
||||||
+ defining FPC_SYSTEM_HAS_DECLOCKED and FPC_SYSTEM_HAS_INCLOCKED to avoid
|
+ defining FPC_SYSTEM_HAS_DECLOCKED and FPC_SYSTEM_HAS_INCLOCKED to avoid
|
||||||
compilation error on generic.inc
|
compilation error on generic.inc
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ var
|
|||||||
I : longint;
|
I : longint;
|
||||||
begin
|
begin
|
||||||
I:=0;
|
I:=0;
|
||||||
while (bytearray(buf)[I]<>b) and (I<Len) do
|
while (I<Len) and (bytearray(buf)[I]<>b) do
|
||||||
inc(I);
|
inc(I);
|
||||||
if (i=Len) then
|
if (i=Len) then
|
||||||
i:=-1; {Can't use 0, since it is a possible value}
|
i:=-1; {Can't use 0, since it is a possible value}
|
||||||
@ -132,7 +132,7 @@ var
|
|||||||
I : longint;
|
I : longint;
|
||||||
begin
|
begin
|
||||||
I:=0;
|
I:=0;
|
||||||
while (wordarray(buf)[I]<>b) and (I<Len) do
|
while (I<Len) and (wordarray(buf)[I]<>b) do
|
||||||
inc(I);
|
inc(I);
|
||||||
if (i=Len) then
|
if (i=Len) then
|
||||||
i:=-1; {Can't use 0, since it is a possible value for index}
|
i:=-1; {Can't use 0, since it is a possible value for index}
|
||||||
@ -149,7 +149,7 @@ var
|
|||||||
I : longint;
|
I : longint;
|
||||||
begin
|
begin
|
||||||
I:=0;
|
I:=0;
|
||||||
while (longintarray(buf)[I]<>b) and (I<Len) do inc(I);
|
while (I<Len) and (longintarray(buf)[I]<>b) do inc(I);
|
||||||
if (i=Len) then
|
if (i=Len) then
|
||||||
i:=-1; {Can't use 0, since it is a possible value for index}
|
i:=-1; {Can't use 0, since it is a possible value for index}
|
||||||
IndexDWord:=I;
|
IndexDWord:=I;
|
||||||
@ -651,8 +651,11 @@ function fpc_chararray_to_shortstr(const arr: array of char):shortstring;[public
|
|||||||
var
|
var
|
||||||
l: longint;
|
l: longint;
|
||||||
{$else hascompilerproc}
|
{$else hascompilerproc}
|
||||||
function fpc_chararray_to_shortstr(p:pchar; l : longint):shortstring;[public,alias:'FPC_CHARARRAY_TO_SHORTSTR'];
|
function fpc_chararray_to_shortstr(arr:pchar; l : longint):shortstring;[public,alias:'FPC_CHARARRAY_TO_SHORTSTR'];
|
||||||
|
var
|
||||||
{$endif hascompilerproc}
|
{$endif hascompilerproc}
|
||||||
|
index: longint;
|
||||||
|
len: byte;
|
||||||
begin
|
begin
|
||||||
{$ifdef hascompilerproc}
|
{$ifdef hascompilerproc}
|
||||||
l := high(arr)+1;
|
l := high(arr)+1;
|
||||||
@ -661,8 +664,13 @@ begin
|
|||||||
l:=255
|
l:=255
|
||||||
else if l<0 then
|
else if l<0 then
|
||||||
l:=0;
|
l:=0;
|
||||||
move(arr[0],fpc_chararray_to_shortstr[1],l);
|
index:=IndexByte(arr[0],l,0);
|
||||||
fpc_chararray_to_shortstr[0]:=chr(l);
|
if (index < 0) then
|
||||||
|
len := l
|
||||||
|
else
|
||||||
|
len := index;
|
||||||
|
move(arr[0],fpc_chararray_to_shortstr[1],len);
|
||||||
|
fpc_chararray_to_shortstr[0]:=chr(len);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$endif ndef FPC_SYSTEM_HAS_FPC_CHARARRAY_TO_SHORTSTR}
|
{$endif ndef FPC_SYSTEM_HAS_FPC_CHARARRAY_TO_SHORTSTR}
|
||||||
@ -965,7 +973,12 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.49 2003-01-20 22:21:36 mazen
|
Revision 1.50 2003-02-18 17:56:06 jonas
|
||||||
|
- removed buggy i386-specific FPC_CHARARRAY_TO_SHORTSTR
|
||||||
|
* fixed generic FPC_CHARARRAY_TO_SHORTSTR (web bug 2382)
|
||||||
|
* fixed some potential range errors in indexchar/word/dword
|
||||||
|
|
||||||
|
Revision 1.49 2003/01/20 22:21:36 mazen
|
||||||
* many stuff related to RTL fixed
|
* many stuff related to RTL fixed
|
||||||
|
|
||||||
Revision 1.48 2003/01/09 20:14:20 florian
|
Revision 1.48 2003/01/09 20:14:20 florian
|
||||||
|
Loading…
Reference in New Issue
Block a user