Bryan -- > > > static void ** > > > prederef(void ** pc_prederef, struct Parrot_Interp * interpreter) > > > { > > > size_t offset = pc_prederef - interpreter->prederef_code; > > > opcode_t * pc = ((opcode_t *)interpreter->code->byte_code) + > > > offset; > > > > This is supposed to be calculating offset = # opcodes not # bytes. > > I didn't look it up, and I don't do lots of address arithmetic code, > > but I assumed that pointer differences give offsets that can be passed > > into array indexing / pointer arithmetic to get back where I want. > > Offsets are given in terms of the objects pointed to. In the above code, > you've two pointers to pointers, so the byte difference would be offset * > sizeof(void *). But then you add that offset to a pointer to an opcode_t, > so the byte difference would be offset * sizeof(opcode).
OK. So it sounds like offset gets set to the equivalent of the array index to get to pc_prederef from interpreter->prederef_code. That's good. Adding that to interpreter->code->byte_code (treated as an opcode_t *), gets us to the corresponding opcode of the bytecode array. > I didn't mean to be alarmist - if you've a one-to-one mapping between the > opcode_t stream and the corresponding void * stream, then you're safe, as > you're simply scaling the sizes. Yes. There's a one-to-one mapping. > But you may want to document that. It's quite scary looking on first > glance. :-) :) OK. I'll slap some comments on it next time I'm in there. Thanks for taking the time to examine the code. Regards, -- Gregor