The type changes in struct Packfile break the pointer math used in a few places to calculate the address of the end of the loaded byte code. This causes segfaults in build_asm in jit.c when using -j. It also breaks the bounds checking on opcode address in runops_slow_core.
The patch adds the necessary cast to correct the code_end calculations. -- Jason
Index: interpreter.c =================================================================== RCS file: /home/perlcvs/parrot/interpreter.c,v retrieving revision 1.68 diff -u -r1.68 interpreter.c --- interpreter.c 5 Feb 2002 09:20:07 -0000 1.68 +++ interpreter.c 14 Feb 2002 03:24:44 -0000 @@ -68,7 +68,7 @@ code_start = (opcode_t *)interpreter->code->byte_code; code_size = interpreter->code->byte_code_size; - code_end = (opcode_t *)(interpreter->code->byte_code + code_size); + code_end = (opcode_t *)((char *)interpreter->code->byte_code + code_size); pc = core(interpreter, pc); @@ -294,7 +294,7 @@ code_start = (opcode_t *)interpreter->code->byte_code; code_size = interpreter->code->byte_code_size; - code_end = (opcode_t *)(interpreter->code->byte_code + code_size); + code_end = (opcode_t *)((char *)interpreter->code->byte_code + code_size); jit_code = build_asm(interpreter, pc, code_start, code_end); #ifdef ALPHA @@ -345,7 +345,7 @@ code_start = (opcode_t *)interpreter->code->byte_code; code_size = interpreter->code->byte_code_size; - code_end = (opcode_t *)(interpreter->code->byte_code + code_size); + code_end = (opcode_t *)((char *)interpreter->code->byte_code + code_size); code_start_prederef = pc_prederef; Index: runops_cores.c =================================================================== RCS file: /home/perlcvs/parrot/runops_cores.c,v retrieving revision 1.11 diff -u -r1.11 runops_cores.c --- runops_cores.c 22 Jan 2002 16:57:25 -0000 1.11 +++ runops_cores.c 14 Feb 2002 03:24:44 -0000 @@ -49,7 +49,7 @@ code_start = (opcode_t *)interpreter->code->byte_code; code_size = interpreter->code->byte_code_size; - code_end = (opcode_t *)(interpreter->code->byte_code + code_size); + code_end = (opcode_t *)((char *)interpreter->code->byte_code + code_size); if (interpreter->flags & PARROT_TRACE_FLAG) { trace_op(interpreter, code_start, code_end, pc);