Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.81.58] |
|
Сообщ.
#1
,
|
|
|
Есть несколько overload-функций. Нужно выполнить прыжок инструкцией jmp (ну или call) в одну из них. Как указать именно нужную из overload-функций, если все названия одинаковые?
|
Сообщ.
#2
,
|
|
|
Имхо никак. Это магия компилятора.
|
Сообщ.
#3
,
|
|
|
По названию никак. Можно только при отладке определить адреса различных вариантов overload-функций и вызвать нужную по ее адресу\смещению.
PS: По идее в dcu эти функции должны "как-то" различаться, например по манглингу имен (указанию типов параметров в названии функции), или еще как-то. Но как конкретно - х.з. (Это в случае, если речь идет о "пользовательских" функциях, т.к. в модуле System все неявные overload варианты имеют собственные "магические" имена). |
Сообщ.
#4
,
|
|
|
Есть 2 варианта:
А) const MyIntToStr32: function (Value: Integer): string = SysUtils.IntToStr; MyIntToStr64: function (Value: Int64): string = SysUtils.IntToStr; asm ... call [MyIntToStr64] end; Б) {$APPTYPE CONSOLE} function X16(Z: Smallint): Integer; begin Result := Z*16; end; function X32(Z: Longint): Integer; begin Result := Z*32; end; function X(Z: Smallint): Integer; overload; inline; begin Result := X16(Z); end; function X(Z: Longint): Integer; overload; inline; begin Result := X32(Z); end; function Test: Integer; asm mov eax,1 jmp X32 end; var A: Smallint; begin A := 1; WriteLn(X(A)); WriteLn(Test); end. 1. В Delphi7 будет лишняя обёртка при вызове X (т.к. D7 не поддерживает inline-функции). 2. Функции X16/X32 нельзя спрятать (например, в implementation-секции unit'а). Добавлено Цитата leo @ Вот непонятно, как заставить сделать этот манглинг... в DCU имена одинаковые (и даже в MAP, в отладочной инфе EXE, в OBJ, если объект генерить). Короче, шляпа какая-то... PS: По идее в dcu эти функции должны "как-то" различаться, например по манглингу имен (указанию типов параметров в названии функции), или еще как-то. Но как конкретно - х.з. (Это в случае, если речь идет о "пользовательских" функциях, т.к. в модуле System все неявные overload варианты имеют собственные "магические" имена). Добавлено p.s. В System.dcu они тоже не различаются. Посмотрел и в D7, и в Tokyo... |
Сообщ.
#5
,
|
|
|
type TFigure = class procedure Draw; virtual; end; TRectangle = class(TFigure) procedure Draw; override; end; TEllipse = class(TFigure) procedure Draw; override; end; procedure TForm1.Button1Click(Sender: TObject); var Rectangle:TRectangle; P:procedure () of object; begin Rectangle:=TRectangle.Create; P:=Rectangle.Draw; p(); end; procedure TForm1.Button2Click(Sender: TObject); var Rectangle:TRectangle; P:procedure () of object; Metod:TMetod absolute P; begin Rectangle:=TRectangle.Create; P:=Rectangle.Draw; asm mov eax, DWord PTR [Method+TMethod.Data] call Short PTR [Method+TMethod.Code] end; end; Вот ещё парочка методов из справки Цитата Two additional directives allow assembly code to access dynamic and virtual methods: VMTOFFSET and DMTINDEX. VMTOFFSET retrieves the offset in bytes of the virtual method pointer table entry of the virtual method argument from the beginning of the virtual method table (VMT). This directive needs a fully specified class name with a method name as a parameter (for example, TExample.VirtualMethod), or an interface name and an interface method name. DMTINDEX retrieves the dynamic method table index of the passed dynamic method. This directive also needs a fully specified class name with a method name as a parameter, for example, TExample.DynamicMethod. To invoke the dynamic method, call System.@CallDynaInst with the (E)SI register containing the value obtained from DMTINDEX. Note Methods with the message directive are implemented as dynamic methods and can also be called using the DMTINDEX technique. For example: TMyClass = class procedure x; message MYMESSAGE; end; The following example uses both DMTINDEX and VMTOFFSET to access dynamic and virtual methods: program Project2; type TExample = class procedure DynamicMethod; dynamic; procedure VirtualMethod; virtual; end; procedure TExample.DynamicMethod; begin end; procedure TExample.VirtualMethod; begin end; procedure CallDynamicMethod(e: TExample); asm // Save ESI register PUSH ESI // Instance pointer needs to be in EAX MOV EAX, e // DMT entry index needs to be in (E)SI MOV ESI, DMTINDEX TExample.DynamicMethod // Now call the method CALL System.@CallDynaInst // Restore ESI register POP ESI end; procedure CallVirtualMethod(e: TExample); asm // Instance pointer needs to be in EAX MOV EAX, e // Retrieve VMT table entry MOV EDX, [EAX] // Now call the method at offset VMTOFFSET CALL DWORD PTR [EDX + VMTOFFSET TExample.VirtualMethod] end; var e: TExample; begin e := TExample.Create; try CallDynamicMethod(e); CallVirtualMethod(e); finally e.Free; end; end. Помимо этого: https://stackoverflow.com/questions/4186458...red-in-a-string И да на DelphiMaster мне что-то ещё советовали насчёт RTTI - найти не могу. |
Сообщ.
#6
,
|
|
|
Цитата Pavia @ Это всё относится к методам, а мне нужно для обычных функций. Это не overload, это override Вот ещё парочка методов из справки Помимо этого |
Сообщ.
#7
,
|
|
|
А какая цель?
|
Сообщ.
#8
,
|
|
|
Цель - превратить изврат, о котором я писал в соседней теме в более симпатичный код
|
Сообщ.
#9
,
|
|
|
Имхо, ты пытаешься скрестить ежа высокоуровневых удобняшек с ужом низкоуровневой овероптимизации.
|
Сообщ.
#10
,
|
|
|
Да, вот така селекция...
|