Я продолжаю возиться со сборкой Nemerle в Mono. Видимые косяки xbuild-а я вроде бы поборол (правда пулреквест 2 месяца уже висит ).
Теперь дошла очередь до PEVerify.
Моновский PEVerify в Nemerle.dll ничего не находит. А вот MS-ный находит одну ошибку: Value class has neither fields nor size parameter.
Похоже, что дело в FakeVoid.
Дизасемблирование собранной под моно Nemerle.dll из Stage4 даёт
.namespace Nemerle
{
.class public sequential ansi sealed beforefieldinit FakeVoid
extends [mscorlib]System.ValueType
{
} // end of class Nemerle.FakeVoid
}
А вот в бинарниках с сайта похоже FakeVoid вообще нет!
Что с этим делать и как должно быть я не понимаю. NEED HELP! в общем.
Где вообще можно почитать просто и доходчиво (желательно на русском) про синтаксис IL. Желательно про типы, метаданные и прочее, а не про сами ассемблерные инструкции.
Здравствуйте, Вестильд, Вы писали:
В>Я продолжаю возиться со сборкой Nemerle в Mono. Видимые косяки xbuild-а я вроде бы поборол (правда пулреквест 2 месяца уже висит ).
Давай ссылку на пулреквест, посмотрим. FakeVoid в бинарях на сайте уже есть, билд от 13 марта.
.class public sequential ansi sealed beforefieldinit Nemerle.FakeVoid
extends [mscorlib]System.ValueType
{
.pack 0
.size 1
} // end of class Nemerle.FakeVoid
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Вестильд, Вы писали:
В>>Я продолжаю возиться со сборкой Nemerle в Mono. Видимые косяки xbuild-а я вроде бы поборол (правда пулреквест 2 месяца уже висит ).
H>Давай ссылку на пулреквест, посмотрим.
Здравствуйте, hardcase, Вы писали:
H>Вполне возможно, что нужно в компиляторе добавить автоматическое навешивание StructLayout атрибута с параметром Size = 1 для структур без полей.
Пожалуй.
Скачал свежие бинарники, в них
.pack 0
.size 1
А в собранном из свежих сорцов всё прежнему.
Nemerle сам байт-код генерит, или системный ассемблер использует?
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Вестильд, Вы писали:
В>>Nemerle сам байт-код генерит, или системный ассемблер использует?
H>К сожалению, используется System.Reflection.Emit.
Здравствуйте, Вестильд, Вы писали:
В>Моновский PEVerify в Nemerle.dll ничего не находит. А вот MS-ный находит одну ошибку: Value class has neither fields nor size parameter. В>Похоже, что дело в FakeVoid.
Надо задать размер структуры через атрибуты. Посмотри декомпилятором как сделано для стандартного воида в мскорлиб-е. Ну, или тупо добавить однобайтовое поле.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Вестильд, Вы писали:
В>>Моновский PEVerify в Nemerle.dll ничего не находит. А вот MS-ный находит одну ошибку: Value class has neither fields nor size parameter. В>>Похоже, что дело в FakeVoid.
VD>Надо задать размер структуры через атрибуты. Посмотри декомпилятором как сделано для стандартного воида в мскорлиб-е. Ну, или тупо добавить однобайтовое поле.
Quick fix:
[StructLayout(LayoutKind.Explicit, Size=1, Pack=0)]
public struct FakeVoid { }
Но. Я вижу 4 варианта решения:
1. Забить. Моновский PEVerify не ругается и ладно.
2. Использовать Quick fix. Но тогда всем последующим объявлениям структур без полей потребуется этот атрибут.
3. Вставить в Немерле проверку, которая будет указывать размеры Size=1, Pack=0 для таких структур. Моновский компилятор c# делает то же самое.
4. Исправить Emit в моно. Я проверил в wine, и похоже микрософтовский эмит сам размеры не указывает.
Здравствуйте, Вестильд, Вы писали:
В>4. Исправить Emit в моно. Я проверил в wine, и похоже микрософтовский эмит сам размеры не указывает.
А точно ли баг в SRE ?
Если компилятор C# ставит Size=1 явно, то и пусть Nemerle так делает.
В>На мой взгляд правильным будет вариант № 3.
Согласен.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, Вестильд, Вы писали:
В>>4. Исправить Emit в моно. Я проверил в wine, и похоже микрософтовский эмит сам размеры не указывает. _NN>А точно ли баг в SRE ?
В смысле?
Ещё раз перепроверил под виндой.
struct EmptyStruct{}
Компилируется в структуру с указанием размеров (1, 0).
Здравствуйте, Вестильд, Вы писали:
В>Если кто-нибудь тыкнет мне где примерно это исправлять, то я могу пул реквест сделать. Немерле сейчас на гитхабе разрабатывается?
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Вестильд, Вы писали:
В>>Если кто-нибудь тыкнет мне где примерно это исправлять, то я могу пул реквест сделать. Немерле сейчас на гитхабе разрабатывается?
H>Компилятор уже выявляет ситуацию с пустой структурой: H>https://github.com/rsdn/nemerle/blob/master/ncc/generation/HierarchyEmitter.n#L535
Покопал я всё это. Баг в Моно
Реализация используемой в HierarchyEmitter сигнатуры
public TypeBuilder DefineType (string name, TypeAttributes attr, Type parent, int typesize) {
return DefineType (name, attr, parent, null, PackingSize.Unspecified, TypeBuilder.UnspecifiedTypeSize);
}
Можно пофиксить в Nemerle:
в HierarchyEmitter на 550 строке указав PackingSize:
TyManager._module_builder.DefineType (FullName + generic_mark_suffix, attrs, null, 0, 1)
Но Моно, мне кажется всё равно надо исправлять. Баг очень похож на опечатку, но мало ли где он может вылезти.