From: Jan Dubois Date: Tue, 8 Dec 2009 01:19:18 +0000 (-0800) Subject: Throw away uncleanable scopes when exiting a pseudo-forked process. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=1cb985b013ea71b82afbc114ed06f94d451f5e04;p=p5sagit%2Fp5-mst-13.2.git Throw away uncleanable scopes when exiting a pseudo-forked process. Commit adab9969 tried to clean up those additional scopes, but failed because some of the memory was allocated from a different pool. To avoid triggering the assert() in perl_destruct() this change instead moves the one remaining scope back to the root of the stack, effectively discarding the additional frames without any further processing. --- diff --git a/win32/perlhost.h b/win32/perlhost.h index 5e89f85..7464c7a 100644 --- a/win32/perlhost.h +++ b/win32/perlhost.h @@ -1771,9 +1771,14 @@ restart: CALLRUNOPS(aTHX); /* We may have additional unclosed scopes if fork() was called * from within a BEGIN block. See perlfork.pod for more details. + * We cannot clean up these other scopes because they belong to a + * different interpreter, but we also cannot leave PL_scopestack_ix + * dangling because that can trigger an assertion in perl_destruct(). */ - while (PL_scopestack_ix > oldscope) - LEAVE; + if (PL_scopestack_ix > oldscope) { + PL_scopestack[oldscope-1] = PL_scopestack[PL_scopestack_ix-1]; + PL_scopestack_ix = oldscope; + } status = 0; break; case 2: