GV * Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload) { register const char *nend; const char *nsplit = 0; GV* gv; for (nend = name; *nend; nend++) { if (*nend == '\'') nsplit = nend; else if (*nend == ':' && *(nend + 1) == ':') nsplit = ++nend; } if (nsplit) { const char *origname = name; name = nsplit + 1; if (*nsplit == ':') --nsplit; if ((nsplit - origname) == 5 && strnEQ(origname, "SUPER", 5)) { /* ->SUPER::method should really be looked up in original stash */ SV *tmpstr = sv_2mortal(Perl_newSVpvf(aTHX_ "%s::SUPER", CopSTASHPV(PL_curcop))); stash = gv_stashpvn(SvPVX(tmpstr), SvCUR(tmpstr), TRUE); DEBUG_o( Perl_deb(aTHX_ "Treating %s as %s::%s\n", origname, HvNAME(stash), name) ); } else stash = gv_stashpvn(origname, nsplit - origname, TRUE); } gv = gv_fetchmeth(stash, name, nend - name, 0); if (!gv) { if (strEQ(name,"import") || strEQ(name,"unimport")) gv = (GV*)&PL_sv_yes; else if (autoload) gv = gv_autoload4(stash, name, nend - name, TRUE); } else if (autoload) { CV* cv = GvCV(gv); if (!CvROOT(cv) && !CvXSUB(cv)) { GV* stubgv; GV* autogv; if (CvANON(cv)) stubgv = gv; else { stubgv = CvGV(cv); if (GvCV(stubgv) != cv) /* orphaned import */ stubgv = gv; } autogv = gv_autoload4(GvSTASH(stubgv), GvNAME(stubgv), GvNAMELEN(stubgv), TRUE); if (autogv) gv = autogv; } } return gv; }
void Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi) { register GP *gp; bool doproto = SvTYPE(gv) > SVt_NULL; char *proto = (doproto && SvPOK(gv)) ? SvPVX(gv) : NULL; sv_upgrade((SV*)gv, SVt_PVGV); if (SvLEN(gv)) { if (proto) { SvPVX(gv) = NULL; SvLEN(gv) = 0; SvPOK_off(gv); } else Safefree(SvPVX(gv)); } Newz(602, gp, 1, GP); GvGP(gv) = gp_ref(gp); GvSV(gv) = NEWSV(72,0); GvLINE(gv) = CopLINE(PL_curcop); GvFILE(gv) = CopFILE(PL_curcop) ? CopFILE(PL_curcop) : ""; GvCVGEN(gv) = 0; GvEGV(gv) = gv; sv_magic((SV*)gv, (SV*)gv, '*', Nullch, 0); GvSTASH(gv) = (HV*)SvREFCNT_inc(stash); GvNAME(gv) = savepvn(name, len); GvNAMELEN(gv) = len; if (multi || doproto) /* doproto means it _was_ mentioned */ GvMULTI_on(gv); if (doproto) { /* Replicate part of newSUB here. */ SvIOK_off(gv); ENTER; /* XXX unsafe for threads if eval_owner isn't held */ start_subparse(0,0); /* Create CV in compcv. */ GvCV(gv) = PL_compcv; LEAVE; PL_sub_generation++; CvGV(GvCV(gv)) = gv; CvFILE(GvCV(gv)) = CopFILE(PL_curcop); CvSTASH(GvCV(gv)) = PL_curstash; #ifdef USE_THREADS CvOWNER(GvCV(gv)) = 0; if (!CvMUTEXP(GvCV(gv))) { New(666, CvMUTEXP(GvCV(gv)), 1, perl_mutex); MUTEX_INIT(CvMUTEXP(GvCV(gv))); } #endif /* USE_THREADS */ if (proto) { sv_setpv((SV*)GvCV(gv), proto); Safefree(proto); } } }
GV * Perl_gv_fetchmeth_autoload(pTHX_ HV *stash, const char *name, STRLEN len, I32 level) { GV *gv = gv_fetchmeth(stash, name, len, level); if (!gv) { char autoload[] = "AUTOLOAD"; STRLEN autolen = sizeof(autoload)-1; CV *cv; GV **gvp; if (!stash) return Nullgv; /* UNIVERSAL::AUTOLOAD could cause trouble */ if (len == autolen && strnEQ(name, autoload, autolen)) return Nullgv; if (!(gv = gv_fetchmeth(stash, autoload, autolen, FALSE))) return Nullgv; cv = GvCV(gv); if (!(CvROOT(cv) || CvXSUB(cv))) return Nullgv; /* Have an autoload */ if (level < 0) /* Cannot do without a stub */ gv_fetchmeth(stash, name, len, 0); gvp = (GV**)hv_fetch(stash, name, len, (level >= 0)); if (!gvp) return Nullgv; return *gvp; } return gv; }
SV *p5_scalar_call_gv_two_args(PerlInterpreter *my_perl, GV *gv, SV *arg, SV *arg2, I32 *count, I32 *type, I32 *err) { PERL_SET_CONTEXT(my_perl); { dSP; SV * retval = NULL; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs((SV*)arg); XPUSHs((SV*)arg2); PUTBACK; SV * const rv = sv_2mortal(newRV((SV*)GvCV(gv))); *count = call_sv(rv, G_SCALAR | G_EVAL); SPAGAIN; handle_p5_error(err); if (*err) fprintf(stderr, "err: %d\n", *err); retval = pop_return_values(my_perl, sp, *count, type); SPAGAIN; PUTBACK; FREETMPS; LEAVE; return retval; } }
const Ref<Code>::Temp Stash::get_method(Raw_string name) const { GV* const glob = gv_fetchmeth_autoload(stash, name.value, name.length, -1); if (glob == NULL || !isGV(glob) || CvGV(glob) == NULL) { throw Runtime_exception("method doesn't exist");//TODO No such method exception?? } CV* const codeval = GvCV(glob); return Code::Value(interp, codeval).take_ref(); }
static void init_perl_variables() { dTHX; GV *exit_gv = gv_fetchpv("CORE::GLOBAL::exit", TRUE, SVt_PVCV); GvCV(exit_gv) = get_cv("ModPSGI::exit", TRUE); GvIMPORTED_CV_on(exit_gv); (void) hv_store(GvHV(PL_envgv), "MOD_PSGI", 8, newSVpv(MOD_PSGI_VERSION, 0), 0); }
GV* Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method) { char autoload[] = "AUTOLOAD"; STRLEN autolen = sizeof(autoload)-1; GV* gv; CV* cv; HV* varstash; GV* vargv; SV* varsv; if (len == autolen && strnEQ(name, autoload, autolen)) return Nullgv; if (!(gv = gv_fetchmeth(stash, autoload, autolen, FALSE))) return Nullgv; cv = GvCV(gv); if (!CvROOT(cv)) return Nullgv; /* * Inheriting AUTOLOAD for non-methods works ... for now. */ if (ckWARN(WARN_DEPRECATED) && !method && (GvCVGEN(gv) || GvSTASH(gv) != stash)) Perl_warner(aTHX_ WARN_DEPRECATED, "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated", HvNAME(stash), (int)len, name); /* * Given &FOO::AUTOLOAD, set $FOO::AUTOLOAD to desired function name. * The subroutine's original name may not be "AUTOLOAD", so we don't * use that, but for lack of anything better we will use the sub's * original package to look up $AUTOLOAD. */ varstash = GvSTASH(CvGV(cv)); vargv = *(GV**)hv_fetch(varstash, autoload, autolen, TRUE); ENTER; #ifdef USE_THREADS sv_lock((SV *)varstash); #endif if (!isGV(vargv)) gv_init(vargv, varstash, autoload, autolen, FALSE); LEAVE; varsv = GvSV(vargv); #ifdef USE_THREADS sv_lock(varsv); #endif sv_setpv(varsv, HvNAME(stash)); sv_catpvn(varsv, "::", 2); sv_catpvn(varsv, name, len); SvTAINTED_off(varsv); return gv; }
CV * PerlIOVia_fetchmethod(pTHX_ PerlIOVia * s, char *method, CV ** save) { GV *gv = gv_fetchmeth(s->stash, method, strlen(method), 0); #if 0 Perl_warn(aTHX_ "Lookup %s::%s => %p", HvNAME(s->stash), method, gv); #endif if (gv) { return *save = GvCV(gv); } else { return *save = (CV *) - 1; } }
bool THX_MopMcV_has_method(pTHX_ SV* metaclass, SV* name) { HV* stash = (HV*) SvRV(metaclass); HE* method_gv_he = hv_fetch_ent(stash, name, 0, 0); if (method_gv_he != NULL) { GV* method_gv = (GV*) HeVAL(method_gv_he); CV* method = GvCV(method_gv); if (method != NULL && GvSTASH(CvGV(method)) == stash) { return TRUE; } } return FALSE; }
void mop_get_package_symbols (HV *stash, type_filter_t filter, get_package_symbols_cb_t cb, void *ud) { HE *he; (void)hv_iterinit(stash); if (filter == TYPE_FILTER_NONE) { while ( (he = hv_iternext(stash)) ) { STRLEN keylen; const char *key = HePV(he, keylen); if (!cb(key, keylen, HeVAL(he), ud)) { return; } } return; } while ( (he = hv_iternext(stash)) ) { GV * const gv = (GV*)HeVAL(he); STRLEN keylen; const char * const key = HePV(he, keylen); SV *sv = NULL; if(isGV(gv)){ switch (filter) { case TYPE_FILTER_CODE: sv = (SV *)GvCVu(gv); break; case TYPE_FILTER_ARRAY: sv = (SV *)GvAV(gv); break; case TYPE_FILTER_IO: sv = (SV *)GvIO(gv); break; case TYPE_FILTER_HASH: sv = (SV *)GvHV(gv); break; case TYPE_FILTER_SCALAR: sv = (SV *)GvSV(gv); break; default: croak("Unknown type"); } } /* expand the gv into a real typeglob if it * contains stub functions or constants and we * were asked to return CODE references */ else if (filter == TYPE_FILTER_CODE) { gv_init(gv, stash, key, keylen, GV_ADDMULTI); sv = (SV *)GvCV(gv); } if (sv) { if (!cb(key, keylen, sv, ud)) { return; } } } }
SV* THX_MopMcV_get_method(pTHX_ SV* metaclass, SV* name) { HV* stash = (HV*) SvRV(metaclass); HE* method_gv_he = hv_fetch_ent(stash, name, 0, 0); if (method_gv_he != NULL) { GV* method_gv = (GV*) HeVAL(method_gv_he); CV* method = GvCV(method_gv); if (method != NULL && GvSTASH(CvGV(method)) == stash) { return newRV_inc((SV*) method); } } return NULL; }
SV *p5_call_parent_method(PerlInterpreter *my_perl, char *package, SV *obj, I32 context, char *name, int len, SV *args[], I32 *count, I32 *err, I32 *type) { PERL_SET_CONTEXT(my_perl); { dSP; int i; SV * retval = NULL; int flags = (context ? G_SCALAR : G_ARRAY) | G_EVAL; ENTER; SAVETMPS; HV * const pkg = package != NULL ? gv_stashpv(package, 0) : SvSTASH((SV*)SvRV(obj)); GV * const gv = Perl_gv_fetchmethod_autoload(aTHX_ pkg, name, TRUE); if (gv && isGV(gv)) { PUSHMARK(SP); if (len > 1) { XPUSHs(package != NULL ? sv_2mortal(args[0]) : args[0]); for (i = 1; i < len; i++) { if (args[i] != NULL) /* skip Nil which gets turned into NULL */ XPUSHs(sv_2mortal(args[i])); } } else if (len > 0) if (args != NULL) /* skip Nil which gets turned into NULL */ XPUSHs(package != NULL ? sv_2mortal((SV*)args) : (SV*)args); PUTBACK; SV * const rv = sv_2mortal(newRV((SV*)GvCV(gv))); *count = call_sv(rv, flags); SPAGAIN; handle_p5_error(err); retval = pop_return_values(my_perl, sp, *count, type); SPAGAIN; } else { ERRSV = newSVpvf("Could not find method \"%s\" of \"%s\" object", name, HvNAME(pkg)); } PUTBACK; FREETMPS; LEAVE; return retval; } }
AV *p5_call_method(PerlInterpreter *my_perl, char *package, SV *obj, char *name, int len, SV *args[]) { dSP; int i; AV * const retval = newAV(); int flags = G_ARRAY | G_EVAL; PERL_SET_CONTEXT(my_perl); ENTER; SAVETMPS; HV * const pkg = package != NULL ? gv_stashpv(package, 0) : SvSTASH((SV*)SvRV(obj)); GV * const gv = Perl_gv_fetchmethod_autoload(aTHX_ pkg, name, TRUE); if (gv && isGV(gv)) { I32 count; PUSHMARK(SP); for (i = 0; i < len; i++) { XPUSHs(sv_2mortal(args[i])); } PUTBACK; SV * const rv = sv_2mortal(newRV((SV*)GvCV(gv))); count = call_sv(rv, flags); SPAGAIN; if (count > 0) av_extend(retval, count - 1); for (i = count - 1; i >= 0; i--) { SV * const next = POPs; SvREFCNT_inc(next); if (av_store(retval, i, next) == NULL) SvREFCNT_dec(next); /* see perlguts Working with AVs */ } } else { ERRSV = newSVpvf("Could not find method \"%s\" of \"%s\" object", name, HvNAME(pkg)); } PUTBACK; FREETMPS; LEAVE; return retval; }
SV *p5_scalar_call_gv(PerlInterpreter *my_perl, GV *gv, int len, SV *args[], I32 *count, I32 *err, I32 *type) { PERL_SET_CONTEXT(my_perl); { dSP; int i; SV * retval = NULL; ENTER; SAVETMPS; PUSHMARK(SP); if (len > 1) { XPUSHs(args[0]); for (i = 1; i < len; i++) { if (args[i] != NULL) /* skip Nil which gets turned into NULL */ XPUSHs(sv_2mortal(args[i])); } } else if (len > 0) if (args != NULL) /* skip Nil which gets turned into NULL */ XPUSHs((SV*)args); PUTBACK; SV * const rv = sv_2mortal(newRV((SV*)GvCV(gv))); /* FIXME: can be done once */ *count = call_sv(rv, G_SCALAR | G_EVAL); SPAGAIN; handle_p5_error(err); retval = pop_return_values(my_perl, sp, *count, type); SPAGAIN; PUTBACK; FREETMPS; LEAVE; return retval; } }
HV *newHV_indexed(pTHX_ const CBC *THIS) { dSP; HV *hv, *stash; GV *gv; SV *sv; int count; hv = newHV(); sv = newSVpv(CONST_CHAR(THIS->ixhash), 0); stash = gv_stashpv(CONST_CHAR(THIS->ixhash), 0); gv = gv_fetchmethod(stash, "TIEHASH"); ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv_2mortal(sv)); PUTBACK; count = call_sv((SV*)GvCV(gv), G_SCALAR); SPAGAIN; if (count != 1) fatal("%s::TIEHASH returned %d elements instead of 1", THIS->ixhash, count); sv = POPs; PUTBACK; hv_magic(hv, (GV *)sv, PERL_MAGIC_tied); FREETMPS; LEAVE; return hv; }
SV *p5_call_inherited_package_method(PerlInterpreter *my_perl, char *package, char *base_package, char *name, int len, SV *args[], I32 *count, I32 *err, I32 *type) { PERL_SET_CONTEXT(my_perl); { dSP; SV * retval = NULL; HV * stash = gv_stashpvn(package, strlen(package), SVf_UTF8); int flags = G_ARRAY | G_EVAL; if (stash == NULL) { *type = -1; /* signal that a wrapper package needs to be created */ return NULL; } ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(newSVpv(package, 0)); push_arguments(sp, len, args); { GV * const gv = p5_look_up_package_method(my_perl, base_package, name); SV * const rv = sv_2mortal(newRV((SV*)GvCV(gv))); *count = call_sv(rv, flags); } SPAGAIN; handle_p5_error(err); retval = pop_return_values(my_perl, sp, *count, type); FREETMPS; LEAVE; return retval; } }
static GList* gtk2perl_cell_layout_get_cells (GtkCellLayout *cell_layout) { GList * cells = NULL; GET_METHOD (cell_layout, "GET_CELLS"); if (METHOD_EXISTS) { int count; PREP (cell_layout); PUTBACK; count = call_sv ((SV *) GvCV (slot), G_ARRAY); SPAGAIN; while (count > 0) { SV * sv = POPs; cells = g_list_prepend (cells, SvGtkCellRenderer (sv)); count--; } PUTBACK; FINISH; } return cells; }
GV * Perl_gv_fetchmeth(pTHX_ HV *stash, const char *name, STRLEN len, I32 level) { AV* av; GV* topgv; GV* gv; GV** gvp; CV* cv; if (!stash) return 0; if ((level > 100) || (level < -100)) Perl_croak(aTHX_ "Recursive inheritance detected while looking for method '%s' in package '%s'", name, HvNAME(stash)); DEBUG_o( Perl_deb(aTHX_ "Looking for method %s in package %s\n",name,HvNAME(stash)) ); gvp = (GV**)hv_fetch(stash, name, len, (level >= 0)); if (!gvp) topgv = Nullgv; else { topgv = *gvp; if (SvTYPE(topgv) != SVt_PVGV) gv_init(topgv, stash, name, len, TRUE); if ((cv = GvCV(topgv))) { /* If genuine method or valid cache entry, use it */ if (!GvCVGEN(topgv) || GvCVGEN(topgv) == PL_sub_generation) return topgv; /* Stale cached entry: junk it */ SvREFCNT_dec(cv); GvCV(topgv) = cv = Nullcv; GvCVGEN(topgv) = 0; } else if (GvCVGEN(topgv) == PL_sub_generation) return 0; /* cache indicates sub doesn't exist */ } gvp = (GV**)hv_fetch(stash, "ISA", 3, FALSE); av = (gvp && (gv = *gvp) && gv != (GV*)&PL_sv_undef) ? GvAV(gv) : Nullav; /* create and re-create @.*::SUPER::ISA on demand */ if (!av || !SvMAGIC(av)) { char* packname = HvNAME(stash); STRLEN packlen = strlen(packname); if (packlen >= 7 && strEQ(packname + packlen - 7, "::SUPER")) { HV* basestash; packlen -= 7; basestash = gv_stashpvn(packname, packlen, TRUE); gvp = (GV**)hv_fetch(basestash, "ISA", 3, FALSE); if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (av = GvAV(gv))) { gvp = (GV**)hv_fetch(stash, "ISA", 3, TRUE); if (!gvp || !(gv = *gvp)) Perl_croak(aTHX_ "Cannot create %s::ISA", HvNAME(stash)); if (SvTYPE(gv) != SVt_PVGV) gv_init(gv, stash, "ISA", 3, TRUE); SvREFCNT_dec(GvAV(gv)); GvAV(gv) = (AV*)SvREFCNT_inc(av); } } } if (av) { SV** svp = AvARRAY(av); /* NOTE: No support for tied ISA */ I32 items = AvFILLp(av) + 1; while (items--) { SV* sv = *svp++; HV* basestash = gv_stashsv(sv, FALSE); if (!basestash) { if (ckWARN(WARN_MISC)) Perl_warner(aTHX_ WARN_MISC, "Can't locate package %s for @%s::ISA", SvPVX(sv), HvNAME(stash)); continue; } gv = gv_fetchmeth(basestash, name, len, (level >= 0) ? level + 1 : level - 1); if (gv) goto gotcha; } } /* if at top level, try UNIVERSAL */ if (level == 0 || level == -1) { HV* lastchance; if ((lastchance = gv_stashpvn("UNIVERSAL", 9, FALSE))) { if ((gv = gv_fetchmeth(lastchance, name, len, (level >= 0) ? level + 1 : level - 1))) { gotcha: /* * Cache method in topgv if: * 1. topgv has no synonyms (else inheritance crosses wires) * 2. method isn't a stub (else AUTOLOAD fails spectacularly) */ if (topgv && GvREFCNT(topgv) == 1 && (cv = GvCV(gv)) && (CvROOT(cv) || CvXSUB(cv))) { if ((cv = GvCV(topgv))) SvREFCNT_dec(cv); GvCV(topgv) = (CV*)SvREFCNT_inc(GvCV(gv)); GvCVGEN(topgv) = PL_sub_generation; } return gv; } else if (topgv && GvREFCNT(topgv) == 1) { /* cache the fact that the method is not defined */ GvCVGEN(topgv) = PL_sub_generation; } } } return 0; }
GV* Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method) { char autoload[] = "AUTOLOAD"; STRLEN autolen = sizeof(autoload)-1; GV* gv; CV* cv; HV* varstash; GV* vargv; SV* varsv; char *packname = ""; if (len == autolen && strnEQ(name, autoload, autolen)) return Nullgv; if (stash) { if (SvTYPE(stash) < SVt_PVHV) { packname = SvPV_nolen((SV*)stash); stash = Nullhv; } else { packname = HvNAME(stash); } } if (!(gv = gv_fetchmeth(stash, autoload, autolen, FALSE))) return Nullgv; cv = GvCV(gv); if (!(CvROOT(cv) || CvXSUB(cv))) return Nullgv; /* * Inheriting AUTOLOAD for non-methods works ... for now. */ if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX) && !method && (GvCVGEN(gv) || GvSTASH(gv) != stash)) Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX), "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated", packname, (int)len, name); if (CvXSUB(cv)) { /* rather than lookup/init $AUTOLOAD here * only to have the XSUB do another lookup for $AUTOLOAD * and split that value on the last '::', * pass along the same data via some unused fields in the CV */ CvSTASH(cv) = stash; SvPVX(cv) = (char *)name; /* cast to lose constness warning */ SvCUR(cv) = len; return gv; } /* * Given &FOO::AUTOLOAD, set $FOO::AUTOLOAD to desired function name. * The subroutine's original name may not be "AUTOLOAD", so we don't * use that, but for lack of anything better we will use the sub's * original package to look up $AUTOLOAD. */ varstash = GvSTASH(CvGV(cv)); vargv = *(GV**)hv_fetch(varstash, autoload, autolen, TRUE); ENTER; if (!isGV(vargv)) gv_init(vargv, varstash, autoload, autolen, FALSE); LEAVE; varsv = GvSV(vargv); sv_setpv(varsv, packname); sv_catpvn(varsv, "::", 2); sv_catpvn(varsv, name, len); SvTAINTED_off(varsv); return gv; }
GV * Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload) { register const char *nend; const char *nsplit = 0; GV* gv; HV* ostash = stash; if (stash && SvTYPE(stash) < SVt_PVHV) stash = Nullhv; for (nend = name; *nend; nend++) { if (*nend == '\'') nsplit = nend; else if (*nend == ':' && *(nend + 1) == ':') nsplit = ++nend; } if (nsplit) { const char *origname = name; name = nsplit + 1; if (*nsplit == ':') --nsplit; if ((nsplit - origname) == 5 && strnEQ(origname, "SUPER", 5)) { /* ->SUPER::method should really be looked up in original stash */ SV *tmpstr = sv_2mortal(Perl_newSVpvf(aTHX_ "%s::SUPER", CopSTASHPV(PL_curcop))); /* __PACKAGE__::SUPER stash should be autovivified */ stash = gv_stashpvn(SvPVX(tmpstr), SvCUR(tmpstr), TRUE); DEBUG_o( Perl_deb(aTHX_ "Treating %s as %s::%s\n", origname, HvNAME(stash), name) ); } else { /* don't autovifify if ->NoSuchStash::method */ stash = gv_stashpvn(origname, nsplit - origname, FALSE); /* however, explicit calls to Pkg::SUPER::method may happen, and may require autovivification to work */ if (!stash && (nsplit - origname) >= 7 && strnEQ(nsplit - 7, "::SUPER", 7) && gv_stashpvn(origname, nsplit - origname - 7, FALSE)) stash = gv_stashpvn(origname, nsplit - origname, TRUE); } ostash = stash; } gv = gv_fetchmeth(stash, name, nend - name, 0); if (!gv) { if (strEQ(name,"import") || strEQ(name,"unimport")) gv = (GV*)&PL_sv_yes; else if (autoload) gv = gv_autoload4(ostash, name, nend - name, TRUE); } else if (autoload) { CV* cv = GvCV(gv); if (!CvROOT(cv) && !CvXSUB(cv)) { GV* stubgv; GV* autogv; if (CvANON(cv)) stubgv = gv; else { stubgv = CvGV(cv); if (GvCV(stubgv) != cv) /* orphaned import */ stubgv = gv; } autogv = gv_autoload4(GvSTASH(stubgv), GvNAME(stubgv), GvNAMELEN(stubgv), TRUE); if (autogv) gv = autogv; } } return gv; }
void _mpack_item(SV *res, SV *o) { size_t len, res_len, new_len; char *s, *res_s; res_s = SvPVbyte(res, res_len); unsigned i; if (!SvOK(o)) { new_len = res_len + mp_sizeof_nil(); res_s = SvGROW(res, new_len); SvCUR_set(res, new_len); mp_encode_nil(res_s + res_len); return; } if (SvROK(o)) { o = SvRV(o); if (SvOBJECT(o)) { SvGETMAGIC(o); HV *stash = SvSTASH(o); GV *mtd = gv_fetchmethod_autoload(stash, "msgpack", 0); if (!mtd) croak("Object has no method 'msgpack'"); dSP; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs (sv_bless (sv_2mortal (newRV_inc(o)), stash)); PUTBACK; call_sv((SV *)GvCV(mtd), G_SCALAR); SPAGAIN; SV *pkt = POPs; if (!SvOK(pkt)) croak("O->msgpack returned undef"); s = SvPV(pkt, len); new_len = res_len + len; res_s = SvGROW(res, new_len); SvCUR_set(res, new_len); memcpy(res_s + res_len, s, len); PUTBACK; FREETMPS; LEAVE; return; } switch(SvTYPE(o)) { case SVt_PVAV: { AV *a = (AV *)o; len = av_len(a) + 1; new_len = res_len + mp_sizeof_array(len); res_s = SvGROW(res, new_len); SvCUR_set(res, new_len); mp_encode_array(res_s + res_len, len); for (i = 0; i < len; i++) { SV **item = av_fetch(a, i, 0); if (!item) _mpack_item(res, 0); else _mpack_item(res, *item); } break; } case SVt_PVHV: { HV *h = (HV *)o; len = hv_iterinit(h); new_len = res_len + mp_sizeof_map(len); res_s = SvGROW(res, new_len); SvCUR_set(res, new_len); mp_encode_map(res_s + res_len, len); for (;;) { HE * iter = hv_iternext(h); if (!iter) break; SV *k = hv_iterkeysv(iter); SV *v = HeVAL(iter); _mpack_item(res, k); _mpack_item(res, v); } break; } default: croak("Can't serialize reference"); } return; } switch(SvTYPE(o)) { case SVt_PV: case SVt_PVIV: case SVt_PVNV: case SVt_PVMG: case SVt_REGEXP: if (!looks_like_number(o)) { s = SvPV(o, len); new_len = res_len + mp_sizeof_str(len); res_s = SvGROW(res, new_len); SvCUR_set(res, new_len); mp_encode_str(res_s + res_len, s, len); break; } case SVt_NV: { NV v = SvNV(o); IV iv = (IV)v; if (v != iv) { new_len = res_len + mp_sizeof_double(v); res_s = SvGROW(res, new_len); SvCUR_set(res, new_len); mp_encode_double(res_s + res_len, v); break; } } case SVt_IV: { IV v = SvIV(o); if (v >= 0) { new_len = res_len + mp_sizeof_uint(v); res_s = SvGROW(res, new_len); SvCUR_set(res, new_len); mp_encode_uint(res_s + res_len, v); } else { new_len = res_len + mp_sizeof_int(v); res_s = SvGROW(res, new_len); SvCUR_set(res, new_len); mp_encode_int(res_s + res_len, v); } break; } default: croak("Internal msgpack error %d", SvTYPE(o)); } }
void Embperl::DoInit() { const char *argv_eqemu[] = { "", #ifdef EMBPERL_IO_CAPTURE "-w", "-W", #endif "-e", "0;", NULL }; int argc = 3; #ifdef EMBPERL_IO_CAPTURE argc = 5; #endif char **argv = (char **)argv_eqemu; char **env = { NULL }; PL_perl_destruct_level = 1; perl_construct(my_perl); PERL_SYS_INIT3(&argc, &argv, &env); perl_parse(my_perl, xs_init, argc, argv, env); perl_run(my_perl); //a little routine we use a lot. eval_pv("sub my_eval {eval $_[0];}", TRUE); //dies on error //ruin the perl exit and command: eval_pv("sub my_exit {}",TRUE); eval_pv("sub my_sleep {}",TRUE); if(gv_stashpv("CORE::GLOBAL", FALSE)) { GV *exitgp = gv_fetchpv("CORE::GLOBAL::exit", TRUE, SVt_PVCV); //#if _MSC_VER >= 1600 //GvCV_set(exitgp, perl_get_cv("my_exit", TRUE)); //dies on error //#else GvCV(exitgp) = perl_get_cv("my_exit", TRUE); //dies on error //#endif //dies on error GvIMPORTED_CV_on(exitgp); GV *sleepgp = gv_fetchpv("CORE::GLOBAL::sleep", TRUE, SVt_PVCV); //#if _MSC_VER >= 1600 //GvCV_set(sleepgp, perl_get_cv("my_sleep", TRUE)); //dies on error //#else GvCV(sleepgp) = perl_get_cv("my_sleep", TRUE); //dies on error //#endif GvIMPORTED_CV_on(sleepgp); } //declare our file eval routine. try { init_eval_file(); } catch(const char *err) { //remember... lasterr() is no good if we crap out here, in construction EQC::Common::Log(EQCLog::Error,CP_QUESTS, "perl error: %s", err); throw "failed to install eval_file hook"; } #ifdef EMBPERL_IO_CAPTURE EQC::Common::Log(EQCLog::Debug,CP_QUESTS, "Tying perl output to eqemu logs"); //make a tieable class to capture IO and pass it into EQEMuLog eval_pv( "package EQEmuIO; " // "&boot_EQEmuIO;" "sub TIEHANDLE { my $me = bless {}, $_[0]; $me->PRINT('Creating '.$me); return($me); } " "sub WRITE { } " //dunno why I need to shift off fmt here, but it dosent like without it "sub PRINTF { my $me = shift; my $fmt = shift; $me->PRINT(sprintf($fmt, @_)); } " "sub CLOSE { my $me = shift; $me->PRINT('Closing '.$me); } " "sub DESTROY { my $me = shift; $me->PRINT('Destroying '.$me); } " //this ties us for all packages, just do it in quest since thats kinda 'our' package "package quest;" " if(tied *STDOUT) { untie(*STDOUT); }" " if(tied *STDERR) { untie(*STDERR); }" " tie *STDOUT, 'EQEmuIO';" " tie *STDERR, 'EQEmuIO';" ,FALSE); #endif //EMBPERL_IO_CAPTURE #ifdef EMBPERL_PLUGIN eval_pv( "package plugin; " ,FALSE ); #ifdef EMBPERL_EVAL_COMMANDS try { eval_pv( "use IO::Scalar;" "$plugin::printbuff='';" "tie *PLUGIN,'IO::Scalar',\\$plugin::printbuff;" ,FALSE); } catch(const char *err) { throw "failed to install plugin printhook, do you lack IO::Scalar?"; } #endif EQC::Common::Log(EQCLog::Status,CP_QUESTS, "Loading perlemb plugins."); try { eval_pv("main::eval_file('plugin', 'plugin.pl');", FALSE); } catch(const char *err) { EQC::Common::Log(EQCLog::Status,CP_QUESTS, "Warning - plugin.pl: %s", err); } // Harakiri, this reads all the plugins in \plugins like // check_handin.pl // check_hasitem.pl try { //should probably read the directory in c, instead, so that //I can echo filenames as I do it, but c'mon... I'm lazy and this 1 line reads in all the plugins eval_pv( "if(opendir(D,'plugins')) { " " my @d = readdir(D);" " closedir(D);" " foreach(@d){ " " main::eval_file('plugin','plugins/'.$_)if/\\.pl$/;" " }" "}" ,FALSE); } catch(const char *err) { EQC::Common::Log(EQCLog::Status,CP_QUESTS, "Perl warning while loading plugins : %s", err); } // Harakiri, this reads all the plugins in quest\plugins like try { //should probably read the directory in c, instead, so that //I can echo filenames as I do it, but c'mon... I'm lazy and this 1 line reads in all the plugins eval_pv( "if(opendir(D,'quests/plugins/')) { " " my @d = readdir(D);" " closedir(D);" " foreach(@d){ " " main::eval_file('plugin','quests/plugins/'.$_)if/\\.pl$/;" " }" "}" ,FALSE); } catch(const char *err) { EQC::Common::Log(EQCLog::Status,CP_QUESTS, "Perl warning while loading plugins : %s", err); } #endif //EMBPERL_PLUGIN //Harakiri these are used to create perl bases #commands #ifdef EMBPERL_COMMANDS EQC::Common::Log(EQCLog::Normal,CP_QUESTS, "Loading perl commands..."); try { eval_pv( "package commands;" "main::eval_file('commands', 'commands.pl');" "&commands::commands_init();" , FALSE); } catch(const char *err) { EQC::Common::Log(EQCLog::Error,CP_ZONESERVER, "Warning - commands.pl: %s", err); } EQC::Common::Log(EQCLog::Normal,CP_QUESTS, "Perl commands loaded...."); #endif //EMBPERL_COMMANDS in_use = false; }
static int perl_init_aaaa() { dTARG; dSP; listop_list[0].op_ppaddr = PL_ppaddr[OP_LEAVE]; op_list[0].op_ppaddr = PL_ppaddr[OP_ENTER]; cop_list[0].op_ppaddr = PL_ppaddr[OP_NEXTSTATE]; cop_list[0].cop_warnings = pWARN_STD; CopFILE_set(&cop_list[0], "hello.p"); CopSTASHPV_set(&cop_list[0], "main"); listop_list[1].op_ppaddr = PL_ppaddr[OP_PRINT]; op_list[1].op_ppaddr = PL_ppaddr[OP_PUSHMARK]; svop_list[0].op_ppaddr = PL_ppaddr[OP_CONST]; gv_list[0] = gv_fetchpv("main::/", TRUE, SVt_PV); SvFLAGS(gv_list[0]) = 0x600d; GvFLAGS(gv_list[0]) = 0xa; GvLINE(gv_list[0]) = 0; SvPVX(gv_list[0]) = emptystring; SvREFCNT(gv_list[0]) += 4; GvREFCNT(gv_list[0]) += 1; gv_list[1] = gv_fetchpv("main::stderr", TRUE, SVt_PV); SvFLAGS(gv_list[1]) = 0x600d; GvFLAGS(gv_list[1]) = 0x2; GvLINE(gv_list[1]) = 0; SvPVX(gv_list[1]) = emptystring; SvREFCNT(gv_list[1]) += 2; GvREFCNT(gv_list[1]) += 1; GvSV(gv_list[1]) = &sv_list[0]; GvFILE(gv_list[1]) = "hello.p"; IoIFP((IO*)&sv_list[1])=PerlIO_stderr(); IoOFP((IO*)&sv_list[1])=PerlIO_stderr(); hv0 = gv_stashpv("FileHandle", TRUE); SvSTASH((IO*)&sv_list[1]) = hv0; GvIOp(gv_list[1]) = (IO*)&sv_list[1]; gv_list[2] = gv_fetchpv("main::SIG", TRUE, SVt_PV); SvFLAGS(gv_list[2]) = 0x600d; GvFLAGS(gv_list[2]) = 0xa; GvLINE(gv_list[2]) = 62; SvPVX(gv_list[2]) = emptystring; SvREFCNT(gv_list[2]) += 12; GvREFCNT(gv_list[2]) += 1; gv_list[3] = gv_fetchpv("main::,", TRUE, SVt_PV); SvFLAGS(gv_list[3]) = 0x600d; GvFLAGS(gv_list[3]) = 0xa; GvLINE(gv_list[3]) = 474; SvPVX(gv_list[3]) = emptystring; SvREFCNT(gv_list[3]) += 6; GvREFCNT(gv_list[3]) += 1; gv_list[4] = gv_fetchpv("utf8::unicode_to_native", TRUE, SVt_PV); SvFLAGS(gv_list[4]) = 0x600d; GvFLAGS(gv_list[4]) = 0xa; GvLINE(gv_list[4]) = 0; SvPVX(gv_list[4]) = emptystring; SvREFCNT(gv_list[4]) += 3; GvREFCNT(gv_list[4]) += 1; GvSV(gv_list[4]) = &sv_list[2]; GvCV(gv_list[4]) = (CV*)((perl_get_cv("utf8::unicode_to_native",TRUE))); GvFILE(gv_list[4]) = "hello.p"; gv_list[5] = gv_fetchpv("utf8::encode", TRUE, SVt_PV); SvFLAGS(gv_list[5]) = 0x600d; GvFLAGS(gv_list[5]) = 0x2; GvLINE(gv_list[5]) = 0; SvPVX(gv_list[5]) = emptystring; SvREFCNT(gv_list[5]) += 2; GvREFCNT(gv_list[5]) += 1; GvSV(gv_list[5]) = &sv_list[3]; GvCV(gv_list[5]) = (CV*)((perl_get_cv("utf8::encode",TRUE))); GvFILE(gv_list[5]) = "hello.p"; gv_list[6] = gv_fetchpv("utf8::valid", TRUE, SVt_PV); SvFLAGS(gv_list[6]) = 0x600d; GvFLAGS(gv_list[6]) = 0x2; GvLINE(gv_list[6]) = 0; SvPVX(gv_list[6]) = emptystring; SvREFCNT(gv_list[6]) += 2; GvREFCNT(gv_list[6]) += 1; GvSV(gv_list[6]) = &sv_list[4]; GvCV(gv_list[6]) = (CV*)((perl_get_cv("utf8::valid",TRUE))); GvFILE(gv_list[6]) = "hello.p"; gv_list[7] = gv_fetchpv("utf8::native_to_unicode", TRUE, SVt_PV); SvFLAGS(gv_list[7]) = 0x600d; GvFLAGS(gv_list[7]) = 0x2; GvLINE(gv_list[7]) = 0; SvPVX(gv_list[7]) = emptystring; SvREFCNT(gv_list[7]) += 2; GvREFCNT(gv_list[7]) += 1; GvSV(gv_list[7]) = &sv_list[5]; GvCV(gv_list[7]) = (CV*)((perl_get_cv("utf8::native_to_unicode",TRUE))); GvFILE(gv_list[7]) = "hello.p"; gv_list[8] = gv_fetchpv("utf8::decode", TRUE, SVt_PV); SvFLAGS(gv_list[8]) = 0x600d; GvFLAGS(gv_list[8]) = 0x2; GvLINE(gv_list[8]) = 0; SvPVX(gv_list[8]) = emptystring; SvREFCNT(gv_list[8]) += 2; GvREFCNT(gv_list[8]) += 1; GvSV(gv_list[8]) = &sv_list[6]; GvCV(gv_list[8]) = (CV*)((perl_get_cv("utf8::decode",TRUE))); GvFILE(gv_list[8]) = "hello.p"; gv_list[9] = gv_fetchpv("utf8::downgrade", TRUE, SVt_PV); SvFLAGS(gv_list[9]) = 0x600d; GvFLAGS(gv_list[9]) = 0x2; GvLINE(gv_list[9]) = 0; SvPVX(gv_list[9]) = emptystring; SvREFCNT(gv_list[9]) += 2; GvREFCNT(gv_list[9]) += 1; GvSV(gv_list[9]) = &sv_list[7]; GvCV(gv_list[9]) = (CV*)((perl_get_cv("utf8::downgrade",TRUE))); GvFILE(gv_list[9]) = "hello.p"; gv_list[10] = gv_fetchpv("utf8::upgrade", TRUE, SVt_PV); SvFLAGS(gv_list[10]) = 0x600d; GvFLAGS(gv_list[10]) = 0x2; GvLINE(gv_list[10]) = 0; SvPVX(gv_list[10]) = emptystring; SvREFCNT(gv_list[10]) += 2; GvREFCNT(gv_list[10]) += 1; GvSV(gv_list[10]) = &sv_list[8]; GvCV(gv_list[10]) = (CV*)((perl_get_cv("utf8::upgrade",TRUE))); GvFILE(gv_list[10]) = "hello.p"; gv_list[11] = gv_fetchpv("utf8::is_utf8", TRUE, SVt_PV); SvFLAGS(gv_list[11]) = 0x600d; GvFLAGS(gv_list[11]) = 0x2; GvLINE(gv_list[11]) = 0; SvPVX(gv_list[11]) = emptystring; SvREFCNT(gv_list[11]) += 2; GvREFCNT(gv_list[11]) += 1; GvSV(gv_list[11]) = &sv_list[9]; GvCV(gv_list[11]) = (CV*)((perl_get_cv("utf8::is_utf8",TRUE))); GvFILE(gv_list[11]) = "hello.p"; gv_list[12] = gv_fetchpv("main::\"", TRUE, SVt_PV); SvFLAGS(gv_list[12]) = 0x600d; GvFLAGS(gv_list[12]) = 0xa; GvLINE(gv_list[12]) = 0; SvPVX(gv_list[12]) = emptystring; SvREFCNT(gv_list[12]) += 10; GvREFCNT(gv_list[12]) += 1; gv_list[13] = gv_fetchpv("main::stdout", TRUE, SVt_PV); SvFLAGS(gv_list[13]) = 0x600d; GvFLAGS(gv_list[13]) = 0x2; GvLINE(gv_list[13]) = 0; SvPVX(gv_list[13]) = emptystring; SvREFCNT(gv_list[13]) += 2; GvREFCNT(gv_list[13]) += 1; GvSV(gv_list[13]) = &sv_list[10]; GvFILE(gv_list[13]) = "hello.p"; IoIFP((IO*)&sv_list[11])=PerlIO_stdout(); IoOFP((IO*)&sv_list[11])=PerlIO_stdout(); SvSTASH((IO*)&sv_list[11]) = hv0; GvIOp(gv_list[13]) = (IO*)&sv_list[11]; gv_list[14] = gv_fetchpv("main::\022", TRUE, SVt_PV); SvFLAGS(gv_list[14]) = 0x600d; GvFLAGS(gv_list[14]) = 0x2; GvLINE(gv_list[14]) = 0; SvPVX(gv_list[14]) = emptystring; SvREFCNT(gv_list[14]) += 2; GvREFCNT(gv_list[14]) += 1; gv_list[15] = gv_fetchpv("main::|", TRUE, SVt_PV); SvFLAGS(gv_list[15]) = 0x600d; GvFLAGS(gv_list[15]) = 0xa; GvLINE(gv_list[15]) = 466; SvPVX(gv_list[15]) = emptystring; SvREFCNT(gv_list[15]) += 5; GvREFCNT(gv_list[15]) += 1; gv_list[16] = gv_fetchpv("Regexp::DESTROY", TRUE, SVt_PV); SvFLAGS(gv_list[16]) = 0x600d; GvFLAGS(gv_list[16]) = 0x2; GvLINE(gv_list[16]) = 0; SvPVX(gv_list[16]) = emptystring; SvREFCNT(gv_list[16]) += 2; GvREFCNT(gv_list[16]) += 1; GvSV(gv_list[16]) = &sv_list[12]; GvCV(gv_list[16]) = (CV*)((perl_get_cv("Regexp::DESTROY",TRUE))); GvFILE(gv_list[16]) = "hello.p"; gv_list[17] = gv_fetchpv("main::\f", TRUE, SVt_PV); SvFLAGS(gv_list[17]) = 0x600d; GvFLAGS(gv_list[17]) = 0xa; GvLINE(gv_list[17]) = 554; SvPVX(gv_list[17]) = emptystring; SvREFCNT(gv_list[17]) += 4; GvREFCNT(gv_list[17]) += 1; gv_list[18] = gv_fetchpv("main::^", TRUE, SVt_PV); SvFLAGS(gv_list[18]) = 0x600d; GvFLAGS(gv_list[18]) = 0xa; GvLINE(gv_list[18]) = 538; SvPVX(gv_list[18]) = emptystring; SvREFCNT(gv_list[18]) += 4; GvREFCNT(gv_list[18]) += 1; gv_list[19] = gv_fetchpv("main::\001", TRUE, SVt_PV); SvFLAGS(gv_list[19]) = 0x600d; GvFLAGS(gv_list[19]) = 0xa; GvLINE(gv_list[19]) = 562; SvPVX(gv_list[19]) = emptystring; SvREFCNT(gv_list[19]) += 5; GvREFCNT(gv_list[19]) += 1; gv_list[20] = gv_fetchpv("main::$", TRUE, SVt_PV); SvFLAGS(gv_list[20]) = 0x600d; GvFLAGS(gv_list[20]) = 0x2; GvLINE(gv_list[20]) = 0; SvPVX(gv_list[20]) = emptystring; SvREFCNT(gv_list[20]) += 2; GvREFCNT(gv_list[20]) += 1; gv_list[21] = gv_fetchpv("main::\\", TRUE, SVt_PV); SvFLAGS(gv_list[21]) = 0x600d; GvFLAGS(gv_list[21]) = 0xa; GvLINE(gv_list[21]) = 441; SvPVX(gv_list[21]) = emptystring; SvREFCNT(gv_list[21]) += 9; GvREFCNT(gv_list[21]) += 1; gv_list[22] = gv_fetchpv("main::_</usr/lib/perl5/5.8.5/i386-linux-thread-multi/XSLoader.pm", TRUE, SVt_PV); SvFLAGS(gv_list[22]) = 0x600d; GvFLAGS(gv_list[22]) = 0x2; GvLINE(gv_list[22]) = 4294967295; SvPVX(gv_list[22]) = emptystring; SvREFCNT(gv_list[22]) += 2; GvREFCNT(gv_list[22]) += 1; xpv_list[0].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/i386-linux-thread-multi/XSLoader.pm", 56); GvSV(gv_list[22]) = &sv_list[13]; GvFILE(gv_list[22]) = "/usr/lib/perl5/5.8.5/i386-linux-thread-multi/XSLoader.pm"; gv_list[23] = gv_fetchpv("main::~", TRUE, SVt_PV); SvFLAGS(gv_list[23]) = 0x600d; GvFLAGS(gv_list[23]) = 0xa; GvLINE(gv_list[23]) = 530; SvPVX(gv_list[23]) = emptystring; SvREFCNT(gv_list[23]) += 4; GvREFCNT(gv_list[23]) += 1; gv_list[24] = gv_fetchpv("main::-", TRUE, SVt_PV); SvFLAGS(gv_list[24]) = 0x600d; GvFLAGS(gv_list[24]) = 0xa; GvLINE(gv_list[24]) = 0; SvPVX(gv_list[24]) = emptystring; SvREFCNT(gv_list[24]) += 4; GvREFCNT(gv_list[24]) += 1; gv_list[25] = gv_fetchpv("main::_<perlmain.c", TRUE, SVt_PV); SvFLAGS(gv_list[25]) = 0x600d; GvFLAGS(gv_list[25]) = 0x2; GvLINE(gv_list[25]) = 0; SvPVX(gv_list[25]) = emptystring; SvREFCNT(gv_list[25]) += 2; GvREFCNT(gv_list[25]) += 1; xpv_list[1].xpv_pv = savepvn("perlmain.c", 10); GvSV(gv_list[25]) = &sv_list[14]; GvFILE(gv_list[25]) = "hello.p"; gv_list[26] = gv_fetchpv("main::_</usr/lib/perl5/5.8.5/File/Spec/Unix.pm", TRUE, SVt_PV); SvFLAGS(gv_list[26]) = 0x600d; GvFLAGS(gv_list[26]) = 0x2; GvLINE(gv_list[26]) = 98; SvPVX(gv_list[26]) = emptystring; SvREFCNT(gv_list[26]) += 2; GvREFCNT(gv_list[26]) += 1; xpv_list[2].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/File/Spec/Unix.pm", 38); GvSV(gv_list[26]) = &sv_list[15]; GvFILE(gv_list[26]) = "x/\031\b q\024\b\332T\305"; gv_list[27] = gv_fetchpv("main::_</usr/lib/perl5/5.8.5/i386-linux-thread-multi/auto/B/C/C.so", TRUE, SVt_PV); SvFLAGS(gv_list[27]) = 0x600d; GvFLAGS(gv_list[27]) = 0x2; GvLINE(gv_list[27]) = 87; SvPVX(gv_list[27]) = emptystring; SvREFCNT(gv_list[27]) += 2; GvREFCNT(gv_list[27]) += 1; xpv_list[3].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/i386-linux-thread-multi/auto/B/C/C.so", 58); GvSV(gv_list[27]) = &sv_list[16]; GvFILE(gv_list[27]) = "/usr/lib/perl5/5.8.5/i386-linux-thread-multi/XSLoader.pm"; gv_list[28] = gv_fetchpv("main::_<universal.c", TRUE, SVt_PV); SvFLAGS(gv_list[28]) = 0x600d; GvFLAGS(gv_list[28]) = 0x2; GvLINE(gv_list[28]) = 0; SvPVX(gv_list[28]) = emptystring; SvREFCNT(gv_list[28]) += 2; GvREFCNT(gv_list[28]) += 1; xpv_list[4].xpv_pv = savepvn("universal.c", 11); GvSV(gv_list[28]) = &sv_list[17]; GvFILE(gv_list[28]) = "hello.p"; gv_list[29] = gv_fetchpv("main::BEGIN", TRUE, SVt_PV); SvFLAGS(gv_list[29]) = 0x600d; GvFLAGS(gv_list[29]) = 0x2; GvLINE(gv_list[29]) = 0; SvPVX(gv_list[29]) = emptystring; SvREFCNT(gv_list[29]) += 2; GvREFCNT(gv_list[29]) += 1; GvSV(gv_list[29]) = &sv_list[18]; GvFILE(gv_list[29]) = "hello.p"; gv_list[30] = gv_fetchpv("main::_<xsutils.c", TRUE, SVt_PV); SvFLAGS(gv_list[30]) = 0x600d; GvFLAGS(gv_list[30]) = 0x2; GvLINE(gv_list[30]) = 0; SvPVX(gv_list[30]) = emptystring; SvREFCNT(gv_list[30]) += 2; GvREFCNT(gv_list[30]) += 1; xpv_list[5].xpv_pv = savepvn("xsutils.c", 9); GvSV(gv_list[30]) = &sv_list[19]; GvFILE(gv_list[30]) = "hello.p"; gv_list[31] = gv_fetchpv("main::!", TRUE, SVt_PV); SvFLAGS(gv_list[31]) = 0x600d; GvFLAGS(gv_list[31]) = 0xa; GvLINE(gv_list[31]) = 2054; SvPVX(gv_list[31]) = emptystring; SvREFCNT(gv_list[31]) += 3; GvREFCNT(gv_list[31]) += 1; GvFILE(gv_list[31]) = ""; gv_list[32] = gv_fetchpv("main::\024AINT", TRUE, SVt_PV); SvFLAGS(gv_list[32]) = 0x600d; GvFLAGS(gv_list[32]) = 0xa; GvLINE(gv_list[32]) = 1589; SvPVX(gv_list[32]) = emptystring; SvREFCNT(gv_list[32]) += 3; GvREFCNT(gv_list[32]) += 1; sv_magic((SV*)&sv_list[20], (SV*)gv_list[32], '\000', "\024AINT", 5); GvSV(gv_list[32]) = &sv_list[20]; GvFILE(gv_list[32]) = ""; gv_list[33] = gv_fetchpv("main::\017", TRUE, SVt_PV); SvFLAGS(gv_list[33]) = 0x600d; GvFLAGS(gv_list[33]) = 0xa; GvLINE(gv_list[33]) = 55; SvPVX(gv_list[33]) = emptystring; SvREFCNT(gv_list[33]) += 4; GvREFCNT(gv_list[33]) += 1; gv_list[34] = gv_fetchpv("main::%", TRUE, SVt_PV); SvFLAGS(gv_list[34]) = 0x600d; GvFLAGS(gv_list[34]) = 0xa; GvLINE(gv_list[34]) = 506; SvPVX(gv_list[34]) = emptystring; SvREFCNT(gv_list[34]) += 4; GvREFCNT(gv_list[34]) += 1; gv_list[35] = gv_fetchpv("main::\030", TRUE, SVt_PV); SvFLAGS(gv_list[35]) = 0x600d; GvFLAGS(gv_list[35]) = 0x2; GvLINE(gv_list[35]) = 0; SvPVX(gv_list[35]) = emptystring; SvREFCNT(gv_list[35]) += 2; GvREFCNT(gv_list[35]) += 1; gv_list[36] = gv_fetchpv("main::_", TRUE, SVt_PV); SvFLAGS(gv_list[36]) = 0x630d; GvFLAGS(gv_list[36]) = 0xa; GvLINE(gv_list[36]) = 0; SvPVX(gv_list[36]) = emptystring; SvREFCNT(gv_list[36]) += 470; GvREFCNT(gv_list[36]) += 1; gv_list[37] = gv_fetchpv("main::+", TRUE, SVt_PV); SvFLAGS(gv_list[37]) = 0x600d; GvFLAGS(gv_list[37]) = 0x2; GvLINE(gv_list[37]) = 0; SvPVX(gv_list[37]) = emptystring; SvREFCNT(gv_list[37]) += 2; GvREFCNT(gv_list[37]) += 1; gv_list[38] = gv_fetchpv("Internals::SvREFCNT", TRUE, SVt_PV); SvFLAGS(gv_list[38]) = 0x600d; GvFLAGS(gv_list[38]) = 0x2; GvLINE(gv_list[38]) = 0; SvPVX(gv_list[38]) = emptystring; SvREFCNT(gv_list[38]) += 2; GvREFCNT(gv_list[38]) += 1; GvSV(gv_list[38]) = &sv_list[21]; GvCV(gv_list[38]) = (CV*)((perl_get_cv("Internals::SvREFCNT",TRUE))); GvFILE(gv_list[38]) = "hello.p"; gv_list[39] = gv_fetchpv("Internals::hv_clear_placeholders", TRUE, SVt_PV); SvFLAGS(gv_list[39]) = 0x600d; GvFLAGS(gv_list[39]) = 0x2; GvLINE(gv_list[39]) = 0; SvPVX(gv_list[39]) = emptystring; SvREFCNT(gv_list[39]) += 2; GvREFCNT(gv_list[39]) += 1; GvSV(gv_list[39]) = &sv_list[22]; GvCV(gv_list[39]) = (CV*)((perl_get_cv("Internals::hv_clear_placeholders",TRUE))); GvFILE(gv_list[39]) = "hello.p"; gv_list[40] = gv_fetchpv("Internals::hash_seed", TRUE, SVt_PV); SvFLAGS(gv_list[40]) = 0x600d; GvFLAGS(gv_list[40]) = 0x2; GvLINE(gv_list[40]) = 0; SvPVX(gv_list[40]) = emptystring; SvREFCNT(gv_list[40]) += 2; GvREFCNT(gv_list[40]) += 1; GvSV(gv_list[40]) = &sv_list[23]; GvCV(gv_list[40]) = (CV*)((perl_get_cv("Internals::hash_seed",TRUE))); GvFILE(gv_list[40]) = "hello.p"; gv_list[41] = gv_fetchpv("Internals::SvREADONLY", TRUE, SVt_PV); SvFLAGS(gv_list[41]) = 0x600d; GvFLAGS(gv_list[41]) = 0x2; GvLINE(gv_list[41]) = 0; SvPVX(gv_list[41]) = emptystring; SvREFCNT(gv_list[41]) += 2; GvREFCNT(gv_list[41]) += 1; GvSV(gv_list[41]) = &sv_list[24]; GvCV(gv_list[41]) = (CV*)((perl_get_cv("Internals::SvREADONLY",TRUE))); GvFILE(gv_list[41]) = "hello.p"; gv_list[42] = gv_fetchpv("Internals::HvREHASH", TRUE, SVt_PV); SvFLAGS(gv_list[42]) = 0x600d; GvFLAGS(gv_list[42]) = 0x2; GvLINE(gv_list[42]) = 0; SvPVX(gv_list[42]) = emptystring; SvREFCNT(gv_list[42]) += 2; GvREFCNT(gv_list[42]) += 1; GvSV(gv_list[42]) = &sv_list[25]; GvCV(gv_list[42]) = (CV*)((perl_get_cv("Internals::HvREHASH",TRUE))); GvFILE(gv_list[42]) = "hello.p"; gv_list[43] = gv_fetchpv("Internals::rehash_seed", TRUE, SVt_PV); SvFLAGS(gv_list[43]) = 0x600d; GvFLAGS(gv_list[43]) = 0x2; GvLINE(gv_list[43]) = 0; SvPVX(gv_list[43]) = emptystring; SvREFCNT(gv_list[43]) += 2; GvREFCNT(gv_list[43]) += 1; GvSV(gv_list[43]) = &sv_list[26]; GvCV(gv_list[43]) = (CV*)((perl_get_cv("Internals::rehash_seed",TRUE))); GvFILE(gv_list[43]) = "hello.p"; gv_list[44] = gv_fetchpv("main::STDIN", TRUE, SVt_PV); SvFLAGS(gv_list[44]) = 0x600d; GvFLAGS(gv_list[44]) = 0xa; GvLINE(gv_list[44]) = 0; SvPVX(gv_list[44]) = emptystring; SvREFCNT(gv_list[44]) += 2; GvREFCNT(gv_list[44]) += 1; gv_list[45] = gv_fetchpv("DB::args", TRUE, SVt_PV); SvFLAGS(gv_list[45]) = 0x600d; GvFLAGS(gv_list[45]) = 0xa; GvLINE(gv_list[45]) = 431; SvPVX(gv_list[45]) = emptystring; SvREFCNT(gv_list[45]) += 4; GvREFCNT(gv_list[45]) += 1; GvSV(gv_list[45]) = &sv_list[27]; GvAV(gv_list[45]) = (AV*)&sv_list[28]; GvFILE(gv_list[45]) = "\260\r\016\b"; gv_list[46] = gv_fetchpv("main::\026", TRUE, SVt_PV); SvFLAGS(gv_list[46]) = 0x600d; GvFLAGS(gv_list[46]) = 0xa; GvLINE(gv_list[46]) = 30; SvPVX(gv_list[46]) = emptystring; SvREFCNT(gv_list[46]) += 2; GvREFCNT(gv_list[46]) += 1; gv_list[47] = gv_fetchpv("main::=", TRUE, SVt_PV); SvFLAGS(gv_list[47]) = 0x600d; GvFLAGS(gv_list[47]) = 0xa; GvLINE(gv_list[47]) = 514; SvPVX(gv_list[47]) = emptystring; SvREFCNT(gv_list[47]) += 4; GvREFCNT(gv_list[47]) += 1; gv_list[48] = gv_fetchpv("main::2", TRUE, SVt_PV); SvFLAGS(gv_list[48]) = 0x600d; GvFLAGS(gv_list[48]) = 0xa; GvLINE(gv_list[48]) = 257; SvPVX(gv_list[48]) = emptystring; SvREFCNT(gv_list[48]) += 6; GvREFCNT(gv_list[48]) += 1; gv_list[49] = gv_fetchpv("main::_<Fcntl.c", TRUE, SVt_PV); SvFLAGS(gv_list[49]) = 0x600d; GvFLAGS(gv_list[49]) = 0x2; GvLINE(gv_list[49]) = 92; SvPVX(gv_list[49]) = emptystring; SvREFCNT(gv_list[49]) += 2; GvREFCNT(gv_list[49]) += 1; xpv_list[6].xpv_pv = savepvn("Fcntl.c", 7); GvSV(gv_list[49]) = &sv_list[29]; GvFILE(gv_list[49]) = "/usr/lib/perl5/5.8.5/i386-linux-thread-multi/XSLoader.pm"; gv_list[50] = gv_fetchpv("main::1", TRUE, SVt_PV); SvFLAGS(gv_list[50]) = 0x600d; GvFLAGS(gv_list[50]) = 0xa; GvLINE(gv_list[50]) = 74; SvPVX(gv_list[50]) = emptystring; SvREFCNT(gv_list[50]) += 28; GvREFCNT(gv_list[50]) += 1; gv_list[51] = gv_fetchpv("main::_<IO.c", TRUE, SVt_PV); SvFLAGS(gv_list[51]) = 0x600d; GvFLAGS(gv_list[51]) = 0x2; GvLINE(gv_list[51]) = 92; SvPVX(gv_list[51]) = emptystring; SvREFCNT(gv_list[51]) += 2; GvREFCNT(gv_list[51]) += 1; xpv_list[7].xpv_pv = savepvn("IO.c", 4); GvSV(gv_list[51]) = &sv_list[30]; GvFILE(gv_list[51]) = "/usr/lib/perl5/5.8.5/i386-linux-thread-multi/XSLoader.pm"; gv_list[52] = gv_fetchpv("main::\027ARNING_BITS", TRUE, SVt_PV); SvFLAGS(gv_list[52]) = 0x600d; GvFLAGS(gv_list[52]) = 0xa; GvLINE(gv_list[52]) = 341; SvPVX(gv_list[52]) = emptystring; SvREFCNT(gv_list[52]) += 6; GvREFCNT(gv_list[52]) += 1; sv_magic((SV*)&sv_list[31], (SV*)gv_list[52], '\000', "\027ARNING_BITS", 12); GvSV(gv_list[52]) = &sv_list[31]; GvFILE(gv_list[52]) = "\260\r\016\b"; gv_list[53] = gv_fetchpv("main::_<B.c", TRUE, SVt_PV); SvFLAGS(gv_list[53]) = 0x600d; GvFLAGS(gv_list[53]) = 0x2; GvLINE(gv_list[53]) = 92; SvPVX(gv_list[53]) = emptystring; SvREFCNT(gv_list[53]) += 2; GvREFCNT(gv_list[53]) += 1; xpv_list[8].xpv_pv = savepvn("B.c", 3); GvSV(gv_list[53]) = &sv_list[32]; GvFILE(gv_list[53]) = "/usr/lib/perl5/5.8.5/i386-linux-thread-multi/XSLoader.pm"; gv_list[54] = gv_fetchpv("main::_<DynaLoader.c", TRUE, SVt_PV); SvFLAGS(gv_list[54]) = 0x600d; GvFLAGS(gv_list[54]) = 0x2; GvLINE(gv_list[54]) = 16; SvPVX(gv_list[54]) = emptystring; SvREFCNT(gv_list[54]) += 2; GvREFCNT(gv_list[54]) += 1; xpv_list[9].xpv_pv = savepvn("DynaLoader.c", 12); GvSV(gv_list[54]) = &sv_list[33]; GvFILE(gv_list[54]) = "\335\367\302"; gv_list[55] = gv_fetchpv("main::_</usr/lib/perl5/5.8.5/i386-linux-thread-multi/auto/IO/IO.so", TRUE, SVt_PV); SvFLAGS(gv_list[55]) = 0x600d; GvFLAGS(gv_list[55]) = 0x2; GvLINE(gv_list[55]) = 87; SvPVX(gv_list[55]) = emptystring; SvREFCNT(gv_list[55]) += 2; GvREFCNT(gv_list[55]) += 1; xpv_list[10].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/i386-linux-thread-multi/auto/IO/IO.so", 58); GvSV(gv_list[55]) = &sv_list[34]; GvFILE(gv_list[55]) = "/usr/lib/perl5/5.8.5/i386-linux-thread-multi/XSLoader.pm"; gv_list[56] = gv_fetchpv("attributes::bootstrap", TRUE, SVt_PV); SvFLAGS(gv_list[56]) = 0x600d; GvFLAGS(gv_list[56]) = 0x2; GvLINE(gv_list[56]) = 0; SvPVX(gv_list[56]) = emptystring; SvREFCNT(gv_list[56]) += 2; GvREFCNT(gv_list[56]) += 1; GvSV(gv_list[56]) = &sv_list[35]; GvFILE(gv_list[56]) = "hello.p"; gv_list[57] = gv_fetchpv("main::stdin", TRUE, SVt_PV); SvFLAGS(gv_list[57]) = 0x600d; GvFLAGS(gv_list[57]) = 0x2; GvLINE(gv_list[57]) = 0; SvPVX(gv_list[57]) = emptystring; SvREFCNT(gv_list[57]) += 2; GvREFCNT(gv_list[57]) += 1; GvSV(gv_list[57]) = &sv_list[36]; GvFILE(gv_list[57]) = "hello.p"; IoIFP((IO*)&sv_list[37])=PerlIO_stdin(); IoOFP((IO*)&sv_list[37])=PerlIO_stdin(); SvSTASH((IO*)&sv_list[37]) = hv0; GvIOp(gv_list[57]) = (IO*)&sv_list[37]; gv_list[58] = gv_fetchpv("main::ARGV", TRUE, SVt_PV); SvFLAGS(gv_list[58]) = 0x600d; GvFLAGS(gv_list[58]) = 0x2; GvLINE(gv_list[58]) = 0; SvPVX(gv_list[58]) = emptystring; SvREFCNT(gv_list[58]) += 2; GvREFCNT(gv_list[58]) += 1; gv_list[59] = gv_fetchpv("main::INC", TRUE, SVt_PV); SvFLAGS(gv_list[59]) = 0x600d; GvFLAGS(gv_list[59]) = 0xa; GvLINE(gv_list[59]) = 0; SvPVX(gv_list[59]) = emptystring; SvREFCNT(gv_list[59]) += 7; GvREFCNT(gv_list[59]) += 1; GvSV(gv_list[59]) = &sv_list[38]; xpv_list[11].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/i386-linux-thread-multi", 44); xpv_list[12].xpv_pv = savepvn("/usr/lib/perl5/5.8.5", 20); xpv_list[13].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi", 54); xpv_list[14].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi", 54); xpv_list[15].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi", 54); xpv_list[16].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.2/i386-linux-thread-multi", 54); xpv_list[17].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.1/i386-linux-thread-multi", 54); xpv_list[18].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi", 54); xpv_list[19].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.5", 30); xpv_list[20].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.4", 30); xpv_list[21].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.3", 30); xpv_list[22].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.2", 30); xpv_list[23].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.1", 30); xpv_list[24].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.0", 30); xpv_list[25].xpv_pv = savepvn("/usr/lib/perl5/site_perl", 24); xpv_list[26].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi", 56); xpv_list[27].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi", 56); xpv_list[28].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi", 56); xpv_list[29].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.2/i386-linux-thread-multi", 56); xpv_list[30].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.1/i386-linux-thread-multi", 56); xpv_list[31].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi", 56); xpv_list[32].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.5", 32); xpv_list[33].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.4", 32); xpv_list[34].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.3", 32); xpv_list[35].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.2", 32); xpv_list[36].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.1", 32); xpv_list[37].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.0", 32); xpv_list[38].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl", 26); xpv_list[39].xpv_pv = savepvn(".", 1); xpv_list[40].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/i386-linux-thread-multi", 44); xpv_list[41].xpv_pv = savepvn("/usr/lib/perl5/5.8.5", 20); xpv_list[42].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi", 54); xpv_list[43].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi", 54); xpv_list[44].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi", 54); xpv_list[45].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.2/i386-linux-thread-multi", 54); xpv_list[46].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.1/i386-linux-thread-multi", 54); xpv_list[47].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi", 54); xpv_list[48].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.5", 30); xpv_list[49].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.4", 30); xpv_list[50].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.3", 30); xpv_list[51].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.2", 30); xpv_list[52].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.1", 30); xpv_list[53].xpv_pv = savepvn("/usr/lib/perl5/site_perl/5.8.0", 30); xpv_list[54].xpv_pv = savepvn("/usr/lib/perl5/site_perl", 24); xpv_list[55].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi", 56); xpv_list[56].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi", 56); xpv_list[57].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi", 56); xpv_list[58].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.2/i386-linux-thread-multi", 56); xpv_list[59].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.1/i386-linux-thread-multi", 56); xpv_list[60].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi", 56); xpv_list[61].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.5", 32); xpv_list[62].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.4", 32); xpv_list[63].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.3", 32); xpv_list[64].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.2", 32); xpv_list[65].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.1", 32); xpv_list[66].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl/5.8.0", 32); xpv_list[67].xpv_pv = savepvn("/usr/lib/perl5/vendor_perl", 26); xpv_list[68].xpv_pv = savepvn(".", 1); { SV **svp; AV *av = (AV*)&sv_list[39]; av_extend(av, 57); svp = AvARRAY(av); *svp++ = (SV*)&sv_list[40]; *svp++ = (SV*)&sv_list[41]; *svp++ = (SV*)&sv_list[42]; *svp++ = (SV*)&sv_list[43]; *svp++ = (SV*)&sv_list[44]; *svp++ = (SV*)&sv_list[45]; *svp++ = (SV*)&sv_list[46]; *svp++ = (SV*)&sv_list[47]; *svp++ = (SV*)&sv_list[48]; *svp++ = (SV*)&sv_list[49]; *svp++ = (SV*)&sv_list[50]; *svp++ = (SV*)&sv_list[51]; *svp++ = (SV*)&sv_list[52]; *svp++ = (SV*)&sv_list[53]; *svp++ = (SV*)&sv_list[54]; *svp++ = (SV*)&sv_list[55]; *svp++ = (SV*)&sv_list[56]; *svp++ = (SV*)&sv_list[57]; *svp++ = (SV*)&sv_list[58]; *svp++ = (SV*)&sv_list[59]; *svp++ = (SV*)&sv_list[60]; *svp++ = (SV*)&sv_list[61]; *svp++ = (SV*)&sv_list[62]; *svp++ = (SV*)&sv_list[63]; *svp++ = (SV*)&sv_list[64]; *svp++ = (SV*)&sv_list[65]; *svp++ = (SV*)&sv_list[66]; *svp++ = (SV*)&sv_list[67]; *svp++ = (SV*)&sv_list[68]; *svp++ = (SV*)&sv_list[69]; *svp++ = (SV*)&sv_list[70]; *svp++ = (SV*)&sv_list[71]; *svp++ = (SV*)&sv_list[72]; *svp++ = (SV*)&sv_list[73]; *svp++ = (SV*)&sv_list[74]; *svp++ = (SV*)&sv_list[75]; *svp++ = (SV*)&sv_list[76]; *svp++ = (SV*)&sv_list[77]; *svp++ = (SV*)&sv_list[78]; *svp++ = (SV*)&sv_list[79]; *svp++ = (SV*)&sv_list[80]; *svp++ = (SV*)&sv_list[81]; *svp++ = (SV*)&sv_list[82]; *svp++ = (SV*)&sv_list[83]; *svp++ = (SV*)&sv_list[84]; *svp++ = (SV*)&sv_list[85]; *svp++ = (SV*)&sv_list[86]; *svp++ = (SV*)&sv_list[87]; *svp++ = (SV*)&sv_list[88]; *svp++ = (SV*)&sv_list[89]; *svp++ = (SV*)&sv_list[90]; *svp++ = (SV*)&sv_list[91]; *svp++ = (SV*)&sv_list[92]; *svp++ = (SV*)&sv_list[93]; *svp++ = (SV*)&sv_list[94]; *svp++ = (SV*)&sv_list[95]; *svp++ = (SV*)&sv_list[96]; *svp++ = (SV*)&sv_list[97]; AvFILLp(av) = 57; } GvAV(gv_list[59]) = (AV*)&sv_list[39]; GvHV(gv_list[59]) = (HV*)&sv_list[98]; GvFILE(gv_list[59]) = ""; gv_list[60] = gv_fetchpv("main::ENV", TRUE, SVt_PV); SvFLAGS(gv_list[60]) = 0x600d; GvFLAGS(gv_list[60]) = 0xa; GvLINE(gv_list[60]) = 0; SvPVX(gv_list[60]) = emptystring; SvREFCNT(gv_list[60]) += 5; GvREFCNT(gv_list[60]) += 1; gv_list[61] = gv_fetchpv("main::_<perlio.c", TRUE, SVt_PV); SvFLAGS(gv_list[61]) = 0x600d; GvFLAGS(gv_list[61]) = 0x2; GvLINE(gv_list[61]) = 0; SvPVX(gv_list[61]) = emptystring; SvREFCNT(gv_list[61]) += 2; GvREFCNT(gv_list[61]) += 1; xpv_list[69].xpv_pv = savepvn("perlio.c", 8); GvSV(gv_list[61]) = &sv_list[99]; GvFILE(gv_list[61]) = "hello.p"; gv_list[62] = gv_fetchpv("main:::", TRUE, SVt_PV); SvFLAGS(gv_list[62]) = 0x600d; GvFLAGS(gv_list[62]) = 0xa; GvLINE(gv_list[62]) = 546; SvPVX(gv_list[62]) = emptystring; SvREFCNT(gv_list[62]) += 4; GvREFCNT(gv_list[62]) += 1; gv_list[63] = gv_fetchpv("PerlIO::get_layers", TRUE, SVt_PV); SvFLAGS(gv_list[63]) = 0x600d; GvFLAGS(gv_list[63]) = 0x2; GvLINE(gv_list[63]) = 0; SvPVX(gv_list[63]) = emptystring; SvREFCNT(gv_list[63]) += 2; GvREFCNT(gv_list[63]) += 1; GvSV(gv_list[63]) = &sv_list[100]; GvCV(gv_list[63]) = (CV*)((perl_get_cv("PerlIO::get_layers",TRUE))); GvFILE(gv_list[63]) = "hello.p"; gv_list[64] = gv_fetchpv("PerlIO::Layer::NoWarnings", TRUE, SVt_PV); SvFLAGS(gv_list[64]) = 0x600d; GvFLAGS(gv_list[64]) = 0x2; GvLINE(gv_list[64]) = 0; SvPVX(gv_list[64]) = emptystring; SvREFCNT(gv_list[64]) += 2; GvREFCNT(gv_list[64]) += 1; GvSV(gv_list[64]) = &sv_list[101]; GvCV(gv_list[64]) = (CV*)((perl_get_cv("PerlIO::Layer::NoWarnings",TRUE))); GvFILE(gv_list[64]) = "hello.p"; gv_list[65] = gv_fetchpv("PerlIO::Layer::find", TRUE, SVt_PV); SvFLAGS(gv_list[65]) = 0x600d; GvFLAGS(gv_list[65]) = 0x2; GvLINE(gv_list[65]) = 0; SvPVX(gv_list[65]) = emptystring; SvREFCNT(gv_list[65]) += 2; GvREFCNT(gv_list[65]) += 1; GvSV(gv_list[65]) = &sv_list[102]; GvCV(gv_list[65]) = (CV*)((perl_get_cv("PerlIO::Layer::find",TRUE))); GvFILE(gv_list[65]) = "hello.p"; gv_list[66] = gv_fetchpv("main::0", TRUE, SVt_PV); SvFLAGS(gv_list[66]) = 0x600d; GvFLAGS(gv_list[66]) = 0xa; GvLINE(gv_list[66]) = 0; SvPVX(gv_list[66]) = emptystring; SvREFCNT(gv_list[66]) += 5; GvREFCNT(gv_list[66]) += 1; gv_list[67] = gv_fetchpv("main::.", TRUE, SVt_PV); SvFLAGS(gv_list[67]) = 0x600d; GvFLAGS(gv_list[67]) = 0xa; GvLINE(gv_list[67]) = 496; SvPVX(gv_list[67]) = emptystring; SvREFCNT(gv_list[67]) += 5; GvREFCNT(gv_list[67]) += 1; gv_list[68] = gv_fetchpv("main::\b", TRUE, SVt_PV); SvFLAGS(gv_list[68]) = 0x600d; GvFLAGS(gv_list[68]) = 0xa; GvLINE(gv_list[68]) = 0; SvPVX(gv_list[68]) = emptystring; SvREFCNT(gv_list[68]) += 5; GvREFCNT(gv_list[68]) += 1; gv_list[69] = gv_fetchpv("main::@", TRUE, SVt_PV); SvFLAGS(gv_list[69]) = 0x600d; GvFLAGS(gv_list[69]) = 0xa; GvLINE(gv_list[69]) = 0; SvPVX(gv_list[69]) = emptystring; SvREFCNT(gv_list[69]) += 13; GvREFCNT(gv_list[69]) += 1; gv_list[70] = gv_fetchpv("main::_</usr/lib/perl5/5.8.5/base.pm", TRUE, SVt_PV); SvFLAGS(gv_list[70]) = 0x600d; GvFLAGS(gv_list[70]) = 0x2; GvLINE(gv_list[70]) = 8; SvPVX(gv_list[70]) = emptystring; SvREFCNT(gv_list[70]) += 2; GvREFCNT(gv_list[70]) += 1; xpv_list[70].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/base.pm", 28); GvSV(gv_list[70]) = &sv_list[103]; GvFILE(gv_list[70]) = "\270/\r\b"; gv_list[71] = gv_fetchpv("main::STDOUT", TRUE, SVt_PV); SvFLAGS(gv_list[71]) = 0x630d; GvFLAGS(gv_list[71]) = 0xa; GvLINE(gv_list[71]) = 0; SvPVX(gv_list[71]) = emptystring; SvREFCNT(gv_list[71]) += 13; GvREFCNT(gv_list[71]) += 1; gv_list[72] = gv_fetchpv("main::_</usr/lib/perl5/5.8.5/i386-linux-thread-multi/B/C.pm", TRUE, SVt_PV); SvFLAGS(gv_list[72]) = 0x600d; GvFLAGS(gv_list[72]) = 0x2; GvLINE(gv_list[72]) = 1096; SvPVX(gv_list[72]) = emptystring; SvREFCNT(gv_list[72]) += 2; GvREFCNT(gv_list[72]) += 1; xpv_list[71].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/i386-linux-thread-multi/B/C.pm", 51); GvSV(gv_list[72]) = &sv_list[104]; GvFILE(gv_list[72]) = ""; gv_list[73] = gv_fetchpv("main::_</usr/lib/perl5/5.8.5/i386-linux-thread-multi/B.pm", TRUE, SVt_PV); SvFLAGS(gv_list[73]) = 0x600d; GvFLAGS(gv_list[73]) = 0x2; GvLINE(gv_list[73]) = 87; SvPVX(gv_list[73]) = emptystring; SvREFCNT(gv_list[73]) += 2; GvREFCNT(gv_list[73]) += 1; xpv_list[72].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/i386-linux-thread-multi/B.pm", 49); GvSV(gv_list[73]) = &sv_list[105]; GvFILE(gv_list[73]) = "\210\327\a\b\b"; gv_list[74] = gv_fetchpv("main::]", TRUE, SVt_PV); SvFLAGS(gv_list[74]) = 0x600d; GvFLAGS(gv_list[74]) = 0xa; GvLINE(gv_list[74]) = 41; SvPVX(gv_list[74]) = emptystring; SvREFCNT(gv_list[74]) += 2; GvREFCNT(gv_list[74]) += 1; gv_list[75] = gv_fetchpv("main::\027", TRUE, SVt_PV); SvFLAGS(gv_list[75]) = 0x600d; GvFLAGS(gv_list[75]) = 0xa; GvLINE(gv_list[75]) = 227; SvPVX(gv_list[75]) = emptystring; SvREFCNT(gv_list[75]) += 4; GvREFCNT(gv_list[75]) += 1; gv_list[76] = gv_fetchpv("main::STDERR", TRUE, SVt_PV); SvFLAGS(gv_list[76]) = 0x630d; GvFLAGS(gv_list[76]) = 0xa; GvLINE(gv_list[76]) = 0; SvPVX(gv_list[76]) = emptystring; SvREFCNT(gv_list[76]) += 4; GvREFCNT(gv_list[76]) += 1; gv_list[77] = gv_fetchpv("main::_</usr/lib/perl5/5.8.5/i386-linux-thread-multi/auto/B/B.so", TRUE, SVt_PV); SvFLAGS(gv_list[77]) = 0x600d; GvFLAGS(gv_list[77]) = 0x2; GvLINE(gv_list[77]) = 87; SvPVX(gv_list[77]) = emptystring; SvREFCNT(gv_list[77]) += 2; GvREFCNT(gv_list[77]) += 1; xpv_list[73].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/i386-linux-thread-multi/auto/B/B.so", 56); GvSV(gv_list[77]) = &sv_list[106]; GvFILE(gv_list[77]) = "/usr/lib/perl5/5.8.5/i386-linux-thread-multi/XSLoader.pm"; gv_list[78] = gv_fetchpv("main::_</usr/lib/perl5/5.8.5/i386-linux-thread-multi/auto/Fcntl/Fcntl.so", TRUE, SVt_PV); SvFLAGS(gv_list[78]) = 0x600d; GvFLAGS(gv_list[78]) = 0x2; GvLINE(gv_list[78]) = 87; SvPVX(gv_list[78]) = emptystring; SvREFCNT(gv_list[78]) += 2; GvREFCNT(gv_list[78]) += 1; xpv_list[74].xpv_pv = savepvn("/usr/lib/perl5/5.8.5/i386-linux-thread-multi/auto/Fcntl/Fcntl.so", 64); GvSV(gv_list[78]) = &sv_list[107]; GvFILE(gv_list[78]) = "/usr/lib/perl5/5.8.5/i386-linux-thread-multi/XSLoader.pm"; PL_dowarn = ( 0 ) ? G_WARN_ON : G_WARN_OFF; PL_main_root = (OP*)&listop_list[0]; PL_main_start = &op_list[0]; PL_initav = (AV *) Nullsv; PL_endav = (AV*) Nullsv; xpv_list[75].xpv_pv = savepvn("Hello World\n", 12); { SV **svp; AV *av = (AV*)&sv_list[109]; av_extend(av, 2); svp = AvARRAY(av); *svp++ = (SV*)&PL_sv_undef; *svp++ = (SV*)&sv_list[110]; *svp++ = (SV*)&sv_list[111]; AvFILLp(av) = 2; } PL_curpad = AvARRAY((AV*)&sv_list[109]); GvHV(PL_incgv) = (HV*)&sv_list[98]; GvAV(PL_incgv) = (AV*)&sv_list[39]; av_store(CvPADLIST(PL_main_cv),0,SvREFCNT_inc((AV*)&sv_list[108])); av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc((AV*)&sv_list[109])); PL_amagic_generation= 0; return 0; }
/**************************** * SV* Py2Pl(PyObject *obj) * * Converts arbitrary Python data structures to Perl data structures * Note on references: does not Py_DECREF(obj). * * Modifications by Eric Wilhelm 2004-07-11 marked as elw * ****************************/ SV *Py2Pl(PyObject * const obj) { /* elw: see what python says things are */ #if PY_MAJOR_VERSION >= 3 int const is_string = PyBytes_Check(obj) || PyUnicode_Check(obj); #else int const is_string = PyString_Check(obj) || PyUnicode_Check(obj); #endif #ifdef I_PY_DEBUG PyObject *this_type = PyObject_Type(obj); /* new reference */ PyObject *t_string = PyObject_Str(this_type); /* new reference */ #if PY_MAJOR_VERSION >= 3 PyObject *type_str_bytes = PyUnicode_AsUTF8String(t_string); /* new reference */ char *type_str = PyBytes_AsString(type_str_bytes); #else char *type_str = PyString_AsString(t_string); #endif Printf(("type is %s\n", type_str)); printf("Py2Pl object:\n\t"); PyObject_Print(obj, stdout, Py_PRINT_RAW); printf("\ntype:\n\t"); PyObject_Print(this_type, stdout, Py_PRINT_RAW); printf("\n"); Printf(("String check: %i\n", is_string)); Printf(("Number check: %i\n", PyNumber_Check(obj))); Printf(("Int check: %i\n", PyInt_Check(obj))); Printf(("Long check: %i\n", PyLong_Check(obj))); Printf(("Float check: %i\n", PyFloat_Check(obj))); Printf(("Type check: %i\n", PyType_Check(obj))); #if PY_MAJOR_VERSION < 3 Printf(("Class check: %i\n", PyClass_Check(obj))); Printf(("Instance check: %i\n", PyInstance_Check(obj))); #endif Printf(("Dict check: %i\n", PyDict_Check(obj))); Printf(("Mapping check: %i\n", PyMapping_Check(obj))); Printf(("Sequence check: %i\n", PySequence_Check(obj))); Printf(("Iter check: %i\n", PyIter_Check(obj))); Printf(("Function check: %i\n", PyFunction_Check(obj))); Printf(("Module check: %i\n", PyModule_Check(obj))); Printf(("Method check: %i\n", PyMethod_Check(obj))); #if PY_MAJOR_VERSION < 3 if ((obj->ob_type->tp_flags & Py_TPFLAGS_HEAPTYPE)) printf("heaptype true\n"); if ((obj->ob_type->tp_flags & Py_TPFLAGS_HAVE_CLASS)) printf("has class\n"); #else Py_DECREF(type_str_bytes); #endif Py_DECREF(t_string); Py_DECREF(this_type); #endif /* elw: this needs to be early */ /* None (like undef) */ if (!obj || obj == Py_None) { Printf(("Py2Pl: Py_None\n")); return &PL_sv_undef; } else #ifdef EXPOSE_PERL /* unwrap Perl objects */ if (PerlObjObject_Check(obj)) { Printf(("Py2Pl: Obj_object\n")); return ((PerlObj_object *) obj)->obj; } /* unwrap Perl code refs */ else if (PerlSubObject_Check(obj)) { Printf(("Py2Pl: Sub_object\n")); SV * ref = ((PerlSub_object *) obj)->ref; if (! ref) { /* probably an inherited method */ if (! ((PerlSub_object *) obj)->obj) croak("Error: could not find a code reference or object method for PerlSub"); SV * const sub_obj = (SV*)SvRV(((PerlSub_object *) obj)->obj); HV * const pkg = SvSTASH(sub_obj); #if PY_MAJOR_VERSION >= 3 char * const sub = PyBytes_AsString(((PerlSub_object *) obj)->sub); #else PyObject *obj_sub_str = PyObject_Str(((PerlSub_object *) obj)->sub); /* new ref. */ char * const sub = PyString_AsString(obj_sub_str); #endif GV * const gv = Perl_gv_fetchmethod_autoload(aTHX_ pkg, sub, TRUE); if (gv && isGV(gv)) { ref = (SV *)GvCV(gv); } #if PY_MAJOR_VERSION < 3 Py_DECREF(obj_sub_str); #endif } return newRV_inc((SV *) ref); } else #endif /* wrap an instance of a Python class */ /* elw: here we need to make these look like instances: */ if ((obj->ob_type->tp_flags & Py_TPFLAGS_HEAPTYPE) #if PY_MAJOR_VERSION < 3 || PyInstance_Check(obj) #endif ) { /* This is a Python class instance -- bless it into an * Inline::Python::Object. If we're being called from an * Inline::Python class, it will be re-blessed into whatever * class that is. */ SV * const inst_ptr = newSViv(0); SV * const inst = newSVrv(inst_ptr, "Inline::Python::Object");; _inline_magic priv; /* set up magic */ priv.key = INLINE_MAGIC_KEY; sv_magic(inst, inst, PERL_MAGIC_ext, (char *) &priv, sizeof(priv)); MAGIC * const mg = mg_find(inst, PERL_MAGIC_ext); mg->mg_virtual = &inline_mg_vtbl; sv_setiv(inst, (IV) obj); /*SvREADONLY_on(inst); */ /* to uncomment this means I can't re-bless it */ Py_INCREF(obj); Printf(("Py2Pl: Instance. Obj: %p, inst_ptr: %p\n", obj, inst_ptr)); sv_2mortal(inst_ptr); return inst_ptr; } /* a tuple or a list */ else if (PySequence_Check(obj) && !is_string) { AV * const retval = newAV(); int i; int const sz = PySequence_Length(obj); Printf(("sequence (%i)\n", sz)); for (i = 0; i < sz; i++) { PyObject * const tmp = PySequence_GetItem(obj, i); /* new reference */ SV * const next = Py2Pl(tmp); av_push(retval, next); if (sv_isobject(next)) // needed because objects get mortalized in Py2Pl SvREFCNT_inc(next); Py_DECREF(tmp); } if (PyTuple_Check(obj)) { _inline_magic priv; priv.key = TUPLE_MAGIC_KEY; sv_magic((SV * const)retval, (SV * const)NULL, PERL_MAGIC_ext, (char *) &priv, sizeof(priv)); } return newRV_noinc((SV *) retval); } /* a dictionary or fake Mapping object */ /* elw: PyMapping_Check() now returns true for strings */ else if (! is_string && PyMapping_Check(obj)) { HV * const retval = newHV(); int i; int const sz = PyMapping_Length(obj); PyObject * const keys = PyMapping_Keys(obj); /* new reference */ PyObject * const vals = PyMapping_Values(obj); /* new reference */ Printf(("Py2Pl: dict/map\n")); Printf(("mapping (%i)\n", sz)); for (i = 0; i < sz; i++) { PyObject * const key = PySequence_GetItem(keys, i), /* new reference */ * const val = PySequence_GetItem(vals, i); /* new reference */ SV * const sv_val = Py2Pl(val); char * key_val; if (PyUnicode_Check(key)) { PyObject * const utf8_string = PyUnicode_AsUTF8String(key); /* new reference */ #if PY_MAJOR_VERSION >= 3 key_val = PyBytes_AsString(utf8_string); SV * const utf8_key = newSVpv(key_val, PyBytes_Size(utf8_string)); #else key_val = PyString_AsString(utf8_string); SV * const utf8_key = newSVpv(key_val, PyString_Size(utf8_string)); #endif SvUTF8_on(utf8_key); hv_store_ent(retval, utf8_key, sv_val, 0); Py_DECREF(utf8_string); } else { PyObject * s = NULL; #if PY_MAJOR_VERSION >= 3 PyObject * s_bytes = NULL; if (PyBytes_Check(key)) { key_val = PyBytes_AsString(key); #else if (PyString_Check(key)) { key_val = PyString_AsString(key); #endif } else { /* Warning -- encountered a non-string key value while converting a * Python dictionary into a Perl hash. Perl can only use strings as * key values. Using Python's string representation of the key as * Perl's key value. */ s = PyObject_Str(key); /* new reference */ #if PY_MAJOR_VERSION >= 3 s_bytes = PyUnicode_AsUTF8String(s); /* new reference */ key_val = PyBytes_AsString(s_bytes); #else key_val = PyString_AsString(s); #endif Py_DECREF(s); if (PL_dowarn) warn("Stringifying non-string hash key value: '%s'", key_val); } if (!key_val) { croak("Invalid key on key %i of mapping\n", i); } hv_store(retval, key_val, strlen(key_val), sv_val, 0); #if PY_MAJOR_VERSION >= 3 Py_XDECREF(s_bytes); #endif Py_XDECREF(s); } if (sv_isobject(sv_val)) // needed because objects get mortalized in Py2Pl SvREFCNT_inc(sv_val); Py_DECREF(key); Py_DECREF(val); } Py_DECREF(keys); Py_DECREF(vals); return newRV_noinc((SV *) retval); } /* a boolean */ else if (PyBool_Check(obj)) {
USER_OBJECT_ fromPerl(SV *val, unsigned int depth) { USER_OBJECT_ ans = NULL_USER_OBJECT; USER_OBJECT_ classes; svtype type = SvTYPE(val); svtype elementType = SVt_NULL; svtype refType; SV *refVal = NULL; dTHX; if(type == SVt_PVGV) { if(GvHV(val)) ans = fromPerlHV(GvHV(val), depth - 1); else if(GvAV(val)) ans = fromPerlAV(GvAV(val), NULL, depth - 1); else if(GvCV(val)) ans = fromPerl((SV *) GvCV(val), 0); else if(GvSV(val)) ans = fromPerl(GvSV(val), depth - 1); else if(GvIOp(val)) { /* XXX */ } else { PROBLEM "Don't understand particular type of PVGV at this point" ERROR; } return(ans); } else if (type == SVt_PVMG && !sv_isobject(val)) { /* If it is magic and not an object, then treat it as a scalar and get it back to R as a value, not a reference. Would ideally like to respect the convert option. But we can get ourselves into an infinite loop. Needs more investigation. */ return(GetRScalar(val)); } if(val == NULL || val == &sv_undef || (!SvOK(val) && !SvROK(val) && type != SVt_PVCV) /* || type == SVt_NULL */) { #ifdef R_PERL_DEBUG fprintf(stderr, "Null result: %p (%d) (undef = %p) (type is %s) SvOK=%d, SvROK=%d\n", val, type, &sv_undef, type == SVt_NULL ? "null" : "not null", SvOK(val), SvROK(val)); fflush(stderr); #endif return(NULL_USER_OBJECT); } if(SvROK(val)) { /* && sv_isobject(val)) { */ if(sv_isa(val, "RReferences")) { return(RPerl_getProxyValue(val)); } else { ans = userLevelConversionFromPerl(val, depth); if(ans != NULL) return(ans); #ifdef R_PERL_DEBUG fprintf(stderr, "Didn't get a user-leve conversion. Continuining with regular conversion\n"); #endif } } classes = computeRSPerlClassVector(val, &elementType, depth); if(!depth || (classes && GET_LENGTH(classes))) { /* We protect classes in the subroutines. */ PROTECT(classes); ans = makeForeignPerlReference(val, classes, &exportReferenceTable); UNPROTECT(1); return(ans); } #ifdef R_PERL_DEBUG fprintf(stderr, "[Converting] element type %d %d %d\n", (int) elementType, (int) SvTYPE(val), (int) (SvTYPE(val) == SVt_RV)); #endif /* If it is a reference, then check whether it is an array or hash. */ if(SvROK(val)) { refVal = SvRV(val); refType = SvTYPE(refVal); } else { refVal = val; refType = type; } #ifdef R_PERL_DEBUG fprintf(stderr, "[fromPerl] refType = %d\n", refType); #endif if(refType == SVt_PVAV || refType == SVt_PVHV) { if(isHomogeneous(refVal, &elementType)) { return( (refType == SVt_PVAV) ? fromHomogeneousArray(refVal, elementType) : fromHomogeneousTable(refVal, elementType)); } else { return( (refType == SVt_PVAV) ? fromPerlAV((AV*)refVal, NULL, depth) : fromPerlHV((HV*)refVal, depth)); } } else if(refType == SVt_PVCV) { return(createPerlReference(refVal)); } #ifdef R_PERL_DEBUG fprintf(stderr, "[fromPerl] continuing again as refType (%d) was not an array or table.\n", refType); #endif ans = GetRScalar(val); return(ans); }