]> granicus.if.org Git - php/commitdiff
Enable PCRE JIT compiler
authorDmitry Stogov <dmitry@zend.com>
Fri, 25 Apr 2014 04:33:37 +0000 (08:33 +0400)
committerDmitry Stogov <dmitry@zend.com>
Fri, 25 Apr 2014 04:33:37 +0000 (08:33 +0400)
ext/pcre/php_pcre.c
ext/pcre/php_pcre.h
ext/standard/tests/general_functions/ini_get_all.phpt
sapi/cli/tests/006.phpt

index 60769f131405ee2007729554de5555758f20c6a6..983dd6d4fc9b7e28d7f3647a98959941cbe65085 100644 (file)
@@ -117,7 +117,10 @@ static PHP_GSHUTDOWN_FUNCTION(pcre) /* {{{ */
 
 PHP_INI_BEGIN()
        STD_PHP_INI_ENTRY("pcre.backtrack_limit", "1000000", PHP_INI_ALL, OnUpdateLong, backtrack_limit, zend_pcre_globals, pcre_globals)
-       STD_PHP_INI_ENTRY("pcre.recursion_limit", "100000", PHP_INI_ALL, OnUpdateLong, recursion_limit, zend_pcre_globals, pcre_globals)
+       STD_PHP_INI_ENTRY("pcre.recursion_limit", "100000",  PHP_INI_ALL, OnUpdateLong, recursion_limit, zend_pcre_globals, pcre_globals)
+#ifdef PCRE_STUDY_JIT_COMPILE
+       STD_PHP_INI_ENTRY("pcre.jit",             "1",       PHP_INI_ALL, OnUpdateBool, jit,             zend_pcre_globals, pcre_globals)
+#endif
 PHP_INI_END()
 
 
@@ -412,12 +415,22 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex TSRMLS
                return NULL;
        }
 
+#ifdef PCRE_STUDY_JIT_COMPILE
+       if (PCRE_G(jit)) {
+               /* Enable PCRE JIT compiler */
+               do_study = 1;
+               soptions |= PCRE_STUDY_JIT_COMPILE;
+       }
+#endif
+
        /* If study option was specified, study the pattern and
           store the result in extra for passing to pcre_exec. */
        if (do_study) {
                extra = pcre_study(re, soptions, &error);
                if (extra) {
                        extra->flags |= PCRE_EXTRA_MATCH_LIMIT | PCRE_EXTRA_MATCH_LIMIT_RECURSION;
+                       extra->match_limit = PCRE_G(backtrack_limit);
+                       extra->match_limit_recursion = PCRE_G(recursion_limit);
                }
                if (error != NULL) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while studying pattern");
index f352059e62e31f3db50f0b723e01b6b34e5ae86e..266f6760c64c321baf151377a4a1eb3a3b5e7404 100644 (file)
@@ -70,6 +70,9 @@ ZEND_BEGIN_MODULE_GLOBALS(pcre)
        HashTable pcre_cache;
        long backtrack_limit;
        long recursion_limit;
+#ifdef PCRE_STUDY_JIT_COMPILE
+       zend_bool jit;
+#endif
        int  error_code;
 ZEND_END_MODULE_GLOBALS(pcre)
 
index 60cd38a72391a3ab99716e599c1a5de31ac2f03b..806831edfc7e72ce55e4661b8e6c010391423b8a 100644 (file)
@@ -30,7 +30,7 @@ Warning: ini_get_all(): Unable to find extension 'nosuchextension' in %s on line
 bool(false)
 array(0) {
 }
-array(2) {
+array(3) {
   ["pcre.backtrack_limit"]=>
   array(3) {
     ["global_value"]=>
@@ -40,6 +40,15 @@ array(2) {
     ["access"]=>
     int(7)
   }
+  ["pcre.jit"]=>
+  array(3) {
+    ["global_value"]=>
+    string(1) "1"
+    ["local_value"]=>
+    string(1) "1"
+    ["access"]=>
+    int(7)
+  }
   ["pcre.recursion_limit"]=>
   array(3) {
     ["global_value"]=>
@@ -50,9 +59,11 @@ array(2) {
     int(7)
   }
 }
-array(2) {
+array(3) {
   ["pcre.backtrack_limit"]=>
   string(7) "1000000"
+  ["pcre.jit"]=>
+  string(1) "1"
   ["pcre.recursion_limit"]=>
   string(6) "100000"
 }
index 3d5c916e9c25efbeb26cbe9c5573e1f5f25602c9..e9e8b7e2193165a0cbe387d622de76f5ce97afaf 100644 (file)
@@ -34,6 +34,9 @@ string(%d) "Extension [ <persistent> extension #%d pcre version <no_version> ] {
     Entry [ pcre.recursion_limit <ALL> ]
       Current = '%d'
     }
+    Entry [ pcre.jit <ALL> ]
+      Current = '%d'
+    }
   }
 
   - Constants [14] {