]> granicus.if.org Git - php/commitdiff
Assume lazy consensus regarding the cast_object() patch. *Only* implemented
authorSterling Hughes <sterling@php.net>
Tue, 27 May 2003 18:52:25 +0000 (18:52 +0000)
committerSterling Hughes <sterling@php.net>
Tue, 27 May 2003 18:52:25 +0000 (18:52 +0000)
from a internals perspective.  This callback has been very useful for both
ext/mono and ext/simplexml

Zend/zend.c
Zend/zend_object_handlers.c
Zend/zend_object_handlers.h
Zend/zend_operators.c

index 47416cd520485870670c9cf0af7a246937b0a0de..2fdd7d00ad0989b51f2ab303e4b9e7dc98663af5 100644 (file)
@@ -208,8 +208,13 @@ ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_cop
                        expr_copy->value.str.val = estrndup("Array", expr_copy->value.str.len);
                        break;
                case IS_OBJECT:
-                       expr_copy->value.str.val = (char *) emalloc(sizeof("Object id #")-1 + MAX_LENGTH_OF_LONG);
-                       expr_copy->value.str.len = sprintf(expr_copy->value.str.val, "Object id #%ld", (long)expr->value.obj.handle);
+                       if (expr->value.obj.handlers->cast_object) {
+                               TSRMLS_FETCH();
+                               expr->value.obj.handlers->cast_object(expr, expr_copy, IS_STRING, 0 TSRMLS_CC);
+                       } else {
+                               expr_copy->value.str.val = (char *) emalloc(sizeof("Object id #")-1 + MAX_LENGTH_OF_LONG);
+                               expr_copy->value.str.len = sprintf(expr_copy->value.str.val, "Object id #%ld", (long)expr->value.obj.handle);
+                       }
 #if 0
                        /* FIXME: This might break BC for some people */
                        expr_copy->value.str.len = sizeof("Object")-1;
index 1932d8c8d34a8cb9699e49888fcc79933d2b3d94..4147f9e786c17537770f7b912d1d3a21d3d5cf70 100644 (file)
@@ -830,7 +830,8 @@ zend_object_handlers std_object_handlers = {
        zend_std_get_constructor,                /* get_constructor */
        zend_std_object_get_class,               /* get_class_entry */
        zend_std_object_get_class_name,          /* get_class_name */
-       zend_std_compare_objects                 /* compare_objects */
+       zend_std_compare_objects,                /* compare_objects */
+       NULL,                                                                    /* cast_object */
 };
 
 /*
index 78c9e4fee3c4922ddfe62a9f6d0a1fe8ee6e306e..2676d1e8ceceb4aed1f02027069b3d85b2f3badc 100644 (file)
@@ -67,6 +67,8 @@ typedef zend_object_value (*zend_object_clone_obj_t)(zval *object TSRMLS_DC);
 typedef zend_class_entry *(*zend_object_get_class_entry_t)(zval *object TSRMLS_DC);
 typedef int (*zend_object_get_class_name_t)(zval *object, char **class_name, zend_uint *class_name_len, int parent TSRMLS_DC);
 typedef int (*zend_object_compare_t)(zval *object1, zval *object2 TSRMLS_DC);
+typedef void (*zend_object_cast_t)(zval *readobj, zval *writeobj, int type, int should_free TSRMLS_DC);
+
 
 typedef struct _zend_object_handlers {
        /* general object functions */
@@ -90,6 +92,7 @@ typedef struct _zend_object_handlers {
        zend_object_get_class_entry_t            get_class_entry;
        zend_object_get_class_name_t             get_class_name;
        zend_object_compare_t                    compare_objects;
+       zend_object_cast_t                       cast_object;
 } zend_object_handlers;
 
 extern zend_object_handlers std_object_handlers;
index 18408fed7285bcd9cad8b61b9cdfb4cae932db04..20a967197da854d2474997e41e12c6124459e76b 100644 (file)
@@ -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);