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 */
116 retval = (AV*)sv_2mortal((SV *)newAV());
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 The recursive call could throw an exception, which
151 has memory management implications here, hence the use of
153 const AV *const subrv
154 = mro_get_linear_isa_dfs(basestash, level + 1);
156 subrv_p = AvARRAY(subrv);
157 subrv_items = AvFILLp(subrv) + 1;
159 while(subrv_items--) {
160 SV *const subsv = *subrv_p++;
161 if(!hv_exists_ent(stored, subsv, 0)) {
162 hv_store_ent(stored, subsv, &PL_sv_undef, 0);
163 av_push(retval, newSVsv(subsv));
169 /* now that we're past the exception dangers, grab our own reference to
170 the AV we're about to use for the result. The reference owned by the
171 mortals' stack will be released soon, so everything will balance. */
172 SvREFCNT_inc_simple_void_NN(retval);
175 /* we don't want anyone modifying the cache entry but us,
176 and we do so by replacing it completely */
177 SvREADONLY_on(retval);
179 meta->mro_linear_dfs = retval;
184 =for apidoc mro_get_linear_isa_c3
186 Returns the C3 linearization of @ISA
187 the given stash. The return value is a read-only AV*.
188 C<level> should be 0 (it is used internally in this
189 function's recursion).
191 You are responsible for C<SvREFCNT_inc()> on the
192 return value if you plan to store it anywhere
193 semi-permanently (otherwise it might be deleted
194 out from under you the next time the cache is
201 Perl_mro_get_linear_isa_c3(pTHX_ HV* stash, I32 level)
207 const char* stashname;
208 STRLEN stashname_len;
209 struct mro_meta* meta;
212 assert(HvAUX(stash));
214 stashname = HvNAME_get(stash);
215 stashname_len = HvNAMELEN_get(stash);
217 Perl_croak(aTHX_ "Can't linearize anonymous symbol table");
220 Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'",
223 meta = HvMROMETA(stash);
225 /* return cache if valid */
226 if((retval = meta->mro_linear_c3)) {
230 /* not in cache, make a new one */
232 gvp = (GV**)hv_fetchs(stash, "ISA", FALSE);
233 isa = (gvp && (gv = *gvp) && isGV_with_GP(gv)) ? GvAV(gv) : NULL;
235 /* For a better idea how the rest of this works, see the much clearer
236 pure perl version in Algorithm::C3 0.01:
237 http://search.cpan.org/src/STEVAN/Algorithm-C3-0.01/lib/Algorithm/C3.pm
238 (later versions go about it differently than this code for speed reasons)
241 if(isa && AvFILLp(isa) >= 0) {
244 HV* const tails = (HV*)sv_2mortal((SV*)newHV());
245 AV* const seqs = (AV*)sv_2mortal((SV*)newAV());
248 /* This builds @seqs, which is an array of arrays.
249 The members of @seqs are the MROs of
250 the members of @ISA, followed by @ISA itself.
252 I32 items = AvFILLp(isa) + 1;
253 SV** isa_ptr = AvARRAY(isa);
255 SV* const isa_item = *isa_ptr++;
256 HV* const isa_item_stash = gv_stashsv(isa_item, 0);
257 if(!isa_item_stash) {
258 /* if no stash, make a temporary fake MRO
259 containing just itself */
260 AV* const isa_lin = newAV();
261 av_push(isa_lin, newSVsv(isa_item));
262 av_push(seqs, (SV*)isa_lin);
266 AV* const isa_lin = mro_get_linear_isa_c3(isa_item_stash, level + 1);
267 av_push(seqs, SvREFCNT_inc_simple_NN((SV*)isa_lin));
270 av_push(seqs, SvREFCNT_inc_simple_NN((SV*)isa));
272 /* This builds "heads", which as an array of integer array
273 indices, one per seq, which point at the virtual "head"
274 of the seq (initially zero) */
275 Newxz(heads, AvFILLp(seqs)+1, I32);
277 /* This builds %tails, which has one key for every class
278 mentioned in the tail of any sequence in @seqs (tail meaning
279 everything after the first class, the "head"). The value
280 is how many times this key appears in the tails of @seqs.
282 seqs_ptr = AvARRAY(seqs);
283 seqs_items = AvFILLp(seqs) + 1;
284 while(seqs_items--) {
285 AV* const seq = (AV*)*seqs_ptr++;
286 I32 seq_items = AvFILLp(seq);
288 SV** seq_ptr = AvARRAY(seq) + 1;
290 SV* const seqitem = *seq_ptr++;
291 HE* const he = hv_fetch_ent(tails, seqitem, 0, 0);
293 hv_store_ent(tails, seqitem, newSViv(1), 0);
296 SV* const val = HeVAL(he);
303 /* Initialize retval to build the return value in */
305 av_push(retval, newSVpvn(stashname, stashname_len)); /* us first */
307 /* This loop won't terminate until we either finish building
308 the MRO, or get an exception. */
314 /* "foreach $seq (@seqs)" */
315 SV** const avptr = AvARRAY(seqs);
316 for(s = 0; s <= AvFILLp(seqs); s++) {
318 AV * const seq = (AV*)(avptr[s]);
320 if(!seq) continue; /* skip empty seqs */
321 svp = av_fetch(seq, heads[s], 0);
322 seqhead = *svp; /* seqhead = head of this seq */
326 /* if we haven't found a winner for this round yet,
327 and this seqhead is not in tails (or the count
328 for it in tails has dropped to zero), then this
329 seqhead is our new winner, and is added to the
330 final MRO immediately */
332 if((tail_entry = hv_fetch_ent(tails, cand, 0, 0))
333 && (val = HeVAL(tail_entry))
336 winner = newSVsv(cand);
337 av_push(retval, winner);
338 /* note however that even when we find a winner,
339 we continue looping over @seqs to do housekeeping */
341 if(!sv_cmp(seqhead, winner)) {
342 /* Once we have a winner (including the iteration
343 where we first found him), inc the head ptr
344 for any seq which had the winner as a head,
345 NULL out any seq which is now empty,
346 and adjust tails for consistency */
348 const int new_head = ++heads[s];
349 if(new_head > AvFILLp(seq)) {
350 SvREFCNT_dec(avptr[s]);
356 /* Because we know this new seqhead used to be
357 a tail, we can assume it is in tails and has
358 a positive value, which we need to dec */
359 svp = av_fetch(seq, new_head, 0);
361 tail_entry = hv_fetch_ent(tails, seqhead, 0, 0);
362 val = HeVAL(tail_entry);
368 /* if we found no candidates, we are done building the MRO.
369 !cand means no seqs have any entries left to check */
375 /* If we had candidates, but nobody won, then the @ISA
376 hierarchy is not C3-incompatible */
378 /* we have to do some cleanup before we croak */
380 SvREFCNT_dec(retval);
383 Perl_croak(aTHX_ "Inconsistent hierarchy during C3 merge of class '%s': "
384 "merging failed on parent '%"SVf"'", stashname, SVfARG(cand));
388 else { /* @ISA was undefined or empty */
389 /* build a retval containing only ourselves */
391 av_push(retval, newSVpvn(stashname, stashname_len));
394 /* we don't want anyone modifying the cache entry but us,
395 and we do so by replacing it completely */
396 SvREADONLY_on(retval);
398 meta->mro_linear_c3 = retval;
403 =for apidoc mro_get_linear_isa
405 Returns either C<mro_get_linear_isa_c3> or
406 C<mro_get_linear_isa_dfs> for the given stash,
407 dependant upon which MRO is in effect
408 for that stash. The return value is a
411 You are responsible for C<SvREFCNT_inc()> on the
412 return value if you plan to store it anywhere
413 semi-permanently (otherwise it might be deleted
414 out from under you the next time the cache is
420 Perl_mro_get_linear_isa(pTHX_ HV *stash)
422 struct mro_meta* meta;
426 Perl_croak(aTHX_ "Can't linearize anonymous symbol table");
428 meta = HvMROMETA(stash);
429 if(meta->mro_which == MRO_DFS) {
430 return mro_get_linear_isa_dfs(stash, 0);
431 } else if(meta->mro_which == MRO_C3) {
432 return mro_get_linear_isa_c3(stash, 0);
434 Perl_croak(aTHX_ "panic: invalid MRO!");
436 return NULL; /* NOT REACHED */
440 =for apidoc mro_isa_changed_in
442 Takes the necessary steps (cache invalidations, mostly)
443 when the @ISA of the given package has changed. Invoked
444 by the C<setisa> magic, should not need to invoke directly.
449 Perl_mro_isa_changed_in(pTHX_ HV* stash)
458 struct mro_meta * meta;
460 const char * const stashname = HvNAME_get(stash);
461 const STRLEN stashname_len = HvNAMELEN_get(stash);
464 Perl_croak(aTHX_ "Can't call mro_isa_changed_in() on anonymous symbol table");
466 /* wipe out the cached linearizations for this stash */
467 meta = HvMROMETA(stash);
468 SvREFCNT_dec((SV*)meta->mro_linear_dfs);
469 SvREFCNT_dec((SV*)meta->mro_linear_c3);
470 meta->mro_linear_dfs = NULL;
471 meta->mro_linear_c3 = NULL;
473 /* Inc the package generation, since our @ISA changed */
476 /* Wipe the global method cache if this package
477 is UNIVERSAL or one of its parents */
479 svp = hv_fetch(PL_isarev, stashname, stashname_len, 0);
480 isarev = svp ? (HV*)*svp : NULL;
482 if((stashname_len == 9 && strEQ(stashname, "UNIVERSAL"))
483 || (isarev && hv_exists(isarev, "UNIVERSAL", 9))) {
487 else { /* Wipe the local method cache otherwise */
489 is_universal = FALSE;
492 /* wipe next::method cache too */
493 if(meta->mro_nextmethod) hv_clear(meta->mro_nextmethod);
495 /* Iterate the isarev (classes that are our children),
496 wiping out their linearization and method caches */
499 while((iter = hv_iternext(isarev))) {
500 SV* const revkey = hv_iterkeysv(iter);
501 HV* revstash = gv_stashsv(revkey, 0);
502 struct mro_meta* revmeta;
504 if(!revstash) continue;
505 revmeta = HvMROMETA(revstash);
506 SvREFCNT_dec((SV*)revmeta->mro_linear_dfs);
507 SvREFCNT_dec((SV*)revmeta->mro_linear_c3);
508 revmeta->mro_linear_dfs = NULL;
509 revmeta->mro_linear_c3 = NULL;
511 revmeta->cache_gen++;
512 if(revmeta->mro_nextmethod)
513 hv_clear(revmeta->mro_nextmethod);
517 /* Now iterate our MRO (parents), and do a few things:
518 1) instantiate with the "fake" flag if they don't exist
519 2) flag them as universal if we are universal
520 3) Add everything from our isarev to their isarev
523 /* We're starting at the 2nd element, skipping ourselves here */
524 linear_mro = mro_get_linear_isa(stash);
525 svp = AvARRAY(linear_mro) + 1;
526 items = AvFILLp(linear_mro);
529 SV* const sv = *svp++;
532 HE *he = hv_fetch_ent(PL_isarev, sv, 0, 0);
534 he = hv_store_ent(PL_isarev, sv, (SV*)newHV(), 0);
536 mroisarev = (HV*)HeVAL(he);
538 /* This hash only ever contains PL_sv_yes. Storing it over itself is
539 almost as cheap as calling hv_exists, so on aggregate we expect to
540 save time by not making two calls to the common HV code for the
541 case where it doesn't exist. */
543 hv_store(mroisarev, stashname, stashname_len, &PL_sv_yes, 0);
547 while((iter = hv_iternext(isarev))) {
549 char* const revkey = hv_iterkey(iter, &revkeylen);
550 hv_store(mroisarev, revkey, revkeylen, &PL_sv_yes, 0);
557 =for apidoc mro_method_changed_in
559 Invalidates method caching on any child classes
560 of the given stash, so that they might notice
561 the changes in this one.
563 Ideally, all instances of C<PL_sub_generation++> in
564 perl source outside of C<mro.c> should be
565 replaced by calls to this.
567 Perl automatically handles most of the common
568 ways a method might be redefined. However, there
569 are a few ways you could change a method in a stash
570 without the cache code noticing, in which case you
571 need to call this method afterwards:
573 1) Directly manipulating the stash HV entries from
576 2) Assigning a reference to a readonly scalar
577 constant into a stash entry in order to create
578 a constant subroutine (like constant.pm
581 This same method is available from pure perl
582 via, C<mro::method_changed_in(classname)>.
587 Perl_mro_method_changed_in(pTHX_ HV *stash)
589 const char * const stashname = HvNAME_get(stash);
590 const STRLEN stashname_len = HvNAMELEN_get(stash);
592 SV ** const svp = hv_fetch(PL_isarev, stashname, stashname_len, 0);
593 HV * const isarev = svp ? (HV*)*svp : NULL;
596 Perl_croak(aTHX_ "Can't call mro_method_changed_in() on anonymous symbol table");
598 /* Inc the package generation, since a local method changed */
599 HvMROMETA(stash)->pkg_gen++;
601 /* If stash is UNIVERSAL, or one of UNIVERSAL's parents,
602 invalidate all method caches globally */
603 if((stashname_len == 9 && strEQ(stashname, "UNIVERSAL"))
604 || (isarev && hv_exists(isarev, "UNIVERSAL", 9))) {
609 /* else, invalidate the method caches of all child classes,
615 while((iter = hv_iternext(isarev))) {
616 SV* const revkey = hv_iterkeysv(iter);
617 HV* const revstash = gv_stashsv(revkey, 0);
618 struct mro_meta* mrometa;
620 if(!revstash) continue;
621 mrometa = HvMROMETA(revstash);
622 mrometa->cache_gen++;
623 if(mrometa->mro_nextmethod)
624 hv_clear(mrometa->mro_nextmethod);
629 /* These two are static helpers for next::method and friends,
630 and re-implement a bunch of the code from pp_caller() in
631 a more efficient manner for this particular usage.
635 __dopoptosub_at(const PERL_CONTEXT *cxstk, I32 startingblock) {
637 for (i = startingblock; i >= 0; i--) {
638 if(CxTYPE((PERL_CONTEXT*)(&cxstk[i])) == CXt_SUB) return i;
645 XS(XS_mro_get_linear_isa);
648 XS(XS_mro_get_isarev);
649 XS(XS_mro_is_universal);
650 XS(XS_mro_invalidate_method_caches);
651 XS(XS_mro_method_changed_in);
652 XS(XS_mro_get_pkg_gen);
656 Perl_boot_core_mro(pTHX)
659 static const char file[] = __FILE__;
661 newXSproto("mro::get_linear_isa", XS_mro_get_linear_isa, file, "$;$");
662 newXSproto("mro::set_mro", XS_mro_set_mro, file, "$$");
663 newXSproto("mro::get_mro", XS_mro_get_mro, file, "$");
664 newXSproto("mro::get_isarev", XS_mro_get_isarev, file, "$");
665 newXSproto("mro::is_universal", XS_mro_is_universal, file, "$");
666 newXSproto("mro::invalidate_all_method_caches", XS_mro_invalidate_method_caches, file, "");
667 newXSproto("mro::method_changed_in", XS_mro_method_changed_in, file, "$");
668 newXSproto("mro::get_pkg_gen", XS_mro_get_pkg_gen, file, "$");
669 newXS("mro::_nextcan", XS_mro_nextcan, file);
672 XS(XS_mro_get_linear_isa) {
681 if(items < 1 || items > 2)
682 Perl_croak(aTHX_ "Usage: mro::get_linear_isa(classname [, type ])");
685 class_stash = gv_stashsv(classname, 0);
688 /* No stash exists yet, give them just the classname */
689 AV* isalin = newAV();
690 av_push(isalin, newSVsv(classname));
691 ST(0) = sv_2mortal(newRV_noinc((SV*)isalin));
695 const char* const which = SvPV_nolen(ST(1));
696 if(strEQ(which, "dfs"))
697 RETVAL = mro_get_linear_isa_dfs(class_stash, 0);
698 else if(strEQ(which, "c3"))
699 RETVAL = mro_get_linear_isa_c3(class_stash, 0);
701 Perl_croak(aTHX_ "Invalid mro name: '%s'", which);
704 RETVAL = mro_get_linear_isa(class_stash);
707 ST(0) = newRV_inc((SV*)RETVAL);
720 struct mro_meta* meta;
725 Perl_croak(aTHX_ "Usage: mro::set_mro(classname, type)");
728 whichstr = SvPV_nolen(ST(1));
729 class_stash = gv_stashsv(classname, GV_ADD);
730 if(!class_stash) Perl_croak(aTHX_ "Cannot create class: '%"SVf"'!", SVfARG(classname));
731 meta = HvMROMETA(class_stash);
733 if(strEQ(whichstr, "dfs"))
735 else if(strEQ(whichstr, "c3"))
738 Perl_croak(aTHX_ "Invalid mro name: '%s'", whichstr);
740 if(meta->mro_which != which) {
741 meta->mro_which = which;
742 /* Only affects local method cache, not
743 even child classes */
745 if(meta->mro_nextmethod)
746 hv_clear(meta->mro_nextmethod);
763 Perl_croak(aTHX_ "Usage: mro::get_mro(classname)");
766 class_stash = gv_stashsv(classname, 0);
768 if(!class_stash || HvMROMETA(class_stash)->mro_which == MRO_DFS)
769 ST(0) = sv_2mortal(newSVpvn("dfs", 3));
771 ST(0) = sv_2mortal(newSVpvn("c3", 2));
776 XS(XS_mro_get_isarev)
784 STRLEN classname_len;
790 Perl_croak(aTHX_ "Usage: mro::get_isarev(classname)");
797 classname_pv = SvPV_nolen(classname);
798 classname_len = strlen(classname_pv);
799 svp = hv_fetch(PL_isarev, classname_pv, classname_len, 0);
800 isarev = svp ? (HV*)*svp : NULL;
806 while((iter = hv_iternext(isarev)))
807 av_push(ret_array, newSVsv(hv_iterkeysv(iter)));
809 XPUSHs(sv_2mortal(newRV_noinc((SV*)ret_array)));
815 XS(XS_mro_is_universal)
822 STRLEN classname_len;
828 Perl_croak(aTHX_ "Usage: mro::is_universal(classname)");
832 classname_pv = SvPV_nolen(classname);
833 classname_len = strlen(classname_pv);
835 svp = hv_fetch(PL_isarev, classname_pv, classname_len, 0);
836 isarev = svp ? (HV*)*svp : NULL;
838 if((classname_len == 9 && strEQ(classname_pv, "UNIVERSAL"))
839 || (isarev && hv_exists(isarev, "UNIVERSAL", 9)))
845 XS(XS_mro_invalidate_method_caches)
853 Perl_croak(aTHX_ "Usage: mro::invalidate_all_method_caches()");
860 XS(XS_mro_method_changed_in)
870 Perl_croak(aTHX_ "Usage: mro::method_changed_in(classname)");
874 class_stash = gv_stashsv(classname, 0);
875 if(!class_stash) Perl_croak(aTHX_ "No such class: '%"SVf"'!", SVfARG(classname));
877 mro_method_changed_in(class_stash);
882 XS(XS_mro_get_pkg_gen)
892 Perl_croak(aTHX_ "Usage: mro::get_pkg_gen(classname)");
896 class_stash = gv_stashsv(classname, 0);
900 XPUSHs(sv_2mortal(newSViv(
901 class_stash ? HvMROMETA(class_stash)->pkg_gen : 0
913 const I32 throw_nomethod = SvIVX(ST(1));
914 register I32 cxix = cxstack_ix;
915 register const PERL_CONTEXT *ccstack = cxstack;
916 const PERL_SI *top_si = PL_curstackinfo;
919 const char *fq_subname;
921 STRLEN stashname_len;
929 struct mro_meta* selfmeta;
937 if(sv_isobject(self))
938 selfstash = SvSTASH(SvRV(self));
940 selfstash = gv_stashsv(self, 0);
944 hvname = HvNAME_get(selfstash);
946 Perl_croak(aTHX_ "Can't use anonymous symbol table for method lookup");
948 /* This block finds the contextually-enclosing fully-qualified subname,
949 much like looking at (caller($i))[3] until you find a real sub that
950 isn't ANON, etc (also skips over pureperl next::method, etc) */
951 for(i = 0; i < 2; i++) {
952 cxix = __dopoptosub_at(ccstack, cxix);
955 STRLEN fq_subname_len;
957 /* we may be in a higher stacklevel, so dig down deeper */
959 if(top_si->si_type == PERLSI_MAIN)
960 Perl_croak(aTHX_ "next::method/next::can/maybe::next::method must be used in method context");
961 top_si = top_si->si_prev;
962 ccstack = top_si->si_cxstack;
963 cxix = __dopoptosub_at(ccstack, top_si->si_cxix);
966 if(CxTYPE((PERL_CONTEXT*)(&ccstack[cxix])) != CXt_SUB
967 || (PL_DBsub && GvCV(PL_DBsub) && ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))) {
968 cxix = __dopoptosub_at(ccstack, cxix - 1);
973 const I32 dbcxix = __dopoptosub_at(ccstack, cxix - 1);
974 if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub)) {
975 if(CxTYPE((PERL_CONTEXT*)(&ccstack[dbcxix])) != CXt_SUB) {
982 cvgv = CvGV(ccstack[cxix].blk_sub.cv);
985 cxix = __dopoptosub_at(ccstack, cxix - 1);
989 /* we found a real sub here */
990 sv = sv_2mortal(newSV(0));
992 gv_efullname3(sv, cvgv, NULL);
994 fq_subname = SvPVX(sv);
995 fq_subname_len = SvCUR(sv);
997 subname = strrchr(fq_subname, ':');
999 Perl_croak(aTHX_ "next::method/next::can/maybe::next::method cannot find enclosing method");
1002 subname_len = fq_subname_len - (subname - fq_subname);
1003 if(subname_len == 8 && strEQ(subname, "__ANON__")) {
1004 cxix = __dopoptosub_at(ccstack, cxix - 1);
1012 /* If we made it to here, we found our context */
1014 /* Initialize the next::method cache for this stash
1016 selfmeta = HvMROMETA(selfstash);
1017 if(!(nmcache = selfmeta->mro_nextmethod)) {
1018 nmcache = selfmeta->mro_nextmethod = newHV();
1020 else { /* Use the cached coderef if it exists */
1021 HE* cache_entry = hv_fetch_ent(nmcache, sv, 0, 0);
1023 SV* const val = HeVAL(cache_entry);
1024 if(val == &PL_sv_undef) {
1026 Perl_croak(aTHX_ "No next::method '%s' found for %s", subname, hvname);
1029 XPUSHs(sv_2mortal(newRV_inc(val)));
1034 /* beyond here is just for cache misses, so perf isn't as critical */
1036 stashname_len = subname - fq_subname - 2;
1037 stashname = sv_2mortal(newSVpvn(fq_subname, stashname_len));
1039 linear_av = mro_get_linear_isa_c3(selfstash, 0); /* has ourselves at the top of the list */
1041 linear_svp = AvARRAY(linear_av);
1042 entries = AvFILLp(linear_av) + 1;
1044 /* Walk down our MRO, skipping everything up
1045 to the contextually enclosing class */
1047 SV * const linear_sv = *linear_svp++;
1049 if(sv_eq(linear_sv, stashname))
1053 /* Now search the remainder of the MRO for the
1054 same method name as the contextually enclosing
1058 SV * const linear_sv = *linear_svp++;
1064 curstash = gv_stashsv(linear_sv, FALSE);
1067 if (ckWARN(WARN_SYNTAX))
1068 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Can't locate package %"SVf" for @%s::ISA",
1069 (void*)linear_sv, hvname);
1075 gvp = (GV**)hv_fetch(curstash, subname, subname_len, 0);
1081 if (SvTYPE(candidate) != SVt_PVGV)
1082 gv_init(candidate, curstash, subname, subname_len, TRUE);
1084 /* Notably, we only look for real entries, not method cache
1085 entries, because in C3 the method cache of a parent is not
1086 valid for the child */
1087 if (SvTYPE(candidate) == SVt_PVGV && (cand_cv = GvCV(candidate)) && !GvCVGEN(candidate)) {
1088 SvREFCNT_inc_simple_void_NN((SV*)cand_cv);
1089 hv_store_ent(nmcache, newSVsv(sv), (SV*)cand_cv, 0);
1090 XPUSHs(sv_2mortal(newRV_inc((SV*)cand_cv)));
1096 hv_store_ent(nmcache, newSVsv(sv), &PL_sv_undef, 0);
1098 Perl_croak(aTHX_ "No next::method '%s' found for %s", subname, hvname);
1104 * c-indentation-style: bsd
1106 * indent-tabs-mode: t
1109 * ex: set ts=8 sts=4 sw=4 noet: