From 2b6e06bd4a40c2644076351a138b163c2430eed2 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 26 Nov 2002 23:02:07 +0000 Subject: [PATCH] * fixed dynarray copy --- rtl/inc/compproc.inc | 7 +++++-- rtl/inc/dynarr.inc | 45 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/rtl/inc/compproc.inc b/rtl/inc/compproc.inc index 85178e3d45..47d371c846 100644 --- a/rtl/inc/compproc.inc +++ b/rtl/inc/compproc.inc @@ -54,7 +54,7 @@ Function fpc_shortstr_Copy(const s:shortstring;index:StrLenInt;count:StrLenInt) Function fpc_ansistr_Copy (Const S : AnsiString; Index,Size : Longint) : AnsiString;compilerproc; Function fpc_widestr_Copy (Const S : WideString; Index,Size : Longint) : WideString;compilerproc; function fpc_char_copy(c:char;index : StrLenInt;count : StrLenInt): shortstring;compilerproc; -procedure fpc_dynarray_copy(var pdest : pointer;psrc : pointer;ti : pointer);compilerproc; +procedure fpc_dynarray_copy(var pdest : pointer;psrc : pointer;ti : pointer;lowidx,highidx:longint);compilerproc; function fpc_dynarray_length(p : pointer) : tdynarrayindex; compilerproc; function fpc_dynarray_high(p : pointer) : tdynarrayindex; compilerproc; @@ -284,7 +284,10 @@ function fpc_qword_to_double(q: qword): double; compilerproc; { $Log$ - Revision 1.28 2002-10-17 12:43:00 florian + Revision 1.29 2002-11-26 23:02:07 peter + * fixed dynarray copy + + Revision 1.28 2002/10/17 12:43:00 florian + ansistring_append* implemented Revision 1.27 2002/10/10 19:24:28 florian diff --git a/rtl/inc/dynarr.inc b/rtl/inc/dynarr.inc index 4c3da70496..63b6a23492 100644 --- a/rtl/inc/dynarr.inc +++ b/rtl/inc/dynarr.inc @@ -254,27 +254,56 @@ procedure fpc_dynarray_setlength(var p : pointer;pti : pointer; end; -procedure fpc_dynarray_copy(var pdest : pointer;psrc : pointer;ti : pointer);{$ifdef hascompilerproc} compilerproc; {$endif} +{ provide local access to dynarr_copy } +procedure int_dynarray_copy(var pdest : pointer;psrc : pointer;ti : pointer; + lowidx,highidx:longint);[external name 'FPC_DYNARR_COPY']; + +procedure fpc_dynarray_copy(var pdest : pointer;psrc : pointer;ti : pointer; + lowidx,highidx:longint);[Public,Alias:'FPC_DYNARR_COPY'];{$ifdef hascompilerproc} compilerproc; {$endif} var - size : longint; + realpdest, + realpsrc : pdynarray; + cnt, + i,size : longint; begin pdest:=nil; if psrc=nil then exit; - + realpsrc:=pdynarray(psrc-sizeof(tdynarray)); { skip kind and name } inc(pointer(ti),ord(pdynarraytypeinfo(ti)^.namelen)); - + { -1, -1 is used to copy the whole array like a:=copy(b);, so + update the lowidx and highidx with the values from psrc } + if (lowidx=-1) and (highidx=-1) then + begin + lowidx:=0; + highidx:=realpsrc^.high; + end; + { get number of elements and check for invalid values } + if (lowidx<0) or (highidx<0) then + HandleErrorFrame(201,get_frame); + cnt:=highidx-lowidx+1; { create new array } - size:=pdynarraytypeinfo(ti)^.elesize*(pdynarray(psrc)^.high+1)+sizeof(tdynarray); - getmem(pdest,size); - move(psrc^,pdest^,size); + size:=pdynarraytypeinfo(ti)^.elesize*cnt; + getmem(realpdest,size+sizeof(tdynarray)); + pdest:=pointer(realpdest)+sizeof(tdynarray); + { copy data } + move(pointer(psrc+pdynarraytypeinfo(ti)^.elesize*lowidx)^,pdest^,size); + { fill new refcount } + realpdest^.refcount:=1; + realpdest^.high:=cnt-1; + { increment ref. count of members } + for i:= 0 to cnt-1 do + int_addref(pointer(pdest+sizeof(tdynarray)+pdynarraytypeinfo(ti)^.elesize*i),pdynarraytypeinfo(ti)^.eletype); end; { $Log$ - Revision 1.20 2002-10-09 20:24:30 florian + Revision 1.21 2002-11-26 23:02:07 peter + * fixed dynarray copy + + Revision 1.20 2002/10/09 20:24:30 florian + range checking for dyn. arrays Revision 1.19 2002/10/02 18:21:51 peter