summaryrefslogtreecommitdiff
path: root/ext/reflection/php_reflection.c
diff options
context:
space:
mode:
authorSebastian Bergmann <sebastian@php.net>2009-09-16 17:24:46 +0000
committerSebastian Bergmann <sebastian@php.net>2009-09-16 17:24:46 +0000
commitceaf5905308de3244cdb213c91929c77355eea9d (patch)
tree456229bbfea84ad494578c8b86de31bb80a71672 /ext/reflection/php_reflection.c
parente6cf6693e6e0d1d74641035cc6a5ca424db830b3 (diff)
downloadphp-git-ceaf5905308de3244cdb213c91929c77355eea9d.tar.gz
Merge ReflectionMethod::setAccessible() to PHP 5.3.2, approved by Johannes.
Diffstat (limited to 'ext/reflection/php_reflection.c')
-rw-r--r--ext/reflection/php_reflection.c57
1 files changed, 45 insertions, 12 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 296d92d77a..b05c5215b6 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -176,7 +176,6 @@ static void string_free(string *str)
typedef struct _property_reference {
zend_class_entry *ce;
zend_property_info prop;
- unsigned int ignore_visibility:1;
} property_reference;
/* Struct for parameters */
@@ -201,6 +200,7 @@ typedef struct {
reflection_type_t ref_type;
zval *obj;
zend_class_entry *ce;
+ unsigned int ignore_visibility:1;
} reflection_object;
static zend_object_handlers reflection_object_handlers;
@@ -1290,10 +1290,10 @@ static void reflection_property_factory(zend_class_entry *ce, zend_property_info
reference = (property_reference*) emalloc(sizeof(property_reference));
reference->ce = ce;
reference->prop = *prop;
- reference->ignore_visibility = 0;
intern->ptr = reference;
intern->ref_type = REF_TYPE_PROPERTY;
intern->ce = ce;
+ intern->ignore_visibility = 0;
zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL);
zend_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL);
}
@@ -2561,8 +2561,9 @@ ZEND_METHOD(reflection_method, invoke)
GET_REFLECTION_OBJECT_PTR(mptr);
- if (!(mptr->common.fn_flags & ZEND_ACC_PUBLIC)
- || (mptr->common.fn_flags & ZEND_ACC_ABSTRACT))
+ if ((!(mptr->common.fn_flags & ZEND_ACC_PUBLIC)
+ || (mptr->common.fn_flags & ZEND_ACC_ABSTRACT))
+ && intern->ignore_visibility == 0)
{
if (mptr->common.fn_flags & ZEND_ACC_ABSTRACT) {
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
@@ -2669,8 +2670,9 @@ ZEND_METHOD(reflection_method, invokeArgs)
return;
}
- if (!(mptr->common.fn_flags & ZEND_ACC_PUBLIC)
- || (mptr->common.fn_flags & ZEND_ACC_ABSTRACT))
+ if ((!(mptr->common.fn_flags & ZEND_ACC_PUBLIC)
+ || (mptr->common.fn_flags & ZEND_ACC_ABSTRACT))
+ && intern->ignore_visibility == 0)
{
if (mptr->common.fn_flags & ZEND_ACC_ABSTRACT) {
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
@@ -2959,6 +2961,27 @@ ZEND_METHOD(reflection_method, getPrototype)
}
/* }}} */
+/* {{{ proto public void ReflectionMethod::setAccessible()
+ Sets whether non-public methods can be invoked */
+ZEND_METHOD(reflection_method, setAccessible)
+{
+ reflection_object *intern;
+ zend_bool visible;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &visible) == FAILURE) {
+ return;
+ }
+
+ intern = (reflection_object *) zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ if (intern == NULL) {
+ return;
+ }
+
+ intern->ignore_visibility = visible;
+}
+/* }}} */
+
/* {{{ proto public static mixed ReflectionClass::export(mixed argument [, bool return]) throws ReflectionException
Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */
ZEND_METHOD(reflection_class, export)
@@ -4375,10 +4398,10 @@ ZEND_METHOD(reflection_property, __construct)
reference->prop = *property_info;
}
reference->ce = ce;
- reference->ignore_visibility = 0;
intern->ptr = reference;
intern->ref_type = REF_TYPE_PROPERTY;
intern->ce = ce;
+ intern->ignore_visibility = 0;
}
/* }}} */
@@ -4491,7 +4514,7 @@ ZEND_METHOD(reflection_property, getValue)
METHOD_NOTSTATIC(reflection_property_ptr);
GET_REFLECTION_OBJECT_PTR(ref);
- if (!(ref->prop.flags & (ZEND_ACC_PUBLIC | ZEND_ACC_IMPLICIT_PUBLIC)) && ref->ignore_visibility == 0) {
+ if (!(ref->prop.flags & (ZEND_ACC_PUBLIC | ZEND_ACC_IMPLICIT_PUBLIC)) && intern->ignore_visibility == 0) {
_default_get_entry(getThis(), "name", sizeof("name"), &name TSRMLS_CC);
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
"Cannot access non-public member %s::%s", intern->ce->name, Z_STRVAL(name));
@@ -4543,7 +4566,7 @@ ZEND_METHOD(reflection_property, setValue)
METHOD_NOTSTATIC(reflection_property_ptr);
GET_REFLECTION_OBJECT_PTR(ref);
- if (!(ref->prop.flags & ZEND_ACC_PUBLIC) && ref->ignore_visibility == 0) {
+ if (!(ref->prop.flags & ZEND_ACC_PUBLIC) && intern->ignore_visibility == 0) {
_default_get_entry(getThis(), "name", sizeof("name"), &name TSRMLS_CC);
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
"Cannot access non-public member %s::%s", intern->ce->name, Z_STRVAL(name));
@@ -4660,14 +4683,19 @@ ZEND_METHOD(reflection_property, getDocComment)
ZEND_METHOD(reflection_property, setAccessible)
{
reflection_object *intern;
- property_reference *ref;
zend_bool visible;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &visible) == FAILURE) {
return;
}
- GET_REFLECTION_OBJECT_PTR(ref);
- ref->ignore_visibility = visible;
+
+ intern = (reflection_object *) zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ if (intern == NULL) {
+ return;
+ }
+
+ intern->ignore_visibility = visible;
}
/* }}} */
@@ -5095,6 +5123,10 @@ ZEND_BEGIN_ARG_INFO(arginfo_reflection_method_invokeArgs, 0)
ZEND_ARG_ARRAY_INFO(0, args, 0)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO(arginfo_reflection_method_setAccessible, 0)
+ ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+
static const zend_function_entry reflection_method_functions[] = {
ZEND_ME(reflection_method, export, arginfo_reflection_method_export, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC)
ZEND_ME(reflection_method, __construct, arginfo_reflection_method___construct, 0)
@@ -5112,6 +5144,7 @@ static const zend_function_entry reflection_method_functions[] = {
ZEND_ME(reflection_method, invokeArgs, arginfo_reflection_method_invokeArgs, 0)
ZEND_ME(reflection_method, getDeclaringClass, NULL, 0)
ZEND_ME(reflection_method, getPrototype, NULL, 0)
+ ZEND_ME(reflection_property, setAccessible, arginfo_reflection_method_setAccessible, 0)
{NULL, NULL, NULL}
};