Hello Cristiano,
Saturday, August 9, 2003, 10:48:22 PM, you wrote:
CD> Hello Marcus,
CD> Did you think of a better interface name instead of "Printable" ?
CD> Do you think Zeev or Andi will accept this patch ?
I guess they won't like it and i would agree. I'd like to see something that
hooks into the object cast handler as i've done in the attached patch.
Besides the "to string" thing i think the cast method should return an int
value [SUCCESS,FAILURE] indicating whether the cast function could handle the
required cast operation and the fallback should be used if either no cast
function is available or FAILURE is returned.
Note: At the moment i used a solution without any interface. However an
additional check for a dedicated interface wouldn't be to bad. I'd like to
name it 'cast_string'. Also the whole thing wouldn't work on overloaded
objects with different cast functions.
--
Best regards,
Marcus mailto:[EMAIL PROTECTED]
Index: Zend/zend.c
===================================================================
RCS file: /repository/ZendEngine2/zend.c,v
retrieving revision 1.243
diff -u -p -d -r1.243 zend.c
--- Zend/zend.c 30 Jul 2003 16:13:52 -0000 1.243
+++ Zend/zend.c 9 Aug 2003 21:44:17 -0000
@@ -226,11 +226,12 @@ ZEND_API void zend_make_printable_zval(z
case IS_OBJECT:
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 (expr->value.obj.handlers->cast_object(expr,
expr_copy, IS_STRING, 0 TSRMLS_CC) == SUCCESS) {
+ break;
+ }
}
+ 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: Zend/zend_object_handlers.c
===================================================================
RCS file: /repository/ZendEngine2/zend_object_handlers.c,v
retrieving revision 1.63
diff -u -p -d -r1.63 zend_object_handlers.c
--- Zend/zend_object_handlers.c 3 Aug 2003 17:40:44 -0000 1.63
+++ Zend/zend_object_handlers.c 9 Aug 2003 21:44:19 -0000
@@ -867,6 +867,30 @@ int zend_std_object_get_class_name(zval
return SUCCESS;
}
+int zend_std_cast_object(zval *readobj, zval *writeobj, int type, int should_free
TSRMLS_DC)
+{
+ zend_function *cast_method;
+ zval fname, *retval;
+ int result = FAILURE;
+
+ switch (type) {
+ case IS_STRING:
+ ZVAL_STRING(&fname, "__to_string", 0);
+ if (call_user_function_ex(NULL, &readobj, &fname, &retval, 0, NULL, 0,
NULL TSRMLS_CC) == SUCCESS) {
+ if (Z_TYPE_P(retval) != IS_STRING) {
+ zend_error(E_ERROR, "Method %s::__to_string must
return a string value", Z_OBJCE_P(readobj)->name);
+ }
+ ZVAL_STRING(writeobj, Z_STRVAL_P(retval), 1);
+ zval_ptr_dtor(&retval);
+ result = SUCCESS;
+ }
+ break;
+ default:
+ break;
+ }
+ return result;
+}
+
zend_object_handlers std_object_handlers = {
zend_objects_store_add_ref, /* add_ref */
zend_objects_store_del_ref, /* del_ref */
@@ -891,7 +915,7 @@ zend_object_handlers std_object_handlers
zend_std_object_get_class, /* get_class_entry */
zend_std_object_get_class_name, /* get_class_name */
zend_std_compare_objects, /* compare_objects */
- NULL, /*
cast_object */
+ zend_std_cast_object, /* cast_object */
};
/*
Index: Zend/zend_object_handlers.h
===================================================================
RCS file: /repository/ZendEngine2/zend_object_handlers.h,v
retrieving revision 1.22
diff -u -p -d -r1.22 zend_object_handlers.h
--- Zend/zend_object_handlers.h 30 Jul 2003 17:12:06 -0000 1.22
+++ Zend/zend_object_handlers.h 9 Aug 2003 21:44:20 -0000
@@ -82,7 +82,7 @@ typedef zend_object_value (*zend_object_
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 int (*zend_object_cast_t)(zval *readobj, zval *writeobj, int type, int
should_free TSRMLS_DC);
typedef struct _zend_object_handlers {
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php