В последних билдах PEVerify выдает предупреждения (8651):
C:\Program Files\Nemerle>peverify Nemerle.Compiler.dll
Microsoft (R) .NET Framework PE Verifier. Version 3.5.30729.1
Copyright (c) Microsoft Corporation. All rights reserved.
[IL]: Error: [C:\Program Files\Nemerle\Nemerle.Compiler.dll : Nemerle.Compiler.LibraryReference+ExternalTypeInfo::imembe
r_of_memberinfo][offset 0x000000BC][found ref 'Nemerle.Compiler.MemberInfo'][expected ref 'Nemerle.Compiler.IMember'] Un
expected type on the stack.
1 Error(s) Verifying Nemerle.Compiler.dll
По адресу 0xbc находится инструкция ret, на нее переходят все ветки.
Чуть позже попробую
ExternalMethodInfo (tenv, library, m :> SR.MethodBase) :> IMember
Теперь второй ахтунг:
C:\Program Files\Nemerle>peverify Nemerle.MSBuild.Tasks.dll
Microsoft (R) .NET Framework PE Verifier. Version 3.5.30729.1
Copyright (c) Microsoft Corporation. All rights reserved.
[IL]: Error: [C:\Program Files\Nemerle\Nemerle.MSBuild.Tasks.dll : Nemerle.Tools.MSBuildTask.Ext::Append][offset 0x00000
001] Method is not visible.
[IL]: Error: [C:\Program Files\Nemerle\Nemerle.MSBuild.Tasks.dll : Nemerle.Tools.MSBuildTask.Ext::AppendSwitchIfNotNull]
[offset 0x00000096] Method is not visible.
2 Error(s) Verifying Nemerle.MSBuild.Tasks.dll
Это ни как не связано с тем, что статические классы (Ext объявлен как module) в Nemerle можно наследовать от любых других (отличных от object)?
В C# это запрещено...
Здравствуйте, hardcase, Вы писали:
H>В последних билдах PEVerify выдает предупреждения (8651):
Не только в последних, насколько я помню.
H>
H>[IL]: Error: [C:\Program Files\Nemerle\Nemerle.Compiler.dll : Nemerle.Compiler.LibraryReference+ExternalTypeInfo::imembe
H>r_of_memberinfo][offset 0x000000BC][found ref 'Nemerle.Compiler.MemberInfo'][expected ref 'Nemerle.Compiler.IMember'] Un
H>expected type on the stack.
H>
Тут, насколько помню происходит следующее: ncc видит, что не надо делать преобразование типа и кладёт во всех ветках на не-совсем-типизированный стек значение. В то время как у верификатора по стандарту есть алгоритм вывода типов ячеек стека, который выводит по первым веткам не интерфейс IMember, а общий класс MemberInfo, а потом находит противоречие с ним. Собственно hint на первой ветке не случайно, алгоритм вывода типов Nemerle тут тоже бы ошибся, но при этом хинт не достигает IL.
В багтрекере это есть, ссылку сходу не дам.
H>
H>[IL]: Error: [C:\Program Files\Nemerle\Nemerle.MSBuild.Tasks.dll : Nemerle.Tools.MSBuildTask.Ext::Append][offset 0x00000
H>001] Method is not visible.
H>[IL]: Error: [C:\Program Files\Nemerle\Nemerle.MSBuild.Tasks.dll : Nemerle.Tools.MSBuildTask.Ext::AppendSwitchIfNotNull]
H>[offset 0x00000096] Method is not visible.
H>
Тут мы в статическом методе зовём protected базовый метод, чего вообще-то делать нельзя и тут кривой дизайн, ну или мягче, несовместимость расширяемости наследованием и методами-расширениями.
Да, забыл добавить, что это довольно важные сообщения об ошибках верификации, они лишь по счастливой случайности не проверяются в рантайме, а то получили бы invalid program exception, также ещё имеем шанс его получить в какой-нибудь новой версии .Net.
Здравствуйте, hardcase, Вы писали:
H>В последних билдах PEVerify выдает предупреждения (8651):
Он выдавал эти предупреждения и года полтора назад, когда я писал первую версию сборочного скрипта NemerleAll.nproj. Собственно именно по этой причине в скрипте ошибки верификации трактуются как предупреждения. Когда проблема будет решена, нужно будет подправить скрипт.
Здравствуйте, Иванков Дмитрий, Вы писали:
ИД>Здравствуйте, hardcase, Вы писали:
H>>В последних билдах PEVerify выдает предупреждения (8651): ИД>Не только в последних, насколько я помню.
H>>
H>>[IL]: Error: [C:\Program Files\Nemerle\Nemerle.Compiler.dll : Nemerle.Compiler.LibraryReference+ExternalTypeInfo::imembe
H>>r_of_memberinfo][offset 0x000000BC][found ref 'Nemerle.Compiler.MemberInfo'][expected ref 'Nemerle.Compiler.IMember'] Un
H>>expected type on the stack.
H>>
ИД>Тут, насколько помню происходит следующее: ncc видит, что не надо делать преобразование типа и кладёт во всех ветках на не-совсем-типизированный стек значение. В то время как у верификатора по стандарту есть алгоритм вывода типов ячеек стека, который выводит по первым веткам не интерфейс IMember, а общий класс MemberInfo, а потом находит противоречие с ним. Собственно hint на первой ветке не случайно, алгоритм вывода типов Nemerle тут тоже бы ошибся, но при этом хинт не достигает IL. ИД>В багтрекере это есть, ссылку сходу не дам.
Дело было в оптимизации устраняющей "лишниие" up cast-ы. Сделал тупо — если тип к которому требуется приведение типов — это интерфейс, то эмитить up cast. Не знаю дает ли эта оптимизация что-то для скорости. Если — да, то мое решение не самое эффективное, так как приводит к тому, что в некоторых случаях (когда базовый класс реализует интерфейс) будут лишние up cast-ты. Но думаю, что это все фигня.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Починил в ревисии 9021.
Да... тест я не написал, так как там нужно как-то программно поднять апи PEVerify-я и им проверить тестовую сбрку. У меня на это просто не было времени. Плиз, добавь такой тест, если не сложно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, VladD2, Вы писали:
VD>>Починил в ревисии 9021.
VD>Да... тест я не написал, так как там нужно как-то программно поднять апи PEVerify-я и им проверить тестовую сбрку. У меня на это просто не было времени. Плиз, добавь такой тест, если не сложно.
А может стоит все тесты проверять через PEVerify ?