Code: Alles auswählen
0.0000
1.0000
1.0000
Code: Alles auswählen
program project1;
{$mode objfpc}
{$modeswitch typehelpers}
type
TVector2f = array[0..1] of single;
PVector2f = ^TVector2f;
TVector2fHelper = type Helper for TVector2f
public
procedure Translate(x, y: single);
end;
procedure TVector2fHelper.Translate(x, y: single); inline; // das inline
begin
Self[0] += x;
Self[1] += y;
end;
var
v: TVector2f = (0, 0);
pv: PVector2f;
begin
WriteLn(v[0]);
v.Translate(1, 0); // io.
WriteLn(v[0]);
pv := @v;
pv^.Translate(3, 0); // bug
WriteLn(v[0]);
WriteLn('ende');
end.
Code: Alles auswählen
0.0000
1.0000
4.0000
Ich bin noch weiter zurück gegangen und habe es nur mit einem einfachen Single probiert, dann hat er schon beim kompilieren mühe. project1.lpr(48,3) Error: Internal error 200109227
Code: Alles auswählen
program project1;
{$mode objfpc}
{$modeswitch typehelpers}
type
TFloatHelper = type Helper for single
public
procedure Translate(x: single);
end;
procedure TFloatHelper.Translate(x: single); inline; // das inline
begin
Self += x;
end;
var
f: Single;
pf: PSingle;
begin
f.Translate(1);
WriteLn(f: 10: 5);
pf := @f; // Hier der internal error
pf^.Translate(3);
WriteLn(f: 10: 5);
WriteLn();
end.
Ich denke, dies ist ein Bug-Report wert.
Seit ihr der gleiche Meinung ?
Nachtrag: Habe es noch mit der stable 3.2.2 probiert, dort scheint alles zu funktionieren, egal ob mit oder ohne inline.