IL в Mono
От: Вестильд Россия  
Дата: 14.03.15 11:08
Оценка:
Я продолжаю возиться со сборкой 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. Желательно про типы, метаданные и прочее, а не про сами ассемблерные инструкции.
Re: IL в Mono
От: hardcase Пират http://nemerle.org
Дата: 14.03.15 11:16
Оценка:
Здравствуйте, Вестильд, Вы писали:

В>Я продолжаю возиться со сборкой 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
/* иЗвиНите зА неРовнЫй поЧерК */
Отредактировано 14.03.2015 11:18 hardcase . Предыдущая версия .
Re: IL в Mono
От: hardcase Пират http://nemerle.org
Дата: 14.03.15 11:21
Оценка:
Здравствуйте, Вестильд, Вы писали:

В>Дизасемблирование собранной под моно Nemerle.dll из Stage4 даёт

В>
В>.namespace Nemerle
В>{
В>  .class public sequential ansi sealed beforefieldinit FakeVoid
В>      extends [mscorlib]System.ValueType
В>  {

В>  } // end of class Nemerle.FakeVoid
В>}
В>


Вполне возможно, что нужно в компиляторе добавить автоматическое навешивание StructLayout атрибута с параметром Size = 1 для структур без полей.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: IL в Mono
От: Вестильд Россия  
Дата: 14.03.15 11:33
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Вестильд, Вы писали:


В>>Я продолжаю возиться со сборкой Nemerle в Mono. Видимые косяки xbuild-а я вроде бы поборол (правда пулреквест 2 месяца уже висит ).


H>Давай ссылку на пулреквест, посмотрим.


https://github.com/mono/mono/pull/1484
Re[2]: IL в Mono
От: Вестильд Россия  
Дата: 14.03.15 11:54
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Вполне возможно, что нужно в компиляторе добавить автоматическое навешивание StructLayout атрибута с параметром Size = 1 для структур без полей.


Пожалуй.
Скачал свежие бинарники, в них
    .pack 0
    .size 1


А в собранном из свежих сорцов всё прежнему.

Nemerle сам байт-код генерит, или системный ассемблер использует?
Re[3]: IL в Mono
От: hardcase Пират http://nemerle.org
Дата: 14.03.15 15:21
Оценка:
Здравствуйте, Вестильд, Вы писали:

В>Nemerle сам байт-код генерит, или системный ассемблер использует?


К сожалению, используется System.Reflection.Emit.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: IL в Mono
От: Вестильд Россия  
Дата: 14.03.15 19:42
Оценка: +1
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Вестильд, Вы писали:


В>>Nemerle сам байт-код генерит, или системный ассемблер использует?


H>К сожалению, используется System.Reflection.Emit.


Получается скорее баг в моновском эмите?
Re[5]: IL в Mono
От: _NN_ www.nemerleweb.com
Дата: 14.03.15 21:42
Оценка:
Здравствуйте, Вестильд, Вы писали:

В>Получается скорее баг в моновском эмите?

Это будет неудивительно.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: IL в Mono
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.03.15 15:19
Оценка:
Здравствуйте, Вестильд, Вы писали:

В>Моновский PEVerify в Nemerle.dll ничего не находит. А вот MS-ный находит одну ошибку: Value class has neither fields nor size parameter.

В>Похоже, что дело в FakeVoid.

Надо задать размер структуры через атрибуты. Посмотри декомпилятором как сделано для стандартного воида в мскорлиб-е. Ну, или тупо добавить однобайтовое поле.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: IL в Mono
От: Вестильд Россия  
Дата: 16.03.15 19:44
Оценка:
Здравствуйте, 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, и похоже микрософтовский эмит сам размеры не указывает.

На мой взгляд правильным будет вариант № 3.
Re[3]: IL в Mono
От: _NN_ www.nemerleweb.com
Дата: 16.03.15 19:54
Оценка:
Здравствуйте, Вестильд, Вы писали:

В>4. Исправить Emit в моно. Я проверил в wine, и похоже микрософтовский эмит сам размеры не указывает.

А точно ли баг в SRE ?
Если компилятор C# ставит Size=1 явно, то и пусть Nemerle так делает.

В>На мой взгляд правильным будет вариант № 3.

Согласен.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: IL в Mono
От: Вестильд Россия  
Дата: 17.03.15 09:45
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, Вестильд, Вы писали:


В>>4. Исправить Emit в моно. Я проверил в wine, и похоже микрософтовский эмит сам размеры не указывает.

_NN>А точно ли баг в SRE ?
В смысле?

Ещё раз перепроверил под виндой.
struct EmptyStruct{}

Компилируется в структуру с указанием размеров (1, 0).

            AssemblyName aName = new AssemblyName("EmptyStruct");
            AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Save);

            ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");

            mb.DefineType(
                "EmptyStruct",
                 TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.SequentialLayout | TypeAttributes.BeforeFieldInit,
                 typeof(ValueType)).CreateType();

            ab.Save(aName.Name + ".dll");


Генерирует сборку с классом без указания размеров и peverify на неё ругается.

Так что:

_NN>Если компилятор C# ставит Size=1 явно, то и пусть Nemerle так делает.


В>>На мой взгляд правильным будет вариант № 3.

_NN>Согласен.

Если кто-нибудь тыкнет мне где примерно это исправлять, то я могу пул реквест сделать. Немерле сейчас на гитхабе разрабатывается?

Там только нюанс: через атрибут это делать, или явно через параметры DefineType?
Re[5]: IL в Mono
От: hardcase Пират http://nemerle.org
Дата: 17.03.15 13:06
Оценка:
Здравствуйте, Вестильд, Вы писали:

В>Если кто-нибудь тыкнет мне где примерно это исправлять, то я могу пул реквест сделать. Немерле сейчас на гитхабе разрабатывается?


Компилятор уже выявляет ситуацию с пустой структурой:
https://github.com/rsdn/nemerle/blob/master/ncc/generation/HierarchyEmitter.n#L535
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: IL в Mono
От: Вестильд Россия  
Дата: 17.03.15 19:43
Оценка: +1 :))
Здравствуйте, 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)

Но Моно, мне кажется всё равно надо исправлять. Баг очень похож на опечатку, но мало ли где он может вылезти.
Re[7]: IL в Mono
От: hardcase Пират http://nemerle.org
Дата: 18.03.15 12:29
Оценка:
Здравствуйте, Вестильд, Вы писали:

В>Здравствуйте, hardcase, Вы писали:

В>Реализация используемой в HierarchyEmitter сигнатуры
В>
В>        public TypeBuilder DefineType (string name, TypeAttributes attr, Type parent, int typesize) {
В>            return DefineType (name, attr, parent, null, PackingSize.Unspecified, TypeBuilder.UnspecifiedTypeSize);
В>        }
В>


Добавил указание PackingSize: https://github.com/rsdn/nemerle/commit/79f1911ac39cd9ca322e1288a0db9b75ab8ddbf0
Сдается мне, если бы компилятор C# выявлял в коде неиспользуемые переменные, подобная глупость бы не попала бы в релиз Mono.
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.