[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