DeaDDooMER» Не знаю. Но явно что-то не так было с указателями. Было ведь разыменование nil. По идее,
nil в аргументах там мог появиться только от их значений по умолчанию. Вот сигнатура до твоего коммита:
Code:
function sweepAABB (mex0, mey0, mew, meh: Integer; medx, medy: Integer; itx0, ity0, itw, ith: Integer;
u0: PSingle=nil; hitedge: PSweepEdge=nil; u1: PSingle=nil;
hitx: PInteger=nil; hity: PInteger=nil): Boolean;
У меня есть одно подозрение. После параметра
u0 там идёт указатель
hitedge, который никогда не передаётся аргументом, то есть является всегда равным
nil. В таком случае ему в начале функции присваивается адрес запасной переменной
htt, чтобы не городить лишние if'ы непосредственно во вложенной функции
axisOverlap() - из-за этого конвейер сбрасывается. Возможно, проблема в том, что переменная
htt каким-то образом оказывается не выровнена, а в ARM с этим строго.
Если можешь - проверь, пожалуйста, так ли это. Достаточно, по идее, оба присваивания
hitedge^ в
axisOverlap() тупо заменить на
Unaligned(hitedge)^. Или какой-нибудь
{$PACKENUM 0} рядом воткнуть, я не знаю.
Другое предположение состоит в том, что компилятор при оптимизации может выкидывать переменную
htt как assigned but never used. Либо же проблема действительно с выравниванием, но не у
hitedge, а у
@u0 при вызове этой функции. Ты заменил его на
out - вот и работает теперь. Тоже можно проверить, заменив
u0^ на
Unaligned(u0)^. Просто хочется понять причину этого косяка, чтобы в дальнейшем подобного не допускать.