- {
- SV *nsv = sv;
- namesv = newSV_type(SVt_PV);
- for (i = 0; i <= AvFILL(ar); i++) {
- SV * const dirsv = *av_fetch(ar, i, TRUE);
-
- SvGETMAGIC(dirsv);
- if (SvROK(dirsv)) {
- int count;
- SV **svp;
- SV *loader = dirsv;
-
- if (SvTYPE(SvRV(loader)) == SVt_PVAV
- && !SvOBJECT(SvRV(loader)))
- {
- loader = *av_fetch(MUTABLE_AV(SvRV(loader)), 0, TRUE);
- SvGETMAGIC(loader);
- }
-
- Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%" UVxf "/%s",
- PTR2UV(SvRV(dirsv)), name);
- tryname = SvPVX_const(namesv);
- tryrsfp = NULL;
-
- if (SvPADTMP(nsv)) {
- nsv = sv_newmortal();
- SvSetSV_nosteal(nsv,sv);
- }
-
- ENTER_with_name("call_INC");
- SAVETMPS;
- EXTEND(SP, 2);
-
- PUSHMARK(SP);
- PUSHs(dirsv);
- PUSHs(nsv);
- PUTBACK;
- if (SvGMAGICAL(loader)) {
- SV *l = sv_newmortal();
- sv_setsv_nomg(l, loader);
- loader = l;
- }
- if (sv_isobject(loader))
- count = call_method("INC", G_ARRAY);
- else
- count = call_sv(loader, G_ARRAY);
- SPAGAIN;
-
- if (count > 0) {
- int i = 0;
- SV *arg;
-
- SP -= count - 1;
- arg = SP[i++];
-
- if (SvROK(arg) && (SvTYPE(SvRV(arg)) <= SVt_PVLV)
- && !isGV_with_GP(SvRV(arg))) {
- filter_cache = SvRV(arg);
-
- if (i < count) {
- arg = SP[i++];
- }
- }
-
- if (SvROK(arg) && isGV_with_GP(SvRV(arg))) {
- arg = SvRV(arg);
- }
-
- if (isGV_with_GP(arg)) {
- IO * const io = GvIO((const GV *)arg);
-
- ++filter_has_file;
-
- if (io) {
- tryrsfp = IoIFP(io);
- if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
- PerlIO_close(IoOFP(io));
- }
- IoIFP(io) = NULL;
- IoOFP(io) = NULL;
- }
-
- if (i < count) {
- arg = SP[i++];
- }
- }
-
- if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
- filter_sub = arg;
- SvREFCNT_inc_simple_void_NN(filter_sub);
-
- if (i < count) {
- filter_state = SP[i];
- SvREFCNT_inc_simple_void(filter_state);
- }
- }
-
- if (!tryrsfp && (filter_cache || filter_sub)) {
- tryrsfp = PerlIO_open(BIT_BUCKET,
- PERL_SCRIPT_MODE);
- }
- SP--;
- }
-
- /* FREETMPS may free our filter_cache */
- SvREFCNT_inc_simple_void(filter_cache);
-
- PUTBACK;
- FREETMPS;
- LEAVE_with_name("call_INC");
-
- /* Now re-mortalize it. */
- sv_2mortal(filter_cache);
-
- /* Adjust file name if the hook has set an %INC entry.
- This needs to happen after the FREETMPS above. */
- svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
- if (svp)
- tryname = SvPV_nolen_const(*svp);
-
- if (tryrsfp) {
- hook_sv = dirsv;
- break;
- }
-
- filter_has_file = 0;
- filter_cache = NULL;
- if (filter_state) {
- SvREFCNT_dec_NN(filter_state);
- filter_state = NULL;
- }
- if (filter_sub) {
- SvREFCNT_dec_NN(filter_sub);
- filter_sub = NULL;
- }
- }
- else if (path_searchable) {
+ {
+ SV *nsv = sv;
+ namesv = newSV_type(SVt_PV);
+ for (i = 0; i <= AvFILL(ar); i++) {
+ SV * const dirsv = *av_fetch(ar, i, TRUE);
+
+ SvGETMAGIC(dirsv);
+ if (SvROK(dirsv)) {
+ int count;
+ SV **svp;
+ SV *loader = dirsv;
+
+ if (SvTYPE(SvRV(loader)) == SVt_PVAV
+ && !SvOBJECT(SvRV(loader)))
+ {
+ loader = *av_fetch(MUTABLE_AV(SvRV(loader)), 0, TRUE);
+ SvGETMAGIC(loader);
+ }
+
+ Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%" UVxf "/%s",
+ PTR2UV(SvRV(dirsv)), name);
+ tryname = SvPVX_const(namesv);
+ tryrsfp = NULL;
+
+ if (SvPADTMP(nsv)) {
+ nsv = sv_newmortal();
+ SvSetSV_nosteal(nsv,sv);
+ }
+
+ ENTER_with_name("call_INC");
+ SAVETMPS;
+ EXTEND(SP, 2);
+
+ PUSHMARK(SP);
+ PUSHs(dirsv);
+ PUSHs(nsv);
+ PUTBACK;
+ if (SvGMAGICAL(loader)) {
+ SV *l = sv_newmortal();
+ sv_setsv_nomg(l, loader);
+ loader = l;
+ }
+ if (sv_isobject(loader))
+ count = call_method("INC", G_LIST);
+ else
+ count = call_sv(loader, G_LIST);
+ SPAGAIN;
+
+ if (count > 0) {
+ int i = 0;
+ SV *arg;
+
+ SP -= count - 1;
+ arg = SP[i++];
+
+ if (SvROK(arg) && (SvTYPE(SvRV(arg)) <= SVt_PVLV)
+ && !isGV_with_GP(SvRV(arg))) {
+ filter_cache = SvRV(arg);
+
+ if (i < count) {
+ arg = SP[i++];
+ }
+ }
+
+ if (SvROK(arg) && isGV_with_GP(SvRV(arg))) {
+ arg = SvRV(arg);
+ }
+
+ if (isGV_with_GP(arg)) {
+ IO * const io = GvIO((const GV *)arg);
+
+ ++filter_has_file;
+
+ if (io) {
+ tryrsfp = IoIFP(io);
+ if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
+ PerlIO_close(IoOFP(io));
+ }
+ IoIFP(io) = NULL;
+ IoOFP(io) = NULL;
+ }
+
+ if (i < count) {
+ arg = SP[i++];
+ }
+ }
+
+ if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
+ filter_sub = arg;
+ SvREFCNT_inc_simple_void_NN(filter_sub);
+
+ if (i < count) {
+ filter_state = SP[i];
+ SvREFCNT_inc_simple_void(filter_state);
+ }
+ }
+
+ if (!tryrsfp && (filter_cache || filter_sub)) {
+ tryrsfp = PerlIO_open(BIT_BUCKET,
+ PERL_SCRIPT_MODE);
+ }
+ SP--;
+ }
+
+ /* FREETMPS may free our filter_cache */
+ SvREFCNT_inc_simple_void(filter_cache);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE_with_name("call_INC");
+
+ /* Now re-mortalize it. */
+ sv_2mortal(filter_cache);
+
+ /* Adjust file name if the hook has set an %INC entry.
+ This needs to happen after the FREETMPS above. */
+ svp = hv_fetch(GvHVn(PL_incgv), name, len, 0);
+ if (svp)
+ tryname = SvPV_nolen_const(*svp);
+
+ if (tryrsfp) {
+ hook_sv = dirsv;
+ break;
+ }
+
+ filter_has_file = 0;
+ filter_cache = NULL;
+ if (filter_state) {
+ SvREFCNT_dec_NN(filter_state);
+ filter_state = NULL;
+ }
+ if (filter_sub) {
+ SvREFCNT_dec_NN(filter_sub);
+ filter_sub = NULL;
+ }
+ }
+ else if (path_searchable) {