Xcache баг-трекер декомпилятора

Статус
В этой теме нельзя размещать новые ответы.
дальше вместо VAR печатает PUBLIC в классах
Это не ошибка, а фича =) Цитирую: "Метод объявления переменной через ключевое слово var, принятый в PHP 4, до сих пор поддерживается в целях совместимости (как синоним ключевого слова public)." Т.е. скрипт сам смотрит на версию php и для 4-й печатает var, для 5-й - public. Но ошибка(опечатка) в классах все-таки обнаружилась:
Строка 2714:
PHP:
define('ZEND_ACC_SHADOW', 0x2000);
Заменяем, согласно спецификации, на:
PHP:
define('ZEND_ACC_SHADOW', 0x20000);
[/spoil]
Тем самым избавляемся от неправильного отображения наследуемого родительского метода/свойства private:
[spoil] Пример, где проявлялась эта ошибка:
PHP:
<?php
class MyClass {
public $public = 'Общий';
protected $protected = 'Защищенный';
private $private = 'Закрытый';
}
class MyClass2 extends MyClass {
// Мы можем переопределить public и protected методы, но не private
protected $protected = 'Защищенный2';
}
?>
До фикса:
PHP:
<?php
 
class MyClass
{
public $public = 'Общий';
protected $protected = 'Защищенный';
private $private = 'Закрытый';
}
 
class MyClass2 extends MyClass
{
protected $protected = 'Защищенный2';
public $public = 'Общий';
$private;
}
 
?>
После фикса:
PHP:
<?php
 
class MyClass
{
public $public = 'Общий';
protected $protected = 'Защищенный';
private $private = 'Закрытый';
}
 
class MyClass2 extends MyClass
{
protected $protected = 'Защищенный2';
public $public = 'Общий';
}
 
 
?>
[/spoil]
Upd: Чтобы после этого закрывающая скобка не съезжала вправо надо сделать еще такой фикс. Приложил обновленный файл.
[spoil]
Строки 2507-2553
PHP:
echo $newindent;
$static = false;
if (isset($info)) {
if ($info['flags'] & ZEND_ACC_STATIC) {
$static = true;
}
}
else if (isset($class['default_static_members'][$name])) {
$static = true;
}
 
if ($static) {
echo "static ";
}
 
$mangled = false;
if (!ZEND_ENGINE_2) {
echo 'var ';
}
else if (!isset($info)) {
echo 'public ';
}
else {
if ($info['flags'] & ZEND_ACC_SHADOW) {
continue;
}
switch ($info['flags'] & ZEND_ACC_PPP_MASK) {
Переносим отступ строки:
PHP:
$static = false;
if (isset($info)) {
if ($info['flags'] & ZEND_ACC_STATIC) {
$static = true;
}
}
else if (isset($class['default_static_members'][$name])) {
$static = true;
}
 
if ($static) {
echo $newindent."static ";
}
 
$mangled = false;
if (!ZEND_ENGINE_2) {
echo $newindent.'var ';
}
else if (!isset($info)) {
echo $newindent.'public ';
}
else {
if ($info['flags'] & ZEND_ACC_SHADOW) {
continue;
}
echo $newindent;
switch ($info['flags'] & ZEND_ACC_PPP_MASK) {
 

Вложения

  • Decompiler.class09012013-fix-case+shadow.zip
    15,4 KB · Просмотры: 25
обавал ядра все же присутсвует в данном скрипте, похожий код обрабатывается нормально , но на этом вызывает критическую ошибку и закрытие модуля пхп , что нетак в этом коде? на пхп 53 поробовал выдал такое, на пхп 52 обвал модуля пхп
C:\Xcache>php phpdc.phpr t.php
<?php

class Engine
{
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to all
ocate 261904 bytes) in C:\Xcache\Decompiler.class.php on line 50

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate
261904 bytes) in C:\Xcache\Decompiler.class.php on line 50
убираешь глобал все нормально
PHP:
<?php
class Engine {
 
    function getPageInfo(&$page) {
        global $rubrics; ////////// тут
            if (isset($rubrics[$page["position"]][$page["id_category"]]["categories"])) {
                $page["categories"]=$rubrics[$page["position"]][$page["id_category"]]["categories"];
            } else {
                $page["categories"]=0;
            }
            if (isset($rubrics[$page["position"]][$page["id_category"]]["level"])) {
                $page["level"]=$rubrics[$page["position"]][$page["id_category"]]["level"];
            }
            return true;
    }
}
 
?>
 
PHP:
function getPageInfo(&$page)

а если & - убрать ???
 
Сделал несколько фиксов:
1. Починил list(...), в т.ч. и ситуации $var=each($arr)[1]
2. Починил определение пары $key=>$val в некоторых циклах foreach
3. Исправил ZEND_FETCH_STATIC в XC_ASSIGN_REF и XC_ASSIGN (не проверенно, чисто визуальный фикс в логике)

Найдены баги:
1. конструкцию вида преобразует $c = $escape.$hex["{$h2}"].$hex["{$h1}"]; в $c = $escape . $hex[ . $h2] . $hex[ . $h1];
2. Конструкцию $model->{'get' . $fn()} распознает как $model->'get' . $fn(), т.е. без {}
3. $data = "name=\"".$name."\"\r\nversion=\"{$version}\""; распознал как $data = . 'name="' . $name . '"' . "\r\n" . 'version="' . $version . '"';
4. eval прописывает без ()
5. Некорректно распознает конструкции do { if (true) break; } while(0); - вообще не создает цикл, вставляет goto...
 

Вложения

  • decompiler.patch.txt
    6,1 KB · Просмотры: 29
dima2k тут вопрос с процессором у тебя он не сгенерировался
для генерации процессора требуется
bizon
lemon
gawk
grep
и еще что-то
Чтобы не мучатся выкладываю свою наработку под 5,3 ядро (другие делаются путем смены таблицы опкода и мелкими правками в процессоре)
В данной версии кроме декомпилятора почти ничего не осталось
Есть немного шлака типа xc_alloc но эти функции править нужно... не дошли руки еще
Как собирать
Открываем Makefile и меняем путь C:\php-sdk\php53dev\vc9\x86\php5.3\ext\xcache
на свой...
nmake
Все в принципе...
Для просмотра ссылки Войди или Зарегистрируйся
 
Сделал несколько фиксов:
1. Починил list(...), в т.ч. и ситуации $var=each($arr)[1]
2. Починил определение пары $key=>$val в некоторых циклах foreach
3. Исправил ZEND_FETCH_STATIC в XC_ASSIGN_REF и XC_ASSIGN (не проверенно, чисто визуальный фикс в логике)
Если можно предоставьте заявленный в теме формат патчей, измененные области класса, а то сравнивать по коду +- которые не все разные, есть и одинаковые, можно ошибиться в правке, и как результат листы так и не пашут (качайте последний класс либо по топику по датам архивов, либо 1 пост тоже обновленный класс - обновляемый, чтобы не было перекосов), ....в ключе баг-код <php ?>, патч класса <?php ?>
PHP:
<?php
list($a, $b, $c) = array("a", "b", "c", "d");
list($foo) = $string;
list($drink, $color, $power) = $info;
list($drink, , $power) = $info;
list( , , $power) = $info;
list($bar) = "abcde";
list($a, list($b, $c)) = array(1, array(2, 3));
list($a[0], $a[1], $a[2]) = $info; // Этот лист был поправлен ?
?>
dima2k кеш компилируется в винде проблематично, на линуксе идеально:dk:, и под CYGWIN, как его разработчик компилирует не понятно, Кей его пошинковал, но лишь бы декомпилятор работал
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху