1. Java / Говнокод #9863

    +73

    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
    static 
        {
            unionSize = Math.max(6, 6);
            size = 2 + unionSize + 4;
        }
    
                // следующий участок
    
                case 7:
                {
                    int result = (int)((long)getValue(cmd.isByteMode(), mem, op1) & 0L);
                    if(cmd.isByteMode())
                        result &= 0xff;
                    setValue(cmd.isByteMode(), mem, op1, result);
                    flags = result != 0 ? result & VMFlags.VM_FS.getFlag() : VMFlags.VM_FZ.getFlag();
                    break;
                }
    
                case 49:
                {
                    setValue(true, mem, op1, (int)((long)getValue(true, mem, op1) & 0L));
                    break;
                }
    
                case 50:
                {
                    setValue(false, mem, op1, (int)((long)getValue(false, mem, op1) & 0L));
                    break;
                }
    
                //=========== еще участок ============
    
                    long dataSize = (long)ReadData(this) & 0L;
                    for(int i = 0; inAddr < codeSize && (long)i < dataSize; i++)
                    {
                        prg.getStaticData().addElement(new Byte(valueOf((byte)(fgetbits() >> 8))));
                        faddbits(8);
                    }

    Вот такое нашел в исходниках недавно

    Запостил: Doctoror, 04 Апреля 2012

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

    • Похоже, что специально пытались запутать.
      Ответить
    • > fgetbits
      похоже, писал сишник до мозга костей, такие любят писать в низкоуровневом стиле... (к примеру, деление на два обязательно заменят сдвигом)
      Ответить
      • Это нормально. Я тоже деление на 2, 4, 8, ... заменяю сдвигом.
        Прикол тут вовсе не тут, как было отмечено, а в том о чем говорил wvxvw, например.
        И если вы не заметили
        long dataSize = (long)ReadData(this) & 0L;
                        for(int i = 0; inAddr < codeSize && (long)i < dataSize; i++)
                        {
                            prg.getStaticData().addElement(new Byte(valueOf((byte)(fgetbits() >> 8))));
                            faddbits(8);
                        }


        Вообще не исполниться, так как dataSize всегда ноль (любое число & 0 будет 0), и следственно (long)i < dataSize тут будет false с самого начала.
        Ответить
    • Как бы я же правильно понимаю, что
      setValue(true, mem, op1, (int)((long)getValue(true, mem, op1) & 0L));

      и
      setValue(true, mem, op1, 0);

      это одно и то же, или какой смысл был во всех этих конверациях?
      Ответить
      • Надо это спросить автора, но он неизвестен.
        Кстати еще веселый момент,
        int result = (int)((long)getValue(cmd.isByteMode(), mem, op1) & 0L);
                        if(cmd.isByteMode())
                            result &= 0xff;
                        setValue(cmd.isByteMode(), mem, op1, result);
                        flags = result != 0 ? result & VMFlags.VM_FS.getFlag() : VMFlags.VM_FZ.getFlag();
                        break;


        На самом деле можно написать так:

        setValue(cmd.isByteMode(), mem, op1, 0);
        flags = VMFlags.VM_FZ.getFlag();
        Ответить
    • > static
      {
      unionSize = Math.max(6, 6);
      size = 2 + unionSize + 4;
      }

      Ну это нормально, только заменить бы ещё 2,4,6 на sizeof нужных типов ну и какого хуя это делает в java-коде?
      Ответить
      • Извините, какой еще sizeof ?
        Math.max(int1, in2) возвращает то, что больше
        Тут то просто
        static {
            unionSize = 6;
            size = 12;
        }

        должно быть. Кстати когда я так и сделал, оказалось, что переменная unionSize используеться только в инициализаторе, и на самом деле инициализатор получаеться таким
        static {
            size = 12;
        }
        Ответить
        • Размер union определяется как максимум из размеров его ветвей. Если обе ветви занимают 6 байт, то размер union будет max(6,6). Такой записью автор показал, что это будет unon из двух ветвей, каждая из которых по 6 байт. Но что в этих ветвях - хз, потому что он явно написал 6 вместо sizeof.
          Аналогично с 2+unionsize+4 - тут видно, что это размер структуры из 3 полей, первое двубайтовое, второе - это тот union, третье - 4-байтовое.

          Поэтому отмени свою "оптимизацию" и оставь всё так, как было, потому что это было неспроста.
          Ответить
          • static в Яве в этом контексте имеет совсем другое значение - это код который выполняется при загрузке класса класс-лоадером, это не структура никакая.
            Ответить
            • Я понял, что статик - это не структура. Но число, которое хранится в этом статике - это явно размер какой-то структуры. И не надо это "упрощать", так сделано, потому что так надо.
              Ответить
              • Хз, это такая попытка посеять смуту? :) Ну не знаю даже... не, код бессмысленный, тот что в static.
                Ответить
                • Код имеет смысл. Не надо вычислять константы вместо компилятора. Не надо писать 86400 вместо 24*60*60. И так далее.
                  Ответить
                  • x = Math.max(x, x) - это по определению nop. Тут как бы все теории бессильны. Ну, или, если бы у нас было:
                    final int constant1 = x;
                    final int constant2 = x;
                    x = Math.max(constant1, constant2);

                    Тогда можно было бы позвонить в астральную канцелярию и домогаться смысла, но в предоставленном варианте, это просто какое-то недоразумение.
                    Ответить
                    • Ещё раз для непонятливых: этот код хорош тем, что не только даёт число 12, но и показывает, как это число было получено. Глядя на способ его получения, я сразу понимаю, что оно означает. Дошло?
                      Ответить
                      • > я сразу понимаю, что оно означает
                        везёт
                        Ответить
                        • Если бы автор уточнил, sizeof от чего означают 2, 4, 6, то было бы ещё лучше
                          Ответить
                      • Вам бы в ВоВ играть, у троллей охотников там куча плюх, а с уровнем рассовая абилка "разрдражение" убивает вообще все вокруг.
                        Ответить
                        • Так, урок окончен. К следующему уроку прочитай главу "самодокументируемый код".
                          Ответить
    • показать все, что скрытоvanished
      Ответить

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