summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>1999-07-04 20:03:21 +0000
committerGurusamy Sarathy <gsar@cpan.org>1999-07-04 20:03:21 +0000
commit7894fbab1e479c2ce906aed9132b15a68bfa5d73 (patch)
tree6fd92293c709a77203ac960ca694d1ffdb1f5c23
parent054b02d6604bb3beeebed2d8a040d025b131c9a6 (diff)
downloadperl-7894fbab1e479c2ce906aed9132b15a68bfa5d73.tar.gz
make overload, Data::Dumper, and dumpvar understand qr// stringify
overloading p4raw-id: //depot/perl@3570
-rw-r--r--ext/Data/Dumper/Dumper.pm18
-rw-r--r--ext/Data/Dumper/Dumper.xs42
-rw-r--r--lib/Dumpvalue.pm7
-rw-r--r--lib/dumpvar.pl7
-rw-r--r--lib/overload.pm2
-rw-r--r--pp_ctl.c2
6 files changed, 59 insertions, 19 deletions
diff --git a/ext/Data/Dumper/Dumper.pm b/ext/Data/Dumper/Dumper.pm
index d653af336b..3828d7b390 100644
--- a/ext/Data/Dumper/Dumper.pm
+++ b/ext/Data/Dumper/Dumper.pm
@@ -259,14 +259,22 @@ sub _dump {
}
}
+ if ($realpack) {
+ if ($realpack eq 'Regexp') {
+ $out = "$val";
+ $out =~ s,/,\\/,g;
+ return "qr/$out/";
+ }
+ else { # we have a blessed ref
+ $out = $s->{'bless'} . '( ';
+ $blesspad = $s->{apad};
+ $s->{apad} .= ' ' if ($s->{indent} >= 2);
+ }
+ }
+
$s->{level}++;
$ipad = $s->{xpad} x $s->{level};
- if ($realpack) { # we have a blessed ref
- $out = $s->{'bless'} . '( ';
- $blesspad = $s->{apad};
- $s->{apad} .= ' ' if ($s->{indent} >= 2);
- }
if ($realtype eq 'SCALAR') {
if ($realpack) {
diff --git a/ext/Data/Dumper/Dumper.xs b/ext/Data/Dumper/Dumper.xs
index e0ca4035d3..27d128b6ea 100644
--- a/ext/Data/Dumper/Dumper.xs
+++ b/ext/Data/Dumper/Dumper.xs
@@ -251,22 +251,40 @@ DD_dump(pTHX_ SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
SvREFCNT_dec(seenentry);
}
}
-
- (*levelp)++;
- ipad = sv_x(aTHX_ Nullsv, SvPVX(xpad), SvCUR(xpad), *levelp);
- if (realpack) { /* we have a blessed ref */
- STRLEN blesslen;
- char *blessstr = SvPV(bless, blesslen);
- sv_catpvn(retval, blessstr, blesslen);
- sv_catpvn(retval, "( ", 2);
- if (indent >= 2) {
- blesspad = apad;
- apad = newSVsv(apad);
- sv_x(aTHX_ apad, " ", 1, blesslen+2);
+ if (realpack) {
+ if (*realpack == 'R' && strEQ(realpack, "Regexp")) {
+ STRLEN rlen;
+ char *rval = SvPV(val, rlen);
+ char *slash = strchr(rval, '/');
+ sv_catpvn(retval, "qr/", 3);
+ while (slash) {
+ sv_catpvn(retval, rval, slash-rval);
+ sv_catpvn(retval, "\\/", 2);
+ rlen -= slash-rval+1;
+ rval = slash+1;
+ slash = strchr(rval, '/');
+ }
+ sv_catpvn(retval, rval, rlen);
+ sv_catpvn(retval, "/", 1);
+ return 1;
+ }
+ else { /* we have a blessed ref */
+ STRLEN blesslen;
+ char *blessstr = SvPV(bless, blesslen);
+ sv_catpvn(retval, blessstr, blesslen);
+ sv_catpvn(retval, "( ", 2);
+ if (indent >= 2) {
+ blesspad = apad;
+ apad = newSVsv(apad);
+ sv_x(aTHX_ apad, " ", 1, blesslen+2);
+ }
}
}
+ (*levelp)++;
+ ipad = sv_x(aTHX_ Nullsv, SvPVX(xpad), SvCUR(xpad), *levelp);
+
if (realtype <= SVt_PVBM) { /* scalar ref */
SV *namesv = newSVpvn("${", 2);
sv_catpvn(namesv, name, namelen);
diff --git a/lib/Dumpvalue.pm b/lib/Dumpvalue.pm
index 5bcd58f4fb..9c596ffc05 100644
--- a/lib/Dumpvalue.pm
+++ b/lib/Dumpvalue.pm
@@ -181,6 +181,13 @@ sub unwrap {
}
}
+ if (ref $v eq 'Regexp') {
+ my $re = "$v";
+ $re =~ s,/,\\/,g;
+ print "$sp-> qr/$re/\n";
+ return;
+ }
+
if ( UNIVERSAL::isa($v, 'HASH') ) {
my @sortKeys = sort keys(%$v) ;
my $more;
diff --git a/lib/dumpvar.pl b/lib/dumpvar.pl
index 32d4692d13..fb0bb2396f 100644
--- a/lib/dumpvar.pl
+++ b/lib/dumpvar.pl
@@ -143,6 +143,13 @@ sub unwrap {
}
}
+ if (ref $v eq 'Regexp') {
+ my $re = "$v";
+ $re =~ s,/,\\/,g;
+ print "$sp-> qr/$re/\n";
+ return;
+ }
+
if ( UNIVERSAL::isa($v, 'HASH') ) {
@sortKeys = sort keys(%$v) ;
undef $more ;
diff --git a/lib/overload.pm b/lib/overload.pm
index bcb56c3334..c46be839c3 100644
--- a/lib/overload.pm
+++ b/lib/overload.pm
@@ -87,7 +87,7 @@ sub AddrRef {
}
sub StrVal {
- (OverloadedStringify($_[0])) ?
+ (OverloadedStringify($_[0]) or ref($_[0]) eq 'Regexp') ?
(AddrRef(shift)) :
"$_[0]";
}
diff --git a/pp_ctl.c b/pp_ctl.c
index 9b5c93247e..64e695bc2e 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2817,7 +2817,7 @@ S_doopen_pmc(pTHX_ const char *name, const char *mode)
STRLEN namelen = strlen(name);
PerlIO *fp;
- if (namelen > 3 && strcmp(name + namelen - 3, ".pm") == 0) {
+ if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
SV *pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
char *pmc = SvPV_nolen(pmcsv);
Stat_t pmstat;