a. Object Handlers API
b. ZEND_OVERLOADED_FUNCTION and corresponding call_method() object handler
c. TSRM changes
+ d. set() object handler
2. Build system changes
a. Abstract
- tsrm_free_interpreter_context
- support for GNUPTH, SGI ST, and BETHREADS
+ d. The set() object handler, which allowed overloading the assignment
+ operator, has been removed. There is no direct replacement for this
+ functionality, though some use-cases may be replaced by do_operation().
+
========================
2. Build system changes
break;
}
}
- if (Z_TYPE_P(variable_ptr) == IS_OBJECT &&
- UNEXPECTED(Z_OBJ_HANDLER_P(variable_ptr, set) != NULL)) {
- Z_OBJ_HANDLER_P(variable_ptr, set)(Z_OBJ_P(variable_ptr), value);
- return variable_ptr;
- }
garbage = Z_COUNTED_P(variable_ptr);
ZVAL_COPY_VALUE(variable_ptr, value);
if (ZEND_CONST_COND(value_type == IS_CONST, 0)) {
NULL, /* write dim */
NULL,
NULL, /* get */
- NULL, /* set */
NULL, /* has prop */
NULL, /* unset prop */
NULL, /* has dim */
zend_std_write_dimension, /* write_dimension */
zend_std_get_property_ptr_ptr, /* get_property_ptr_ptr */
NULL, /* get */
- NULL, /* set */
zend_std_has_property, /* has_property */
zend_std_unset_property, /* unset_property */
zend_std_has_dimension, /* has_dimension */
/* Used to create pointer to the property of the object, for future direct r/w access */
typedef zval *(*zend_object_get_property_ptr_ptr_t)(zend_object *object, zend_string *member, int type, void **cache_slot);
-/* Used to set object value. Can be used to override assignments and scalar
- write ops (like ++, +=) on the object */
-typedef void (*zend_object_set_t)(zend_object *object, zval *value);
-
/* Used to get object value. Can be used when converting object value to
* one of the basic types and when using scalar ops (like ++, +=) on the object
*/
zend_object_write_dimension_t write_dimension; /* required */
zend_object_get_property_ptr_ptr_t get_property_ptr_ptr; /* required */
zend_object_get_t get; /* optional */
- zend_object_set_t set; /* optional */
zend_object_has_property_t has_property; /* required */
zend_object_unset_property_t unset_property; /* required */
zend_object_has_dimension_t has_dimension; /* required */
}
break;
case IS_OBJECT:
- if (Z_OBJ_HANDLER_P(op1, get)
- && Z_OBJ_HANDLER_P(op1, set)) {
- /* proxy object */
- zval rv;
- zval *val;
-
- val = Z_OBJ_HANDLER_P(op1, get)(Z_OBJ_P(op1), &rv);
- Z_TRY_ADDREF_P(val);
- increment_function(val);
- Z_OBJ_HANDLER_P(op1, set)(Z_OBJ_P(op1), val);
- zval_ptr_dtor(val);
- } else if (Z_OBJ_HANDLER_P(op1, do_operation)) {
+ if (Z_OBJ_HANDLER_P(op1, do_operation)) {
zval op2;
int res;
}
break;
case IS_OBJECT:
- if (Z_OBJ_HANDLER_P(op1, get)
- && Z_OBJ_HANDLER_P(op1, set)) {
- /* proxy object */
- zval rv;
- zval *val;
-
- val = Z_OBJ_HANDLER_P(op1, get)(Z_OBJ_P(op1), &rv);
- Z_TRY_ADDREF_P(val);
- decrement_function(val);
- Z_OBJ_HANDLER_P(op1, set)(Z_OBJ_P(op1), val);
- zval_ptr_dtor(val);
- } else if (Z_OBJ_HANDLER_P(op1, do_operation)) {
+ if (Z_OBJ_HANDLER_P(op1, do_operation)) {
zval op2;
int res;
}
#define ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(opcode, binary_op) \
- if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT) \
- && op1 == result \
- && UNEXPECTED(Z_OBJ_HANDLER_P(op1, get)) \
- && EXPECTED(Z_OBJ_HANDLER_P(op1, set))) { \
- int ret; \
- zval rv; \
- zval *objval = Z_OBJ_HANDLER_P(op1, get)(Z_OBJ_P(op1), &rv); \
- Z_TRY_ADDREF_P(objval); \
- ret = binary_op(objval, objval, op2); \
- Z_OBJ_HANDLER_P(op1, set)(Z_OBJ_P(op1), objval); \
- zval_ptr_dtor(objval); \
- return ret; \
- } else if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT) \
+ if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT) \
&& UNEXPECTED(Z_OBJ_HANDLER_P(op1, do_operation))) { \
if (EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, op2))) { \
return SUCCESS; \
}
#if 0
-static void com_object_set(zval **property, zval *value)
-{
- /* Not yet implemented in the engine */
-}
-
static zval *com_object_get(zval *property)
{
/* Not yet implemented in the engine */
com_write_dimension,
NULL,
NULL, /* com_object_get, */
- NULL, /* com_object_set, */
com_property_exists,
com_property_delete,
com_dimension_exists,
}
#if 0
-static void saproxy_object_set(zval **property, zval *value)
-{
-}
-
static zval *saproxy_object_get(zval *property)
{
/* Not yet implemented in the engine */
saproxy_write_dimension,
NULL,
NULL, /* saproxy_object_get, */
- NULL, /* saproxy_object_set, */
saproxy_property_exists,
saproxy_property_delete,
saproxy_dimension_exists,