PDA

Просмотр полной версии : [Function] GetNumberOfArguments - быстрая реализация numargs



VVWVV
24.12.2016, 13:30
Описание:

Вычисляет количество аргументов в функции.

Параметры:

-

Возвращаемое значение:

Возвращает количество аргументов в функции.

Плюсы реализации:

Быстрое вычисление количества аргументов. Таким образом, это функция быстрее numargs с JIT в 3 раза, а без него в 2 раза.

Минусы реализации:
N/A

Код:


stock
GetNumberOfArguments()
{
#emit load.s.pri 0x0 // узнаем FRM прежней функции.
#emit add.c 0x8 // смещение на 8 байт.
#emit load.i // читаем.
#emit shr.c.pri 2 // побитовый сдвиг в право - деление на 4
#emit retn // возвращаем.
return 0;
}


Пример использования:


main()
{
printf("Arguments: %d", GetNumberOfArguments());

SomeFunction(1, 3, 4, 5);
}

stock
SomeFunction(...)
{
printf("Arguments: %d", GetNumberOfArguments());
}

См. также:

[Function] Чистим массив игрока (http://pro-pawn.ru/showthread.php?7931)
[Function] Защита от DeAMX (new) (http://pro-pawn.ru/showthread.php?8277)
[Function] ClearKillFeed (http://pro-pawn.ru/showthread.php?12295)
[Function] dc_SleepFix (http://pro-pawn.ru/showthread.php?13188)
[Function] GetStackSize (http://pro-pawn.ru/showthread.php?10824)
[Function] itos (http://pro-pawn.ru/showthread.php?3243)


Автор: VVWVV


Исключительно для pro-pawn.ru


Копирование данной статьи на других ресурсах без разрешения автора запрещено.

Daniel_Cortez
24.12.2016, 14:23
Здорово видеть, что всё больше и больше людей на форуме начинают работать с #emit. Вот только непонятно, в чём профит записывать числа в хексе, если они не отрицательные. Тем более, что в SHR операнд записан в десятичном виде.

VVWVV
24.12.2016, 14:38
Здорово видеть, что всё больше и больше людей на форуме начинают работать с #emit. Вот только непонятно, в чём профит записывать числа в хексе, если они не отрицательные. Тем более, что в SHR операнд записан в десятичном виде.

Да, это хорошо. Впрочем, я давно уже начал с ним работать.

Профит в том, что мне так удобнее видеть, где смещения, а где десятичные числа.

Daniel_Cortez
24.12.2016, 18:00
Профит в том, что мне так удобнее видеть, где смещения, а где десятичные числа.
Да, только это не очень стыкуется с требованием записывать все отрицательные числа в шестнадцатеричном виде (компилятор не понимает знака "-" в #emit). Например, число -1 придётся записать как 0xFFFFFFFF и ты будешь путать его со смещением.
Мало того, непостоянство между записью в хексе и в десятичном виде со стороны может показаться понтокодом.

Впрочем, решать тебе, моё дело лишь предупредить.

VVWVV
24.12.2016, 18:39
Да, только это не очень стыкуется с требованием записывать все отрицательные числа в шестнадцатеричном виде (компилятор не понимает знака "-" в #emit). Например, число -1 придётся записать как 0xFFFFFFFF и ты будешь путать его со смещением.
Мало того, непостоянство между записью в хексе и в десятичном виде со стороны может показаться понтокодом.

Впрочем, решать тебе, моё дело лишь предупредить.

Спасибо за совет. Однако такого ещё не происходило.

Кстати, Y-Less недавно затрагивал эту тему на гитхабе (https://github.com/Zeex/pawn/issues/125). Если честно, то я надеюсь, что Zeex починит это.

VVWVV
17.07.2018, 23:11
Обновлена функция под новый оператор __emit.

//pro-pawn.ru/showthread.php?14689
#define GetNumberOfArguments(%1) (emit(load.s.pri 8, shr.c.pri 2))

Daniel_Cortez
18.07.2018, 08:34
load.s.pri 5
Это точно не ошибка?

VVWVV
18.07.2018, 13:05
Это точно не ошибка?

Да, это ошибка... Код изменил..