FlexiPedia Wiki on Adobe Flex
Флэш Потрошитель - Жизнь вокруг технологииЖизнь вокруг технологии

Флэш Потрошитель этот | тот | 1.0

С 09.09.2002
  • Коллекция багов Flash
  • Ссылки для начинающего аниматора
  • Flex для PHP-разработчиков
  • Как вы используете Flash?

Поток сознания

polovaikin ответил на Что такое матрица:

флеш рипер уже не тот ;)

 
 

7 часов назад

Флэшер-аноним ответил на Что такое матрица:

Картинки можно дополнить текстом.

http://www.chemometrics.ru/materials/textbooks/matrix.htm

20 часов назад

makc3d ответил на Еще один способ заработать на играх:

ща потестим

1 день назад

Rost ответил на Еще один способ заработать на играх:

Fixed.

2 дня назад

7a ответил на BAFPUG revolution!:

Мы были на прошлой неделе в Белоруссии проездом, было очень холодно: ночью в Гомеле -32 %) Спасибо за приглашение, у меня есть сильное желание приехать и послушать доклады, интересные темы, но всё же в следующий раз, когда будет потеплее ;)

2 дня назад

Флэшер-аноним ответил на Релиз Alternativa3D 8.5.0 - с поддержкой GPU!:

Большое спасибо, очень интересно.

4 дня назад

Флэшер-аноним ответил на Cоздание мобильного Flash-приложения "Hello World" - урок для начинающих:

Наконец нашел что-то путное по теме. Начну разжевывать. Несколько дней уйдет, однако.

5 дней назад

Флэшер-аноним ответил на Избранные баги Flash:

Мне пришлось столкнуться с тем, что элементарно не работает комбинация клавиш Ctrl + C и Ctrl + V. Причем переустанавливали Flash и не раз. Может быть, есть здесь те, кто сталкивался с этой проблемой и как-то смог решить ее?

1 неделя назад

makc3d ответил на Избранные баги Flash:

beer good. spam bad!

1 неделя назад

Флэшер-аноним ответил на Избранные баги Flash:

Хотелось бы узнать, Как вы относитесь к пиву? Если положительно, то какое предпочитаете? Если отрицательно, то почему? Просто интересно...

1 неделя назад

Более старые 
Главная › Блоги › Блог Rost

А хочешь — вместо написания кода поработать компилятором?

Я — не хочу. Тут два варианта: или развивать орлиный глаз, или заворачивать содержимое внутри блока switch/case в фигурные скобки. Но расскажу по порядку.

Во Flash- и Flex-компиляторе есть баг, который может убить много вашего времени. Баг в том, что компилятор не ругается на многие синтаксические ошибки внутри блока switch/case. Компилятор запросто пропускает кучу безумных конструкций. В результате неправильно записанная операция не сработает в вашей программе, не вызвав ни ошибки во время компиляции, ни ошибки во время выполнения. Просто не сработает и сиди гадай, что у тебя в коде не так. Вот наглядный пример, где в строках 8, 9, 10 и 11 пропущены различные операторы:

var result: String = "not defined"; 
switch( true ) 
{ 
    case true: 
        // Следующие четыре строки кода не выполнятся. 
        // При этом они не вызывают ошибки компилятора. 
        // И не вызывают исключения во время выполнения во Flash Player. 
        result = 'A''B'; 
        result = 1'B'; 
        result = "a"true; 
        result = 1true; 
        break; 
} 

// Вывод: "Result is: not defined."
trace("Result is: " + result + ".");

Но в этом примере ошибку найти легко (он для того и сделан простым), а вот в реальной жизни — найдите-ка ее в следующем коде после пары-тройки часов плотного кодирования:

case newMessageByUser:
    var html:String = "not defined";
    html = '

@'+uname+':

'+ '

'+juickbody+'

'+ '

Reply to #'+mid+', ' + 'Web: '+murl'

'; trace("html=" + html); break;

Ошибка тут есть, она одна, и компилятор ничего не скажет о ней, пока этот код находится внутри блока case. Сиди и думай сам, что не так и почему выводится html=not defined, а не ожидаемое html=[клевая отформатированная строка].

В результате — масса убитого зря времени, фрустрация, передозировка кофеина, ад, кромешный ад. А ведь его можно легко избежать, если просто завернуть внутренности case: { в фигурные скобки }. На приведенном выше простом примере:

switch (true) 
{ 
    case true: 
    { 
        result = 'A''B'; // Теперь компилятор укажет на ошибку синтаксиса здесь :) 
        break; 
    } 
}

Что можно с этим сделать?

Пока этот баг в компиляторе не будет исправлен, я рекомендую использовать фигурные скобки внутри case, просто, чтобы не тратить зря свое время.

А чтобы этот баг исчез вообще, хорошо было бы проголосовать за него, пока он еще горяч.

Кстати! Радуют результаты нашего предыдущего голосования три дня тому! Разработчик флексового отладчика Майк Мориарти уже взялся за дело, воспроизвел и пофиксил баг локально. А на форуме бета-тестеров Flash Builder он удивился количеству голосов за этот баг Smile

