29
29
#include "ext/standard/php_incomplete_class.h"
30
30
31
31
32
- static int le_sdl = 0 ;
33
- int le_url = 0 ;
34
32
static int le_typemap = 0 ;
35
33
36
34
typedef struct _soapHeader {
@@ -65,7 +63,6 @@ static xmlNodePtr serialize_parameter(sdlParamPtr param,zval *param_val,int inde
65
63
static xmlNodePtr serialize_zval (zval * val , sdlParamPtr param , char * paramName , int style , xmlNodePtr parent );
66
64
67
65
static void delete_service (void * service );
68
- static void delete_url (void * handle );
69
66
static void delete_hashtable (void * hashtable );
70
67
71
68
static void soap_error_handler (int error_num , zend_string * error_filename , const uint32_t error_lineno , zend_string * message );
@@ -130,15 +127,13 @@ static void soap_error_handler(int error_num, zend_string *error_filename, const
130
127
#define FETCH_THIS_SDL (ss ) \
131
128
{ \
132
129
zval *__tmp = Z_CLIENT_SDL_P(ZEND_THIS); \
133
- if (Z_TYPE_P(__tmp) == IS_RESOURCE ) { \
134
- FETCH_SDL_RES(ss, __tmp); \
130
+ if (Z_TYPE_P(__tmp) == IS_OBJECT && instanceof_function(Z_OBJCE_P(__tmp), soap_sdl_class_entry) ) { \
131
+ ss = Z_SOAP_SDL_P( __tmp)->sdl ; \
135
132
} else { \
136
133
ss = NULL; \
137
134
} \
138
135
}
139
136
140
- #define FETCH_SDL_RES (ss ,tmp ) ss = (sdlPtr) zend_fetch_resource_ex(tmp, "sdl", le_sdl)
141
-
142
137
#define FETCH_TYPEMAP_RES (ss ,tmp ) ss = (HashTable*) zend_fetch_resource_ex(tmp, "typemap", le_typemap)
143
138
144
139
#define Z_PARAM_NAME_P (zv ) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 0))
@@ -178,8 +173,10 @@ static zend_class_entry* soap_fault_class_entry;
178
173
static zend_class_entry * soap_header_class_entry ;
179
174
static zend_class_entry * soap_param_class_entry ;
180
175
zend_class_entry * soap_var_class_entry ;
176
+ zend_class_entry * soap_url_class_entry , * soap_sdl_class_entry ;
181
177
182
178
static zend_object_handlers soap_server_object_handlers ;
179
+ static zend_object_handlers soap_url_object_handlers , soap_sdl_object_handlers ;
183
180
184
181
typedef struct {
185
182
soapServicePtr service ;
@@ -206,6 +203,69 @@ static void soap_server_object_free(zend_object *obj) {
206
203
zend_object_std_dtor (obj );
207
204
}
208
205
206
+ static zend_object * soap_url_object_create (zend_class_entry * ce )
207
+ {
208
+ soap_url_object * url_obj = zend_object_alloc (sizeof (soap_url_object ), ce );
209
+
210
+ zend_object_std_init (& url_obj -> std , ce );
211
+ object_properties_init (& url_obj -> std , ce );
212
+
213
+ return & url_obj -> std ;
214
+ }
215
+
216
+ static void soap_url_object_free (zend_object * obj )
217
+ {
218
+ soap_url_object * url_obj = soap_url_object_fetch (obj );
219
+
220
+ if (url_obj -> url ) {
221
+ php_url_free (url_obj -> url );
222
+ }
223
+
224
+ zend_object_std_dtor (& url_obj -> std );
225
+ }
226
+
227
+ static zend_function * soap_url_object_get_constructor (zend_object * object )
228
+ {
229
+ zend_throw_error (NULL , "Cannot directly construct Soap\\Url" );
230
+
231
+ return NULL ;
232
+ }
233
+
234
+ static inline soap_sdl_object * soap_sdl_object_fetch (zend_object * obj )
235
+ {
236
+ return (soap_sdl_object * ) ((char * ) obj - XtOffsetOf (soap_sdl_object , std ));
237
+ }
238
+
239
+ #define Z_SOAP_SDL_P (zv ) soap_sdl_object_fetch(Z_OBJ_P(zv))
240
+
241
+ static zend_object * soap_sdl_object_create (zend_class_entry * ce )
242
+ {
243
+ soap_sdl_object * sdl_obj = zend_object_alloc (sizeof (soap_sdl_object ), ce );
244
+
245
+ zend_object_std_init (& sdl_obj -> std , ce );
246
+ object_properties_init (& sdl_obj -> std , ce );
247
+
248
+ return & sdl_obj -> std ;
249
+ }
250
+
251
+ static void soap_sdl_object_free (zend_object * obj )
252
+ {
253
+ soap_sdl_object * sdl_obj = soap_sdl_object_fetch (obj );
254
+
255
+ if (sdl_obj -> sdl ) {
256
+ delete_sdl (sdl_obj -> sdl );
257
+ }
258
+
259
+ zend_object_std_dtor (& sdl_obj -> std );
260
+ }
261
+
262
+ static zend_function * soap_sdl_object_get_constructor (zend_object * object )
263
+ {
264
+ zend_throw_error (NULL , "Cannot directly construct Soap\\Sdl" );
265
+
266
+ return NULL ;
267
+ }
268
+
209
269
ZEND_DECLARE_MODULE_GLOBALS (soap )
210
270
211
271
static void (* old_error_handler )(int , zend_string * , const uint32_t , zend_string * );
@@ -390,16 +450,6 @@ PHP_RINIT_FUNCTION(soap)
390
450
return SUCCESS ;
391
451
}
392
452
393
- static void delete_sdl_res (zend_resource * res )
394
- {
395
- delete_sdl (res -> ptr );
396
- }
397
-
398
- static void delete_url_res (zend_resource * res )
399
- {
400
- delete_url (res -> ptr );
401
- }
402
-
403
453
static void delete_hashtable_res (zend_resource * res )
404
454
{
405
455
delete_hashtable (res -> ptr );
@@ -435,10 +485,30 @@ PHP_MINIT_FUNCTION(soap)
435
485
436
486
soap_header_class_entry = register_class_SoapHeader ();
437
487
438
- le_sdl = zend_register_list_destructors_ex (delete_sdl_res , NULL , "SOAP SDL" , module_number );
439
- le_url = zend_register_list_destructors_ex (delete_url_res , NULL , "SOAP URL" , module_number );
440
488
le_typemap = zend_register_list_destructors_ex (delete_hashtable_res , NULL , "SOAP table" , module_number );
441
489
490
+ soap_url_class_entry = register_class_Soap_Url ();
491
+ soap_url_class_entry -> create_object = soap_url_object_create ;
492
+ soap_url_class_entry -> default_object_handlers = & soap_url_object_handlers ;
493
+
494
+ memcpy (& soap_url_object_handlers , & std_object_handlers , sizeof (zend_object_handlers ));
495
+ soap_url_object_handlers .offset = XtOffsetOf (soap_url_object , std );
496
+ soap_url_object_handlers .free_obj = soap_url_object_free ;
497
+ soap_url_object_handlers .get_constructor = soap_url_object_get_constructor ;
498
+ soap_url_object_handlers .clone_obj = NULL ;
499
+ soap_url_object_handlers .compare = zend_objects_not_comparable ;
500
+
501
+ soap_sdl_class_entry = register_class_Soap_Sdl ();
502
+ soap_sdl_class_entry -> create_object = soap_sdl_object_create ;
503
+ soap_sdl_class_entry -> default_object_handlers = & soap_sdl_object_handlers ;
504
+
505
+ memcpy (& soap_sdl_object_handlers , & std_object_handlers , sizeof (zend_object_handlers ));
506
+ soap_sdl_object_handlers .offset = XtOffsetOf (soap_sdl_object , std );
507
+ soap_sdl_object_handlers .free_obj = soap_sdl_object_free ;
508
+ soap_sdl_object_handlers .get_constructor = soap_sdl_object_get_constructor ;
509
+ soap_sdl_object_handlers .clone_obj = NULL ;
510
+ soap_sdl_object_handlers .compare = zend_objects_not_comparable ;
511
+
442
512
register_soap_symbols (module_number );
443
513
444
514
old_error_handler = zend_error_cb ;
@@ -2053,15 +2123,16 @@ PHP_METHOD(SoapClient, __construct)
2053
2123
2054
2124
if (wsdl ) {
2055
2125
int old_soap_version ;
2056
- zend_resource * res ;
2057
2126
2058
2127
old_soap_version = SOAP_GLOBAL (soap_version );
2059
2128
SOAP_GLOBAL (soap_version ) = soap_version ;
2060
2129
2061
2130
sdl = get_sdl (this_ptr , ZSTR_VAL (wsdl ), cache_wsdl );
2062
- res = zend_register_resource (sdl , le_sdl );
2063
2131
2064
- ZVAL_RES (Z_CLIENT_SDL_P (this_ptr ), res );
2132
+ zval * sdl_zval = Z_CLIENT_SDL_P (this_ptr );
2133
+ object_init_ex (sdl_zval , soap_sdl_class_entry );
2134
+ soap_sdl_object * sdl_object = Z_SOAP_SDL_P (sdl_zval );
2135
+ sdl_object -> sdl = sdl ;
2065
2136
2066
2137
SOAP_GLOBAL (soap_version ) = old_soap_version ;
2067
2138
}
@@ -2194,8 +2265,8 @@ static void do_soap_call(zend_execute_data *execute_data,
2194
2265
}
2195
2266
2196
2267
tmp = Z_CLIENT_SDL_P (this_ptr );
2197
- if (Z_TYPE_P (tmp ) == IS_RESOURCE ) {
2198
- FETCH_SDL_RES ( sdl , tmp );
2268
+ if (Z_TYPE_P (tmp ) == IS_OBJECT && instanceof_function ( Z_OBJCE_P ( tmp ), soap_sdl_class_entry ) ) {
2269
+ sdl = Z_SOAP_SDL_P ( tmp )-> sdl ;
2199
2270
}
2200
2271
2201
2272
tmp = Z_CLIENT_TYPEMAP_P (this_ptr );
@@ -2503,14 +2574,13 @@ PHP_METHOD(SoapClient, __soapCall)
2503
2574
/* {{{ Returns list of SOAP functions */
2504
2575
PHP_METHOD (SoapClient , __getFunctions )
2505
2576
{
2506
- sdlPtr sdl ;
2507
-
2508
- FETCH_THIS_SDL (sdl );
2509
-
2510
2577
if (zend_parse_parameters_none () == FAILURE ) {
2511
2578
RETURN_THROWS ();
2512
2579
}
2513
2580
2581
+ sdl * sdl ;
2582
+ FETCH_THIS_SDL (sdl );
2583
+
2514
2584
if (sdl ) {
2515
2585
smart_str buf = {0 };
2516
2586
sdlFunctionPtr function ;
@@ -2529,14 +2599,13 @@ PHP_METHOD(SoapClient, __getFunctions)
2529
2599
/* {{{ Returns list of SOAP types */
2530
2600
PHP_METHOD (SoapClient , __getTypes )
2531
2601
{
2532
- sdlPtr sdl ;
2533
-
2534
- FETCH_THIS_SDL (sdl );
2535
-
2536
2602
if (zend_parse_parameters_none () == FAILURE ) {
2537
2603
RETURN_THROWS ();
2538
2604
}
2539
2605
2606
+ sdl * sdl ;
2607
+ FETCH_THIS_SDL (sdl );
2608
+
2540
2609
if (sdl ) {
2541
2610
sdlTypePtr type ;
2542
2611
smart_str buf = {0 };
@@ -4355,12 +4424,6 @@ static void type_to_string(sdlTypePtr type, smart_str *buf, int level) /* {{{ */
4355
4424
}
4356
4425
/* }}} */
4357
4426
4358
- static void delete_url (void * handle ) /* {{{ */
4359
- {
4360
- php_url_free ((php_url * )handle );
4361
- }
4362
- /* }}} */
4363
-
4364
4427
static void delete_service (void * data ) /* {{{ */
4365
4428
{
4366
4429
soapServicePtr service = (soapServicePtr )data ;
0 commit comments