Module RuCodeGen::Embedded
In: lib/rucodegen/embedded.rb

Methods

Public Class methods

Получить тела всех RuCodeGen фрагментов из указанного файла.

RuCodeGen фрагмент начинается со строки, в которой присутствует подстрока:

      RuCodeGen::Embedded::begin

и заканчивается RuCodeGen фрагмент строкой, в которой присутствует:

      RuCodeGen::Embedded::end

Пример корректного встроенного RuCodeGen описания:

      /* RuCodeGen::Embedded::begin
      cpp_value_incapsulator cfg_t do |c|
        ...
      end
      RuCodeGen::Embedded::end */

[Source]

# File lib/rucodegen/embedded.rb, line 24
def Embedded.extract_fragments( file )
        open_mark = /RuCodeGen::Embedd{0,1}ed::begin/
        close_mark = /RuCodeGen::Embedd{0,1}ed::end/
        expected_mark = open_mark
        open_at = 0
        line_no = 1

        script_body = File.readlines( file ).inject( '' ) do |body, line|
                if expected_mark == close_mark
                        if close_mark =~ line
                                expected_mark = open_mark
                        else
                                fail "#{file}:#{line_no}: open RuCodeGen inside opened fragment " +
                                                "started at #{open_at}" if open_mark =~ line

                                body << line
                        end
                elsif open_mark =~ line
                        expected_mark = close_mark
                        open_at = line_no
                end
                line_no += 1

                body
        end

        fail "#{file}: unclosed RuCodeGen fragment open at #{open_at}" \
                        if expected_mark == close_mark

        script_body
end

Инициирует кодогенерацию путем запуска ruby для извлеченного из исходного файла кодогенерирующего скрипта.

src_file_name
имя исходного файла, из которого был извлечен скрипт;
script
содержимое извлеченного из исходного файла скрипта;
mode
режим кодогенерации (:build или :clean).

[Source]

# File lib/rucodegen/embedded.rb, line 62
def Embedded.run_generation( src_file_name, script, mode )
        temp_script_name = src_file_name + '-embeded-rucodegen'
        File.open( temp_script_name, 'w' ) do |f|
                f << "require 'rubygems'\nrequire_gem 'RuCodeGen'\n\n"
                f << script
        end

        begin
                `ruby #{temp_script_name} --mode #{mode}`
                fail "Error running temporary script generated from #{src_file_name}" \
                                if $? and $?.exitstatus != 0
        ensure
                # В любом случае временный файл должен быть уничтожен.
                File.delete( temp_script_name )
        end
end

[Validate]

Hosted by uCoz