Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TypeInfo() bei Attributen (https://www.delphipraxis.net/186704-typeinfo-bei-attributen.html)

Der schöne Günther 23. Sep 2015 18:47

Delphi-Version: XE7

TypeInfo() bei Attributen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Das ist ein Bug, oder?

Die Doku spricht:
Zitat:

You Can Only Use Constant Expressions as Attribute Parameters [...] You can use TypeInfo() to pass type information because the RTTI block addresses are known at compile time.
Sprich: Wenn ich den Konstruktor eines Attributes mit beispielsweise
Delphi-Quellcode:
TypeInfo(Single)
füttere sollte er das auch erhalten. Tatsächlich erhält er einen Zeiger der um 4 Byte (32 Bit) bzw. 8 Byte (64 Bit) zu niedrig ist.

Getestet mit XE7 und XE8.

Seht ihr das auch so, dass das ein Fehler ist? Beispielprojekt im Anhang. Haltepunkt auf den Anfang des Konstrktors
Delphi-Quellcode:
constructor IsAliasForAttribute.Create(const originalType: Pointer);
begin
   inherited Create();
   PByte(self.originalType) := PByte(originalType) + SizeOf(Pointer);
   // The "+SizeOf(Pointer)" should not be necessary
end;
setzen und wundern.

Danke im Voraus fürs Mitfiebern.

Stevie 23. Sep 2015 21:03

AW: TypeInfo() bei Attributen
 
Nimm halt den richtigen Typen für den ctor Parameter (PTypeInfo), dann klappts auch. ;)

Der entsprechende Code, der zu deinem Fehler führt, befindet sich in der System.Rtti.pas in der Funktion ConstructAttributes Zeile 4519 (XE8) - da wird nämlich für Params vom Typ PTypeInfo anders verfahren, als für andersartige Pointer. Und somit bekommst du den PPTypeInfo rein. Kannst auch testen, indem du deine Funktion entsprechend änderst.

P.S. Wusst ich übrigens bisher auch noch nicht, aber ich kann ja Delphi Sourcecode lesen :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz