[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