[fpc-devel] move(xx, ansistring[1] versus ansistring, len)

Martin Friebe martin at hybyte.com
Tue May 13 00:36:54 CEST 2008

Ah, ok, thanks.
that may work.

Is it documented somewhere, under which circumstances uniquestring is 
inserted by hte compiler, and when not? In other words, is there a way 
to be sure, that it will not be called twice in future versions?
(Not that it would be a big issue, if it was called twice, but always 
eager to learn.)

The background for this question is motivated by: 

Many of the occurrances look like
    SetLength(s, count);
    move(str^, s[1], count);
where "s" is a local variable, not used before. So currently it would be 
safe to skip uniquestring.
But I consider this as a trap, because future changes may act on "s" 
before, without the author being aware of the exact behaviour of move.

Since the issue is widespread throughout the code (the bug only shows a 
few samples), and the current access "s[1]" does work, except for the 
(falsely) triggered rang-check, I find it a bit over the top to prefix 
every line with "if length(s)>0"

I also see that (s: AnsiString)
    move(str^, s, count);
seems to work too. (again without implicit uniquestring)

Is there anything against this syntax?
It does not convert s to nil, in case of empty string, but since len is 
0 nothing will happen.

Thanks a lot

Jonas Maebe wrote:
> On 13 May 2008, at 00:17, Martin Friebe wrote:
>> move(somepchar^,pchar(ansi_str_dest)^,len);
>> doesn't check fpc_ansistr_unique. So it works only if ansi_str_dest 
>> has only one reference; or both strings will be modified (because no 
>> copy-on-write happens).
>> At least, that's what I get to see, if I compile with -al and look at 
>> the assembler.
> You can call uniquestring(ansi_str_dest) before the move()
> Jonas
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel

More information about the fpc-devel mailing list