"Marcus Holland-Moritz" <[EMAIL PROTECTED]> writes:
> > Nick Ing-Simmons <[EMAIL PROTECTED]> writes:
> >
> > > To let Tk list know a major gotcha blocking Tk release is fixed.
> > > Thanks to Steve Lide for the guest account on his G5 machine
> > > to track this!
> > >
> > > To let perl-xs list know even I am human and do dumb things ...
> > >
> > > void
> > > WidgetMethod(widget,name,...)
> > > SV * widget;
> > > SV * name;
> > > CODE:
> > > {
> > > Lang_CmdInfo *info = WindowCommand(widget, NULL, 1);
> > > XSRETURN(Call_Tk(info, items, &ST(0)));
> > > }
> > >
> > > Looks neat and tidy - but is fatally flawed.
> > > XSRETURN macro is basically
> > >
> > > THE_PERL_STACK_POINTER += Something.
> > >
> > > On Steve's G5 - that gets compiled as
> > > Get PERL_STACK_POINTER
> > > call function which returns value
> > > add
> > > Set PERL_STACK_POINTER
> > >
> > > The snag is that when function which returns value is a
> > > perl callback it can move the stack.
> > > So after above the stack pointer is pointing into an old stack
> > > which has now been free'd and re-used => CORE.
> > >
> > > Changing it to:
> > >
> > > void
> > > WidgetMethod(widget,name,...)
> > > SV * widget;
> > > SV * name;
> > > CODE:
> > > {
> > > Lang_CmdInfo *info = WindowCommand(widget, NULL, 1);
> > > IV count = Call_Tk(info, items, &ST(0));
> > > XSRETURN(count);
> > > }
> > >
> > > Fixes the problem.
> >
> > Is this worth a note in perlapi.pod?
>
> How about also fixing the source of the problem?
>
> --- XSUB.h.orig Wed Dec 10 20:39:37 2003
> +++ XSUB.h Wed Dec 10 20:43:26 2003
> @@ -193,7 +193,8 @@
>
> #define XSRETURN(off) \
> STMT_START { \
> - PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
> + IV tMpOfF = off; \
> + PL_stack_sp = PL_stack_base + ax + (tMpOfF - 1);\
> return; \
> } STMT_END
>
>
Maybe this should rather be XSRETURNx, just like similar macros (SvIV
vs. SvIVx, for example).
Regards,
Slaven
--
Slaven Rezic - [EMAIL PROTECTED]
Tk-AppMaster: a perl/Tk module launcher designed for handhelds
http://tk-appmaster.sf.net