Skip to content

Слой 1: остаток по глобальным буферам -- 258 файлов, 5323 обращения #3814

Description

@bylins

Не к работе сейчас. Замер и раскладка на будущее, чтобы не считать заново. Открытых PR и так хватает на тестирование; браться — когда Стрибог решит. Родительская задача — #3807.

Слой 1 из #3807 — вынести глобальные буферы buf, buf1, buf2, arg, smallBuf (utils.h:638) из кода. Ниже — что остаётся после первых трёх файлов (#3813).

Сколько осталось

Считано без комментариев и без файлов, где переменная с таким именем объявлена локально:

258 файлов, 5323 обращения. Тремя разобранными файлами снято 190 — 3,5%.

вхождений подсистема
1974 engine/ui — команды игрока и богов
879 gameplay/mechanics
800 engine/olc
391 engine/scripting
201 gameplay/skills
179 gameplay/economics
123 engine/core
102 gameplay/communication
98 administration/punishments.cpp
88 gameplay/clans
69 gameplay/crafting
63 gameplay/fight

Тяжеловесы

вхождений файл
563 engine/scripting/dg_scripts.cpp
398 engine/ui/cmd_god/do_stat.cpp
237 engine/olc/oedit.cpp
212 engine/olc/medit.cpp
169 gameplay/mechanics/obj_sets_olc.cpp
149 gameplay/mechanics/identify.cpp
147 engine/olc/zedit.cpp
137 engine/ui/cmd/do_score.cpp
110 engine/olc/redit.cpp
99 engine/ui/cmd_god/do_show.cpp
98 administration/punishments.cpp
89 gameplay/clans/house.cpp
87 gameplay/mechanics/named_stuff.cpp

Самое выгодное

162 файла содержат от одного до двенадцати обращений — суммарно 817. Каждый закрывается за один заход и навсегда уходит из списка. Часть — вообще холостые: в do_kill.cpp, bash.cpp, manadrain.cpp глобальный arg используется один раз как временное хранилище под one_argument, и заменяется локальной строкой.

Предлагаемый порядок (когда дойдут руки)

  1. Пачки «однострочников» — по подсистемам, один PR на пачку. Например, все gameplay/skills: 201 вхождение больше чем в двадцати файлах, правка механическая, риск близок к нулю.
  2. Команды, которые видит игрокdo_score (137), do_give, do_drop. Там вывод, и попутно всплывают такие же баги, как «кто боги» и ширина колонки в refactor: слой 1 -- "кто", setall и разбор аргументов (#3807) #3813.
  3. punishments.cpp (98) — один файл, целиком про сообщения богов.
  4. Тяжеловесы — по одному в PR, начиная с do_stat.

Признак, что слой закончен: из utils.h можно удалить пять extern char.

Чем мерить

python3 - <<'PY'
import io,glob,re,collections
real=collections.Counter()
for f in glob.glob('src/**/*.cpp',recursive=True):
    if 'third_party' in f: continue
    s=io.open(f,encoding='utf-8').read()
    local={m.group(1) for m in re.finditer(r'\bchar\s+(buf|buf1|buf2|arg|smallBuf)\s*\[', s)}
    n=sum(len(re.findall(r'\b%s\b'%name, line.split('//')[0]))
          for line in s.split('\n') for name in ('buf','buf1','buf2','arg','smallBuf') if name not in local)
    if n: real[f]=n
print('файлов:', len(real), ' вхождений:', sum(real.values()))
PY

Что уже усвоено на первых трёх файлах

  • локальный char[] вместо глобального — не решение: half_chop копирует остаток с оглядкой на kMaxStringLength, а one_argument длину не проверяет вовсе. Нужен std::string;
  • строковый разбор аргументов уже есть — utils::ExtractFirstArgument, не надо писать свой;
  • при переносе с half_chop помнить про регистр: тот понижал, ExtractFirstArgument — нет;
  • ширину колонки добирать внутри цветовых кодов, иначе семь невидимых символов съедают её;
  • в каждом разобранном файле пока находился настоящий баг («кто боги», пропавшее сообщение в setall, ширина в кто -s) — значит, смотреть надо на смысл кода, а не только на замену буферов.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions