1. Си / Говнокод #5968

    +125

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    #line 411 "ext/standard/var_unserializer.c"
    {
    	YYCTYPE yych;
    
    	if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
    	yych = *YYCURSOR;
    	switch (yych) {
    	case 'C':
    	case 'O':	goto yy13;
    	case 'N':	goto yy5;
    	case 'R':	goto yy2;
    	case 'S':	goto yy10;
    	case 'a':	goto yy11;
    	case 'b':	goto yy6;
    	case 'd':	goto yy8;
    	case 'i':	goto yy7;
    	case 'o':	goto yy12;
    	case 'r':	goto yy4;
    	case 's':	goto yy9;
    	case '}':	goto yy14;
    	default:	goto yy16;
    	}
    yy2:
    	yych = *(YYMARKER = ++YYCURSOR);
    	switch (yych) {
    	case ':':	goto yy95;
    	default:	goto yy3;
    	}
    yy3:
    #line 733 "ext/standard/var_unserializer.re"
    	{ return 0; }
    #line 442 "ext/standard/var_unserializer.c"
    yy4:
    	yych = *(YYMARKER = ++YYCURSOR);
    	switch (yych) {
    	case ':':	goto yy89;
    	default:	goto yy3;
    	}
    yy5:
    	yych = *++YYCURSOR;
    	switch (yych) {
    	case ';':	goto yy87;
    	default:	goto yy3;
    	}
    yy6:
    	yych = *(YYMARKER = ++YYCURSOR);
    	switch (yych) {
    	case ':':	goto yy83;
    	default:	goto yy3;
    	}
    yy7:
    	yych = *(YYMARKER = ++YYCURSOR);
    	switch (yych) {
    	case ':':	goto yy77;
    	default:	goto yy3;
    	}
    yy8:
    	yych = *(YYMARKER = ++YYCURSOR);
    	switch (yych) {
    	case ':':	goto yy53;
    	default:	goto yy3;
    	}
    yy9:
    	yych = *(YYMARKER = ++YYCURSOR);
    	switch (yych) {
    	case ':':	goto yy46;
    	default:	goto yy3;
    	}
    yy10:
    	yych = *(YYMARKER = ++YYCURSOR);
    	switch (yych) {
    	case ':':	goto yy39;
    	default:	goto yy3;
    	}
    yy11:
    	yych = *(YYMARKER = ++YYCURSOR);
    	switch (yych) {
    	case ':':	goto yy32;
    	default:	goto yy3;
    	}
    yy12:
    	yych = *(YYMARKER = ++YYCURSOR);
    	switch (yych) {
    	case ':':	goto yy25;
    	default:	goto yy3;
    	}
    yy13:
    	yych = *(YYMARKER = ++YYCURSOR);
    	switch (yych) {
    	case ':':	goto yy17;
    	default:	goto yy3;
    	}
    yy14:
    	++YYCURSOR;
    
    /* далее еще несколько похожих кусков кода чуть менее хардкорных */

    http://svn.php.net/viewvc/php/php-src/trunk/ext/standard/var_unserializer.c?view=markup

    Исходники функции unserialize в php, не зря она так медленно работает на больших массивах...

    Запостил: dim-s, 13 Марта 2011

    Комментарии (26) RSS

    • ну это же пхп... professional to professional
      Ответить
    • 1 /* Generated by re2c 0.13.5 on Sat Sep 18 17:59:40 2010 */
      Ответить
      • Головой надо думать, а не заниматься генерацией кода. Мозгов не хватает написать без регулярных выражений, а потом мы еще удивляемся, а откуда столько дыр в пхп.
        Ответить
        • у меня есть идея: напиши лучше.
          Ответить
          • http://habrahabr.ru/blogs/php/104069/

            Читаем дальше и понимаем что это гавно, пусть даже в косвенном виде, т.к. разработчики не удосужились написать разбор строки вручную, без регулярных выражений. Напишу, вернее написал, но не для пхп (но в формате пхп), а разбор намного быстрее.
            Ответить
            • там по линку в коментариях указан более быстрый способ. а то что unserialize() тормозит (по сравнению с serialize()) так это даже и логично: когда данные пишутся, валидировать их не надо, а вот когда данные читаются...
              Ответить
              • Оттуда же:
                > bugs.php.net/bug.php?id=52832

                > Вину за собой признают, правда патчить 5.3 отказываются, > видимо, пойдет в 6.0 (5.4?).

                Если ты не понял - скорость не должна уменьшаться в геометрической прогрессии в зависимости от размера данных.
                Ответить
                • http://www.xakep.ru/post/51883/ за одно...
                  Ответить
                • и где там написано что это происходит из-за использования регулярных выражений?
                  Ответить
        • Это обычный конечный автомат - штука достаточно быстрая. Для парсеров конечный автомат в форме регулярных выражений или автогенеренной реализации по БНФ - стандарт.
          Ответить
          • «Я видел конечные автоматы. Они не такие»:)
            Странно, переменные, вроде, с yy начинаются, а код не похож на сгенеренный lex-ом…
            Что-то здесь нечисто.
            Ответить
      • А как вам такое:
        #if 0
         	fprintf(stderr, "var_push(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval));
        #endif
        Ответить
        • Отладочная информация, какие проблемы?
          Ответить
          • #if 0
            Ответить
            • Вполне нормально, если такая строчка в проекте одна, а отлаживать ее надо не по DEBUG, а отдельно. Пришел, поставил 1 (не выставляя при этом DEBUG чтобы не утонуть в отладочной информации), потом поставил ноль.

              Какие проблемы то?
              Ответить
              • Да никаких проблем, вы бы посмотрели исходник по ссылочке сначала. Если отлаживать не по DEBUG, то надо другой идентификатор вводить, и иметь их список где-то централизованно. Но это совсем другая история, потому что код сгенерированный. Мне сама конструкция понравилась, из разряда if( false ), но на уровне препроцессора.
                Ответить
                • Молодой ты еще. Это же комментарий. Причем классический. Используется для того чтобы сообщить читающему код, что данный блок нужен в определенных целях, а не просто закоментирован за ненадобностью.
                  Ответить
    • Из того же исходника:
      #if SOMETHING_NEW_MIGHT_LEAD_TO_CRASH_ENABLE_IF_YOU_ARE_BRAVE
      Ответить
      • Такие названия типичны для исходников PHP - для функций, для констант и т.д. =)
        Ответить
    • Впервые увидели вывод генератора кода, да?
      Ответить
    • блядь, это же yacc)))
      в пхп говно в каждой строчке, а они доебались до автогенеренного кода
      Ответить

    Добавить комментарий