PDA

Просмотр полной версии : [Вопрос] __emit и const.*



vvw
11.11.2019, 20:14
При работе данного оператора в макросах нельзя узнать адрес переданной переменной через инструкцию const.*


#define Foo(%0) \
(__emit(const.pri (%0)))
main() {
new bar;
printf("%x\n", Foo(bar));
}


Выдает ошибку:


error 008: must be a constant expression; assumed zero


Есть другие способы получить адрес переменной?

Daniel_Cortez
12.11.2019, 10:27
Есть инструкция addr.pri/alt, с помощью которой можно получить адрес локальной переменной. Если же нужна универсальность под любые типы переменных (т.е. как стековые, так и в секции данных), этим летом я добавил несколько псевдоинструкций (https://github.com/pawn-lang/compiler/pull/421) как раз для использования в макросах - конкретно в данной ситуации понадобится addr.u.pri/alt.

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

vvw
12.11.2019, 10:36
Есть инструкция addr.pri/alt, с помощью которой можно получить адрес локальной переменной. Если же нужна универсальность под любые типы переменных (т.е. как стековые, так и в секции данных), этим летом я добавил несколько псевдоинструкций (https://github.com/pawn-lang/compiler/pull/421) как раз для использования в макросах - конкретно в данной ситуации понадобится addr.u.pri/alt.

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

... а до следующего релиза неизвестно сколько времени пройдет, ибо они сами еще не решили, когда он будет. Собирать же компилятор для библиотеки, которую собираешься выложить в открытый доступ - глупая затея.

p.s. ссылка не открывается.

Daniel_Cortez
12.11.2019, 10:49
ссылка не открывается.
Исправил (как в своём посте, так и в твоей цитате).


... а до следующего релиза неизвестно сколько времени пройдет, ибо они сами еще не решили, когда он будет.
Попробуй с вопросом о релизе потерроризировать их через багтрекер (issues). Я бы и сам спросил, но в последнее время складывается ощущение, будто меня там просто игнорируют (вполне возможно, что из-за той пары PR, которые им не понравились).

UPD: И да, если что, на днях ключевое слово emit удалили (https://github.com/pawn-lang/compiler/pull/459), оставив только __emit.

vvw
12.11.2019, 10:57
Исправил (как в своём посте, так и в твоей цитате).


Попробуй с вопросом о релизе потерроризировать их через багтрекер (issues). Я бы и сам спросил, но в последнее время складывается ощущение, будто меня там просто игнорируют (вполне возможно, что из-за той пары PR, которые им не понравились).

Пора открывать свою редакцию pawn-lang. Из-за каких PR?

P.S. есть ли способ восстановления аккаунта на pro-pawn.ru?



UPD: И да, если что, на днях ключевое слово emit удалили, оставив только __emit.

Это логично, потому что emit не является задокументированным ключевым словом. Я уже и не помню, почему мы добавили emit.

Daniel_Cortez
12.11.2019, 19:01
Из-за каких PR?
https://github.com/pawn-lang/compiler/pull/455
https://github.com/pawn-lang/compiler/pull/456
Возможно, мне стоило сначала создать issue и обсудить соответствующие изменения, но на тот момент хотелось сразу предоставить proof of concept, чтобы можно было сразу испытать новые фичи. Как оказалось, зря.



Это логично, потому что emit не является задокументированным ключевым словом.
Дело не столько в документировании, сколько в том, что название просто не начинается с "__", как у других новых ключевых слов (до релиза 3.10.9 это был только оператор __emit, в предстоящем релизе добавлен __addressof + в очереди на принятие __nameof).



P.S. есть ли способ восстановления аккаунта на pro-pawn.ru?
Да, подтверждением через почтовый ящик, на который зарегистрирован аккаунт. Либо отпишись в ЛС: задам пару вопросов, чтобы убедиться, что ты - это точно ты, и объединю этот твой аккаунт со старым.

vvw
12.11.2019, 19:39
https://github.com/pawn-lang/compiler/pull/455
https://github.com/pawn-lang/compiler/pull/456
Возможно, мне стоило сначала создать issue и обсудить соответствующие изменения, но на тот момент хотелось сразу предоставить proof of concept, чтобы можно было сразу испытать новые фичи. Как оказалось, зря.


Да, стоило сделать issue. А вообще "continue enum" - довольно странный синтаксис. Лучше было бы профорсить тему с аттрибутами, в которую можно было бы сделать данный функционал.


enum bar {
a,b,c
};

enum bar __attribute__(continue) {
d,e,f
};



Сейчас сделаю функцию рандомного switch, тогда точно можно будет сказать, что я - я. =)