Skip to content

Commit ab73d14

Browse files
committed
Eliminate uses of _default_load_name()
Instead fetch the name from the function/class/property, as appropriate. This makes us independent of the property, and eliminates error conditions related to it.
1 parent 425c6f5 commit ab73d14

File tree

2 files changed

+69
-92
lines changed

2 files changed

+69
-92
lines changed

ext/reflection/php_reflection.c

Lines changed: 65 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -170,24 +170,13 @@ static inline zend_bool is_closure_invoke(zend_class_entry *ce, zend_string *lcn
170170
&& zend_string_equals_literal(lcname, ZEND_INVOKE_FUNC_NAME);
171171
}
172172

173-
static zval *_default_load_name(zval *object) /* {{{ */
173+
static void _default_get_name(zval *object, zval *return_value) /* {{{ */
174174
{
175175
zval *name = reflection_prop_name(object);
176176
if (Z_ISUNDEF_P(name)) {
177-
return NULL;
178-
}
179-
return name;
180-
}
181-
/* }}} */
182-
183-
static void _default_get_name(zval *object, zval *return_value) /* {{{ */
184-
{
185-
zval *value;
186-
187-
if ((value = _default_load_name(object)) == NULL) {
188177
RETURN_FALSE;
189178
}
190-
ZVAL_COPY(return_value, value);
179+
ZVAL_COPY(return_value, name);
191180
}
192181
/* }}} */
193182

@@ -3243,43 +3232,38 @@ ZEND_METHOD(reflection_function, isVariadic)
32433232
Returns whether this function is defined in namespace */
32443233
ZEND_METHOD(reflection_function, inNamespace)
32453234
{
3246-
zval *name;
3247-
const char *backslash;
3235+
reflection_object *intern;
3236+
zend_function *fptr;
32483237

32493238
if (zend_parse_parameters_none() == FAILURE) {
32503239
RETURN_THROWS();
32513240
}
3252-
if ((name = _default_load_name(ZEND_THIS)) == NULL) {
3253-
RETURN_FALSE;
3254-
}
3255-
if (Z_TYPE_P(name) == IS_STRING
3256-
&& (backslash = zend_memrchr(Z_STRVAL_P(name), '\\', Z_STRLEN_P(name)))
3257-
&& backslash > Z_STRVAL_P(name))
3258-
{
3259-
RETURN_TRUE;
3260-
}
3261-
RETURN_FALSE;
3241+
3242+
GET_REFLECTION_OBJECT_PTR(fptr);
3243+
3244+
zend_string *name = fptr->common.function_name;
3245+
const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
3246+
RETURN_BOOL(backslash && backslash > ZSTR_VAL(name));
32623247
}
32633248
/* }}} */
32643249

