1 /* -*- mode: C; buffer-read-only: t -*- 2 !!!!!!! DO NOT EDIT THIS FILE !!!!!!! 3 This file is built by regen/miniperlmain.pl and ExtUtils::Miniperl. 4 Any changes made here will be lost! 5 */ 6 7 /* miniperlmain.c or perlmain.c - a generated file 8 * 9 * Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 10 * 2004, 2005, 2006, 2007, 2016 by Larry Wall and others 11 * 12 * You may distribute under the terms of either the GNU General Public 13 * License or the Artistic License, as specified in the README file. 14 * 15 */ 16 17 /* 18 * The Road goes ever on and on 19 * Down from the door where it began. 20 * 21 * [Bilbo on p.35 of _The Lord of the Rings_, I/i: "A Long-Expected Party"] 22 * [Frodo on p.73 of _The Lord of the Rings_, I/iii: "Three Is Company"] 23 */ 24 25 /* This file contains the main() function for the perl interpreter. 26 * Note that miniperlmain.c contains main() for the 'miniperl' binary, 27 * while perlmain.c contains main() for the 'perl' binary. The typical 28 * difference being that the latter includes Dynaloader. 29 * 30 * Miniperl is like perl except that it does not support dynamic loading, 31 * and in fact is used to build the dynamic modules needed for the 'real' 32 * perl executable. 33 * 34 * The content of the body of this generated file is mostly contained 35 * in Miniperl.pm - edit that file if you want to change anything. 36 * miniperlmain.c is generated by running regen/miniperlmain.pl, while 37 * perlmain.c is built automatically by Makefile (so the former is 38 * included in the tarball while the latter isn't). 39 */ 40 41 #ifdef OEMVS 42 #ifdef MYMALLOC 43 /* sbrk is limited to first heap segment so make it big */ 44 #pragma runopts(HEAP(8M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON)) 45 #else 46 #pragma runopts(HEAP(2M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON)) 47 #endif 48 #endif 49 50 #define PERL_IN_MINIPERLMAIN_C 51 52 /* work round bug in MakeMaker which doesn't currently (2019) supply this 53 * flag when making a statically linked perl */ 54 #define PERL_CORE 1 55 56 #include "EXTERN.h" 57 #include "perl.h" 58 #include "XSUB.h" 59 60 static void xs_init (pTHX); 61 static PerlInterpreter *my_perl; 62 63 #ifdef NO_ENV_ARRAY_IN_MAIN 64 extern char **environ; 65 int 66 main(int argc, char **argv) 67 #else 68 int 69 main(int argc, char **argv, char **env) 70 #endif 71 { 72 int exitstatus, i; 73 #ifndef NO_ENV_ARRAY_IN_MAIN 74 PERL_UNUSED_ARG(env); 75 #endif 76 77 /* if user wants control of gprof profiling off by default */ 78 /* noop unless Configure is given -Accflags=-DPERL_GPROF_CONTROL */ 79 PERL_GPROF_MONCONTROL(0); 80 81 #ifdef NO_ENV_ARRAY_IN_MAIN 82 PERL_SYS_INIT3(&argc,&argv,&environ); 83 #else 84 PERL_SYS_INIT3(&argc,&argv,&env); 85 #endif 86 87 #if defined(USE_ITHREADS) 88 /* XXX Ideally, this should really be happening in perl_alloc() or 89 * perl_construct() to keep libperl.a transparently fork()-safe. 90 * It is currently done here only because Apache/mod_perl have 91 * problems due to lack of a call to cancel pthread_atfork() 92 * handlers when shared objects that contain the handlers may 93 * be dlclose()d. This forces applications that embed perl to 94 * call PTHREAD_ATFORK() explicitly, but if and only if it hasn't 95 * been called at least once before in the current process. 96 * --GSAR 2001-07-20 */ 97 PTHREAD_ATFORK(Perl_atfork_lock, 98 Perl_atfork_unlock, 99 Perl_atfork_unlock); 100 #endif 101 102 PERL_SYS_FPU_INIT; 103 104 if (!PL_do_undump) { 105 my_perl = perl_alloc(); 106 if (!my_perl) 107 exit(1); 108 perl_construct(my_perl); 109 PL_perl_destruct_level = 0; 110 } 111 PL_exit_flags |= PERL_EXIT_DESTRUCT_END; 112 if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL)) { 113 114 /* perl_parse() may end up starting its own run loops, which 115 * might end up "leaking" PL_restartop from the parse phase into 116 * the run phase which then ends up confusing run_body(). This 117 * leakage shouldn't happen and if it does its a bug. 118 * 119 * Note we do not do this assert in perl_run() or perl_parse() 120 * as there are modules out there which explicitly set 121 * PL_restartop before calling perl_run() directly from XS code 122 * (Coro), and it is conceivable PL_restartop could be set prior 123 * to calling perl_parse() by XS code as well. 124 * 125 * What we want to check is that the top level perl_parse(), 126 * perl_run() pairing does not allow a leaking PL_restartop, as 127 * that indicates a bug in perl. By putting the assert here we 128 * can validate that Perl itself is operating correctly without 129 * risking breakage to XS code under DEBUGGING. - Yves 130 */ 131 assert(!PL_restartop); 132 133 perl_run(my_perl); 134 } 135 136 /* Unregister our signal handler before destroying my_perl */ 137 for (i = 1; PL_sig_name[i]; i++) { 138 if (rsignal_state(PL_sig_num[i]) == (Sighandler_t) PL_csighandlerp) { 139 rsignal(PL_sig_num[i], (Sighandler_t) SIG_DFL); 140 } 141 } 142 143 exitstatus = perl_destruct(my_perl); 144 145 perl_free(my_perl); 146 147 PERL_SYS_TERM(); 148 149 exit(exitstatus); 150 } 151 152 /* Register any extra external extensions */ 153 154 155 static void 156 xs_init(pTHX) 157 { 158 dXSUB_SYS; 159 PERL_UNUSED_CONTEXT; 160 } 161 162 /* ex: set ro ft=c: */ 163