[svn:parrot] r36570 - in trunk: ext/Parrot-Embed/lib/Parrot ext/Parrot-Embed/t src src/dynpmc src/ops src/pmc t/oo t/pmc

Infinoid at svn.parrot.org Infinoid at svn.parrot.org
Wed Feb 11 01:53:00 UTC 2009


Author: Infinoid
Date: Wed Feb 11 01:52:58 2009
New Revision: 36570
URL: https://trac.parrot.org/parrot/changeset/36570

Log:
Revert "Merge vtable_morph_change branch changes back into trunk."

r36563 is not a valid merge point, it doesn't contain all the changes to trunk.
I'll redo the merge, this time the hard way.

Modified:
   trunk/ext/Parrot-Embed/lib/Parrot/Embed.xs
   trunk/ext/Parrot-Embed/t/languages.t
   trunk/src/dynpmc/rational.pmc
   trunk/src/ops/experimental.ops
   trunk/src/ops/pic.ops
   trunk/src/pmc/bigint.pmc
   trunk/src/pmc/bignum.pmc
   trunk/src/pmc/class.pmc
   trunk/src/pmc/complex.pmc
   trunk/src/pmc/default.pmc
   trunk/src/pmc/float.pmc
   trunk/src/pmc/integer.pmc
   trunk/src/pmc/object.pmc
   trunk/src/pmc/pointer.pmc
   trunk/src/pmc/ref.pmc
   trunk/src/pmc/scalar.pmc
   trunk/src/pmc/undef.pmc
   trunk/src/vtable.tbl
   trunk/t/oo/vtableoverride.t
   trunk/t/pmc/undef.t

Modified: trunk/ext/Parrot-Embed/lib/Parrot/Embed.xs
==============================================================================
--- trunk/ext/Parrot-Embed/lib/Parrot/Embed.xs	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/ext/Parrot-Embed/lib/Parrot/Embed.xs	Wed Feb 11 01:52:58 2009	(r36570)
@@ -130,15 +130,46 @@
     real_interp     = interp->interp;
     p_global        = Parrot_str_new_constant( real_interp, global );
 
-    if ( items == 3 )
+    if (items == 3)
         namespace   = ST(2);
     else
         namespace   = &PL_sv_undef;
 
     if (namespace  != &PL_sv_undef )
     {
-        p_namespace = Parrot_str_new_constant( real_interp, SvPVX(namespace) );
-        pmc         = Parrot_find_global_s(real_interp, p_namespace, p_global);
+        char *ns_copy = savepv(SvPV_nolen(namespace));
+        char *ns_str  = ns_copy;
+        char *prev    = ns_str;
+        PMC  *ns      = NULL;
+
+        while (*ns_str++)
+        {
+            STRING *ns_part;
+
+            if (! (*ns_str == ':' && *(ns_str + 1) == ':'))
+                continue;
+
+            *ns_str = 0;
+            ns_str += 2;
+
+            if (!ns)
+                ns = Parrot_find_global_cur(real_interp,
+                    Parrot_str_new_constant(real_interp, prev));
+            else
+                ns = Parrot_find_global_n(real_interp, ns,
+                    Parrot_str_new_constant(real_interp, prev));
+            prev    = ns_str;
+        }
+
+        if (!ns)
+            ns = Parrot_find_global_cur(real_interp,
+                Parrot_str_new_constant(real_interp, prev));
+        else
+            ns = Parrot_find_global_n(real_interp, ns,
+                Parrot_str_new_constant(real_interp, prev));
+
+        pmc          = Parrot_find_global_n(real_interp, ns, p_global);
+        Safefree(ns_copy);
     }
     else
         pmc         = Parrot_find_global_cur( real_interp, p_global );

Modified: trunk/ext/Parrot-Embed/t/languages.t
==============================================================================
--- trunk/ext/Parrot-Embed/t/languages.t	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/ext/Parrot-Embed/t/languages.t	Wed Feb 11 01:52:58 2009	(r36570)
@@ -1,7 +1,7 @@
 #!perl
 
 # Copyright (C) 2009, The Perl Foundation.
