avva: (Default)
[personal profile] avva
Играюсь с исходниками Мозиллы (Firebird).

Какое ужасно запутанное, сложное дерево, сам чёрт голову сломит. Сгрузил самый свежий код из CVS, построил debug-версию. Запускается. Захотел сделать так, чтобы оно пользовалось не моей директорией профиля $HOME/.phoenix, а какой-нибудь другой, скажем, $HOME/.phoenix-devel . Довольно скромное пожелание, правда? Почти час провозился, пока заставил его. Главное, нашёл код, который открывает или создаёт директорию профиля. В Юниксе он берёт $HOME и добавляет к нему DEFAULT_PRODUCT_DIR, который устанавливается в MOZ_USER_DIR, который всегда ".mozilla", и в Firebird тоже. Но чёрт побери, оно ж использует директорию .phoenix всё-таки, и всё там создаёт/редактирует. Я туда, сюда, захожу в gdb, отлавливаю вызовы этой функции — ну да, исправно вызывается много раз и всем говорит "$HOME/.mozilla", а используется тем не менее .phoenix. Что за чёрт? Ну хорошо, делаю глобальный поиск ".phoenix" по всему дереву, ничего интересного не нахожу. Делаю поиск по "phoenix", тоже ничего интересного не нахожу. Мистика. Что он его, по буквам собирает?

Тут я заметил, что директорию $HOME/.mozilla он-таки исправно создаёт при каждом запуске, если я её удаляю. Но всё равно не использует, а испольует .phoenix. Я разозлился окончательно, удалил .phoenix, чтобы заставить его создать, запустил под gdb, и поставил breakpoint на mkdir(2). Вот это не обойдёшь, сволочь. И поймал-таки момент создания, проследил stack trace, и что оказывается? Это идёт от другой функции GetProductDirectory, в совершенно другом месте, классе, файле и модуле, но почти точной копии той, первой, которая, видимо, устарела (но почему вызывается двадцать раз во время работы?). Эта фунцкия, однако, не вставляет зафигаченное в compile-time значение ".mozilla", а добавляет к $HOME значение mProductDir, а его откуда берёт? А вот откуда:

mProductDir.Assign(NS_LITERAL_CSTRING(".") + aProductName);
ToLowerCase(mProductDir);


Естественно, aProductName в совсем другом месте определяется как "Phoenix", в результате выходит .Phoenix, а после вызова ToLowerCase — искомый .phoenix. Неудивительно, что я не смог это глобальным грепом найти!

Извращенцы чёртовы.


Главное, у них постоянно такое. Куча кода повторяется два раза, с какими-то мелкими изменениями, и поди разбери, какая из двух версий или какой из двух классов "настоящий", учитывая ещё, что оба компилируются и иногда оба вызываются во время работы программы, только один из них — "по историческим причинам". Необходима радикальная чистка авгиевых конюшен. And don't get me started on their build process.

Date: 2004-01-11 02:44 pm (UTC)
From: [identity profile] meshko.livejournal.com
Нет, я как раз в Яве и делал, но там практически ничего толком сделано не было. Ява для это действительно, наверное, лучше -- там мощные механизмы для reflection.
Но хватит об этом, мне грустно об этом вспоминать :)

January 2026

S M T W T F S
    1 2 3
4 5678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 5th, 2026 10:35 pm
Powered by Dreamwidth Studios