Неправильный exe для .net 4
От: Mumitroller Беларусь  
Дата: 28.07.11 09:00
Оценка:
Вот такой код компилируется в exe, который нормально выполняется на win64 и падает на win32.
using System;
module Program
{
  Main() : void
  {
      mutable arg;
      Test(out arg);
  }
  
  Test(arg : out Struct1) : void
  {
    arg.Field1 = if (true) "1"; else "2";
  }
  
  public struct Struct1
  {
    public mutable Field1 : string;
  }
}

Падает с внутренней ошибкой .net — что-то там про внутренние ограничения JIT, сейчас нет возможности привести точный текст.

А в Windows Events Log появляются вот такие записи:

Application: ConsoleApplication1.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an internal error in the .NET Runtime at IP 6D683A86 (6D680000) with exit code 80131506.


Faulting application name: ConsoleApplication1.exe, version: 0.0.0.0, time stamp: 0x4e3116ba
Faulting module name: clr.dll, version: 4.0.30319.1, time stamp: 0x4ba1d9ef
Exception code: 0xc0000005
Fault offset: 0x00003a86
Faulting process id: 0xd4
Faulting application start time: 0x01cc4d0009c1d15c
Faulting application path: Z:\Shared Folders\ConsoleApplication1.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll


Но, если заменить тип поля Struct1.Field1 на int, то полученный exe выполняется без ошибок на win32, а на win64 падает с NullReferenceException на строке присвоения в Test.

using System;
module Program
{
  Main() : void
  {
      mutable arg;
      Test(out arg);
  }
  
  Test(arg : out Struct1) : void
  {
    arg.Field1 = if (true) 1; else 2; // здесь NRE на win64
  }
  
  public struct Struct1
  {
    public mutable Field1 : int;
  }
}


Nemerle 1.0.0.9832 for .net 4.0
Windows 7 64 bit
Windows 7 32 bit

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re: Неправильный exe для .net 4
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.07.11 15:42
Оценка:
Здравствуйте, Mumitroller, Вы писали:

M>Вот такой код компилируется в exe, который нормально выполняется на win64 и падает на win32.

M>
using System;
M>module Program
M>{
M>  Main() : void
M>  {
M>      mutable arg;
M>      Test(out arg);
M>  }
  
M>  Test(arg : out Struct1) : void
M>  {
M>    arg.Field1 = if (true) "1"; else "2";
M>  }
  
M>  public struct Struct1
M>  {
M>    public mutable Field1 : string;
M>  }
M>}
M>

M>Падает с внутренней ошибкой .net — что-то там про внутренние ограничения JIT, сейчас нет возможности привести точный текст.

Баг в генерируемом MSIL.
Независимо от платформы PEVerify выдает следующее:

E:\MyProjects\Tests\ConsoleApplication355\ConsoleApplication355\bin\Debug>"E:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\PEVerify.
exe" ConsoleApplication355.exe

Microsoft (R) .NET Framework PE Verifier. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.

[IL]: Error: [E:\MyProjects\Tests\ConsoleApplication355\ConsoleApplication355\bin\Debug\ConsoleApplication355.exe : Program::Test][offset 0x00000003][found
address of value 'Program+Struct1'][expected value 'Program+Struct1'] Unexpected type on the stack.
[IL]: Error: [E:\MyProjects\Tests\ConsoleApplication355\ConsoleApplication355\bin\Debug\ConsoleApplication355.exe : Program::Test][offset 0x00000021][found
value 'Program+Struct1'][expected readonly address of value 'Program+Struct1'] Unexpected type on the stack.
2 Error(s) Verifying ConsoleApplication355.exe

Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Неправильный exe для .net 4
От: Mumitroller Беларусь  
Дата: 28.07.11 15:56
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Баг в генерируемом MSIL.


А что делать-то с этим? Или только ждать, пока кто-нибудь пофиксит? Сам я, к сожалению, даже в IL полный 0, не говоря уже про его генерацию. Я нашел один workaround, но он мне не очень нравится — не использовать в таких случаях match (if) как выражение. То есть писать так:
if (condition)
  arg.Field1 = "1";
else
  arg.Field2 = "2";

а не так:
arg.Field1 = if (condition) "1"; else "2";

Но мое эстетическое чувство страдает!

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[3]: Неправильный exe для .net 4
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.07.11 16:14
Оценка:
Здравствуйте, Mumitroller, Вы писали:

VD>>Баг в генерируемом MSIL.


M>А что делать-то с этим? Или только ждать, пока кто-нибудь пофиксит?


Ждать и пока не использовать out для структур.

Я записал баг на Хардкейса. Если он не сможет, то позже займусь я.

