X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=util.c;h=9d8a0c1113eac1f73ceeb7e44b1e3df4315bc5e6;hb=aadb217dbe1b43fbd45cb1644a86dd26d09068d0;hp=3598e7b3200198d48c6731e12c81fc68b83f25bf;hpb=2e0de35c58680e1e008b1d014c5b9ccec5b78282;p=p5sagit%2Fp5-mst-13.2.git diff --git a/util.c b/util.c index 3598e7b..9d8a0c1 100644 --- a/util.c +++ b/util.c @@ -141,6 +141,7 @@ Perl_safesysrealloc(Malloc_t where,MEM_SIZE size) Free_t Perl_safesysfree(Malloc_t where) { + dVAR; #ifdef PERL_IMPLICIT_SYS dTHX; #endif @@ -224,7 +225,7 @@ Free_t Perl_mfree (Malloc_t where) /* copy a string up to some (non-backslashed) delimiter, if any */ char * -Perl_delimcpy(pTHX_ register char *to, register char *toend, register char *from, register char *fromend, register int delim, I32 *retlen) +Perl_delimcpy(pTHX_ register char *to, register const char *toend, register const char *from, register const char *fromend, register int delim, I32 *retlen) { register I32 tolen; for (tolen = 0; from < fromend; from++, tolen++) { @@ -246,7 +247,7 @@ Perl_delimcpy(pTHX_ register char *to, register char *toend, register char *from if (to < toend) *to = '\0'; *retlen = tolen; - return from; + return (char *)from; } /* return ptr to little string in big string, NULL if not found */ @@ -286,7 +287,7 @@ char * Perl_ninstr(pTHX_ register const char *big, register const char *bigend, const char *little, const char *lend) { register const char *s, *x; - register I32 first = *little; + register const I32 first = *little; register const char *littleend = lend; if (!first && little >= littleend) @@ -316,7 +317,7 @@ Perl_rninstr(pTHX_ register const char *big, const char *bigend, const char *lit { register const char *bigbeg; register const char *s, *x; - register I32 first = *little; + register const I32 first = *little; register const char *littleend = lend; if (!first && little >= littleend) @@ -439,7 +440,7 @@ Perl_fbm_instr(pTHX_ unsigned char *big, register unsigned char *bigend, SV *lit STRLEN l; register unsigned char *little = (unsigned char *)SvPV(littlestr,l); register STRLEN littlelen = l; - register I32 multiline = flags & FBMrf_MULTILINE; + register const I32 multiline = flags & FBMrf_MULTILINE; if ((STRLEN)(bigend - big) < littlelen) { if ( SvTAIL(littlestr) @@ -567,7 +568,7 @@ Perl_fbm_instr(pTHX_ unsigned char *big, register unsigned char *bigend, SV *lit } { /* Do actual FBM. */ - register unsigned char *table = little + littlelen + FBM_TABLE_OFFSET; + register const unsigned char *table = little + littlelen + FBM_TABLE_OFFSET; register unsigned char *oldlittle; if (littlelen > (STRLEN)(bigend - big)) @@ -716,8 +717,8 @@ Perl_screaminstr(pTHX_ SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift I32 Perl_ibcmp(pTHX_ const char *s1, const char *s2, register I32 len) { - register U8 *a = (U8 *)s1; - register U8 *b = (U8 *)s2; + register const U8 *a = (const U8 *)s1; + register const U8 *b = (const U8 *)s2; while (len--) { if (*a != *b && *a != PL_fold[*b]) return 1; @@ -729,8 +730,9 @@ Perl_ibcmp(pTHX_ const char *s1, const char *s2, register I32 len) I32 Perl_ibcmp_locale(pTHX_ const char *s1, const char *s2, register I32 len) { - register U8 *a = (U8 *)s1; - register U8 *b = (U8 *)s2; + dVAR; + register const U8 *a = (const U8 *)s1; + register const U8 *b = (const U8 *)s2; while (len--) { if (*a != *b && *a != PL_fold_locale[*b]) return 1; @@ -758,10 +760,18 @@ char * Perl_savepv(pTHX_ const char *pv) { register char *newaddr; +#ifdef PERL_MALLOC_WRAP + STRLEN pvlen; +#endif if (!pv) return Nullch; +#ifdef PERL_MALLOC_WRAP + pvlen = strlen(pv)+1; + New(902,newaddr,pvlen,char); +#else New(902,newaddr,strlen(pv)+1,char); +#endif return strcpy(newaddr,pv); } @@ -788,10 +798,10 @@ Perl_savepvn(pTHX_ const char *pv, register I32 len) if (pv) { /* might not be null terminated */ newaddr[len] = '\0'; - return CopyD(pv,newaddr,len,char); + return (char *) CopyD(pv,newaddr,len,char); } else { - return ZeroD(newaddr,len+1,char); + return (char *) ZeroD(newaddr,len+1,char); } } @@ -822,7 +832,7 @@ Perl_savesharedpv(pTHX_ const char *pv) /* =for apidoc savesvpv -A version of C/C/C which gets the string to duplicate from the passed in SV using C =cut @@ -835,8 +845,9 @@ Perl_savesvpv(pTHX_ SV *sv) const char *pv = SvPV(sv, len); register char *newaddr; - New(903,newaddr,++len,char); - return CopyD(pv,newaddr,len,char); + ++len; + New(903,newaddr,len,char); + return (char *) CopyD(pv,newaddr,len,char); } @@ -977,8 +988,7 @@ SV * Perl_vmess(pTHX_ const char *pat, va_list *args) { SV *sv = mess_alloc(); - static char dgd[] = " during global destruction.\n"; - COP *cop; + static const char dgd[] = " during global destruction.\n"; sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') { @@ -990,14 +1000,14 @@ Perl_vmess(pTHX_ const char *pat, va_list *args) * from the sibling of PL_curcop. */ - cop = closest_cop(PL_curcop, PL_curcop->op_sibling); + const COP *cop = closest_cop(PL_curcop, PL_curcop->op_sibling); if (!cop) cop = PL_curcop; if (CopLINE(cop)) Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf, OutCopFILE(cop), (IV)CopLINE(cop)); if (GvIO(PL_last_in_gv) && IoLINES(GvIOp(PL_last_in_gv))) { - bool line_mode = (RsSIMPLE(PL_rs) && + const bool line_mode = (RsSIMPLE(PL_rs) && SvCUR(PL_rs) == 1 && *SvPVX(PL_rs) == '\n'); Perl_sv_catpvf(aTHX_ sv, ", <%s> %s %"IVdf, PL_last_in_gv == PL_argvgv ? @@ -1013,6 +1023,7 @@ Perl_vmess(pTHX_ const char *pat, va_list *args) void Perl_write_to_stderr(pTHX_ const char* message, int msglen) { + dVAR; IO *io; MAGIC *mg; @@ -1060,10 +1071,11 @@ Perl_write_to_stderr(pTHX_ const char* message, int msglen) void S_vdie_common(pTHX_ const char *message, STRLEN msglen, I32 utf8); -char * +STATIC char * S_vdie_croak_common(pTHX_ const char* pat, va_list* args, STRLEN* msglen, I32* utf8) { + dVAR; char *message; if (pat) { @@ -1134,8 +1146,8 @@ S_vdie_common(pTHX_ const char *message, STRLEN msglen, I32 utf8) OP * Perl_vdie(pTHX_ const char* pat, va_list *args) { - char *message; - int was_in_eval = PL_in_eval; + const char *message; + const int was_in_eval = PL_in_eval; STRLEN msglen; I32 utf8 = 0; @@ -1183,7 +1195,7 @@ Perl_die(pTHX_ const char* pat, ...) void Perl_vcroak(pTHX_ const char* pat, va_list *args) { - char *message; + const char *message; STRLEN msglen; I32 utf8 = 0; @@ -1247,6 +1259,7 @@ Perl_croak(pTHX_ const char *pat, ...) void Perl_vwarn(pTHX_ const char* pat, va_list *args) { + dVAR; char *message; HV *stash; GV *gv; @@ -1326,7 +1339,7 @@ Perl_warn(pTHX_ const char *pat, ...) void Perl_warner_nocontext(U32 err, const char *pat, ...) { - dTHX; + dTHX; va_list args; va_start(args, pat); vwarner(err, pat, &args); @@ -1346,10 +1359,11 @@ Perl_warner(pTHX_ U32 err, const char* pat,...) void Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args) { + dVAR; if (ckDEAD(err)) { SV *msv = vmess(pat, args); STRLEN msglen; - char *message = SvPV(msv, msglen); + const char *message = SvPV(msv, msglen); I32 utf8 = SvUTF8(msv); if (PL_diehook) { @@ -1383,8 +1397,9 @@ Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args) /* VMS' my_setenv() is in vms.c */ #if !defined(WIN32) && !defined(NETWARE) void -Perl_my_setenv(pTHX_ char *nam, char *val) +Perl_my_setenv(pTHX_ const char *nam, const char *val) { + dVAR; #ifdef USE_ITHREADS /* only parent thread can modify process environment */ if (PL_curinterp == aTHX) @@ -1405,7 +1420,7 @@ Perl_my_setenv(pTHX_ char *nam, char *val) for (max = i; environ[max]; max++) ; tmpenv = (char**)safesysmalloc((max+2) * sizeof(char*)); for (j=0; j 0) { @@ -2122,8 +2139,6 @@ Perl_my_popen(pTHX_ char *cmd, char *mode) #ifndef OS2 if (doexec) { #if !defined(HAS_FCNTL) || !defined(F_SETFD) - int fd; - #ifndef NOFILE #define NOFILE 20 #endif @@ -2170,7 +2185,7 @@ Perl_my_popen(pTHX_ char *cmd, char *mode) sv = *av_fetch(PL_fdpid,p[This],TRUE); UNLOCK_FDPID_MUTEX; (void)SvUPGRADE(sv,SVt_IV); - SvIVX(sv) = pid; + SvIV_set(sv, pid); PL_forkprocess = pid; if (did_pipes && pid > 0) { int errkid; @@ -2237,6 +2252,7 @@ Perl_my_popen(pTHX_ char *cmd, char *mode) void Perl_atfork_lock(void) { + dVAR; #if defined(USE_ITHREADS) /* locks must be held in locking order (if any) */ # ifdef MYMALLOC @@ -2250,6 +2266,7 @@ Perl_atfork_lock(void) void Perl_atfork_unlock(void) { + dVAR; #if defined(USE_ITHREADS) /* locks must be released in same order as in atfork_lock() */ # ifdef MYMALLOC @@ -2294,6 +2311,7 @@ Perl_dump_fds(pTHX_ char *s) PerlIO_printf(Perl_debug_log," %d",fd); } PerlIO_printf(Perl_debug_log,"\n"); + return; } #endif /* DUMP_FDS */ @@ -2342,6 +2360,7 @@ dup2(int oldfd, int newfd) Sighandler_t Perl_rsignal(pTHX_ int signo, Sighandler_t handler) { + dVAR; struct sigaction act, oact; #ifdef USE_ITHREADS @@ -2381,6 +2400,7 @@ Perl_rsignal_state(pTHX_ int signo) int Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save) { + dVAR; struct sigaction act; #ifdef USE_ITHREADS @@ -2406,6 +2426,7 @@ Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save) int Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save) { + dVAR; #ifdef USE_ITHREADS /* only "parent" interpreter can diddle signals */ if (PL_curinterp != aTHX) @@ -2429,19 +2450,18 @@ Perl_rsignal(pTHX_ int signo, Sighandler_t handler) return PerlProc_signal(signo, handler); } -static int sig_trapped; /* XXX signals are process-wide anyway, so we - ignore the implications of this for threading */ - static Signal_t sig_trap(int signo) { - sig_trapped++; + dVAR; + PL_sig_trapped++; } Sighandler_t Perl_rsignal_state(pTHX_ int signo) { + dVAR; Sighandler_t oldsig; #if defined(USE_ITHREADS) && !defined(WIN32) @@ -2450,10 +2470,10 @@ Perl_rsignal_state(pTHX_ int signo) return SIG_ERR; #endif - sig_trapped = 0; + PL_sig_trapped = 0; oldsig = PerlProc_signal(signo, sig_trap); PerlProc_signal(signo, oldsig); - if (sig_trapped) + if (PL_sig_trapped) PerlProc_kill(PerlProc_getpid(), signo); return oldsig; } @@ -2551,16 +2571,15 @@ Perl_my_pclose(pTHX_ PerlIO *ptr) I32 Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags) { - I32 result; + I32 result = 0; if (!pid) return -1; #if !defined(HAS_WAITPID) && !defined(HAS_WAIT4) || defined(HAS_WAITPID_RUNTIME) { - SV *sv; - SV** svp; char spid[TYPE_CHARS(IV)]; if (pid > 0) { + SV** svp; sprintf(spid, "%"IVdf, (IV)pid); svp = hv_fetch(PL_pidstatus,spid,strlen(spid),FALSE); if (svp && *svp != &PL_sv_undef) { @@ -2574,8 +2593,9 @@ Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags) hv_iterinit(PL_pidstatus); if ((entry = hv_iternext(PL_pidstatus))) { + SV *sv = hv_iterval(PL_pidstatus,entry); + pid = atoi(hv_iterkey(entry,(I32*)statusp)); - sv = hv_iterval(PL_pidstatus,entry); *statusp = SvIVX(sv); sprintf(spid, "%"IVdf, (IV)pid); (void)hv_delete(PL_pidstatus,spid,strlen(spid),G_DISCARD); @@ -2597,7 +2617,9 @@ Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags) goto finish; #endif #if !defined(HAS_WAITPID) && !defined(HAS_WAIT4) || defined(HAS_WAITPID_RUNTIME) +#if defined(HAS_WAITPID) && defined(HAS_WAITPID_RUNTIME) hard_way: +#endif { if (flags) Perl_croak(aTHX_ "Can't do waitpid with flags"); @@ -2609,7 +2631,9 @@ Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags) } } #endif +#if defined(HAS_WAITPID) || defined(HAS_WAIT4) finish: +#endif if (result < 0 && errno == EINTR) { PERL_ASYNC_CHECK(); } @@ -2627,7 +2651,7 @@ Perl_pidgone(pTHX_ Pid_t pid, int status) sprintf(spid, "%"IVdf, (IV)pid); sv = *hv_fetch(PL_pidstatus,spid,strlen(spid),TRUE); (void)SvUPGRADE(sv,SVt_IV); - SvIVX(sv) = status; + SvIV_set(sv, status); return; } @@ -2722,9 +2746,9 @@ Perl_same_dirent(pTHX_ char *a, char *b) #endif /* !HAS_RENAME */ char* -Perl_find_script(pTHX_ char *scriptname, bool dosearch, char **search_ext, I32 flags) +Perl_find_script(pTHX_ const char *scriptname, bool dosearch, const char **search_ext, I32 flags) { - char *xfound = Nullch; + const char *xfound = Nullch; char *xfailed = Nullch; char tmpbuf[MAXPATHLEN]; register char *s; @@ -2744,11 +2768,12 @@ Perl_find_script(pTHX_ char *scriptname, bool dosearch, char **search_ext, I32 f #endif /* additional extensions to try in each dir if scriptname not found */ #ifdef SEARCH_EXTS - char *exts[] = { SEARCH_EXTS }; - char **ext = search_ext ? search_ext : exts; + const char *exts[] = { SEARCH_EXTS }; + const char **ext = search_ext ? search_ext : exts; int extidx = 0, i = 0; - char *curext = Nullch; + const char *curext = Nullch; #else + (void)search_ext; # define MAX_EXT_LEN 0 #endif @@ -2806,7 +2831,7 @@ Perl_find_script(pTHX_ char *scriptname, bool dosearch, char **search_ext, I32 f if (strEQ(scriptname, "-")) dosearch = 0; if (dosearch) { /* Look in '.' first. */ - char *cur = scriptname; + const char *cur = scriptname; #ifdef SEARCH_EXTS if ((curext = strrchr(scriptname,'.'))) /* possible current ext */ while (ext[i]) @@ -2957,6 +2982,7 @@ Perl_find_script(pTHX_ char *scriptname, bool dosearch, char **search_ext, I32 f void * Perl_get_context(void) { + dVAR; #if defined(USE_ITHREADS) # ifdef OLD_PTHREADS_API pthread_addr_t t; @@ -2978,6 +3004,7 @@ Perl_get_context(void) void Perl_set_context(void *t) { + dVAR; #if defined(USE_ITHREADS) # ifdef I_MACH_CTHREADS cthread_set_data(cthread_self(), t); @@ -2990,7 +3017,7 @@ Perl_set_context(void *t) #endif /* !PERL_GET_CONTEXT_DEFINED */ -#ifdef PERL_GLOBAL_STRUCT +#if defined(PERL_GLOBAL_STRUCT) && !defined(PERL_GLOBAL_STRUCT_PRIVATE) struct perl_vars * Perl_GetVars(pTHX) { @@ -3001,30 +3028,31 @@ Perl_GetVars(pTHX) char ** Perl_get_op_names(pTHX) { - return PL_op_name; + return (char **)PL_op_name; } char ** Perl_get_op_descs(pTHX) { - return PL_op_desc; + return (char **)PL_op_desc; } -char * +const char * Perl_get_no_modify(pTHX) { - return (char*)PL_no_modify; + return PL_no_modify; } U32 * Perl_get_opargs(pTHX) { - return PL_opargs; + return (U32 *)PL_opargs; } PPADDR_t* Perl_get_ppaddr(pTHX) { + dVAR; return (PPADDR_t*)PL_ppaddr; } @@ -3043,7 +3071,7 @@ Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len) MGVTBL* Perl_get_vtbl(pTHX_ int vtbl_id) { - MGVTBL* result = Null(MGVTBL*); + const MGVTBL* result = Null(MGVTBL*); switch(vtbl_id) { case want_vtbl_sv: @@ -3139,7 +3167,7 @@ Perl_get_vtbl(pTHX_ int vtbl_id) result = &PL_vtbl_utf8; break; } - return result; + return (MGVTBL*)result; } I32 @@ -3193,17 +3221,17 @@ Perl_my_fflush_all(pTHX) } void -Perl_report_evil_fh(pTHX_ GV *gv, IO *io, I32 op) +Perl_report_evil_fh(pTHX_ const GV *gv, const IO *io, I32 op) { - char *func = + const char *func = op == OP_READLINE ? "readline" : /* "" not nice */ op == OP_LEAVEWRITE ? "write" : /* "write exit" not nice */ PL_op_desc[op]; - char *pars = OP_IS_FILETEST(op) ? "" : "()"; - char *type = OP_IS_SOCKET(op) + const char *pars = OP_IS_FILETEST(op) ? "" : "()"; + const char *type = OP_IS_SOCKET(op) || (gv && io && IoTYPE(io) == IoTYPE_SOCKET) ? "socket" : "filehandle"; - char *name = NULL; + const char *name = NULL; if (gv && isGV(gv)) { name = GvENAME(gv); @@ -3222,7 +3250,7 @@ Perl_report_evil_fh(pTHX_ GV *gv, IO *io, I32 op) } } else { - char *vile; + const char *vile; I32 warn_type; if (gv && io && IoTYPE(io) == IoTYPE_CLOSED) { @@ -3267,7 +3295,7 @@ int Perl_ebcdic_control(pTHX_ int ch) { if (ch > 'a') { - char *ctlp; + const char *ctlp; if (islower(ch)) ch = toupper(ch); @@ -3326,8 +3354,11 @@ Perl_init_tm(pTHX_ struct tm *ptm) /* see mktime, strftime and asctime */ { #ifdef HAS_TM_TM_ZONE Time_t now; + struct tm* my_tm; (void)time(&now); - Copy(localtime(&now), ptm, 1, struct tm); + my_tm = localtime(&now); + if (my_tm) + Copy(my_tm, ptm, 1, struct tm); #endif } @@ -3529,7 +3560,7 @@ Perl_mini_mktime(pTHX_ struct tm *ptm) } char * -Perl_my_strftime(pTHX_ char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst) +Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst) { #ifdef HAS_STRFTIME char *buf; @@ -3583,8 +3614,8 @@ Perl_my_strftime(pTHX_ char *fmt, int sec, int min, int hour, int mday, int mon, return buf; else { /* Possibly buf overflowed - try again with a bigger buf */ - int fmtlen = strlen(fmt); - int bufsize = fmtlen + buflen; + const int fmtlen = strlen(fmt); + const int bufsize = fmtlen + buflen; New(0, buf, bufsize, char); while (buf) { @@ -3597,13 +3628,13 @@ Perl_my_strftime(pTHX_ char *fmt, int sec, int min, int hour, int mday, int mon, buf = NULL; break; } - bufsize *= 2; - Renew(buf, bufsize, char); + Renew(buf, bufsize*2, char); } return buf; } #else Perl_croak(aTHX_ "panic: no strftime"); + return NULL; #endif } @@ -3804,10 +3835,10 @@ it doesn't. */ char * -Perl_scan_version(pTHX_ char *s, SV *rv, bool qv) +Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv) { const char *start = s; - char *pos = s; + const char *pos = s; I32 saw_period = 0; bool saw_under = 0; SV* sv = newSVrv(rv, "version"); /* create an SV and upgrade the RV */ @@ -3848,7 +3879,7 @@ Perl_scan_version(pTHX_ char *s, SV *rv, bool qv) rev = 0; { /* this is atoi() that delimits on underscores */ - char *end = pos; + const char *end = pos; I32 mult = 1; I32 orev; if ( s < pos && s > start && *(s-1) == '_' ) { @@ -3910,7 +3941,7 @@ Perl_scan_version(pTHX_ char *s, SV *rv, bool qv) while (len-- > 0) av_push((AV *)sv, newSViv(0)); } - return s; + return (char *)s; } /* @@ -4416,7 +4447,15 @@ Perl_my_socketpair (int family, int type, int protocol, int fd[2]) { return 0; abort_tidy_up_and_fail: - errno = ECONNABORTED; /* I hope this is portable and appropriate. */ +#ifdef ECONNABORTED + errno = ECONNABORTED; /* This would be the standard thing to do. */ +#else +# ifdef ECONNREFUSED + errno = ECONNREFUSED; /* E.g. Symbian does not have ECONNABORTED. */ +# else + errno = ETIMEDOUT; /* Desperation time. */ +# endif +#endif tidy_up_and_fail: { int save_errno = errno; @@ -4457,6 +4496,7 @@ some level of strict-ness. void Perl_sv_nosharing(pTHX_ SV *sv) { + (void)sv; } /* @@ -4472,6 +4512,7 @@ some level of strict-ness. void Perl_sv_nolocking(pTHX_ SV *sv) { + (void)sv; } @@ -4488,12 +4529,13 @@ some level of strict-ness. void Perl_sv_nounlocking(pTHX_ SV *sv) { + (void)sv; } U32 -Perl_parse_unicode_opts(pTHX_ char **popt) +Perl_parse_unicode_opts(pTHX_ const char **popt) { - char *p = *popt; + const char *p = *popt; U32 opt = 0; if (*p) { @@ -4597,7 +4639,7 @@ Perl_seed(pTHX) #endif fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0); if (fd != -1) { - if (PerlLIO_read(fd, &u, sizeof u) != sizeof u) + if (PerlLIO_read(fd, (void*)&u, sizeof u) != sizeof u) u = 0; PerlLIO_close(fd); if (u) @@ -4628,7 +4670,7 @@ Perl_seed(pTHX) UV Perl_get_hash_seed(pTHX) { - char *s = PerlEnv_getenv("PERL_HASH_SEED"); + const char *s = PerlEnv_getenv("PERL_HASH_SEED"); UV myseed = 0; if (s) @@ -4661,3 +4703,78 @@ Perl_get_hash_seed(pTHX) return myseed; } + +#ifdef PERL_GLOBAL_STRUCT + +struct perl_vars * +Perl_init_global_struct(pTHX) +{ + struct perl_vars *plvarsp = NULL; +#ifdef PERL_GLOBAL_STRUCT +# define PERL_GLOBAL_STRUCT_INIT +# include "opcode.h" /* the ppaddr and check */ + IV nppaddr = sizeof(Gppaddr)/sizeof(Perl_ppaddr_t); + IV ncheck = sizeof(Gcheck) /sizeof(Perl_check_t); +# ifdef PERL_GLOBAL_STRUCT_PRIVATE + /* PerlMem_malloc() because can't use even safesysmalloc() this early. */ + plvarsp = (struct perl_vars*)PerlMem_malloc(sizeof(struct perl_vars)); + if (!plvarsp) + exit(1); +# else + plvarsp = PL_VarsPtr; +# endif /* PERL_GLOBAL_STRUCT_PRIVATE */ +# undef PERLVAR +# undef PERLVARA +# undef PERLVARI +# undef PERLVARIC +# undef PERLVARISC +# define PERLVAR(var,type) /**/ +# define PERLVARA(var,n,type) /**/ +# define PERLVARI(var,type,init) plvarsp->var = init; +# define PERLVARIC(var,type,init) plvarsp->var = init; +# define PERLVARISC(var,init) Copy(init, plvarsp->var, sizeof(init), char); +# include "perlvars.h" +# undef PERLVAR +# undef PERLVARA +# undef PERLVARI +# undef PERLVARIC +# undef PERLVARISC +# ifdef PERL_GLOBAL_STRUCT + plvarsp->Gppaddr = PerlMem_malloc(nppaddr * sizeof(Perl_ppaddr_t)); + if (!plvarsp->Gppaddr) + exit(1); + plvarsp->Gcheck = PerlMem_malloc(ncheck * sizeof(Perl_check_t)); + if (!plvarsp->Gcheck) + exit(1); + Copy(Gppaddr, plvarsp->Gppaddr, nppaddr, Perl_ppaddr_t); + Copy(Gcheck, plvarsp->Gcheck, ncheck, Perl_check_t); +# endif +# ifdef PERL_SET_VARS + PERL_SET_VARS(plvarsp); +# endif +# undef PERL_GLOBAL_STRUCT_INIT +#endif + return plvarsp; +} + +#endif /* PERL_GLOBAL_STRUCT */ + +#ifdef PERL_GLOBAL_STRUCT + +void +Perl_free_global_struct(pTHX_ struct perl_vars *plvarsp) +{ +#ifdef PERL_GLOBAL_STRUCT +# ifdef PERL_UNSET_VARS + PERL_UNSET_VARS(plvarsp); +# endif + free(plvarsp->Gppaddr); + free(plvarsp->Gcheck); +# ifdef PERL_GLOBAL_STRUCT_PRIVATE + free(plvarsp); +# endif +#endif +} + +#endif /* PERL_GLOBAL_STRUCT */ +