@@ -2045,8 +2045,10 @@ SPL_METHOD(RegexIterator, accept)
2045
2045
2046
2046
if (intern -> current .data == NULL ) {
2047
2047
RETURN_FALSE ;
2048
+ } else if (Z_TYPE_P (intern -> current .data ) == IS_ARRAY ) {
2049
+ RETURN_FALSE ;
2048
2050
}
2049
-
2051
+
2050
2052
if (intern -> u .regex .flags & REGIT_USE_KEY ) {
2051
2053
subject_ptr = intern -> current .key ;
2052
2054
} else {
@@ -2080,8 +2082,7 @@ SPL_METHOD(RegexIterator, accept)
2080
2082
ALLOC_INIT_ZVAL (intern -> current .data );
2081
2083
php_pcre_match_impl (intern -> u .regex .pce , subject , subject_len , & zcount ,
2082
2084
intern -> current .data , intern -> u .regex .mode == REGIT_MODE_ALL_MATCHES , intern -> u .regex .use_flags , intern -> u .regex .preg_flags , 0 TSRMLS_CC );
2083
- count = zend_hash_num_elements (Z_ARRVAL_P (intern -> current .data ));
2084
- RETVAL_BOOL (count > 0 );
2085
+ RETVAL_BOOL (Z_LVAL (zcount ) > 0 );
2085
2086
break ;
2086
2087
2087
2088
case REGIT_MODE_SPLIT :
@@ -2259,7 +2260,7 @@ SPL_METHOD(RecursiveRegexIterator, __construct)
2259
2260
SPL_METHOD (RecursiveRegexIterator , getChildren )
2260
2261
{
2261
2262
spl_dual_it_object * intern ;
2262
- zval * retval , * regex ;
2263
+ zval * retval ;
2263
2264
2264
2265
if (zend_parse_parameters_none () == FAILURE ) {
2265
2266
return ;
@@ -2269,16 +2270,61 @@ SPL_METHOD(RecursiveRegexIterator, getChildren)
2269
2270
2270
2271
zend_call_method_with_0_params (& intern -> inner .zobject , intern -> inner .ce , NULL , "getchildren" , & retval );
2271
2272
if (!EG (exception )) {
2273
+ zval * * args [5 ], * object , * regex , * mode , * flags , * preg_flags ;
2274
+
2275
+ MAKE_STD_ZVAL (object );
2272
2276
MAKE_STD_ZVAL (regex );
2277
+ MAKE_STD_ZVAL (mode );
2278
+ MAKE_STD_ZVAL (flags );
2279
+ MAKE_STD_ZVAL (preg_flags );
2280
+
2281
+ MAKE_COPY_ZVAL (& retval , object );
2273
2282
ZVAL_STRING (regex , intern -> u .regex .regex , 1 );
2274
- spl_instantiate_arg_ex2 (Z_OBJCE_P (getThis ()), & return_value , 0 , retval , regex TSRMLS_CC );
2283
+ ZVAL_LONG (mode , intern -> u .regex .mode );
2284
+ ZVAL_LONG (flags , intern -> u .regex .flags );
2285
+ ZVAL_LONG (preg_flags , intern -> u .regex .preg_flags );
2286
+
2287
+ args [0 ] = & object ;
2288
+ args [1 ] = & regex ;
2289
+ args [2 ] = & mode ;
2290
+ args [3 ] = & flags ;
2291
+ args [4 ] = & preg_flags ;
2292
+
2293
+ spl_instantiate_arg_n (Z_OBJCE_P (getThis ()), & return_value , 5 , args TSRMLS_CC );
2294
+
2295
+ zval_ptr_dtor (& object );
2275
2296
zval_ptr_dtor (& regex );
2297
+ zval_ptr_dtor (& mode );
2298
+ zval_ptr_dtor (& flags );
2299
+ zval_ptr_dtor (& preg_flags );
2276
2300
}
2277
2301
if (retval ) {
2278
2302
zval_ptr_dtor (& retval );
2279
2303
}
2280
2304
} /* }}} */
2281
2305
2306
+ SPL_METHOD (RecursiveRegexIterator , accept )
2307
+ {
2308
+ spl_dual_it_object * intern ;
2309
+ zval * rv ;
2310
+
2311
+ if (zend_parse_parameters_none () == FAILURE ) {
2312
+ return ;
2313
+ }
2314
+
2315
+ SPL_FETCH_AND_CHECK_DUAL_IT (intern , getThis ());
2316
+
2317
+ if (intern -> current .data == NULL ) {
2318
+ RETURN_FALSE ;
2319
+ } else if (Z_TYPE_P (intern -> current .data ) == IS_ARRAY ) {
2320
+ RETURN_BOOL (zend_hash_num_elements (Z_ARRVAL_P (intern -> current .data )) > 0 );
2321
+ }
2322
+
2323
+ zend_call_method_with_0_params (& (getThis ()), spl_ce_RegexIterator , NULL , "accept" , & rv );
2324
+
2325
+ RETURN_ZVAL (rv , 1 , 1 );
2326
+ }
2327
+
2282
2328
#endif
2283
2329
2284
2330
/* {{{ spl_dual_it_dtor */
@@ -2469,6 +2515,7 @@ ZEND_END_ARG_INFO();
2469
2515
2470
2516
static const zend_function_entry spl_funcs_RecursiveRegexIterator [] = {
2471
2517
SPL_ME (RecursiveRegexIterator , __construct , arginfo_rec_regex_it___construct , ZEND_ACC_PUBLIC )
2518
+ SPL_ME (RecursiveRegexIterator , accept , arginfo_recursive_it_void , ZEND_ACC_PUBLIC )
2472
2519
SPL_ME (RecursiveFilterIterator , hasChildren , arginfo_recursive_it_void , ZEND_ACC_PUBLIC )
2473
2520
SPL_ME (RecursiveRegexIterator , getChildren , arginfo_recursive_it_void , ZEND_ACC_PUBLIC )
2474
2521
PHP_FE_END
0 commit comments