- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
// Получение имени выполняемого метода, вызывать можно только из Published-методов класса.
// Для обычных методов: FindClassMethodNames(ClassType()), для статических методов FindClassMethodNames(self).
{$optimization OFF}
function FindClassMethodNames(obj: TClass): string;
var _AdrPtr: Pointer;
begin
asm
mov eax, obj
mov edx, dword ptr [esp + 272]
push ebx
push esi
push edi
push $7FFFFFFF
xor edi, edi
jmp @@haveVMT
@@outer:
mov eax, dword ptr [eax]
@@haveVMT:
mov esi, dword ptr [eax].vmtMethodTable
test esi, esi
je @@parent
movzx ecx, word ptr [esi]
add esi, 2
@@inner:
pop ebx
push edx
sub edx, dword ptr [esi + 2]
jl @@no1
cmp edx, ebx
jg @@no1
mov ebx, edx
mov edx, dword ptr [esi + 2]
mov edi, edx
@@no1:
pop edx
push ebx
movzx ebx, word ptr [esi]
add esi, ebx
dec ecx
jnz @@inner
@@parent:
mov eax, dword ptr [eax].vmtParent
test eax, eax
jne @@outer
mov _AdrPtr, edi
pop edi
pop esi
pop ebx
end;
Result := obj.MethodName(_AdrPtr);
end;
{$optimization ON}
// пример использования
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(FindClassMethodNames(ClassType()));
end;
А есть нормальный способ получить имя выполняемого метода, и строку кода заодно?
шаблоенэрики в дельфи-7
Думаю, если переписать это с кулхацкерского языка на нормальный, то будет проще.
Выключили и без того слабую оптимизацию?
А на ассемблере небось писали для оптимизации?
Эпично.
Здесь gcc подберет удобные для окружающего кода регистры, и подставит их имена вместо %0 и %1. В какой-то степени это можно назвать оптимизацией...
Т.е., оно, конечно, сейчас называется GAS в некоторых мануалах. Но исторически это кое-что другое.
Вкратце:
mov eax, myVar <- загружаем адрес myVar
mov eax, [myVar] <- загружаем значение по адресу myVar
mov eax, [myVar+1] <- КО: загружаем значение по адресу myVar + 1
Никаких MASM'овских OFFSET не нужно.
lea eax, [eax*8+ebx+9000]
?
Нормальная там оптимизация, если знать, что оптимизируется, а что - нет. Запарили этим стереотипом.
>{$optimization OFF}
Я так понимаю, это для того, чтобы гарантировать наличиа адреса возврата и указателя на строку на том месте, на котором их ждут - чтобы оптимизатор их не выкинул. Правда я не понимаю, как локалное отключиние оптимизации поможет компилятору догадаться, какие именно строки не надо выкидывать.
да и в TObject все реализовано подобным способом.
оптимизация отключена, т.к. иначе оно что-то со стеком делает
Штоу?
Кстати, а чего-то типа сишных __FILE__ __LINE__ и __FUNCTION__ в делфи нет?
так что не надо тут клеветы
просто вывести в лог и продолжить работу, например?
я правильно понял, что только путем выкидывания и отлова на месте EAssertionFailed?
А для других целей - нету нормального метода, можно с ассемблером извращаться, можно строку EAssertionFailed парсить. И то и то - на любителя. В С вот нет нормального метода получить текст текущей процедуры.
компилятору виднее всех в каком файле, в какой строчке и в какой функции он сейчас транслирует код, поэтому замена __FILE__, __LINE__, __FUNCTION__ и других базовых фич на "давайте выкинем исключение, всё равно это ведь только для фатальных ситуаций надо", только лишь потому что компилятор этого не умеет - не только для фатальных
и да, что такое текст текущей процедуры? это же не интерпретатор
Только для функций, помеченных словом logged. Как правило надо только несколько функций проверить, то есть проще написать, какие надо логгировать, чем какие не надо.
В отличие от классического отладчика, не надо будет думать "ой бля что только что в этой переменной было, как назад отмотать". Одни преимущества.
Так?
http://ideone.com/OzEWX
http://ideone.com/LkNKA
http://ideone.com/tq9bJ
И *- это типа раскрывател скобок такой, чтобы f(*(1,2)) перевести в f(1,2)?
Да Это просто мега-полезная фича
А вот это, увы, никак.
Интересно, я думаю в Си тоже можно что-то типа такого реализовать.
P.S.: Чорд, вот что значит полениться перейти по ссылке.