2929#include "ext/standard/php_incomplete_class.h"
3030
3131
32- static int le_sdl = 0 ;
33- int le_url = 0 ;
3432static int le_typemap = 0 ;
3533
3634typedef struct _soapHeader {
@@ -65,7 +63,6 @@ static xmlNodePtr serialize_parameter(sdlParamPtr param,zval *param_val,int inde
6563static xmlNodePtr serialize_zval (zval * val , sdlParamPtr param , char * paramName , int style , xmlNodePtr parent );
6664
6765static void delete_service (void * service );
68- static void delete_url (void * handle );
6966static void delete_hashtable (void * hashtable );
7067
7168static 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
130127#define FETCH_THIS_SDL (ss ) \
131128 { \
132129 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 ; \
135132 } else { \
136133 ss = NULL; \
137134 } \
138135 }
139136
140- #define FETCH_SDL_RES (ss ,tmp ) ss = (sdlPtr) zend_fetch_resource_ex(tmp, "sdl", le_sdl)
141-
142137#define FETCH_TYPEMAP_RES (ss ,tmp ) ss = (HashTable*) zend_fetch_resource_ex(tmp, "typemap", le_typemap)
143138
144139#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;
178173static zend_class_entry * soap_header_class_entry ;
179174static zend_class_entry * soap_param_class_entry ;
180175zend_class_entry * soap_var_class_entry ;
176+ zend_class_entry * soap_url_class_entry , * soap_sdl_class_entry ;
181177
182178static zend_object_handlers soap_server_object_handlers ;
179+ static zend_object_handlers soap_url_object_handlers , soap_sdl_object_handlers ;
183180
184181typedef struct {
185182 soapServicePtr service ;
@@ -206,6 +203,69 @@ static void soap_server_object_free(zend_object *obj) {
206203 zend_object_std_dtor (obj );
207204}
208205
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+
209269ZEND_DECLARE_MODULE_GLOBALS (soap )
210270
211271static void (* old_error_handler )(int , zend_string * , const uint32_t , zend_string * );
@@ -390,16 +450,6 @@ PHP_RINIT_FUNCTION(soap)
390450 return SUCCESS ;
391451}
392452
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-
403453static void delete_hashtable_res (zend_resource * res )
404454{
405455 delete_hashtable (res -> ptr );
@@ -435,10 +485,30 @@ PHP_MINIT_FUNCTION(soap)
435485
436486 soap_header_class_entry = register_class_SoapHeader ();
437487
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 );
440488 le_typemap = zend_register_list_destructors_ex (delete_hashtable_res , NULL , "SOAP table" , module_number );
441489
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+
442512 register_soap_symbols (module_number );
443513
444514 old_error_handler = zend_error_cb ;
@@ -2053,15 +2123,16 @@ PHP_METHOD(SoapClient, __construct)
20532123
20542124 if (wsdl ) {
20552125 int old_soap_version ;
2056- zend_resource * res ;
20572126
20582127 old_soap_version = SOAP_GLOBAL (soap_version );
20592128 SOAP_GLOBAL (soap_version ) = soap_version ;
20602129
20612130 sdl = get_sdl (this_ptr , ZSTR_VAL (wsdl ), cache_wsdl );
2062- res = zend_register_resource (sdl , le_sdl );
20632131
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 ;
20652136
20662137 SOAP_GLOBAL (soap_version ) = old_soap_version ;
20672138 }
@@ -2194,8 +2265,8 @@ static void do_soap_call(zend_execute_data *execute_data,
21942265 }
21952266
21962267 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 ;
21992270 }
22002271
22012272 tmp = Z_CLIENT_TYPEMAP_P (this_ptr );
@@ -2503,14 +2574,13 @@ PHP_METHOD(SoapClient, __soapCall)
25032574/* {{{ Returns list of SOAP functions */
25042575PHP_METHOD (SoapClient , __getFunctions )
25052576{
2506- sdlPtr sdl ;
2507-
2508- FETCH_THIS_SDL (sdl );
2509-
25102577 if (zend_parse_parameters_none () == FAILURE ) {
25112578 RETURN_THROWS ();
25122579 }
25132580
2581+ sdl * sdl ;
2582+ FETCH_THIS_SDL (sdl );
2583+
25142584 if (sdl ) {
25152585 smart_str buf = {0 };
25162586 sdlFunctionPtr function ;
@@ -2529,14 +2599,13 @@ PHP_METHOD(SoapClient, __getFunctions)
25292599/* {{{ Returns list of SOAP types */
25302600PHP_METHOD (SoapClient , __getTypes )
25312601{
2532- sdlPtr sdl ;
2533-
2534- FETCH_THIS_SDL (sdl );
2535-
25362602 if (zend_parse_parameters_none () == FAILURE ) {
25372603 RETURN_THROWS ();
25382604 }
25392605
2606+ sdl * sdl ;
2607+ FETCH_THIS_SDL (sdl );
2608+
25402609 if (sdl ) {
25412610 sdlTypePtr type ;
25422611 smart_str buf = {0 };
@@ -4355,12 +4424,6 @@ static void type_to_string(sdlTypePtr type, smart_str *buf, int level) /* {{{ */
43554424}
43564425/* }}} */
43574426
4358- static void delete_url (void * handle ) /* {{{ */
4359- {
4360- php_url_free ((php_url * )handle );
4361- }
4362- /* }}} */
4363-
43644427static void delete_service (void * data ) /* {{{ */
43654428{
43664429 soapServicePtr service = (soapServicePtr )data ;
0 commit comments