Changeset 25791 for lang/perl/Shika/trunk/mro_compat.c
- Timestamp:
- 12/03/08 20:56:47 (4 years ago)
- Files:
-
- 1 modified
-
lang/perl/Shika/trunk/mro_compat.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/Shika/trunk/mro_compat.c
r25667 r25791 1 #define PERL_NO_GET_CONTEXT 2 #include <EXTERN.h> 3 #include <perl.h> 4 #include <XSUB.h> 5 #include "ppport.h" 1 /* 2 ---------------------------------------------------------------------------- 3 4 mro_compat.h - Provides mro functions for XS 5 6 Automatically created by Devel::MRO/0.01, running under perl 5.10.0 7 8 Copyright (c) 2008, Goro Fuji <gfuji(at)cpan.org>. 9 10 This program is free software; you can redistribute it and/or 11 modify it under the same terms as Perl itself. 12 13 ---------------------------------------------------------------------------- 14 15 Privides: 16 AV* mro_get_linear_isa(HV* stash) 17 UV mro_get_pkg_gen(HV* stash) 18 void mro_method_changed_in(HV* stash) 19 20 See "perldoc mro" for details. 21 22 23 */ 6 24 7 25 #include "mro_compat.h" … … 13 31 AV* 14 32 my_mro_get_linear_isa(pTHX_ HV* const stash){ 15 SV* klass;16 SV* isa;17 33 GV* const cachegv = *(GV**)hv_fetchs(stash, ISA_CACHE, TRUE); 18 AV* av;19 SV* subgen;20 dSP;34 AV* isa; 35 SV* gen; 36 CV* get_linear_isa; 21 37 22 38 if(!isGV(cachegv)) 23 39 gv_init(cachegv, stash, ISA_CACHE, sizeof(ISA_CACHE)-1, TRUE); 24 40 25 av = GvAVn(cachegv); 41 isa = GvAVn(cachegv); 42 gen = GvSVn(cachegv); 26 43 27 #ifdef GvSVn 28 subgen = GvSVn(cachegv); 29 #else 30 subgen = GvSV(cachegv); 31 #endif 32 33 if(SvIOK(subgen) && SvIVX(subgen) == (IV)PL_sub_generation){ 34 return av; 44 if(SvIOK(gen) && SvIVX(gen) == (IV)mro_get_pkg_gen(stash)){ 45 return isa; /* returns the cache if available */ 46 } 47 else{ 48 SvREADONLY_off(isa); 49 av_clear(isa); 35 50 } 36 51 37 klass = newSVpv(HvNAME(stash), 0); 52 get_linear_isa = get_cv("mro::get_linear_isa", FALSE); 53 if(!get_linear_isa){ 54 ENTER; 55 SAVETMPS; 38 56 39 ENTER;40 SAVETMPS;57 Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, newSVpvs("MRO::Compat"), NULL, NULL); 58 get_linear_isa = get_cv("mro::get_linear_isa", TRUE); 41 59 42 PUSHMARK(SP); 43 mXPUSHs(klass); 44 PUTBACK; 45 46 /* need MRO::Compat */ 47 call_pv("mro::get_linear_isa", G_SCALAR); 48 49 SPAGAIN; 50 isa = POPs; 51 PUTBACK; 52 53 if(SvROK(isa) && SvTYPE(SvRV(isa)) == SVt_PVAV){ 54 sv_setiv(subgen, (IV)PL_sub_generation); 55 56 SvSetMagicSV((SV*)cachegv, isa); /* *glob = [...] */ 57 } 58 else{ 59 Perl_croak(aTHX_ "mro::get_linear_isa didn't return an ARRAY reference"); 60 FREETMPS; 61 LEAVE; 60 62 } 61 63 62 FREETMPS; 63 LEAVE; 64 { 65 SV* avref; 66 dSP; 64 67 68 ENTER; 69 SAVETMPS; 70 71 PUSHMARK(SP); 72 mXPUSHp(HvNAME(stash), strlen(HvNAME(stash))); 73 PUTBACK; 74 75 call_sv((SV*)get_linear_isa, G_SCALAR); 76 77 SPAGAIN; 78 avref = POPs; 79 PUTBACK; 80 81 if(SvROK(avref) && SvTYPE(SvRV(avref)) == SVt_PVAV){ 82 AV* const av = (AV*)SvRV(avref); 83 I32 const len = AvFILLp(av) + 1; 84 I32 i; 85 sv_setiv(gen, (IV)mro_get_pkg_gen(stash)); 86 87 for(i = 0; i < len; i++){ 88 HV* const stash = gv_stashsv(AvARRAY(av)[i], FALSE); 89 if(stash) 90 av_push(isa, newSVpv(HvNAME(stash), 0)); 91 } 92 SvREADONLY_on(isa); 93 } 94 else{ 95 Perl_croak(aTHX_ "mro::get_linear_isa() didn't return an ARRAY reference"); 96 } 97 98 FREETMPS; 99 LEAVE; 100 } 65 101 return GvAV(cachegv); 66 102 } 67 103 68 #endif /* !NEED_MRO_COMPAT */ 104 105 #endif /* !NEED_MOR_COMPAT */
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)