А еще в switch/case есть несколько ошибок, похожих на эту.

  • bug
  • compiler
  • flash builder
  • flex
  • jira
  • Буфер обмена
- Rost, пн, 20/07/2009 - 12:45
  • Блог пользователя Rost
  • В Жуйк

Комментарии

1.02

Flash coding conventions и так советует всегда использовать фигурные скобки в блоках case.
Во втором примере такой быдлокод, что шуба заворачивается.
И не компилятор, а транслятор.

Флэш Потрошитель (не проверено) 14:16 20/07/09

Flash coding conventions и так советует всегда использовать фигурные скобки в блоках case.
Спасибо за напоминание! Ты имееешь в виду Flex SDK coding conventions and best practices? Да, рекомендуют. Вот еслит бы еще и настоятельно рекомендовали, намекая, чем грозит неисполнение.

Во втором примере такой быдлокод, что шуба заворачивается.
А он не приводится как образец изящности Steve . Показана всего рабочая ситуация прототипирования, перебора разных комбинаций. Потом это все причесывается, но на своем этапе такой код тоже был. И думаю, что еще будет, потому что не все (включая автора) пишут код сразу идеальным.

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

И не компилятор, а транслятор.
Вообще, даже не транслятор, а парсер. Но в Adobe JIRA я увидел только "ASC Compiler".

Rost - http://rajaka.net/ 15:34 20/07/09

Ну вот не понимаю, что значить:
"Разработчик флексового отладчика Майк Мориарти уже взялся за дело, воспроизвел и пофиксил баг локально. "
Там же куча багов есть, они ещё в рандом играют с голосовалкой "какой бы исправить?"
Баг - ест баг, и не важно маленький или большой, от релиза до релиза, вроде как надо править всё что нашли, а не растягивать, пока не приспичит...

Sev (не проверено) 14:20 20/07/09

Вот у тебя 100 багов и через месяц — релиз.
Из 100 багов 10 требуют недели на исправление, и на них вроде никто не жалуется.
Будешь эти исправлять? В сроки релиза уложишья?
Вот и вводится понятие приоритета.
Вообще непонятно, почему это нужно объяснять Smile

Rost - http://rajaka.net/ 15:16 20/07/09

Вроде как у меня есть баг, скажем, с вводом под линуксом в полях нелатинские символы или при включенном моде "transparent"... вот... И вроде как все жалуются... и вроде как не один месяц прошёл...

Sev (не проверено) 19:12 20/07/09

Да, не все хорошо. Это один из злобнейших багов. И над этим мы тоже пытаемся работать.

Rost - http://rajaka.net/ 23:56 20/07/09

И еще по поводу твоего комментария относительно бага с вводом на Линуксе — негодуем не только мы. Но Адоб уже хотя бы не молчит, как рыба об лед: вот подвижки, обещают исправить в следующем релизе. Наверное, Линукс для них все же крепкий орешек Smile

Rost - http://rajaka.net/ 21:50 21/07/09

Я давно сталкивался с данной проблемой и просто вызывал функцию, рыть глубже времени особо не было, но теперь буду юзать скобки

ivansoroka 14:53 20/07/09

html = '@'+uname+': '+
'

'+juickbody+'

'+
'

Reply to #'+mid+', ' +
'Web: '+murl'

';


Амм... Ну, это жесть Smile
При всем уважении, не проще (и лучше, и читабельнее и т.д.) сделать так:

var html:String = "Hello, %name% !We proudly present our new %feature%...";
html = html.replace("%name%", "Masha Pupkina");
html = html.replace("%feature%", "Nano-vibrator");
trace(html);

И ошибок с пропуском '+' операнды не будет. ^_^

jloa - http://chargedweb.com/labs/ 15:15 20/07/09

Да, очевидно, что развернутый код проще в отладке, и реплейсы глобальные тоже хороши, с ними и работаю уже. Но бывает и такой код, особенно, когда ты не пишешь продукт по готовой спеке, а подбираешь оптимальные комбинации строк, экспериментируешь и т.д.

Сейчас я уже использую глобальные методы типа userNameToLink, urlToLink, messageIdToLink и т.п. Но показанный код тоже был на определенном этапе, чего тут скрывать.

Rost - http://rajaka.net/ 15:22 20/07/09

Это все понятно, но стоит все же заметить, что соблюдение чистоты в коде само по себе споcобствует работе компилятора. С некоторыми ошибками просто нет шанса столкнуться. Smile

Кстати, со свитчами там вообще что-то нечисто.
У меня проект не компилировался, когда в функции встретился switch () {} и return перед ним. То есть, он компилировался, но при запуске выпадал в verify стэк-трейс и все на этом заканчивалось. Ошибку сейчас не воспроизведу, но эффект был интересный: убираешь ретурн или свитч -- все работает.

Nox Noctis 15:37 20/07/09

Да, конечно, способствует, и я, каюсь, грешен... но я работаю над этим Smile

Rost - http://rajaka.net/ 15:58 20/07/09

