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

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


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

Log:
[pmc] Reuse dest if possible in Scalar ops.

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

Modified: branches/tt452_reduce_mmd/src/pmc/scalar.pmc
==============================================================================
--- branches/tt452_reduce_mmd/src/pmc/scalar.pmc	Wed May 27 23:35:12 2009	(r39204)
+++ branches/tt452_reduce_mmd/src/pmc/scalar.pmc	Wed May 27 23:35:32 2009	(r39205)
@@ -82,6 +82,33 @@
     return dest;
 }
 
+/* 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 self is required */
+    if (dest->vtable->base_type != self->vtable->base_type)
+        pmc_reuse(interp, dest, self->vtable->base_type, 0);
+
+    VTABLE_set_number_native(interp, dest, VTABLE_get_number(interp, self));
+    return dest;
+}
+
 pmclass scalar {
 
 /*
@@ -173,14 +200,14 @@
 
 
     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;
     }
 
 
     VTABLE PMC *add_int(INTVAL value, PMC *dest) {
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 SELF.get_number() + (FLOATVAL)value);
@@ -188,7 +215,7 @@
     }
 
     VTABLE PMC *add_float(FLOATVAL value, PMC *dest) {
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 SELF.get_number() + value);
@@ -246,13 +273,13 @@
 */
 
     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;
     }
 
     VTABLE PMC *subtract_int(INTVAL value, PMC *dest) {
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 SELF.get_number() - (FLOATVAL)value);
@@ -260,7 +287,7 @@
     }
 
     VTABLE PMC *subtract_float(FLOATVAL value, PMC *dest) {
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 SELF.get_number() - value);
@@ -314,7 +341,7 @@
     }
 
     MULTI PMC *multiply(DEFAULT value, PMC *dest) {
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
 
         VTABLE_set_number_native(INTERP, dest,
             SELF.get_number() * VTABLE_get_number(INTERP, value));
@@ -322,7 +349,7 @@
     }
 
     VTABLE PMC *multiply_int(INTVAL value, PMC *dest) {
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
             SELF.get_number() * value);
@@ -330,7 +357,7 @@
     }
 
     VTABLE PMC *multiply_float(FLOATVAL value, PMC *dest) {
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
             SELF.get_number() * value);
@@ -386,7 +413,7 @@
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_DIV_BY_ZERO,
                 "float division by zero");
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
 
         VTABLE_set_number_native(INTERP, dest, SELF.get_number() / d);
         return dest;
@@ -397,7 +424,7 @@
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_DIV_BY_ZERO,
                 "float division by zero");
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest, SELF.get_number() / value);
         return dest;
@@ -408,7 +435,7 @@
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_DIV_BY_ZERO,
                 "float division by zero");
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest, SELF.get_number() / value);
         return dest;
@@ -469,7 +496,7 @@
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_DIV_BY_ZERO,
                 "float division by zero");
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
         d    = floor(SELF.get_number() / d);
 
         VTABLE_set_integer_native(INTERP, dest, (INTVAL)d);