Сам я, к сожалению, даже в IL полный 0, не говоря уже про его генерацию. Я нашел один workaround, но он мне не очень нравится — не использовать в таких случаях match (if) как выражение. То есть писать так:
M>
if (condition)
M>  arg.Field1 = "1";
M>else
M>  arg.Field2 = "2";

M>а не так:
M>
arg.Field1 = if (condition) "1"; else "2";

M>Но мое эстетическое чувство страдает!

+1

Я создал баг-репорт:
https://github.com/rsdn/nemerle/issues/11

Добавь туда свой комментарий и опиши в нем workaround. Может кто-то еще же нарвется на это дело.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Неправильный exe для .net 4
От: hardcase Пират http://nemerle.org
Дата: 29.07.11 07:13
Оценка: 50 (2)
Здравствуйте, Mumitroller, Вы писали:

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


VD>>Баг в генерируемом MSIL.


M>А что делать-то с этим? Или только ждать, пока кто-нибудь пофиксит?


Фикс будет на днях (уже готов), помимо него будет улучшена кодогенерация (в процессе).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Неправильный exe для .net 4
От: Mumitroller Беларусь  
Дата: 29.07.11 07:33
Оценка: 1 (1)
Здравствуйте, VladD2, Вы писали:

VD>Я создал баг-репорт:

VD>https://github.com/rsdn/nemerle/issues/11

VD>Добавь туда свой комментарий и опиши в нем workaround. Может кто-то еще же нарвется на это дело.


Добавил.

Кстати, out-параметр оказался невиноват — та же беда и в таком коде:

using System;
module Program
{
  Main() : void
  {
    def a = Struct1();
    a.Field1 = if (true) 1; else 2;
  }
  
  public struct Struct1
  {
    public mutable Field1 : int;
  }
}

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[4]: Неправильный exe для .net 4
От: Mumitroller Беларусь  
Дата: 29.07.11 07:44
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Фикс будет на днях (уже готов), помимо него будет улучшена кодогенерация (в процессе).


Круто!

А какой-нибудь очередной релиз-кандидат будет? Или придется собирать компилятор самостоятельно?

И еще один вопрос — в master уже 16 дней никто не коммитит, все работают со своими ветками. Влад в своей ветке пофиксил ряд проблем, но пока непонятно, будет ли он мержить эти изменения в master, а если будет, то когда. Получается, чтобы собрать компилятор со всеми фиксами, надо сначала самостоятельно смержить все изменения из разных веток. А возможно, еще и открытые пул-реквесты. Неудобно как-то...

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[5]: Неправильный exe для .net 4
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.07.11 10:08
Оценка:
Здравствуйте, Mumitroller, Вы писали:

M>А какой-нибудь очередной релиз-кандидат будет? Или придется собирать компилятор самостоятельно?


Скоро будет бэта 1 для .Net 4 и VS 2010. Все запланированное работает весьма сносно, но не готов инсталлятор.

M>И еще один вопрос — в master уже 16 дней никто не коммитит, все работают со своими ветками. Влад в своей ветке пофиксил ряд проблем, но пока непонятно, будет ли он мержить эти изменения в master, а если будет, то когда.


Будет. Убедится что все ОК, и будет .

M>Получается, чтобы собрать компилятор со всеми фиксами, надо сначала самостоятельно смержить все изменения из разных веток.


Вот это делать не надо. Можно собирать исходники из конкретной ветки. Но мерджить ничего не надо. Ничего хорошего не получится.

Можно использовать ветку VladD2_work. Там сейчас последние изменения. Когда солью ее с мастером, то можно будет брать и мастера. Вообще, ветка мастер предпочительна. В ней обычно находится только проверенный код. В других ветках код может даже не компилироваться. Сейчас в VladD2_work более-менее рабочий код (тесты проходят).

M>А возможно, еще и открытые пул-реквесты. Неудобно как-то...


Открыты, значит еще не принятые. На них вообще внимания не стоит обращать. Хочется с ними поработать — делай клон форка в котором пул-реквест создавался.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Неправильный exe для .net 4
От: Mumitroller Беларусь  
Дата: 02.08.11 07:42
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Фикс будет на днях (уже готов)


Работает! Спасибо!

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[5]: Неправильный exe для .net 4
От: hardcase Пират http://nemerle.org
Дата: 02.08.11 10:01
Оценка:
Здравствуйте, Mumitroller, Вы писали:

M>Работает! Спасибо!


Всегда пожалуйста. С улучшением кодогенерации оказалось нескольок сложнее (времени нехватило), но я её вылечу (позволит уменьшить количество локальных переменных, которые компилятор генерирует по чем зря).
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.