Есть баг с тем, что return в первой строке функции вызывает подобные проблемы. switch тут может быть и не при чем.

Slon_vsapogah - http://kachurovskiy.com 16:27 20/07/09

Switch/case лучше вообще не использовать т.к. он может вызвать неконтролируемые и рандомные ошибки компилятора.

Slon_vsapogah - http://kachurovskiy.com 16:26 20/07/09

Лучше вообще AS3 не использовать, т.к. он может вызвать неконтролируемые и рандомные припадки. Smile

Racer242 (не проверено) 14:55 21/07/09

Шутки шутками, но когда в проекте 1,500 классов и switch в одном классе вызывает якобы ошибки наследования в совершенно другом классе - попробуйте разберитесь.

Slon_vsapogah - http://kachurovskiy.com 15:00 21/07/09

Ой 1,500. Я б такой проект поделил на 100 модулей и делал бы их как 100 проектов.

Racer242 (не проверено) 15:10 21/07/09

Примерно этим и занимаюсь последний год Smile

Slon_vsapogah - http://kachurovskiy.com 15:13 21/07/09

О таком глобальном рефакторинге хотелось бы послушать подробно!

Rost - http://rajaka.net/ 17:09 21/07/09

Да благословен будет каждый, кто следует Flex SDK coding conventions!

Racer242 (не проверено) 16:32 20/07/09

Кстати, немного не в тему, но меня терзают сомнения по поводу "чистоты" выполнения конструкции with() {}. Какие-нибудь комментарии на этот счет?

jloa - http://chargedweb.com/labs/ 16:48 20/07/09

Есть старая престарая ошибка компилятора (по крайней мере того, который в Flash CS3).
Если использовать в коде не очень корректный XML, то:
1. компилятор не ругнётся
2. swf появиться
3. в этом swf вообще будет напрочь отсутствовать хоть какой-то abc-код. Даже те классы, в которых ошибки не было.

Пример:
trace ("Start");
var qqq:XML = <invalid><xml error=/></invalid>;
trace ("Finish");

Ещё недавно один мой друг, начинающий флешер, словил весёлую ошибку на AS2.0
Он присвоил переменной строковую константу длинной 65536 байт.
Компилятор попытался это сделать с помощью инструкции
push "тут длинная строка......"
В байткоде на длину инструкции выделяется 2 байта. В результате получилось, что длина инструкции push стала 0.
Таким образом вся эта константа стала восприниматься не как данные, а как коды инструкций.
В AVM1 ещё не было валидатора, поэтому флеш плеер поступает просто: как только встречает неизвестную инструкцию - сразу прекращает дальнейшее выполнение скрипта.
Вобщем получалось так, что строчки, идущие после эпического присваивания тупо не выполнялись, как и само присваивание.

Dan 22:34 20/07/09

Надо бы проверить, как с этим в современных компиляторах...

Rost - http://rajaka.net/ 23:57 20/07/09

Пример с XML совершенно однозначно отвергается компилером в CS4 при попытке компиляции в as3 и мудро просит проверить, не пропустил ли ты фигурную скобочку либо все же кавычки (коих явно не хватает после атрибута).
Для компиляции в as2 предложенный пример, конечно, не годится, меняем на:

var qqq:XML = new XML("<invalid><xml error=/></invalid>");

[сноска]
Компилер все глотает, все ему нравится, глупому.
Трейс выдает, что наш хмл в итоге равен '' (адоб, бди).
Кстати, в as3 при задании хмл через конструктор, как в последнем примере (см [сноску]) сразу получаем конкретную ошибку #1090 интерпретатора XML.
По поводу строк.
Не смог накопать спеку на AVM1, может кто заделится =), но согласно http://www.adobe.com/devnet/actionscript/articles/avm2overview.pdf, п.2.1, строка может содержать до 2^30-1 байт. Т.е. вопрос не в компиляторе (приведенный Dan'ом пример проверил - все работает).

thevasiliy (не проверено) 00:12 04/08/09

* Трейс выдает, что наш хмл в итоге равен </invalid>

thevasiliy (не проверено) 00:14 04/08/09

еще что-то страшное творится, когда блок свитча пустой. когда то убил пару часов, пытаясь выловить этот баг

whitered (не проверено) 22:42 20/07/09

Получается, весь switch/case конкретно не доделан.

Rost - http://rajaka.net/ 23:57 20/07/09

Вариант третий =).
Сразу писать результат в локальную переменную.
Т.е. не
var html:String = "not defined";
html = "строка с пропущенным плюсом"
а
var html:String = "строка с пропущенным плюсом".
Компилятор сразу ругнется.
За баг голосую, до исправления использую это work around.

thevasiliy (не проверено) 19:06 03/08/09
Примечания: Статус документа => в процессе ·
Статьи · Идеальный клип · Персоналии · Глоссарий (уст.) · Что делать? · К началу ↑
© 2002-2012 Ростиславр · О проекте · Подписка на RSS · α-тестировани невероятного
]]>
]]>
Что такое OpenID?
  • Войти по OpenID
  • Скрыть вход по OpenID
  • Регистрация
  • Запросить новый пароль