Ошибка IronPython, связанная с длинными логическими выражениями? - PullRequest
3 голосов
/ 07 января 2011

Кажется, здесь происходит что-то смешное. Используя IronPython 2.6.2 для .NET 4.0, я получаю следующее поведение. Простейший случай выглядит следующим образом:

  1. Запускаю интерактивную оболочку
  2. Я набираю следующую строку 5 раз

    False or False or False or False or False or False or \
    
  3. Затем я заканчиваю его следующей строкой

    False or False or False or False or False or False
    

Когда я набираю это, процесс отработал 30 минут ЦП на довольно хорошем рабочем столе и до сих пор не вернулся.

Если я уменьшу шаг 2 на 1, т.е. получу строку в 4 раза, то она вернется через минуту или две.

Если я уменьшу шаг 2 на 2, т.е. есть линия 3 раза, затем она возвращается примерно через секунду или около того.

Так что же происходит и почему?

Конечно, пример из реального мира, который заставил меня выделить это, гораздо более сложный и не столь легкомысленный.

Спасибо Акил

1 Ответ

1 голос
/ 07 января 2011

Я бы предложил открыть ошибку на CodePlex.Здесь происходит то, что узел IronPython OrExpression AST пытается определить его тип.Чтобы сделать это, он смотрит на тип левой руки и тип правой руки.Если они одинаковые, OrExpression создаст выражение типа слева - что проверяется снова.Этот 2-ой призыв - главным образом то, что заставляет это расти пропорционально.Простое изменение OrExpression.cs с:

return _left.Type == _right.Type ? _left.Type : typeof(object);

на:

Type lType = _left.Type;
return lType == _right.Type ? lType : typeof(object);

решает проблему.

...