On Sun, 5 Nov 2023 10:36:47 +0100 (CET), Michael Van Canneyt via fpc-pascal <fpc-pascal@lists.freepascal.org> wrote:
>> So my question is this: >> Is there a difference in handling the arguments between string, AnsiString, >> RawByteString and TBytes in a declaration like this: >> >> function TSSConnection.ParseCmdFileData(var SSCmdFile: TSSCommandFile; Buf: >> AnsiString): boolean; >> >> and this: >> >> function TSSConnection.ParseCmdFileData(var SSCmdFile: TSSCommandFile; Buf: >> TBytes): boolean; >> >> In the first instance it looks like the function receives a *copy* of the >> data > >No, but an ansistring is copy-on-write. As soon as you change it, a copy is >made if your routine is not the only one using the string. > >> in the Buf argument and in the second case it receives a pointer to the >> actual >> live data such that in the first case the argument source remains untouched >> whereas in the second case the argument source is changed just as it had been >> declared as var... > >That is correct. TBytes is a fancy wrapper around a pointer with some >reference counting added to the mix. > >> >> Is there a way to simply tell Delphi/FreePascal to treat also TBytes as copy >> rather than a pointer to the real data? > >You must copy the data. The copy() function can be used for this. Follow-up question: Can I change the function declaration like this and preserve the content? function TSSConnection.ParseCmdFileData(var SSCmdFile: TSSCommandFile; const Buf: TBytes): boolean; Or must I copy the argument Buf inside the function to a local BufL version? That is what you adviced, right? Note: I have now found another function that changes the content of the Buf argument and it too causes havoc... -- Bo Berglund Developer in Sweden _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal