[VC++] Adres van een label

Pagina: 1
Acties:

  • Xiphalon
  • Registratie: Juni 2001
  • Laatst online: 13:10
Ik ben bezig met een interpreter van een bytecode taal in Visual C en loop hierbij tegen het volgende probleem aan.

Ik heb alle bytecodes in een array staan, aan de hand van een 2e array met per bytecode een funtie die de acties behorende bij die bytecode uitvoert.

Nu is het callen van een functie per bytecode natuurlijk nogal duur (er moet natuurlijk wel performance inzitten :p).

Ik dacht het zo op te kunnen lossen, door de array met functie-adressen te vervangen door een array met adressen van labels, en daar dan met een goto naartoe te springen, en dan na de bytecode-emulatie de volgende bytecode uit de array te vissen, en daar naartoe te springen.

dus (code geleend uit een thesis over de Java VM (sableVm)

C:
1
2
3
4
5
6
7
8
9
10
11
void *code[] = {
&&ICONST_2, &&ICONST_2,
&&ICONST_1, &&IADD, ...
}
void **pc = code;
/* dispatch first instruction */
goto **(pc++);
/* implementations */
ICONST_1: *sp++ = 1; goto **(pc++);
ICONST_2: *sp++ = 2; goto **(pc++);
IADD: --sp; sp[-1] += *sp; goto **(pc++);


het probleem:

Dit werkt natuurlijk netjes in GCC die daarvoor een uitbreiding heeft, maar voor Visual C++ heb ik nog een oplossing kunnen bedenken c.q. vinden.

Iemand een idee hoe het zou kunnen?

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

longjmp en setjmp?

"Beauty is the ultimate defence against complexity." David Gelernter


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Niet; VC++ heeft geen support voor adressen op labels.

Misschien is het handig om veel voorkomende bytecode sequences met behulp van een enkele macro-functie te implementeren? Dat scheelt een of meer function-pointer calls.

Een ander gangbaar mechanisme is een grote switch; als je switcht op een unsigned char dan maken veel compilers daar een computed jump van.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein