Browse Source

Fix isset()/empty() for non-trivial object elements

(API change - read_property now accepts an extra element)
Fixes bug #24436
PEAR_1_4DEV
Zeev Suraski 23 years ago
parent
commit
6a50660cfe
  1. 8
      Zend/zend_execute.c
  2. 6
      Zend/zend_object_handlers.c
  3. 2
      Zend/zend_object_handlers.h
  4. 2
      Zend/zend_objects_API.c

8
Zend/zend_execute.c

@ -991,7 +991,7 @@ static void zend_fetch_property_address_read(znode *result, znode *op1, znode *o
}
/* here we are sure we are dealing with an object */
*retval = Z_OBJ_HT_P(container)->read_property(container, offset TSRMLS_CC);
*retval = Z_OBJ_HT_P(container)->read_property(container, offset, (zend_bool) ((type==BP_VAR_IS) ? 1 : 0) TSRMLS_CC);
if (offset == &tmp) {
zval_dtor(offset);
}
@ -1037,7 +1037,7 @@ static void zend_pre_incdec_property(znode *result, znode *op1, znode *op2, temp
}
if (!have_get_ptr) {
zval *z = Z_OBJ_HT_P(object)->read_property(object, property TSRMLS_CC);
zval *z = Z_OBJ_HT_P(object)->read_property(object, property, 0 TSRMLS_CC);
SEPARATE_ZVAL_IF_NOT_REF(&z);
incdec_op(z);
Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
@ -1084,7 +1084,7 @@ static void zend_post_incdec_property(znode *result, znode *op1, znode *op2, tem
}
if (!have_get_ptr) {
zval *z = Z_OBJ_HT_P(object)->read_property(object, property TSRMLS_CC);
zval *z = Z_OBJ_HT_P(object)->read_property(object, property, 0 TSRMLS_CC);
SEPARATE_ZVAL_IF_NOT_REF(&z);
*retval = *z;
zendi_zval_copy_ctor(*retval);
@ -1473,7 +1473,7 @@ static inline int zend_binary_assign_op_obj_helper(int (*binary_op)(zval *result
}
if (!have_get_ptr) {
zval *z = Z_OBJ_HT_P(object)->read_property(object, property TSRMLS_CC);
zval *z = Z_OBJ_HT_P(object)->read_property(object, property, 0 TSRMLS_CC);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);

6
Zend/zend_object_handlers.c

@ -238,7 +238,7 @@ static inline zend_property_info *zend_get_property_info(zend_object *zobj, zval
}
zval *zend_std_read_property(zval *object, zval *member TSRMLS_DC)
zval *zend_std_read_property(zval *object, zval *member, zend_bool silent TSRMLS_DC)
{
zend_object *zobj;
zval tmp_member;
@ -274,7 +274,9 @@ zval *zend_std_read_property(zval *object, zval *member TSRMLS_DC)
retval = &EG(uninitialized_zval_ptr);
}
} else {
zend_error(E_NOTICE,"Undefined property: %s::$%s", zobj->ce->name, Z_STRVAL_P(member));
if (!silent) {
zend_error(E_NOTICE,"Undefined property: %s::$%s", zobj->ce->name, Z_STRVAL_P(member));
}
retval = &EG(uninitialized_zval_ptr);
}
}

2
Zend/zend_object_handlers.h

@ -25,7 +25,7 @@
union _zend_function;
/* Used to fetch property from the object, read-only */
typedef zval *(*zend_object_read_property_t)(zval *object, zval *member TSRMLS_DC);
typedef zval *(*zend_object_read_property_t)(zval *object, zval *member, zend_bool silent TSRMLS_DC);
/* Used to fetch dimension from the object, read-only */
typedef zval *(*zend_object_read_dimension_t)(zval *object, zval *offset TSRMLS_DC);

2
Zend/zend_objects_API.c

@ -255,7 +255,7 @@ ZEND_API zval* zend_object_proxy_get(zval *property TSRMLS_DC)
zend_proxy_object *probj = zend_object_store_get_object(property TSRMLS_CC);
if (Z_OBJ_HT_P(probj->object) && Z_OBJ_HT_P(probj->object)->read_property) {
return Z_OBJ_HT_P(probj->object)->read_property(probj->object, probj->property TSRMLS_CC);
return Z_OBJ_HT_P(probj->object)->read_property(probj->object, probj->property, 0 TSRMLS_CC);
} else {
zend_error(E_WARNING, "Cannot read property of object - no read handler defined");
}

Loading…
Cancel
Save