понедельник, 16 ноября 2009 г.

Первое сообщение и проблемы с Socket в haXe/cpp

Приветствую всех. О жизни я обычно пишу в ЖЖ, а о работе в Жуйк. Однако в жуйк не всегда помещается все, что хочется написать, по этому я решил завести «большой» блог. На супер статьи не претендую, однако постараюсь осветить здесь те технологические проблемы, с которыми сталкиваюсь сам.

Что бы не плодить сообщения, перейду сразу же к делу. Думаю, что читателю известно, что компилятор языка haXe имеет C++ бэкэнд. То есть исходный код haXe транслируется в C++ код, что бы затем быть скомпилированным в машинный. Сейчас я экспериментирую с haXe, как с серверным языком, но изначально пишу все под NekoVM, но как-то на днях решил попробовать скомпилировать свои поделки в машинный код, ведь API стандартной библиотеки haXe/cpp совместимо с API haXe/neko.

Значит есть у меня сервер, клиент (haXe/Flash9), и бот, что бы нагрузочно тестить. Сервер у меня не собрался вообще, но с этим я пока не разбирался, клиент собирать не пробовал (хотя такая возможность есть за счёт библиотеки Neash), а бот нормально собрался, но работать не захотел.

Runtime error:
Terminal error not bytebuffer, File.//libs/std/Socket.cpp, line 186

Начал рыться в исходниках стандартной библиотеки (в этом самом Socket.cpp), но ничего не нашёл. Оказалось, что ошибка находится в SocketOutput.hx. В нативную функцию записи буффера вместо буффера передаётся ссылка на функцию Bytes.getData (). Совершенно глупая опечатка: автор забыл скобки! Между прочим этот случай раскрывает прелесть динамической типизации:) Нативные функции загружаются как динамический объект, по этому мы не имеем проверки типов аргументов во время компиляции.

Создаётся ощущение, что библиотеку не тестировали вообще. В этом есть минус opensource: ребята пишущие cpp бэкэнд просто не сталкивались с записью данных в сокет через Output, а пользовались writeString, по этому целый кусок кода оказался не оттестированным. Самое интересное, что их нельзя за это винить, ведь они пишут библиотеку для себя и делают свой вклад, не обязуясь создать безглючный «продукт». С другой стороны это плюс opensource: каждый может взять исходный код и исправить инструмент под свои нужды. Хорошо, когда открытость сочетается с enterprise-качеством.

Мой патч исправляющий проблему: http://hxcpp.googlecode.com/issues/attachment?aid=-7013333957780095441&name=socketoutput.patch

0 коммент.:

Отправить комментарий