Модифицированная версия компилятора Pawn с исправлением множества багов.
Наиболее примечательные баги, которые были исправлены:
- Ошибка на строках кода длиннее 511 символов (лимит увеличен до 4095).
- Падение компилятора при использовании #emit sysreq.c, если указанная функция не использовалась ранее (с некоторых пор баг снова стал проявляться, однако новый патч #157 (https://github.com/Zeex/pawn/pull/157) уже ждёт принятия).
- Ошибка при использовании строк в тернарных выражениях.
- Падение компилятора при использовании #emit call.
- Падение компилятора из-за неправильного названия инструкции в #emit.
- Условная компиляция (#if/#elseif/#else/#endif) не работала с директивой #emit.
- Ошибка при передаче глобальной переменной в функцию до определения функции, из-за которой компилятор принимал переменную за неиспользуемую и удалял её из файла .amx (#131).
Нововведения:
- Добавлен ключ командной строки "-R", использование которого включает отображение отчёта о находящихся рекурсиях в скрипте (#121).
- Добавлена поддержка отрицательных чисел и чисел с плавающей запятой в #emit (#128, #133).
- Реализована возможность ограничивать видимость перечисления в пределах одного файла (удобно при создании инклудов).
Пример:
static enum eMyEnum { myEnumFieldA, myEnumFieldB, myEnumFieldC };- Убрана автоматическая защита от повторного подключения включаемых файлов. Это было сделано из-за различий в работе такой защиты на разных ОС.
Данную защиту можно включить, активировав режим совместимости с помощью флага "-Z" или директивы #pragma compat.- Новые встроенные константы:
- __line - номер текущей строки в исходном файле;
- __PawnBuild - номер текущего билда компилятора;
- __compat - флаг режима совместимости: 1, если включена компиляция в режиме совместимости (с ключом -Z), иначе 0;
- __file - содержит строку с названием текущего исходного файла (например, "main.pwn" или "my_include.inc");
- __date, __time - содержат дату и время компиляции соответственно (время запуска компилятора).
- Директива #pragma compat позволяет активировать режим совместимости, в котором включена автоматическая защита от повторного подключения файлов.
- Добавлена возможность показывать предупреждающие сообщения с помощью директивы #warning, по аналогии с уже существующей директивой #error, но без прерывания компиляции:
Пример:
#warning Эта строка будет выведена в отчёте компилятора
Результат:
Код:warning 237: user warning: Эта строка будет выведена в отчёте компилятора- Также реализована многофункциональная директива #pragma warning, с помощью которой можно отключать предупреждения компилятора (#pragma warning disable <номер>), а также запоминать/восстанавливать состояние активации предупреждений (#pragma warning push/pop).
Пример:
#warning Эта строка будет выведена в отчёте компилятора #pragma warning push // Запоминаем состояние предупреждений #pragma warning disable 237 // Отключаем все пользовательские предупреждения (код 237) #warning Эта строка выведена не будет #pragma warning pop // Восстанавливаем прежнее состояние #warning Эта строка тоже будет выведена
Результат:
Код:warning 237: user warning: Эта строка будет выведена в отчёте компилятора warning 237: user warning: Эта строка тоже будет выведена- Директива #pragma naked отключает предупреждения вида "function must return a value". Отличие от #pragma warning disable в том, что #pragma naked действует только в пределах одного файла.
Данная возможность может пригодиться при использовании #emit retn. Добавление return 1 в таких случаях тоже скроет предупреждение, но приведёт к генерации неиспользуемого (недостижимого) байткода.- Добавлена прогрессивная инициализация для двухмерных массивов.
Пример (взято отсюда):
new a[5][10] = {{0, 1, 2, ...}, {0, 2, 4, ...}, ...};
В полной записи данный массив будет выглядеть так:
new a[5][10] = { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}, {0, 3, 6, 9, 12, 15, 18, 21, 24, 27}, {0, 4, 8, 12, 16, 20, 24, 28, 32, 36}, {0, 5, 10, 15, 20, 25, 30, 35, 40, 45} };- Также реализована возможность объявления четырёхмерных массивов (ранее был лимит в 3 измерения).
Пример:
new arr[3][1][2][3] = { { { { 1, 2, 3 }, { 4, 5, 6 } } }, { { { 7, 8, 9 }, { 10, 11, 12 } } }, { { { 13, 14, 15 }, { 16, 17, 18 } } } };- Добавлен новый оператор __emit.
С описанием работы данного оператора можно ознакомиться здесь: https://github.com/Zeex/pawn/pull/18...ment-323531746
(Примечание (DC): В скором времени будет подготовлена русскоязычная статья по использованию оператора emit, я добавлю ссылку сюда по мере готовности.)- Ускорена компиляция больших массивов, все элементы которых инициализированы одним и тем же значением.
Теперь в ассемблерном листинге подобные массивы записываются как "dumpn <кол-во> <значение>".- Теперь при возврате массивов неизвестного размера компилятор выдаёт ошибку.
Пример:
#include <a_samp> GetGenderName(gender_id) { static const gender_names[3][] = { {"male"}, {"female"}, {"undefined"} }; if (0 == gender_id) return gender_names[0]; if (1 == gender_id) return gender_names[1]; return gender_names[2]; } main() { for (new i = 0; i < 3; ++i) printf("#%d: %s", i, GetGenderName(i)); // error 092: functions may not return arrays of unknown size (symbol "GetGenderName") }
Здесь компилятор выдаёт ошибку из-за того, что не знает размер последнего измерения массива gender_names. Чтобы устранить ошибку, достаточно лишь указать размер последнего измерения массива:
static const gender_names[3][10] = { {"male"}, {"female"}, {"undefined"} };- Значительно ускорена обработка исходного кода за счёт хранения глобальных идентификаторов (переменных, констант, функций) в хеш-таблице.
- Добавлен параметр командной строки "-E" для интерпретации предупреждений от компилятора как ошибок.
- Добавлена директива #pragma option, с помощью которой можно указывать параметры командной строки из скрипта.
Скачать: https://github.com/Zeex/pawn/releases
Исходный код на GitHub: https://github.com/pawn-lang/compiler
Источники информации: What's new, https://github.com/pawn-lang/compile... compiler bugs.
Статью подготовил: Daniel_Cortez
Отдельная благодарность ziggi за описания некоторых ошибок и нововведений.
Специально для Pro-Pawn.ruКопирование данной статьи на других ресурсах без разрешения автора запрещено!