-# $Id$
+# $Id: $
 
 use strict;
 use warnings;

Modified: trunk/src/dynpmc/rational.pmc
==============================================================================
--- trunk/src/dynpmc/rational.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/dynpmc/rational.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -78,7 +78,7 @@
 
     if (dest) {
         if (self != dest)
-            VTABLE_morph(interp, dest, self->vtable->pmc_class);
+            VTABLE_morph(interp, dest, self->vtable->base_type);
     }
     else {
         dest = pmc_new(interp, self->vtable->base_type);
@@ -108,7 +108,7 @@
     mpq_t t;
 
     if (dest)
-        VTABLE_morph(interp, dest, self->vtable->pmc_class);
+        VTABLE_morph(interp, dest, self->vtable->base_type);
     else
         dest = pmc_new(interp, self->vtable->base_type);
 
@@ -133,7 +133,7 @@
 static void rat_multiply_integer(PARROT_INTERP, PMC *self, int value, PMC *dest) {
   #ifdef PARROT_HAS_GMP
     if (dest)
-        VTABLE_morph(interp, dest, self->vtable->pmc_class);
+        VTABLE_morph(interp, dest, self->vtable->base_type);
     else
         dest = pmc_new(interp, self->vtable->base_type);
 
@@ -158,7 +158,7 @@
     mpq_t t;
 
     if (dest)
-        VTABLE_morph(interp, dest, self->vtable->pmc_class);
+        VTABLE_morph(interp, dest, self->vtable->base_type);
     else
         dest = pmc_new(interp, self->vtable->base_type);
 
@@ -185,7 +185,7 @@
     mpq_t t;
 
     if (dest)
-        VTABLE_morph(interp, dest, self->vtable->pmc_class);
+        VTABLE_morph(interp, dest, self->vtable->base_type);
     else
         dest = pmc_new(interp, self->vtable->base_type);
 
@@ -212,7 +212,7 @@
     mpq_t t;
 
     if (dest)
-        VTABLE_morph(interp, dest, self->vtable->pmc_class);
+        VTABLE_morph(interp, dest, self->vtable->base_type);
     else
         dest = pmc_new(interp, self->vtable->base_type);
 
@@ -240,7 +240,7 @@
     mpz_t t;
 
     if (dest)
-        VTABLE_morph(interp, dest, self->vtable->pmc_class);
+        VTABLE_morph(interp, dest, self->vtable->base_type);
     else
         dest = pmc_new(interp, self->vtable->base_type);
 
@@ -563,7 +563,7 @@
     MULTI PMC *add(Rational value, PMC* dest) {
       #ifdef PARROT_HAS_GMP
         if (dest)
-            VTABLE_morph(INTERP, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -673,7 +673,7 @@
     MULTI PMC *subtract(Rational value, PMC* dest) {
       #ifdef PARROT_HAS_GMP
         if (dest)
-            VTABLE_morph(INTERP, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -783,7 +783,7 @@
     MULTI PMC *multiply(Rational value, PMC* dest) {
       #ifdef PARROT_HAS_GMP
         if (dest)
-            VTABLE_morph(INTERP, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -893,7 +893,7 @@
     MULTI PMC *divide(Rational value, PMC* dest) {
       #ifdef PARROT_HAS_GMP
         if (dest)
-            VTABLE_morph(INTERP, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -993,7 +993,7 @@
     VTABLE PMC *neg(PMC* dest) {
       #ifdef PARROT_HAS_GMP
         if (dest)
-            VTABLE_morph(INTERP, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1029,7 +1029,7 @@
     VTABLE PMC *absolute(PMC* dest) {
       #ifdef PARROT_HAS_GMP
         if (dest)
-            VTABLE_morph(INTERP, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(INTERP, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 

Modified: trunk/src/ops/experimental.ops
==============================================================================
--- trunk/src/ops/experimental.ops	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/ops/experimental.ops	Wed Feb 11 01:52:58 2009	(r36570)
@@ -164,8 +164,9 @@
 
 =cut
 
-inline op morph(invar PMC, in PMC) {
-  VTABLE_morph(interp, $1, $2);
+inline op morph(invar PMC, in STR) {
+  INTVAL type = pmc_type(interp, $2);
+  VTABLE_morph(interp, $1, type);
 }
 
 =item B<exec>(in STR)

Modified: trunk/src/ops/pic.ops
==============================================================================
--- trunk/src/ops/pic.ops	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/ops/pic.ops	Wed Feb 11 01:52:58 2009	(r36570)
@@ -109,7 +109,7 @@
                 goto ADDRESS(handler);
             }
             /* #RT42354 preserve type system */
-            VTABLE_morph(interp, left, interp->vtables[enum_class_BigInt]->pmc_class);
+            VTABLE_morph(interp, left, enum_class_BigInt);
             VTABLE_set_integer_native(interp, left, a);
             $2 = VTABLE_subtract_int(interp, left, b, left);
         }

Modified: trunk/src/pmc/bigint.pmc
==============================================================================
--- trunk/src/pmc/bigint.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/bigint.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -313,7 +313,7 @@
 static void
 bigint_abs(PARROT_INTERP, PMC *self, PMC *dest) {
     BIGINT *bi_self, *bi_dest;
-    pmc_reuse(interp, dest, enum_class_BigInt, 0);
+    VTABLE_morph(interp, dest, enum_class_BigInt);
     GETATTR_BigInt_bi(interp, self, bi_self);
     GETATTR_BigInt_bi(interp, dest, bi_dest);
     mpz_abs(bi_dest->b, bi_self->b);
@@ -322,7 +322,7 @@
 static void
 bigint_neg(PARROT_INTERP, PMC *self, PMC *dest) {
     BIGINT *bi_self, *bi_dest;
-    pmc_reuse(interp, dest, enum_class_BigInt, 0);
+    VTABLE_morph(interp, dest, enum_class_BigInt);
     GETATTR_BigInt_bi(interp, self, bi_self);
     GETATTR_BigInt_bi(interp, dest, bi_dest);
     mpz_neg(bi_dest->b, bi_self->b);
@@ -893,7 +893,7 @@
 
     MULTI PMC *subtract(BigInt value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -903,7 +903,7 @@
 
     MULTI PMC *subtract(Integer value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -920,7 +920,7 @@
 
     VTABLE PMC *subtract_int(INTVAL value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1007,7 +1007,7 @@
 
     VTABLE PMC *pow_int(INTVAL value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1027,7 +1027,7 @@
     MULTI PMC *divide(BigInt value, PMC *dest) {
         BIGINT *bi;
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1046,7 +1046,7 @@
 
     MULTI PMC *divide(Integer value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1063,7 +1063,7 @@
 
     VTABLE PMC *divide_int(INTVAL value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1111,7 +1111,7 @@
 
     VTABLE PMC *floor_divide_int(INTVAL value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1140,7 +1140,7 @@
 
     MULTI PMC *modulus(BigInt value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1150,7 +1150,7 @@
 
     MULTI PMC *modulus(Integer value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1275,7 +1275,7 @@
 
     MULTI PMC *bitwise_shl(BigInt value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1287,7 +1287,7 @@
 
     MULTI PMC *bitwise_shl(Integer value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1304,7 +1304,7 @@
 
     VTABLE PMC *bitwise_shl_int(INTVAL value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1355,7 +1355,7 @@
 
     MULTI PMC *bitwise_shr(BigInt value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1367,7 +1367,7 @@
 
     MULTI PMC *bitwise_shr(Integer value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1385,7 +1385,7 @@
 
     VTABLE PMC *bitwise_shr_int(INTVAL value, PMC *dest) {
         if (dest)
-            VTABLE_morph(interp, dest, SELF->vtable->pmc_class);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 

Modified: trunk/src/pmc/bignum.pmc
==============================================================================
--- trunk/src/pmc/bignum.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/bignum.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -326,7 +326,7 @@
 static void
 bignum_abs(PARROT_INTERP, PMC *self, PMC *dest) {
     BIGNUM *bi_self, *bi_dest;
-    pmc_reuse(interp, dest, enum_class_BigNum, 0);
+    VTABLE_morph(interp, dest, enum_class_BigNum);
     GETATTR_BigNum_bi(interp, self, bi_self);
     GETATTR_BigNum_bi(interp, dest, bi_dest);
     mpf_abs(bi_dest->b, bi_self->b);
@@ -335,7 +335,7 @@
 static void
 bignum_neg(PARROT_INTERP, PMC *self, PMC *dest) {
     BIGNUM *bi_self, *bi_dest;
-    pmc_reuse(interp, dest, enum_class_BigNum, 0);
+    VTABLE_morph(interp, dest, enum_class_BigNum);
     GETATTR_BigNum_bi(interp, self, bi_self);
     GETATTR_BigNum_bi(interp, dest, bi_dest);
     mpf_neg(bi_dest->b, bi_self->b);
@@ -910,7 +910,7 @@
 
     MULTI PMC *subtract(BigNum value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -920,7 +920,7 @@
 
     MULTI PMC *subtract(Integer value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -937,7 +937,7 @@
 
     VTABLE PMC *subtract_int(INTVAL value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1024,7 +1024,7 @@
 
     VTABLE PMC *pow_int(INTVAL value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1044,7 +1044,7 @@
     MULTI PMC *divide(BigNum value, PMC *dest) {
         BIGNUM *bi;
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1063,7 +1063,7 @@
 
     MULTI PMC *divide(Integer value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1080,7 +1080,7 @@
 
     VTABLE PMC *divide_int(INTVAL value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1128,7 +1128,7 @@
 
     VTABLE PMC *floor_divide_int(INTVAL value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1157,7 +1157,7 @@
 
     MULTI PMC *modulus(BigNum value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1167,7 +1167,7 @@
 
     MULTI PMC *modulus(Integer value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1292,7 +1292,7 @@
 
     MULTI PMC *bitwise_shl(BigNum value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1304,7 +1304,7 @@
 
     MULTI PMC *bitwise_shl(Integer value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1321,7 +1321,7 @@
 
     VTABLE PMC *bitwise_shl_int(INTVAL value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1372,7 +1372,7 @@
 
     MULTI PMC *bitwise_shr(BigNum value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1384,7 +1384,7 @@
 
     MULTI PMC *bitwise_shr(Integer value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 
@@ -1402,7 +1402,7 @@
 
     VTABLE PMC *bitwise_shr_int(INTVAL value, PMC *dest) {
         if (dest)
-            pmc_reuse(interp, dest, SELF->vtable->base_type, 0);
+            VTABLE_morph(interp, dest, SELF->vtable->base_type);
         else
             dest = pmc_new(INTERP, SELF->vtable->base_type);
 

Modified: trunk/src/pmc/class.pmc
==============================================================================
--- trunk/src/pmc/class.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/class.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -1578,22 +1578,6 @@
 
 /*
 
-=item C<INTVAL get_integer()>
-
-This is just a temporary hack. Type ID numbers shouldn't be externally
-visible to the average PIR user. However, we need this for now to interface
-with functions like pmc_new and pmc_reuse, which take type ID numbers still.
-
-=cut
-
-*/
-
-    VTABLE INTVAL get_integer() {
-        return PARROT_CLASS(SELF)->id;
-    }
-
-/*
-
 =item C<void thawfinish(visit_info *info)>
 
 Called after the class has been thawed.

Modified: trunk/src/pmc/complex.pmc
==============================================================================
--- trunk/src/pmc/complex.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/complex.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -1248,7 +1248,7 @@
         GET_ATTR_re(INTERP, SELF, re);
         GET_ATTR_im(INTERP, SELF, im);
         d = sqrt(re*re + im*im);
-        pmc_reuse(INTERP, SELF, enum_class_Float, 0);
+        VTABLE_morph(INTERP, SELF, enum_class_Float);   /* XXX */
         VTABLE_set_number_native(INTERP, SELF, d);
     }
 

Modified: trunk/src/pmc/default.pmc
==============================================================================
--- trunk/src/pmc/default.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/default.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -112,7 +112,7 @@
         if (on && (pmc->vtable->flags & VTABLE_HAS_CONST_TOO))
             pmc->vtable = interp->vtables[pmc->vtable->base_type + 1];
         else if (!on && (pmc->vtable->flags & (VTABLE_IS_CONST_FLAG)))
-            VTABLE_morph(interp, pmc, interp->vtables[pmc->vtable->base_type - 1]->pmc_class);
+            VTABLE_morph(interp, pmc, pmc->vtable->base_type - 1);
         else if (on && (pmc->vtable->flags & VTABLE_HAS_READONLY_FLAG))
             pmc->vtable = pmc->vtable->ro_variant_vtable;
         else if (!on && (pmc->vtable->flags & VTABLE_IS_READONLY_FLAG)
@@ -624,7 +624,7 @@
 
 /*
 
-=item C<void morph(PMC* type)>
+=item C<void morph(INTVAL type)>
 
 Changes the PMC to a PMC of a new type
 
@@ -632,8 +632,8 @@
 
 */
 
-    VTABLE void morph(PMC* type) {
-        pmc_reuse(INTERP, SELF, VTABLE_get_integer(interp, type), 0);
+    VTABLE void morph(INTVAL type) {
+        pmc_reuse(INTERP, SELF, type, 0);
     }
 
 /*

Modified: trunk/src/pmc/float.pmc
==============================================================================
--- trunk/src/pmc/float.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/float.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -170,12 +170,12 @@
 */
 
     VTABLE void set_integer_native(INTVAL value) {
-        pmc_reuse(INTERP, SELF, enum_class_Integer, 0);
+        SELF.morph(enum_class_Integer);
         SELF.set_integer_native(value);
     }
 
     VTABLE void set_bool(INTVAL value) {
-        pmc_reuse(INTERP, SELF, enum_class_Boolean, 0);
+        SELF.morph(enum_class_Boolean);
         SELF.set_bool(value);
     }
 
@@ -222,7 +222,7 @@
 */
 
     VTABLE void set_string_native(STRING *value) {
-        pmc_reuse(INTERP, SELF, enum_class_String, 0);
+        SELF.morph(enum_class_String);
         SELF.set_string_native(value);
     }
 

Modified: trunk/src/pmc/integer.pmc
==============================================================================
--- trunk/src/pmc/integer.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/integer.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -46,7 +46,7 @@
     /* Do an in-place upgrade to a Bignum of SELF and return a pointer
        to it (which is probably redundant, but whatever). */
     const INTVAL a = VTABLE_get_integer(interp, self);
-    pmc_reuse(interp, self, enum_class_BigInt, 0);
+    VTABLE_morph(interp, self, enum_class_BigInt);
     VTABLE_set_integer_native(interp, self, a);
     return self;
 }
@@ -313,25 +313,25 @@
 */
 
     VTABLE void set_number_native(FLOATVAL value) {
-        pmc_reuse(INTERP, SELF, enum_class_Float, 0);
+        SELF.morph(enum_class_Float);
         SELF.set_number_native(value);
     }
 
 
     VTABLE void set_bool(INTVAL value) {
-        pmc_reuse(INTERP, SELF, enum_class_Boolean, 0);
+        SELF.morph(enum_class_Boolean);
         SELF.set_bool(value);
     }
 
 
     VTABLE void set_bignum_int(INTVAL value) {
-        pmc_reuse(INTERP, SELF, enum_class_BigInt, 0);
+        SELF.morph(enum_class_BigInt);
         SELF.set_integer_native(value);
     }
 
 
     VTABLE void set_string_native(STRING *value) {
-        pmc_reuse(INTERP, SELF, enum_class_String, 0);
+        SELF.morph(enum_class_String);
         SELF.set_string_native(value);
     }
 
@@ -451,7 +451,7 @@
     MULTI void i_add(Complex value) {
         const INTVAL a = SELF.get_integer();
 
-        pmc_reuse(INTERP, SELF, enum_class_Complex, 0);
+        VTABLE_morph(INTERP, SELF, value->vtable->base_type);
         VTABLE_set_number_native(INTERP, SELF,
                 SELF.get_integer() + VTABLE_get_number(INTERP, value));
     }
@@ -609,7 +609,7 @@
     MULTI void i_subtract(Complex value) {
         const INTVAL a = SELF.get_integer();
 
-        pmc_reuse(INTERP, SELF, enum_class_Complex, 0);
+        VTABLE_morph(INTERP, SELF, value->vtable->base_type);
         VTABLE_set_number_native(INTERP, SELF,
                 (FLOATVAL)a - VTABLE_get_number_keyed_int(INTERP, value, 0));
         VTABLE_set_number_keyed_int(INTERP, SELF, 1,
@@ -1272,7 +1272,7 @@
         if ((c^a) >= 0 || (c^1) >= 0)
             VTABLE_set_integer_native(interp, SELF, c);
         else {
-            pmc_reuse(INTERP, SELF, enum_class_BigInt, 0);
+            VTABLE_morph(INTERP, SELF, enum_class_BigInt);
             VTABLE_set_integer_native(INTERP, SELF, a);
             VTABLE_increment(interp, SELF);
         }
@@ -1296,7 +1296,7 @@
         if ((c^a) >= 0 || (c^~1) >= 0)
             VTABLE_set_integer_native(interp, SELF, c);
         else {
-            pmc_reuse(INTERP, SELF, enum_class_BigInt, 0);
+            VTABLE_morph(interp, SELF, enum_class_BigInt);
             VTABLE_set_integer_native(interp, SELF, a);
             VTABLE_decrement(interp, SELF);
         }

Modified: trunk/src/pmc/object.pmc
==============================================================================
--- trunk/src/pmc/object.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/object.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -854,7 +854,7 @@
 
 /*
 
-=item C<void morph(PMC* type)>
+=item C<void morph(INTVAL type)>
 
 Changes the PMC to a PMC of a new type
 
@@ -862,15 +862,17 @@
 
 */
 
-    VTABLE void morph(PMC* type) {
+    VTABLE void morph(INTVAL type) {
         PMC    * const classobj = VTABLE_get_class(interp, SELF);
         STRING * meth_name      = CONST_STRING(interp, "morph");
         /* If there's a vtable override for 'morph' run that instead. */
         PMC * const method = Parrot_oo_find_vtable_override(interp,
                 classobj, meth_name);
 
-        if (!PMC_IS_NULL(method))
-            Parrot_run_meth_fromc_args(interp, method, SELF, meth_name, "vP", type);
+        if (!PMC_IS_NULL(method)) {
+            PMC * const _class = Parrot_oo_get_class_str(interp, interp->vtables[type]->whoami);
+            Parrot_run_meth_fromc_args(interp, method, SELF, meth_name, "vP", _class);
+        }
         else
             SUPER(type);
     }

Modified: trunk/src/pmc/pointer.pmc
==============================================================================
--- trunk/src/pmc/pointer.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/pointer.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -40,6 +40,19 @@
 
 /*
 
+=item C<void morph(INTVAL type)>
+
+Does nothing.
+
+=cut
+
+*/
+
+    VTABLE void morph(INTVAL type) {
+    }
+
+/*
+
 =item C<void mark()>
 
 Marks the pointer as live.

Modified: trunk/src/pmc/ref.pmc
==============================================================================
--- trunk/src/pmc/ref.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/ref.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -140,6 +140,19 @@
         return SUPER();
     }
 
+/*
+
+=item C<void morph(INTVAL type)>
+
+Changes the PMC to a PMC of a new type.
+
+=cut
+
+*/
+    VTABLE void morph(INTVAL type) {
+        SUPER(type);
+    }
+
 }
 
 /*

Modified: trunk/src/pmc/scalar.pmc
==============================================================================
--- trunk/src/pmc/scalar.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/scalar.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -73,7 +73,7 @@
     else {
         /* Overflow; must promote dest to BigInt, and do a BigInt shift. */
         if (self == dest)
-            pmc_reuse(interp, self, enum_class_BigInt, 0);
+            VTABLE_morph(interp, self, enum_class_BigInt);
         else
             dest = pmc_new(interp, enum_class_BigInt);
 
@@ -88,6 +88,21 @@
 
 /*
 
+=item C<void morph(INTVAL type)>
+
+Morphs the scalar to the specified type.
+
+=cut
+
+*/
+
+    VTABLE void morph(INTVAL type) {
+        if (SELF->vtable->base_type == type)
+            return;
+        pmc_reuse(INTERP, SELF, type, 0);
+    }
+/*
+
 =item C<void assign_pmc(PMC *value)>
 
 Sets the PMC C<*value>, calling the appropriate C<set_*> method
@@ -102,12 +117,13 @@
         STRING        *s_num;
         STRING        *s_str;
 
-        if (SELF->vtable->base_type == enum_class_Boolean)
+        if (SELF->vtable->base_type == enum_class_Boolean) {
             /* doesn't morph */
-            pmc_reuse(INTERP, SELF, value->vtable->base_type, 0);
+            SELF.morph(value->vtable->base_type);
+        }
 
         if (value->vtable->base_type == enum_class_Undef) {
-            pmc_reuse(INTERP, SELF, value->vtable->base_type, 0);
+            SELF.morph(value->vtable->base_type);
             return;
         }
 
@@ -132,7 +148,7 @@
             SELF.set_string_native(v);
             return;
         }
-        pmc_reuse(INTERP, SELF, enum_class_Ref, 0);
+        SELF.morph(enum_class_Ref);
         SELF.set_pmc(value);
     }
 
@@ -229,7 +245,7 @@
     MULTI void i_add(Complex value) {
         const FLOATVAL a = SELF.get_number();
 
-        pmc_reuse(INTERP, SELF, enum_class_Complex, 0);
+        VTABLE_morph(INTERP, SELF, value->vtable->base_type);
         VTABLE_set_number_native(INTERP, SELF,
                 a + VTABLE_get_number_keyed_int(INTERP, value, 0));
         VTABLE_set_number_keyed_int(INTERP, SELF, 1,
@@ -277,7 +293,7 @@
     MULTI PMC *subtract(Complex value, PMC *dest) {
         const FLOATVAL a = SELF.get_number();
         if (dest)
-            pmc_reuse(INTERP, dest, value->vtable->base_type, 0);
+            VTABLE_morph(INTERP, dest, value->vtable->base_type);
         else
             dest = pmc_new(INTERP, VTABLE_type(INTERP, value));
 
@@ -314,7 +330,7 @@
     MULTI void i_subtract(Complex value) {
         const FLOATVAL a = SELF.get_number();
 
-        pmc_reuse(INTERP, SELF, enum_class_Complex, 0);
+        VTABLE_morph(INTERP, SELF, value->vtable->base_type);
         VTABLE_set_number_native(INTERP, SELF,
                 a - VTABLE_get_number_keyed_int(INTERP, value, 0));
         VTABLE_set_number_keyed_int(INTERP, SELF, 1,

Modified: trunk/src/pmc/undef.pmc
==============================================================================
--- trunk/src/pmc/undef.pmc	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/pmc/undef.pmc	Wed Feb 11 01:52:58 2009	(r36570)
@@ -40,7 +40,7 @@
 */
 
     VTABLE void set_pmc(PMC *other) {
-        pmc_reuse(INTERP, SELF, enum_class_Ref, 0);
+        VTABLE_morph(INTERP, SELF, enum_class_Ref);
         VTABLE_set_pmc(INTERP, SELF, other);
     }
 
@@ -57,7 +57,7 @@
 
     VTABLE void assign_pmc(PMC *other) {
         if (!PObj_is_object_TEST(other))
-            pmc_reuse(INTERP, SELF, other->vtable->base_type, 0);
+            VTABLE_morph(INTERP, SELF, other->vtable->base_type);
 
         /* don't want to call set_pmc if we're assigning an Undef to an Undef */
         if (other->vtable->base_type != enum_class_Undef)
@@ -104,7 +104,7 @@
 */
 
     VTABLE void set_integer_native(INTVAL value) {
-        pmc_reuse(INTERP, SELF, enum_class_Integer, 0);
+        VTABLE_morph(INTERP, SELF, enum_class_Integer);
         VTABLE_set_integer_native(INTERP, SELF, value);
     }
 
@@ -133,7 +133,7 @@
 */
 
     VTABLE void set_number_native(FLOATVAL value) {
-        pmc_reuse(INTERP, SELF, enum_class_Float, 0);
+        VTABLE_morph(INTERP, SELF, enum_class_Float);
         VTABLE_set_number_native(INTERP, SELF, value);
     }
 
@@ -165,7 +165,7 @@
 */
 
     VTABLE void set_string_native(STRING *value) {
-        pmc_reuse(interp, SELF, enum_class_String, 0);
+        VTABLE_morph(INTERP, SELF, UNDEF_STRING_CLASS);
         VTABLE_set_string_native(INTERP, SELF, value);
     }
 

Modified: trunk/src/vtable.tbl
==============================================================================
--- trunk/src/vtable.tbl	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/src/vtable.tbl	Wed Feb 11 01:52:58 2009	(r36570)
@@ -11,7 +11,7 @@
 void init_pmc(PMC* initializer)
 PMC* instantiate(PMC* sig)
 PMC* instantiate_str(STRING* rep, INTVAL flags)
-void morph(PMC* type) :write
+void morph(INTVAL type) :write
 void mark()
 void destroy()
 PMC* get_namespace()

Modified: trunk/t/oo/vtableoverride.t
==============================================================================
--- trunk/t/oo/vtableoverride.t	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/t/oo/vtableoverride.t	Wed Feb 11 01:52:58 2009	(r36570)
@@ -44,23 +44,21 @@
     is ($I0, 0, "no it doesn't")
 
     # Test morph (doesn't actually perform a morph)
-    $P2 = get_class 'String'
-    morph $P1, $P2
+    morph $P1, "String"
     $P0 = getattribute $P1, "message"
     $S0 = $P0
     is($S0, "Morphing [MyObject] to type String", "Morph VTABLE override 1")
 
-    $P2 = get_class 'Integer'
-    morph $P1, $P2
+    morph $P1, "Integer"
     $P0 = getattribute $P1, "message"
     $S0 = $P0
     is($S0, "Morphing [MyObject] to type Integer", "Morph VTABLE override 1")
-
+    
     # Test invoke. Doesn't currently work so we need to fix that.
     #$P0 = $P1("invoked!")
     #$S0 = $P0
     #is($S0, "invoked!", "Invoke VTABLE override return value")
-
+    
     #$P0 = getattribute $P1, "message"
     #$S0 = $P0
     #is($S0, "invoked!", "Invoke VTABLE override sideeffects")

Modified: trunk/t/pmc/undef.t
==============================================================================
--- trunk/t/pmc/undef.t	Wed Feb 11 01:44:02 2009	(r36569)
+++ trunk/t/pmc/undef.t	Wed Feb 11 01:52:58 2009	(r36570)
@@ -99,8 +99,7 @@
 .sub string_pmc_morph_to_undef
     .local pmc pmc1
     pmc1 = new ['String']
-    $P0 = get_class 'Undef'
-    morph pmc1, $P0
+    morph pmc1, 'Undef'
     $S1 = typeof pmc1
     is( $S1, 'Undef', 'PMC String morph to undef' )
 .end


More information about the parrot-commits mailing list