diff --git a/rtl/java/system.pp b/rtl/java/system.pp index b0f3cffe81..3d296fa66a 100644 --- a/rtl/java/system.pp +++ b/rtl/java/system.pp @@ -283,73 +283,113 @@ function min(a,b : longint) : longint; { also for booleans } procedure fpc_copy_jbyte_array(src, dst: TJByteArray); var - i: longint; + srclen, dstlen: jint; begin - for i:=0 to min(high(src),high(dst)) do - dst[i]:=src[i]; + srclen:=length(src); + dstlen:=length(dst); + { causes exception in JLSystem.arraycopy } + if (srclen=0) or + (dstlen=0) then + exit; + JLSystem.arraycopy(JLObject(src),0,JLObject(dst),0,min(srclen,dstlen)); end; procedure fpc_copy_jshort_array(src, dst: TJShortArray); var - i: longint; + srclen, dstlen: jint; begin - for i:=0 to min(high(src),high(dst)) do - dst[i]:=src[i]; + srclen:=length(src); + dstlen:=length(dst); + { causes exception in JLSystem.arraycopy } + if (srclen=0) or + (dstlen=0) then + exit; + JLSystem.arraycopy(JLObject(src),0,JLObject(dst),0,min(srclen,dstlen)); end; procedure fpc_copy_jint_array(src, dst: TJIntArray); var - i: longint; + srclen, dstlen: jint; begin - for i:=0 to min(high(src),high(dst)) do - dst[i]:=src[i]; + srclen:=length(src); + dstlen:=length(dst); + { causes exception in JLSystem.arraycopy } + if (srclen=0) or + (dstlen=0) then + exit; + JLSystem.arraycopy(JLObject(src),0,JLObject(dst),0,min(srclen,dstlen)); end; procedure fpc_copy_jlong_array(src, dst: TJLongArray); var - i: longint; + srclen, dstlen: jint; begin - for i:=0 to min(high(src),high(dst)) do - dst[i]:=src[i]; + srclen:=length(src); + dstlen:=length(dst); + { causes exception in JLSystem.arraycopy } + if (srclen=0) or + (dstlen=0) then + exit; + JLSystem.arraycopy(JLObject(src),0,JLObject(dst),0,min(srclen,dstlen)); end; procedure fpc_copy_jchar_array(src, dst: TJCharArray); var - i: longint; + srclen, dstlen: jint; begin - for i:=0 to min(high(src),high(dst)) do - dst[i]:=src[i]; + srclen:=length(src); + dstlen:=length(dst); + { causes exception in JLSystem.arraycopy } + if (srclen=0) or + (dstlen=0) then + exit; + JLSystem.arraycopy(JLObject(src),0,JLObject(dst),0,min(srclen,dstlen)); end; procedure fpc_copy_jfloat_array(src, dst: TJFloatArray); var - i: longint; + srclen, dstlen: jint; begin - for i:=0 to min(high(src),high(dst)) do - dst[i]:=src[i]; + srclen:=length(src); + dstlen:=length(dst); + { causes exception in JLSystem.arraycopy } + if (srclen=0) or + (dstlen=0) then + exit; + JLSystem.arraycopy(JLObject(src),0,JLObject(dst),0,min(srclen,dstlen)); end; procedure fpc_copy_jdouble_array(src, dst: TJDoubleArray); var - i: longint; + srclen, dstlen: jint; begin - for i:=0 to min(high(src),high(dst)) do - dst[i]:=src[i]; + srclen:=length(src); + dstlen:=length(dst); + { causes exception in JLSystem.arraycopy } + if (srclen=0) or + (dstlen=0) then + exit; + JLSystem.arraycopy(JLObject(src),0,JLObject(dst),0,min(srclen,dstlen)); end; procedure fpc_copy_jobject_array(src, dst: TJObjectArray); var - i: longint; + srclen, dstlen: jint; begin - for i:=0 to min(high(src),high(dst)) do - dst[i]:=src[i]; + srclen:=length(src); + dstlen:=length(dst); + { causes exception in JLSystem.arraycopy } + if (srclen=0) or + (dstlen=0) then + exit; + JLSystem.arraycopy(JLObject(src),0,JLObject(dst),0,min(srclen,dstlen)); end; @@ -357,6 +397,7 @@ procedure fpc_copy_jrecord_array(src, dst: TJRecordArray); var i: longint; begin + { no arraycopy, have to clone each element } for i:=0 to min(high(src),high(dst)) do dst[i]:=FpcBaseRecordType(src[i].clone); end;