3 * Copyright (c) 2007 Brandon L Black
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "Which order shall we go in?" said Frodo. "Eldest first, or quickest first?
12 * You'll be last either way, Master Peregrin."
18 These functions are related to the method resolution order of perl classes
27 Perl_mro_meta_init(pTHX_ HV* stash)
29 struct mro_meta* newmeta;
33 assert(!(HvAUX(stash)->xhv_mro_meta));
34 Newxz(newmeta, 1, struct mro_meta);
35 HvAUX(stash)->xhv_mro_meta = newmeta;
36 newmeta->cache_gen = 1;
42 #if defined(USE_ITHREADS)
44 /* for sv_dup on new threads */
46 Perl_mro_meta_dup(pTHX_ struct mro_meta* smeta, CLONE_PARAMS* param)
48 struct mro_meta* newmeta;
52 Newx(newmeta, 1, struct mro_meta);
53 Copy(smeta, newmeta, 1, struct mro_meta);
55 if (newmeta->mro_linear_dfs)
56 newmeta->mro_linear_dfs
57 = (AV*) SvREFCNT_inc(sv_dup((SV*)newmeta->mro_linear_dfs, param));
58 if (newmeta->mro_linear_c3)
59 newmeta->mro_linear_c3
60 = (AV*) SvREFCNT_inc(sv_dup((SV*)newmeta->mro_linear_c3, param));
61 if (newmeta->mro_nextmethod)
62 newmeta->mro_nextmethod
63 = (HV*) SvREFCNT_inc(sv_dup((SV*)newmeta->mro_nextmethod, param));
68 #endif /* USE_ITHREADS */
71 =for apidoc mro_get_linear_isa_dfs
73 Returns the Depth-First Search linearization of @ISA
74 the given stash. The return value is a read-only AV*.
75 C<level> should be 0 (it is used internally in this
76 function's recursion).
78 You are responsible for C<SvREFCNT_inc()> on the
79 return value if you plan to store it anywhere
80 semi-permanently (otherwise it might be deleted
81 out from under you the next time the cache is
87 Perl_mro_get_linear_isa_dfs(pTHX_ HV *stash, I32 level)
93 const char* stashname;
94 struct mro_meta* meta;
99 stashname = HvNAME_get(stash);
101 Perl_croak(aTHX_ "Can't linearize anonymous symbol table");
104 Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'",
107 meta = HvMROMETA(stash);
109 /* return cache if valid */
110 if((retval = meta->mro_linear_dfs)) {
114 /* not in cache, make a new one */
117 av_push(retval, newSVpv(stashname, 0)); /* add ourselves at the top */
120 gvp = (GV**)hv_fetchs(stash, "ISA", FALSE);
121 av = (gvp && (gv = *gvp) && isGV_with_GP(gv)) ? GvAV(gv) : NULL;
123 if(av && AvFILLp(av) >= 0) {
125 /* "stored" is used to keep track of all of the classnames
126 we have added to the MRO so far, so we can do a quick
127 exists check and avoid adding duplicate classnames to
130 HV* const stored = (HV*)sv_2mortal((SV*)newHV());
131 SV **svp = AvARRAY(av);
132 I32 items = AvFILLp(av) + 1;
136 SV* const sv = *svp++;
137 HV* const basestash = gv_stashsv(sv, 0);
142 /* if no stash exists for this @ISA member,
143 simply add it to the MRO and move on */
148 /* otherwise, recurse into ourselves for the MRO
149 of this @ISA member, and append their MRO to ours */
150 const AV *const subrv
151 = mro_get_linear_isa_dfs(basestash, level + 1);
153 subrv_p = AvARRAY(subrv);
154 subrv_items = AvFILLp(subrv) + 1;
156 while(subrv_items--) {
157 SV *const subsv = *subrv_p++;
158 if(!hv_exists_ent(stored, subsv, 0)) {
159 hv_store_ent(stored, subsv, &PL_sv_undef, 0);
160 av_push(retval, newSVsv(subsv));
166 /* we don't want anyone modifying the cache entry but us,
167 and we do so by replacing it completely */
168 SvREADONLY_on(retval);
170 meta->mro_linear_dfs = retval;
175 =for apidoc mro_get_linear_isa_c3
177 Returns the C3 linearization of @ISA
178 the given stash. The return value is a read-only AV*.
179 C<level> should be 0 (it is used internally in this
180 function's recursion).
182 You are responsible for C<SvREFCNT_inc()> on the
183 return value if you plan to store it anywhere
184 semi-permanently (otherwise it might be deleted
185 out from under you the next time the cache is
192 Perl_mro_get_linear_isa_c3(pTHX_ HV* stash, I32 level)
198 const char* stashname;
199 STRLEN stashname_len;
200 struct mro_meta* meta;
203 assert(HvAUX(stash));
205 stashname = HvNAME_get(stash);
206 stashname_len = HvNAMELEN_get(stash);
208 Perl_croak(aTHX_ "Can't linearize anonymous symbol table");
211 Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'",
214 meta = HvMROMETA(stash);
216 /* return cache if valid */
217 if((retval = meta->mro_linear_c3)) {
221 /* not in cache, make a new one */
223 gvp = (GV**)hv_fetchs(stash, "ISA", FALSE);
224 isa = (gvp && (gv = *gvp) && isGV_with_GP(gv)) ? GvAV(gv) : NULL;
226 /* For a better idea how the rest of this works, see the much clearer
227 pure perl version in Algorithm::C3 0.01:
228 http://search.cpan.org/src/STEVAN/Algorithm-C3-0.01/lib/Algorithm/C3.pm
229 (later versions go about it differently than this code for speed reasons)
232 if(isa && AvFILLp(isa) >= 0) {
235 HV* const tails = (HV*)sv_2mortal((SV*)newHV());
236 AV* const seqs = (AV*)sv_2mortal((SV*)newAV());
239 /* This builds @seqs, which is an array of arrays.
240 The members of @seqs are the MROs of
241 the members of @ISA, followed by @ISA itself.
243 I32 items = AvFILLp(isa) + 1;
244 SV** isa_ptr = AvARRAY(isa);
246 SV* const isa_item = *isa_ptr++;
247 HV* const isa_item_stash = gv_stashsv(isa_item, 0);
248 if(!isa_item_stash) {
249 /* if no stash, make a temporary fake MRO
250 containing just itself */
251 AV* const isa_lin = newAV();
252 av_push(isa_lin, newSVsv(isa_item));
253 av_push(seqs, (SV*)isa_lin);
257 AV* const isa_lin = mro_get_linear_isa_c3(isa_item_stash, level + 1);
258 av_push(seqs, SvREFCNT_inc_simple_NN((SV*)isa_lin));
261 av_push(seqs, SvREFCNT_inc_simple_NN((SV*)isa));
263 /* This builds "heads", which as an array of integer array
264 indices, one per seq, which point at the virtual "head"
265 of the seq (initially zero) */
266 Newxz(heads, AvFILLp(seqs)+1, I32);
268 /* This builds %tails, which has one key for every class
269 mentioned in the tail of any sequence in @seqs (tail meaning
270 everything after the first class, the "head"). The value
271 is how many times this key appears in the tails of @seqs.
273 seqs_ptr = AvARRAY(seqs);
274 seqs_items = AvFILLp(seqs) + 1;
275 while(seqs_items--) {
276 AV* const seq = (AV*)*seqs_ptr++;
277 I32 seq_items = AvFILLp(seq);
279 SV** seq_ptr = AvARRAY(seq) + 1;
281 SV* const seqitem = *seq_ptr++;
282 HE* const he = hv_fetch_ent(tails, seqitem, 0, 0);
284 hv_store_ent(tails, seqitem, newSViv(1), 0);
287 SV* const val = HeVAL(he);
294 /* Initialize retval to build the return value in */
296 av_push(retval, newSVpvn(stashname, stashname_len)); /* us first */
298 /* This loop won't terminate until we either finish building
299 the MRO, or get an exception. */
305 /* "foreach $seq (@seqs)" */
306 SV** const avptr = AvARRAY(seqs);
307 for(s = 0; s <= AvFILLp(seqs); s++) {
309 AV * const seq = (AV*)(avptr[s]);
311 if(!seq) continue; /* skip empty seqs */
312 svp = av_fetch(seq, heads[s], 0);
313 seqhead = *svp; /* seqhead = head of this seq */
317 /* if we haven't found a winner for this round yet,
318 and this seqhead is not in tails (or the count
319 for it in tails has dropped to zero), then this
320 seqhead is our new winner, and is added to the
321 final MRO immediately */
323 if((tail_entry = hv_fetch_ent(tails, cand, 0, 0))
324 && (val = HeVAL(tail_entry))
327 winner = newSVsv(cand);
328 av_push(retval, winner);
329 /* note however that even when we find a winner,
330 we continue looping over @seqs to do housekeeping */
332 if(!sv_cmp(seqhead, winner)) {
333 /* Once we have a winner (including the iteration
334 where we first found him), inc the head ptr
335 for any seq which had the winner as a head,
336 NULL out any seq which is now empty,
337 and adjust tails for consistency */
339 const int new_head = ++heads[s];
340 if(new_head > AvFILLp(seq)) {
341 SvREFCNT_dec(avptr[s]);
347 /* Because we know this new seqhead used to be
348 a tail, we can assume it is in tails and has
349 a positive value, which we need to dec */
350 svp = av_fetch(seq, new_head, 0);
352 tail_entry = hv_fetch_ent(tails, seqhead, 0, 0);
353 val = HeVAL(tail_entry);
359 /* if we found no candidates, we are done building the MRO.
360 !cand means no seqs have any entries left to check */
366 /* If we had candidates, but nobody won, then the @ISA
367 hierarchy is not C3-incompatible */
369 /* we have to do some cleanup before we croak */
371 SvREFCNT_dec(retval);
374 Perl_croak(aTHX_ "Inconsistent hierarchy during C3 merge of class '%s': "
375 "merging failed on parent '%"SVf"'", stashname, SVfARG(cand));
379 else { /* @ISA was undefined or empty */
380 /* build a retval containing only ourselves */
382 av_push(retval, newSVpvn(stashname, stashname_len));
385 /* we don't want anyone modifying the cache entry but us,
386 and we do so by replacing it completely */
387 SvREADONLY_on(retval);
389 meta->mro_linear_c3 = retval;
394 =for apidoc mro_get_linear_isa
396 Returns either C<mro_get_linear_isa_c3> or
397 C<mro_get_linear_isa_dfs> for the given stash,
398 dependant upon which MRO is in effect
399 for that stash. The return value is a
402 You are responsible for C<SvREFCNT_inc()> on the
403 return value if you plan to store it anywhere
404 semi-permanently (otherwise it might be deleted
405 out from under you the next time the cache is
411 Perl_mro_get_linear_isa(pTHX_ HV *stash)
413 struct mro_meta* meta;
417 Perl_croak(aTHX_ "Can't linearize anonymous symbol table");
419 meta = HvMROMETA(stash);
420 if(meta->mro_which == MRO_DFS) {
421 return mro_get_linear_isa_dfs(stash, 0);
422 } else if(meta->mro_which == MRO_C3) {
423 return mro_get_linear_isa_c3(stash, 0);
425 Perl_croak(aTHX_ "panic: invalid MRO!");
427 return NULL; /* NOT REACHED */
431 =for apidoc mro_isa_changed_in
433 Takes the necessary steps (cache invalidations, mostly)
434 when the @ISA of the given package has changed. Invoked
435 by the C<setisa> magic, should not need to invoke directly.
440 Perl_mro_isa_changed_in(pTHX_ HV* stash)
449 struct mro_meta * meta;
451 const char * const stashname = HvNAME_get(stash);
452 const STRLEN stashname_len = HvNAMELEN_get(stash);
455 Perl_croak(aTHX_ "Can't call mro_isa_changed_in() on anonymous symbol table");
457 /* wipe out the cached linearizations for this stash */
458 meta = HvMROMETA(stash);
459 SvREFCNT_dec((SV*)meta->mro_linear_dfs);
460 SvREFCNT_dec((SV*)meta->mro_linear_c3);
461 meta->mro_linear_dfs = NULL;
462 meta->mro_linear_c3 = NULL;
464 /* Inc the package generation, since our @ISA changed */
467 /* Wipe the global method cache if this package
468 is UNIVERSAL or one of its parents */
470 svp = hv_fetch(PL_isarev, stashname, stashname_len, 0);
471 isarev = svp ? (HV*)*svp : NULL;
473 if((stashname_len == 9 && strEQ(stashname, "UNIVERSAL"))
474 || (isarev && hv_exists(isarev, "UNIVERSAL", 9))) {
478 else { /* Wipe the local method cache otherwise */
480 is_universal = FALSE;
483 /* wipe next::method cache too */
484 if(meta->mro_nextmethod) hv_clear(meta->mro_nextmethod);
486 /* Iterate the isarev (classes that are our children),
487 wiping out their linearization and method caches */
490 while((iter = hv_iternext(isarev))) {
491 SV* const revkey = hv_iterkeysv(iter);
492 HV* revstash = gv_stashsv(revkey, 0);
493 struct mro_meta* revmeta;
495 if(!revstash) continue;
496 revmeta = HvMROMETA(revstash);
497 SvREFCNT_dec((SV*)revmeta->mro_linear_dfs);
498 SvREFCNT_dec((SV*)revmeta->mro_linear_c3);
499 revmeta->mro_linear_dfs = NULL;
500 revmeta->mro_linear_c3 = NULL;
502 revmeta->cache_gen++;
503 if(revmeta->mro_nextmethod)
504 hv_clear(revmeta->mro_nextmethod);
508 /* Now iterate our MRO (parents), and do a few things:
509 1) instantiate with the "fake" flag if they don't exist
510 2) flag them as universal if we are universal
511 3) Add everything from our isarev to their isarev
514 /* We're starting at the 2nd element, skipping ourselves here */
515 linear_mro = mro_get_linear_isa(stash);
516 svp = AvARRAY(linear_mro) + 1;
517 items = AvFILLp(linear_mro);
520 SV* const sv = *svp++;
523 HE *he = hv_fetch_ent(PL_isarev, sv, 0, 0);
525 he = hv_store_ent(PL_isarev, sv, (SV*)newHV(), 0);
527 mroisarev = (HV*)HeVAL(he);
529 /* This hash only ever contains PL_sv_yes. Storing it over itself is
530 almost as cheap as calling hv_exists, so on aggregate we expect to
531 save time by not making two calls to the common HV code for the
532 case where it doesn't exist. */
534 hv_store(mroisarev, stashname, stashname_len, &PL_sv_yes, 0);
538 while((iter = hv_iternext(isarev))) {
540 char* const revkey = hv_iterkey(iter, &revkeylen);
541 hv_store(mroisarev, revkey, revkeylen, &PL_sv_yes, 0);
548 =for apidoc mro_method_changed_in
550 Invalidates method caching on any child classes
551 of the given stash, so that they might notice
552 the changes in this one.
554 Ideally, all instances of C<PL_sub_generation++> in
555 perl source outside of C<mro.c> should be
556 replaced by calls to this.
558 Perl automatically handles most of the common
559 ways a method might be redefined. However, there
560 are a few ways you could change a method in a stash
561 without the cache code noticing, in which case you
562 need to call this method afterwards:
564 1) Directly manipulating the stash HV entries from
567 2) Assigning a reference to a readonly scalar
568 constant into a stash entry in order to create
569 a constant subroutine (like constant.pm
572 This same method is available from pure perl
573 via, C<mro::method_changed_in(classname)>.
578 Perl_mro_method_changed_in(pTHX_ HV *stash)
580 const char * const stashname = HvNAME_get(stash);
581 const STRLEN stashname_len = HvNAMELEN_get(stash);
583 SV ** const svp = hv_fetch(PL_isarev, stashname, stashname_len, 0);
584 HV * const isarev = svp ? (HV*)*svp : NULL;
587 Perl_croak(aTHX_ "Can't call mro_method_changed_in() on anonymous symbol table");
589 /* Inc the package generation, since a local method changed */
590 HvMROMETA(stash)->pkg_gen++;
592 /* If stash is UNIVERSAL, or one of UNIVERSAL's parents,
593 invalidate all method caches globally */
594 if((stashname_len == 9 && strEQ(stashname, "UNIVERSAL"))
595 || (isarev && hv_exists(isarev, "UNIVERSAL", 9))) {
600 /* else, invalidate the method caches of all child classes,
606 while((iter = hv_iternext(isarev))) {
607 SV* const revkey = hv_iterkeysv(iter);
608 HV* const revstash = gv_stashsv(revkey, 0);
609 struct mro_meta* mrometa;
611 if(!revstash) continue;
612 mrometa = HvMROMETA(revstash);
613 mrometa->cache_gen++;
614 if(mrometa->mro_nextmethod)
615 hv_clear(mrometa->mro_nextmethod);
620 /* These two are static helpers for next::method and friends,
621 and re-implement a bunch of the code from pp_caller() in
622 a more efficient manner for this particular usage.
626 __dopoptosub_at(const PERL_CONTEXT *cxstk, I32 startingblock) {
628 for (i = startingblock; i >= 0; i--) {
629 if(CxTYPE((PERL_CONTEXT*)(&cxstk[i])) == CXt_SUB) return i;
636 XS(XS_mro_get_linear_isa);
639 XS(XS_mro_get_isarev);
640 XS(XS_mro_is_universal);
641 XS(XS_mro_invalidate_method_caches);
642 XS(XS_mro_method_changed_in);
643 XS(XS_mro_get_pkg_gen);
647 Perl_boot_core_mro(pTHX)
650 static const char file[] = __FILE__;
652 newXSproto("mro::get_linear_isa", XS_mro_get_linear_isa, file, "$;$");
653 newXSproto("mro::set_mro", XS_mro_set_mro, file, "$$");
654 newXSproto("mro::get_mro", XS_mro_get_mro, file, "$");
655 newXSproto("mro::get_isarev", XS_mro_get_isarev, file, "$");
656 newXSproto("mro::is_universal", XS_mro_is_universal, file, "$");
657 newXSproto("mro::invalidate_all_method_caches", XS_mro_invalidate_method_caches, file, "");
658 newXSproto("mro::method_changed_in", XS_mro_method_changed_in, file, "$");
659 newXSproto("mro::get_pkg_gen", XS_mro_get_pkg_gen, file, "$");
660 newXS("mro::_nextcan", XS_mro_nextcan, file);
663 XS(XS_mro_get_linear_isa) {
672 if(items < 1 || items > 2)
673 Perl_croak(aTHX_ "Usage: mro::get_linear_isa(classname [, type ])");
676 class_stash = gv_stashsv(classname, 0);
679 /* No stash exists yet, give them just the classname */
680 AV* isalin = newAV();
681 av_push(isalin, newSVsv(classname));
682 ST(0) = sv_2mortal(newRV_noinc((SV*)isalin));
686 const char* const which = SvPV_nolen(ST(1));
687 if(strEQ(which, "dfs"))
688 RETVAL = mro_get_linear_isa_dfs(class_stash, 0);
689 else if(strEQ(which, "c3"))
690 RETVAL = mro_get_linear_isa_c3(class_stash, 0);
692 Perl_croak(aTHX_ "Invalid mro name: '%s'", which);
695 RETVAL = mro_get_linear_isa(class_stash);
698 ST(0) = newRV_inc((SV*)RETVAL);
711 struct mro_meta* meta;
716 Perl_croak(aTHX_ "Usage: mro::set_mro(classname, type)");
719 whichstr = SvPV_nolen(ST(1));
720 class_stash = gv_stashsv(classname, GV_ADD);
721 if(!class_stash) Perl_croak(aTHX_ "Cannot create class: '%"SVf"'!", SVfARG(classname));
722 meta = HvMROMETA(class_stash);
724 if(strEQ(whichstr, "dfs"))
726 else if(strEQ(whichstr, "c3"))
729 Perl_croak(aTHX_ "Invalid mro name: '%s'", whichstr);
731 if(meta->mro_which != which) {
732 meta->mro_which = which;
733 /* Only affects local method cache, not
734 even child classes */
736 if(meta->mro_nextmethod)
737 hv_clear(meta->mro_nextmethod);
754 Perl_croak(aTHX_ "Usage: mro::get_mro(classname)");
757 class_stash = gv_stashsv(classname, 0);
759 if(!class_stash || HvMROMETA(class_stash)->mro_which == MRO_DFS)
760 ST(0) = sv_2mortal(newSVpvn("dfs", 3));
762 ST(0) = sv_2mortal(newSVpvn("c3", 2));
767 XS(XS_mro_get_isarev)
775 STRLEN classname_len;
781 Perl_croak(aTHX_ "Usage: mro::get_isarev(classname)");
788 classname_pv = SvPV_nolen(classname);
789 classname_len = strlen(classname_pv);
790 svp = hv_fetch(PL_isarev, classname_pv, classname_len, 0);
791 isarev = svp ? (HV*)*svp : NULL;
797 while((iter = hv_iternext(isarev)))
798 av_push(ret_array, newSVsv(hv_iterkeysv(iter)));
800 XPUSHs(sv_2mortal(newRV_noinc((SV*)ret_array)));
806 XS(XS_mro_is_universal)
813 STRLEN classname_len;
819 Perl_croak(aTHX_ "Usage: mro::is_universal(classname)");
823 classname_pv = SvPV_nolen(classname);
824 classname_len = strlen(classname_pv);
826 svp = hv_fetch(PL_isarev, classname_pv, classname_len, 0);
827 isarev = svp ? (HV*)*svp : NULL;
829 if((classname_len == 9 && strEQ(classname_pv, "UNIVERSAL"))
830 || (isarev && hv_exists(isarev, "UNIVERSAL", 9)))
836 XS(XS_mro_invalidate_method_caches)
844 Perl_croak(aTHX_ "Usage: mro::invalidate_all_method_caches()");
851 XS(XS_mro_method_changed_in)
861 Perl_croak(aTHX_ "Usage: mro::method_changed_in(classname)");
865 class_stash = gv_stashsv(classname, 0);
866 if(!class_stash) Perl_croak(aTHX_ "No such class: '%"SVf"'!", SVfARG(classname));
868 mro_method_changed_in(class_stash);
873 XS(XS_mro_get_pkg_gen)
883 Perl_croak(aTHX_ "Usage: mro::get_pkg_gen(classname)");
887 class_stash = gv_stashsv(classname, 0);
891 XPUSHs(sv_2mortal(newSViv(
892 class_stash ? HvMROMETA(class_stash)->pkg_gen : 0
904 const I32 throw_nomethod = SvIVX(ST(1));
906 register const PERL_CONTEXT *ccstack = cxstack;
907 const PERL_SI *top_si = PL_curstackinfo;
910 const char *fq_subname;
912 STRLEN stashname_len;
920 struct mro_meta* selfmeta;
927 if(sv_isobject(self))
928 selfstash = SvSTASH(SvRV(self));
930 selfstash = gv_stashsv(self, 0);
934 hvname = HvNAME_get(selfstash);
936 Perl_croak(aTHX_ "Can't use anonymous symbol table for method lookup");
938 cxix = __dopoptosub_at(cxstack, cxstack_ix);
939 cxix = __dopoptosub_at(ccstack, cxix - 1); /* skip next::method, etc */
941 /* This block finds the contextually-enclosing fully-qualified subname,
942 much like looking at (caller($i))[3] until you find a real sub that
946 STRLEN fq_subname_len;
948 /* we may be in a higher stacklevel, so dig down deeper */
950 if(top_si->si_type == PERLSI_MAIN)
951 Perl_croak(aTHX_ "next::method/next::can/maybe::next::method must be used in method context");
952 top_si = top_si->si_prev;
953 ccstack = top_si->si_cxstack;
954 cxix = __dopoptosub_at(ccstack, top_si->si_cxix);
957 if(CxTYPE((PERL_CONTEXT*)(&ccstack[cxix])) != CXt_SUB
958 || (PL_DBsub && GvCV(PL_DBsub) && ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))) {
959 cxix = __dopoptosub_at(ccstack, cxix - 1);
964 const I32 dbcxix = __dopoptosub_at(ccstack, cxix - 1);
965 if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub)) {
966 if(CxTYPE((PERL_CONTEXT*)(&ccstack[dbcxix])) != CXt_SUB) {
973 cvgv = CvGV(ccstack[cxix].blk_sub.cv);
976 cxix = __dopoptosub_at(ccstack, cxix - 1);
980 /* we found a real sub here */
981 sv = sv_2mortal(newSV(0));
983 gv_efullname3(sv, cvgv, NULL);
985 fq_subname = SvPVX(sv);
986 fq_subname_len = SvCUR(sv);
988 subname = strrchr(fq_subname, ':');
990 Perl_croak(aTHX_ "next::method/next::can/maybe::next::method cannot find enclosing method");
993 subname_len = fq_subname_len - (subname - fq_subname);
994 if(subname_len == 8 && strEQ(subname, "__ANON__")) {
995 cxix = __dopoptosub_at(ccstack, cxix - 1);
1001 /* If we made it to here, we found our context */
1003 /* Initialize the next::method cache for this stash
1005 selfmeta = HvMROMETA(selfstash);
1006 if(!(nmcache = selfmeta->mro_nextmethod)) {
1007 nmcache = selfmeta->mro_nextmethod = newHV();
1009 else { /* Use the cached coderef if it exists */
1010 HE* cache_entry = hv_fetch_ent(nmcache, sv, 0, 0);
1012 SV* const val = HeVAL(cache_entry);
1013 if(val == &PL_sv_undef) {
1015 Perl_croak(aTHX_ "No next::method '%s' found for %s", subname, hvname);
1018 XPUSHs(sv_2mortal(newRV_inc(val)));
1023 /* beyond here is just for cache misses, so perf isn't as critical */
1025 stashname_len = subname - fq_subname - 2;
1026 stashname = sv_2mortal(newSVpvn(fq_subname, stashname_len));
1028 linear_av = mro_get_linear_isa_c3(selfstash, 0); /* has ourselves at the top of the list */
1030 linear_svp = AvARRAY(linear_av);
1031 entries = AvFILLp(linear_av) + 1;
1033 /* Walk down our MRO, skipping everything up
1034 to the contextually enclosing class */
1036 SV * const linear_sv = *linear_svp++;
1038 if(sv_eq(linear_sv, stashname))
1042 /* Now search the remainder of the MRO for the
1043 same method name as the contextually enclosing
1047 SV * const linear_sv = *linear_svp++;
1053 curstash = gv_stashsv(linear_sv, FALSE);
1056 if (ckWARN(WARN_SYNTAX))
1057 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Can't locate package %"SVf" for @%s::ISA",
1058 (void*)linear_sv, hvname);
1064 gvp = (GV**)hv_fetch(curstash, subname, subname_len, 0);
1070 if (SvTYPE(candidate) != SVt_PVGV)
1071 gv_init(candidate, curstash, subname, subname_len, TRUE);
1073 /* Notably, we only look for real entries, not method cache
1074 entries, because in C3 the method cache of a parent is not
1075 valid for the child */
1076 if (SvTYPE(candidate) == SVt_PVGV && (cand_cv = GvCV(candidate)) && !GvCVGEN(candidate)) {
1077 SvREFCNT_inc_simple_void_NN((SV*)cand_cv);
1078 hv_store_ent(nmcache, newSVsv(sv), (SV*)cand_cv, 0);
1079 XPUSHs(sv_2mortal(newRV_inc((SV*)cand_cv)));
1085 hv_store_ent(nmcache, newSVsv(sv), &PL_sv_undef, 0);
1087 Perl_croak(aTHX_ "No next::method '%s' found for %s", subname, hvname);
1093 * c-indentation-style: bsd
1095 * indent-tabs-mode: t
1098 * ex: set ts=8 sts=4 sw=4 noet: