вторник, 25 октября 2011 г.

[prog.bugs] Наткнулся на странное поведение в Ruby 1.9.2

Был код:

  def parse_string
    start_line_no = line_no
    result = ''
    while nil != ( n = @lexer.next )
      case n
        when '"'
          return [ result, :tok_string ]
        when '\\'
          char, tok = parse_escape_seq
          result << char
        else
          result << n
      end
    end

    raise UnclosedStringEx.new(
        stream_name, line_no,
        "unclosed string started at: #{stream_name}:#{start_line_no}" )
  end

Просто в цикле из лексера доставался очередной символ и анализировался. Если двойная кавычка, то разбор завершается. Если escape-последовательность, то она анализируется отдельно, если что-то другое, то просто добавляется в результирующий буфер.

Работал код под Ruby 1.8.* и под Ruby 1.9.1. Под Ruby 1.9.2-p136 работать перестал. По двойной кавычке не выходил из функции. Вместо этого кавычка добавлялась к result. Т.е. в case ветка when ‘”’ просто престала работать.

Заработало только когда я переписал код так:

  def parse_string
    start_line_no = line_no
    result = ''
    while nil != ( n = @lexer.next )
      if '"' == n
        return [ result, :tok_string ]
      elsif '\\' == n
        char, tok = parse_escape_seq
        result << char
      else
        result << n
      end
    end

    raise UnclosedStringEx.new(
        stream_name, line_no,
        "unclosed string started at: #{stream_name}:#{start_line_no}" )
  end

Что это было – понять не могу. Как и не могу понять, каким образом со старым вариантом кода под Ruby-1.9.2-p136 успешно проходили все unit-тесты (более сотни test cases).

Но еще больше я не понимаю другого – внося изменения я вместо elsif написал elseif (лишняя буковка). Но при запуске unit-тестов не получил от Ruby-1.9.1-p430/Ruby-1.9.2-p136 ни одной синтаксической ошибки. Вместо этого просто unit-тест обломился из-за несовпадения результатов в одном из test cases. Как так? Может просто rake перехватывает сообщения об ошибках в исходниках? Загадка, однако.

Комментариев нет: