}
}
-#define zendi_convert_scalar_to_number(op, holder) \
- if ((op)->type == IS_STRING) { \
+#define zendi_convert_scalar_to_number(op, holder, result) \
+ if (op==result) { \
+ convert_scalar_to_number(op); \
+ } else if ((op)->type == IS_STRING) { \
switch (((holder).type=is_numeric_string((op)->value.str.val, (op)->value.str.len, &(holder).value.lval, &(holder).value.dval))) { \
case IS_DOUBLE: \
case IS_LONG: \
}
-#define zendi_convert_to_long(op, holder) \
- if ((op)->type != IS_LONG) { \
+#define zendi_convert_to_long(op, holder, result) \
+ if (op==result) { \
+ convert_to_long(op); \
+ } else if ((op)->type != IS_LONG) { \
switch ((op)->type) { \
case IS_BOOL: \
case IS_RESOURCE: \
}
-#define zendi_convert_to_boolean(op, holder) \
- if ((op)->type != IS_BOOL) { \
+#define zendi_convert_to_boolean(op, holder, result) \
+ if (op==result) { \
+ convert_to_boolean(op); \
+ } else if ((op)->type != IS_BOOL) { \
switch ((op)->type) { \
case IS_LONG: \
case IS_RESOURCE: \
zend_hash_merge(result->value.ht, op2->value.ht, (void (*)(void *pData)) zval_add_ref, (void *) &tmp, sizeof(zval *), 0);
return SUCCESS;
}
- zendi_convert_scalar_to_number(op1, op1_copy);
- zendi_convert_scalar_to_number(op2, op2_copy);
+ zendi_convert_scalar_to_number(op1, op1_copy, result);
+ zendi_convert_scalar_to_number(op2, op2_copy, result);
+
if (op1->type == IS_LONG && op2->type == IS_LONG) {
double dval = (double) op1->value.lval + (double) op2->value.lval;
{
zval op1_copy, op2_copy;
- zendi_convert_scalar_to_number(op1, op1_copy);
- zendi_convert_scalar_to_number(op2, op2_copy);
+ zendi_convert_scalar_to_number(op1, op1_copy, result);
+ zendi_convert_scalar_to_number(op2, op2_copy, result);
if (op1->type == IS_LONG && op2->type == IS_LONG) {
double dval = (double) op1->value.lval - (double) op2->value.lval;
{
zval op1_copy, op2_copy;
- zendi_convert_scalar_to_number(op1, op1_copy);
- zendi_convert_scalar_to_number(op2, op2_copy);
+ zendi_convert_scalar_to_number(op1, op1_copy, result);
+ zendi_convert_scalar_to_number(op2, op2_copy, result);
if (op1->type == IS_LONG && op2->type == IS_LONG) {
double dval = (double) op1->value.lval * (double) op2->value.lval;
{
zval op1_copy, op2_copy;
- zendi_convert_scalar_to_number(op1, op1_copy);
- zendi_convert_scalar_to_number(op2, op2_copy);
+ zendi_convert_scalar_to_number(op1, op1_copy, result);
+ zendi_convert_scalar_to_number(op2, op2_copy, result);
if ((op2->type == IS_LONG && op2->value.lval == 0) || (op2->type == IS_DOUBLE && op2->value.dval == 0.0)) {
zend_error(E_WARNING, "Division by zero");
{
zval op1_copy, op2_copy;
- zendi_convert_to_long(op1, op1_copy);
- zendi_convert_to_long(op2, op2_copy);
+ zendi_convert_to_long(op1, op1_copy, result);
+ zendi_convert_to_long(op2, op2_copy, result);
if (op2->value.lval == 0) {
var_reset(result);
result->type = IS_BOOL;
- zendi_convert_to_boolean(op1, op1_copy);
+ zendi_convert_to_boolean(op1, op1_copy, result);
if (op1->value.lval) {
result->value.lval = 1;
return SUCCESS;
}
- zendi_convert_to_boolean(op2, op2_copy);
+ zendi_convert_to_boolean(op2, op2_copy, result);
if (op2->value.lval) {
result->value.lval = 1;
return SUCCESS;
result->type = IS_BOOL;
- zendi_convert_to_boolean(op1, op1_copy);
+ zendi_convert_to_boolean(op1, op1_copy, result);
if (!op1->value.lval) {
result->value.lval = 0;
return SUCCESS;
}
- zendi_convert_to_boolean(op2, op2_copy);
+ zendi_convert_to_boolean(op2, op2_copy, result);
if (!op2->value.lval) {
result->value.lval = 0;
return SUCCESS;
result->type = IS_BOOL;
- zendi_convert_to_boolean(op1, op1_copy);
- zendi_convert_to_boolean(op2, op2_copy);
+ zendi_convert_to_boolean(op1, op1_copy, result);
+ zendi_convert_to_boolean(op2, op2_copy, result);
result->value.lval = op1->value.lval ^ op2->value.lval;
return SUCCESS;
}
{
zval op1_copy;
- zendi_convert_to_boolean(op1, op1_copy);
+ zendi_convert_to_boolean(op1, op1_copy, result);
result->type = IS_BOOL;
result->value.lval = !op1->value.lval;
}
return SUCCESS;
}
- zendi_convert_to_long(op1, op1_copy);
- zendi_convert_to_long(op2, op2_copy);
+ zendi_convert_to_long(op1, op1_copy, result);
+ zendi_convert_to_long(op2, op2_copy, result);
result->type = IS_LONG;
result->value.lval = op1->value.lval | op2->value.lval;
}
- zendi_convert_to_long(op1, op1_copy);
- zendi_convert_to_long(op2, op2_copy);
+ zendi_convert_to_long(op1, op1_copy, result);
+ zendi_convert_to_long(op2, op2_copy, result);
result->type = IS_LONG;
result->value.lval = op1->value.lval & op2->value.lval;
return SUCCESS;
}
- zendi_convert_to_long(op1, op1_copy);
- zendi_convert_to_long(op2, op2_copy);
+ zendi_convert_to_long(op1, op1_copy, result);
+ zendi_convert_to_long(op2, op2_copy, result);
result->type = IS_LONG;
result->value.lval = op1->value.lval ^ op2->value.lval;
{
zval op1_copy, op2_copy;
- zendi_convert_to_long(op1, op1_copy);
- zendi_convert_to_long(op2, op2_copy);
+ zendi_convert_to_long(op1, op1_copy, result);
+ zendi_convert_to_long(op2, op2_copy, result);
result->value.lval = op1->value.lval << op2->value.lval;
result->type = IS_LONG;
return SUCCESS;
{
zval op1_copy, op2_copy;
- zendi_convert_to_long(op1, op1_copy);
- zendi_convert_to_long(op2, op2_copy);
+ zendi_convert_to_long(op1, op1_copy, result);
+ zendi_convert_to_long(op2, op2_copy, result);
result->value.lval = op1->value.lval >> op2->value.lval;
result->type = IS_LONG;
return SUCCESS;
zval op1_copy, op2_copy;
if (op1->type == IS_STRING && op2->type == IS_STRING) {
- zendi_smart_strcmp(result,op1,op2);
+ zendi_smart_strcmp(result, op1, op2);
return SUCCESS;
}
if (op1->type == IS_BOOL || op2->type == IS_BOOL) {
- zendi_convert_to_boolean(op1, op1_copy);
- zendi_convert_to_boolean(op2, op2_copy);
+ zendi_convert_to_boolean(op1, op1_copy, result);
+ zendi_convert_to_boolean(op2, op2_copy, result);
result->type = IS_LONG;
result->value.lval = op1->value.lval - op2->value.lval;
return SUCCESS;
}
- zendi_convert_scalar_to_number(op1, op1_copy);
- zendi_convert_scalar_to_number(op2, op2_copy);
+ zendi_convert_scalar_to_number(op1, op1_copy, result);
+ zendi_convert_scalar_to_number(op2, op2_copy, result);
if (op1->type == IS_LONG && op2->type == IS_LONG) {
result->type = IS_LONG;