komashchenko
Идиот
- Сообщения
- 916
- Реакции
- 2,570
Здравствуйте, от немного модифицированный компилятор SourcePawn с поддержкой #emit и goto
#emit - позволяет обращаться к виртуальной машине инструкциями языка ассемблера, всё доступные оптокоды SP смотрите тут
goto - оператор безусловного перехода (перехода к определённой точке функции, обозначенной меткой) [Использовать нужно довольно аккуратно, за состоянием стека приходиться следить вручную]
Исходники
Скачать
#emit - позволяет обращаться к виртуальной машине инструкциями языка ассемблера, всё доступные оптокоды SP смотрите тут
goto - оператор безусловного перехода (перехода к определённой точке функции, обозначенной меткой) [Использовать нужно довольно аккуратно, за состоянием стека приходиться следить вручную]
PHP:
#pragma semicolon 1
#pragma newdecls required
public void OnPluginStart()
{
RegServerCmd("test_goto", Test_Goto);
}
public Action Test_Goto(int args)
{
bool hello;
char crab[] = "space crab";
sample_label:
char yam[] = "yams";
PrintToServer("%s %s", crab, yam);
if (!hello)
{
bool what = true;
hello = what;
yam = "what"; //но мы не увидим what так как yam иницилиаризируеться заново
#emit stack 4// из-за гото what не удаляеться, так что удаляем вручную
goto sample_label;
}
else PrintToServer(":)");
PrintToServer("hello %d", hello);
#emit stack 8 //удаляем вторую yam
return Plugin_Handled;
}
PHP:
#pragma semicolon 1
#pragma newdecls required
public void OnPluginStart()
{
RegServerCmd("test_emit", test_emit);
}
public Action test_emit(int args)
{
emit1(8, 9, 5);
emit2(5, 1, 6, 8);
}
public void emit1(any ...)
{
PrintToServer("emit1");
int num_args, arg;
#emit LOAD.S.pri 8
#emit STOR.S.pri num_args
PrintToServer("num_args %d", num_args);
for(int i, u = 12; i < num_args; i++, u+=4)
{
#emit ADDR.alt 0
#emit LOAD.S.pri u
#emit ADD
#emit LOAD.i
#emit LOAD.i
#emit STOR.S.pri arg
PrintToServer("arg %d %d", i, arg);
}
}
public void emit2(any ...)
{
PrintToServer("emit2");
int num_args, arg_p;
#emit LOAD.S.pri 8
#emit STOR.S.pri num_args
int[] args = new int[num_args];
#emit break
#emit ADDR.pri 12
#emit STOR.S.pri arg_p
for(int i; i < num_args; i++)
{
#emit break
#emit LOAD.S.pri i
#emit SMUL.c 4
#emit PUSH.pri
#emit LOAD.S.alt arg_p
#emit ADD
#emit LOAD.i
#emit SWAP.pri
#emit LOAD.S.alt args
#emit ADD
#emit MOVE.alt
#emit POP.pri
#emit MOVS 4
}
PrintToServer("num_args %d", num_args);
for(int i; i < num_args; i++)
{
PrintToServer("arg %d %d", i, args[i]);
}
}
Исходники
Скачать