Changeset 111509 in spip-zone


Ignore:
Timestamp:
Sep 6, 2018, 8:26:03 AM (8 months ago)
Author:
root
Message:

create_function est deprecie en PHP 7.2, on reecrit donc l'optimisation des subwheels via une fonction anonyme de type Closure
Cela a pas mal d'impact sur la fonction compile() qu'on revise en consequence, meme si elle ne sert pas en vrai

Il reste le cas de la rule de type create_function qu'on ne peut pas traiter autrement, mais qui du coup devient depreciee aussi et disparaitra prochainement
(Elle n'est toutefois utilisee nulle part sur la zone)

Location:
_core_/plugins/textwheel
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _core_/plugins/textwheel/engine/textwheel.php

    r93657 r111509  
    2929        protected static $subwheel = array();
    3030
     31        // Experimental : projet de compilation PHP d'une wheel
     32        // pour generation d'un fichier php execute a la place de ->text()
    3133        protected $compiled = array();
    3234
     
    8486                        $rule->name = $name;
    8587                        $this->initRule($rule);
    86                         if (is_string($rule->replace)
    87                                 and isset($this->compiled[$rule->replace])
    88                                 and $fun = $this->compiled[$rule->replace]
     88                        if ($rule->replace
     89                                and $compiledEntry = $this->ruleCompiledEntryName($rule->replace)
     90                                and isset($this->compiled[$compiledEntry])
     91                                and $fun = $this->compiled[$compiledEntry]
    8992                        ) {
    9093                                $pre[] = "\n###\n## $name\n###\n" . $fun;
    9194                                preg_match(',function (\w+), ', $fun, $r);
    92                                 $rule->compilereplace = $r[1]; # ne pas modifier ->replace sinon on casse l'execution...
     95                                $rule->compilereplace = "'".$r[1]."'"; # ne pas modifier ->replace sinon on casse l'execution...
    9396                        }
    9497
     
    110113                        if ($rule->func_replace !== 'replace_identity') {
    111114                                $fun = 'TextWheel::' . $rule->func_replace;
     115                                $call = '';
    112116                                switch ($fun) {
    113117                                        case 'TextWheel::replace_all_cb':
    114                                                 $fun = $rule->replace; # trim()...
     118                                                if (is_string($rule->replace)) {
     119                                                        $fun = $rule->replace;
     120                                                }
     121                                                elseif ($rule->compilereplace) {
     122                                                        $fun = trim($rule->compilereplace, "'");
     123                                                };
     124                                                if ($fun) {
     125                                                        $call = "\$t = $fun(\$t);";
     126                                                }
    115127                                                break;
    116128                                        case 'TextWheel::replace_preg':
     
    126138                                                break;
    127139                                }
    128                                 $r .= "\t" . '$t = ' . $fun . '(' . TextWheel::export($rule->match) . ', ' . TextWheel::export($rule->replace) . ', $t);' . "\n";
     140                                if (!$call) {
     141                                        if (empty($rule->compilereplace)) {
     142                                                $rule->compilereplace = TextWheel::export($rule->replace);
     143                                        }
     144                                        $call = '$t = ' . $fun . '(' . TextWheel::export($rule->match) . ', ' . $rule->compilereplace . ', $t);';
     145                                }
     146                                $r .= "\t$call\n";
    129147                        }
    130148
     
    160178
    161179                return $tw;
     180        }
     181
     182        /**
     183         * @param $replace
     184         * @return string
     185         */
     186        protected function ruleCompiledEntryName($replace) {
     187                if (is_array($replace)) {
     188                        return serialize($replace);
     189                }
     190                elseif (is_object($replace)) {
     191                        return get_class($replace) . ':' . spl_object_hash($replace);
     192                }
     193                return $replace;
    162194        }
    163195
     
    184216
    185217                if ($rule->create_replace) {
     218                        // DEPRECATED : rule->create_replace, on ne peut rien faire de mieux ici
     219                        // mais c'est voue a disparaitre
    186220                        $compile = $rule->replace . '($t)';
    187221                        $rule->replace = create_function('$m', $rule->replace);
    188                         $this->compiled[$rule->replace] = $compile;
     222                        $this->compiled[$this->ruleCompiledEntryName($rule->replace)] = $compile;
    189223                        $rule->create_replace = false;
    190224                        $rule->is_callback = true;
    191                 } elseif ($rule->is_wheel) {
    192                         $n = count(TextWheel::$subwheel);
     225                }
     226                elseif ($rule->is_wheel) {
     227                        $rule_number = count(TextWheel::$subwheel);
    193228                        TextWheel::$subwheel[] = $this->createSubWheel($rule->replace);
    194                         $var = '$m[' . intval($rule->pick_match) . ']';
     229                        $cname = 'compiled_' . str_replace('-', '_', $rule->name) . '_' . substr(md5(spl_object_hash($rule)),0,7);
    195230                        if ($rule->type == 'all' or $rule->type == 'str' or $rule->type == 'split' or !isset($rule->match)) {
    196                                 $var = '$m';
    197                         }
    198                         $code = 'return TextWheel::getSubWheel(' . $n . ')->text(' . $var . ');';
    199                         $rule->replace = create_function('$m', $code);
    200                         $cname = 'compiled_' . str_replace('-', '_', $rule->name);
    201                         $compile = TextWheel::getSubWheel($n)->compile($cname);
    202                         $this->compiled[$rule->replace] = $compile;
     231                                $rule->replace = function ($m) use ($rule_number) {
     232                                        return TextWheel::getSubWheel($rule_number)->text($m);
     233                                };
     234                                $rule->compilereplace = "'$cname'";
     235                        }
     236                        else {
     237                                $pick_match = intval($rule->pick_match);
     238                                $rule->replace = function ($m) use ($rule_number, $pick_match) {
     239                                        return TextWheel::getSubWheel($rule_number)->text($m[$pick_match]);
     240                                };
     241                                $rule->compilereplace = 'function ($m) { return '.$cname.'($m['.$pick_match.']) }';
     242                        }
    203243                        $rule->is_wheel = false;
    204244                        $rule->is_callback = true;
     245                        $compile = TextWheel::getSubWheel($rule_number)->compile($cname);
     246                        $this->compiled[$this->ruleCompiledEntryName($rule->replace)] = $compile;
    205247                }
    206248
  • _core_/plugins/textwheel/engine/textwheelrule.php

    r93657 r111509  
    6666        # language specific
    6767        public $require; # file to require_once
     68        # DEPRECATED : create_function deprecated a partir de PHP 7.2, ne plus utiliser
    6869        public $create_replace; # do create_function('$m', %) on $this->replace, $m is the matched array
    6970
    7071        # optimizations
    7172        public $func_replace;
     73        public $compilereplace;
    7274
    7375        /**
  • _core_/plugins/textwheel/paquet.xml

    r106665 r111509  
    22        prefix="tw"
    33        categorie="edition"
    4         version="1.6.1"
     4        version="1.6.2"
    55        etat="stable"
    66        compatibilite="[3.3.0-dev;3.3.*]"
Note: See TracChangeset for help on using the changeset viewer.