Skip to content

Commit 6391c65

Browse files
committed
Migrate ext/soap resources to objects
1 parent 4465e50 commit 6391c65

17 files changed

+796
-666
lines changed

ext/soap/php_http.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -484,8 +484,8 @@ int make_http_soap_request(zval *this_ptr,
484484
if (stream != NULL) {
485485
php_url *orig;
486486
tmp = Z_CLIENT_HTTPURL_P(this_ptr);
487-
if (Z_TYPE_P(tmp) == IS_RESOURCE &&
488-
(orig = (php_url *) zend_fetch_resource_ex(tmp, "httpurl", le_url)) != NULL &&
487+
if (Z_TYPE_P(tmp) == IS_OBJECT && instanceof_function(Z_OBJCE_P(tmp), soap_url_class_entry) &&
488+
(orig = Z_SOAP_URL_P(tmp)->url) != NULL &&
489489
((use_proxy && !use_ssl) ||
490490
(((use_ssl && orig->scheme != NULL && zend_string_equals_literal(orig->scheme, "https")) ||
491491
(!use_ssl && orig->scheme == NULL) ||
@@ -536,9 +536,11 @@ int make_http_soap_request(zval *this_ptr,
536536

537537
if (stream) {
538538
zval *cookies, *login, *password;
539-
zend_resource *ret = zend_register_resource(phpurl, le_url);
540-
ZVAL_RES(Z_CLIENT_HTTPURL_P(this_ptr), ret);
541-
GC_ADDREF(ret);
539+
540+
zval *url_zval = Z_CLIENT_HTTPURL_P(this_ptr);
541+
object_init_ex(url_zval, soap_url_class_entry);
542+
soap_url_object *url_obj = Z_SOAP_URL_P(url_zval);
543+
url_obj->url = phpurl;
542544

543545
if (context &&
544546
(tmp = php_stream_context_get_option(context, "http", "protocol_version")) != NULL &&

ext/soap/php_sdl.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3449,12 +3449,10 @@ void delete_sdl_impl(void *handle)
34493449
efree(tmp);
34503450
}
34513451

3452-
void delete_sdl(void *handle)
3452+
void delete_sdl(sdl *handle)
34533453
{
3454-
sdlPtr tmp = (sdlPtr)handle;
3455-
3456-
if (!tmp->is_persistent) {
3457-
delete_sdl_impl(tmp);
3454+
if (!handle->is_persistent) {
3455+
delete_sdl_impl(handle);
34583456
}
34593457
}
34603458

ext/soap/php_sdl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ encodePtr get_encoder_ex(sdlPtr sdl, const char *nscat, int len);
260260
sdlBindingPtr get_binding_from_type(sdlPtr sdl, sdlBindingType type);
261261
sdlBindingPtr get_binding_from_name(sdlPtr sdl, char *name, char *ns);
262262

263-
void delete_sdl(void *handle);
263+
void delete_sdl(sdl *handle);
264264
void delete_sdl_impl(void *handle);
265265

266266
void sdl_set_uri_credentials(sdlCtx *ctx, char *uri);

ext/soap/php_soap.h

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@
4040
# define stricmp strcasecmp
4141
#endif
4242

43-
extern int le_url;
44-
4543
typedef struct _encodeType encodeType, *encodeTypePtr;
4644
typedef struct _encode encode, *encodePtr;
4745

@@ -194,6 +192,8 @@ ZEND_TSRMLS_CACHE_EXTERN()
194192

195193
extern zend_class_entry* soap_class_entry;
196194
extern zend_class_entry* soap_var_class_entry;
195+
extern zend_class_entry* soap_url_class_entry;
196+
extern zend_class_entry* soap_sdl_class_entry;
197197

198198
void add_soap_fault(zval *obj, char *fault_code, char *fault_string, char *fault_actor, zval *fault_detail);
199199

@@ -253,4 +253,21 @@ static zend_always_inline zval *php_soap_deref(zval *zv) {
253253
#define Z_CLIENT_LAST_REQUEST_HEADERS_P(zv) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 34))
254254
#define Z_CLIENT_LAST_RESPONSE_HEADERS_P(zv) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 35))
255255

256+
typedef struct {
257+
php_url *url;
258+
zend_object std;
259+
} soap_url_object;
260+
261+
static inline soap_url_object *soap_url_object_fetch(zend_object *obj)
262+
{
263+
return (soap_url_object *) ((char *) obj - XtOffsetOf(soap_url_object, std));
264+
}
265+
266+
#define Z_SOAP_URL_P(zv) soap_url_object_fetch(Z_OBJ_P(zv))
267+
268+
typedef struct {
269+
sdl *sdl;
270+
zend_object std;
271+
} soap_sdl_object;
272+
256273
#endif

ext/soap/soap.c

Lines changed: 101 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
#include "ext/standard/php_incomplete_class.h"
3030

3131

32-
static int le_sdl = 0;
33-
int le_url = 0;
3432
static int le_typemap = 0;
3533

3634
typedef struct _soapHeader {
@@ -65,7 +63,6 @@ static xmlNodePtr serialize_parameter(sdlParamPtr param,zval *param_val,int inde
6563
static xmlNodePtr serialize_zval(zval *val, sdlParamPtr param, char *paramName, int style, xmlNodePtr parent);
6664

6765
static void delete_service(void *service);
68-
static void delete_url(void *handle);
6966
static void delete_hashtable(void *hashtable);
7067

7168
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
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;
178173
static zend_class_entry* soap_header_class_entry;
179174
static zend_class_entry* soap_param_class_entry;
180175
zend_class_entry* soap_var_class_entry;
176+
zend_class_entry *soap_url_class_entry, *soap_sdl_class_entry;
181177

182178
static zend_object_handlers soap_server_object_handlers;
179+
static zend_object_handlers soap_url_object_handlers, soap_sdl_object_handlers;
183180

184181
typedef 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+
209269
ZEND_DECLARE_MODULE_GLOBALS(soap)
210270

211271
static 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-
403453
static 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 */
25042575
PHP_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 */
25302600
PHP_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-
43644427
static void delete_service(void *data) /* {{{ */
43654428
{
43664429
soapServicePtr service = (soapServicePtr)data;

0 commit comments

Comments
 (0)