source: asp3_gr_sakura/trunk/tecsgen/tecslib/core/pluginModule.rb@ 318

Last change on this file since 318 was 318, checked in by coas-nagasima, 7 years ago

プロパティの文字コードにUTF-8を追加、キーワードを削除

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby; charset=UTF-8
File size: 6.1 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2014 by TOPPERS Project
7#--
8# 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10# 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13# スコード中に含まれていること.
14# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17# の無保証規定を掲載すること.
18# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20# と.
21# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22# 作権表示,この利用条件および下記の無保証規定を掲載すること.
23# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24# 報告すること.
25# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28# 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29# 免責すること.
30#
31# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35# の責任を負わない.
36#
37# $Id$
38#++
39
40#== プラグインをロードする側のモジュール
41# @@loaded_plugin_list:: {Symbol=>Integer}
42module PluginModule
43
44 @@loaded_plugin_list = {}
45
46 #=== プラグインをロードする
47 #return:: true : 成功、 false : 失敗
48 #
49 # すでにロードされているものは、重複してロードしない
50 # load 時の例外はこのメソッドの中でキャッチされて false が返される
51 def load_plugin( plugin_name, superClass )
52
53 dbgPrint "PluginModule: load_plugin: #{plugin_name}\n"
54 begin
55 unless @@loaded_plugin_list[ plugin_name.to_sym ] then
56 @@loaded_plugin_list[ plugin_name.to_sym ] = 0
57 if ( $verbose ) then
58 print( "load '#{plugin_name}.rb'\n" )
59 end
60 # "#{plugin_name}.rb" をロード(システム用ではないので、fatal エラーにしない)
61 if require_tecsgen_lib( "#{plugin_name}.rb", false ) == false
62 cdl_error( "P2001 $1.rb : fail to load plugin" , plugin_name )
63 return false
64 end
65 end
66
67 plSuper = nil
68 # eval( "plSuper = #{plugin_name}.superclass" )
69 eval( "plSuper = #{plugin_name}" )
70 while plSuper != superClass && plSuper != nil
71 plSuper = plSuper.superclass
72 end
73 if plSuper == nil then
74 cdl_error( "P2002 $1: not kind of $2" , plugin_name, superClass.name )
75 return false
76 end
77 rescue Exception => evar
78 if $debug then
79 p evar.class
80 pp evar.backtrace
81 end
82 cdl_error( "P2003 $1: load failed" , plugin_name )
83 return false
84 end
85 return true
86 end
87
88 #=== プラグインの gen_cdl_file を呼びして cdl ファイルを生成させ、解釈を行う
89 def generate_and_parse plugin_object
90 if plugin_object == nil # プラグインのロードに失敗している(既にエラー)
91 return
92 end
93 plugin_name = plugin_object.class.name.to_sym
94 if @@loaded_plugin_list[ plugin_name ] == nil
95 raise "#{plugin_name} might have different name "
96 # プラグインのファイル名と、プラグインのクラス名が相違する場合
97 end
98 count = @@loaded_plugin_list[ plugin_name ]
99 @@loaded_plugin_list[ plugin_name ] += 1
100 tmp_file_name = "#{$gen}/tmp_#{plugin_name}_#{count}.cdl"
101
102 begin
103 tmp_file = CFile.open( tmp_file_name, "w" )
104 rescue Exception => evar
105 cdl_error( "P2004 $1: open error \'$2\'" , plugin_name, tmp_file_name )
106 print_exception( evar )
107 end
108 dbgPrint "generate_and_parse: #{plugin_object.class}: gen_cdl_file\n"
109 begin
110 plugin_object.gen_cdl_file( tmp_file )
111 rescue Exception => evar
112 cdl_error( "P2005 $1: plugin error in gen_through_cell_code " , plugin_name )
113 print_exception( evar )
114 end
115 begin
116 tmp_file.close
117 rescue Exception => evar
118 cdl_error( "P2006 $1: close error \'$2\'" , plugin_name, tmp_file_name )
119 print_exception( evar )
120 end
121
122 generator = Generator.new
123 generator.set_plugin( plugin_object )
124 generator.parse( [ tmp_file_name ] )
125 generator.finalize
126 end
127
128 #=== プラグインが CDL の POST コードを生成
129 # tmp_plugin_post_code.cdl への出力
130 def self.gen_plugin_post_code file
131 dbgPrint "PluginModule #{@@loaded_plugin_list}\n"
132 @@loaded_plugin_list.each{ |plugin_name,count|
133 dbgPrint "PluginModule: #{plugin_name}\n"
134 eval_str = "#{plugin_name}.gen_post_code( file )"
135 if $verbose then
136 print "gen_plugin_post_code: #{eval_str}\n"
137 end
138 begin
139 eval( eval_str )
140 rescue Exception => evar
141 Generator.error( "P2007 $1: fail to generate post code" , plugin_name )
142
143 print_exception( evar )
144 end
145 }
146 end
147
148end
Note: See TracBrowser for help on using the repository browser.