@@ -91,91 +91,98 @@ uri_property_handler_t *uri_property_handler_from_internal_uri(const uri_interna
91
91
void throw_invalid_uri_exception (zval * errors );
92
92
93
93
#define URI_CHECK_INITIALIZATION_RETURN_THROWS (internal_uri , object ) do { \
94
- ZEND_ASSERT(internal_uri != NULL); \
94
+ ZEND_ASSERT(internal_uri != NULL); \
95
95
if (UNEXPECTED(internal_uri->uri == NULL)) { \
96
- zend_throw_error(uninitialized_uri_exception_ce, "%s object is not correctly initialized", ZSTR_VAL(object->ce->name)); \
97
- RETURN_THROWS(); \
98
- } \
96
+ zend_throw_error(uninitialized_uri_exception_ce, "%s object is not correctly initialized", ZSTR_VAL(object->ce->name)); \
97
+ RETURN_THROWS(); \
98
+ } \
99
99
} while (0)
100
100
101
101
#define URI_CHECK_INITIALIZATION_RETURN (internal_uri , object , return_on_failure ) do { \
102
- ZEND_ASSERT(internal_uri != NULL); \
102
+ ZEND_ASSERT(internal_uri != NULL); \
103
103
if (UNEXPECTED(internal_uri->uri == NULL)) { \
104
- zend_throw_error(uninitialized_uri_exception_ce, "%s object is not correctly initialized", ZSTR_VAL(object->ce->name)); \
105
- return return_on_failure; \
104
+ zend_throw_error(uninitialized_uri_exception_ce, "%s object is not correctly initialized", ZSTR_VAL(object->ce->name)); \
105
+ return return_on_failure; \
106
106
} \
107
107
} while (0)
108
108
109
109
#define URI_CHECK_INITIALIZATION_RETURN_VOID (internal_uri , object ) do { \
110
- ZEND_ASSERT(internal_uri != NULL); \
110
+ ZEND_ASSERT(internal_uri != NULL); \
111
111
if (UNEXPECTED(internal_uri->uri == NULL)) { \
112
- zend_throw_error(uninitialized_uri_exception_ce, "%s object is not correctly initialized", ZSTR_VAL(object->ce->name)); \
113
- return; \
112
+ zend_throw_error(uninitialized_uri_exception_ce, "%s object is not correctly initialized", ZSTR_VAL(object->ce->name)); \
113
+ return; \
114
114
} \
115
115
} while (0)
116
116
117
117
#define URI_GETTER (property_name ) do { \
118
- ZEND_PARSE_PARAMETERS_NONE(); \
119
- uri_internal_t *internal_uri = Z_URI_INTERNAL_P(ZEND_THIS); \
120
- URI_CHECK_INITIALIZATION_RETURN_THROWS(internal_uri, Z_OBJ_P(ZEND_THIS)); \
121
- const uri_property_handler_t *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name); \
122
- ZEND_ASSERT(property_handler != NULL); \
123
- if (property_handler->read_func(internal_uri, return_value) == FAILURE) { \
124
- zend_throw_error(NULL, "%s::$%s property cannot be retrieved", ZSTR_VAL(Z_OBJ_P(ZEND_THIS)->ce->name), ZSTR_VAL(property_name)); \
125
- RETURN_THROWS(); \
126
- } \
118
+ ZEND_PARSE_PARAMETERS_NONE(); \
119
+ uri_internal_t *internal_uri = Z_URI_INTERNAL_P(ZEND_THIS); \
120
+ URI_CHECK_INITIALIZATION_RETURN_THROWS(internal_uri, Z_OBJ_P(ZEND_THIS)); \
121
+ const uri_property_handler_t *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name); \
122
+ ZEND_ASSERT(property_handler != NULL); \
123
+ if (UNEXPECTED( property_handler->read_func(internal_uri, return_value) == FAILURE) ) { \
124
+ zend_throw_error(NULL, "%s::$%s property cannot be retrieved", ZSTR_VAL(Z_OBJ_P(ZEND_THIS)->ce->name), ZSTR_VAL(property_name)); \
125
+ RETURN_THROWS(); \
126
+ } \
127
127
} while (0)
128
128
129
129
#define URI_WITHER_COMMON (property_name , property_zv , return_value ) \
130
130
uri_internal_t *internal_uri = Z_URI_INTERNAL_P(ZEND_THIS); \
131
- URI_CHECK_INITIALIZATION_RETURN_THROWS(internal_uri, Z_OBJ_P(ZEND_THIS)); \
132
- const uri_property_handler_t *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name); \
133
- ZEND_ASSERT(property_handler != NULL); \
134
- zend_object *new_object = uri_clone_obj_handler(Z_OBJ_P(ZEND_THIS)); \
131
+ URI_CHECK_INITIALIZATION_RETURN_THROWS(internal_uri, Z_OBJ_P(ZEND_THIS)); \
132
+ const uri_property_handler_t *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name); \
133
+ ZEND_ASSERT(property_handler != NULL); \
134
+ zend_object *new_object = uri_clone_obj_handler(Z_OBJ_P(ZEND_THIS)); \
135
135
if (UNEXPECTED(EG(exception) != NULL)) { \
136
+ zend_object_release(new_object); \
137
+ zval_ptr_dtor(property_zv); \
136
138
RETURN_THROWS(); \
137
139
} \
138
- uri_internal_t *new_internal_uri = uri_internal_from_obj(new_object); \
139
- URI_CHECK_INITIALIZATION_RETURN_THROWS(new_internal_uri, Z_OBJ_P(ZEND_THIS)); \
140
- if (property_handler->write_func == NULL) { \
141
- zend_readonly_property_modification_error_ex(ZSTR_VAL(Z_OBJ_P(ZEND_THIS)->ce->name), ZSTR_VAL(property_name)); \
142
- RETURN_THROWS(); \
143
- } \
144
- zval errors; \
145
- ZVAL_UNDEF(&errors); \
140
+ uri_internal_t *new_internal_uri = uri_internal_from_obj(new_object); \
141
+ URI_CHECK_INITIALIZATION_RETURN_THROWS(new_internal_uri, Z_OBJ_P(ZEND_THIS)); /* TODO fix memory leak of new_object */ \
142
+ if (property_handler -> write_func == NULL ) { \
143
+ zend_readonly_property_modification_error_ex (ZSTR_VAL (Z_OBJ_P (ZEND_THIS )-> ce -> name ), ZSTR_VAL (property_name )); \
144
+ zend_object_release (new_object ); \
145
+ zval_ptr_dtor (property_zv ); \
146
+ RETURN_THROWS (); \
147
+ } \
148
+ zval errors ; \
149
+ ZVAL_UNDEF (& errors ); \
146
150
if (property_handler -> write_func (new_internal_uri , property_zv , & errors ) == FAILURE ) { \
147
151
throw_invalid_uri_exception (& errors ); \
148
152
zval_ptr_dtor (& errors ); \
149
- RETURN_THROWS(); \
150
- } \
151
- ZEND_ASSERT(Z_TYPE(errors) == IS_UNDEF); \
152
- ZVAL_OBJ(return_value, new_object);
153
+ zend_object_release (new_object ); \
154
+ zval_ptr_dtor (property_zv ); \
155
+ RETURN_THROWS (); \
156
+ } \
157
+ ZEND_ASSERT (Z_TYPE (errors ) == IS_UNDEF ); \
158
+ ZVAL_OBJ (return_value , new_object ); \
159
+ zval_ptr_dtor (property_zv );
153
160
154
161
#define URI_WITHER_STR (property_name ) do { \
155
- zend_string *value; \
156
- ZEND_PARSE_PARAMETERS_START(1, 1) \
157
- Z_PARAM_PATH_STR_OR_NULL(value) \
158
- ZEND_PARSE_PARAMETERS_END(); \
162
+ zend_string *value; \
163
+ ZEND_PARSE_PARAMETERS_START(1, 1) \
164
+ Z_PARAM_PATH_STR_OR_NULL(value) \
165
+ ZEND_PARSE_PARAMETERS_END(); \
159
166
zval zv; \
160
- if (value == NULL) { \
161
- ZVAL_NULL(&zv); \
167
+ if (value == NULL) { \
168
+ ZVAL_NULL(&zv); \
162
169
} else { \
163
- ZVAL_STR_COPY(&zv, value); \
164
- } \
170
+ ZVAL_STR_COPY(&zv, value); \
171
+ } \
165
172
URI_WITHER_COMMON(property_name, &zv, return_value) \
166
173
} while (0)
167
174
168
175
#define URI_WITHER_LONG (property_name ) do { \
169
- zend_long value; \
170
- bool value_is_null; \
171
- ZEND_PARSE_PARAMETERS_START(1, 1) \
172
- Z_PARAM_LONG_OR_NULL(value, value_is_null) \
173
- ZEND_PARSE_PARAMETERS_END(); \
176
+ zend_long value; \
177
+ bool value_is_null; \
178
+ ZEND_PARSE_PARAMETERS_START(1, 1) \
179
+ Z_PARAM_LONG_OR_NULL(value, value_is_null) \
180
+ ZEND_PARSE_PARAMETERS_END(); \
174
181
zval zv; \
175
- if (value_is_null) {\
182
+ if (value_is_null) {\
176
183
ZVAL_NULL(&zv); \
177
- } else { \
178
- ZVAL_LONG(&zv, value); \
184
+ } else { \
185
+ ZVAL_LONG(&zv, value); \
179
186
} \
180
187
URI_WITHER_COMMON(property_name, &zv, return_value); \
181
188
} while (0)
0 commit comments