diff options
author | Andi Gutmans <andi@php.net> | 2004-03-14 15:45:09 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2004-03-14 15:45:09 +0000 |
commit | 515e28ed5ba309e1ca2749139787ecf8301c51b2 (patch) | |
tree | 306b56ab15e5bbd0c48fc382aa733600a5dd359d /Zend/zend_operators.c | |
parent | decc3fc6e63eb0b0f09dbe94753a5905f617736b (diff) | |
download | php-git-515e28ed5ba309e1ca2749139787ecf8301c51b2.tar.gz |
- Support old style of converting objects to long/double/bool.
- This is only enabled in compatibility mode, else it calls cast_object()
- and if that is not available we return 1 (true) so that the following
- code would work:
if ($obj) {
}
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r-- | Zend/zend_operators.c | 84 |
1 files changed, 65 insertions, 19 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index e1a0642a58..c453e05db0 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -299,15 +299,30 @@ ZEND_API void convert_to_long_base(zval *op, int base) op->value.lval = tmp; break; case IS_OBJECT: - if (op->value.obj.handlers->cast_object) { + { TSRMLS_FETCH(); - if (op->value.obj.handlers->cast_object(op, op, IS_LONG, 1 TSRMLS_CC) == SUCCESS) { - break; + + if (op->value.obj.handlers->cast_object) { + if (op->value.obj.handlers->cast_object(op, op, IS_LONG, 1 TSRMLS_CC) == SUCCESS) { + break; + } + } else { + int retval = 1; + + if (EG(ze1_compatibility_mode)) { + HashTable *ht = Z_OBJPROP_P(op); + if (ht) { + retval = (zend_hash_num_elements(ht)?1:0); + } + } else { + zend_error(E_NOTICE, "Object of class %s could not be converted to integer", Z_OBJCE_P(op)->name); + } + + zval_dtor(op); + ZVAL_LONG(op, retval); } + break; } - zval_dtor(op); - op->value.lval = 1; - break; default: zend_error(E_WARNING, "Cannot convert to ordinal value"); zval_dtor(op); @@ -352,15 +367,31 @@ ZEND_API void convert_to_double(zval *op) op->value.dval = tmp; break; case IS_OBJECT: - if (op->value.obj.handlers->cast_object) { + { TSRMLS_FETCH(); - if (op->value.obj.handlers->cast_object(op, op, IS_DOUBLE, 1 TSRMLS_CC) == SUCCESS) { - break; + + if (op->value.obj.handlers->cast_object) { + TSRMLS_FETCH(); + if (op->value.obj.handlers->cast_object(op, op, IS_DOUBLE, 1 TSRMLS_CC) == SUCCESS) { + break; + } + } else { + double retval = 1.0; + + if (EG(ze1_compatibility_mode)) { + HashTable *ht = Z_OBJPROP_P(op); + if (ht) { + retval = (zend_hash_num_elements(ht)?1.0:0.0); + } + } else { + zend_error(E_NOTICE, "Object of class %s could not be converted to double", Z_OBJCE_P(op)->name); + } + + zval_dtor(op); + ZVAL_DOUBLE(op, retval); } - } - zval_dtor(op); - op->value.dval = 1; /* TBI!! */ - break; + break; + } default: zend_error(E_WARNING, "Cannot convert to real value (type=%d)", op->type); zval_dtor(op); @@ -427,15 +458,30 @@ ZEND_API void convert_to_boolean(zval *op) op->value.lval = tmp; break; case IS_OBJECT: - if (op->value.obj.handlers->cast_object) { + { TSRMLS_FETCH(); - if (op->value.obj.handlers->cast_object(op, op, IS_BOOL, 1 TSRMLS_CC) == SUCCESS) { - break; + + if (op->value.obj.handlers->cast_object) { + if (op->value.obj.handlers->cast_object(op, op, IS_BOOL, 1 TSRMLS_CC) == SUCCESS) { + break; + } + } else { + zend_bool retval = 1; + + if (EG(ze1_compatibility_mode)) { + HashTable *ht = Z_OBJPROP_P(op); + if (ht) { + retval = (zend_hash_num_elements(ht)?1:0); + } + } else { + zend_error(E_NOTICE, "Object of class %s could not be converted to boolean", Z_OBJCE_P(op)->name); + } + + zval_dtor(op); + ZVAL_BOOL(op, retval); } + break; } - zval_dtor(op); - op->value.lval = 1; /* TBI!! */ - break; default: zval_dtor(op); op->value.lval = 0; |