Author: chromatic
Date: Thu Dec 18 18:40:06 2008
New Revision: 34098
Modified:
trunk/src/ops/cmp.ops
Log:
[ops] Made some temporary PMCs used in comparison opcodes *real* temporary PMCs.
Modified: trunk/src/ops/cmp.ops
==============================================================================
--- trunk/src/ops/cmp.ops (original)
+++ trunk/src/ops/cmp.ops Thu Dec 18 18:40:06 2008
@@ -92,11 +92,15 @@
}
op eq(invar PMC, in INT, inconst LABEL) :base_core {
- PMC *temp = pmc_new(interp, enum_class_Integer);
+ PMC *temp = temporary_pmc_new(interp, enum_class_Integer);
VTABLE_set_integer_native(interp, temp, $2);
+
if (VTABLE_is_equal(interp, $1, temp)) {
+ temporary_pmc_free(interp, temp);
goto OFFSET($3);
}
+
+ temporary_pmc_free(interp, temp);
}
op eq(invar PMC, in NUM, inconst LABEL) :base_core {
@@ -195,11 +199,15 @@
}
op ne(invar PMC, in INT, inconst LABEL) :base_core {
- PMC *temp = pmc_new(interp, enum_class_Integer);
+ PMC *temp = temporary_pmc_new(interp, enum_class_Integer);
VTABLE_set_integer_native(interp, temp, $2);
+
if (!VTABLE_is_equal(interp, $1, temp)) {
+ temporary_pmc_free(interp, temp);
goto OFFSET($3);
}
+
+ temporary_pmc_free(interp, temp);
}
op ne(invar PMC, in NUM, inconst LABEL) :base_core {
@@ -288,12 +296,15 @@
}
op lt(invar PMC, in INT, inconst LABEL) :base_core {
- PMC *temp = pmc_new(interp, enum_class_Integer);
- INTVAL result;
+ PMC *temp = temporary_pmc_new(interp, enum_class_Integer);
PMC_int_val(temp) = $2;
+
if (VTABLE_cmp(interp, $1, temp) < 0) {
+ temporary_pmc_free(interp, temp);
goto OFFSET($3);
}
+
+ temporary_pmc_free(interp, temp);
}
op lt(invar PMC, in NUM, inconst LABEL) :base_core {
@@ -370,11 +381,15 @@
}
op le(invar PMC, in INT, inconst LABEL) :base_core {
- PMC *temp = pmc_new(interp, enum_class_Integer);
+ PMC *temp = temporary_pmc_new(interp, enum_class_Integer);
PMC_int_val(temp) = $2;
+
if (VTABLE_cmp(interp, $1, temp) <= 0) {
+ temporary_pmc_free(interp, temp);
goto OFFSET($3);
}
+
+ temporary_pmc_free(interp, temp);
}
op le(invar PMC, in NUM, inconst LABEL) :base_core {
@@ -427,11 +442,15 @@
}
op gt(invar PMC, in INT, inconst LABEL) :base_core {
- PMC *temp = pmc_new(interp, enum_class_Integer);
+ PMC *temp = temporary_pmc_new(interp, enum_class_Integer);
PMC_int_val(temp) = $2;
+
if (VTABLE_cmp(interp, $1, temp) > 0) {
+ temporary_pmc_free(interp, temp);
goto OFFSET($3);
}
+
+ temporary_pmc_free(interp, temp);
}
op gt(invar PMC, in NUM, inconst LABEL) :base_core {
@@ -484,11 +503,15 @@
}
op ge(invar PMC, in INT, inconst LABEL) :base_core {
- PMC *temp = pmc_new(interp, enum_class_Integer);
+ PMC *temp = temporary_pmc_new(interp, enum_class_Integer);
PMC_int_val(temp) = $2;
+
if (VTABLE_cmp(interp, $1, temp) >= 0) {
+ temporary_pmc_free(interp, temp);
goto OFFSET($3);
}
+
+ temporary_pmc_free(interp, temp);
}
op ge(invar PMC, in NUM, inconst LABEL) :base_core {