develooper Front page | perl.perl5.porters | Postings from May 2015

Re: 5.22 breaks Coro-6.42

Thread Previous | Thread Next
May 31, 2015 20:13
Re: 5.22 breaks Coro-6.42
Message ID:
Max Maischein wrote:
> I did some spelunking in git history and some comparing between 5.20 and 
> 5.22-RC2, and here are my findings (as on irc):
> There are two errors. One can be easily fixed by reverting the patch 
> c910fead7893fe9700031ee59de6b904260b5d69 :
> State.xs:3472:9: error: assignment of member 'svt_get' in read-only object
>          orig_sigelem_get = PL_vtbl_sigelem.svt_get; 
> PL_vtbl_sigelem.svt_get
>  = coro_sigelem_get;
>          ^
> State.xs:3473:9: error: assignment of member 'svt_set' in read-only object
>          orig_sigelem_set = PL_vtbl_sigelem.svt_set; 
> PL_vtbl_sigelem.svt_set
>  = coro_sigelem_set;
>          ^
> State.xs:3474:9: error: assignment of member 'svt_clear' in read-only 
> object
>          orig_sigelem_clr = PL_vtbl_sigelem.svt_clear; 
> PL_vtbl_sigelem.svt_clear
>  = coro_sigelem_clr;
>          ^

Since I wrote that patch the solution is make your own magic vtable 
(struct mgvtbl), copy the function pointers you want from the core's 
vtable RO vtable to your RW vtable in your XS module. Then call 
mg_findext to get the core created MG *, and assign your vtable to 
mg->mg_virtual replacing the core one.

Another question, does core actually use or call anything in 
PL_vtbl_sigelem? I cant grep up where 's' magic is created or the vtable 
is used. I see

	    case 'S':
		if (strEQ(name2, "IG")) {
		    HV *hv;
		    I32 i;
		    if (!PL_psig_name) {
			Newxz(PL_psig_name, 2 * SIG_SIZE, SV*);
			Newxz(PL_psig_pend, SIG_SIZE, int);
			PL_psig_ptr = PL_psig_name + SIG_SIZE;
		    } else {
			/* I think that the only way to get here is to re-use an
			   embedded perl interpreter, where the previous
			   use didn't clean up fully because
			   PL_perl_destruct_level was 0. I'm not sure that we
			   "support" that, in that I suspect in that scenario
			   there are sufficient other garbage values left in the
			   interpreter structure that something else will crash
			   before we get here. I suspect that this is one of
			   those "doctor, it hurts when I do this" bugs.  */
			Zero(PL_psig_name, 2 * SIG_SIZE, SV*);
			Zero(PL_psig_pend, SIG_SIZE, int);
		    hv = GvHVn(gv);
		    hv_magic(hv, NULL, PERL_MAGIC_sig);
		    for (i = 1; i < SIG_SIZE; i++) {
			SV * const * const init = hv_fetch(hv, PL_sig_name[i], 
strlen(PL_sig_name[i]), 1);
			if (init)
			    sv_setsv(*init, &PL_sv_undef);
in gv.g but that is only PERL_MAGIC_sig not PERL_MAGIC_sigelem.

Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About