cvs commit: ponie/src/pmc perl5cargo_cult.pmc perl5iv.pmc perl5null.pmc perl5nv.pmc perl5pv.pmc perl5pvav.pmc perl5pvbm.pmc perl5pvcv.pmc perl5pvfm.pmc perl5pvgv.pmc perl5pvhv.pmc perl5pvio.pmc perl5pviv.pmc perl5pvlv.pmc perl5pvmg.pmc perl5pvnv.pmc perl5rv.pmc
[email protected] (Nicholas Clark) 29 Apr 2005 23:47:21 -0000
| Newsgroups | perl.ponie.changes |
|---|---|
| Message-ID | <[email protected]> |
cvsuser 05/04/29 16:47:21
Modified: src/pmc perl5cargo_cult.pmc perl5iv.pmc perl5null.pmc
perl5nv.pmc perl5pv.pmc perl5pvav.pmc perl5pvbm.pmc
perl5pvcv.pmc perl5pvfm.pmc perl5pvgv.pmc
perl5pvhv.pmc perl5pvio.pmc perl5pviv.pmc
perl5pvlv.pmc perl5pvmg.pmc perl5pvnv.pmc
perl5rv.pmc
Log:
Morphing part 2 - write the value into the new PMC with a vtable call
Revision Changes Path
1.51 +9 -300 ponie/src/pmc/perl5cargo_cult.pmc
Index: perl5cargo_cult.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5cargo_cult.pmc,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- perl5cargo_cult.pmc 29 Apr 2005 22:11:31 -0000 1.50
+++ perl5cargo_cult.pmc 29 Apr 2005 23:47:21 -0000 1.51
@@ -33,304 +33,6 @@
& (SVs_GMG|SVs_SMG|SVs_RMG);
}
-/* Refactor this when it gets chopped into morph code. */
-#define new_XPV() (void*)new_xpv()
-
-#define new_XPVIV() (void*)new_xpviv()
-
-#define new_XPVNV() (void*)new_xpvnv()
-
-#define new_XPVCV() (void*)new_xpvcv()
-#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
-
-#define new_XPVAV() (void*)new_xpvav()
-#define del_XPVAV(p) del_xpvav((XPVAV *)p)
-
-#define new_XPVHV() (void*)new_xpvhv()
-#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
-
-#define new_XPVMG() (void*)new_xpvmg()
-
-#define new_XPVLV() (void*)new_xpvlv()
-#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
-
-#define new_XPVBM() (void*)new_xpvbm()
-#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
-
-#define new_XPVGV() (void*)new_xpvgv()
-#define del_XPVGV(p) del_xpvgv((XPVGV *)p)
-
-#define new_XPVFM() (void*)new_xpvfm()
-#define del_XPVFM(p) del_xpvfm((XPVFM *)p)
-
-#define new_XPVIO() (void*)new_xpvio()
-#define del_XPVIO(p) del_xpvio((XPVIO *)p)
-
-static void do_upgrade(PMC *pmc, struct Ponie_upgrade_info *info) {
- char* pv = info->value.pv;
- SV* rv = info->value.rv;
- U32 cur = info->value.cur;
- U32 len = info->value.len;
- IV iv = info->value.iv;
- NV nv = info->value.nv;
- MAGIC* magic = info->value.magic;
- HV* stash = info->value.stash;
- int sv_is_rv = info->value.sv_is_rv;
- U32 mt = info->p5_type;
-
- SV *sv = MUMBLE(pmc);
-
- /* This is SvTYPE_set(sv, mt): */
- ((struct STRUCT_SV *)PMC_struct_val(pmc))->sv_flags &= ~SVTYPEMASK;
- ((struct STRUCT_SV *)PMC_struct_val(pmc))->sv_flags |= mt;
-
- switch (mt) {
- case SVt_NULL:
- Perl_croak(aTHX_ "Can't upgrade to undef");
- case SVt_IV:
- SvANY(sv) = 0;
- SvPMC_on(sv);
- SvIV_set(sv, iv);
- break;
- case SVt_NV:
- SvANY(sv) = 0;
- SvPMC_on(sv);
- SvNV_set(sv, nv);
- break;
- case SVt_RV:
- SvANY(sv) = 0;
- SvPMC_on(sv);
- SvRV_set(sv, rv);
- break;
- case SVt_PV:
- SvANY(sv) = new_XPV();
- SvPMC_on(sv);
- if (sv_is_rv) {
- SvRV_set(sv, rv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, pv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- SvCUR_set(sv, cur);
- SvLEN_set(sv, len);
- break;
- case SVt_PVIV:
- SvANY(sv) = new_XPVIV();
- SvPMC_on(sv);
- if (sv_is_rv) {
- SvRV_set(sv, rv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, pv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- SvCUR_set(sv, cur);
- SvLEN_set(sv, len);
- SvIV_set(sv, iv);
- if (SvNIOK(sv))
- (void)SvIOK_on(sv);
- SvNOK_off(sv);
- break;
- case SVt_PVNV:
- SvANY(sv) = new_XPVNV();
- SvPMC_on(sv);
- if (sv_is_rv) {
- SvRV_set(sv, rv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, pv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- SvCUR_set(sv, cur);
- SvLEN_set(sv, len);
- SvIV_set(sv, iv);
- SvNV_set(sv, nv);
- break;
- case SVt_PVMG:
- SvANY(sv) = new_XPVMG();
- SvPMC_on(sv);
- if (sv_is_rv) {
- SvRV_set(sv, rv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, pv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- SvCUR_set(sv, cur);
- SvLEN_set(sv, len);
- SvIV_set(sv, iv);
- SvNV_set(sv, nv);
- SvMAGIC_set(sv, magic);
- SvSTASH_set(sv, stash);
- break;
- case SVt_PVLV:
- SvANY(sv) = new_XPVLV();
- SvPMC_on(sv);
- if (sv_is_rv) {
- SvRV_set(sv, rv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, pv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- SvCUR_set(sv, cur);
- SvLEN_set(sv, len);
- SvIV_set(sv, iv);
- SvNV_set(sv, nv);
- SvMAGIC_set(sv, magic);
- SvSTASH_set(sv, stash);
- LvTARGOFF(sv) = 0;
- LvTARGLEN(sv) = 0;
- LvTARG(sv) = 0;
- LvTYPE(sv) = 0;
- GvGP(sv) = 0;
- GvNAME(sv) = 0;
- GvNAMELEN(sv) = 0;
- GvSTASH(sv) = 0;
- GvFLAGS(sv) = 0;
- break;
- case SVt_PVAV:
- SvANY(sv) = new_XPVAV();
- if (pv)
- Safefree(pv);
- if (sv_is_rv) {
- /* XXX need more paranoia here? */
- SvRV_set(sv, 0);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, (char*)0);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- AvMAX(sv) = -1;
- AvFILLp(sv) = -1;
- SvIV_set(sv, 0);
- SvNV_set(sv, 0.0);
- SvMAGIC_set(sv, magic);
- SvSTASH_set(sv, stash);
- AvALLOC(sv) = 0;
- AvARYLEN(sv) = 0;
- AvFLAGS(sv) = AVf_REAL;
- break;
- case SVt_PVHV:
- SvANY(sv) = new_XPVHV();
- if (pv)
- Safefree(pv);
- if (sv_is_rv) {
- /* XXX need more paranoia here? */
- SvRV_set(sv, 0);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, (char*)0);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- HvFILL(sv) = 0;
- HvMAX(sv) = 0;
- HvTOTALKEYS(sv) = 0;
- HvPLACEHOLDERS(sv) = 0;
- SvMAGIC_set(sv, magic);
- SvSTASH_set(sv, stash);
- HvRITER(sv) = 0;
- HvEITER(sv) = 0;
- HvPMROOT(sv) = 0;
- HvNAME(sv) = 0;
- break;
- case SVt_PVCV:
- SvANY(sv) = new_XPVCV();
- SvPMC_on(sv);
- zero_xpvcv(sv);
- assert (!sv_is_rv);
- SvPV_set(sv, pv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- SvCUR_set(sv, cur);
- SvLEN_set(sv, len);
- SvIV_set(sv, iv);
- SvNV_set(sv, nv);
- SvMAGIC_set(sv, magic);
- SvSTASH_set(sv, stash);
- break;
- case SVt_PVGV:
- SvANY(sv) = new_XPVGV();
- SvPMC_on(sv);
- if (sv_is_rv) {
- SvRV_set(sv, rv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, pv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- SvCUR_set(sv, cur);
- SvLEN_set(sv, len);
- SvIV_set(sv, iv);
- SvNV_set(sv, nv);
- SvMAGIC_set(sv, magic);
- SvSTASH_set(sv, stash);
- GvGP(sv) = 0;
- GvNAME(sv) = 0;
- GvNAMELEN(sv) = 0;
- GvSTASH(sv) = 0;
- GvFLAGS(sv) = 0;
- break;
- case SVt_PVBM:
- SvANY(sv) = new_XPVBM();
- SvPMC_on(sv);
- if (sv_is_rv) {
- SvRV_set(sv, rv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, pv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- SvCUR_set(sv, cur);
- SvLEN_set(sv, len);
- SvIV_set(sv, iv);
- SvNV_set(sv, nv);
- SvMAGIC_set(sv, magic);
- SvSTASH_set(sv, stash);
- BmRARE(sv) = 0;
- BmUSEFUL(sv) = 0;
- BmPREVIOUS(sv) = 0;
- break;
- case SVt_PVFM:
- SvANY(sv) = new_XPVFM();
- SvPMC_on(sv);
- zero_xpvfm(sv);
- if (sv_is_rv) {
- SvRV_set(sv, rv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, pv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- SvCUR_set(sv, cur);
- SvLEN_set(sv, len);
- SvIV_set(sv, iv);
- SvNV_set(sv, nv);
- SvMAGIC_set(sv, magic);
- SvSTASH_set(sv, stash);
- break;
- case SVt_PVIO:
- SvANY(sv) = new_XPVIO();
- SvPMC_on(sv);
- zero_xpvio(sv);
- if (sv_is_rv) {
- SvRV_set(sv, rv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
- } else {
- SvPV_set(sv, pv);
- Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
- }
- SvCUR_set(sv, cur);
- SvLEN_set(sv, len);
- SvIV_set(sv, iv);
- SvNV_set(sv, nv);
- SvMAGIC_set(sv, magic);
- SvSTASH_set(sv, stash);
- IoPAGE_LEN(sv) = 60;
- break;
- }
-}
-
pmclass Perl5cargo_cult dynpmc {
void init () {
@@ -1019,9 +721,16 @@
struct Ponie_upgrade_info info;
info.p5_type = value;
+ /* This may change the value of p5_type */
DYNSELF.set_pointer_keyed_int(Ponie_P_GET_UPGRADE, &info);
DYNSELF.morph(PL_pmcname[info.p5_type]);
- do_upgrade(SELF, &info);
+
+ ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
+ &= ~SVTYPEMASK;
+ ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
+ |= info.p5_type;
+
+ DYNSELF.set_pointer_keyed_int(Ponie_P_SET_UPGRADE, &info);
}
return;
1.2 +13 -3 ponie/src/pmc/perl5iv.pmc
Index: perl5iv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5iv.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5iv.pmc 29 Apr 2005 22:11:31 -0000 1.1
+++ perl5iv.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -32,9 +32,19 @@
else if (mt < SVt_PVIV)
info->p5_type = SVt_PVIV;
break;
- default:
- SUPER(key, value);
}
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = 0;
+ SvIV_set(sv, val->iv);
+ break;
+ }
+ default:
+ SUPER(key, value);
}
}
}
1.2 +4 -1 ponie/src/pmc/perl5null.pmc
Index: perl5null.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5null.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5null.pmc 29 Apr 2005 22:11:31 -0000 1.1
+++ perl5null.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -21,6 +21,9 @@
memset(&((struct Ponie_upgrade_info *)value)->value, 0,
sizeof(struct Ponie_upgrade_value));
break;
+ case Ponie_P_SET_UPGRADE:
+ Perl_croak(aTHX_ "Can't upgrade to undef");
+ break;
default:
SUPER(key, value);
}
1.2 +13 -3 ponie/src/pmc/perl5nv.pmc
Index: perl5nv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5nv.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5nv.pmc 29 Apr 2005 22:11:31 -0000 1.1
+++ perl5nv.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -30,9 +30,19 @@
if (mt < SVt_PVNV)
info->p5_type = SVt_PVNV;
break;
- default:
- SUPER(key, value);
}
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = 0;
+ SvNV_set(sv, val->nv);
+ break;
+ }
+ default:
+ SUPER(key, value);
}
}
}
1.2 +24 -3 ponie/src/pmc/perl5pv.pmc
Index: perl5pv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pv.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5pv.pmc 29 Apr 2005 22:11:31 -0000 1.1
+++ perl5pv.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -12,6 +12,7 @@
#include "ponie.h"
+#define new_XPV() (void*)new_xpv()
#define del_XPV(p) del_xpv((XPV *)p)
pmclass Perl5PV extends Perl5base dynpmc group Perl5_group {
@@ -43,9 +44,29 @@
else if (mt == SVt_NV)
info->p5_type = SVt_PVNV;
break;
- default:
- SUPER(key, value);
}
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPV();
+ if (val->sv_is_rv) {
+ SvRV_set(sv, val->rv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_PVX_0, 0);
+ } else {
+ SvPV_set(sv, val->pv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_RVX_0, 0);
+ }
+ SvCUR_set(sv, val->cur);
+ SvLEN_set(sv, val->len);
+ break;
+ }
+ default:
+ SUPER(key, value);
}
}
}
1.2 +47 -1 ponie/src/pmc/perl5pvav.pmc
Index: perl5pvav.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvav.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5pvav.pmc 27 Apr 2005 14:32:22 -0000 1.1
+++ perl5pvav.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -10,5 +10,51 @@
* References:
*/
+#include "ponie.h"
+
+#define new_XPVAV() (void*)new_xpvav()
+#define del_XPVAV(p) del_xpvav((XPVAV *)p)
+
pmclass Perl5PVAV extends Perl5PVMG dynpmc group Perl5_group {
+ void set_pointer_keyed_int(INTVAL key, void *value) {
+ switch (key) {
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVAV();
+ assert(!val->pv);
+ assert(!val->rv);
+
+ SvRV_set(sv, 0);
+ SvPV_set(sv, (char*)0);
+
+ AvMAX(sv) = -1;
+ AvFILLp(sv) = -1;
+ SvIV_set(sv, 0);
+ SvNV_set(sv, 0.0);
+ /* I think that these two can only be NULL. */
+ SvMAGIC_set(sv, val->magic);
+ SvSTASH_set(sv, val->stash);
+ AvALLOC(sv) = 0;
+ AvARYLEN(sv) = 0;
+ AvFLAGS(sv) = AVf_REAL;
+ break;
+ }
+ default:
+ SUPER(key, value);
+ }
+ }
}
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+*/
1.2 +51 -1 ponie/src/pmc/perl5pvbm.pmc
Index: perl5pvbm.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvbm.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5pvbm.pmc 27 Apr 2005 14:32:22 -0000 1.1
+++ perl5pvbm.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -10,5 +10,55 @@
* References:
*/
+#include "ponie.h"
+
+#define new_XPVBM() (void*)new_xpvbm()
+#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
+
pmclass Perl5PVBM extends Perl5PVMG dynpmc group Perl5_group {
+
+ void set_pointer_keyed_int(INTVAL key, void *value) {
+ switch (key) {
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVBM();
+ if (val->sv_is_rv) {
+ SvRV_set(sv, val->rv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_PVX_0, 0);
+ } else {
+ SvPV_set(sv, val->pv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_RVX_0, 0);
+ }
+ SvCUR_set(sv, val->cur);
+ SvLEN_set(sv, val->len);
+ SvIV_set(sv, val->iv);
+ SvNV_set(sv, val->nv);
+ SvMAGIC_set(sv, val->magic);
+ SvSTASH_set(sv, val->stash);
+
+ BmRARE(sv) = 0;
+ BmUSEFUL(sv) = 0;
+ BmPREVIOUS(sv) = 0;
+ break;
+ }
+ default:
+ SUPER(key, value);
+ }
+ }
}
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+*/
1.2 +42 -1 ponie/src/pmc/perl5pvcv.pmc
Index: perl5pvcv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvcv.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5pvcv.pmc 27 Apr 2005 14:32:22 -0000 1.1
+++ perl5pvcv.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -10,5 +10,46 @@
* References:
*/
+#include "ponie.h"
+
+#define new_XPVCV() (void*)new_xpvcv()
+#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
+
pmclass Perl5PVCV extends Perl5PVMG dynpmc group Perl5_group {
+ void set_pointer_keyed_int(INTVAL key, void *value) {
+ switch (key) {
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVCV();
+ zero_xpvcv(sv);
+ assert (!val->sv_is_rv);
+ SvPV_set(sv, val->pv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_RVX_0, 0);
+ SvCUR_set(sv, val->cur);
+ SvLEN_set(sv, val->len);
+ SvIV_set(sv, val->iv);
+ SvNV_set(sv, val->nv);
+ SvMAGIC_set(sv, val->magic);
+ SvSTASH_set(sv, val->stash);
+ break;
+ }
+ default:
+ SUPER(key, value);
+ }
+ }
}
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+*/
1.2 +48 -1 ponie/src/pmc/perl5pvfm.pmc
Index: perl5pvfm.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvfm.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5pvfm.pmc 27 Apr 2005 14:32:22 -0000 1.1
+++ perl5pvfm.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -10,5 +10,52 @@
* References:
*/
+#include "ponie.h"
+
+#define new_XPVFM() (void*)new_xpvfm()
+#define del_XPVFM(p) del_xpvfm((XPVFM *)p)
+
pmclass Perl5PVFM extends Perl5PVCV dynpmc group Perl5_group {
+
+ void set_pointer_keyed_int(INTVAL key, void *value) {
+ switch (key) {
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVFM();
+ zero_xpvfm(sv);
+ if (val->sv_is_rv) {
+ SvRV_set(sv, val->rv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_PVX_0, 0);
+ } else {
+ SvPV_set(sv, val->pv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_RVX_0, 0);
+ }
+ SvCUR_set(sv, val->cur);
+ SvLEN_set(sv, val->len);
+ SvIV_set(sv, val->iv);
+ SvNV_set(sv, val->nv);
+ SvMAGIC_set(sv, val->magic);
+ SvSTASH_set(sv, val->stash);
+ break;
+ }
+ default:
+ SUPER(key, value);
+ }
+ }
}
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+*/
1.3 +34 -1 ponie/src/pmc/perl5pvgv.pmc
Index: perl5pvgv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvgv.pmc,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- perl5pvgv.pmc 29 Apr 2005 22:11:31 -0000 1.2
+++ perl5pvgv.pmc 29 Apr 2005 23:47:21 -0000 1.3
@@ -12,10 +12,43 @@
#include "ponie.h"
+#define new_XPVGV() (void*)new_xpvgv()
+#define del_XPVGV(p) del_xpvgv((XPVGV *)p)
+
pmclass Perl5PVGV extends Perl5PVMG dynpmc group Perl5_group {
void set_pointer_keyed_int(INTVAL key, void *value) {
switch (key) {
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVGV();
+ if (val->sv_is_rv) {
+ SvRV_set(sv, val->rv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_PVX_0, 0);
+ } else {
+ SvPV_set(sv, val->pv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_RVX_0, 0);
+ }
+ SvCUR_set(sv, val->cur);
+ SvLEN_set(sv, val->len);
+ SvIV_set(sv, val->iv);
+ SvNV_set(sv, val->nv);
+ SvMAGIC_set(sv, val->magic);
+ SvSTASH_set(sv, val->stash);
+
+ GvGP(sv) = 0;
+ GvNAME(sv) = 0;
+ GvNAMELEN(sv) = 0;
+ GvSTASH(sv) = 0;
+ GvFLAGS(sv) = 0;
+ break;
+ }
case Ponie_P_UNGLOB:
{
SELF->vtable = Parrot_base_vtables[PL_pmcname[SVt_PVMG]];
1.2 +48 -1 ponie/src/pmc/perl5pvhv.pmc
Index: perl5pvhv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvhv.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5pvhv.pmc 27 Apr 2005 14:32:22 -0000 1.1
+++ perl5pvhv.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -10,5 +10,52 @@
* References:
*/
+#include "ponie.h"
+
+#define new_XPVHV() (void*)new_xpvhv()
+#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
+
pmclass Perl5PVHV extends Perl5PVMG dynpmc group Perl5_group {
+ void set_pointer_keyed_int(INTVAL key, void *value) {
+ switch (key) {
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVHV();
+ assert(!val->pv);
+ assert(!val->rv);
+
+ SvRV_set(sv, 0);
+ SvPV_set(sv, (char*)0);
+
+ HvFILL(sv) = 0;
+ HvMAX(sv) = 0;
+ HvTOTALKEYS(sv) = 0;
+ HvPLACEHOLDERS(sv) = 0;
+ /* I think that these two can only be NULL. */
+ SvMAGIC_set(sv, val->magic);
+ SvSTASH_set(sv, val->stash);
+ HvRITER(sv) = 0;
+ HvEITER(sv) = 0;
+ HvPMROOT(sv) = 0;
+ HvNAME(sv) = 0;
+ break;
+ }
+ default:
+ SUPER(key, value);
+ }
+ }
}
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+*/
1.2 +50 -1 ponie/src/pmc/perl5pvio.pmc
Index: perl5pvio.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvio.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5pvio.pmc 27 Apr 2005 14:32:22 -0000 1.1
+++ perl5pvio.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -10,5 +10,54 @@
* References:
*/
+#include "ponie.h"
+
+#define new_XPVIO() (void*)new_xpvio()
+#define del_XPVIO(p) del_xpvio((XPVIO *)p)
+
pmclass Perl5PVIO extends Perl5PVMG dynpmc group Perl5_group {
+
+ void set_pointer_keyed_int(INTVAL key, void *value) {
+ switch (key) {
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVIO();
+ zero_xpvio(sv);
+ if (val->sv_is_rv) {
+ SvRV_set(sv, val->rv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_PVX_0, 0);
+ } else {
+ SvPV_set(sv, val->pv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_RVX_0, 0);
+ }
+ SvCUR_set(sv, val->cur);
+ SvLEN_set(sv, val->len);
+ SvIV_set(sv, val->iv);
+ SvNV_set(sv, val->nv);
+ SvMAGIC_set(sv, val->magic);
+ SvSTASH_set(sv, val->stash);
+
+ IoPAGE_LEN(sv) = 60;
+ break;
+ }
+ default:
+ SUPER(key, value);
+ }
+ }
}
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+*/
1.3 +28 -3 ponie/src/pmc/perl5pviv.pmc
Index: perl5pviv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pviv.pmc,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- perl5pviv.pmc 29 Apr 2005 22:11:31 -0000 1.2
+++ perl5pviv.pmc 29 Apr 2005 23:47:21 -0000 1.3
@@ -12,6 +12,7 @@
#include "ponie.h"
+#define new_XPVIV() (void*)new_xpviv()
#define del_XPVIV(p) del_xpviv((XPVIV *)p)
pmclass Perl5PVIV extends Perl5PV extends Perl5IV dynpmc group Perl5_group {
@@ -38,9 +39,33 @@
del_XPVIV(SvANY(sv));
break;
- default:
- SUPER(key, value);
}
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVIV();
+ if (val->sv_is_rv) {
+ SvRV_set(sv, val->rv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_PVX_0, 0);
+ } else {
+ SvPV_set(sv, val->pv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_RVX_0, 0);
+ }
+ SvCUR_set(sv, val->cur);
+ SvLEN_set(sv, val->len);
+ SvIV_set(sv, val->iv);
+ if (SvNIOK(sv))
+ (void)SvIOK_on(sv);
+ SvNOK_off(sv);
+ break;
+ }
+ default:
+ SUPER(key, value);
}
}
}
1.2 +57 -1 ponie/src/pmc/perl5pvlv.pmc
Index: perl5pvlv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvlv.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5pvlv.pmc 27 Apr 2005 14:32:22 -0000 1.1
+++ perl5pvlv.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -10,5 +10,61 @@
* References:
*/
+#include "ponie.h"
+
+#define new_XPVLV() (void*)new_xpvlv()
+#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
+
pmclass Perl5PVLV extends Perl5PVGV dynpmc group Perl5_group {
+
+ void set_pointer_keyed_int(INTVAL key, void *value) {
+ switch (key) {
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVLV();
+ if (val->sv_is_rv) {
+ SvRV_set(sv, val->rv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_PVX_0, 0);
+ } else {
+ SvPV_set(sv, val->pv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_RVX_0, 0);
+ }
+ SvCUR_set(sv, val->cur);
+ SvLEN_set(sv, val->len);
+ SvIV_set(sv, val->iv);
+ SvNV_set(sv, val->nv);
+ SvMAGIC_set(sv, val->magic);
+ SvSTASH_set(sv, val->stash);
+
+ LvTARGOFF(sv) = 0;
+ LvTARGLEN(sv) = 0;
+ LvTARG(sv) = 0;
+ LvTYPE(sv) = 0;
+ GvGP(sv) = 0;
+ GvNAME(sv) = 0;
+ GvNAMELEN(sv) = 0;
+ GvSTASH(sv) = 0;
+ GvFLAGS(sv) = 0;
+ break;
+ }
+ default:
+ SUPER(key, value);
+ }
+ }
}
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+*/
1.3 +28 -3 ponie/src/pmc/perl5pvmg.pmc
Index: perl5pvmg.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvmg.pmc,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- perl5pvmg.pmc 29 Apr 2005 22:11:31 -0000 1.2
+++ perl5pvmg.pmc 29 Apr 2005 23:47:21 -0000 1.3
@@ -12,6 +12,7 @@
#include "ponie.h"
+#define new_XPVMG() (void*)new_xpvmg()
#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
pmclass Perl5PVMG extends Perl5PVNV dynpmc group Perl5_group {
@@ -42,9 +43,33 @@
del_XPVMG(SvANY(sv));
break;
- default:
- SUPER(key, value);
}
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVMG();
+ if (val->sv_is_rv) {
+ SvRV_set(sv, val->rv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_PVX_0, 0);
+ } else {
+ SvPV_set(sv, val->pv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_RVX_0, 0);
+ }
+ SvCUR_set(sv, val->cur);
+ SvLEN_set(sv, val->len);
+ SvIV_set(sv, val->iv);
+ SvNV_set(sv, val->nv);
+ SvMAGIC_set(sv, val->magic);
+ SvSTASH_set(sv, val->stash);
+ break;
+ }
+ default:
+ SUPER(key, value);
}
}
}
1.3 +26 -3 ponie/src/pmc/perl5pvnv.pmc
Index: perl5pvnv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvnv.pmc,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- perl5pvnv.pmc 29 Apr 2005 22:11:31 -0000 1.2
+++ perl5pvnv.pmc 29 Apr 2005 23:47:21 -0000 1.3
@@ -12,6 +12,7 @@
#include "ponie.h"
+#define new_XPVNV() (void*)new_xpvnv()
#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
pmclass Perl5PVNV extends Perl5PVIV extends Perl5NV dynpmc group Perl5_group {
@@ -39,9 +40,31 @@
del_XPVNV(SvANY(sv));
break;
- default:
- SUPER(key, value);
}
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = new_XPVNV();
+ if (val->sv_is_rv) {
+ SvRV_set(sv, val->rv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_PVX_0, 0);
+ } else {
+ SvPV_set(sv, val->pv);
+ Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
+ Ponie_P_RVX_0, 0);
+ }
+ SvCUR_set(sv, val->cur);
+ SvLEN_set(sv, val->len);
+ SvIV_set(sv, val->iv);
+ SvNV_set(sv, val->nv);
+ break;
+ }
+ default:
+ SUPER(key, value);
}
}
}
1.2 +13 -3 ponie/src/pmc/perl5rv.pmc
Index: perl5rv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5rv.pmc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- perl5rv.pmc 29 Apr 2005 22:11:31 -0000 1.1
+++ perl5rv.pmc 29 Apr 2005 23:47:21 -0000 1.2
@@ -27,9 +27,19 @@
info->value.rv = SvRV(MUMBLE(SELF));
info->value.sv_is_rv = 1;
break;
- default:
- SUPER(key, value);
}
+ case Ponie_P_SET_UPGRADE:
+ {
+ const struct Ponie_upgrade_value *val
+ = &((struct Ponie_upgrade_info *)value)->value;
+ SV *sv = MUMBLE(SELF);
+
+ SvANY(sv) = 0;
+ SvRV_set(sv, val->rv);
+ break;
+ }
+ default:
+ SUPER(key, value);
}
}
}