Discussion:
[fpc-devel] SizeOf( const typcasted as shortstring)
Bart
2018-08-12 21:40:12 UTC
Permalink
Hi,

This came up in http://forum.lazarus.freepascal.org/index.php/topic,42179.0.html

const
x = ShortString('abc');
begin
writeln(SizeOf(x));
end.

Delphi (7) prints 256, fpc prints 3.

Is that a bug or an implementation detail?

Just curious.

Bart
_______________________________________________
fpc-devel maillist - fpc-***@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailma
Dmitry Boyarintsev
2018-08-12 22:12:27 UTC
Permalink
Post by Bart
const
x = ShortString('abc');
begin
writeln(SizeOf(x));
end.
Delphi (7) prints 256, fpc prints 3.
Is that a bug or an implementation detail?
Implementation detail.
And it seems to be wrong on Delphi size, because for reason it assigns a
type to a (non-typed) constant.
It would make sense to return 256, if the constant was declared like this:
const
x : ShortString = 'abc';
and fpc does recognize such typed constant as 256 in size.

It's odd that such expression compiles w/o any warnings or notes. (i.e.
"ignoring typecasting for constant value expressions")

thanks,
Dmitry
Martin
2018-08-13 00:32:01 UTC
Permalink
const
  x = ShortString('abc');
begin
  writeln(SizeOf(x));
end.
Delphi (7) prints 256, fpc prints 3.
Is that a bug or an implementation detail?
Implementation detail.
And it seems to be wrong on Delphi size, because for reason it assigns
a type to a (non-typed) constant.
Interesting.

Yet the compiler still seems to add some type or at least type specific
behaviour. (That alone is ok)

But if the first string has the length in a[0], then that constant has 6
bytes of data. Yet sizeof only reports 5.
So what is the real size of this constant?


program Project1; {$H+}
const
  a = 'abcde';
  b = 'abcde
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890';
begin
  writeln(SizeOf(a)); // 5
  writeln(SizeOf(b)); // 5
  writeln(byte(a[0]));  // no range check / shortstring has index 0
with length
  writeln(byte(b[0])); // range check / not a shortstring
  readln;
end.
Martin
2018-08-13 00:34:46 UTC
Permalink
Post by Martin
const
  x = ShortString('abc');
begin
  writeln(SizeOf(x));
end.
Delphi (7) prints 256, fpc prints 3.
Is that a bug or an implementation detail?
Implementation detail.
And it seems to be wrong on Delphi size, because for reason it
assigns a type to a (non-typed) constant.
Interesting.
Yet the compiler still seems to add some type or at least type
specific behaviour. (That alone is ok)
But if the first string has the length in a[0], then that constant has
6 bytes of data. Yet sizeof only reports 5.
So what is the real size of this constant?
program Project1; {$H+}
const
  a = 'abcde';
  b = 'abcde
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890';
begin
  writeln(SizeOf(a)); // 5
  writeln(SizeOf(b)); // 5
copy and paste, this on prints the length of b
Post by Martin
writeln(byte(a[0]));  // no range check / shortstring has index 0 with
length
  writeln(byte(b[0])); // range check / not a shortstring
  readln;
end.
_______________________________________________
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
Sven Barth via fpc-devel
2018-08-13 09:23:51 UTC
Permalink
Post by Dmitry Boyarintsev
Post by Bart
const
x = ShortString('abc');
begin
writeln(SizeOf(x));
end.
Delphi (7) prints 256, fpc prints 3.
Is that a bug or an implementation detail?
Implementation detail.
And it seems to be wrong on Delphi size, because for reason it assigns a
type to a (non-typed) constant.
const
x : ShortString = 'abc';
and fpc does recognize such typed constant as 256 in size.
It's odd that such expression compiles w/o any warnings or notes. (i.e.
"ignoring typecasting for constant value expressions")
Support for typecasts in untyped constants is by design and sometimes
required, e.g. for unsigned 64-Bit values.

Regards,
Sven
Dmitry Boyarintsev
2018-08-13 16:41:24 UTC
Permalink
On Mon, Aug 13, 2018 at 5:24 AM Sven Barth via fpc-devel <
Post by Dmitry Boyarintsev
It's odd that such expression compiles w/o any warnings or notes. (i.e.
Post by Dmitry Boyarintsev
"ignoring typecasting for constant value expressions")
Support for typecasts in untyped constants is by design and sometimes
required, e.g. for unsigned 64-Bit values.
Does it mean, that in case of ShortString casting the value of the
constant string should be extended up to 255 (256?) characters?

thanks,
Dmitry

Loading...