30
30
31
31
static int le_sdl = 0 ;
32
32
int le_url = 0 ;
33
- static int le_service = 0 ;
34
33
static int le_typemap = 0 ;
35
34
36
35
typedef struct _soapHeader {
@@ -150,8 +149,7 @@ static void soap_error_handler(int error_num, zend_string *error_filename, const
150
149
#define Z_HEADER_MUST_UNDERSTAND_P (zv ) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 3))
151
150
#define Z_HEADER_ACTOR_P (zv ) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 4))
152
151
153
- #define Z_SERVER_SERVICE_P (zv ) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 0))
154
- #define Z_SERVER_SOAP_FAULT_P (zv ) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 1))
152
+ #define Z_SERVER_SOAP_FAULT_P (zv ) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 0))
155
153
156
154
/* SoapFault extends Exception, so take those properties into account. */
157
155
#define FAULT_PROP_START_OFFSET zend_ce_exception->default_properties_count
@@ -165,8 +163,7 @@ static void soap_error_handler(int error_num, zend_string *error_filename, const
165
163
166
164
#define FETCH_THIS_SERVICE (ss ) \
167
165
{ \
168
- zval *tmp = Z_SERVER_SERVICE_P(ZEND_THIS); \
169
- ss = (soapServicePtr)zend_fetch_resource_ex(tmp, "service", le_service); \
166
+ ss = soap_server_object_fetch(Z_OBJ_P(ZEND_THIS))->service; \
170
167
if (!ss) { \
171
168
zend_throw_error(NULL, "Cannot fetch SoapServer object"); \
172
169
SOAP_SERVER_END_CODE(); \
@@ -181,6 +178,34 @@ static zend_class_entry* soap_header_class_entry;
181
178
static zend_class_entry * soap_param_class_entry ;
182
179
zend_class_entry * soap_var_class_entry ;
183
180
181
+ static zend_object_handlers soap_server_object_handlers ;
182
+
183
+ typedef struct {
184
+ soapServicePtr service ;
185
+ zend_object std ;
186
+ } soap_server_object ;
187
+
188
+ static inline soap_server_object * soap_server_object_fetch (zend_object * obj ) {
189
+ return (soap_server_object * ) ((char * ) obj - XtOffsetOf (soap_server_object , std ));
190
+ }
191
+
192
+ static zend_object * soap_server_object_create (zend_class_entry * ce )
193
+ {
194
+ soap_server_object * obj = zend_object_alloc (sizeof (soap_server_object ), ce );
195
+ zend_object_std_init (& obj -> std , ce );
196
+ object_properties_init (& obj -> std , ce );
197
+ obj -> std .handlers = & soap_server_object_handlers ;
198
+ return & obj -> std ;
199
+ }
200
+
201
+ static void soap_server_object_free (zend_object * obj ) {
202
+ soap_server_object * server_obj = soap_server_object_fetch (obj );
203
+ if (server_obj -> service ) {
204
+ delete_service (server_obj -> service );
205
+ }
206
+ zend_object_std_dtor (obj );
207
+ }
208
+
184
209
ZEND_DECLARE_MODULE_GLOBALS (soap )
185
210
186
211
static void (* old_error_handler )(int , zend_string * , const uint32_t , zend_string * );
@@ -361,11 +386,6 @@ static void delete_url_res(zend_resource *res)
361
386
delete_url (res -> ptr );
362
387
}
363
388
364
- static void delete_service_res (zend_resource * res )
365
- {
366
- delete_service (res -> ptr );
367
- }
368
-
369
389
static void delete_hashtable_res (zend_resource * res )
370
390
{
371
391
delete_hashtable (res -> ptr );
@@ -386,6 +406,11 @@ PHP_MINIT_FUNCTION(soap)
386
406
387
407
/* Register SoapServer class */
388
408
soap_server_class_entry = register_class_SoapServer ();
409
+ soap_server_class_entry -> create_object = soap_server_object_create ;
410
+
411
+ memcpy (& soap_server_object_handlers , & std_object_handlers , sizeof (zend_object_handlers ));
412
+ soap_server_object_handlers .offset = XtOffsetOf (soap_server_object , std );
413
+ soap_server_object_handlers .free_obj = soap_server_object_free ;
389
414
390
415
/* Register SoapFault class */
391
416
soap_fault_class_entry = register_class_SoapFault (zend_ce_exception );
@@ -397,7 +422,6 @@ PHP_MINIT_FUNCTION(soap)
397
422
398
423
le_sdl = zend_register_list_destructors_ex (delete_sdl_res , NULL , "SOAP SDL" , module_number );
399
424
le_url = zend_register_list_destructors_ex (delete_url_res , NULL , "SOAP URL" , module_number );
400
- le_service = zend_register_list_destructors_ex (delete_service_res , NULL , "SOAP service" , module_number );
401
425
le_typemap = zend_register_list_destructors_ex (delete_hashtable_res , NULL , "SOAP table" , module_number );
402
426
403
427
REGISTER_LONG_CONSTANT ("SOAP_1_1" , SOAP_1_1 , CONST_CS | CONST_PERSISTENT );
@@ -832,7 +856,6 @@ PHP_METHOD(SoapServer, __construct)
832
856
soapServicePtr service ;
833
857
zval * options = NULL ;
834
858
zend_string * wsdl ;
835
- zend_resource * res ;
836
859
int version = SOAP_1_1 ;
837
860
zend_long cache_wsdl ;
838
861
HashTable * typemap_ht = NULL ;
@@ -942,8 +965,8 @@ PHP_METHOD(SoapServer, __construct)
942
965
service -> typemap = soap_create_typemap (service -> sdl , typemap_ht );
943
966
}
944
967
945
- res = zend_register_resource ( service , le_service );
946
- ZVAL_RES ( Z_SERVER_SERVICE_P ( ZEND_THIS ), res ) ;
968
+ soap_server_object * server_obj = soap_server_object_fetch ( Z_OBJ_P ( ZEND_THIS ) );
969
+ server_obj -> service = service ;
947
970
948
971
SOAP_SERVER_END_CODE ();
949
972
}
@@ -1824,7 +1847,7 @@ static zend_never_inline ZEND_COLD void soap_real_error_handler(int error_num, z
1824
1847
}
1825
1848
if (Z_OBJ_P (error_object ) &&
1826
1849
instanceof_function (Z_OBJCE_P (error_object ), soap_server_class_entry ) &&
1827
- (service = ( soapServicePtr ) zend_fetch_resource_ex ( Z_SERVER_SERVICE_P ( error_object ), "service" , le_service ) ) &&
1850
+ (service = soap_server_object_fetch ( Z_OBJ_P ( error_object )) -> service ) &&
1828
1851
!service -> send_errors ) {
1829
1852
buffer = zend_string_init ("Internal Error" , sizeof ("Internal Error" )- 1 , 0 );
1830
1853
} else {
0 commit comments