32653250
/* {{{ proto public string ReflectionFunction::getNamespaceName()
32663251
Returns the name of namespace where this function is defined */
32673252
ZEND_METHOD(reflection_function, getNamespaceName)
32683253
{
3269-
zval *name;
3270-
const char *backslash;
3254+
reflection_object *intern;
3255+
zend_function *fptr;
32713256

32723257
if (zend_parse_parameters_none() == FAILURE) {
32733258
RETURN_THROWS();
32743259
}
3275-
if ((name = _default_load_name(ZEND_THIS)) == NULL) {
3276-
RETURN_FALSE;
3277-
}
3278-
if (Z_TYPE_P(name) == IS_STRING
3279-
&& (backslash = zend_memrchr(Z_STRVAL_P(name), '\\', Z_STRLEN_P(name)))
3280-
&& backslash > Z_STRVAL_P(name))
3281-
{
3282-
RETURN_STRINGL(Z_STRVAL_P(name), backslash - Z_STRVAL_P(name));
3260+
3261+
GET_REFLECTION_OBJECT_PTR(fptr);
3262+
3263+
zend_string *name = fptr->common.function_name;
3264+
const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
3265+
if (backslash && backslash > ZSTR_VAL(name)) {
3266+
RETURN_STRINGL(ZSTR_VAL(name), backslash - ZSTR_VAL(name));
32833267
}
32843268
RETURN_EMPTY_STRING();
32853269
}
@@ -3289,22 +3273,21 @@ ZEND_METHOD(reflection_function, getNamespaceName)
32893273
Returns the short name of the function (without namespace part) */
32903274
ZEND_METHOD(reflection_function, getShortName)
32913275
{
3292-
zval *name;
3293-
const char *backslash;
3276+
reflection_object *intern;
3277+
zend_function *fptr;
32943278

32953279
if (zend_parse_parameters_none() == FAILURE) {
32963280
RETURN_THROWS();
32973281
}
3298-
if ((name = _default_load_name(ZEND_THIS)) == NULL) {
3299-
RETURN_FALSE;
3300-
}
3301-
if (Z_TYPE_P(name) == IS_STRING
3302-
&& (backslash = zend_memrchr(Z_STRVAL_P(name), '\\', Z_STRLEN_P(name)))
3303-
&& backslash > Z_STRVAL_P(name))
3304-
{
3305-
RETURN_STRINGL(backslash + 1, Z_STRLEN_P(name) - (backslash - Z_STRVAL_P(name) + 1));
3282+
3283+
GET_REFLECTION_OBJECT_PTR(fptr);
3284+
3285+
zend_string *name = fptr->common.function_name;
3286+
const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
3287+
if (backslash && backslash > ZSTR_VAL(name)) {
3288+
RETURN_STRINGL(backslash + 1, ZSTR_LEN(name) - (backslash - ZSTR_VAL(name) + 1));
33063289
}
3307-
ZVAL_COPY_DEREF(return_value, name);
3290+
RETURN_STR_COPY(name);
33083291
}
33093292
/* }}} */
33103293

@@ -5074,43 +5057,38 @@ ZEND_METHOD(reflection_class, getExtensionName)
50745057
Returns whether this class is defined in namespace */
50755058
ZEND_METHOD(reflection_class, inNamespace)
50765059
{
5077-
zval *name;
5078-
const char *backslash;
5060+
reflection_object *intern;
5061+
zend_class_entry *ce;
50795062

50805063
if (zend_parse_parameters_none() == FAILURE) {
50815064
RETURN_THROWS();
50825065
}
5083-
if ((name = _default_load_name(ZEND_THIS)) == NULL) {
5084-
RETURN_FALSE;
5085-
}
5086-
if (Z_TYPE_P(name) == IS_STRING
5087-
&& (backslash = zend_memrchr(Z_STRVAL_P(name), '\\', Z_STRLEN_P(name)))
5088-
&& backslash > Z_STRVAL_P(name))
5089-
{
5090-
RETURN_TRUE;
5091-
}
5092-
RETURN_FALSE;
5066+
5067+
GET_REFLECTION_OBJECT_PTR(ce);
5068+
5069+
zend_string *name = ce->name;
5070+
const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
5071+
RETURN_BOOL(backslash && backslash > ZSTR_VAL(name));
50935072
}
50945073
/* }}} */
50955074

50965075
/* {{{ proto public string ReflectionClass::getNamespaceName()
50975076
Returns the name of namespace where this class is defined */
50985077
ZEND_METHOD(reflection_class, getNamespaceName)
50995078
{
5100-
zval *name;
5101-
const char *backslash;
5079+
reflection_object *intern;
5080+
zend_class_entry *ce;
51025081

51035082
if (zend_parse_parameters_none() == FAILURE) {
51045083
RETURN_THROWS();
51055084
}
5106-
if ((name = _default_load_name(ZEND_THIS)) == NULL) {
5107-
RETURN_FALSE;
5108-
}
5109-
if (Z_TYPE_P(name) == IS_STRING
5110-
&& (backslash = zend_memrchr(Z_STRVAL_P(name), '\\', Z_STRLEN_P(name)))
5111-
&& backslash > Z_STRVAL_P(name))
5112-
{
5113-
RETURN_STRINGL(Z_STRVAL_P(name), backslash - Z_STRVAL_P(name));
5085+
5086+
GET_REFLECTION_OBJECT_PTR(ce);
5087+
5088+
zend_string *name = ce->name;
5089+
const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
5090+
if (backslash && backslash > ZSTR_VAL(name)) {
5091+
RETURN_STRINGL(ZSTR_VAL(name), backslash - ZSTR_VAL(name));
51145092
}
51155093
RETURN_EMPTY_STRING();
51165094
}
@@ -5120,22 +5098,21 @@ ZEND_METHOD(reflection_class, getNamespaceName)
51205098
Returns the short name of the class (without namespace part) */
51215099
ZEND_METHOD(reflection_class, getShortName)
51225100
{
5123-
zval *name;
5124-
const char *backslash;
5101+
reflection_object *intern;
5102+
zend_class_entry *ce;
51255103

51265104
if (zend_parse_parameters_none() == FAILURE) {
51275105
RETURN_THROWS();
51285106
}
5129-
if ((name = _default_load_name(ZEND_THIS)) == NULL) {
5130-
RETURN_FALSE;
5131-
}
5132-
if (Z_TYPE_P(name) == IS_STRING
5133-
&& (backslash = zend_memrchr(Z_STRVAL_P(name), '\\', Z_STRLEN_P(name)))
5134-
&& backslash > Z_STRVAL_P(name))
5135-
{
5136-
RETURN_STRINGL(backslash + 1, Z_STRLEN_P(name) - (backslash - Z_STRVAL_P(name) + 1));
5107+
5108+
GET_REFLECTION_OBJECT_PTR(ce);
5109+
5110+
zend_string *name = ce->name;
5111+
const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
5112+
if (backslash && backslash > ZSTR_VAL(name)) {
5113+
RETURN_STRINGL(backslash + 1, ZSTR_LEN(name) - (backslash - ZSTR_VAL(name) + 1));
51375114
}
5138-
ZVAL_COPY_DEREF(return_value, name);
5115+
RETURN_STR_COPY(name);
51395116
}
51405117
/* }}} */
51415118

@@ -5330,7 +5307,7 @@ ZEND_METHOD(reflection_property, getValue)
53305307
{
53315308
reflection_object *intern;
53325309
property_reference *ref;
5333-
zval *object = NULL, *name;
5310+
zval *object = NULL;
53345311
zval *member_p = NULL;
53355312

53365313
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|o!", &object) == FAILURE) {
@@ -5340,9 +5317,9 @@ ZEND_METHOD(reflection_property, getValue)
53405317
GET_REFLECTION_OBJECT_PTR(ref);
53415318

53425319
if (!(prop_get_flags(ref) & ZEND_ACC_PUBLIC) && intern->ignore_visibility == 0) {
5343-
name = _default_load_name(ZEND_THIS);
53445320
zend_throw_exception_ex(reflection_exception_ptr, 0,
5345-
"Cannot access non-public member %s::$%s", ZSTR_VAL(intern->ce->name), Z_STRVAL_P(name));
5321+
"Cannot access non-public member %s::$%s",
5322+
ZSTR_VAL(intern->ce->name), ZSTR_VAL(ref->unmangled_name));
53465323
RETURN_THROWS();
53475324
}
53485325

@@ -5384,16 +5361,16 @@ ZEND_METHOD(reflection_property, setValue)
53845361
{
53855362
reflection_object *intern;
53865363
property_reference *ref;
5387-
zval *object, *name;
5364+
zval *object;
53885365
zval *value;
53895366
zval *tmp;
53905367

53915368
GET_REFLECTION_OBJECT_PTR(ref);
53925369

53935370
if (!(prop_get_flags(ref) & ZEND_ACC_PUBLIC) && intern->ignore_visibility == 0) {
5394-
name = _default_load_name(ZEND_THIS);
53955371
zend_throw_exception_ex(reflection_exception_ptr, 0,
5396-
"Cannot access non-public member %s::$%s", ZSTR_VAL(intern->ce->name), Z_STRVAL_P(name));
5372+
"Cannot access non-public member %s::$%s",
5373+
ZSTR_VAL(intern->ce->name), ZSTR_VAL(ref->unmangled_name));
53975374
RETURN_THROWS();
53985375
}
53995376

@@ -5421,7 +5398,7 @@ ZEND_METHOD(reflection_property, isInitialized)
54215398
{
54225399
reflection_object *intern;
54235400
property_reference *ref;
5424-
zval *object = NULL, *name;
5401+
zval *object = NULL;
54255402
zval *member_p = NULL;
54265403

54275404
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|o!", &object) == FAILURE) {
@@ -5431,9 +5408,9 @@ ZEND_METHOD(reflection_property, isInitialized)
54315408
GET_REFLECTION_OBJECT_PTR(ref);
54325409

54335410
if (!(prop_get_flags(ref) & ZEND_ACC_PUBLIC) && intern->ignore_visibility == 0) {
5434-
name = _default_load_name(getThis());
54355411
zend_throw_exception_ex(reflection_exception_ptr, 0,
5436-
"Cannot access non-public member %s::$%s", ZSTR_VAL(intern->ce->name), Z_STRVAL_P(name));
5412+
"Cannot access non-public member %s::$%s",
5413+
ZSTR_VAL(intern->ce->name), ZSTR_VAL(ref->unmangled_name));
54375414
RETURN_THROWS();
54385415
}
54395416

ext/reflection/php_reflection.stub.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public function getFileName() {}
6363
/** @return string|false */
6464
public function getName() {}
6565

66-
/** @return string|false */
66+
/** @return string */
6767
public function getNamespaceName() {}
6868

6969
/** @return int */
@@ -75,7 +75,7 @@ public function getNumberOfRequiredParameters() {}
7575
/** @return ReflectionParameter[] */
7676
public function getParameters() {}
7777

78-
/** @return string|false */
78+
/** @return string */
7979
public function getShortName() {}
8080

8181
/** @return int|false */
@@ -349,10 +349,10 @@ public function getExtensionName() {}
349349
/** @return bool */
350350
public function inNamespace() {}
351351

352-
/** @return string|false */
352+
/** @return string */
353353
public function getNamespaceName() {}
354354

355-
/** @return string|false */
355+
/** @return string */
356356
public function getShortName() {}
357357
}
358358

0 commit comments

Comments
 (0)