Условно удаляйте вызовы функции в AS3, например, C # ConditionalAttribute. - PullRequest
3 голосов
/ 16 февраля 2011

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

CONFIG::debug
{
    assert(blah > 2);
}

Я бы действительно лучше просто написал:

assert(blah > 2);

И у нас есть определениеиз assert() указывает, что в режиме выпуска любые вызовы к нему, и выражения для его аргументов , не должны оцениваться - то есть, как если бы строка была пустой.Мало того, что assert() никогда не должен вызываться в выпуске, но само условие blah > 2 не должно оцениваться.

В C # это будет выглядеть так:

[Conditional("DEBUG")]
public static void assert(...) { ... }

или в C ++(примерно):

#ifdef DEBUG
    #define assert(cond) if(!(cond)) { explode(); }
#else
    #define assert(cond) /* nothing */
#endif

Есть ли какой-нибудь способ сделать что-то подобное в AS3, или нам нужно делать блоки условной компиляции вокруг всего?Я искал руководства, но пока не нашел ничего полезного.

Ответы [ 3 ]

4 голосов
/ 03 июня 2012

Есть способ сделать это.

Если вы используете флаг компилятора flex -omit-trace-statements (автоматически включается в сборках выпуска), то все вызовы функции trace будут полностью удалены, включая оценку их аргументов.

Так что просто включите ваш вызов assert в вызов трассировки:

trace(assert(blah > 2));

Вы можете убедиться, что это работает правильно, выполнив тест с некоторыми побочными эффектами внутри assert.

4 голосов
/ 16 февраля 2011

Я не думаю, что можно заставить компилятор flex игнорировать все вызовы функции, аннотируя ее объявление таким образом. На самом деле, мне было бы очень интересно, если бы вы когда-нибудь нашли способ сделать это - это помогло бы немного очистить исходный код моих проектов ...

Вы можете указать две версии метода, как описано в в этом примере . Таким образом, вы можете иметь полностью функциональный assert(...args) в вашей отладочной версии и пустой в выпускной версии, но у вас все еще будут вызовы функций и оценки аргументов в байт-коде. (

0 голосов
/ 14 апреля 2016

Совет -omit-trace-statements больше не работает с последними SDK. В соответствии с Flex 4.6 docs все, что он сейчас делает, это: Разрешает запись операторов trace () в файл flashlog.txt. Я полагаю, позволяет это опечатка, что означает предотвращает .

Вы можете проверить это с помощью этого кода, например:

var err:Error;
trace(err = new Error('trace() arguments are still being evaluated.'));
if (err != null)
    throw err;

Я изо всех сил пытался выполнить то, что хотел ОП, но до сих пор не нашел лучшего решения. AS3 не поддерживает макросы, и условная компиляция может избавить от тела утверждений, но не от оценки аргументов. Если не использовать препроцессор (например, утверждает, что стриппер), то довольно уродливый синтаксис кажется единственным выбором:

CONFIG::debug { assertTrue(fontDescription != null, 'fontDescription != null'); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...