переделал к хуям виртуальную машину в libre9 (точнее, внутренний формат команд). проще не стало, быстрее тоже, зато стало страшней и непонятней. и скомпилированый код чуть меньше стал.
1. заменил в k8jam спенсеровский движок на libre9. теперь нельзя будет завалить бэктрекерной пичалечкой. 2. добавил в libre9 RE9_FLAG_CASEINSENS. по-умолчанию работает только на ASCII, но можно собрать с частичной юникодной таблицей (плюс ~11 килобайт к бинарнику, более-менее работает для точек < 0x10000).
кому надо utf8_toupper() и utf8_tolower() — можете забрать из libre9. там 40 килобайт таблички (сгенерёный исходник), генератор таблички и пара функций. ищет bsearch()-ем. можно, конечно, perfect hash было забацать, но ну его нахер.
добавил апя с явным указанием максимального количества памяти для матчера. а для несложных регулярок матчеру вообще может хватить стека.
«prepared» API чутка растянет списки, если понадобится (в моём любимом тесте — я о нём писал ниже — это позволило опять обогнать TRE), но постарается «схлопывать» до 32 тыщ потоков перед выходом (это всё равно ебанутые случаи, с ними так или иначе будет тормозить).
сделал махонькую оптимизацию для случая, когда в регэкспе нет нежадных замыканий. в итоге на «любимом тесте» практически вернулся к скорости первоначального порта, когда нежадных не было вообще.
запомните: нежадные замыкания — зло! старайтейсь обходиться без них, если это возможно.
p.s. ещё добавил дефайн RE9_DISABLE_NONGREEDY, который с мясом и кишками вырвет из кода поддержку нежадных замыканий. бинарь, правда, от этого уменьшится не сильно.