@@ -43,15 +43,9 @@ 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- }
4946 efree (c );
5047 } else {
5148 zval_internal_ptr_dtor (& c -> value );
52- if (c -> name ) {
53- zend_string_release_ex (c -> name , 1 );
54- }
5549 free (c );
5650 }
5751}
@@ -67,7 +61,6 @@ static void copy_zend_constant(zval *zv)
6761 memcpy (Z_PTR_P (zv ), c , sizeof (zend_constant ));
6862
6963 c = Z_PTR_P (zv );
70- c -> name = zend_string_copy (c -> name );
7164 if (Z_TYPE (c -> value ) == IS_STRING ) {
7265 Z_STR (c -> value ) = zend_string_dup (Z_STR (c -> value ), 1 );
7366 }
@@ -129,8 +122,7 @@ ZEND_API void zend_register_null_constant(const char *name, size_t name_len, int
129122
130123 ZVAL_NULL (& c .value );
131124 ZEND_CONSTANT_SET_FLAGS (& c , flags , module_number );
132- c .name = zend_string_init_interned (name , name_len , flags & CONST_PERSISTENT );
133- zend_register_constant (& c );
125+ zend_register_internal_constant (name , name_len , & c );
134126}
135127
136128ZEND_API void zend_register_bool_constant (const char * name , size_t name_len , bool bval , int flags , int module_number )
@@ -139,8 +131,7 @@ ZEND_API void zend_register_bool_constant(const char *name, size_t name_len, boo
139131
140132 ZVAL_BOOL (& c .value , bval );
141133 ZEND_CONSTANT_SET_FLAGS (& c , flags , module_number );
142- c .name = zend_string_init_interned (name , name_len , flags & CONST_PERSISTENT );
143- zend_register_constant (& c );
134+ zend_register_internal_constant (name , name_len , & c );
144135}
145136
146137ZEND_API void zend_register_long_constant (const char * name , size_t name_len , zend_long lval , int flags , int module_number )
@@ -149,8 +140,7 @@ ZEND_API void zend_register_long_constant(const char *name, size_t name_len, zen
149140
150141 ZVAL_LONG (& c .value , lval );
151142 ZEND_CONSTANT_SET_FLAGS (& c , flags , module_number );
152- c .name = zend_string_init_interned (name , name_len , flags & CONST_PERSISTENT );
153- zend_register_constant (& c );
143+ zend_register_internal_constant (name , name_len , & c );
154144}
155145
156146
@@ -160,8 +150,7 @@ ZEND_API void zend_register_double_constant(const char *name, size_t name_len, d
160150
161151 ZVAL_DOUBLE (& c .value , dval );
162152 ZEND_CONSTANT_SET_FLAGS (& c , flags , module_number );
163- c .name = zend_string_init_interned (name , name_len , flags & CONST_PERSISTENT );
164- zend_register_constant (& c );
153+ zend_register_internal_constant (name , name_len , & c );
165154}
166155
167156
@@ -171,8 +160,7 @@ ZEND_API void zend_register_stringl_constant(const char *name, size_t name_len,
171160
172161 ZVAL_STR (& c .value , zend_string_init_interned (strval , strlen , flags & CONST_PERSISTENT ));
173162 ZEND_CONSTANT_SET_FLAGS (& c , flags , module_number );
174- c .name = zend_string_init_interned (name , name_len , flags & CONST_PERSISTENT );
175- zend_register_constant (& c );
163+ zend_register_internal_constant (name , name_len , & c );
176164}
177165
178166
@@ -545,25 +533,22 @@ static void* zend_hash_add_constant(HashTable *ht, zend_string *key, zend_consta
545533 return ret ;
546534}
547535
548- ZEND_API zend_result zend_register_constant (zend_constant * c )
536+ ZEND_API zend_result zend_register_constant (zend_string * name , zend_constant * c )
549537{
550538 zend_string * lowercase_name = NULL ;
551- zend_string * name ;
552539 zend_result ret = SUCCESS ;
553540 bool persistent = (ZEND_CONSTANT_FLAGS (c ) & CONST_PERSISTENT ) != 0 ;
554541
555542#if 0
556543 printf ("Registering constant for module %d\n" , c -> module_number );
557544#endif
558545
559- const char * slash = strrchr (ZSTR_VAL (c -> name ), '\\' );
546+ const char * slash = strrchr (ZSTR_VAL (name ), '\\' );
560547 if (slash ) {
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 ));
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 ));
563550 lowercase_name = zend_new_interned_string (lowercase_name );
564551 name = lowercase_name ;
565- } else {
566- name = c -> name ;
567552 }
568553
569554 /* Check if the user is trying to define any special constant */
@@ -572,7 +557,6 @@ ZEND_API zend_result zend_register_constant(zend_constant *c)
572557 || zend_hash_add_constant (EG (zend_constants ), name , c ) == NULL
573558 ) {
574559 zend_error (E_WARNING , "Constant %s already defined" , ZSTR_VAL (name ));
575- zend_string_release (c -> name );
576560 if (!persistent ) {
577561 zval_ptr_dtor_nogc (& c -> value );
578562 }
@@ -583,3 +567,13 @@ ZEND_API zend_result zend_register_constant(zend_constant *c)
583567 }
584568 return ret ;
585569}
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