On Sun, 27 Mar 2011 23:59:11 +0200 (CEST) Michael Van Canneyt <mich...@freepascal.org> wrote:
> > > On Sun, 27 Mar 2011, Mattias Gaertner wrote: > > > On Sun, 27 Mar 2011 21:16:58 +0200 (CEST) > > Michael Van Canneyt <mich...@freepascal.org> wrote: > > > >> > >> > >> On Sun, 27 Mar 2011, Mattias Gaertner wrote: > >> > >>> On Sun, 27 Mar 2011 19:05:12 +0200 (CEST) > >>> Michael Van Canneyt <mich...@freepascal.org> wrote: > >>> > >>>> > >>>> > >>>> On Sun, 27 Mar 2011, Mattias Gaertner wrote: > >>>> > >>>>> I wrote a little tool: > >>>>> > >>>>> http://wiki.lazarus.freepascal.org/InstantFPC > >>>> > >>>> Nice job. OK to include in FPC as one of the utils ? > >>> > >>> Yes. > >> > >> Thank you. But please, fix a couple of bugs first: > >> > >> 1. I get a stream read error each time I execute a script the first time > >> (i.e. it's not yet in the cache) : > >> home: >./helloworld.pas > >> An unhandled exception occurred at $0000000000425556 : > >> EReadError : Stream read error > >> $0000000000425556 > >> $00000000004256FA > >> $0000000000469E8A > >> $0000000000400A25 > > > > It works here. > > I assume you use FPC 2.4.x. In FPC 2.5.1 your code > > repeat > Count:=ss.CopyFrom(Proc.Output,4096); > until Count=0; > > Fails. > > This is because CopyFrom assumes that at least 4096 bytes are present. > If it doesn't get 4096 bytes, an exception is thrown. > > (see recent change in trunk: > r16992 | sergei | 2011-02-24 04:25:40 +0100 (Thu, 24 Feb 2011) | 5 lines > > * Rework TStream.CopyFrom (see Mantis #17980): > a) Use significantly larger buffer (128k instead of 1k) > b) When Count=0, do not try to determine the source size. Just copy until the > source can be read. This should improve performance with limited seek > capability sources (e.g. a decompression stream will be decompressed once > rather than twice). > c) Use ReadBuffer/WriteBuffer, so an exception is raised when something goes > wrong. This conforms to Delphi behavior. > ) > > My FPC outputs nothing, so CopyFrom does not get 4096 bytes and therefor > raises an exception: > > Breakpoint 1, 0x000000000041396c in fpc_raiseexception () > (gdb) bt > #0 0x000000000041396c in fpc_raiseexception () > #1 0x0000000000425565 in CLASSES_TSTREAM_$__READBUFFER$formal$LONGINT () > #2 0x00000000004256fa in CLASSES_TSTREAM_$__COPYFROM$TSTREAM$INT64$$INT64 () > #3 0x0000000000469e8a in INSTANTFPTOOLS_COMPILE$ANSISTRING$ANSISTRING () > #4 0x0000000000400a25 in main () > > since the compilation is already done, the binary is in the cache, and the > second run works. > > Changing the code to > > buf : Array[1..4096] of byte; > > begin > // snip > ss:=TStringStream.Create(''); > repeat > Count:=Proc.Output.Read(Buf,4096); > if Count>0 then > ss.write(buf,count); > until Count=0; > > it works always. Will you change it, or do I change it once it is in FPC ? I changed it on sf. > This change may affect other things in Lazarus. > Sergei (hope you are reading this), I think you should put this in the > user_changes wiki page. Mattias _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal