risoluzione di argomenti variadici per il motore di scripting

0

Sto sviluppando un motore di scripting (basato su una VM stack) a causa di alcuni motivi. il motore di scripting è pensato per eseguire C come linguaggio di scripting. (il wiki di github spiega perché)

Una caratteristica che mi piacerebbe supportare è l'argomento variadico. La VM e la sua convenzione di chiamata supportano già la possibilità di fare argomenti variadici (spingendo l'ultima arg prima e l'ultima arg)

Ma ho problemi a rispecchiarlo con il codice C nativo; Ciò che intendo è che i linguaggi di scripting di solito hanno la capacità di eseguire funzioni dall'applicazione host.

il mio problema qui sembra impossibile supportare argomenti variadici se le app host lo usano dalla porzione di scripting. Se ancora non capisci cosa intendo, ecco il codice.

Questo è il typedef per le funzioni C native per gli script da chiamare.

typedef void (*fnNative_t)(Script_t *restrict script, const uint argc, const uint bytes, uchar *arrParams);

Ho riscontrato questo problema quando ho tentato di esportare printf per gli script da utilizzare ...

/* int printf(const char *fmt, ...); */
static void native_printf(Script_t *restrict script, const uint argc, const uint bytes, uchar *arrParams)
{
    if( !script )
        return;

    Word_t addr = *(Word_t *)arrParams;
    // using addr for both byte size and address as addr is the size of the string.
    const char *str = (const char *)TaghaScript_addr2ptr(script, addr, addr);
    TaghaScript_push_int32(script, printf(str));
}

tutto ciò che deve essere stampato da printf è già estratto dallo stack in arrParams , ma non ho idea di come differenziare dinamicamente i dati che arrParams deve riflettere in modo accurato sulla formattazione della stringa.

Un'alternativa che avevo era di sostituire il typdef della funzione nativa con ...

typedef     void (*fnNative_t)(Script_t *restrict script, const uint argc, ...);

ma poi ho colpito un altro brickwall dopo aver pensato "come potrei eseguire il puntatore a funzione se non so quali dati sono passati"

La mia ultima risorsa è semplicemente riscrivere printf in modo specifico per gli script, ma c'è un modo migliore per risolvere questo problema?

Mi piacerebbe molto che gli argomenti di variadic funzionassero per gli script in C, non sono sicuro di come implementarli in modo pulito per l'applicazione host da utilizzare.

Link Github se necessario

    
posta Nergal 08.09.2017 - 06:20
fonte

0 risposte

Leggi altre domande sui tag