summaryrefslogtreecommitdiff
path: root/toke.c
diff options
context:
space:
mode:
authorDoug MacEachern <dougm@covalent.net>2000-06-27 07:17:28 -0700
committerJarkko Hietaniemi <jhi@iki.fi>2000-06-28 14:45:23 +0000
commitec6a9911b75518dd4c77eb4985d8bee0371df340 (patch)
tree40b57b6beb8216c3bb2f108a36e06b617dc80d00 /toke.c
parentcab27d238e930b8cddb5b1fb3260355f913b86a6 (diff)
downloadperl-ec6a9911b75518dd4c77eb4985d8bee0371df340.tar.gz
Re: [PATCH] support 'my __PACKAGE__ $obj = ...'
Message-ID: <Pine.LNX.4.10.10006271412340.7587-100000@mojo.covalent.net> p4raw-id: //depot/cfgperl@6250
Diffstat (limited to 'toke.c')
-rw-r--r--toke.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/toke.c b/toke.c
index 4c97aea114..4a54f72553 100644
--- a/toke.c
+++ b/toke.c
@@ -2006,6 +2006,29 @@ S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
return (sv_gets(sv, fp, append));
}
+STATIC HV *S_find_in_my_stash(pTHX_ char *pkgname, I32 len)
+{
+ GV *gv;
+
+ if (*pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
+ return PL_curstash;
+
+ if (len > 2 &&
+ (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
+ (gv = gv_fetchpv(pkgname, FALSE, SVt_PVHV))) {
+ return GvHV(gv); /* Foo:: */
+ }
+
+ /* use constant CLASS => 'MyClass' */
+ if ((gv = gv_fetchpv(pkgname, FALSE, SVt_PVCV))) {
+ SV *sv;
+ if (GvCV(gv) && (sv = cv_const_sv(GvCV(gv)))) {
+ pkgname = SvPV_nolen(sv);
+ }
+ }
+
+ return gv_stashpv(pkgname, FALSE);
+}
#ifdef DEBUGGING
static char* exp_name[] =
@@ -4410,7 +4433,7 @@ Perl_yylex(pTHX)
s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
goto really_sub;
- PL_in_my_stash = gv_stashpv(PL_tokenbuf, FALSE);
+ PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
if (!PL_in_my_stash) {
char tmpbuf[1024];
PL_bufptr = s;