short optab[5]; char buf[10]; execute (ip) register short *ip; { #ifndef NO_LABEL_VALUES register void *base = &&x; char *bp = buf; static void *tab[] = {&&x, &&y, &&z}; if (ip == 0) { int i; for (i = 0; i < 3; ++i) optab[i] = (short)(tab[i] - base); return; } x: *bp++='x'; goto *(base + *ip++); y: *bp++='y'; goto *(base + *ip++); z: *bp++='z'; *bp=0; return; #else strcpy (buf, "xyxyz"); #endif } short p[5]; main () { execute ((short *) 0); p[0] = optab[1]; p[1] = optab[0]; p[2] = optab[1]; p[3] = optab[2]; execute (&p); if (strcmp (buf, "xyxyz")) abort (); exit (0); }