diff --git a/embedvar.h b/embedvar.h index 1095cf420b01..e53c82967865 100644 --- a/embedvar.h +++ b/embedvar.h @@ -111,7 +111,6 @@ #define PL_curcop (vTHX->Icurcop) #define PL_curcopdb (vTHX->Icurcopdb) #define PL_curlocales (vTHX->Icurlocales) -#define PL_curlocales_sizes (vTHX->Icurlocales_sizes) #define PL_curpad (vTHX->Icurpad) #define PL_curpm (vTHX->Icurpm) #define PL_curpm_under (vTHX->Icurpm_under) diff --git a/intrpvar.h b/intrpvar.h index 9bb619c447b1..76f3558f9b2e 100644 --- a/intrpvar.h +++ b/intrpvar.h @@ -367,14 +367,6 @@ PERLVAR(I, utf8locale, bool) /* utf8 locale detected */ PERLVAR(I, in_utf8_CTYPE_locale, bool) PERLVAR(I, in_utf8_COLLATE_locale, bool) PERLVAR(I, in_utf8_turkic_locale, bool) - -#ifdef USE_PL_CURLOCALES -/* This is the most number of categories we've encountered so far on any - * platform */ -PERLVARA(I, curlocales, 12, const char *) -PERLVARA(I, curlocales_sizes, 12, Size_t) -#endif - #if defined(USE_LOCALE) && defined(USE_LOCALE_THREADS) PERLVARI(I, locale_mutex_depth, int, 0) /* Emulate general semaphore */ #endif @@ -725,6 +717,13 @@ PERLVAR(I, constpadix, PADOFFSET) /* lowest unused for constants */ PERLVAR(I, padix_floor, PADOFFSET) /* how low may inner block reset padix */ +#ifdef USE_PL_CURLOCALES + +/* This is the most number of categories we've encountered so far on any + * platform */ +PERLVARA(I, curlocales, 12, const char *) + +#endif #ifdef USE_LOCALE_COLLATE PERLVAR(I, collation_name, char *) /* Name of current collation */ diff --git a/locale.c b/locale.c index c04d901f9007..b6e5f113b7f7 100644 --- a/locale.c +++ b/locale.c @@ -854,7 +854,8 @@ S_update_PL_curlocales_i(pTHX_ /* PL_curlocales is a parallel array, so has same * length as 'categories' */ for (i = 0; i < LC_ALL_INDEX_; i++) { - save_to_buffer(new_locale, &PL_curlocales[i], &PL_curlocales_sizes[i]); + Safefree(PL_curlocales[i]); + PL_curlocales[i] = savepv(new_locale); } recalc_LC_ALL = TRUE; @@ -862,7 +863,8 @@ S_update_PL_curlocales_i(pTHX_ else { /* Update the single category's record */ - save_to_buffer(new_locale, &PL_curlocales[index], &PL_curlocales_sizes[index]); + Safefree(PL_curlocales[index]); + PL_curlocales[index] = savepv(new_locale); if (recalc_LC_ALL == LOOPING) { recalc_LC_ALL = (index == NOMINAL_LC_ALL_INDEX - 1); @@ -870,7 +872,9 @@ S_update_PL_curlocales_i(pTHX_ } if (recalc_LC_ALL) { /* And recalculate LC_ALL */ - save_to_buffer(calculate_LC_ALL(PL_curlocales), &PL_curlocales[LC_ALL_INDEX_], &PL_curlocales_sizes[LC_ALL_INDEX_]); + Safefree(PL_curlocales[LC_ALL_INDEX_]); + PL_curlocales[LC_ALL_INDEX_] = + savepv(calculate_LC_ALL(PL_curlocales)); } return PL_curlocales[index]; @@ -993,6 +997,8 @@ S_setlocale_from_aggregate_LC_ALL(pTHX_ const char * locale, const line_t line) * as the value may omit categories whose locale is 'C'. khw thinks it's * better to store a complete LC_ALL. So calculate it. */ retval = savepv(calculate_LC_ALL(PL_curlocales)); + Safefree(PL_curlocales[LC_ALL_INDEX_]); + PL_curlocales[LC_ALL_INDEX_] = retval; Safefree(locale_on_entry); return retval; @@ -5266,8 +5272,7 @@ Perl_init_i18nl10n(pTHX_ int printwarn) /* Similarly, in this case we need to fill in our records. */ for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { - PL_curlocales_sizes[i] = 0; - save_to_buffer(curlocales[i], &PL_curlocales[i], &PL_curlocales_sizes[i]); + PL_curlocales[i] = savepv(curlocales[i]); } # endif diff --git a/sv.c b/sv.c index 0dbd97c8accb..1b8ffebdd042 100644 --- a/sv.c +++ b/sv.c @@ -15648,7 +15648,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, #ifdef USE_PL_CURLOCALES for (i = 0; i < (int) C_ARRAY_LENGTH(PL_curlocales); i++) { PL_curlocales[i] = SAVEPV(proto_perl->Icurlocales[i]); - PL_curlocales_sizes[i] = strlen(PL_curlocales[i]); } #endif #ifdef USE_LOCALE_CTYPE