@@ -43,9 +43,15 @@ void free_zend_constant(zval *zv)
4343
4444 if (!(ZEND_CONSTANT_FLAGS (c ) & CONST_PERSISTENT )) {
4545 zval_ptr_dtor_nogc (& c -> value );
46+ if (c -> name ) {
47+ zend_string_release_ex (c -> name , 0 );
48+ }
4649 efree (c );
4750 } else {
4851 zval_internal_ptr_dtor (& c -> value );
52+ if (c -> name ) {
53+ zend_string_release_ex (c -> name , 1 );
54+ }
4955 free (c );
5056 }
5157}
@@ -61,6 +67,7 @@ static void copy_zend_constant(zval *zv)
6167 memcpy (Z_PTR_P (zv ), c , sizeof (zend_constant ));
6268
6369 c = Z_PTR_P (zv );
70+ c -> name = zend_string_copy (c -> name );
6471 if (Z_TYPE (c -> value ) == IS_STRING ) {
6572 Z_STR (c -> value ) = zend_string_dup (Z_STR (c -> value ), 1 );
6673 }
@@ -122,7 +129,8 @@ ZEND_API void zend_register_null_constant(const char *name, size_t name_len, int
122129
123130 ZVAL_NULL (& c .value );
124131 ZEND_CONSTANT_SET_FLAGS (& c , flags , module_number );
125- zend_register_internal_constant (name , name_len , & c );
132+ c .name = zend_string_init_interned (name , name_len , flags & CONST_PERSISTENT );
133+ zend_register_constant (& c );
126134}
127135
128136ZEND_API void zend_register_bool_constant (const char * name , size_t name_len , bool bval , int flags , int module_number )
@@ -131,7 +139,8 @@ ZEND_API void zend_register_bool_constant(const char *name, size_t name_len, boo
131139
132140 ZVAL_BOOL (& c .value , bval );
133141 ZEND_CONSTANT_SET_FLAGS (& c , flags , module_number );
134- zend_register_internal_constant (name , name_len , & c );
142+ c .name = zend_string_init_interned (name , name_len , flags & CONST_PERSISTENT );
143+ zend_register_constant (& c );
135144}
136145
137146ZEND_API void zend_register_long_constant (const char * name , size_t name_len , zend_long lval , int flags , int module_number )
@@ -140,7 +149,8 @@ ZEND_API void zend_register_long_constant(const char *name, size_t name_len, zen
140149
141150 ZVAL_LONG (& c .value , lval );
142151 ZEND_CONSTANT_SET_FLAGS (& c , flags , module_number );
143- zend_register_internal_constant (name , name_len , & c );
152+ c .name = zend_string_init_interned (name , name_len , flags & CONST_PERSISTENT );
153+ zend_register_constant (& c );
144154}
145155
146156
@@ -150,7 +160,8 @@ ZEND_API void zend_register_double_constant(const char *name, size_t name_len, d
150160
151161 ZVAL_DOUBLE (& c .value , dval );
152162 ZEND_CONSTANT_SET_FLAGS (& c , flags , module_number );
153- zend_register_internal_constant (name , name_len , & c );
163+ c .name = zend_string_init_interned (name , name_len , flags & CONST_PERSISTENT );
164+ zend_register_constant (& c );
154165}
155166
156167
@@ -160,7 +171,8 @@ ZEND_API void zend_register_stringl_constant(const char *name, size_t name_len,
160171
161172 ZVAL_STR (& c .value , zend_string_init_interned (strval , strlen , flags & CONST_PERSISTENT ));
162173 ZEND_CONSTANT_SET_FLAGS (& c , flags , module_number );
163- zend_register_internal_constant (name , name_len , & c );
174+ c .name = zend_string_init_interned (name , name_len , flags & CONST_PERSISTENT );
175+ zend_register_constant (& c );
164176}
165177
166178
@@ -533,22 +545,25 @@ static void* zend_hash_add_constant(HashTable *ht, zend_string *key, zend_consta
533545 return ret ;
534546}
535547
536- ZEND_API zend_result zend_register_constant (zend_string * name , zend_constant * c )
548+ ZEND_API zend_result zend_register_constant (zend_constant * c )
537549{
538550 zend_string * lowercase_name = NULL ;
551+ zend_string * name ;
539552 zend_result ret = SUCCESS ;
540553 bool persistent = (ZEND_CONSTANT_FLAGS (c ) & CONST_PERSISTENT ) != 0 ;
541554
542555#if 0
543556 printf ("Registering constant for module %d\n" , c -> module_number );
544557#endif
545558
546- const char * slash = strrchr (ZSTR_VAL (name ), '\\' );
559+ const char * slash = strrchr (ZSTR_VAL (c -> name ), '\\' );
547560 if (slash ) {
548- lowercase_name = zend_string_init (ZSTR_VAL (name ), ZSTR_LEN (name ), persistent );
549- zend_str_tolower (ZSTR_VAL (lowercase_name ), slash - ZSTR_VAL (name ));
561+ lowercase_name = zend_string_init (ZSTR_VAL (c -> name ), ZSTR_LEN (c -> name ), persistent );
562+ zend_str_tolower (ZSTR_VAL (lowercase_name ), slash - ZSTR_VAL (c -> name ));
550563 lowercase_name = zend_new_interned_string (lowercase_name );
551564 name = lowercase_name ;
565+ } else {
566+ name = c -> name ;
552567 }
553568
554569 /* Check if the user is trying to define any special constant */
@@ -557,6 +572,7 @@ ZEND_API zend_result zend_register_constant(zend_string *name, zend_constant *c)
557572 || zend_hash_add_constant (EG (zend_constants ), name , c ) == NULL
558573 ) {
559574 zend_error (E_WARNING , "Constant %s already defined" , ZSTR_VAL (name ));
575+ zend_string_release (c -> name );
560576 if (!persistent ) {
561577 zval_ptr_dtor_nogc (& c -> value );
562578 }
@@ -567,13 +583,3 @@ ZEND_API zend_result zend_register_constant(zend_string *name, zend_constant *c)
567583 }
568584 return ret ;
569585}
570-
571- ZEND_API zend_result zend_register_internal_constant (const char * name , size_t name_len , zend_constant * c ) {
572- zend_string * name_str = zend_string_init_interned (name , name_len , ZEND_CONSTANT_FLAGS (c ) & CONST_PERSISTENT );
573-
574- zend_result result = zend_register_constant (name_str , c );
575-
576- zend_string_release (name_str );
577-
578- return result ;
579- }
0 commit comments