Skip to content

Commit b6e9c76

Browse files
committed
Refactoring ext/intl (only compilerable now, far to finish :<)
1 parent 7614fe8 commit b6e9c76

21 files changed

+126
-152
lines changed

ext/intl/breakiterator/breakiterator_class.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ static zend_object *BreakIterator_clone_obj(zval *object TSRMLS_DC)
135135
/* {{{ get_debug_info handler for BreakIterator */
136136
static HashTable *BreakIterator_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
137137
{
138-
zval zv = zval_used_for_init;
138+
zval zv;
139139
BreakIterator_object *bio;
140140
const BreakIterator *biter;
141141

ext/intl/breakiterator/breakiterator_iterators.cpp

+46-66
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ static zend_object_handlers IntlPartsIterator_handlers;
3939
inline BreakIterator *_breakiter_prolog(zend_object_iterator *iter TSRMLS_DC)
4040
{
4141
BreakIterator_object *bio;
42-
bio = (BreakIterator_object*)zend_object_store_get_object(
43-
(const zval*)iter->data TSRMLS_CC);
42+
bio = Z_INTL_BREAKITERATOR_P(&iter->data);
4443
intl_errors_reset(BREAKITER_ERROR_P(bio) TSRMLS_CC);
4544
if (bio->biter == NULL) {
4645
intl_errors_set(BREAKITER_ERROR_P(bio), U_INVALID_STATE_ERROR,
@@ -52,7 +51,7 @@ inline BreakIterator *_breakiter_prolog(zend_object_iterator *iter TSRMLS_DC)
5251

5352
static void _breakiterator_destroy_it(zend_object_iterator *iter TSRMLS_DC)
5453
{
55-
zval_ptr_dtor((zval**)&iter->data);
54+
zval_ptr_dtor(&iter->data);
5655
}
5756

5857
static void _breakiterator_move_forward(zend_object_iterator *iter TSRMLS_DC)
@@ -68,8 +67,7 @@ static void _breakiterator_move_forward(zend_object_iterator *iter TSRMLS_DC)
6867

6968
int32_t pos = biter->next();
7069
if (pos != BreakIterator::DONE) {
71-
MAKE_STD_ZVAL(zoi_iter->current);
72-
ZVAL_LONG(zoi_iter->current, (long)pos);
70+
ZVAL_LONG(&zoi_iter->current, (long)pos);
7371
} //else we've reached the end of the enum, nothing more is required
7472
}
7573

@@ -79,8 +77,7 @@ static void _breakiterator_rewind(zend_object_iterator *iter TSRMLS_DC)
7977
zoi_with_current *zoi_iter = (zoi_with_current*)iter;
8078

8179
int32_t pos = biter->first();
82-
MAKE_STD_ZVAL(zoi_iter->current);
83-
ZVAL_LONG(zoi_iter->current, (long)pos);
80+
ZVAL_LONG(&zoi_iter->current, (long)pos);
8481
}
8582

8683
static zend_object_iterator_funcs breakiterator_iterator_funcs = {
@@ -103,7 +100,7 @@ U_CFUNC zend_object_iterator *_breakiterator_get_iterator(
103100
return NULL;
104101
}
105102

106-
bio = (BreakIterator_object*)zend_object_store_get_object(object TSRMLS_CC);
103+
bio = Z_INTL_BREAKITERATOR_P(object);
107104
BreakIterator *biter = bio->biter;
108105

109106
if (biter == NULL) {
@@ -112,16 +109,14 @@ U_CFUNC zend_object_iterator *_breakiterator_get_iterator(
112109
return NULL;
113110
}
114111

115-
zoi_with_current *zoi_iter =
116-
static_cast<zoi_with_current*>(emalloc(sizeof *zoi_iter));
117-
zoi_iter->zoi.data = static_cast<void*>(object);
112+
zoi_with_current *zoi_iter = static_cast<zoi_with_current*>(emalloc(sizeof *zoi_iter));
113+
zend_iterator_init(&zoi_iter->zoi TSRMLS_CC);
114+
ZVAL_COPY(&zoi_iter->zoi.data, object);
118115
zoi_iter->zoi.funcs = &breakiterator_iterator_funcs;
119116
zoi_iter->zoi.index = 0;
120117
zoi_iter->destroy_it = _breakiterator_destroy_it;
121-
zoi_iter->wrapping_obj = NULL; /* not used; object is in zoi.data */
122-
zoi_iter->current = NULL;
123-
124-
zval_add_ref(&object);
118+
ZVAL_UNDEF(&zoi_iter->wrapping_obj); /* not used; object is in zoi.data */
119+
ZVAL_UNDEF(&zoi_iter->current);
125120

126121
return reinterpret_cast<zend_object_iterator *>(zoi_iter);
127122
}
@@ -136,7 +131,7 @@ typedef struct zoi_break_iter_parts {
136131

137132
static void _breakiterator_parts_destroy_it(zend_object_iterator *iter TSRMLS_DC)
138133
{
139-
zval_ptr_dtor(reinterpret_cast<zval**>(&iter->data));
134+
zval_ptr_dtor(&iter->data);
140135
}
141136

142137
static void _breakiterator_parts_get_current_key(zend_object_iterator *iter, zval *key TSRMLS_DC)
@@ -172,31 +167,28 @@ static void _breakiterator_parts_move_forward(zend_object_iterator *iter TSRMLS_
172167
/* else zoi_bit->key_type == PARTS_ITERATOR_KEY_SEQUENTIAL
173168
* No need to do anything, the engine increments ->index */
174169

175-
const char *s = Z_STRVAL_P(bio->text);
176-
int32_t slen = Z_STRLEN_P(bio->text),
177-
len;
178-
char *res;
170+
const char *s = Z_STRVAL(bio->text);
171+
int32_t slen = Z_STRLEN(bio->text);
172+
zend_string *res;
179173

180174
if (next == BreakIterator::DONE) {
181175
next = slen;
182176
}
183177
assert(next <= slen && next >= cur);
184-
len = next - cur;
185-
res = static_cast<char*>(emalloc(len + 1));
178+
res = STR_ALLOC(next - cur, 0);
186179

187-
memcpy(res, &s[cur], len);
188-
res[len] = '\0';
180+
memcpy(res->val, &s[cur], res->len);
181+
res->val[res->len] = '\0';
189182

190-
MAKE_STD_ZVAL(zoi_bit->zoi_cur.current);
191-
ZVAL_STRINGL(zoi_bit->zoi_cur.current, res, len, 0);
183+
ZVAL_STR(&zoi_bit->zoi_cur.current, res);
192184
}
193185

194186
static void _breakiterator_parts_rewind(zend_object_iterator *iter TSRMLS_DC)
195187
{
196188
zoi_break_iter_parts *zoi_bit = (zoi_break_iter_parts*)iter;
197189
BreakIterator_object *bio = zoi_bit->bio;
198190

199-
if (zoi_bit->zoi_cur.current) {
191+
if (!Z_ISUNDEF(zoi_bit->zoi_cur.current)) {
200192
iter->funcs->invalidate_current(iter TSRMLS_CC);
201193
}
202194

@@ -221,72 +213,60 @@ void IntlIterator_from_BreakIterator_parts(zval *break_iter_zv,
221213
{
222214
IntlIterator_object *ii;
223215

224-
zval_add_ref(&break_iter_zv);
225-
226216
object_init_ex(object, IntlPartsIterator_ce_ptr);
227-
ii = (IntlIterator_object*)zend_object_store_get_object(object TSRMLS_CC);
217+
ii = Z_INTL_ITERATOR_P(object);
228218

229219
ii->iterator = (zend_object_iterator*)emalloc(sizeof(zoi_break_iter_parts));
230-
ii->iterator->data = break_iter_zv;
220+
zend_iterator_init(ii->iterator TSRMLS_CC);
221+
ZVAL_COPY(&ii->iterator->data, break_iter_zv);
231222
ii->iterator->funcs = &breakiterator_parts_it_funcs;
232223
ii->iterator->index = 0;
233224
((zoi_with_current*)ii->iterator)->destroy_it = _breakiterator_parts_destroy_it;
234-
((zoi_with_current*)ii->iterator)->wrapping_obj = object;
235-
((zoi_with_current*)ii->iterator)->current = NULL;
225+
ZVAL_COPY_VALUE(&((zoi_with_current*)ii->iterator)->wrapping_obj, object);
226+
ZVAL_UNDEF(&((zoi_with_current*)ii->iterator)->current);
236227

237-
((zoi_break_iter_parts*)ii->iterator)->bio = (BreakIterator_object*)
238-
zend_object_store_get_object(break_iter_zv TSRMLS_CC);
228+
((zoi_break_iter_parts*)ii->iterator)->bio = Z_INTL_BREAKITERATOR_P(break_iter_zv);
239229
assert(((zoi_break_iter_parts*)ii->iterator)->bio->biter != NULL);
240230
((zoi_break_iter_parts*)ii->iterator)->key_type = key_type;
241231
}
242232

243-
U_CFUNC zend_object_value IntlPartsIterator_object_create(zend_class_entry *ce TSRMLS_DC)
233+
U_CFUNC zend_object *IntlPartsIterator_object_create(zend_class_entry *ce TSRMLS_DC)
244234
{
245-
zend_object_value retval;
246-
247-
retval = IntlIterator_ce_ptr->create_object(ce TSRMLS_CC);
248-
retval.handlers = &IntlPartsIterator_handlers;
235+
zend_object* retval = IntlIterator_ce_ptr->create_object(ce TSRMLS_CC);
236+
retval->handlers = &IntlPartsIterator_handlers;
249237

250238
return retval;
251239
}
252240

253-
U_CFUNC zend_function *IntlPartsIterator_get_method(zval **object_ptr,
254-
char *method, int method_len, const zend_literal *key TSRMLS_DC)
241+
U_CFUNC zend_function *IntlPartsIterator_get_method(zend_object **object_ptr, zend_string *method, const zval *key TSRMLS_DC)
255242
{
256-
zend_literal local_literal = {0};
257243
zend_function *ret;
258-
ALLOCA_FLAG(use_heap)
244+
zend_string *lc_method_name;
245+
ALLOCA_FLAG(use_heap);
259246

260247
if (key == NULL) {
261-
Z_STRVAL(local_literal.constant) = static_cast<char*>(
262-
do_alloca(method_len + 1, use_heap));
263-
zend_str_tolower_copy(Z_STRVAL(local_literal.constant),
264-
method, method_len);
265-
local_literal.hash_value = zend_hash_func(
266-
Z_STRVAL(local_literal.constant), method_len + 1);
267-
key = &local_literal;
248+
STR_ALLOCA_ALLOC(lc_method_name, method->len, use_heap);
249+
zend_str_tolower_copy(lc_method_name->val, method->val, method->len);
250+
} else {
251+
lc_method_name = Z_STR_P(key);
268252
}
269253

270-
if ((key->hash_value & 0xFFFFFFFF) == 0xA2B486A1 /* hash of getrulestatus\0 */
271-
&& method_len == sizeof("getrulestatus") - 1
272-
&& memcmp("getrulestatus", Z_STRVAL(key->constant), method_len) == 0) {
273-
IntlIterator_object *obj = (IntlIterator_object*)
274-
zend_object_store_get_object(*object_ptr TSRMLS_CC);
275-
if (obj->iterator && obj->iterator->data) {
276-
zval *break_iter_zv = static_cast<zval*>(obj->iterator->data);
277-
*object_ptr = break_iter_zv;
278-
ret = Z_OBJ_HANDLER_P(break_iter_zv, get_method)(object_ptr,
279-
method, method_len, key TSRMLS_CC);
254+
if (method->len == sizeof("getrulestatus") - 1
255+
&& memcmp("getrulestatus", Z_STRVAL_P(key), method->len) == 0) {
256+
IntlIterator_object *obj = php_intl_iterator_fetch_object(*object_ptr);
257+
if (obj->iterator && !Z_ISUNDEF(obj->iterator->data)) {
258+
zval *break_iter_zv = &obj->iterator->data;
259+
*object_ptr = Z_OBJ_P(break_iter_zv);
260+
ret = Z_OBJ_HANDLER_P(break_iter_zv, get_method)(object_ptr, method, key TSRMLS_CC);
280261
goto end;
281262
}
282263
}
283264

284-
ret = std_object_handlers.get_method(object_ptr,
285-
method, method_len, key TSRMLS_CC);
265+
ret = std_object_handlers.get_method(object_ptr, method, key TSRMLS_CC);
286266

287267
end:
288-
if (key == &local_literal) {
289-
free_alloca(Z_STRVAL(local_literal.constant), use_heap);
268+
if (key == NULL) {
269+
STR_ALLOCA_FREE(lc_method_name, use_heap);
290270
}
291271

292272
return ret;
@@ -304,7 +284,7 @@ U_CFUNC PHP_METHOD(IntlPartsIterator, getBreakIterator)
304284

305285
INTLITERATOR_METHOD_FETCH_OBJECT;
306286

307-
zval *biter_zval = static_cast<zval*>(ii->iterator->data);
287+
zval *biter_zval = &ii->iterator->data;
308288
RETURN_ZVAL(biter_zval, 1, 0);
309289
}
310290

ext/intl/breakiterator/breakiterator_methods.cpp

+14-17
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ U_CFUNC PHP_FUNCTION(breakiter_get_text)
139139

140140
BREAKITER_METHOD_FETCH_OBJECT;
141141

142-
if (bio->text == NULL) {
142+
if (Z_ISUNDEF(bio->text)) {
143143
RETURN_NULL();
144144
} else {
145-
RETURN_ZVAL(bio->text, 1, 0);
145+
ZVAL_COPY(return_value, &bio->text);
146146
}
147147
}
148148

@@ -151,7 +151,7 @@ U_CFUNC PHP_FUNCTION(breakiter_set_text)
151151
char *text;
152152
int text_len;
153153
UText *ut = NULL;
154-
zval **textzv;
154+
zval *textzv;
155155
BREAKITER_METHOD_INIT_VARS;
156156
object = getThis();
157157

@@ -169,7 +169,7 @@ U_CFUNC PHP_FUNCTION(breakiter_set_text)
169169

170170
/* assert it's safe to use text and text_len because zpp changes the
171171
* arguments in the stack */
172-
assert(text == Z_STRVAL_PP(textzv));
172+
assert(text == Z_STRVAL_P(textzv));
173173

174174
ut = utext_openUTF8(ut, text, text_len, BREAKITER_ERROR_CODE_P(bio));
175175
INTL_CTOR_CHECK_STATUS(bio, "breakiter_set_text: error opening UText");
@@ -182,11 +182,8 @@ U_CFUNC PHP_FUNCTION(breakiter_set_text)
182182
/* When ICU clones the UText, it does not copy the buffer, so we have to
183183
* keep the string buffer around by holding a reference to its zval. This
184184
* also allows a faste implementation of getText() */
185-
if (bio->text != NULL) {
186-
zval_ptr_dtor(&bio->text);
187-
}
188-
bio->text = *textzv;
189-
zval_add_ref(&bio->text);
185+
zval_ptr_dtor(&bio->text);
186+
ZVAL_COPY(&bio->text, textzv);
190187

191188
RETURN_TRUE;
192189
}
@@ -274,12 +271,12 @@ U_CFUNC PHP_FUNCTION(breakiter_next)
274271
if (ZEND_NUM_ARGS() == 0) {
275272
no_arg_version = true;
276273
} else if (ZEND_NUM_ARGS() == 1) {
277-
zval **arg;
274+
zval *arg;
278275
int res = zend_get_parameters_ex(1, &arg);
279276
assert(res == SUCCESS);
280-
if (Z_TYPE_PP(arg) == IS_NULL) {
277+
if (Z_TYPE_P(arg) == IS_NULL) {
281278
no_arg_version = true;
282-
ht = 0; /* pretend we don't have any argument */
279+
ZEND_NUM_ARGS() = 0; /* pretend we don't have any argument */
283280
} else {
284281
no_arg_version = false;
285282
}
@@ -380,7 +377,7 @@ U_CFUNC PHP_FUNCTION(breakiter_get_locale)
380377
INTL_METHOD_CHECK_STATUS(bio,
381378
"breakiter_get_locale: Call to ICU method has failed");
382379

383-
RETURN_STRING(locale.getName(), 1);
380+
RETURN_STRING(locale.getName());
384381
}
385382

386383
U_CFUNC PHP_FUNCTION(breakiter_get_parts_iterator)
@@ -421,7 +418,7 @@ U_CFUNC PHP_FUNCTION(breakiter_get_error_code)
421418
}
422419

423420
/* Fetch the object (without resetting its last error code ). */
424-
bio = (BreakIterator_object*)zend_object_store_get_object(object TSRMLS_CC);
421+
bio = Z_INTL_BREAKITERATOR_P(object);
425422
if (bio == NULL)
426423
RETURN_FALSE;
427424

@@ -430,7 +427,7 @@ U_CFUNC PHP_FUNCTION(breakiter_get_error_code)
430427

431428
U_CFUNC PHP_FUNCTION(breakiter_get_error_message)
432429
{
433-
const char* message = NULL;
430+
zend_string* message = NULL;
434431
BREAKITER_METHOD_INIT_VARS;
435432
object = getThis();
436433

@@ -442,11 +439,11 @@ U_CFUNC PHP_FUNCTION(breakiter_get_error_message)
442439

443440

444441
/* Fetch the object (without resetting its last error code ). */
445-
bio = (BreakIterator_object*)zend_object_store_get_object(object TSRMLS_CC);
442+
bio = Z_INTL_BREAKITERATOR_P(object);
446443
if (bio == NULL)
447444
RETURN_FALSE;
448445

449446
/* Return last error message. */
450447
message = intl_error_get_message(BREAKITER_ERROR_P(bio) TSRMLS_CC);
451-
RETURN_STRING(message, 0);
448+
RETURN_STR(message);
452449
}

ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp

+8-5
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ static void _php_intlrbbi_constructor_body(INTERNAL_FUNCTION_PARAMETERS)
6666
smart_str parse_error_str;
6767
parse_error_str = intl_parse_error_to_string(&parseError);
6868
spprintf(&msg, 0, "rbbi_create_instance: unable to create "
69-
"RuleBasedBreakIterator from rules (%s)", parse_error_str.c);
69+
"RuleBasedBreakIterator from rules (%s)", parse_error_str.s? parse_error_str.s->val : "");
7070
smart_str_free(&parse_error_str);
7171
intl_error_set_custom_msg(NULL, msg, 1 TSRMLS_CC);
7272
efree(msg);
@@ -101,7 +101,7 @@ U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, __construct)
101101
_php_intlrbbi_constructor_body(INTERNAL_FUNCTION_PARAM_PASSTHRU);
102102

103103
if (Z_TYPE_P(return_value) == IS_NULL) {
104-
zend_object_store_ctor_failed(&orig_this TSRMLS_CC);
104+
zend_object_store_ctor_failed(Z_OBJ(orig_this) TSRMLS_CC);
105105
zval_dtor(&orig_this);
106106
}
107107
}
@@ -119,17 +119,20 @@ U_CFUNC PHP_FUNCTION(rbbi_get_rules)
119119

120120
BREAKITER_METHOD_FETCH_OBJECT;
121121

122+
char *str;
123+
int str_len;
122124
const UnicodeString rules = fetch_rbbi(bio)->getRules();
123125

124-
Z_TYPE_P(return_value) = IS_STRING;
125-
if (intl_charFromString(rules, &Z_STRVAL_P(return_value),
126-
&Z_STRLEN_P(return_value), BREAKITER_ERROR_CODE_P(bio)) == FAILURE)
126+
if (intl_charFromString(rules, &str, &str_len, BREAKITER_ERROR_CODE_P(bio)) == FAILURE)
127127
{
128128
intl_errors_set(BREAKITER_ERROR_P(bio), BREAKITER_ERROR_CODE(bio),
129129
"rbbi_hash_code: Error converting result to UTF-8 string",
130130
0 TSRMLS_CC);
131131
RETURN_FALSE;
132132
}
133+
RETVAL_STRINGL(str, str_len);
134+
//???
135+
efree(str);
133136
}
134137

135138
U_CFUNC PHP_FUNCTION(rbbi_get_rule_status)

ext/intl/calendar/calendar_class.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ static const struct {
146146
/* {{{ get_debug_info handler for Calendar */
147147
static HashTable *Calendar_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
148148
{
149-
zval zv = zval_used_for_init,
149+
zval zv,
150150
zfields;
151151
Calendar_object *co;
152152
const Calendar *cal;
@@ -169,7 +169,7 @@ static HashTable *Calendar_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
169169
const_cast<char*>(cal->getType()));
170170

171171
{
172-
zval ztz = zval_used_for_init,
172+
zval ztz,
173173
ztz_debug;
174174
int is_tmp;
175175
HashTable *debug_info;

0 commit comments

Comments
 (0)