@@ -481,7 +508,7 @@
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_DIV_BY_ZERO,
                 "float division by zero");
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 floor(SELF.get_number() / value));
@@ -493,7 +520,7 @@
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_DIV_BY_ZERO,
                 "float division by zero");
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 floor(SELF.get_number() / value));
@@ -559,7 +586,7 @@
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_DIV_BY_ZERO,
                 "float modulus by zero");
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 floatval_mod(SELF.get_number(), d));
@@ -571,7 +598,7 @@
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_DIV_BY_ZERO,
                 "float modulus by zero");
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 floatval_mod(SELF.get_number(), (FLOATVAL)value));
@@ -583,7 +610,7 @@
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_DIV_BY_ZERO,
                 "float modulus by zero");
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 floatval_mod(SELF.get_number(), value));
@@ -645,14 +672,14 @@
     VTABLE PMC *pow(PMC *value, PMC *dest) {
         const FLOATVAL d = VTABLE_get_number(INTERP, value);
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
 
         VTABLE_set_number_native(INTERP, dest, pow(SELF.get_number(), d));
         return dest;
     }
 
     VTABLE PMC *pow_int(INTVAL value, PMC *dest) {
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 pow(SELF.get_number(), (double)value));
@@ -661,7 +688,7 @@
     }
 
     VTABLE PMC *pow_float(FLOATVAL value, PMC *dest) {
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_number_native(INTERP, dest,
                 pow(SELF.get_number(), value));
@@ -700,7 +727,7 @@
     VTABLE PMC *neg(PMC *dest) {
         const INTVAL a = -SELF.get_integer();
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_integer_native(INTERP, dest, a);
         return dest;
@@ -737,7 +764,7 @@
     VTABLE PMC *bitwise_or(PMC *value, PMC *dest) {
         const INTVAL result = SELF.get_integer() | VTABLE_get_integer(INTERP, value);
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_integer_native(INTERP, dest, result);
         return dest;
@@ -747,7 +774,7 @@
     VTABLE PMC *bitwise_or_int(INTVAL value, PMC *dest) {
         const INTVAL result = SELF.get_integer() | value;
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_integer_native(INTERP, dest, result);
         return dest;
@@ -788,7 +815,7 @@
         const INTVAL result =
             SELF.get_integer() & VTABLE_get_integer(INTERP, value);
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_integer_native(INTERP, dest, result);
         return dest;
@@ -797,7 +824,7 @@
     VTABLE PMC *bitwise_and_int(INTVAL value, PMC *dest) {
         const INTVAL result = SELF.get_integer() & value;
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_integer_native(INTERP, dest, result);
         return dest;
@@ -837,7 +864,7 @@
         const INTVAL result =
             SELF.get_integer() ^ VTABLE_get_integer(INTERP, value);
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
 
         VTABLE_set_integer_native(INTERP, dest, result);
         return dest;
@@ -846,7 +873,7 @@
     VTABLE PMC *bitwise_xor_int(INTVAL value, PMC *dest) {
         const INTVAL result = SELF.get_integer() ^ value;
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_integer_native(INTERP, dest, result);
         return dest;
@@ -878,7 +905,7 @@
     VTABLE PMC *bitwise_not(PMC *dest) {
         const INTVAL a = ~SELF.get_integer();
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_integer_native(INTERP, dest, a);
         return dest;
@@ -951,7 +978,7 @@
         const INTVAL result = (UINTVAL)SELF.get_integer() >>
             VTABLE_get_integer(INTERP, value);
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
 
         VTABLE_set_integer_native(INTERP, dest, result);
         return dest;
@@ -960,7 +987,7 @@
     VTABLE PMC *bitwise_lsr_int(INTVAL value, PMC *dest) {
         const INTVAL result = (UINTVAL)SELF.get_integer() >> value;
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_integer_native(INTERP, dest, result);
         return dest;
@@ -1043,7 +1070,7 @@
         STRING * s = SELF.get_string();
         s = Parrot_str_append(interp, s, VTABLE_get_string(INTERP, value));
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
 
         VTABLE_set_string_native(INTERP, dest, s);
         return dest;
@@ -1053,7 +1080,7 @@
         STRING * const s = Parrot_str_concat(INTERP,
             SELF.get_string(), value, 0);
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_string_native(INTERP, dest, s);
         return dest;
@@ -1092,7 +1119,7 @@
         STRING * const s = SELF.get_string();
         const UINTVAL  n = (UINTVAL)VTABLE_get_integer(INTERP, value);
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
 
         VTABLE_set_string_native(INTERP, dest,
             Parrot_str_repeat(INTERP, s, n));
@@ -1103,7 +1130,7 @@
         STRING * const s = SELF.get_string();
         const UINTVAL  n = value;
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_string_native(INTERP, dest,
             Parrot_str_repeat(INTERP, s, n));
@@ -1258,7 +1285,7 @@
         else if (value_bool && ! my_bool)
             return value;
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, value, dest);
         VTABLE_set_bool(INTERP, dest, 0);
         return dest;
     }
@@ -1279,7 +1306,7 @@
     VTABLE PMC *logical_not(PMC *dest) {
         const INTVAL a = ! SELF.get_bool();
 
-        dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF));
+        dest = reuse_or_clone(INTERP, SELF, NULL, dest);
 
         VTABLE_set_bool(INTERP, dest, a);
         return dest;


More information about the parrot-commits mailing list