пытаюсь протестировать Release версию своей либы, и получаю неадекватное исключение.
код
public calc_alloc[T]() : int
def delta = root.d_new
root.d_new += Memblock.Create.[T](1).size //exception: Null Reference
delta
описание Мемblock
public struct Memblock
static public delta : int = Marshal.SizeOf(typeof(Memblock))
static public Create[T](count: int) : Memblock
Memblock(count * SizeOf.[T]())
static public Create[T]() : Memblock
Memblock(SizeOf.[T]())
static public SizeOf[T]() : int/*Marshal.Size(char) == 2 for russian letters and
generic type has to be calculating*/def type = typeof(T)
if (type.Equals(typeof(char)))
2
else
if (type.IsGenericType)
Marshal.SizeOf(default(T))
else
Marshal.SizeOf(type)
length: int
this(len : int)
length = len
в общем это структура безо всяких указателей. откуда оно нашло Null Reference — мне сильно непонятно.
Debug — все ок. в момент исключения T — чистая структура.
Здравствуйте, _Claus_, Вы писали:
_C_>пытаюсь протестировать Release версию своей либы, и получаю неадекватное исключение.
_C_>в общем это структура безо всяких указателей. откуда оно нашло Null Reference — мне сильно непонятно. _C_>Debug — все ок. в момент исключения T — чистая структура.
_C_>в общем это структура безо всяких указателей. откуда оно нашло Null Reference — мне сильно непонятно. _C_>Debug — все ок. в момент исключения T — чистая структура.
тут оказалось еще хуже — даже в таком варианте Null Reference.
root.d_new += 5//Memblock.Create.[T](1).size
а root у меня — поле в классе с таким описанием
mutable root : InnerDbRoot
а его описание:
public struct InnerDbRoot
public mutable d_free : int
public mutable d_new : int
public mutable d_root_obj : int
public mutable types : int
public mutable bases : int
и какой тут Null Exception, когда я внутри вызова обычного метода??
_C_>тут оказалось еще хуже — даже в таком варианте Null Reference.
Ты можешь локализовать проблему, чтобы на примере я мог скомпилировать и посмотреть что происходит в компиляторе? Попробуй изложить это в иссью, я постараюсь посмотреть, вообще проблемы с Release и Debug версиями действительно могут быть, сам недавно видел одну из них, там может сильно меняться обработка компилятора, оптимизации, какие то из них реже проверяются потому что разработчики обычно собирают Debug версию. Так что не удивляйся, а запость свою проблему на гите и в скором времени постараемся исправить.
_C_>>в общем это структура безо всяких указателей. откуда оно нашло Null Reference — мне сильно непонятно. _C_>>Debug — все ок. в момент исключения T — чистая структура.
Ты уверен что NRE? Я вижу тут InvalidOperationException и не только в релизе, он появляется когда запускается метод calc_alloc() не заходя внутрь. Пример воспроизводится так:
using Nemerle;
using System.Console;
public struct InnerDbRoot
{
public mutable d_new : int;
}
public class Dbx
{
root : InnerDbRoot;
public calc_alloc() : void
{
root.d_new += 5;
}
// public calc_alloc2() : void
// {
// root.d_new = 5; // compilation error
// }
}
module Test
{
Main() : void
{
def d = Dbx();
d.calc_alloc(); // exception is here
}
}
Тут дело в обращении к полю, я разбираюсь в чем дело, там что то с генерацией кода, закоментированный метод вообще не компилируется. Точно ты видишь NRE, а не более серьезное исключение? И наверное придется еще одну иссью заводить для закоментированного примера. Похоже у нас всегда были проблемы со структурами, надо их доделывать. А как воркэраунд, ты пока можешь поискать более безопасные способы, типа свойств и классов.
CU>Тут дело в обращении к полю, я разбираюсь в чем дело, там что то с генерацией кода, закоментированный метод вообще не компилируется. Точно ты видишь NRE, а не более серьезное исключение? И наверное придется еще одну иссью заводить для закоментированного примера. Похоже у нас всегда были проблемы со структурами, надо их доделывать.
Создал чистый проект (до этого просто добавлял тест код в рабочий) с описанным примером в Issue.
Для моего примера в Release всегда NRE. root хоть mutable хоть нет.
C твоим вызовом
public calc_alloc() : void
{
root.d_new += 5;
}
то же самое. NRE в обоих случаях. использую твой билд с патчем на match.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, CodingUnit, Вы писали:
VD>При изменении значений полей структур изменяется вся структура целиком. ПО сему поле в которой она находится не может быть неизменяемым.
Почему это работает в C#? Может стоит дать соотв. сообщение об ошибке, а не исключение в рантайме?
Здравствуйте, _Claus_, Вы писали:
_C_>понял я, что ошибка не в структурах, а в операторах.
_C_>если "+= x" заменить на "= delta + x" все нормально.
_C_>еще глючный в релизе оператор ::= , с ним тоже развернутая замена "= x :: lst" помогла.
Тут несколько проблем, заведи что увидишь для каждой отдельную иссью, они не должны уходить из внимания.
VD>>При изменении значений полей структур изменяется вся структура целиком. ПО сему поле в которой она находится не может быть неизменяемым.
CU>Почему это работает в C#? Может стоит дать соотв. сообщение об ошибке, а не исключение в рантайме?
структура как цельный объект данных и должна защищаться от изменений def-ом. иначе быть не должно.
Здравствуйте, _Claus_, Вы писали:
_C_>понял я, что ошибка не в структурах, а в операторах. _C_>если "+= x" заменить на "= delta + x" все нормально. _C_>еще глючный в релизе оператор ::= , с ним тоже развернутая замена "= x :: lst" помогла.
Похоже проблемы с кэшированием в операторах. Странно, так как его еще 4 годна назад делали.
Можешь написать минимальный пример воспроизводящий ошибку?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, _Claus_, Вы писали:
_C_>структура как цельный объект данных и должна защищаться от изменений def-ом. иначе быть не должно.
Я никак не могу воспроизвести ошибку NRE, у меня на последнем мастере и последнем nighly 468, ошибки возникают так:
Этот код дает InvalidProgramException во время вызова метода в рантайме только в Release, в Debug проходит:
using Nemerle;
using System.Console;
public struct InnerDbRoot
{
public mutable d_new : int;
}
public class Dbx
{
mutable root : InnerDbRoot;
public calc_alloc() : void
{
root.d_new += 5;
}
}
module Test
{
Main() : void
{
def d = Dbx();
d.calc_alloc(); //Exception there InvalidProgramException!
}
}
Без мутабл root наверное правильно не должно компилироваться, но почему то компилируется и возникает исключение и в Debug и в Release InvalidProgramException в рантайме. Хотя если += заменить на = и оставить mutable, то компилироваться не будет, хотя поведение примерно одно и тоже, все верно, но только не очень неинформативное сообщение. Где то закрались ошибки, надо создать несколько иссью. Попробуй собрать на nightly 468 что ты увидишь? все же у тебя довольно старая версия, там много было поправлено. Если подтвердится моя версия тогда иссью надо будет преобразовать в другую и назвать по другому.
CU> все же у тебя довольно старая версия, там много было поправлено. Если подтвердится моя версия тогда иссью надо будет преобразовать в другую и назвать по другому.
скачал последний 583 билд — свежее не бывает. сбилдил. все на месте. видел NRE своими глазами.. только что.
Здравствуйте, _Claus_, Вы писали:
_C_>понял я, что ошибка не в структурах, а в операторах.
Я вроде исправил этот баг #275, у меня сейчас не возникает исключение, попробуй скачать исходники, собери и проверь есть ли исключение в твоих случаях?
CU>Я вроде исправил этот баг #275, у меня сейчас не возникает исключение, попробуй скачать исходники, собери и проверь есть ли исключение в твоих случаях?
При сборке из сырцов имею ошибку. VS2010 SDK стоит. чего может не хватать?
C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\VSSDK\Microsoft.VsSDK.tar
gets(420,5): error : Адресат вызова создал исключение. [C:\MyProjects\nemerle\s
nippets\VS2010\Nemerle.VisualStudio\Nemerle.VisualStudio.csproj]
Построение проекта "C:\MyProjects\nemerle\snippets\VS2010\Nemerle.VisualStudio\
Nemerle.VisualStudio.csproj" завершено (целевые объекты Build) с ошибкой.
Построение проекта "C:\MyProjects\nemerle\NemerleAll.nproj" завершено (целевые
объекты DevBuildQuick) с ошибкой.
Не удалось выполнить построение.
"C:\MyProjects\nemerle\NemerleAll.nproj" (целевой объект DevBuildQuick ) (1) ->
"C:\MyProjects\nemerle\snippets\VS2010\Nemerle.VisualStudio\Nemerle.VisualStudi
o.csproj" (целевой объект Build ) (12) ->
(Целевой объект DeployVsixExtensionFiles) ->
C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\VSSDK\Microsoft.VsSDK.t
argets(420,5): error : Адресат вызова создал исключение. [C:\MyProjects\nemerle
\snippets\VS2010\Nemerle.VisualStudio\Nemerle.VisualStudio.csproj]
CU>>Я вроде исправил этот баг #275, у меня сейчас не возникает исключение, попробуй скачать исходники, собери и проверь есть ли исключение в твоих случаях?
_C_>При сборке из сырцов имею ошибку. VS2010 SDK стоит. чего может не хватать?
Там может надо удалить сборку которая была поставлена с инсталлятора, то есть удалить Nemerle с интеграцией через Add/Remove и собрать отдельно через DevBuildQuick4. Но вообще более полные сообщения приводи, тут часть только.
CU>Там может надо удалить сборку которая была поставлена с инсталлятора, то есть удалить Nemerle с интеграцией через Add/Remove и собрать отдельно через DevBuildQuick4. Но вообще более полные сообщения приводи, тут часть только.
Сообщение полное. Удаление установленной интеграции помогло. Патч работает — все ок.