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;
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 */
};
/*
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 */
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;
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");
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);
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;
}
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);
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);