[Ajuda] Gotos Globais
#1

Nгo й um lanзamento, nem um pedido de ajuda. Apenas criei este tуpico para discutir, e mostrar uma coisa que estou tentando fazer hб algum tempo. Nгo funcionou durante muitas tentativas, apуs algum tempo consegui fixar a arrumar meio por completo.

Basicamente, consegui mudar o modo de execucaзгo de Pawn, simulando um GOTO — consegui interromper um cуdigo e pular para outra бrea de memуria, totalmente distinta, sem qualquer vinculo com as callbacks.

Veja o exemplo abaixo:

pawn Код:
#include <a_samp>


#pragma dynamic 65335

// definiзхes para uso

#define goto<%0> \
                global_step(#%0)

#define glabel<%0> \
                globalLabel(#%0)


forward bruno2(brusno, bruno);
public bruno2(brusno, bruno) {

        new b;
        new string[] = "teste";
       
        goto<l>;
       
        #pragma unused b
        #pragma unused string

        return 1;

}

forward bruno1();

public bruno1() {
   
    new b;
    new string[] = "teste";
    print("1");
    print("2");
    print("3");
    glabel<l>;
    print("4");

    #pragma unused b

    #pragma unused string

    print("5");


}


main() {

    SetTimerEx("bruno1", 1000, false, "i", 0); // chamar a public 1 e imprimir 1,2,3,4,5
    SetTimerEx("bruno2", 2000, false, "ii", 0,0); // chamar public 2 para dar goto na public 1
}


stock globalLabel (name []) {

    static beh;

    // carregar valor da variбvel puxada na callback anterior
    #emit load.s.pri    4

    // salvar o endereзo dela em beh
    #emit stor.pri      beh

    // salvar goto em propriedade, para poder puxar pelo nome strng
    setproperty(.id = 0, .name = name, .value = beh);
    setproperty(.id = 1, .name = name, .value = _: true);
   
    return true;
}

stock global_step(label[])
{
    // puxar o endereзo de execuзгo do meu goto por strng
    static beh;

    if(  !getproperty(1,label) ) return printf("ERROR ON LABEL: %s (not executed)", label);
   
    beh = getproperty(0,label);

    // carregar endereзo de execuзгo antigo
    #emit load.pri  beh

    // adicionar 28 sobreo  valor atual de pri, para que pule o cуdigo GOTO
    //#emit add.c 28

    // fechar registro, e passar PRI para o CIP.
    #emit sctrl      6

    return 0xffffffff;

}

No exemplo abaixo, eu executo a callback bruno1 imprimindo 1,2,3,4,5. Tudo bem, entгo em outro temporizador, executo bruno2, mas aн que estб o detalhe. No bruno2 tem uma interrupзгo de memуria, que envia diretamente para callback bruno1.

Atй aн tudo bem, certo? Nгo.

Ao invйs de ele fazer uma chamada comum, como CallRemoteFunction, CallLocalFunction ou atй mesmo bruno1(); por si prуprio, ele faz algo diferente. Ele chama a funзгo, mas comeзa a executar ela pela metade imprimindo 4,5 (e nгo 1,2,3). Executando um GOTO, sу que intercalando callbacks.

Dissertem!
Reply


Messages In This Thread
Gotos Globais - by ipsBruno - 29.09.2013, 11:18
Re: Gotos Globais - by PT - 29.09.2013, 11:55
Re: Gotos Globais - by ipsBruno - 29.09.2013, 12:01
Re: Gotos Globais - by PT - 29.09.2013, 12:44
Re: Gotos Globais - by Juniiro3 - 29.09.2013, 12:48
Re: Gotos Globais - by WLSF - 29.09.2013, 12:52
Re: Gotos Globais - by Magnus' - 29.09.2013, 13:04
Re: Gotos Globais - by PT - 29.09.2013, 13:08
Re: Gotos Globais - by WLSF - 29.09.2013, 13:10
Re: Gotos Globais - by Magnus' - 29.09.2013, 13:25

Forum Jump:


Users browsing this thread: 4 Guest(s)