快速识别调用当前过程的位置的方法
Fast way to identify the location the current procedure was called from
我需要找到一种方法来识别调用 class 中的当前函数或过程的位置。结果是内存位置还是单元和行号并不重要,只是调用的唯一位置。
需要快速计算位置 ID,因为它将用于决定缓存数据是否可用。
例如
type
TTestObject = class
public
procedure TestProc;
procedure TestCall;
end;
...
procedure TTestObject.TestProc;
begin
TestCall; // "Point A" - Displays "Point A"
TestCall; // "Point B" - Displays "Point B"
end;
procedure TTestObject.TestCall;
begin
ShowMessage(SomehowGetTheCallingLineLocation); // Displays "Point A" or "Point B" depending on which line above it is called from
end;
end.
"Point A",那么调用TestProc时会显示"Point B",无论创建了多少个TTestObject实例,也不管它们驻留在内存中的什么位置。
该功能将用于 SQL 的生成。目前,我将 GUID 传递给生成 SQL 的调用。此 GUID 用于从缓存中提取 SQL(如果已生成)。
NewCommand(NewUpdateCriteria('{C43D3B79-9E73-4A4B-9E29-0553542AD0B2}').
SetValue('AFIELD', AValue).
Table
('ATABLE').
Where
(NewSQLComparitor
('ID', EqualTo, AID)));
调用位置的查找需要快速,否则它会抵消我们应该通过缓存 SQL.
看到的速度改进
该组件最终可能会开源,因此我无法使用任何商业第三方组件。我还想避免依赖 JEDI 等开源库。
根据您更新后的问题,您只需要能够识别一个呼叫来自与另一个呼叫不同的地方。在这种情况下,您可以使用 return 地址来识别呼叫者。而 return 地址可以通过调用未记录的内部函数 System.ReturnAddress
.
获得
这个节目:
{$APPTYPE CONSOLE}
uses
System.SysUtils;
procedure Foo;
begin
Writeln(IntToHex(NativeInt(ReturnAddress), 8));
end;
begin
Foo;
Foo;
Foo;
Foo;
end.
在我的机器上产生这个输出:
0041B491
0041B496
0041B49B
0041B4A0
我需要找到一种方法来识别调用 class 中的当前函数或过程的位置。结果是内存位置还是单元和行号并不重要,只是调用的唯一位置。
需要快速计算位置 ID,因为它将用于决定缓存数据是否可用。
例如
type
TTestObject = class
public
procedure TestProc;
procedure TestCall;
end;
...
procedure TTestObject.TestProc;
begin
TestCall; // "Point A" - Displays "Point A"
TestCall; // "Point B" - Displays "Point B"
end;
procedure TTestObject.TestCall;
begin
ShowMessage(SomehowGetTheCallingLineLocation); // Displays "Point A" or "Point B" depending on which line above it is called from
end;
end.
"Point A",那么调用TestProc时会显示"Point B",无论创建了多少个TTestObject实例,也不管它们驻留在内存中的什么位置。
该功能将用于 SQL 的生成。目前,我将 GUID 传递给生成 SQL 的调用。此 GUID 用于从缓存中提取 SQL(如果已生成)。
NewCommand(NewUpdateCriteria('{C43D3B79-9E73-4A4B-9E29-0553542AD0B2}').
SetValue('AFIELD', AValue).
Table
('ATABLE').
Where
(NewSQLComparitor
('ID', EqualTo, AID)));
调用位置的查找需要快速,否则它会抵消我们应该通过缓存 SQL.
看到的速度改进该组件最终可能会开源,因此我无法使用任何商业第三方组件。我还想避免依赖 JEDI 等开源库。
根据您更新后的问题,您只需要能够识别一个呼叫来自与另一个呼叫不同的地方。在这种情况下,您可以使用 return 地址来识别呼叫者。而 return 地址可以通过调用未记录的内部函数 System.ReturnAddress
.
这个节目:
{$APPTYPE CONSOLE}
uses
System.SysUtils;
procedure Foo;
begin
Writeln(IntToHex(NativeInt(ReturnAddress), 8));
end;
begin
Foo;
Foo;
Foo;
Foo;
end.
在我的机器上产生这个输出:
0041B491 0041B496 0041B49B 0041B4A0