Já myslím, že došlo k nepochopení o co šlo: tato změna má interně stejnou funkci jak generický var obj z předchozí signatury, až na to, že předešlý případ umožňoval předání čehokoliv (var bez typu umožní předat úplně vše), během vývoje tak bylo ukázáno různými třetími stranami i R&D, že tato změna díky kompiláru zachytila špatné volání FreeAndNil s parametrem typu interface (nejčasteji), array, THandle atd. Takže chápu tazatele.
Tohle ja chapu: puvodni implementace byla hrubka, protoze v signature byl untyped pointer (
var obj) a uvnitr tela natvrdo pretypovani na
TObject s temi dusledky, co popisujes. Co nechapu, proc nepouzili primocare reseni, ktere se nabizi tj. zmenit signaturu na
var TObject. To by zachovalo puvodni kontrolu
var + zajistilo silnou typovou kontrolu parametru.
Me jde o neco jineho: kdyz jsi predal do
var argumentu property, tak prekladac zcela spravne rval, ze neumi predat
const parametr do
var argumentu. Ale kdyz pouzili tu divnou referenci na
TObject, tak jsem v D10.2 zjistil, ze tam muzu predavat property, prekladac nerve, ale funkcionalita je v kyblu (a je nejspis nebezpecna, protoze to pise nil buhvi kam). A jako vrchol vseho hnusu jsem narazil u generickeho TList<T> kod, ktery to property predat umoznuje (ne do puvodni signatury var obj):
0072A007 8B45F8 mov eax,[ebp-$08] ;instance TList<T>
0072A00A 8B4020 mov eax,[eax+$20] ;adresa private memberu TList<T>.FItems (to je ta poznamka, ze musi byt jako 1. za recordem s helperem)
0072A00D 83C00C add eax,$0c ; + offset elementu [3]*sizeof(TObject)
0072A010 E8BFEAFFFF call FreeAndNilSydney
A ohledne toho
Objects[] jsem to zkousel s
TListBoxem, protoze tam vim, ze je hodnota Objects v utrobach Windows jako ITEMDATA a jinak nez setterem potazmo volanim LB_SETITEMDATA se vynulovat neda...
Tak me zajimalo, jak to vyresili v 10.4, kde by jak pises melo jit finalni verzi, ktera ma tohle dokoncene. Ale ten priklad s generickym
TList<T> uz ve verzi 10.2 naznacuje, ze leccos zacali prasit jeste prted zmenou te
FreeAndNil.
Az budu mit cas, tak napisu test, at se bavime o kontkretnich vecech.