summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2004-03-14 15:45:09 +0000
committerAndi Gutmans <andi@php.net>2004-03-14 15:45:09 +0000
commit515e28ed5ba309e1ca2749139787ecf8301c51b2 (patch)
tree306b56ab15e5bbd0c48fc382aa733600a5dd359d /Zend/zend_operators.c
parentdecc3fc6e63eb0b0f09dbe94753a5905f617736b (diff)
downloadphp-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.c84
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;