@@ -1009,7 +1009,9 @@ PHP_METHOD(SoapServer, __construct)
1009
1009
service -> version = version ;
1010
1010
service -> type = SOAP_FUNCTIONS ;
1011
1011
service -> soap_functions .functions_all = false;
1012
- service -> soap_functions .ft = zend_new_array (0 );
1012
+ ALLOC_HASHTABLE (service -> soap_functions .ft );
1013
+ /* This hashtable contains zend_function pointers so doesn't need a destructor */
1014
+ zend_hash_init (service -> soap_functions .ft , 0 , NULL , NULL , false);
1013
1015
1014
1016
if (wsdl ) {
1015
1017
service -> sdl = get_sdl (ZEND_THIS , ZSTR_VAL (wsdl ), cache_wsdl );
@@ -1123,7 +1125,7 @@ PHP_METHOD(SoapServer, setObject)
1123
1125
PHP_METHOD (SoapServer , getFunctions )
1124
1126
{
1125
1127
soapServicePtr service ;
1126
- HashTable * ft = NULL ;
1128
+ const HashTable * ft = NULL ;
1127
1129
1128
1130
if (zend_parse_parameters_none () == FAILURE ) {
1129
1131
RETURN_THROWS ();
@@ -1139,11 +1141,7 @@ PHP_METHOD(SoapServer, getFunctions)
1139
1141
} else if (service -> soap_functions .functions_all ) {
1140
1142
ft = EG (function_table );
1141
1143
} else if (service -> soap_functions .ft != NULL ) {
1142
- zval * name ;
1143
-
1144
- ZEND_HASH_MAP_FOREACH_VAL (service -> soap_functions .ft , name ) {
1145
- add_next_index_str (return_value , zend_string_copy (Z_STR_P (name )));
1146
- } ZEND_HASH_FOREACH_END ();
1144
+ ft = service -> soap_functions .ft ;
1147
1145
}
1148
1146
if (ft != NULL ) {
1149
1147
zend_function * f ;
@@ -1162,7 +1160,7 @@ PHP_METHOD(SoapServer, getFunctions)
1162
1160
PHP_METHOD (SoapServer , addFunction )
1163
1161
{
1164
1162
soapServicePtr service ;
1165
- zval * function_name , function_copy ;
1163
+ zval * function_name ;
1166
1164
1167
1165
if (zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & function_name ) == FAILURE ) {
1168
1166
RETURN_THROWS ();
@@ -1178,7 +1176,9 @@ PHP_METHOD(SoapServer, addFunction)
1178
1176
1179
1177
if (service -> soap_functions .ft == NULL ) {
1180
1178
service -> soap_functions .functions_all = false;
1181
- service -> soap_functions .ft = zend_new_array (zend_hash_num_elements (Z_ARRVAL_P (function_name )));
1179
+ ALLOC_HASHTABLE (service -> soap_functions .ft );
1180
+ /* This hashtable contains zend_function pointers so doesn't need a destructor */
1181
+ zend_hash_init (service -> soap_functions .ft , zend_hash_num_elements (Z_ARRVAL_P (function_name )), NULL , NULL , false);
1182
1182
}
1183
1183
1184
1184
ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (function_name ), tmp_function ) {
@@ -1191,15 +1191,15 @@ PHP_METHOD(SoapServer, addFunction)
1191
1191
}
1192
1192
1193
1193
key = zend_string_tolower (Z_STR_P (tmp_function ));
1194
+ f = zend_hash_find_ptr (EG (function_table ), key );
1194
1195
1195
- if (( f = zend_hash_find_ptr ( EG ( function_table ), key )) == NULL ) {
1196
+ if (f == NULL ) {
1196
1197
zend_string_release_ex (key , false);
1197
1198
zend_type_error ("SoapServer::addFunction(): Function \"%s\" not found" , Z_STRVAL_P (tmp_function ));
1198
1199
RETURN_THROWS ();
1199
1200
}
1200
1201
1201
- ZVAL_STR_COPY (& function_copy , f -> common .function_name );
1202
- zend_hash_update (service -> soap_functions .ft , key , & function_copy );
1202
+ zend_hash_update_ptr (service -> soap_functions .ft , key , f );
1203
1203
1204
1204
zend_string_release_ex (key , 0 );
1205
1205
} ZEND_HASH_FOREACH_END ();
@@ -1209,19 +1209,20 @@ PHP_METHOD(SoapServer, addFunction)
1209
1209
zend_function * f ;
1210
1210
1211
1211
key = zend_string_tolower (Z_STR_P (function_name ));
1212
-
1213
- if (( f = zend_hash_find_ptr ( EG ( function_table ), key )) == NULL ) {
1212
+ f = zend_hash_find_ptr ( EG ( function_table ), key );
1213
+ if (f == NULL ) {
1214
1214
zend_string_release_ex (key , false);
1215
1215
zend_argument_type_error (1 , "must be a valid function name, function \"%s\" not found" , Z_STRVAL_P (function_name ));
1216
1216
RETURN_THROWS ();
1217
1217
}
1218
1218
if (service -> soap_functions .ft == NULL ) {
1219
1219
service -> soap_functions .functions_all = false;
1220
- service -> soap_functions .ft = zend_new_array (0 );
1220
+ ALLOC_HASHTABLE (service -> soap_functions .ft );
1221
+ /* This hashtable contains zend_function pointers so doesn't need a destructor */
1222
+ zend_hash_init (service -> soap_functions .ft , 0 , NULL , NULL , false);
1221
1223
}
1222
1224
1223
- ZVAL_STR_COPY (& function_copy , f -> common .function_name );
1224
- zend_hash_update (service -> soap_functions .ft , key , & function_copy );
1225
+ zend_hash_update_ptr (service -> soap_functions .ft , key , f );
1225
1226
zend_string_release_ex (key , 0 );
1226
1227
} else if (Z_TYPE_P (function_name ) == IS_LONG ) {
1227
1228
if (Z_LVAL_P (function_name ) == SOAP_FUNCTIONS_ALL ) {
0 commit comments