Factor Language Blog

Three cheers for C syntax

Monday, October 9, 2006

I found this lovely snippet in a C application which shall remain nameless:

void interpreter( void ) { for(;;) (*(prim *)(intptr_t)*(cell *)(intptr_t)(*++lc))(); }

So, which pairs of brackets correspond to casts, grouped expressions, and function invocations? What is the operator precedence between casts, dereferencing, and pre-increment? I really don’t know.

Here is the PowerPC disassembly:

0x00002488 :     mflr    r0
0x0000248c :     bcl-    20,4*cr7+so,0x2490 interpreter+8
0x00002490 :     stmw    r30,-8(r1)
0x00002494 :    mflr    r31
0x00002498 :    stw     r0,8(r1)
0x0000249c :    stwu    r1,-80(r1)
0x000024a0 :    addis   r2,r31,0
0x000024a4 :    lwz     r30,23748(r2)
0x000024a8 :    lwz     r2,0(r30)
0x000024ac :    addi    r2,r2,8
0x000024b0 :    stw     r2,0(r30)
0x000024b4 :    lwz     r9,4(r2)
0x000024b8 :    lwz     r0,4(r9)
0x000024bc :    mr      r12,r0
0x000024c0 :    mtctr   r0
0x000024c4 :    bctrl
0x000024c8 :    b       0x24a8 interpreter+32

Now if I wanted to figure things out, I could spend 5 minutes going through every instruction and keep track of registers with a paper and pen, but at least its possible. Not so with the C code.