On Friday 04 January 2002 11:38 pm, Gregor N. Purdy wrote:
> You point out a place where I'm trying to resynch pc (which points into
>
> real bytecode) with pc_prederef (which points into the array of void *s):
> > interpreter.c, line 204:
> > ----------------------------
> > 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).
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.
But you may want to document that. It's quite scary looking on first
glance. :-)
--
Bryan C. Warnock
[EMAIL PROTECTED]