Autor Téma: Portace FreeAndNil do starších verzí Delphi  (Přečteno 705 krát)

Offline starous

  • Mladík
  • **
  • Příspěvků: 93
  • Karma: 2
    • Verze Delphi: Delphi 7, Delphi 10.4
Re:Portace FreeAndNil do starších verzí Delphi
« Odpověď #15 kdy: 29-10-2020, 07:26:12 »
Takze by me zajimalo, jak se to chova v 10.4, ktera ma standardni FreeAndNil zmenenou a to jak s inliningem, tak bez.


Můžu poprosit o komentář? Díky.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3073
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Portace FreeAndNil do starších verzí Delphi
« Odpověď #16 kdy: 29-10-2020, 08:53:40 »
Můžu poprosit o komentář? Díky.
Diky za otestovani. Ja to shrnu:

Pokud jsi definoval nahore V10_4 tj. volala se System.FreeAndNil a slo to prelozit bez chyb a ja tam nemam chybu, tak se to na vlastnim testu chova stejne, jako ve verzi 10.2, kde jsem tomu predhodil vlastni implementaci FreeAndNilSydney, podle te z verze 10.4. Ovsem ve skutecnosti se to jako celek chova v podstate tragicky:
  • kdyz v 10.2 predhodis FreeAndNil(object.property), tak to prekladac spravne neprelozi, protoze FreeAndNil ma var argument a do toho property nepredas
  • Kdyz totez udelas ve verzi 10.4, kde to var u argumentu z buhvi jakeho duvodu nahradili const [ref ] (v podstate typed pointer na pointer), tak pokud je zapnuty inlining, tak to prekladac prelozi silenym hackem tak, ze do FreeAndNil u System.Generics.Collections.TList<T> pro property Items[x ] preda pointer na instance_tlist+$20+idx*sizeof(pointer),  coz je adresa v privatnim poli FItems  >:(
  • To zrejme bude stejne jeste u par trid z System.Generics.Collections, kde maji poznamku, ze FItems musi nasledovat za helperem
  • Ale kdyz udelas cokoli jineho, tj. vypnes inlining, napises si vlastni tridu, predhodis tomu jakekoli jine property, tak prekladac mlci, tvari se, ze je vse OK a vysledkem je, ze volani FreeAndNil() Free provede, ale nil ne (prekladac (10.2) vytahne property do automaticke promenne a vynuluje tu).
Kdyz uz bych chtel neco takoveho delat, tak rozhodne obecne, protoze vzdycky nas ucivali, ze nejhorsi jsou vyjimky a moje celozivotni praxe to jen potvrzuje. Uz vidim ty nestastniky, kterym nekdo v teamu pouzije FreeAndNil na property a pak to cele hodiny ne-li dny hledaji... To obecne reseni bud direktivou prekladaci nebo anotaci,. napr.
Kód: Delphi [Vybrat]
  1. [Nilable(FItems)]
  2. property Items[Index: Integer]: T read GetItem write SetItem; default;
  3. [Nilable(FAnyObject)]
  4. property AnyObject: T read GetAnyObject write SetAnyObject;
  5.  

Jeste ze uz jsem duchodce a pravdepodobnost, ze budu muset jeste neco delat v Delphi, se blizi k nule, protoze mam dojem, ze v EMBC uz neprogramuji, ale jen prasi, nebo tam zacinaji mit slovo nejaci "pythonisti", kterym pripada normalni, ze pri zapisu
Kód: Python [Vybrat]
  1. objekt.neexistujicici_property = cosi
se nerve a do objektu se prida neexistujici_property jako existujici...


« Poslední změna: 29-10-2020, 08:55:29 od pf1957 »