@@ -43,9 +43,15 @@ void free_zend_constant(zval *zv)
43
43
44
44
if (!(ZEND_CONSTANT_FLAGS (c ) & CONST_PERSISTENT )) {
45
45
zval_ptr_dtor_nogc (& c -> value );
46
+ if (c -> name ) {
47
+ zend_string_release_ex (c -> name , 0 );
48
+ }
46
49
efree (c );
47
50
} else {
48
51
zval_internal_ptr_dtor (& c -> value );
52
+ if (c -> name ) {
53
+ zend_string_release_ex (c -> name , 1 );
54
+ }
49
55
free (c );
50
56
}
51
57
}
@@ -61,6 +67,7 @@ static void copy_zend_constant(zval *zv)
61
67
memcpy (Z_PTR_P (zv ), c , sizeof (zend_constant ));
62
68
63
69
c = Z_PTR_P (zv );
70
+ c -> name = zend_string_copy (c -> name );
64
71
if (Z_TYPE (c -> value ) == IS_STRING ) {
65
72
Z_STR (c -> value ) = zend_string_dup (Z_STR (c -> value ), 1 );
66
73
}
@@ -122,7 +129,8 @@ ZEND_API void zend_register_null_constant(const char *name, size_t name_len, int
122
129
123
130
ZVAL_NULL (& c .value );
124
131
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 );
126
134
}
127
135
128
136
ZEND_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
131
139
132
140
ZVAL_BOOL (& c .value , bval );
133
141
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 );
135
144
}
136
145
137
146
ZEND_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
140
149
141
150
ZVAL_LONG (& c .value , lval );
142
151
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 );
144
154
}
145
155
146
156
@@ -150,7 +160,8 @@ ZEND_API void zend_register_double_constant(const char *name, size_t name_len, d
150
160
151
161
ZVAL_DOUBLE (& c .value , dval );
152
162
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 );
154
165
}
155
166
156
167
@@ -160,7 +171,8 @@ ZEND_API void zend_register_stringl_constant(const char *name, size_t name_len,
160
171
161
172
ZVAL_STR (& c .value , zend_string_init_interned (strval , strlen , flags & CONST_PERSISTENT ));
162
173
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 );
164
176
}
165
177
166
178
@@ -533,22 +545,25 @@ static void* zend_hash_add_constant(HashTable *ht, zend_string *key, zend_consta
533
545
return ret ;
534
546
}
535
547
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 )
537
549
{
538
550
zend_string * lowercase_name = NULL ;
551
+ zend_string * name ;
539
552
zend_result ret = SUCCESS ;
540
553
bool persistent = (ZEND_CONSTANT_FLAGS (c ) & CONST_PERSISTENT ) != 0 ;
541
554
542
555
#if 0
543
556
printf ("Registering constant for module %d\n" , c -> module_number );
544
557
#endif
545
558
546
- const char * slash = strrchr (ZSTR_VAL (name ), '\\' );
559
+ const char * slash = strrchr (ZSTR_VAL (c -> name ), '\\' );
547
560
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 ));
550
563
lowercase_name = zend_new_interned_string (lowercase_name );
551
564
name = lowercase_name ;
565
+ } else {
566
+ name = c -> name ;
552
567
}
553
568
554
569
/* 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)
557
572
|| zend_hash_add_constant (EG (zend_constants ), name , c ) == NULL
558
573
) {
559
574
zend_error (E_WARNING , "Constant %s already defined" , ZSTR_VAL (name ));
575
+ zend_string_release (c -> name );
560
576
if (!persistent ) {
561
577
zval_ptr_dtor_nogc (& c -> value );
562
578
}
@@ -567,13 +583,3 @@ ZEND_API zend_result zend_register_constant(zend_string *name, zend_constant *c)
567
583
}
568
584
return ret ;
569
585
}
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