Module: PluginModule

Included in:
Cell, Celltype, CompositeCelltype, DomainType, Generate, Join, Signature
Defined in:
lib/tecsgen/core/pluginModule.rb

Overview

プラグインをロードする側のモジュール

@@loaded_plugin_list

Symbol=>Integer

Constant Summary collapse

@@loaded_plugin_list =
{}

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.gen_plugin_post_code(file) ⇒ Object

プラグインが CDL の POST コードを生成

tmp_plugin_post_code.cdl への出力



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/tecsgen/core/pluginModule.rb', line 144

def self.gen_plugin_post_code(file)
  dbgPrint "PluginModule #{@@loaded_plugin_list}\n"
  @@loaded_plugin_list.each{|plugin_name, count|
    if count == :MultiPlugin
      next
    end
    dbgPrint "PluginModule: #{plugin_name}\n"
    eval_str = "#{plugin_name}.gen_post_code( file )"
    if $verbose
      print "gen_plugin_post_code: #{eval_str}\n"
    end
    begin
      eval(eval_str)
    rescue Exception => evar
      Generator.error("P2007 $1: fail to generate post code", plugin_name)

      print_exception(evar)
    end
  }
end

Instance Method Details

#generate_and_parse(plugin_object) ⇒ Object

プラグインの gen_cdl_file を呼びして cdl ファイルを生成させ、解釈を行う



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/tecsgen/core/pluginModule.rb', line 98

def generate_and_parse(plugin_object)
  if plugin_object.nil? # プラグインのロードに失敗している(既にエラー)
    return
  end
  plugin_name = plugin_object.class.name.to_sym
  if @@loaded_plugin_list[plugin_name] == :MultiPlugin
    p "#{plugin_name}: MultiPlugin"
    return
  elsif @@loaded_plugin_list[plugin_name].nil?
    # raise "#{plugin_name} might have different name "
    ## プラグインのファイル名と、プラグインのクラス名が相違する場合
    # MultiPlugin の get_plugin で返されたケースでは nil になっている
    @@loaded_plugin_list[plugin_name] = 0
  end
  count = @@loaded_plugin_list[plugin_name]
  @@loaded_plugin_list[plugin_name] += 1
  tmp_file_name = "#{$gen}/tmp_#{plugin_name}_#{count}.cdl"

  begin
    tmp_file = CFile.open(tmp_file_name, "w")
  rescue Exception => evar
    cdl_error("P2004 $1: open error \'$2\'", plugin_name, tmp_file_name)
    print_exception(evar)
  end
  dbgPrint "generate_and_parse: #{plugin_object.class}: gen_cdl_file\n"
  begin
    plugin_object.gen_cdl_file(tmp_file)
  rescue Exception => evar
    cdl_error("P2005 $1: plugin error in gen_through_cell_code ", plugin_name)
    print_exception(evar)
  end
  begin
    tmp_file.close
  rescue Exception => evar
    cdl_error("P2006 $1: close error \'$2\'", plugin_name, tmp_file_name)
    print_exception(evar)
  end

  generator = Generator.new
  generator.set_plugin(plugin_object)
  generator.parse([tmp_file_name])
  generator.finalize
end

#load_plugin(plugin_name, superClass) ⇒ Object

プラグインをロードする

return

PluginClass

V1.4.1 まで return

true : 成功、 false : 失敗

#plugin_name.rb をロードし、plugin_name クラスのオブジェクトを生成する. plugin_name が MultiPlugin の場合、get_plugin により、superClass のプラグインオブジェクトをロードする.

すでにロードされているものは、重複してロードしない load 時の例外はこのメソッドの中でキャッチされて false が返される



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/tecsgen/core/pluginModule.rb', line 54

def load_plugin(plugin_name, superClass)
  dbgPrint "PluginModule: load_plugin: #{plugin_name}\n"
  begin
    unless @@loaded_plugin_list[plugin_name.to_sym]
      @@loaded_plugin_list[plugin_name.to_sym] = 0
      if $verbose
        print("load '#{plugin_name}.rb'\n")
      end
      # "#{plugin_name}.rb" をロード(システム用ではないので、fatal エラーにしない)
      if require_tecsgen_lib("#{plugin_name}.rb", false) == false
        cdl_error("P2001 $1.rb : fail to load plugin", plugin_name)
        return nil
      end
    end

    plClass = Object.const_get plugin_name
    if plClass <= superClass # plClass inherits superClass
      return plClass
    elsif plClass <= MultiPlugin # plClass inherits MultiPlugin
      dbgPrint "pluginClass=#{plClass}\n"
      plugin_object = plClass.get_plugin superClass
      dbgPrint "pluginClass=#{plugin_object}\n"
      if plugin_object.nil?
        cdl_error("P9999 '$1': MultiPlugin not support '$2'", plugin_name, superClass.name)
      end
      @@loaded_plugin_list[plugin_name.to_sym] = :MultiPlugin
      return plugin_object
    else
      cdl_error("P2002 $1: not kind of $2", plugin_name, superClass.name)
      return nil
    end
  rescue Exception => evar
    if $debug
      p evar.class
      pp evar.backtrace
    end
    cdl_error("P2003 $1: load failed", plugin_name)
    return nil
  end
  # ここへは来ない
  return nil
end