@@ -39,8 +39,7 @@ static zend_object_handlers IntlPartsIterator_handlers;
39
39
inline BreakIterator *_breakiter_prolog (zend_object_iterator *iter TSRMLS_DC)
40
40
{
41
41
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 );
44
43
intl_errors_reset (BREAKITER_ERROR_P (bio) TSRMLS_CC);
45
44
if (bio->biter == NULL ) {
46
45
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)
52
51
53
52
static void _breakiterator_destroy_it (zend_object_iterator *iter TSRMLS_DC)
54
53
{
55
- zval_ptr_dtor ((zval**) &iter->data );
54
+ zval_ptr_dtor (&iter->data );
56
55
}
57
56
58
57
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)
68
67
69
68
int32_t pos = biter->next ();
70
69
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);
73
71
} // else we've reached the end of the enum, nothing more is required
74
72
}
75
73
@@ -79,8 +77,7 @@ static void _breakiterator_rewind(zend_object_iterator *iter TSRMLS_DC)
79
77
zoi_with_current *zoi_iter = (zoi_with_current*)iter;
80
78
81
79
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);
84
81
}
85
82
86
83
static zend_object_iterator_funcs breakiterator_iterator_funcs = {
@@ -103,7 +100,7 @@ U_CFUNC zend_object_iterator *_breakiterator_get_iterator(
103
100
return NULL ;
104
101
}
105
102
106
- bio = (BreakIterator_object*) zend_object_store_get_object ( object TSRMLS_CC );
103
+ bio = Z_INTL_BREAKITERATOR_P ( object);
107
104
BreakIterator *biter = bio->biter ;
108
105
109
106
if (biter == NULL ) {
@@ -112,16 +109,14 @@ U_CFUNC zend_object_iterator *_breakiterator_get_iterator(
112
109
return NULL ;
113
110
}
114
111
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);
118
115
zoi_iter->zoi .funcs = &breakiterator_iterator_funcs;
119
116
zoi_iter->zoi .index = 0 ;
120
117
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 );
125
120
126
121
return reinterpret_cast <zend_object_iterator *>(zoi_iter);
127
122
}
@@ -136,7 +131,7 @@ typedef struct zoi_break_iter_parts {
136
131
137
132
static void _breakiterator_parts_destroy_it (zend_object_iterator *iter TSRMLS_DC)
138
133
{
139
- zval_ptr_dtor (reinterpret_cast <zval**>( &iter->data ) );
134
+ zval_ptr_dtor (&iter->data );
140
135
}
141
136
142
137
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_
172
167
/* else zoi_bit->key_type == PARTS_ITERATOR_KEY_SEQUENTIAL
173
168
* No need to do anything, the engine increments ->index */
174
169
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;
179
173
180
174
if (next == BreakIterator::DONE) {
181
175
next = slen;
182
176
}
183
177
assert (next <= slen && next >= cur);
184
- len = next - cur;
185
- res = static_cast <char *>(emalloc (len + 1 ));
178
+ res = STR_ALLOC (next - cur, 0 );
186
179
187
- memcpy (res, &s[cur], len);
188
- res[ len] = ' \0 ' ;
180
+ memcpy (res-> val , &s[cur], res-> len );
181
+ res-> val [res-> len ] = ' \0 ' ;
189
182
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);
192
184
}
193
185
194
186
static void _breakiterator_parts_rewind (zend_object_iterator *iter TSRMLS_DC)
195
187
{
196
188
zoi_break_iter_parts *zoi_bit = (zoi_break_iter_parts*)iter;
197
189
BreakIterator_object *bio = zoi_bit->bio ;
198
190
199
- if (zoi_bit->zoi_cur .current ) {
191
+ if (! Z_ISUNDEF ( zoi_bit->zoi_cur .current ) ) {
200
192
iter->funcs ->invalidate_current (iter TSRMLS_CC);
201
193
}
202
194
@@ -221,72 +213,60 @@ void IntlIterator_from_BreakIterator_parts(zval *break_iter_zv,
221
213
{
222
214
IntlIterator_object *ii;
223
215
224
- zval_add_ref (&break_iter_zv);
225
-
226
216
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);
228
218
229
219
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);
231
222
ii->iterator ->funcs = &breakiterator_parts_it_funcs;
232
223
ii->iterator ->index = 0 ;
233
224
((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 ) ;
236
227
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);
239
229
assert (((zoi_break_iter_parts*)ii->iterator )->bio ->biter != NULL );
240
230
((zoi_break_iter_parts*)ii->iterator )->key_type = key_type;
241
231
}
242
232
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)
244
234
{
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;
249
237
250
238
return retval;
251
239
}
252
240
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)
255
242
{
256
- zend_literal local_literal = {0 };
257
243
zend_function *ret;
258
- ALLOCA_FLAG (use_heap)
244
+ zend_string *lc_method_name;
245
+ ALLOCA_FLAG (use_heap);
259
246
260
247
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);
268
252
}
269
253
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);
280
261
goto end;
281
262
}
282
263
}
283
264
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);
286
266
287
267
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);
290
270
}
291
271
292
272
return ret;
@@ -304,7 +284,7 @@ U_CFUNC PHP_METHOD(IntlPartsIterator, getBreakIterator)
304
284
305
285
INTLITERATOR_METHOD_FETCH_OBJECT;
306
286
307
- zval *biter_zval = static_cast <zval*>( ii->iterator ->data ) ;
287
+ zval *biter_zval = & ii->iterator ->data ;
308
288
RETURN_ZVAL (biter_zval, 1 , 0 );
309
289
}
310
290
0 commit comments