#ifdef USE_ITHREADS
char * cop_stashpv; /* package line was compiled in */
char * cop_file; /* file name the following line # is from */
- U32 cop_stashflags; /* currently only SVf_UTF8 */
+ I32 cop_stashlen; /* negative for UTF8 */
#else
HV * cop_stash; /* package line was compiled in */
GV * cop_filegv; /* file the following line # is from */
# define CopSTASHPV(c) ((c)->cop_stashpv)
# ifdef NETWARE
-# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : NULL))
+# define CopSTASHPV_set(c,pv,n) ((c)->cop_stashpv = \
+ ((pv) ? savepvn(pv,n) : NULL))
# else
-# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = savesharedpv(pv))
+# define CopSTASHPV_set(c,pv,n) ((c)->cop_stashpv = (pv) \
+ ? savesharedpvn(pv,n) : NULL)
# endif
-# define CopSTASH_flags(c) ((c)->cop_stashflags)
-# define CopSTASH_flags_set(c,flags) ((c)->cop_stashflags = flags)
+# define CopSTASH_len_set(c,n) ((c)->cop_stashlen = (n))
+# define CopSTASH_len(c) ((c)->cop_stashlen)
# define CopSTASH(c) (CopSTASHPV(c) \
- ? gv_stashpv(CopSTASHPV(c), \
- GV_ADD|(CopSTASH_flags(c) \
- ? CopSTASH_flags(c): 0 )) \
+ ? gv_stashpvn(CopSTASHPV(c), \
+ CopSTASH_len(c) < 0 \
+ ? -CopSTASH_len(c) \
+ : CopSTASH_len(c), \
+ GV_ADD|SVf_UTF8*(CopSTASH_len(c) < 0) \
+ ) \
: NULL)
-# define CopSTASH_set(c,hv) (CopSTASHPV_set(c, (hv) ? HvNAME_get(hv) : NULL), \
- CopSTASH_flags_set(c, \
- ((hv) && HvNAME_HEK(hv) && \
- HvNAMEUTF8(hv)) \
- ? SVf_UTF8 \
- : 0))
+# define CopSTASH_set(c,hv) (CopSTASHPV_set(c, \
+ (hv) ? HvNAME_get(hv) : NULL, \
+ (hv) ? HvNAMELEN(hv) : 0), \
+ CopSTASH_len_set(c, \
+ (hv) ? HvNAMEUTF8(hv) \
+ ? -HvNAMELEN(hv) \
+ : HvNAMELEN(hv) \
+ : 0))
# define CopSTASH_eq(c,hv) ((hv) && stashpv_hvname_match(c,hv))
# ifdef NETWARE
# define CopSTASH_free(c) SAVECOPSTASH_FREE(c)
Apda |char* |savepv |NULLOK const char* pv
Apda |char* |savepvn |NULLOK const char* pv|I32 len
Apda |char* |savesharedpv |NULLOK const char* pv
-Apda |char* |savesharedpvn |NN const char *const pv|const STRLEN len
+
+: NULLOK only to suppress a compiler warning
+Apda |char* |savesharedpvn |NULLOK const char *const pv \
+ |const STRLEN len
Apda |char* |savesharedsvpv |NN SV *sv
Apda |char* |savesvpv |NN SV* sv
Ap |void |savestack_grow
sv_magic(MUTABLE_SV(superisa), MUTABLE_SV(gv), PERL_MAGIC_isa, NULL, 0);
#ifdef USE_ITHREADS
av_push(superisa, newSVpvn_flags(CopSTASHPV(PL_curcop),
- strlen(CopSTASHPV(PL_curcop)),
- CopSTASH_flags(PL_curcop)
+ CopSTASH_len(PL_curcop) < 0
+ ? -CopSTASH_len(PL_curcop)
+ : CopSTASH_len(PL_curcop),
+ SVf_UTF8*(CopSTASH_len(PL_curcop) < 0)
));
#else
av_push(superisa, newSVhek(CopSTASH(PL_curcop)
firstcop->cop_line = secondcop->cop_line;
#ifdef USE_ITHREADS
firstcop->cop_stashpv = secondcop->cop_stashpv;
+ firstcop->cop_stashlen = secondcop->cop_stashlen;
firstcop->cop_file = secondcop->cop_file;
#else
firstcop->cop_stash = secondcop->cop_stash;
PERL_CALLCONV char* Perl_savesharedpvn(pTHX_ const char *const pv, const STRLEN len)
__attribute__malloc__
- __attribute__warn_unused_result__
- __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_SAVESHAREDPVN \
- assert(pv)
+ __attribute__warn_unused_result__;
PERL_CALLCONV char* Perl_savesharedsvpv(pTHX_ SV *sv)
__attribute__malloc__
#define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER)
#ifdef USE_ITHREADS
-# define SAVECOPSTASH(c) SAVEPPTR(CopSTASHPV(c))
+# define SAVECOPSTASH(c) (SAVEPPTR(CopSTASHPV(c)), \
+ SAVEI32(CopSTASH_len(c)))
# define SAVECOPSTASH_FREE(c) SAVESHAREDPV(CopSTASHPV(c))
# define SAVECOPFILE(c) SAVEPPTR(CopFILE(c))
# define SAVECOPFILE_FREE(c) SAVESHAREDPV(CopFILE(c))
use strict;
eval 'package Foo; @bar = 1' or die;
EXPECT
+########
+# [perl #112316] strict vars getting confused by nulls
+# Assigning from within a package whose name contains a null
+BEGIN { *Foo:: = *{"foo\0bar::"} }
+package Foo;
+*foo::bar = [];
+use strict;
+eval 'package foo; @bar = 1' or die;
+EXPECT
{
char *const newaddr = (char*)PerlMemShared_malloc(len + 1);
- PERL_ARGS_ASSERT_SAVESHAREDPVN;
+ /* PERL_ARGS_ASSERT_SAVESHAREDPVN; */
if (!newaddr) {
return write_no_mem();
{
const char * stashpv = CopSTASHPV(c);
const char * name = HvNAME_get(hv);
+ const bool utf8 = CopSTASH_len(c) < 0;
+ const I32 len = utf8 ? -CopSTASH_len(c) : CopSTASH_len(c);
PERL_UNUSED_CONTEXT;
PERL_ARGS_ASSERT_STASHPV_HVNAME_MATCH;
if (!stashpv || !name)
return stashpv == name;
- if ( HvNAMEUTF8(hv) && !(CopSTASH_flags(c) & SVf_UTF8 ? 1 : 0) ) {
- if (CopSTASH_flags(c) & SVf_UTF8) {
+ if ( HvNAMEUTF8(hv) && !utf8 ) {
+ if (utf8) {
return (bytes_cmp_utf8(
- (const U8*)stashpv, strlen(stashpv),
+ (const U8*)stashpv, len,
(const U8*)name, HEK_LEN(HvNAME_HEK(hv))) == 0);
} else {
return (bytes_cmp_utf8(
(const U8*)name, HEK_LEN(HvNAME_HEK(hv)),
- (const U8*)stashpv, strlen(stashpv)) == 0);
+ (const U8*)stashpv, len) == 0);
}
}
else
return (stashpv == name
- || ((STRLEN)HEK_LEN(HvNAME_HEK(hv)) == strlen(stashpv)
+ || (HEK_LEN(HvNAME_HEK(hv)) == len
&& strEQ(stashpv, name)));
/*NOTREACHED*/
return FALSE;