Re[2]: [fpc-devel] Found two Delphi incompatibilities

2006-08-31 Thread Daniël Mantione


Op Thu, 31 Aug 2006, schreef Sergei Gorelkin:

> What makes a difference is actually TStrings.SetTextStr implementation.
> Delphi accesses the argument as null-terminated string, so it works perfectly
> well even without conversion. FPC implementation treats argument as
> AnsiString, accesses its Length field and eventually segfaults...

I think FPC's implementation is correct, because, as I read the 
documentation, it isn't specified that the string cannot contain #0.
So, you need to use the actual length of the string.

Daniël___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re[2]: [fpc-devel] Found two Delphi incompatibilities

2006-08-31 Thread Michael Van Canneyt



On Thu, 31 Aug 2006, Sergei Gorelkin wrote:


Thursday, August 31, 2006, 12:35:33 PM, Michael wrote:


MVC> On Thu, 31 Aug 2006, Sergei Gorelkin wrote:


Hello,

While porting some Delphi code, I found the following two
incomatibility issues. Should I report them as bugs?

Sample 1: It compiles both in Delphi and FPC, but FPC executable fails
at runtime. Delphi inserts temporary string variable and conversion
(array of char -> string), but FPC treats the pointer literally.


MVC> Did you check the '@ returns typed pointer' setting in FPC ?

Oops... That was a false alarm - FPC compiler behaves the same way as
Delphi here. They both generate conversion code in {$T+} and do not
generate it in {$T-}.
So my sample appears to be legal only in {$T+}, which isn't a default.

What makes a difference is actually TStrings.SetTextStr implementation.
Delphi accesses the argument as null-terminated string, so it works perfectly
well even without conversion. FPC implementation treats argument as
AnsiString, accesses its Length field and eventually segfaults...


We should check that.




-
const
 TestData: array[0..7] of Char = 'abc'#10'def'#0;

procedure Test1;
var
 sl: TStringList;
begin
 sl := TStringList.Create;
 sl.Text := string(@TestData[0]);  // <- fails here
 sl.Free;
end;
-

Sample 2: This one compiles with Delphi (again, it inserts necessary
conversion Wide -> Ansi), but does not compile with FPC, neither in
objfpc nor in Delphi mode.

-
function Test2: string;
var
 buf: array[0..255] of char;
 len: Integer;
begin
{ (skipped) I read USB string descriptor into buf. After that,
 buf[0] contains length of descriptor in bytes, buf[1] = 3,
 and rest is filled with Unicode chars. Now I want to convert it into
 ASCII...
}
 len := Integer(buf[0]) shr 1;
 SetString(result, PWideChar(@buf[2]), len-1);
end;


MVC> What is the error ?

It is 'Incompatible type for arg no.2: Got "PWideChar", expected
"PChar"'.


Seems like a missing overloaded version of SetString()

Michael.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re[2]: [fpc-devel] Found two Delphi incompatibilities

2006-08-31 Thread Sergei Gorelkin
Thursday, August 31, 2006, 12:35:33 PM, Michael wrote:


MVC> On Thu, 31 Aug 2006, Sergei Gorelkin wrote:

>> Hello,
>>
>> While porting some Delphi code, I found the following two
>> incomatibility issues. Should I report them as bugs?
>>
>> Sample 1: It compiles both in Delphi and FPC, but FPC executable fails
>> at runtime. Delphi inserts temporary string variable and conversion
>> (array of char -> string), but FPC treats the pointer literally.

MVC> Did you check the '@ returns typed pointer' setting in FPC ?

Oops... That was a false alarm - FPC compiler behaves the same way as
Delphi here. They both generate conversion code in {$T+} and do not
generate it in {$T-}.
So my sample appears to be legal only in {$T+}, which isn't a default.

What makes a difference is actually TStrings.SetTextStr implementation.
Delphi accesses the argument as null-terminated string, so it works perfectly
well even without conversion. FPC implementation treats argument as
AnsiString, accesses its Length field and eventually segfaults...

>> -
>> const
>>  TestData: array[0..7] of Char = 'abc'#10'def'#0;
>>
>> procedure Test1;
>> var
>>  sl: TStringList;
>> begin
>>  sl := TStringList.Create;
>>  sl.Text := string(@TestData[0]);  // <- fails here
>>  sl.Free;
>> end;
>> -
>>
>> Sample 2: This one compiles with Delphi (again, it inserts necessary
>> conversion Wide -> Ansi), but does not compile with FPC, neither in
>> objfpc nor in Delphi mode.
>>
>> -
>> function Test2: string;
>> var
>>  buf: array[0..255] of char;
>>  len: Integer;
>> begin
>> { (skipped) I read USB string descriptor into buf. After that,
>>  buf[0] contains length of descriptor in bytes, buf[1] = 3,
>>  and rest is filled with Unicode chars. Now I want to convert it into
>>  ASCII...
>> }
>>  len := Integer(buf[0]) shr 1;
>>  SetString(result, PWideChar(@buf[2]), len-1);
>> end;

MVC> What is the error ?

It is 'Incompatible type for arg no.2: Got "PWideChar", expected
"PChar"'.

MVC> Michael.
MVC> ___
MVC> fpc-devel maillist  -  fpc-devel@lists.freepascal.org
MVC> http://lists.freepascal.org/mailman/listinfo/fpc-devel



-- 
Best regards,
 Sergeimailto:[EMAIL PROTECTED]


___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel