bogachev-pa / rdo_studio

MIT License
0 stars 0 forks source link

Использовать IAsString в RDOValue #10

Open aurusov opened 10 years ago

aurusov commented 10 years ago

UnknownPointer удален. Теперь нужно свести интерфейс IAsString к INotify, к примеру, и спокойно использовать в RDOValue:

std::string RDOValue::onPointerAsString() const
{
    ASSERT(typeID() == RDOType::t_pointer);
    LPIAsString asString = getPointer<IAsString>();
    if (asString)
        return asString->asString();

    throw RDOValueException("Для rdo::runtime::RDOValue не определен метод getAsString()");
}

Как-то так.

bogachev-pa commented 10 years ago

Готово. https://github.com/bogachev-pa/rdo_studio/commit/23b2749ce4c0c0fe3d5d3f2cb8dfc404df952859

aurusov commented 10 years ago

Лучше к комментарию коммита добавить #10. Исправить последний коммит довольно легко. Тесты на дженкинсе прошли (хотя бы одни из 6-ти) ?

bogachev-pa commented 10 years ago

Это еще не тестил, у меня не прошли четыре модели с предыдущего пуша, сейчас смотрю ошибки. Как тут тесты пройдут, отпишу.

aurusov commented 10 years ago

Умеешь смотреть дифы для сломавшихся моделей ?

bogachev-pa commented 10 years ago

Нет, не умею. Как это делается? Я уже вроде нашел ошибку, но мне всё равно интересно.

Upd: исправил сообщение.

bogachev-pa commented 10 years ago

похоже, рефакторинг интерфейса всё-таки что-то сломал, потому что как раз не прошли тесты:

The following tests FAILED:
      5 - test_runtime_array (Failed)
      9 - test_runtime_matrix (Failed)

Немного странно, у меня модели запускаются и работают нормально. В пошаговой отладке обычных моделей заходят в правильные методы и возвращают в правильные строки. Я так понял, это тесты из папки test проекта. Какими результаты работы должны быть, там написано, а как мне можно узнать результаты, которые выдаются в моей сборке?

PS: ошибки в тех четырех моделях я исправил.

aurusov commented 10 years ago

Я уже вроде нашел ошибку, но мне всё равно интересно.

Чуток позже, завал на работе.

The following tests FAILED:

Это boost-юнит-тесты

bogachev-pa commented 10 years ago

В общем, дело вовсе не в том, что asString() возвращает что-то не то, а в том, что возникает segmentation fault. Когда я прогоняю обычные модели с массивами, ошибки почему-то не возникает. Но когда я, например, создаю вложенный ресурс и у него запрашиваю asString() эта ошибка возникает снова, причем будто на попытке вернуть m_object умного указателя. То ли я сделал неправильный интерфейс, то ли какие-то конфликты с rdo::intrusive_ptr_interface_wrapper. Я не могу понять, в чем дело.

Еще вопрос: как мне запустить test_runtime_array, ведь у него свой main.cpp? Надо как-то по-другому собирать проект?

aurusov commented 10 years ago

Я уже вроде нашел ошибку, но мне всё равно интересно.

Пусть, к примеру, не проходит тест модели event_only. Находишь ее в Сборочной директории. http://rdo.rk9.bmstu.ru:81/view/bogachev-pa_dev/job/rdo-studio-bogachev-pa-dev-ubuntu-14-04-x86-debug/ws/models/test/event/event_only/ Выкачиваешь архив (Все файлы в архиве ZIP), с помощью diff'а сравниваешь эталоны simpleModelEventOnly_etalon.trc vs simpleModelEventOnly.trc simpleModelEventOnly_etalon.trc vs simpleModelEventOnly.trc Путаешься по ним понять ошибку. Если непонятно, то можно запустить РДО в режиме отладки с этой моделью.

aurusov commented 10 years ago

Еще вопрос: как мне запустить test_runtime_array, ведь у него свой main.cpp? Надо как-то по-другому собирать проект?

project -> Properties -> Build -> Make -> Build Command -> дописать test_runtime_array

bogachev-pa commented 10 years ago

В пошаговой отладке теста с массивами уже при попытке сделать asString-> происходит то же, что я наблюдал с ресурсами. Причем первые 5-6 тестов он проходит и возвращает правильные значения, а потом на одном из последующих крашится. При этом дебаггер пытается пройтись по деструкторам объекта и падает на segmentation fault. Пока что теряюсь в догадках, из-за чего.

aurusov commented 10 years ago

Видимо, обращение по нулевому указателю.

bogachev-pa commented 10 years ago

Проблема возникает, когда имеем дело с итераторами. Например, c RDOArrayValue всё ок, а RDOArrayIterator падает. Я думаю, это из-за того, что я через IAsString отнаследовал итератор от rdo::counter_reference. Это, видимо, очень плохо и причина всех поломок.

Но как тогда реализовать интерфейс IAsString в итераторе?

aurusov commented 10 years ago

Странно, надо самому дебажить. Сейчас не могу. Попробуй

class RDOArrayIterator
    : public RDOType
    , public IAsString
    , public virtual rdo::counter_reference
bogachev-pa commented 10 years ago

Удивительно, но тесты проходят под виндой! Я только сейчас заметил.

Там падение из-за того, что две модели 'недопочинились'.

 MODEL WITH ERRORS:
../models/test\event\undef_event\from_evn\from_evn.rtestx
../models/test\resource\unknown\DZ.rtestx

Я уже выяснил, в чем проблема. Это те модели, которые должны выдавать ошибки. В моей сборке они тоже выдают ошибки, но другие. Это происходит из-за того, что поменялся порядок сверток в грамматике (из-за param_full_name) и теперь мы раньше натыкаемся на ошибку неизвестного идентификатора, чем на те, которые там ожидаются. Ошибки, выдаваемые в моей сборке, корректные, я проверял. Что вообще в такой ситуации делать?

aurusov commented 10 years ago

Именно поэтому так много тестов. И уже есть пример, что их мало. Не хватает еще двух ubuntu x64 debug/release.

По моделям. Сделай форк от моделей, внеси необходимые изменения, настрой на свой форк дженкинс.

bogachev-pa commented 10 years ago

Если откатить все изменения только из rdo_value.cpp (https://github.com/bogachev-pa/rdo_studio/commit/e5d1058d96f8df5a90dc35165483ffc8156fbf21#diff-f266519bdab861c4f84168a84f117229L1023), то никаких падений не наблюдается и все тесты правильно проходят. Это минимум того, что можно откатить. Пушить это в dev?

aurusov commented 10 years ago

Да