parserALT
Страницы форума: ← Назад | 1 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 600 | Дальше →

3.4.0b BUG?

#1Аноним
08.06.09 17:00
www.parser.ru → | ответить → | в избранное →

3.4.0b BUG?

Есть класс.
В нем есть метод
В этом методе по циклу вызывается метод в котором вызываеться метод)

В методе явно определен $result.
После определения ^throw[asd;asd;$result] выводит коректный результат.

Но если сам вызов обернуть throw - ^throw[asd;asd;^getXmlContent[$sPath]]

выводит кучу пустых строк
#2Sumo
→ Аноним [#1] | 08.06.09 17:03
www.parser.ru → | ответить → | в избранное →

Выделите "проблему" в чистом виде...

... т.е. нужен один файл в котором воспроизводится ситуация.
#3Аноним
→ Sumo [#2] | 08.06.09 17:12
www.parser.ru → | ответить → | в избранное →
я сам непойму... на одном сайте при разных условиях работает по разному...

пока сделал в лоб - убрал result и сделал вывод прям в теле метода
#4Аноним
→ Sumo [#2] | 08.06.09 17:15
www.parser.ru → | ответить → | в избранное →
Багофича явно в 3.4.0(Linux) в 3.3.0(Windows) все работало
#5moko
→ Аноним [#1] | 08.06.09 17:16 / 17:17
www.parser.ru → | ответить → | в избранное →

Проблема возможна

Да, в 3.4.0 теперь есть оптимизация, работающая в зависимости от использования $result - если $result используется, то весь остальной вывод метода игнорируется (а значит экономится процессор и память).

Что будет работать некорректно: когда при одном вызове $result используется, а при другом нет. Типа

@method
^if($expression){ $result[это] }{ другое-значение }


То есть метод должен либо всегда использовать $result, либо всегда не использовать. Если у вас с этой точки зрения все правильно, ждем _bug.html
#6Аноним
→ moko [#5] | 08.06.09 17:27
www.parser.ru → | ответить → | в избранное →
Спасибо Константин! :)

У меня result лежал в if`e

^if(-f $sPath){
 ...
 $result[$sContent]
}{
 $result[]
}


так работает)
#7moko
→ Аноним [#6] | 08.06.09 17:52
www.parser.ru → | ответить → | в избранное →

Да, конечно

Во всяком случае должно. :)

Главное чтобы во всех ветках/случаях было присвоение. Например чтобы снаружи этого не стоял еще один ^if. :) Простой способ не думать об этом - $result[] в начале.
#8Vint
→ moko [#5] | 08.06.09 18:10
www.parser.ru → | ответить → | в избранное →

Вопросцы

1. Такое поведение актуально только при объявлении result'а в качестве локальной переменной или при наличии хотя бы одного $result в методе?

Касательно новой оптимизации в парсере:
2. Имеет ли смысл объявлять локальный result в каждом методе при условии, что все медоты возвращают данные только через $result (привычка такая)? Интересуют скорость и расход памяти.

2.1 Влият ли объявление locals в методе или целом классе на объявление локального result'а, т.е. не заменяет ли locals собой result?
#9Hexley
→ moko [#7] | 08.06.09 18:20
www.parser.ru → | ответить → | в избранное →

$tData.[$tColumns.column]

$tData.[$tColumns.column]


такая запись не работает в 3.4 . Чего я еще не знаю?)))
#10Sumo
→ Hexley [#9] | 08.06.09 18:21
www.parser.ru → | ответить → | в избранное →

Работает... код полностью покажите.

#11moko
→ Vint [#8] | 08.06.09 18:43 / 18:43
www.parser.ru → | ответить → | в избранное →

Чуть ответов

2. Имеет ли смысл объявлять локальный result в каждом методе при условии, что все медоты возвращают данные только через $result (привычка такая)? Интересуют скорость и расход памяти.

Да, конечно имеет - на этапе компиляции будет выкинут лишний whitespace.

2.1 Влият ли объявление locals в методе или целом классе на объявление локального result'а, т.е. не заменяет ли locals собой result?
locals - по-моему это совсем про другое.

Описанная мной оптимизация - работает во время выполнения. Грубо говоря, после первого запуска метода смотрится факт использования $result и этот факт запоминается. Выигрыш понятно единицы процентов, хотя можно придумать ситуацию, когда разница будет существенной. На тестовой странице Imprimatur I - расход памяти 8876кб - c оптимизацией, 9216кб - без нее.
#12moko
→ Hexley [#9] | 08.06.09 18:55 / 18:55
www.parser.ru → | ответить → | в избранное →

Того, что ...

версия 3.4 сейчас в активной разработке? :) И еще вероятно с пару недель будет в таком состоянии?

Так что пока 3.4 - для тех, кто хочет помочь разработчикам. Удивляться наличию ошибок в ней не стоит, а следует делать _bug.html. Примем с благодарностью, ошибка будет исправлена, код добавлен в копилку тестов. :)
#13Vint
→ moko [#11] | 08.06.09 19:02
www.parser.ru → | ответить → | в избранное →
locals - по-моему это совсем про другое.

Ну как, locals делает все переменные локальными, получается, что и $result становится локальным (явно объявленным).
Но понятно, что сам $result и объявленный result -- системные переменные, которые обрабатываются отдельно. Это я в качестве бреда подумал такое о locals:-)

С остальным всё понятно. Спасибо, moko!
#14moko
→ Vint [#13] | 08.06.09 19:19
www.parser.ru → | ответить → | в избранное →
locals - на самом деле меняет механизм поиска переменных (упрощает процедуру).

Что же касается декларирования, $result - автоматически заводится всегда. А его явная декларация - лишь указание компилятору включить режим оптимизации.
#15Vint
→ moko [#14] | 08.06.09 19:24
www.parser.ru → | ответить → | в избранное →

Именно так и представлял, не считая "бредового" вопроса. Спасибо!

#16Hexley
→ moko [#12] | 08.06.09 20:35
www.parser.ru → | ответить → | в избранное →
ОК ) Буду параллельно вести версию своего проекта на parser3.4)
#17Misha v.3
→ Hexley [#9] | 09.06.09 01:33
www.parser.ru → | ответить → | в избранное →

когда речь идёт о head, собщайте дату/время получения вами исходников из cvs

в настоящее время там всё меняется почти каждый день и не все изменения всегда рабочие (и хотя обычно мы не коммитим то, что не проходит тесты, тесты не покрывают всего многообразия конструкций языка и соотв. иногда head версия может вести себя неадекватно в реальных условиях).
#18Саян
→ moko [#5] | 09.06.09 09:38
www.parser.ru → | ответить → | в избранное →

А в exception подобная ситуация будет обернута?

#19Misha v.3
→ Саян [#18] | 09.06.09 10:48
www.parser.ru → | ответить → | в избранное →

боюсь, что это не представляется возможным

т.к. это runtime-оптимизация. для того, чтобы на этапе выполнения понять, есть ли в методе result или нет, надо выполнить все возможные ветки (а для этого, в общем случае, могут подребоваться иные данные).

определение наличия явного присвоения result-у во время компиляции также полностью не решает проблему, т.к. кодер запросто может написать так:
$name[result]
$$name[значение]


название переменной может придти извне, или кто-то может записать в result метода ($caller.result[...]).

и без выполнения всех веток однозначно определить наличие в методе записи в result невозможно (соотв. и ругнуться невозможно).


однако выигрыш от подобной оптимизации оказался существенным, поэтому мы решили пойти на некоторую ломку обратной совместимости, особенно учитывая тот факт, что с нашей точки зрения писать код, который иногда возвращает содержимое result, а иногда содержимое тела -- плохой стиль :)
#20Саян
→ Misha v.3 [#19] | 09.06.09 11:39
www.parser.ru → | ответить → | в избранное →

Вариант

Если наличие $result определяется динамически после первой компиляции, то почему бы не сравнивать при следующих выполнениях факт обнаружения $result и результат, состоящий только из пробелов и табуляций (ситуация, описанная в начале топика), и при успешном сравнении создавать что-то вроде $debug_explicit_result_found[имя_оператора]?
#21Misha v.3
→ Саян [#20] | 09.06.09 12:20
www.parser.ru → | ответить → | в избранное →

тогда весь смысл оптимизации теряется

основная идея как раз в том, что если было обнаружено использование result, то при следующем вызове не накапливать эти пробелы, табуляции и прочий output, а просто игнорировать его, как ненужный.
#22Саян
→ Misha v.3 [#21] | 09.06.09 16:03
www.parser.ru → | ответить → | в избранное →

Так ведь всё просто получается

1) В какой-то момент определили наличие $result
2) Выполняем с оптимизацией
3) По окончании проверяем: result определен? Нет? Exception.
#23moko
→ Саян [#22] | 09.06.09 20:12
www.parser.ru → | ответить → | в избранное →

Да, обсуждалось

И такое место есть см. метод result(), http://cvsview.parser.ru/cgi/viewcvs.cgi/parser3/src/types/pa_vmethod_frame.h?rev=HEAD

Проблема в том, что exception ухудшит совместимость. Сейчас в этом случае возвращается пустое значение, что сработает для всех случаев, когда $result просто забыли присвоить значение.
Типа
^if($a){ $result[<$a>] }


Случаи же когда умышленно делается
^if($a){ $result[<$a>] }{ <default>} 
- скорее исключение, поэтому и выбран вариант без exception.
#24Саян
→ moko [#23] | 11.06.09 22:41
www.parser.ru → | ответить → | в избранное →

Эх, словит этот форум rtfm'ов... А чем @...[result] не устраивает?

#25Misha v.3
→ Саян [#24] | 12.06.09 01:32
www.parser.ru → | ответить → | в избранное →

rtfm :) почитайте, что делает объявление result-а локальным :)

#26Саян
→ Misha v.3 [#25] | 12.06.09 15:10
www.parser.ru → | ответить → | в избранное →

А если оптимизацию явно определять таким же способом? @method[][optimized_result]?

#27Misha v.3
→ Саян [#26] | 13.06.09 02:13
www.parser.ru → | ответить → | в избранное →

рассматривали такой вариант

проблема в том, что для того, чтобы получить выигрыш в этом случае, надо открыть код и исправить кучу мест. понятно, что делать это никто не будет, т.е. оптимизации фактически нет :(
#28Саян
→ Misha v.3 [#27] | 13.06.09 08:13
www.parser.ru → | ответить → | в избранное →

Я - исправлю

И все, кого интересует расход памяти - исправят, уверен. А кого не интересует - тому в принципе всё равно, будет оптимизация или нет.
Неужели невидимая ошибка считается меньшим злом?
#29moko
→ Саян [#28] | 15.06.09 13:49
www.parser.ru → | ответить → | в избранное →

пожалуйста. :)

>Неужели невидимая ошибка считается меньшим злом?

В нашем коде мы пока даже не видели мест, где бы это привело к ошибке. Предупреждение скорее на всякий случай.

Кому не нравится - может поправить исходники, например сделать #define CALL_OPTIMIZATION_DEBUG для поиска проблемных мест. :)
Страницы форума: ← Назад | 1 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 600 | Дальше →