diff options
author | Ilya Zakharevich <ilya@math.berkeley.edu> | 2003-03-31 04:39:24 -0800 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2003-04-05 19:12:30 +0000 |
commit | 1ccffcf53e06b538ce52bce400c2322285291267 (patch) | |
tree | 9bc67c26245fab5f122f1a6d380d624276d6a291 | |
parent | 2f31ce7514c4aa5e63439203b688762243ac5b01 (diff) | |
download | perl-1ccffcf53e06b538ce52bce400c2322285291267.tar.gz |
Embedding
Message-ID: <20030331203924.GA3602@math.berkeley.edu>
Advertise the pair of macros PERL_SYS_INIT3 / PERL_SYS_TERM
to be used in a C program's main function.
p4raw-id: //depot/perl@19147
-rw-r--r-- | lib/ExtUtils/t/Embed.t | 8 | ||||
-rw-r--r-- | pod/perlembed.pod | 27 |
2 files changed, 30 insertions, 5 deletions
diff --git a/lib/ExtUtils/t/Embed.t b/lib/ExtUtils/t/Embed.t index be12b8f44b..682ca53963 100644 --- a/lib/ExtUtils/t/Embed.t +++ b/lib/ExtUtils/t/Embed.t @@ -155,7 +155,11 @@ static char *cmds[] = { "perl","-e", "print qq[ok 5\\n]", NULL }; int main(int argc, char **argv, char **env) { - PerlInterpreter *my_perl = perl_alloc(); + PerlInterpreter *my_perl; + + PERL_SYS_INIT3(&argc,&argv,&env); + + my_perl = perl_alloc(); my_puts("ok 2"); @@ -181,5 +185,7 @@ int main(int argc, char **argv, char **env) my_puts("ok 8"); + PERL_SYS_TERM(); + return 0; } diff --git a/pod/perlembed.pod b/pod/perlembed.pod index 7d00c6473a..3b28244b3e 100644 --- a/pod/perlembed.pod +++ b/pod/perlembed.pod @@ -183,6 +183,7 @@ version of I<miniperlmain.c> containing the essentials of embedding: int main(int argc, char **argv, char **env) { + PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct(my_perl); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; @@ -190,11 +191,16 @@ version of I<miniperlmain.c> containing the essentials of embedding: perl_run(my_perl); perl_destruct(my_perl); perl_free(my_perl); + PERL_SYS_TERM(); } Notice that we don't use the C<env> pointer. Normally handed to C<perl_parse> as its final argument, C<env> here is replaced by -C<NULL>, which means that the current environment will be used. +C<NULL>, which means that the current environment will be used. The macros +PERL_SYS_INIT3() and PERL_SYS_TERM() provide system-specific tune up +of the C runtime environment necessary to run Perl interpreters; since +PERL_SYS_INIT3() may change C<env>, it may be more appropriate to provide +C<env> as an argument to perl_parse(). Now compile this program (I'll call it I<interp.c>) into an executable: @@ -235,6 +241,7 @@ That's shown below, in a program I'll call I<showtime.c>. int main(int argc, char **argv, char **env) { char *args[] = { NULL }; + PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct(my_perl); @@ -247,6 +254,7 @@ That's shown below, in a program I'll call I<showtime.c>. perl_destruct(my_perl); perl_free(my_perl); + PERL_SYS_TERM(); } where I<showtime> is a Perl subroutine that takes no arguments (that's the @@ -308,6 +316,7 @@ the first, a C<float> from the second, and a C<char *> from the third. STRLEN n_a; char *embedding[] = { "", "-e", "0" }; + PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct( my_perl ); @@ -329,6 +338,7 @@ the first, a C<float> from the second, and a C<char *> from the third. perl_destruct(my_perl); perl_free(my_perl); + PERL_SYS_TERM(); } All of those strange functions with I<sv> in their names help convert Perl scalars to C types. They're described in L<perlguts> and L<perlapi>. @@ -489,6 +499,7 @@ been wrapped here): SV *text; STRLEN n_a; + PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct(my_perl); perl_parse(my_perl, NULL, 3, embedding, NULL); @@ -532,6 +543,7 @@ been wrapped here): PL_perl_destruct_level = 1; perl_destruct(my_perl); perl_free(my_perl); + PERL_SYS_TERM(); } which produces the output (again, long lines have been wrapped here) @@ -614,6 +626,7 @@ deep breath... { char *my_argv[] = { "", "power.pl" }; + PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct( my_perl ); @@ -625,6 +638,7 @@ deep breath... perl_destruct(my_perl); perl_free(my_perl); + PERL_SYS_TERM(); } @@ -763,6 +777,7 @@ with L<perlfunc/my> whenever possible. int exitstatus = 0; STRLEN n_a; + PERL_SYS_INIT3(&argc,&argv,&env); if((my_perl = perl_alloc()) == NULL) { fprintf(stderr, "no memory!"); exit(1); @@ -792,6 +807,7 @@ with L<perlfunc/my> whenever possible. PL_perl_destruct_level = 0; perl_destruct(my_perl); perl_free(my_perl); + PERL_SYS_TERM(); exit(exitstatus); } @@ -884,12 +900,14 @@ Let's give it a try: int main(int argc, char **argv, char **env) { - PerlInterpreter - *one_perl = perl_alloc(), - *two_perl = perl_alloc(); + PerlInterpreter *one_perl, *two_perl; char *one_args[] = { "one_perl", SAY_HELLO }; char *two_args[] = { "two_perl", SAY_HELLO }; + PERL_SYS_INIT3(&argc,&argv,&env); + one_perl = perl_alloc(); + two_perl = perl_alloc(); + PERL_SET_CONTEXT(one_perl); perl_construct(one_perl); PERL_SET_CONTEXT(two_perl); @@ -914,6 +932,7 @@ Let's give it a try: perl_free(one_perl); PERL_SET_CONTEXT(two_perl); perl_free(two_perl); + PERL_SYS_TERM(); } Note the calls to PERL_SET_CONTEXT(). These are necessary to initialize |