🔥

Тред (Дмитрий Бежецков)


Тут буквально на днях я работал над webassembly в JavaScriptCore. JavaScriptCore это движок для JS и webassembly в webkit, который используется в браузере safari. Я собирался поддержать новый формат кодирования секции element в wasm, т.е. мне просто надо было поправить парсер.

Я уже привык что код на c++, да еще и в больших проектах не блещет новыми идеями и фишками из новых стандартов, развитие происходит неспеша и очень консервативно, но когда я нашел нужную мне функцию parseElement() я уже смотрел с презрением...

Посмотрите на эту кучу макросов: webkit-search.igalia.com/webkit/source/…, WASM_PARSER_FAIL_IF(!parseVarUInt32(elementCount), "can't get Element section's count"); Несмотря на макросы это почти читабельно, исключая того что под WASM_PARSER_FAIL_IF может скрыться нетривиальный кусок кода.

Спустя буквально пару часов я прозрел, блин, а это удобно. Не надо как в Go писать каждый раз if not error, просто в случае ошибки указываешь что возвращать и все.

Посмотрите как функция объявлена, auto SectionParser::parseElement() -> PartialResult, это же в прямом виде rail way oriented development в c++. Более подробно об этом подходе можно прочитать тут: fsharpforfunandprofit.com/rop/.

Также Андрей Александреску предлагал внести похожий способ обработки ошибок в c++: youtube.com/watch?v=CGwk3i….

Возвращаясь к своей задаче я написал пару функций для парсинга в стиле: PartialResult WARN_UNUSED_RETURN parseElemKind(uint8_t& elemKind), потом вызвал их через этот чудесный макрос, который по факту делает if и все, код получается читаемым, расширяемым и вот это вот все.

Вот к слову и патч в JSC который добавляет поддержку обновленной секции elements и reference-type proposal: bugs.webkit.org/attachment.cgi….