Delphi:链接器错误地消除了代码

时间:2018-11-16 20:55:41

标签: delphi

我正在使用Delphi 10.2。我在调用TList <>。Last时遇到问题。 “评估”窗口告诉我该函数的代码已被链接器消除。

代码段:

uses
    ModelObjects,
    ProximitySearch,
    System.Classes,
    System.UITypes,
    System.Generics.Collections,
    Winsoft.FireMonkey.FPdfView,
    Winsoft.FireMonkey.PDFium;
...

type
    TWidgetFinder = class(TObject)
private
        fFieldInfos: TList<TFieldInfo>;
        fPAnnotation: FPDF_ANNOTATION;
...

procedure TWidgetFinder.ConfigureFieldInfo;
var
    key: String;
    buffer: TBytes;
    textLen: LongWord;
    temp: String;
begin
...
    SetLength(buffer, KShortBufferLength);
    textLen := FPDFAnnot_GetStringValue(fPAnnotation, ToStringType(key), buffer, Length(buffer))
    temp := TEncoding.Unicode.GetString(buffer, 0, textLen - 2);
    fFieldInfos.Last.Name := TEncoding.Unicode.GetString(buffer, 0, textLen - 2);
...

问题是fFieldInfos.Last.Name为空。我以为我没有正确地将缓冲区转换为字符串。但是将正确的字符串写入temp。分配给fFieldInfos.Last.Name后,对它进行评估时,会收到以下消息:

Function to be called, {System.Generics.Collections}TList<ModelObjects.TFieldInfo>.Last, was eliminated by linker

我已经看到了SO解决方案,这些解决方案建议我在初始化期间无害地调用消除函数。但是不可能是Delphi随机消除了代码,我必须发现每次消除都是一个错误。我不明白告诉链接器TList <>的操作。当我清楚地使用它时,最后一个没有被使用。有人可以帮我理解吗?

谢谢

1 个答案:

答案 0 :(得分:2)

TList<T>.Last是标记为内联的函数。此类方法通常不包含在二进制文件中,因此您不能在调试期间在评估器中使用它们。如果您键入fFieldInfos[fFieldInfos.Count-1],则最可能出现这种情况,因为GetItem(index属性后面的getter)也被标记为内联。

您可以在评估器中输入fFieldInfos.List[fFieldInfos.Count-1]以获得列表中的最后一项。

P.S。至于Name为空的问题-如果TFieldInfo是记录,则分配将无法进行,因为.Last将返回该记录的副本并将Name分配给那个不会影响列表中的那个。