summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>2000-07-04 16:28:40 +0000
committerGurusamy Sarathy <gsar@cpan.org>2000-07-04 16:28:40 +0000
commitc1899e02bd58ea340a8d89dc821ccba4502a63a7 (patch)
treee03a13cc8205f85fe3572f3ca8efb8b35b017c7d
parentf199104684ce3695f33e22530039c0b087f1a163 (diff)
downloadperl-c1899e02bd58ea340a8d89dc821ccba4502a63a7.tar.gz
better diagnostic on Frob->stuff() when Frob:: doesn't exist
(from Richard Soderberg <rs@oregonnet.com>) p4raw-id: //depot/perl@6306
-rw-r--r--pod/perldelta.pod10
-rw-r--r--pod/perldiag.pod6
-rw-r--r--pp_hot.c16
-rwxr-xr-xt/op/method.t15
4 files changed, 43 insertions, 4 deletions
diff --git a/pod/perldelta.pod b/pod/perldelta.pod
index ff4f91f89b..2a4ad88cbe 100644
--- a/pod/perldelta.pod
+++ b/pod/perldelta.pod
@@ -24,6 +24,16 @@ This document describes differences between the 5.6 release and this one.
=head1 New or Changed Diagnostics
+=over 4
+
+=item (perhaps you forgot to load "%s"?)
+
+(F) This is an educated guess made in conjunction with the message
+"Can't locate object method \"%s\" via package \"%s\"". It often means
+that a method requires a package that has not been loaded.
+
+=back
+
=head1 New tests
=head1 Incompatible Changes
diff --git a/pod/perldiag.pod b/pod/perldiag.pod
index 800ca4d102..c918d417b9 100644
--- a/pod/perldiag.pod
+++ b/pod/perldiag.pod
@@ -747,6 +747,12 @@ the file, say, by doing C<make install>.
functioning as a class, but that package doesn't define that particular
method, nor does any of its base classes. See L<perlobj>.
+=item (perhaps you forgot to load "%s"?)
+
+(F) This is an educated guess made in conjunction with the message
+"Can't locate object method \"%s\" via package \"%s\"". It often means
+that a method requires a package that has not been loaded.
+
=item Can't locate package %s for @%s::ISA
(W syntax) The @ISA array contained the name of another package that
diff --git a/pp_hot.c b/pp_hot.c
index b066b21832..2775003c8a 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -2884,6 +2884,7 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
char* leaf = name;
char* sep = Nullch;
char* p;
+ GV* gv;
for (p = name; *p; p++) {
if (*p == '\'')
@@ -2899,9 +2900,18 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
packname = name;
packlen = sep - name;
}
- Perl_croak(aTHX_
- "Can't locate object method \"%s\" via package \"%s\"",
- leaf, packname);
+ gv = gv_fetchpv(packname, 0, SVt_PVHV);
+ if (gv && isGV(gv)) {
+ Perl_croak(aTHX_
+ "Can't locate object method \"%s\" via package \"%s\"",
+ leaf, packname);
+ }
+ else {
+ Perl_croak(aTHX_
+ "Can't locate object method \"%s\" via package \"%s\"
+ " (perhaps you forgot to load \"%s\"?)",
+ leaf, packname, packname);
+ }
}
return isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv;
}
diff --git a/t/op/method.t b/t/op/method.t
index 1c6f3c5d9d..d2f1300690 100755
--- a/t/op/method.t
+++ b/t/op/method.t
@@ -4,7 +4,7 @@
# test method calls and autoloading.
#
-print "1..49\n";
+print "1..53\n";
@A::ISA = 'B';
@B::ISA = 'C';
@@ -167,3 +167,16 @@ test(defined(@{"unknown_package::ISA"}) ? "defined" : "undefined", "undefined");
test(do { eval 'A2::foo()'; $@ ? 1 : 0}, 1);
test(A2->foo(), "foo");
}
+
+{
+ test(do { use Config; eval 'Config->foo()';
+ $@ =~ /^\QCan't locate object method "foo" via package "Config" at/ ? 1 : $@}, 1);
+ test(do { use Config; eval '$d = bless {}, "Config"; $d->foo()';
+ $@ =~ /^\QCan't locate object method "foo" via package "Config" at/ ? 1 : $@}, 1);
+}
+
+test(do { eval 'E->foo()';
+ $@ =~ /^\QCan't locate object method "foo" via package "E" (perhaps / ? 1 : $@}, 1);
+test(do { eval '$e = bless {}, "E"; $e->foo()';
+ $@ =~ /^\QCan't locate object method "foo" via package "E" (perhaps / ? 1 : $@}, 1);
+