@@ -59,6 +59,7 @@ PHPAPI ZEND_DECLARE_MODULE_GLOBALS(pcre)
59
59
#define PCRE_JIT_STACK_MAX_SIZE (192 * 1024)
60
60
ZEND_TLS pcre2_jit_stack * jit_stack = NULL ;
61
61
#endif
62
+ /* General context using (infallible) system allocator. */
62
63
ZEND_TLS pcre2_general_context * gctx = NULL ;
63
64
/* These two are global per thread for now. Though it is possible to use these
64
65
per pattern. Either one can copy it and use in pce, or one does no global
@@ -173,15 +174,24 @@ static void php_efree_pcre_cache(zval *data) /* {{{ */
173
174
/* }}} */
174
175
175
176
static void * php_pcre_malloc (PCRE2_SIZE size , void * data )
176
- {/*{{{*/
177
- void * p = pemalloc (size , 1 );
178
- return p ;
179
- }/*}}}*/
177
+ {
178
+ return pemalloc (size , 1 );
179
+ }
180
180
181
181
static void php_pcre_free (void * block , void * data )
182
- {/*{{{*/
182
+ {
183
183
pefree (block , 1 );
184
- }/*}}}*/
184
+ }
185
+
186
+ static void * php_pcre_emalloc (PCRE2_SIZE size , void * data )
187
+ {
188
+ return emalloc (size );
189
+ }
190
+
191
+ static void php_pcre_efree (void * block , void * data )
192
+ {
193
+ efree (block );
194
+ }
185
195
186
196
#define PHP_PCRE_PREALLOC_MDATA_SIZE 32
187
197
@@ -476,6 +486,11 @@ static PHP_RINIT_FUNCTION(pcre)
476
486
mdata_used = 0 ;
477
487
#endif
478
488
489
+ PCRE_G (gctx_zmm ) = pcre2_general_context_create (php_pcre_emalloc , php_pcre_efree , NULL );
490
+ if (!PCRE_G (gctx_zmm )) {
491
+ return FAILURE ;
492
+ }
493
+
479
494
if (PCRE_G (per_request_cache )) {
480
495
zend_hash_init (& PCRE_G (pcre_cache ), 0 , NULL , php_efree_pcre_cache , 0 );
481
496
}
@@ -486,6 +501,9 @@ static PHP_RINIT_FUNCTION(pcre)
486
501
487
502
static PHP_RSHUTDOWN_FUNCTION (pcre )
488
503
{
504
+ pcre2_general_context_free (PCRE_G (gctx_zmm ));
505
+ PCRE_G (gctx_zmm ) = NULL ;
506
+
489
507
if (PCRE_G (per_request_cache )) {
490
508
zend_hash_destroy (& PCRE_G (pcre_cache ));
491
509
}
@@ -1246,7 +1264,7 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, zend_string *subject_str,
1246
1264
if (!mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE ) {
1247
1265
match_data = mdata ;
1248
1266
} else {
1249
- match_data = pcre2_match_data_create_from_pattern (pce -> re , gctx );
1267
+ match_data = pcre2_match_data_create_from_pattern (pce -> re , PCRE_G ( gctx_zmm ) );
1250
1268
if (!match_data ) {
1251
1269
PCRE_G (error_code ) = PHP_PCRE_INTERNAL_ERROR ;
1252
1270
if (subpat_names ) {
@@ -1617,7 +1635,7 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, zend_string *su
1617
1635
if (!mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE ) {
1618
1636
match_data = mdata ;
1619
1637
} else {
1620
- match_data = pcre2_match_data_create_from_pattern (pce -> re , gctx );
1638
+ match_data = pcre2_match_data_create_from_pattern (pce -> re , PCRE_G ( gctx_zmm ) );
1621
1639
if (!match_data ) {
1622
1640
PCRE_G (error_code ) = PHP_PCRE_INTERNAL_ERROR ;
1623
1641
return NULL ;
@@ -1871,7 +1889,7 @@ static zend_string *php_pcre_replace_func_impl(pcre_cache_entry *pce, zend_strin
1871
1889
mdata_used = 1 ;
1872
1890
match_data = mdata ;
1873
1891
} else {
1874
- match_data = pcre2_match_data_create_from_pattern (pce -> re , gctx );
1892
+ match_data = pcre2_match_data_create_from_pattern (pce -> re , PCRE_G ( gctx_zmm ) );
1875
1893
if (!match_data ) {
1876
1894
PCRE_G (error_code ) = PHP_PCRE_INTERNAL_ERROR ;
1877
1895
if (subpat_names ) {
@@ -2519,7 +2537,7 @@ PHPAPI void php_pcre_split_impl(pcre_cache_entry *pce, zend_string *subject_str,
2519
2537
if (!mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE ) {
2520
2538
match_data = mdata ;
2521
2539
} else {
2522
- match_data = pcre2_match_data_create_from_pattern (pce -> re , gctx );
2540
+ match_data = pcre2_match_data_create_from_pattern (pce -> re , PCRE_G ( gctx_zmm ) );
2523
2541
if (!match_data ) {
2524
2542
PCRE_G (error_code ) = PHP_PCRE_INTERNAL_ERROR ;
2525
2543
zval_ptr_dtor (return_value );
@@ -2853,7 +2871,7 @@ PHPAPI void php_pcre_grep_impl(pcre_cache_entry *pce, zval *input, zval *return
2853
2871
if (!mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE ) {
2854
2872
match_data = mdata ;
2855
2873
} else {
2856
- match_data = pcre2_match_data_create_from_pattern (pce -> re , gctx );
2874
+ match_data = pcre2_match_data_create_from_pattern (pce -> re , PCRE_G ( gctx_zmm ) );
2857
2875
if (!match_data ) {
2858
2876
PCRE_G (error_code ) = PHP_PCRE_INTERNAL_ERROR ;
2859
2877
return ;
0 commit comments