Change 11839 by sky@sky-titanic on 2001/09/03 10:47:11
Document the changes with regards to running of END blocks.
And DESTROY on global objects are called in perl_destruct()!
Affected files ...
... //depot/perl/pod/perl572delta.pod#28 edit
... //depot/perl/pod/perlembed.pod#27 edit
Differences ...
==== //depot/perl/pod/perl572delta.pod#28 (text) ====
Index: perl/pod/perl572delta.pod
--- perl/pod/perl572delta.pod.~1~ Mon Sep 3 05:00:05 2001
+++ perl/pod/perl572delta.pod Mon Sep 3 05:00:05 2001
@@ -163,6 +163,14 @@
VMS now works under PerlIO.
+=item *
+
+END blocks are now run even if you exit/die in a BEGIN block.
+The execution of END blocks is now controlled by
+PL_exit_flags & PERL_EXIT_DESTRUCT_END. This enables the new
+behaviour for perl embedders. This will default in 5.10. See
+L<perlembed>.
+
=back
=head1 Modules and Pragmata
==== //depot/perl/pod/perlembed.pod#27 (text) ====
Index: perl/pod/perlembed.pod
--- perl/pod/perlembed.pod.~1~ Mon Sep 3 05:00:05 2001
+++ perl/pod/perlembed.pod Mon Sep 3 05:00:05 2001
@@ -185,6 +185,7 @@
{
my_perl = perl_alloc();
perl_construct(my_perl);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_parse(my_perl, NULL, argc, argv, (char **)NULL);
perl_run(my_perl);
perl_destruct(my_perl);
@@ -238,6 +239,7 @@
perl_construct(my_perl);
perl_parse(my_perl, NULL, argc, argv, NULL);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
/*** skipping perl_run() ***/
@@ -270,10 +272,9 @@
(the beginning of the Unix epoch), and the moment I began writing this
sentence.
-In this particular case we don't have to call I<perl_run>, but in
-general it's considered good practice to ensure proper initialization
-of library code, including execution of all object C<DESTROY> methods
-and package C<END {}> blocks.
+In this particular case we don't have to call I<perl_run>, as we set
+the PL_exit_flag PERL_EXIT_DESTRUCT_END which executes END blocks in
+perl_destruct.
If you want to pass arguments to the Perl subroutine, you can add
strings to the C<NULL>-terminated C<args> list passed to
@@ -311,6 +312,7 @@
perl_construct( my_perl );
perl_parse(my_perl, NULL, 3, embedding, NULL);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_run(my_perl);
/** Treat $a as an integer **/
@@ -488,6 +490,7 @@
perl_construct(my_perl);
perl_parse(my_perl, NULL, 3, embedding, NULL);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
sv_setpv(text, "When he is at a convenience store and the bill comes to some
amount like 76 cents, Maynard is aware that there is something he *should* do,
something that will enable him to get back a quarter, but he has no idea *what*. He
fumbles through his red squeezey changepurse and gives the boy three extra pennies
with his dollar, hoping that he might luck into the correct amount. The boy gives him
back two of his own pennies and then the big shiny quarter that is his prize. -RICHH");
@@ -612,6 +615,7 @@
perl_construct( my_perl );
perl_parse(my_perl, NULL, 2, my_argv, (char **)NULL);
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_run(my_perl);
PerlPower(3, 4); /*** Compute 3 ** 4 ***/
@@ -761,7 +765,7 @@
perl_construct(perl);
exitstatus = perl_parse(perl, NULL, 2, embedding, NULL);
-
+ PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
if(!exitstatus) {
exitstatus = perl_run(perl);
@@ -808,6 +812,14 @@
foo says: hello
Enter file name: ^C
+=head2 Execution of END blocks
+
+Traditionally END blocks have been executed at the end of the perl_run.
+This causes problems for applications that never call perl_run. Since
+perl 5.7.2 you can specify C<PL_exit_flags |= PERL_EXIT_DESTRUCT_END>
+to get the new behaviour. This also enables the running of END blocks if
+the perl_prase fails and C<perl_destruct> will return the exit value.
+
=head2 Maintaining multiple interpreter instances
Some rare applications will need to create more than one interpreter
End of Patch.