6 /* *********** ppport stuff */
8 #ifndef PERL_UNUSED_VAR
9 # define PERL_UNUSED_VAR(x) ((void)x)
12 #if defined(PERL_GCC_PEDANTIC)
13 # ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
14 # define PERL_GCC_BRACE_GROUPS_FORBIDDEN
18 #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
19 # ifndef PERL_USE_GCC_BRACE_GROUPS
20 # define PERL_USE_GCC_BRACE_GROUPS
25 # ifdef PERL_USE_GCC_BRACE_GROUPS
26 # define SvREFCNT_inc(sv) \
28 SV * const _sv = (SV*)(sv); \
34 # define SvREFCNT_inc(sv) \
35 ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
40 # define dAX I32 ax = MARK - PL_stack_base + 1
48 # define packWARN(a) (a)
51 /* *********** end ppport.h stuff */
54 # define SVfARG(p) ((void*)(p))
57 /* Most of this code is backported from the bleadperl patch's
58 mro.c, and then modified to work with Class::C3's
63 __mro_linear_isa_c3(pTHX_ HV* stash, HV* cache, I32 level)
69 const char* stashname;
71 I32 made_mortal_cache = 0;
75 stashname = HvNAME(stash);
76 stashname_len = strlen(stashname);
79 "Can't linearize anonymous symbol table");
82 Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'",
86 cache = (HV*)sv_2mortal((SV*)newHV());
87 made_mortal_cache = 1;
90 SV** cache_entry = hv_fetch(cache, stashname, stashname_len, 0);
92 return (AV*)SvREFCNT_inc(*cache_entry);
95 /* not in cache, make a new one */
97 gvp = (GV**)hv_fetch(stash, "ISA", 3, FALSE);
98 isa = (gvp && (gv = *gvp) && gv != (GV*)&PL_sv_undef) ? GvAV(gv) : NULL;
99 if(isa && AvFILLp(isa) >= 0) {
103 AV* const seqs = (AV*)sv_2mortal((SV*)newAV());
106 /* This builds @seqs, which is an array of arrays.
107 The members of @seqs are the MROs of
108 the members of @ISA, followed by @ISA itself.
110 I32 items = AvFILLp(isa) + 1;
111 SV** isa_ptr = AvARRAY(isa);
113 SV* const isa_item = *isa_ptr++;
114 HV* const isa_item_stash = gv_stashsv(isa_item, 0);
115 if(!isa_item_stash) {
116 /* if no stash, make a temporary fake MRO
117 containing just itself */
118 AV* const isa_lin = newAV();
119 av_push(isa_lin, newSVsv(isa_item));
120 av_push(seqs, (SV*)isa_lin);
124 AV* const isa_lin = __mro_linear_isa_c3(aTHX_ isa_item_stash, cache, level + 1);
126 if(items == 0 && AvFILLp(seqs) == -1) {
127 /* Only one parent class. For this case, the C3
128 linearisation is this class followed by the parent's
129 linearisation, so don't bother with the expensive
132 I32 subrv_items = AvFILLp(isa_lin) + 1;
133 SV *const *subrv_p = AvARRAY(isa_lin);
135 /* Hijack the allocated but unused array seqs to be the
136 return value. It's currently mortalised. */
140 av_extend(retval, subrv_items);
141 AvFILLp(retval) = subrv_items;
142 svp = AvARRAY(retval);
144 /* First entry is this class. */
145 *svp++ = newSVpvn(stashname, stashname_len);
147 while(subrv_items--) {
148 /* These values are unlikely to be shared hash key
149 scalars, so no point in adding code to optimising
150 for a case that is unlikely to be true.
151 (Or prove me wrong and do it.) */
153 SV *const val = *subrv_p++;
154 *svp++ = newSVsv(val);
157 SvREFCNT_dec(isa_lin);
158 SvREFCNT_inc(retval);
162 av_push(seqs, (SV*)isa_lin);
165 av_push(seqs, SvREFCNT_inc((SV*)isa));
166 tails = (HV*)sv_2mortal((SV*)newHV());
168 /* This builds "heads", which as an array of integer array
169 indices, one per seq, which point at the virtual "head"
170 of the seq (initially zero) */
171 Newz(0xdead, heads, AvFILLp(seqs)+1, I32);
173 /* This builds %tails, which has one key for every class
174 mentioned in the tail of any sequence in @seqs (tail meaning
175 everything after the first class, the "head"). The value
176 is how many times this key appears in the tails of @seqs.
178 seqs_ptr = AvARRAY(seqs);
179 seqs_items = AvFILLp(seqs) + 1;
180 while(seqs_items--) {
181 AV* const seq = (AV*)*seqs_ptr++;
182 I32 seq_items = AvFILLp(seq);
184 SV** seq_ptr = AvARRAY(seq) + 1;
186 SV* const seqitem = *seq_ptr++;
187 HE* const he = hv_fetch_ent(tails, seqitem, 0, 0);
189 if(!hv_store_ent(tails, seqitem, newSViv(1), 0)) {
190 croak("failed to store value in hash");
194 SV* const val = HeVAL(he);
201 /* Initialize retval to build the return value in */
203 av_push(retval, newSVpvn(stashname, stashname_len)); /* us first */
205 /* This loop won't terminate until we either finish building
206 the MRO, or get an exception. */
212 /* "foreach $seq (@seqs)" */
213 SV** const avptr = AvARRAY(seqs);
214 for(s = 0; s <= AvFILLp(seqs); s++) {
216 AV * const seq = (AV*)(avptr[s]);
218 if(!seq) continue; /* skip empty seqs */
219 svp = av_fetch(seq, heads[s], 0);
220 seqhead = *svp; /* seqhead = head of this seq */
224 /* if we haven't found a winner for this round yet,
225 and this seqhead is not in tails (or the count
226 for it in tails has dropped to zero), then this
227 seqhead is our new winner, and is added to the
228 final MRO immediately */
230 if((tail_entry = hv_fetch_ent(tails, cand, 0, 0))
231 && (val = HeVAL(tail_entry))
234 winner = newSVsv(cand);
235 av_push(retval, winner);
236 /* note however that even when we find a winner,
237 we continue looping over @seqs to do housekeeping */
239 if(!sv_cmp(seqhead, winner)) {
240 /* Once we have a winner (including the iteration
241 where we first found him), inc the head ptr
242 for any seq which had the winner as a head,
243 NULL out any seq which is now empty,
244 and adjust tails for consistency */
246 const int new_head = ++heads[s];
247 if(new_head > AvFILLp(seq)) {
248 SvREFCNT_dec(avptr[s]);
254 /* Because we know this new seqhead used to be
255 a tail, we can assume it is in tails and has
256 a positive value, which we need to dec */
257 svp = av_fetch(seq, new_head, 0);
259 tail_entry = hv_fetch_ent(tails, seqhead, 0, 0);
260 val = HeVAL(tail_entry);
266 /* if we found no candidates, we are done building the MRO.
267 !cand means no seqs have any entries left to check */
273 /* If we had candidates, but nobody won, then the @ISA
274 hierarchy is not C3-incompatible */
278 /* we have to do some cleanup before we croak */
280 errmsg = newSVpvf("Inconsistent hierarchy during C3 merge of class '%s':\n\t"
281 "current merge results [\n", stashname);
282 for (i = 0; i <= av_len(retval); i++) {
283 SV **elem = av_fetch(retval, i, 0);
284 sv_catpvf(errmsg, "\t\t%"SVf",\n", SVfARG(*elem));
286 sv_catpvf(errmsg, "\t]\n\tmerging failed on '%"SVf"'", SVfARG(cand));
288 SvREFCNT_dec(retval);
291 croak("%"SVf, SVfARG(errmsg));
295 else { /* @ISA was undefined or empty */
296 /* build a retval containing only ourselves */
298 av_push(retval, newSVpvn(stashname, stashname_len));
302 /* we don't want anyone modifying the cache entry but us,
303 and we do so by replacing it completely */
304 SvREADONLY_on(retval);
306 if(!made_mortal_cache) {
307 SvREFCNT_inc(retval);
308 if(!hv_store(cache, stashname, stashname_len, (SV*)retval, 0)) {
309 croak("failed to store value in hash");
317 __dopoptosub_at(const PERL_CONTEXT *cxstk, I32 startingblock) {
319 for (i = startingblock; i >= 0; i--) {
320 if(CxTYPE((PERL_CONTEXT*)(&cxstk[i])) == CXt_SUB) return i;
325 XS(XS_Class_C3_XS_nextcan);
326 XS(XS_Class_C3_XS_nextcan)
331 const I32 throw_nomethod = SvIVX(ST(1));
332 register I32 cxix = cxstack_ix;
333 register const PERL_CONTEXT *ccstack = cxstack;
334 const PERL_SI *top_si = PL_curstackinfo;
338 const char *fq_subname;
340 STRLEN fq_subname_len;
341 STRLEN stashname_len;
348 GV* candidate = NULL;
359 if(sv_isobject(self))
360 selfstash = SvSTASH(SvRV(self));
362 selfstash = gv_stashsv(self, 0);
366 hvname = HvNAME(selfstash);
368 Perl_croak(aTHX_ "Can't use anonymous symbol table for method lookup");
370 /* This block finds the contextually-enclosing fully-qualified subname,
371 much like looking at (caller($i))[3] until you find a real sub that
372 isn't ANON, etc (also skips over pureperl next::method, etc) */
373 for(i = 0; i < 2; i++) {
374 cxix = __dopoptosub_at(ccstack, cxix);
376 /* we may be in a higher stacklevel, so dig down deeper */
378 if(top_si->si_type == PERLSI_MAIN)
379 Perl_croak(aTHX_ "next::method/next::can/maybe::next::method must be used in method context");
380 top_si = top_si->si_prev;
381 ccstack = top_si->si_cxstack;
382 cxix = __dopoptosub_at(ccstack, top_si->si_cxix);
385 if(CxTYPE((PERL_CONTEXT*)(&ccstack[cxix])) != CXt_SUB
386 || (PL_DBsub && GvCV(PL_DBsub) && ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))) {
387 cxix = __dopoptosub_at(ccstack, cxix - 1);
392 const I32 dbcxix = __dopoptosub_at(ccstack, cxix - 1);
393 if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub)) {
394 if(CxTYPE((PERL_CONTEXT*)(&ccstack[dbcxix])) != CXt_SUB) {
401 cvgv = CvGV(ccstack[cxix].blk_sub.cv);
404 cxix = __dopoptosub_at(ccstack, cxix - 1);
408 /* we found a real sub here */
409 sv = sv_2mortal(newSV(0));
411 gv_efullname3(sv, cvgv, NULL);
413 fq_subname = SvPVX(sv);
414 fq_subname_len = SvCUR(sv);
416 subname = strrchr(fq_subname, ':');
418 Perl_croak(aTHX_ "next::method/next::can/maybe::next::method cannot find enclosing method");
421 subname_len = fq_subname_len - (subname - fq_subname);
422 if(subname_len == 8 && strEQ(subname, "__ANON__")) {
423 cxix = __dopoptosub_at(ccstack, cxix - 1);
431 /* If we made it to here, we found our context */
433 /* cachekey = "objpkg|context::method::name" */
434 cachekey = sv_2mortal(newSVpv(hvname, 0));
435 sv_catpvn(cachekey, "|", 1);
436 sv_catsv(cachekey, sv);
438 nmcache = get_hv("next::METHOD_CACHE", 1);
439 if((cache_entry = hv_fetch_ent(nmcache, cachekey, 0, 0))) {
440 SV* val = HeVAL(cache_entry);
441 if(val == &PL_sv_undef) {
443 Perl_croak(aTHX_ "No next::method '%s' found for %s", subname, hvname);
446 XPUSHs(sv_2mortal(newRV_inc(val)));
450 /* beyond here is just for cache misses, so perf isn't as critical */
452 stashname_len = subname - fq_subname - 2;
453 stashname = sv_2mortal(newSVpvn(fq_subname, stashname_len));
455 linear_av = __mro_linear_isa_c3(aTHX_ selfstash, NULL, 0);
457 linear_svp = AvARRAY(linear_av);
458 entries = AvFILLp(linear_av) + 1;
461 SV* const linear_sv = *linear_svp++;
463 if(sv_eq(linear_sv, stashname))
468 SV* sub_sv = sv_2mortal(newSVpv(subname, subname_len));
469 HV* cc3_mro = get_hv("Class::C3::MRO", 0);
472 SV* const linear_sv = *linear_svp++;
476 HE* he_cc3_mro_class = hv_fetch_ent(cc3_mro, linear_sv, 0, 0);
477 if(he_cc3_mro_class) {
478 SV* cc3_mro_class_sv = HeVAL(he_cc3_mro_class);
479 if(SvROK(cc3_mro_class_sv)) {
480 HV* cc3_mro_class = (HV*)SvRV(cc3_mro_class_sv);
481 SV** svp_cc3_mro_class_methods = hv_fetch(cc3_mro_class, "methods", 7, 0);
482 if(svp_cc3_mro_class_methods) {
483 SV* cc3_mro_class_methods_sv = *svp_cc3_mro_class_methods;
484 if(SvROK(cc3_mro_class_methods_sv)) {
485 HV* cc3_mro_class_methods = (HV*)SvRV(cc3_mro_class_methods_sv);
486 if(hv_exists_ent(cc3_mro_class_methods, sub_sv, 0))
494 cstash = gv_stashsv(linear_sv, FALSE);
497 if (ckWARN(WARN_MISC))
498 Perl_warner(aTHX_ packWARN(WARN_MISC), "Can't locate package %"SVf" for @%s::ISA",
499 (void*)linear_sv, hvname);
505 gvp = (GV**)hv_fetch(cstash, subname, subname_len, 0);
511 if (SvTYPE(candidate) != SVt_PVGV)
512 gv_init(candidate, cstash, subname, subname_len, TRUE);
513 if (SvTYPE(candidate) == SVt_PVGV && (cand_cv = GvCV(candidate)) && !GvCVGEN(candidate)) {
514 SvREFCNT_dec(linear_av);
515 SvREFCNT_inc((SV*)cand_cv);
516 if (!hv_store_ent(nmcache, newSVsv(cachekey), (SV*)cand_cv, 0)) {
517 croak("failed to store value in hash");
519 XPUSHs(sv_2mortal(newRV_inc((SV*)cand_cv)));
525 SvREFCNT_dec(linear_av);
526 if (!hv_store_ent(nmcache, newSVsv(cachekey), &PL_sv_undef, 0)) {
527 croak("failed to store value in hash");
530 Perl_croak(aTHX_ "No next::method '%s' found for %s", subname, hvname);
534 XS(XS_Class_C3_XS_calculateMRO);
535 XS(XS_Class_C3_XS_calculateMRO)
547 if(items < 1 || items > 2)
548 croak("Usage: calculateMRO(classname[, cache])");
551 if(items == 2) cache = (HV*)SvRV(ST(1));
553 class_stash = gv_stashsv(classname, 0);
555 Perl_croak(aTHX_ "No such class: '%s'!", SvPV_nolen(classname));
557 res = __mro_linear_isa_c3(aTHX_ class_stash, cache, 0);
559 res_items = ret_items = AvFILLp(res) + 1;
560 res_ptr = AvARRAY(res);
565 SV* res_item = *res_ptr++;
566 XPUSHs(sv_2mortal(newSVsv(res_item)));
575 XS(XS_Class_C3_XS_plsubgen);
576 XS(XS_Class_C3_XS_plsubgen)
581 XPUSHs(sv_2mortal(newSViv(PL_sub_generation)));
586 XS(XS_Class_C3_XS_calc_mdt);
587 XS(XS_Class_C3_XS_calc_mdt)
595 HV* our_c3mro; /* $Class::C3::MRO{classname} */
605 if(items < 1 || items > 2)
606 croak("Usage: calculate_method_dispatch_table(classname[, cache])");
609 class_stash = gv_stashsv(classname, 0);
611 Perl_croak(aTHX_ "No such class: '%s'!", SvPV_nolen(classname));
613 if(items == 2) cache = (HV*)SvRV(ST(1));
615 class_mro = __mro_linear_isa_c3(aTHX_ class_stash, cache, 0);
618 if(!hv_store(our_c3mro, "MRO", 3, (SV*)newRV_noinc((SV*)class_mro), 0)) {
619 croak("failed to store value in hash");
622 hv = get_hv("Class::C3::MRO", 1);
623 if(!hv_store_ent(hv, classname, (SV*)newRV_noinc((SV*)our_c3mro), 0)) {
624 croak("failed to store value in hash");
629 /* skip first entry */
630 mroitems = AvFILLp(class_mro);
631 svp = AvARRAY(class_mro) + 1;
633 SV* mro_class = *svp++;
634 HV* mro_stash = gv_stashsv(mro_class, 0);
636 if(!mro_stash) continue;
639 SV** ovfp = hv_fetch(mro_stash, "()", 2, 0);
640 if(ovfp) has_ovf = *ovfp;
643 hv_iterinit(mro_stash);
644 while((he = hv_iternext(mro_stash))) {
652 mskey = hv_iterkeysv(he);
653 if(hv_exists_ent(methods, mskey, 0)) continue;
655 msval = hv_iterval(mro_stash, he);
656 if(SvTYPE(msval) != SVt_PVGV || !(code = GvCVu(msval)))
659 if((ourent = hv_fetch_ent(class_stash, mskey, 0, 0))) {
660 SV* val = HeVAL(ourent);
661 if(val && SvTYPE(val) == SVt_PVGV && GvCVu(val))
666 orig = newSVsv(mro_class);
667 sv_catpvn(orig, "::", 2);
668 sv_catsv(orig, mskey);
669 if( !hv_store(meth_hash, "orig", 4, orig, 0)
670 || !hv_store(meth_hash, "code", 4, newRV_inc((SV*)code), 0)
671 || !hv_store_ent(methods, mskey, newRV_noinc((SV*)meth_hash), 0) ) {
672 croak("failed to store value in hash");
677 if(!hv_store(our_c3mro, "methods", 7, newRV_noinc((SV*)methods), 0)) {
678 croak("failed to store value in hash");
681 if(!hv_store(our_c3mro, "has_overload_fallback", 21, SvREFCNT_inc(has_ovf), 0)) {
682 croak("failed to store value in hash");
688 MODULE = Class::C3::XS PACKAGE = Class::C3::XS
693 newXS("Class::C3::XS::calculateMRO", XS_Class_C3_XS_calculateMRO, __FILE__);
694 newXS("Class::C3::XS::_plsubgen", XS_Class_C3_XS_plsubgen, __FILE__);
695 newXS("Class::C3::XS::_calculate_method_dispatch_table", XS_Class_C3_XS_calc_mdt, __FILE__);
696 newXS("Class::C3::XS::_nextcan", XS_Class_C3_XS_nextcan, __FILE__);