[svn:parrot] r39204 - branches/tt452_reduce_mmd/src/pmc

bacek at svn.parrot.org bacek at svn.parrot.org
Wed May 27 23:35:13 UTC 2009


Author: bacek
Date: Wed May 27 23:35:12 2009
New Revision: 39204
URL: https://trac.parrot.org/parrot/changeset/39204

Log:
[pmc] Reuse dest PMC in Integer ariphmetic ops.

Modified:
   branches/tt452_reduce_mmd/src/pmc/integer.pmc

Modified: branches/tt452_reduce_mmd/src/pmc/integer.pmc
==============================================================================
--- branches/tt452_reduce_mmd/src/pmc/integer.pmc	Wed May 27 23:01:29 2009	(r39203)
+++ branches/tt452_reduce_mmd/src/pmc/integer.pmc	Wed May 27 23:35:12 2009	(r39204)
@@ -43,6 +43,33 @@
     return self;
 }
 
+/* Try to reuse dest PMC if possible */
+static PMC*
+reuse_or_clone(PARROT_INTERP, PMC *self, PMC * value, PMC *dest)
+{
+    /* Can't reuse dest because we'll lost value */
+    if (dest == value)
+        return VTABLE_clone(interp, self);
+
+    /* Can't reuse Null */
+    if (PMC_IS_NULL(dest))
+        return VTABLE_clone(interp, self);
+        
+    /* Can't reuse read-only variables */
+    if (dest->vtable->flags & VTABLE_IS_READONLY_FLAG)
+        return VTABLE_clone(interp, self);
+
+    if (dest == self)
+        return dest;
+
+    /* Morph to Integer is required */
+    if (dest->vtable->base_type != enum_class_Integer)
+        pmc_reuse(interp, dest, enum_class_Integer, 0);
+
+    VTABLE_set_integer_native(interp, dest, VTABLE_get_integer(interp, self));
+    return dest;
+}
+
 pmclass Integer extends scalar provides integer provides scalar {
     ATTR INTVAL iv; /* the value of this Integer */
 
@@ -342,7 +369,7 @@
 */
 
     VTABLE PMC *add(PMC *value, PMC *dest) {
-        dest = VTABLE_clone(INTERP, SELF);
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
         VTABLE_i_add(INTERP, dest, value);
         return dest;
     }
@@ -456,7 +483,7 @@
 */
 
     VTABLE PMC *subtract(PMC *value, PMC *dest) {
-        dest = VTABLE_clone(INTERP, SELF);
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
         VTABLE_i_subtract(INTERP, dest, value);
         return dest;
     }
@@ -578,7 +605,7 @@
 */
 
     VTABLE PMC *multiply(PMC *value, PMC *dest) {
-        dest = VTABLE_clone(interp, pmc);
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
         VTABLE_i_multiply(INTERP, dest, value);
         return dest;
     }
@@ -701,7 +728,7 @@
 */
 
     VTABLE PMC *divide(PMC *value, PMC *dest) {
-        dest = VTABLE_clone(INTERP, SELF);
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
         VTABLE_i_divide(INTERP, dest, value);
         return dest;
     }
@@ -773,7 +800,7 @@
 */
 
     VTABLE PMC *floor_divide(PMC *value, PMC *dest) {
-        dest = VTABLE_clone(INTERP, SELF);
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
         VTABLE_i_floor_divide(INTERP, dest, value);
         return dest;
     }
@@ -877,7 +904,7 @@
 
 
     VTABLE PMC *modulus(PMC *value, PMC *dest) {
-        dest = VTABLE_clone(INTERP, SELF);
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
         VTABLE_i_modulus(INTERP, dest, value);
         return dest;
     }


More information about the parrot-commits mailing list