Skip to content

Commit 4fbaddb

Browse files
committed
Refactoring ext/intl (incompleted)
1 parent f609d8c commit 4fbaddb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+968
-1076
lines changed

ext/intl/breakiterator/breakiterator_class.cpp

+31-50
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ static int BreakIterator_compare_objects(zval *object1,
8181
BreakIterator_object *bio1,
8282
*bio2;
8383

84-
bio1 = (BreakIterator_object*)zend_object_store_get_object(object1 TSRMLS_CC);
85-
bio2 = (BreakIterator_object*)zend_object_store_get_object(object2 TSRMLS_CC);
84+
bio1 = Z_INTL_BREAKITERATOR_P(object1);
85+
bio2 = Z_INTL_BREAKITERATOR_P(object2);
8686

8787
if (bio1->biter == NULL || bio2->biter == NULL) {
8888
return bio1->biter == bio2->biter ? 0 : 1;
@@ -93,41 +93,36 @@ static int BreakIterator_compare_objects(zval *object1,
9393
/* }}} */
9494

9595
/* {{{ clone handler for BreakIterator */
96-
static zend_object_value BreakIterator_clone_obj(zval *object TSRMLS_DC)
96+
static zend_object *BreakIterator_clone_obj(zval *object TSRMLS_DC)
9797
{
9898
BreakIterator_object *bio_orig,
9999
*bio_new;
100-
zend_object_value ret_val;
100+
zend_object *ret_val;
101101

102-
bio_orig = (BreakIterator_object*)zend_object_store_get_object(object TSRMLS_CC);
102+
bio_orig = Z_INTL_BREAKITERATOR_P(object);
103103
intl_errors_reset(INTL_DATA_ERROR_P(bio_orig) TSRMLS_CC);
104104

105105
ret_val = BreakIterator_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
106-
bio_new = (BreakIterator_object*)zend_object_store_get_object_by_handle(
107-
ret_val.handle TSRMLS_CC);
106+
bio_new = php_intl_breakiterator_fetch_object(ret_val);
108107

109-
zend_objects_clone_members(&bio_new->zo, ret_val,
110-
&bio_orig->zo, Z_OBJ_HANDLE_P(object) TSRMLS_CC);
108+
zend_objects_clone_members(&bio_new->zo, &bio_orig->zo TSRMLS_CC);
111109

112110
if (bio_orig->biter != NULL) {
113111
BreakIterator *new_biter;
114112

115113
new_biter = bio_orig->biter->clone();
116114
if (!new_biter) {
117-
char *err_msg;
115+
zend_string *err_msg;
118116
intl_errors_set_code(BREAKITER_ERROR_P(bio_orig),
119117
U_MEMORY_ALLOCATION_ERROR TSRMLS_CC);
120118
intl_errors_set_custom_msg(BREAKITER_ERROR_P(bio_orig),
121119
"Could not clone BreakIterator", 0 TSRMLS_CC);
122120
err_msg = intl_error_get_message(BREAKITER_ERROR_P(bio_orig) TSRMLS_CC);
123-
zend_throw_exception(NULL, err_msg, 0 TSRMLS_CC);
124-
efree(err_msg);
121+
zend_throw_exception(NULL, err_msg->val, 0 TSRMLS_CC);
122+
STR_FREE(err_msg);
125123
} else {
126124
bio_new->biter = new_biter;
127-
bio_new->text = bio_orig->text;
128-
if (bio_new->text) {
129-
zval_add_ref(&bio_new->text);
130-
}
125+
ZVAL_COPY(&bio_new->text, &bio_orig->text);
131126
}
132127
} else {
133128
zend_throw_exception(NULL, "Cannot clone unconstructed BreakIterator", 0 TSRMLS_CC);
@@ -148,23 +143,23 @@ static HashTable *BreakIterator_get_debug_info(zval *object, int *is_temp TSRMLS
148143

149144
array_init_size(&zv, 8);
150145

151-
bio = (BreakIterator_object*)zend_object_store_get_object(object TSRMLS_CC);
146+
bio = Z_INTL_BREAKITERATOR_P(object);
152147
biter = bio->biter;
153148

154149
if (biter == NULL) {
155-
add_assoc_bool_ex(&zv, "valid", sizeof("valid"), 0);
150+
add_assoc_bool_ex(&zv, "valid", sizeof("valid") - 1, 0);
156151
return Z_ARRVAL(zv);
157152
}
158-
add_assoc_bool_ex(&zv, "valid", sizeof("valid"), 1);
153+
add_assoc_bool_ex(&zv, "valid", sizeof("valid") - 1, 1);
159154

160-
if (bio->text == NULL) {
161-
add_assoc_null_ex(&zv, "text", sizeof("text"));
155+
if (Z_ISUNDEF(bio->text)) {
156+
add_assoc_null_ex(&zv, "text", sizeof("text") - 1);
162157
} else {
163-
zval_add_ref(&bio->text);
164-
add_assoc_zval_ex(&zv, "text", sizeof("text"), bio->text);
158+
Z_TRY_ADDREF(bio->text);
159+
add_assoc_zval_ex(&zv, "text", sizeof("text") - 1, &bio->text);
165160
}
166161

167-
add_assoc_string_ex(&zv, "type", sizeof("type"),
162+
add_assoc_string_ex(&zv, "type", sizeof("type") - 1,
168163
const_cast<char*>(typeid(*biter).name()));
169164

170165
return Z_ARRVAL(zv);
@@ -178,64 +173,47 @@ static void breakiterator_object_init(BreakIterator_object *bio TSRMLS_DC)
178173
{
179174
intl_error_init(BREAKITER_ERROR_P(bio) TSRMLS_CC);
180175
bio->biter = NULL;
181-
bio->text = NULL;
176+
ZVAL_UNDEF(&bio->text);
182177
}
183178
/* }}} */
184179

185180
/* {{{ BreakIterator_objects_dtor */
186-
static void BreakIterator_objects_dtor(void *object,
187-
zend_object_handle handle TSRMLS_DC)
181+
static void BreakIterator_objects_dtor(zend_object *object TSRMLS_DC)
188182
{
189-
zend_objects_destroy_object((zend_object*)object, handle TSRMLS_CC);
183+
zend_objects_destroy_object(object TSRMLS_CC);
190184
}
191185
/* }}} */
192186

193187
/* {{{ BreakIterator_objects_free */
194188
static void BreakIterator_objects_free(zend_object *object TSRMLS_DC)
195189
{
196-
BreakIterator_object* bio = (BreakIterator_object*) object;
190+
BreakIterator_object* bio = php_intl_breakiterator_fetch_object(object);
197191

198-
if (bio->text) {
199-
zval_ptr_dtor(&bio->text);
200-
}
192+
zval_ptr_dtor(&bio->text);
201193
if (bio->biter) {
202194
delete bio->biter;
203195
bio->biter = NULL;
204196
}
205197
intl_error_reset(BREAKITER_ERROR_P(bio) TSRMLS_CC);
206198

207199
zend_object_std_dtor(&bio->zo TSRMLS_CC);
208-
209-
efree(bio);
210200
}
211201
/* }}} */
212202

213203
/* {{{ BreakIterator_object_create */
214-
static zend_object_value BreakIterator_object_create(zend_class_entry *ce TSRMLS_DC)
204+
static zend_object *BreakIterator_object_create(zend_class_entry *ce TSRMLS_DC)
215205
{
216-
zend_object_value retval;
217206
BreakIterator_object* intern;
218207

219-
intern = (BreakIterator_object*)ecalloc(1, sizeof(BreakIterator_object));
208+
intern = (BreakIterator_object*)ecalloc(1, sizeof(BreakIterator_object) + sizeof(zval) * (ce->default_properties_count - 1));
220209

221210
zend_object_std_init(&intern->zo, ce TSRMLS_CC);
222-
#if PHP_VERSION_ID < 50399
223-
zend_hash_copy(intern->zo.properties, &(ce->default_properties),
224-
(copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval*));
225-
#else
226211
object_properties_init((zend_object*) intern, ce);
227-
#endif
228212
breakiterator_object_init(intern TSRMLS_CC);
229213

230-
retval.handle = zend_objects_store_put(
231-
intern,
232-
BreakIterator_objects_dtor,
233-
(zend_objects_free_object_storage_t) BreakIterator_objects_free,
234-
NULL TSRMLS_CC);
235-
236-
retval.handlers = &BreakIterator_handlers;
214+
intern->zo.handlers = &BreakIterator_handlers;
237215

238-
return retval;
216+
return &intern->zo;
239217
}
240218
/* }}} */
241219

@@ -343,9 +321,12 @@ U_CFUNC void breakiterator_register_BreakIterator_class(TSRMLS_D)
343321

344322
memcpy(&BreakIterator_handlers, zend_get_std_object_handlers(),
345323
sizeof BreakIterator_handlers);
324+
BreakIterator_handlers.offset = XtOffsetOf(BreakIterator_object, zo);
346325
BreakIterator_handlers.compare_objects = BreakIterator_compare_objects;
347326
BreakIterator_handlers.clone_obj = BreakIterator_clone_obj;
348327
BreakIterator_handlers.get_debug_info = BreakIterator_get_debug_info;
328+
BreakIterator_handlers.dtor_obj = BreakIterator_objects_dtor;
329+
BreakIterator_handlers.free_obj = BreakIterator_objects_free;
349330

350331
zend_class_implements(BreakIterator_ce_ptr TSRMLS_CC, 1,
351332
zend_ce_traversable);

ext/intl/breakiterator/breakiterator_class.h

+9-4
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,31 @@ typedef void BreakIterator;
2929
#endif
3030

3131
typedef struct {
32-
zend_object zo;
33-
3432
// error handling
3533
intl_error err;
3634

3735
// ICU break iterator
3836
BreakIterator* biter;
3937

4038
// current text
41-
zval *text;
39+
zval text;
40+
41+
zend_object zo;
4242
} BreakIterator_object;
4343

44+
static inline BreakIterator_object *php_intl_breakiterator_fetch_object(zend_object *obj) {
45+
return (BreakIterator_object *)((char*)(obj) - XtOffsetOf(BreakIterator_object, zo));
46+
}
47+
#define Z_INTL_BREAKITERATOR_P(zv) php_intl_breakiterator_fetch_object(Z_OBJ_P(zv))
48+
4449
#define BREAKITER_ERROR(bio) (bio)->err
4550
#define BREAKITER_ERROR_P(bio) &(BREAKITER_ERROR(bio))
4651

4752
#define BREAKITER_ERROR_CODE(bio) INTL_ERROR_CODE(BREAKITER_ERROR(bio))
4853
#define BREAKITER_ERROR_CODE_P(bio) &(INTL_ERROR_CODE(BREAKITER_ERROR(bio)))
4954

5055
#define BREAKITER_METHOD_INIT_VARS INTL_METHOD_INIT_VARS(BreakIterator, bio)
51-
#define BREAKITER_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(BreakIterator, bio)
56+
#define BREAKITER_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(INTL_BREAKITERATOR, bio)
5257
#define BREAKITER_METHOD_FETCH_OBJECT \
5358
BREAKITER_METHOD_FETCH_OBJECT_NO_CHECK; \
5459
if (bio->biter == NULL) \

0 commit comments

Comments
 (0)