On Wed, 9 Oct 2002, Brent Dax wrote: [Brent continues to churn out amazing quantities of good stuff]
Overall, it continues to look very good. Unfortunately, the compact-looking ch=va_arg((va_list)obj->data, char); gave Sun's compiler indigestion. I had to split it up into the much more pedestrian va_list arg; arg = (va_list) obj->data; ch = va_arg(arg, char); I hope that doesn't cause any problems. I also removed two harmless but extraneous \ from the ends of lines, and added a newline to the end. With the little patch below, I still get two test failures. The first is from t/src/sprintf_1.c. I'll look at this when I can (probably tomorrow) but in the meantime, here's the debugger output: (dbx) run Running: sprintf_1 (process id 17453) Hello, Parrot! PerlHash[0x100] PerlHash[0x100] Hello, Pa! Hello, Hello, Pa! signal BUS (invalid address alignment) in getint_va at line 62 in file "spf_vtable.c" 62 return (HUGEINTVAL)(INTVAL)(pmc->vtable->get_integer(interpreter, pmc)); (dbx) where =>[1] getint_va(interpreter = 0x172388, size = 6LL, obj = 0xffbef848), line 62 in "spf_vtable.c" [2] Parrot_sprintf_format(interpreter = 0x172388, pat = 0x18f558, obj = 0xffbef848), line 452 in "spf_render.c" [3] Parrot_vsprintf_s(interpreter = 0x172388, pat = 0x18f558, args = 0xffbef994), line 41 in "misc.c" [4] Parrot_vsprintf_c(interpreter = 0x172388, pat = 0xfc554 "%d = %Pd\n", args = 0xffbef994), line 51 in "misc.c" [5] Parrot_sprintf_c(interpreter = 0x172388, pat = 0xfc554 "%d = %Pd\n", ...), line 103 in "misc.c" [6] main(argc = 1, argv = 0xffbefa24), line 28 in "try.c" (dbx) The second failure is t/op/interp_2. Here's the debugger output on that one: Again, I'll look into this in the next day or so. $ ./parrot t/op/interp_2.pbc ok 1 Segmentation Fault(coredump) /home/doughera/src/parrot/parrot-andy>dbx parrot core Reading symbolic information for parrot core file header read successfully Reading symbolic information for rtld /usr/lib/ld.so.1 dbx: program is not active Reading symbolic information for libsocket.so.1 Reading symbolic information for libnsl.so.1 Reading symbolic information for libdl.so.1 Reading symbolic information for libc.so.1 Reading symbolic information for libmp.so.2 Reading symbolic information for libc_psr.so.1 program terminated by signal SEGV (no mapping at the fault address) Current function is getstring_va 124 return cstr2pstr(cstr); (dbx) where [1] strlen(0x0, 0x0, 0x11, 0x7efefeff, 0x81010100, 0x17b8db), at 0xff1b3144 =>[2] getstring_va(interpreter = 0x175fa8, size = 0, obj = 0xffbef5c8), line 124 in "spf_vtable.c" [3] Parrot_sprintf_format(interpreter = 0x175fa8, pat = 0x194338, obj = 0xffbef5c8), line 552 in "spf_render.c" [4] Parrot_vsprintf_s(interpreter = 0x175fa8, pat = 0x194338, args = 0xffbef71c), line 41 in "misc.c" [5] Parrot_vsprintf_c(interpreter = 0x175fa8, pat = 0x113d90 "PC=%vu; OP=%Ou (%s)", args = 0xffbef71c), line 51 in "misc.c" [6] PIO_eprintf(interpreter = 0x175fa8, s = 0x113d90 "PC=%vu; OP=%Ou (%s)", ...), line 664 in "io.c" [7] trace_op_dump(interpreter = 0x175fa8, code_start = 0x194a50, pc = 0x194a90), line 103 in "trace.c" [8] trace_op(interpreter = 0x175fa8, code_start = 0x194a50, code_end = 0x194ae8, pc = 0x194a90), line 208 in "trace.c" [9] runops_slow_core(interpreter = 0x175fa8, pc = 0x194a90), line 81 in "runops_cores.c" [10] runops_generic(core = 0x8ddc0 = &runops_slow_core(struct Parrot_Interp *interpreter, opcode_t *pc), interpreter = 0x175fa8, pc = 0x194a90), line 41 in "interpreter.c" [11] runops(interpreter = 0x175fa8, code = 0x1949d0, offset = 0), line 374 in "interpreter.c" [12] Parrot_runcode(interpreter = 0x175fa8, argc = 1, argv = 0xffbefab0), line 311 in "embed.c" [13] main(argc = 1, argv = 0xffbefab0), line 50 in "test_main.c" --- parrot-orig/spf_vtable.c Wed Oct 9 09:24:32 2002 +++ parrot-andy/spf_vtable.c Wed Oct 9 09:10:19 2002 @@ -34,26 +34,31 @@ /* VARARGS CORE */ static STRING* getchr_va(struct Parrot_Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj) { - char ch=va_arg((va_list)obj->data, char); + char ch; + va_list arg; + arg = (va_list) obj->data; + ch = va_arg(arg, char); return string_make(interpreter, &ch, 1, NULL, 0, NULL); } static HUGEINTVAL getint_va(struct Parrot_Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj) { + va_list arg; + arg = (va_list) obj->data; switch(size) { case SIZE_REG: - return (HUGEINTVAL)(int)va_arg((va_list)obj->data, int); + return (HUGEINTVAL)(int)va_arg(arg, int); case SIZE_SHORT: /* "'short int' is promoted to 'int' when passed through '...'" */ - return (HUGEINTVAL)(short)va_arg((va_list)obj->data, int); + return (HUGEINTVAL)(short)va_arg(arg, int); case SIZE_LONG: - return (HUGEINTVAL)(long)va_arg((va_list)obj->data, long); + return (HUGEINTVAL)(long)va_arg(arg, long); case SIZE_HUGE: - return (HUGEINTVAL)(HUGEINTVAL)va_arg((va_list)obj->data, HUGEINTVAL); + return (HUGEINTVAL)(HUGEINTVAL)va_arg(arg, HUGEINTVAL); case SIZE_XVAL: - return (HUGEINTVAL)(INTVAL)va_arg((va_list)obj->data, INTVAL); + return (HUGEINTVAL)(INTVAL)va_arg(arg, INTVAL); case SIZE_OPCODE: - return (HUGEINTVAL)(opcode_t)va_arg((va_list)obj->data, opcode_t); + return (HUGEINTVAL)(opcode_t)va_arg(arg, opcode_t); case SIZE_PMC: { - PMC *pmc=(PMC*)va_arg((va_list)obj->data, PMC*); + PMC *pmc=(PMC*)va_arg(arg, PMC*); return (HUGEINTVAL)(INTVAL)(pmc->vtable->get_integer(interpreter, pmc)); } default: @@ -63,22 +68,24 @@ } static UHUGEINTVAL getuint_va(struct Parrot_Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj) { + va_list arg; + arg = (va_list) obj->data; switch(size) { case SIZE_REG: - return (UHUGEINTVAL)(unsigned int)va_arg((va_list)obj->data, unsigned int); + return (UHUGEINTVAL)(unsigned int)va_arg(arg, unsigned int); case SIZE_SHORT: /* short int promoted HLAGHLAGHLAGH. See note above */ - return (UHUGEINTVAL)(unsigned short)va_arg((va_list)obj->data, unsigned int); + return (UHUGEINTVAL)(unsigned short)va_arg(arg, unsigned int); case SIZE_LONG: - return (UHUGEINTVAL)(unsigned long)va_arg((va_list)obj->data, unsigned long); + return (UHUGEINTVAL)(unsigned long)va_arg(arg, unsigned long); case SIZE_HUGE: - return (UHUGEINTVAL)(UHUGEINTVAL)va_arg((va_list)obj->data, UHUGEINTVAL); \ + return (UHUGEINTVAL)(UHUGEINTVAL)va_arg(arg, UHUGEINTVAL); case SIZE_XVAL: - return (UHUGEINTVAL)(UINTVAL)va_arg((va_list)obj->data, UINTVAL); + return (UHUGEINTVAL)(UINTVAL)va_arg(arg, UINTVAL); case SIZE_OPCODE: - return (UHUGEINTVAL)(opcode_t)va_arg((va_list)obj->data, opcode_t); + return (UHUGEINTVAL)(opcode_t)va_arg(arg, opcode_t); case SIZE_PMC: { - PMC* pmc=(PMC*)va_arg((va_list)obj->data, PMC*); - return (UHUGEINTVAL)(UINTVAL)(pmc->vtable->get_integer(interpreter, pmc)); \ + PMC* pmc=(PMC*)va_arg(arg, PMC*); + return (UHUGEINTVAL)(UINTVAL)(pmc->vtable->get_integer(interpreter, pmc)); } default: PANIC("Invalid uint type!"); @@ -87,17 +94,19 @@ } static HUGEFLOATVAL getfloat_va(struct Parrot_Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj) { + va_list arg; + arg = (va_list) obj->data; switch(size) { case SIZE_SHORT: - return (HUGEFLOATVAL)(float)va_arg((va_list)obj->data, float); + return (HUGEFLOATVAL)(float)va_arg(arg, float); case SIZE_REG: - return (HUGEFLOATVAL)(double)va_arg((va_list)obj->data, double); + return (HUGEFLOATVAL)(double)va_arg(arg, double); case SIZE_HUGE: - return (HUGEFLOATVAL)(HUGEFLOATVAL)va_arg((va_list)obj->data, HUGEFLOATVAL); + return (HUGEFLOATVAL)(HUGEFLOATVAL)va_arg(arg, HUGEFLOATVAL); case SIZE_XVAL: - return (HUGEFLOATVAL)(FLOATVAL)va_arg((va_list)obj->data, FLOATVAL); + return (HUGEFLOATVAL)(FLOATVAL)va_arg(arg, FLOATVAL); case SIZE_PMC: { - PMC* pmc=(PMC*)va_arg((va_list)obj->data, PMC*); + PMC* pmc=(PMC*)va_arg(arg, PMC*); return (HUGEFLOATVAL)(pmc->vtable->get_number(interpreter, pmc)); } default: @@ -107,17 +116,19 @@ } static STRING * getstring_va(struct Parrot_Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj) { + va_list arg; + arg = (va_list) obj->data; switch(size) { case SIZE_REG: { - char *cstr=(char*)va_arg((va_list)obj->data, char*); + char *cstr=(char*)va_arg(arg, char*); return cstr2pstr(cstr); } case SIZE_PSTR: - return string_copy(interpreter, (STRING*)va_arg((va_list)obj->data, STRING*)); + return string_copy(interpreter, (STRING*)va_arg(arg, STRING*)); case SIZE_PMC: { - PMC* pmc=(PMC*)va_arg((va_list)obj->data, PMC*); + PMC* pmc=(PMC*)va_arg(arg, PMC*); return pmc->vtable->get_string(interpreter, pmc); } @@ -128,7 +139,9 @@ } static void * getptr_va(struct Parrot_Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj) { - return (void*)va_arg((va_list)obj->data, void*); + va_list arg; + arg = (va_list) obj->data; + return (void*)va_arg(arg, void*); } SPRINTF_OBJ va_core={NULL, getchr_va, getint_va, getuint_va, getfloat_va, getstring_va, getptr_va}; @@ -222,4 +235,4 @@ * End: * * vim: expandtab shiftwidth=4: -*/ \ No newline at end of file +*/ -- Andy Dougherty [EMAIL PROTECTED]