mirror of
https://github.com/php/php-src.git
synced 2025-08-16 14:08:47 +02:00
Bugfix #30146 (ReflectionProperty->getValue() requires instance for static property)
This commit is contained in:
parent
dfe23e34d9
commit
d0cfb7d3fd
2 changed files with 70 additions and 52 deletions
|
@ -3024,7 +3024,7 @@ ZEND_METHOD(reflection_property, getModifiers)
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ proto public mixed ReflectionProperty::getValue(stdclass object)
|
/* {{{ proto public mixed ReflectionProperty::getValue([stdclass object])
|
||||||
Returns this property's value */
|
Returns this property's value */
|
||||||
ZEND_METHOD(reflection_property, getValue)
|
ZEND_METHOD(reflection_property, getValue)
|
||||||
{
|
{
|
||||||
|
@ -3041,16 +3041,15 @@ ZEND_METHOD(reflection_property, getValue)
|
||||||
/* Returns from this function */
|
/* Returns from this function */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &object) == FAILURE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ref->prop->flags & ZEND_ACC_STATIC)) {
|
if ((ref->prop->flags & ZEND_ACC_STATIC)) {
|
||||||
if (zend_hash_quick_find(Z_OBJCE_P(object)->static_members, ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
|
if (zend_hash_quick_find(intern->ce->static_members, ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
|
||||||
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
||||||
/* Bails out */
|
/* Bails out */
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &object) == FAILURE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (zend_hash_quick_find(Z_OBJPROP_P(object), ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
|
if (zend_hash_quick_find(Z_OBJPROP_P(object), ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
|
||||||
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
||||||
/* Bails out */
|
/* Bails out */
|
||||||
|
@ -3062,7 +3061,7 @@ ZEND_METHOD(reflection_property, getValue)
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ proto public void ReflectionProperty::setValue(stdclass object, mixed value)
|
/* {{{ proto public void ReflectionProperty::setValue([stdclass object,] mixed value)
|
||||||
Sets this property's value */
|
Sets this property's value */
|
||||||
ZEND_METHOD(reflection_property, setValue)
|
ZEND_METHOD(reflection_property, setValue)
|
||||||
{
|
{
|
||||||
|
@ -3072,38 +3071,48 @@ ZEND_METHOD(reflection_property, setValue)
|
||||||
zval *object;
|
zval *object;
|
||||||
zval *value;
|
zval *value;
|
||||||
int setter_done = 0;
|
int setter_done = 0;
|
||||||
|
zval *tmp;
|
||||||
|
HashTable *prop_table;
|
||||||
|
|
||||||
METHOD_NOTSTATIC;
|
METHOD_NOTSTATIC;
|
||||||
GET_REFLECTION_OBJECT_PTR(ref);
|
GET_REFLECTION_OBJECT_PTR(ref);
|
||||||
|
|
||||||
if (ref->prop->flags & ~ZEND_ACC_PUBLIC) {
|
if (ref->prop->flags & ~(ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)) {
|
||||||
_DO_THROW("Cannot access non-public member");
|
_DO_THROW("Cannot access non-public member");
|
||||||
/* Returns from this function */
|
/* Returns from this function */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oz", &object, &value) == FAILURE) {
|
if ((ref->prop->flags & ZEND_ACC_STATIC)) {
|
||||||
return;
|
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) {
|
||||||
}
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &tmp, &value) == FAILURE) {
|
||||||
|
return;
|
||||||
if (zend_hash_quick_find(Z_OBJPROP_P(object), ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &variable_ptr) == SUCCESS) {
|
|
||||||
if (*variable_ptr == value) {
|
|
||||||
setter_done = 1;
|
|
||||||
} else {
|
|
||||||
if (PZVAL_IS_REF(*variable_ptr)) {
|
|
||||||
zval_dtor(*variable_ptr);
|
|
||||||
(*variable_ptr)->type = value->type;
|
|
||||||
(*variable_ptr)->value = value->value;
|
|
||||||
if (value->refcount > 0) {
|
|
||||||
zval_copy_ctor(*variable_ptr);
|
|
||||||
}
|
|
||||||
setter_done = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
prop_table = intern->ce->static_members;
|
||||||
} else {
|
} else {
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oz", &object, &value) == FAILURE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
prop_table = Z_OBJPROP_P(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zend_hash_quick_find(prop_table, ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &variable_ptr) == FAILURE) {
|
||||||
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
||||||
/* Bails out */
|
/* Bails out */
|
||||||
}
|
}
|
||||||
|
if (*variable_ptr == value) {
|
||||||
|
setter_done = 1;
|
||||||
|
} else {
|
||||||
|
if (PZVAL_IS_REF(*variable_ptr)) {
|
||||||
|
zval_dtor(*variable_ptr);
|
||||||
|
(*variable_ptr)->type = value->type;
|
||||||
|
(*variable_ptr)->value = value->value;
|
||||||
|
if (value->refcount > 0) {
|
||||||
|
zval_copy_ctor(*variable_ptr);
|
||||||
|
}
|
||||||
|
setter_done = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!setter_done) {
|
if (!setter_done) {
|
||||||
zval **foo;
|
zval **foo;
|
||||||
|
|
||||||
|
@ -3111,7 +3120,7 @@ ZEND_METHOD(reflection_property, setValue)
|
||||||
if (PZVAL_IS_REF(value)) {
|
if (PZVAL_IS_REF(value)) {
|
||||||
SEPARATE_ZVAL(&value);
|
SEPARATE_ZVAL(&value);
|
||||||
}
|
}
|
||||||
zend_hash_quick_update(Z_OBJPROP_P(object), ref->prop->name, ref->prop->name_length+1, ref->prop->h, &value, sizeof(zval *), (void **) &foo);
|
zend_hash_quick_update(prop_table, ref->prop->name, ref->prop->name_length+1, ref->prop->h, &value, sizeof(zval *), (void **) &foo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -3024,7 +3024,7 @@ ZEND_METHOD(reflection_property, getModifiers)
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ proto public mixed ReflectionProperty::getValue(stdclass object)
|
/* {{{ proto public mixed ReflectionProperty::getValue([stdclass object])
|
||||||
Returns this property's value */
|
Returns this property's value */
|
||||||
ZEND_METHOD(reflection_property, getValue)
|
ZEND_METHOD(reflection_property, getValue)
|
||||||
{
|
{
|
||||||
|
@ -3041,16 +3041,15 @@ ZEND_METHOD(reflection_property, getValue)
|
||||||
/* Returns from this function */
|
/* Returns from this function */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &object) == FAILURE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ref->prop->flags & ZEND_ACC_STATIC)) {
|
if ((ref->prop->flags & ZEND_ACC_STATIC)) {
|
||||||
if (zend_hash_quick_find(Z_OBJCE_P(object)->static_members, ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
|
if (zend_hash_quick_find(intern->ce->static_members, ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
|
||||||
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
||||||
/* Bails out */
|
/* Bails out */
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &object) == FAILURE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (zend_hash_quick_find(Z_OBJPROP_P(object), ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
|
if (zend_hash_quick_find(Z_OBJPROP_P(object), ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
|
||||||
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
||||||
/* Bails out */
|
/* Bails out */
|
||||||
|
@ -3062,7 +3061,7 @@ ZEND_METHOD(reflection_property, getValue)
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ proto public void ReflectionProperty::setValue(stdclass object, mixed value)
|
/* {{{ proto public void ReflectionProperty::setValue([stdclass object,] mixed value)
|
||||||
Sets this property's value */
|
Sets this property's value */
|
||||||
ZEND_METHOD(reflection_property, setValue)
|
ZEND_METHOD(reflection_property, setValue)
|
||||||
{
|
{
|
||||||
|
@ -3072,38 +3071,48 @@ ZEND_METHOD(reflection_property, setValue)
|
||||||
zval *object;
|
zval *object;
|
||||||
zval *value;
|
zval *value;
|
||||||
int setter_done = 0;
|
int setter_done = 0;
|
||||||
|
zval *tmp;
|
||||||
|
HashTable *prop_table;
|
||||||
|
|
||||||
METHOD_NOTSTATIC;
|
METHOD_NOTSTATIC;
|
||||||
GET_REFLECTION_OBJECT_PTR(ref);
|
GET_REFLECTION_OBJECT_PTR(ref);
|
||||||
|
|
||||||
if (ref->prop->flags & ~ZEND_ACC_PUBLIC) {
|
if (ref->prop->flags & ~(ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)) {
|
||||||
_DO_THROW("Cannot access non-public member");
|
_DO_THROW("Cannot access non-public member");
|
||||||
/* Returns from this function */
|
/* Returns from this function */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oz", &object, &value) == FAILURE) {
|
if ((ref->prop->flags & ZEND_ACC_STATIC)) {
|
||||||
return;
|
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) {
|
||||||
}
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &tmp, &value) == FAILURE) {
|
||||||
|
return;
|
||||||
if (zend_hash_quick_find(Z_OBJPROP_P(object), ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &variable_ptr) == SUCCESS) {
|
|
||||||
if (*variable_ptr == value) {
|
|
||||||
setter_done = 1;
|
|
||||||
} else {
|
|
||||||
if (PZVAL_IS_REF(*variable_ptr)) {
|
|
||||||
zval_dtor(*variable_ptr);
|
|
||||||
(*variable_ptr)->type = value->type;
|
|
||||||
(*variable_ptr)->value = value->value;
|
|
||||||
if (value->refcount > 0) {
|
|
||||||
zval_copy_ctor(*variable_ptr);
|
|
||||||
}
|
|
||||||
setter_done = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
prop_table = intern->ce->static_members;
|
||||||
} else {
|
} else {
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oz", &object, &value) == FAILURE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
prop_table = Z_OBJPROP_P(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zend_hash_quick_find(prop_table, ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &variable_ptr) == FAILURE) {
|
||||||
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
|
||||||
/* Bails out */
|
/* Bails out */
|
||||||
}
|
}
|
||||||
|
if (*variable_ptr == value) {
|
||||||
|
setter_done = 1;
|
||||||
|
} else {
|
||||||
|
if (PZVAL_IS_REF(*variable_ptr)) {
|
||||||
|
zval_dtor(*variable_ptr);
|
||||||
|
(*variable_ptr)->type = value->type;
|
||||||
|
(*variable_ptr)->value = value->value;
|
||||||
|
if (value->refcount > 0) {
|
||||||
|
zval_copy_ctor(*variable_ptr);
|
||||||
|
}
|
||||||
|
setter_done = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!setter_done) {
|
if (!setter_done) {
|
||||||
zval **foo;
|
zval **foo;
|
||||||
|
|
||||||
|
@ -3111,7 +3120,7 @@ ZEND_METHOD(reflection_property, setValue)
|
||||||
if (PZVAL_IS_REF(value)) {
|
if (PZVAL_IS_REF(value)) {
|
||||||
SEPARATE_ZVAL(&value);
|
SEPARATE_ZVAL(&value);
|
||||||
}
|
}
|
||||||
zend_hash_quick_update(Z_OBJPROP_P(object), ref->prop->name, ref->prop->name_length+1, ref->prop->h, &value, sizeof(zval *), (void **) &foo);
|
zend_hash_quick_update(prop_table, ref->prop->name, ref->prop->name_length+1, ref->prop->h, &value, sizeof(zval *), (void **) &foo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue