This is a live mirror of the Perl 5 development currently hosted at
https://github.com/perl/perl5
https://perl5.git.perl.org
/
perl5.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use UTF8SKIP(), from Simon Cozens.
[perl5.git]
/
mg.c
diff --git
a/mg.c
b/mg.c
index
884e0fa
..
bec0a82
100644
(file)
--- a/
mg.c
+++ b/
mg.c
@@
-292,7
+292,8
@@
Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
if (isUPPER(mg->mg_type)) {
sv_magic(nsv,
for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
if (isUPPER(mg->mg_type)) {
sv_magic(nsv,
- mg->mg_type == 'P' ? SvTIED_obj(sv, mg) : mg->mg_obj,
+ mg->mg_type == 'P' ? SvTIED_obj(sv, mg) :
+ (mg->mg_type == 'D' && mg->mg_obj) ? sv : mg->mg_obj,
toLOWER(mg->mg_type), key, klen);
count++;
}
toLOWER(mg->mg_type), key, klen);
count++;
}
@@
-379,6
+380,15
@@
Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
return 0;
}
return 0;
}
+int
+Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
+{
+ dTHR;
+ Perl_croak(aTHX_ PL_no_modify);
+ /* NOT REACHED */
+ return 0;
+}
+
U32
Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
{
U32
Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
{
@@
-565,9
+575,7
@@
Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
if (PL_lex_state != LEX_NOTPARSING)
(void)SvOK_off(sv);
else if (PL_in_eval)
if (PL_lex_state != LEX_NOTPARSING)
(void)SvOK_off(sv);
else if (PL_in_eval)
- sv_setiv(sv, 1);
- else
- sv_setiv(sv, 0);
+ sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
}
break;
case '\024': /* ^T */
}
break;
case '\024': /* ^T */
@@
-906,7
+914,7
@@
Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
int
Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
{
int
Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
{
-#if defined(VMS)
+#if defined(VMS)
|| defined(EPOC)
Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
#else
# ifdef PERL_IMPLICIT_SYS
Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
#else
# ifdef PERL_IMPLICIT_SYS
@@
-1277,8
+1285,6
@@
Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
atoi(MgPV(mg,n_a)), FALSE);
if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp))))
o->op_private = i;
atoi(MgPV(mg,n_a)), FALSE);
if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp))))
o->op_private = i;
- else if (ckWARN_d(WARN_INTERNAL))
- Perl_warner(aTHX_ WARN_INTERNAL, "Can't break at that line\n");
return 0;
}
return 0;
}
@@
-1419,6
+1425,8
@@
Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
if (rem + offs > len)
rem = len - offs;
sv_setpvn(sv, tmps + offs, (STRLEN)rem);
if (rem + offs > len)
rem = len - offs;
sv_setpvn(sv, tmps + offs, (STRLEN)rem);
+ if (DO_UTF8(lsv))
+ SvUTF8_on(sv);
return 0;
}
return 0;
}
@@
-1740,18
+1748,21
@@
Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
PL_compiling.cop_warnings = pWARN_NONE;
break;
}
PL_compiling.cop_warnings = pWARN_NONE;
break;
}
- if (isWARN_on(sv, WARN_ALL) && !isWARNf_on(sv, WARN_ALL)) {
- PL_compiling.cop_warnings = pWARN_ALL;
- PL_dowarn |= G_WARN_ONCE ;
- }
- else {
+ {
STRLEN len, i;
int accumulate = 0 ;
STRLEN len, i;
int accumulate = 0 ;
+ int any_fatals = 0 ;
char * ptr = (char*)SvPV(sv, len) ;
char * ptr = (char*)SvPV(sv, len) ;
- for (i = 0 ; i < len ; ++i)
- accumulate += ptr[i] ;
+ for (i = 0 ; i < len ; ++i) {
+ accumulate |= ptr[i] ;
+ any_fatals |= (ptr[i] & 0xAA) ;
+ }
if (!accumulate)
PL_compiling.cop_warnings = pWARN_NONE;
if (!accumulate)
PL_compiling.cop_warnings = pWARN_NONE;
+ else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
+ PL_compiling.cop_warnings = pWARN_ALL;
+ PL_dowarn |= G_WARN_ONCE ;
+ }
else {
if (specialWARN(PL_compiling.cop_warnings))
PL_compiling.cop_warnings = newSVsv(sv) ;
else {
if (specialWARN(PL_compiling.cop_warnings))
PL_compiling.cop_warnings = newSVsv(sv) ;
@@
-1760,6
+1771,7
@@
Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
PL_dowarn |= G_WARN_ONCE ;
}
if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
PL_dowarn |= G_WARN_ONCE ;
}
+
}
}
}
}
}
}