diff options
| author | Sterling Hughes <sterling@php.net> | 2003-05-27 18:52:25 +0000 |
|---|---|---|
| committer | Sterling Hughes <sterling@php.net> | 2003-05-27 18:52:25 +0000 |
| commit | ae2bfb78808099609f516b4be0d4282c528d192a (patch) | |
| tree | ddf55cc49d076fc50ec7e6c034c5a99b5dc2b798 /Zend/zend_operators.c | |
| parent | c60879dbb92fde970a95598fc1b860a1cda75f46 (diff) | |
| download | php-git-ae2bfb78808099609f516b4be0d4282c528d192a.tar.gz | |
Assume lazy consensus regarding the cast_object() patch. *Only* implemented
from a internals perspective. This callback has been very useful for both
ext/mono and ext/simplexml
Diffstat (limited to 'Zend/zend_operators.c')
| -rw-r--r-- | Zend/zend_operators.c | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 18408fed72..20a967197d 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -328,8 +328,13 @@ ZEND_API void convert_to_long_base(zval *op, int base) op->value.lval = tmp; break; case IS_OBJECT: - zval_dtor(op); - op->value.lval = 1; /* TBI!! */ + if (op->value.obj.handlers->cast_object) { + TSRMLS_FETCH(); + op->value.obj.handlers->cast_object(op, op, IS_LONG, 1 TSRMLS_CC); + } else { + zval_dtor(op); + op->value.lval = 1; + } break; default: zend_error(E_WARNING, "Cannot convert to ordinal value"); @@ -375,8 +380,13 @@ ZEND_API void convert_to_double(zval *op) op->value.dval = tmp; break; case IS_OBJECT: - zval_dtor(op); - op->value.dval = 1; /* TBI!! */ + if (op->value.obj.handlers->cast_object) { + TSRMLS_FETCH(); + op->value.obj.handlers->cast_object(op, op, IS_DOUBLE, 1 TSRMLS_CC); + } else { + zval_dtor(op); + op->value.dval = 1; /* TBI!! */ + } break; default: zend_error(E_WARNING, "Cannot convert to real value (type=%d)", op->type); @@ -390,6 +400,14 @@ ZEND_API void convert_to_double(zval *op) ZEND_API void convert_to_null(zval *op) { + if (op->type == IS_OBJECT) { + if (op->value.obj.handlers->cast_object) { + TSRMLS_FETCH(); + op->value.obj.handlers->cast_object(op, op, IS_NULL, 1 TSRMLS_CC); + return; + } + } + zval_dtor(op); op->type = IS_NULL; } @@ -435,8 +453,13 @@ ZEND_API void convert_to_boolean(zval *op) op->value.lval = tmp; break; case IS_OBJECT: - zval_dtor(op); - op->value.lval = 1; /* TBI!! */ + if (op->value.obj.handlers->cast_object) { + TSRMLS_FETCH(); + op->value.obj.handlers->cast_object(op, op, IS_BOOL, 1 TSRMLS_CC); + } else { + zval_dtor(op); + op->value.lval = 1; /* TBI!! */ + } break; default: zval_dtor(op); @@ -497,10 +520,15 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) zend_error(E_NOTICE, "Array to string conversion"); break; case IS_OBJECT: - zval_dtor(op); - op->value.str.val = estrndup_rel("Object", sizeof("Object")-1); - op->value.str.len = sizeof("Object")-1; - zend_error(E_NOTICE, "Object to string conversion"); + if (op->value.obj.handlers->cast_object) { + TSRMLS_FETCH(); + op->value.obj.handlers->cast_object(op, op, IS_STRING, 1 TSRMLS_CC); + } else { + zval_dtor(op); + op->value.str.val = estrndup_rel("Object", sizeof("Object")-1); + op->value.str.len = sizeof("Object")-1; + zend_error(E_NOTICE, "Object to string conversion"); + } break; default: zval_dtor(op); |
