Ignore:
Timestamp:
Aug 23, 2017, 9:27:43 AM (7 years ago)
Author:
coas-nagasima
Message:

文字コードを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/NotifierPlugin.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    1414class NotifierPlugin < CelltypePlugin
    1515
    16         # ---------- アダプタ関数の生成 -------------
     16        # ---------- アダプタ関数の生成 -------------
    1717        #
    18         # siHandlerBodyの受け口関数は,タイムイベント通知の通知å
    19 ˆã¨ã—て直接指定する
    20         # ことはできない.シグネチャが一致していないことが理由である.このため,アダ
    21         # プタとして動作する関数を生成し,カーネルからの呼出しをTECSの呼出しに変換で
    22         # きるようにするå¿
    23 è¦ãŒã‚る.
     18        # siHandlerBodyの受け口関数は,タイムイベント通知の通知先として直接指定する
     19        # ことはできない.シグネチャが一致していないことが理由である.このため,アダ
     20        # プタとして動作する関数を生成し,カーネルからの呼出しをTECSの呼出しに変換で
     21        # きるようにする必要がある.
    2422        #
    25         # 基本的には,受け口毎にアダプタ関数を生成すれば十分である.しかし,これでは
    26         # メモリ消費量が不å¿
    27 è¦ã«å¢—加してしまう.そこで,通知å
    28 ˆé–¢æ•°ã«intptr_t型の引数
    29         # を渡せることに着目し,関数の"一般化"を図る.すなわち受け口のある属性(ここ
    30         # では,結合å
    31 ˆã®ã‚»ãƒ«ï¼Œæ·»å­—などを指す)を,アダプタ関数の引数として受け取れる
    32         # ようにし,1個のアダプタ関数を2個以上の結合に対し用いることができるように
    33         # する.
     23        # 基本的には,受け口毎にアダプタ関数を生成すれば十分である.しかし,これでは
     24        # メモリ消費量が不必要に増加してしまう.そこで,通知先関数にintptr_t型の引数
     25        # を渡せることに着目し,関数の"一般化"を図る.すなわち受け口のある属性(ここ
     26        # では,結合先のセル,添字などを指す)を,アダプタ関数の引数として受け取れる
     27        # ようにし,1個のアダプタ関数を2個以上の結合に対し用いることができるように
     28        # する.
    3429        #
    35         # アダプタ関数の属性について整理すると,
    36         #  - 受け口関数 - 一般化を行うと,実行時コストが大きく増大してしまうことが
    37         #    確認されている.このため,一般化は行わない.EntryPropertyにも含めない.
    38         #  - セルインデックス - CELLIDX型で,型の規定はないが,"ポインタ値であったり
    39         #    整数値であったりする。" (TECS 5.3.6) より,インデックスかポインタある
    40         #    ことが分かる.インデックスだとすると,この値はセルCBのアドレッシングに
    41         #    使用されるので,intptr_tに収まる筈である.ポインタの場合,当然intptr_t
    42         #    に収まる.
    43         #  - 受け口é
    44 åˆ—の添字 - int_t.同様にintptr_tに収まる筈である.
    45         # これらのうち,セルインデックスと受け口é
    46 åˆ—の添字はパラメータに含めることが
    47         # できそうであるが,両方は無理である.
    48         # 両方を格納したé
    49 åˆ—を生成し,そのé
    50 åˆ—の要素へのポインタを渡すようにするとい
    51         # う選択肢も可能であるが,実行速度を優å
    52 ˆã™ã‚‹ãŸã‚ã«ï¼Œã“の方法はとらなかった.
     30        # アダプタ関数の属性について整理すると,
     31        #  - 受け口関数 - 一般化を行うと,実行時コストが大きく増大してしまうことが
     32        #    確認されている.このため,一般化は行わない.EntryPropertyにも含めない.
     33        #  - セルインデックス - CELLIDX型で,型の規定はないが,"ポインタ値であったり
     34        #    整数値であったりする。" (TECS 5.3.6) より,インデックスかポインタある
     35        #    ことが分かる.インデックスだとすると,この値はセルCBのアドレッシングに
     36        #    使用されるので,intptr_tに収まる筈である.ポインタの場合,当然intptr_t
     37        #    に収まる.
     38        #  - 受け口配列の添字 - int_t.同様にintptr_tに収まる筈である.
     39        # これらのうち,セルインデックスと受け口配列の添字はパラメータに含めることが
     40        # できそうであるが,両方は無理である.
     41        # 両方を格納した配列を生成し,その配列の要素へのポインタを渡すようにするとい
     42        # う選択肢も可能であるが,実行速度を優先するために,この方法はとらなかった.
    5343        #
    54         # このため,一般化は以下のパターンに分類して行う.
     44        # このため,一般化は以下のパターンに分類して行う.
    5545        #
    56         # 1. セルインデックスのみ一般化.セルインデックスのパターン数が受け口é
    57 åˆ—の
    58         #    添字のパターン数より多いか,あるいは受け口がé
    59 åˆ—でない場合に行われる.
    60         # 2. 受け口é
    61 åˆ—の添字のみ一般化.この場合,セルごとに異なる関数を用いる.
     46        # 1. セルインデックスのみ一般化.セルインデックスのパターン数が受け口配列の
     47        #    添字のパターン数より多いか,あるいは受け口が配列でない場合に行われる.
     48        # 2. 受け口配列の添字のみ一般化.この場合,セルごとに異なる関数を用いる.
    6249        #
    63         # これより,各受け口関数について,アダプタ関数の生成個数は,
    64         #         O(min{セルインデックスのパターン数, 添字のパターン数})
    65         # となる.
     50        # これより,各受け口関数について,アダプタ関数の生成個数は,
     51        #         O(min{セルインデックスのパターン数, 添字のパターン数})
     52        # となる.
    6653        #
    67         # プラグインでの処理をワンパスで行うために,tecsgen.cfgではアダプタ関数を直
    68         # 接指定するのではなく,代わりにアダプタ関数を表すマクロを使用する.この
    69         # マクロはアダプタ関数ハンドルと呼ぶことにする.
    70         # アダプタ関数ハンドルは,次の2個の要素から成る.
    71         #  - アダプタ関数へののポインタ
    72         #  - アダプタ関数の引数
     54        # プラグインでの処理をワンパスで行うために,tecsgen.cfgではアダプタ関数を直
     55        # 接指定するのではなく,代わりにアダプタ関数を表すマクロを使用する.この
     56        # マクロはアダプタ関数ハンドルと呼ぶことにする.
     57        # アダプタ関数ハンドルは,次の2個の要素から成る.
     58        #  - アダプタ関数へののポインタ
     59        #  - アダプタ関数の引数
    7360
    7461        # @private
    7562        class AdapterGenerator
    7663
    77                 # 結合å
    78 ˆã«é–¢ã™ã‚‹å±žæ€§ã‚’含む.セル,受け口é
    79 åˆ—の添字から成る.
    80                 # 同一のEntryPropertyとなる結合は,å
    81 ¨ãåŒã˜æ–¹æ³•ã§ãã®å—け口関数を呼び
    82                 # 出せる.
     64                # 結合先に関する属性を含む.セル,受け口配列の添字から成る.
     65                # 同一のEntryPropertyとなる結合は,全く同じ方法でその受け口関数を呼び
     66                # 出せる.
    8367                # @private
    8468                class EntryProperty
    85                         # @return [Cell] 受け口側のセル.
     69                        # @return [Cell] 受け口側のセル.
    8670                        attr_reader :cell
    8771
    88                         # @return [Integer, nil] 受け口é
    89 åˆ—の添字.é
    90 åˆ—でない場合はnil.
     72                        # @return [Integer, nil] 受け口配列の添字.配列でない場合はnil.
    9173                        attr_reader :subscript
    9274
     
    10082                        end
    10183
    102                         # 同値性の定義.Hashのキーとして使用するのにå¿
    103 è¦ï¼Ž
     84                        # 同値性の定義.Hashのキーとして使用するのに必要.
    10485                        def eql?(o) @cell == o.cell && @subscript == o.subscript end
    10586                        def hash() @cell.hash ^ @subscript.hash end
     
    10889                # @private
    10990                class EntryPort
    110                         # @param [Port] port 結合å
    111 ˆã®ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の受け口.
     91                        # @param [Port] port 結合先のセルのセルタイプの受け口.
    11292                        def initialize(port, prefix)
    11393                                @port = port
    11494                                @global_name = "#{prefix}_#{@port.get_celltype.get_global_name}_#{@port.get_name}"
    11595
    116                                 # 受け口関数名.siHandlerBodyを想定しているので,関数名はmainで固定である.
     96                                # 受け口関数名.siHandlerBodyを想定しているので,関数名はmainで固定である.
    11797                                @entry_fn_name = "#{@port.get_celltype.get_global_name}_#{@port.get_name}_main"
    11898
     
    121101                        end
    122102
    123                         # @return [String] グローバルに一意(なものとして扱えるよう)な識別子.
     103                        # @return [String] グローバルに一意(なものとして扱えるよう)な識別子.
    124104                        attr_reader :global_name
    125105
     
    127107                        attr_reader :port
    128108
    129                         # 指定したEntryPropertyに対応するアダプタ関数ハンドルを取得する.
     109                        # 指定したEntryPropertyに対応するアダプタ関数ハンドルを取得する.
    130110                        # @param [EntryProperty] ep
    131                         # @return [String] アダプタ関数ハンドル.
     111                        # @return [String] アダプタ関数ハンドル.
    132112                        # @private
    133113                        def adapter_handle_for_entry_property(ep)
     
    139119                        end
    140120
    141                         # 結合å
    142 ˆã®æƒ
    143 å ±ã«å¿œã˜ãŸã‚¢ãƒ€ãƒ—タ関数をソース・ヘッダーに出力する.
    144                         # 一般化指定は,`cell`または`subscript`の一方のみ行うことができる.
     121                        # 結合先の情報に応じたアダプタ関数をソース・ヘッダーに出力する.
     122                        # 一般化指定は,`cell`または`subscript`の一方のみ行うことができる.
    145123                        #
    146124                        # @param [AdapterGenerator] context
    147                         # @param [String] fn_name 関数名.
    148                         # @param [Cell, Symbol] cell セル.セルについて一般化する場合は `:generic`
    149                         # @param [Integer, Symbol, nil] subscript 添字.添字について一般化する場合は `:generic`
     125                        # @param [String] fn_name 関数名.
     126                        # @param [Cell, Symbol] cell セル.セルについて一般化する場合は `:generic`
     127                        # @param [Integer, Symbol, nil] subscript 添字.添字について一般化する場合は `:generic`
    150128                        # @private
    151129                        def generate_inner(context, fn_name, cell, subscript)
     
    158136                                ct = @port.get_celltype
    159137
    160                                 # シングルトンセルタイプ以外では,CELLIDXの指定がå¿
    161 è¦ï¼Ž
     138                                # シングルトンセルタイプ以外では,CELLIDXの指定が必要.
    162139                                unless ct.is_singleton?
    163140                                        if cell == :generic
    164141                                                params << "(CELLIDX)extinf"
    165142                                        else
    166                                                 # セルのCELLIDXを得る
     143                                                # セルのCELLIDXを得る
    167144                                                if ct.has_INIB? || ct.has_CB?
    168145                                                        params << ct.get_name_array(cell)[7]
     
    173150                                end
    174151
    175                                 # 受け口é
    176 åˆ—の添字.
     152                                # 受け口配列の添字.
    177153                                if @port.get_array_size
    178154                                        if subscript == :generic
     
    192168                        end
    193169
    194                         # 指定したJoinに対応するアダプタ関数ハンドルを取得する.
    195                         # @return [Array] アダプタ関数ハンドル.
     170                        # 指定したJoinに対応するアダプタ関数ハンドルを取得する.
     171                        # @return [Array] アダプタ関数ハンドル.
    196172                        def make_adapter_handle(join)
    197173                                prop = EntryProperty.from_join(join)
     
    203179                        end
    204180
    205                         # ソース・ヘッダーの記述を生成する.
     181                        # ソース・ヘッダーの記述を生成する.
    206182                        # @param [AdapterGenerator] context
    207183                        def generate(context)
     
    217193                                no_cellidx = false
    218194                                if !(ct.has_INIB? || ct.has_CB?)
    219                                         # CB, INIB最適化により,CB, INIBが両方不要になったケース.
    220                                         # CELLIDXが不要であるので,セルについて一般化しても意味
    221                                         # はないので,添字による一般化を選択する.
     195                                        # CB, INIB最適化により,CB, INIBが両方不要になったケース.
     196                                        # CELLIDXが不要であるので,セルについて一般化しても意味
     197                                        # はないので,添字による一般化を選択する.
    222198                                        generalize_by_cell_idx = false
    223199                                        no_cellidx = true
    224200
    225                                         # å
    226 ¨ã¦ã®ã‚»ãƒ«ã‚’同一視する.
     201                                        # 全てのセルを同一視する.
    227202                                        cells = { @props[0].cell => @props }
    228203
    229204                                        header_file.print " * No INIB & CB: generalized by subscript\n"
    230205                                elsif @port.get_array_size
    231                                         # 一般化パターンの分類を行うために,受け口側セルや添字の
    232                                         # パターン数を分析して,最適な方を選択する.
     206                                        # 一般化パターンの分類を行うために,受け口側セルや添字の
     207                                        # パターン数を分析して,最適な方を選択する.
    233208                                        generalize_by_cell_idx = cells.length >= subscripts.length
    234209                                        if generalize_by_cell_idx
     
    238213                                        end
    239214                                else
    240                                         # 常にCELLIDXで一般化
     215                                        # 常にCELLIDXで一般化
    241216                                        generalize_by_cell_idx = true
    242217                                        header_file.print " * non-array entry port: generalized by cell\n"
     
    246221
    247222                                if generalize_by_cell_idx
    248                                         # CELLIDXについて一般化
     223                                        # CELLIDXについて一般化
    249224                                        subscripts.each { |subscript, props|
    250225                                                if subscript
    251226                                                        fn_name = "#{@global_name}_adap_#{subscript}"
    252227                                                else
    253                                                         # 受け口é
    254 åˆ—でない場合
     228                                                        # 受け口配列でない場合
    255229                                                        fn_name = "#{@global_name}_adap"
    256230                                                end
     
    262236                                                        handle = adapter_handle_for_entry_property(prop)
    263237
    264                                                         # セルのCELLIDXを得る
     238                                                        # セルのCELLIDXを得る
    265239                                                        if ct.has_INIB? || ct.has_CB?
    266240                                                                idx = ct.get_name_array(prop.cell)[7]
     
    273247                                        }
    274248                                else
    275                                         # 添字について一般化
     249                                        # 添字について一般化
    276250                                        cells.each { |cell, props|
    277251                                                if no_cellidx
    278                                                         # CB/INIB なし
     252                                                        # CB/INIB なし
    279253                                                        fn_name = "#{@global_name}_adap"
    280254                                                else
     
    302276                attr :header_file
    303277
    304                 # @param [String] celltype_name ハンドラ関数のセルタイプ.
    305                 # @param [String] prefix 名前衝突を防ぐためのプレフィックス.
     278                # @param [String] celltype_name ハンドラ関数のセルタイプ.
     279                # @param [String] prefix 名前衝突を防ぐためのプレフィックス.
    306280                def initialize(celltype_name, prefix)
    307281                        @celltype_name = celltype_name
     
    313287
    314288                # ===AdapterGenerator#make_adapter_handle===
    315                 # 指定した結合の呼出しを行うためのアダプタ関数ハンドルを生成する.
    316                 # @return [Array] アダプタ関数ハンドル.
     289                # 指定した結合の呼出しを行うためのアダプタ関数ハンドルを生成する.
     290                # @return [Array] アダプタ関数ハンドル.
    317291                def make_adapter_handle(join)
    318292                        entry_port = @entry_ports[join.get_rhs_port]
     
    326300
    327301                # ===AdapterGenerator#finish===
    328                 # 各受け口に対し,アダプタ関数を生成する.
     302                # 各受け口に対し,アダプタ関数を生成する.
    329303                def finish
    330304                        @source_file = AppFile.open( "#{$gen}/#{@celltype_name}.c" )
     
    336310                @header_file.print "\n/* Generated by #{self.class.name} */\n\n"
    337311
    338                         # NotifierPluginを使用するセルタイプが複数ある場合,それぞれに
    339                         # 対しAdapterGenerator#finishが呼び出される.tTimeEventHandler.hに
    340                         # 続けて書き込んでしまうと,ヘッダーガードの関係で2回目以降の記述
    341                         # が読み込まれなくなってしまう.このため,ファイル名 + セルタイプ名
    342                         # という少し特殊なヘッダーガードを用いる.
     312                        # NotifierPluginを使用するセルタイプが複数ある場合,それぞれに
     313                        # 対しAdapterGenerator#finishが呼び出される.tTimeEventHandler.hに
     314                        # 続けて書き込んでしまうと,ヘッダーガードの関係で2回目以降の記述
     315                        # が読み込まれなくなってしまう.このため,ファイル名 + セルタイプ名
     316                        # という少し特殊なヘッダーガードを用いる.
    343317                        header_guard = "#{@celltype_name}_H_#{@prefix}"
    344318
     
    346320                @header_file.print "\#define #{header_guard}\n\n"
    347321
    348                 # カーネルコンフィギュレータを実行する際,ハンドラ受け口のセルタイプ
    349                 # のセルCBの定義がå¿
    350 è¦ãªå ´åˆãŒã‚る.
     322                # カーネルコンフィギュレータを実行する際,ハンドラ受け口のセルタイプ
     323                # のセルCBの定義が必要な場合がある.
    351324                @header_file.print "\#include \"#{@celltype_name}_aux.h\"\n\n"
    352325
    353                         # 結合å
    354 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の定義は,自分のセルのtecsgen.hよりもå
    355 ˆã«
    356                         # 読み込まなければならないが,このプラグインが複数実行されると,
    357                         # 順序が崩れてしまう.そこで,結合å
    358 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の定義はもう一つの
    359                         # ヘッダーファイル(tCelltypeName_aux.h)から読み込むようにする.
     326                        # 結合先のセルタイプの定義は,自分のセルのtecsgen.hよりも先に
     327                        # 読み込まなければならないが,このプラグインが複数実行されると,
     328                        # 順序が崩れてしまう.そこで,結合先のセルタイプの定義はもう一つの
     329                        # ヘッダーファイル(tCelltypeName_aux.h)から読み込むようにする.
    360330                        aux_header_file = AppFile.open( "#{$gen}/#{@celltype_name}_aux.h" )
    361331                aux_header_file.print "\n/* Generated by #{self.class.name} */\n\n"
     
    368338                        cb_type_only_guard = "#{@celltype_name}_AUX_H_#{@prefix}_CB_TYPE_ONLY"
    369339
    370                         # 結合å
    371 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の定義を読み込む
     340                        # 結合先のセルタイプの定義を読み込む
    372341                        aux_header_file.print "#ifndef TOPPERS_CB_TYPE_ONLY\n"
    373342                    aux_header_file.print "#define TOPPERS_CB_TYPE_ONLY\n"
     
    400369        end
    401370
    402         # ------ 通知のハンドラの種類の定義 -------
     371        # ------ 通知のハンドラの種類の定義 -------
    403372
    404373        class Handler
     
    410379        end
    411380
    412         # 通常のハンドラ
     381        # 通常のハンドラ
    413382        EVENT_HANDLER = Handler::new("ciNotificationHandler")
    414383
    415         # エラーハンドラ (通常のハンドラが失敗した場合に呼び出される)
     384        # エラーハンドラ (通常のハンドラが失敗した場合に呼び出される)
    416385        ERROR_HANDLER = Handler::new("ciErrorNotificationHandler")
    417386
     
    436405        end
    437406
    438         # ------ 通知の属性の定義 -------
     407        # ------ 通知の属性の定義 -------
    439408        #
    440         # ハンドラタイプに合致しない属性が指定された場合に
    441         # エラーを出力できるよう、å
    442 ¨ã¦ã®å±žæ€§ã‚’ここで列挙する。
     409        # ハンドラタイプに合致しない属性が指定された場合に
     410        # エラーを出力できるよう、全ての属性をここで列挙する。
    443411
    444412        SETVAR_ADDR_ATTR =   HandlerAttribute::new("setVariableAddress")
     
    456424        ]
    457425
    458         # ------ ハンドラタイプの定義 -------
     426        # ------ ハンドラタイプの定義 -------
    459427
    460428        class BaseHandlerType
     
    470438
    471439            #=== NotifierPlugin#BaseHandlerType#validate_join
    472             # 指定したセルの結合å
    473 ˆãŒã€ã“のハンドラタイプに該当するかを検証
    474             # handler:: Handler : ハンドラ
    475             # cell:: Cell : セル
    476             # join:: Join : 結合 (declarationがPortであるもの)
     440            # 指定したセルの結合先が、このハンドラタイプに該当するかを検証
     441            # handler:: Handler : ハンドラ
     442            # cell:: Cell : セル
     443            # join:: Join : 結合 (declarationがPortであるもの)
    477444                def validate_join(handler, cell, join)
    478445                return !generate_attr_map(handler, cell).nil?
     
    480447
    481448            #=== NotifierPlugin#BaseHandlerType#generate_attr_map
    482             # 指定したセルの属性と、既知のHandlerAttributeのマッピングを
    483             # 生成し、Hash<HandlerAttribute, Join> (各属性とそれに対応する
    484             # Join(declarationがDeclのもの)を表すHash)、あるいは、
    485                 # マッピングが行えない場合(属性の不足、過剰)はnilを返す。
     449            # 指定したセルの属性と、既知のHandlerAttributeのマッピングを
     450            # 生成し、Hash<HandlerAttribute, Join> (各属性とそれに対応する
     451            # Join(declarationがDeclのもの)を表すHash)、あるいは、
     452                # マッピングが行えない場合(属性の不足、過剰)はnilを返す。
    486453            #
    487             # handler:: Handler : ハンドラ
    488             # cell:: Cell : セル
     454            # handler:: Handler : ハンドラ
     455            # cell:: Cell : セル
    489456                def generate_attr_map(handler, cell)
    490457                        map = {}
     
    496463                                join = join_list.get_item(attr_name.to_sym)
    497464
    498                                 # このセルタイプにおいてå¿
    499 é ˆã®å±žæ€§ã‹?
     465                                # このセルタイプにおいて必須の属性か?
    500466                                is_required = @required_attributes.include?(known_attr)
    501467
    502                                 # 属性の指定が不足している? or 過剰?
    503                                 # 注: ハンドラタイプの判別には、セルで値が指定されているか
    504                                 #     ãŒè€ƒæ
    505 ®ã•ã‚Œã‚‹ã€‚セルタイプで初期値が指定されていても、
    506                                 #     ãã‚Œã¯ãƒãƒ³ãƒ‰ãƒ©ã‚¿ã‚¤ãƒ—の決定に影響しない。
     468                                # 属性の指定が不足している? or 過剰?
     469                                # 注: ハンドラタイプの判別には、セルで値が指定されているか
     470                                #     が考慮される。セルタイプで初期値が指定されていても、
     471                                #     それはハンドラタイプの決定に影響しない。
    507472                                return nil if join.nil? != !is_required
    508473
    509                                 # å¿
    510 è¦ã®ãªã„属性であり、指定もされていないので飛ばす
     474                                # 必要のない属性であり、指定もされていないので飛ばす
    511475                                next if join.nil?
    512476
    513                                 # TODO: attrの結合であることを検証
     477                                # TODO: attrの結合であることを検証
    514478
    515479                                map[known_attr] = join
     
    520484
    521485            #=== NotifierPlugin#BaseHandlerType#gen_cfg_handler_type
    522             # タイムイベントの通知の種類を表すコンフィギュレータの記述を生成し、Stringまたはnilを返す
    523             # handler:: Handler : ハンドラ
     486            # タイムイベントの通知の種類を表すコンフィギュレータの記述を生成し、Stringまたはnilを返す
     487            # handler:: Handler : ハンドラ
    524488                def gen_cfg_handler_type(handler)
    525489                raise "called abstract method gen_cfg_handler_type"
     
    527491
    528492            #=== NotifierPlugin#BaseHandlerType#gen_cfg_handler_parameters
    529             # タイムイベントの通知の引数を表すコンフィギュレータの記述を生成し、String[]を返す
    530             # handler:: Handler : ハンドラ
    531             # join:: Join : 結合 (declarationがPortであるもの)
     493            # タイムイベントの通知の引数を表すコンフィギュレータの記述を生成し、String[]を返す
     494            # handler:: Handler : ハンドラ
     495            # join:: Join : 結合 (declarationがPortであるもの)
    532496            # attrMap:: Hash<HandlerAttribute, Join> :
    533             #     å„属性とそれに対応するJoin (declarationがDeclのもの)
    534             # cell:: Cell : セル
    535                 # adpt_gen:: AdapterGenerator : アダプタ関数を生成するオブジェクト
     497            #     各属性とそれに対応するJoin (declarationがDeclのもの)
     498            # cell:: Cell : セル
     499                # adpt_gen:: AdapterGenerator : アダプタ関数を生成するオブジェクト
    536500                def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
    537501                return nil
     
    539503
    540504            #=== NotifierPlugin#BaseHandlerType#might_fail
    541             # 通知の際、エラーが発生し、その結果エラー通知を呼ぶå¿
    542 è¦ãŒç”Ÿã˜ã‚‹
    543             # かどうかを返す。
     505            # 通知の際、エラーが発生し、その結果エラー通知を呼ぶ必要が生じる
     506            # かどうかを返す。
    544507                def might_fail
    545508                        return false
     
    557520                        id_attr = join.get_rhs_cell.get_celltype.find(:id)
    558521                        if id_attr_join
    559                                 # セル生成時に初期化する場合
     522                                # セル生成時に初期化する場合
    560523                                id = id_attr_join.get_rhs.to_s
    561524                        else
    562                                 # セルタイプの初期化値を使う場合
     525                                # セルタイプの初期化値を使う場合
    563526                                id = id_attr.get_initializer.to_s
    564527                        end
    565528
    566                         # $id$等の置換
     529                        # $id$等の置換
    567530                        name_array = taskCell.get_celltype.get_name_array(taskCell)
    568531                        id = taskCell.get_celltype.subst_name(id, name_array)
     
    617580                        var_value = attrMap[SETVAR_VALUE_ATTR].get_rhs.to_s
    618581
    619                         # $id$等の置換
     582                        # $id$等の置換
    620583                        name_array = cell.get_celltype.get_name_array(cell)
    621584                        var_addr = cell.get_celltype.subst_name(var_addr, name_array)
     
    646609                        var_addr = attrMap[SETVAR_ADDR_ATTR].get_rhs.to_s
    647610
    648                         # $id$等の置換
     611                        # $id$等の置換
    649612                        name_array = cell.get_celltype.get_name_array(cell)
    650613                        var_addr = cell.get_celltype.subst_name(var_addr, name_array)
     
    673636                        var_addr = attrMap[INCVAR_ADDR_ATTR].get_rhs.to_s
    674637
    675                         # $id$等の置換
     638                        # $id$等の置換
    676639                        name_array = cell.get_celltype.get_name_array(cell)
    677640                        var_addr = cell.get_celltype.subst_name(var_addr, name_array)
     
    697660                        id_attr = join.get_rhs_cell.get_celltype.find(:id)
    698661                        if id_attr_join
    699                                 # セル生成時に初期化する場合
     662                                # セル生成時に初期化する場合
    700663                                id = id_attr_join.get_rhs.to_s
    701664                        else
    702                                 # セルタイプの初期化値を使う場合
     665                                # セルタイプの初期化値を使う場合
    703666                                id = id_attr.get_initializer.to_s
    704667                        end
    705668
    706                         # $id$等の置換
     669                        # $id$等の置換
    707670                        name_array = semaphoreCell.get_celltype.get_name_array(semaphoreCell)
    708671                        id = semaphoreCell.get_celltype.subst_name(id, name_array)
     
    737700                        id_attr = join.get_rhs_cell.get_celltype.find(:id)
    738701                        if id_attr_join
    739                                 # セル生成時に初期化する場合
     702                                # セル生成時に初期化する場合
    740703                                id = id_attr_join.get_rhs.to_s
    741704                        else
    742                                 # セルタイプの初期化値を使う場合
     705                                # セルタイプの初期化値を使う場合
    743706                                id = id_attr.get_initializer.to_s
    744707                        end
    745708                        flg_pattern = attrMap[SETFLG_FLAG_ATTR].get_rhs.to_s
    746709
    747                         # $id$等の置換
     710                        # $id$等の置換
    748711                        name_array = eventflagCell.get_celltype.get_name_array(eventflagCell)
    749712                        id = eventflagCell.get_celltype.subst_name(id, name_array)
     
    778741                        id_attr = join.get_rhs_cell.get_celltype.find(:id)
    779742                        if id_attr_join
    780                                 # セル生成時に初期化する場合
     743                                # セル生成時に初期化する場合
    781744                                id = id_attr_join.get_rhs.to_s
    782745                        else
    783                                 # セルタイプの初期化値を使う場合
     746                                # セルタイプの初期化値を使う場合
    784747                                id = id_attr.get_initializer.to_s
    785748                        end
    786749
    787                         # $id$等の置換
     750                        # $id$等の置換
    788751                        name_array = dataqueueCell.get_celltype.get_name_array(dataqueueCell)
    789752                        id = dataqueueCell.get_celltype.subst_name(id, name_array)
     
    812775                        sent_value = attrMap[SNDDTQ_VALUE_ATTR].get_rhs.to_s
    813776
    814                         # $id$等の置換
     777                        # $id$等の置換
    815778                        name_array = cell.get_celltype.get_name_array(cell)
    816779                        sent_value = cell.get_celltype.subst_name(sent_value, name_array)
     
    854817                end
    855818                def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
    856                         # tTimeEventHandlerの結合å
    857 ˆã‚’取得
     819                        # tTimeEventHandlerの結合先を取得
    858820                        handler_cell = join.get_rhs_cell
    859821                call_join = handler_cell.get_join_list.get_item(:ciHandlerBody)
    860822
    861                         # 結合されていない場合はtecsgenがエラーを出すはずなのでここでは
    862                         # エラーにせず無視する.
     823                        # 結合されていない場合はtecsgenがエラーを出すはずなのでここでは
     824                        # エラーにせず無視する.
    863825                        return [] unless call_join
    864826
    865                         # アダプタ関数ハンドルを取得
     827                        # アダプタ関数ハンドルを取得
    866828                        adapter_handle = adpt_gen.make_adapter_handle(call_join)
    867829                return [adapter_handle[1], adapter_handle[0]]
     
    897859
    898860    #@celltype:: Celltype
    899     #@option:: String     :オプション文字列
     861    #@option:: String     :オプション文字列
    900862    def initialize( celltype, option )
    901863        super
    902864        @plugin_arg_check_proc_tab = NotifierPluginArgProc
    903865        @plugin_arg_str = option
    904         @plugin_arg_str = option.gsub( /\A"(.*)/, '\1' )    # 前後の "" を取り除く
     866        @plugin_arg_str = option.gsub( /\A"(.*)/, '\1' )    # 前後の "" を取り除く
    905867        @plugin_arg_str.sub!( /(.*)"\z/, '\1' )
    906868        @factory = nil
     
    940902        kernelCfg.print "\#include \"tTimeEventHandler.h\"\n"
    941903
    942                 # アダプタ関数を生成する準備
     904                # アダプタ関数を生成する準備
    943905                @adpt_gen = AdapterGenerator.new("tTimeEventHandler", @celltype.get_global_name)
    944906
    945         # 属性置換が行えることを検証する。
    946         # ここで行うのは、factoryで指定された属性名が
    947         # 存在することを確認し、しなければエラーを出力することのみである。
    948         # セルごとの処理の最中にエラーを出力することも可能ではあるが、
    949         # そうするとセルタイプ側の問題であるのにもかかわらず、セルごとに
    950         # エラーが表示されてしまう。
     907        # 属性置換が行えることを検証する。
     908        # ここで行うのは、factoryで指定された属性名が
     909        # 存在することを確認し、しなければエラーを出力することのみである。
     910        # セルごとの処理の最中にエラーを出力することも可能ではあるが、
     911        # そうするとセルタイプ側の問題であるのにもかかわらず、セルごとに
     912        # エラーが表示されてしまう。
    951913        # {{attribute_name}} -> attribute_value
    952914        @factory.scan(/\{\{([a-zA-Z0-9_]*?)\}\}/) { |match|
    953915                name = $1.to_sym
    954916
    955                 # {{_handler_params_}} はハンドラに関する指定。プラグインå†
    956 ã§å€¤ãŒç”Ÿæˆã•ã‚Œã‚‹
     917                # {{_handler_params_}} はハンドラに関する指定。プラグイン内で値が生成される
    957918                next if name == :_handler_params_
    958919
     
    968929        }
    969930
    970                 # アダプタ関数の生成を完了させる
     931                # アダプタ関数の生成を完了させる
    971932                @adpt_gen.finish
    972933
     
    982943        handler_flag = nil
    983944
    984                 # ignoreErrorsを取得
     945                # ignoreErrorsを取得
    985946                ignoreErrors_attr_join = cell.get_join_list.get_item(:ignoreErrors)
    986947                ignoreErrors_attr = cell.get_celltype.find(:ignoreErrors)
    987948                if ignoreErrors_attr_join
    988                         # セル生成時に初期化する場合
     949                        # セル生成時に初期化する場合
    989950                        ignoreErrors = ignoreErrors_attr_join.get_rhs.to_s
    990951                else
    991                         # セルタイプの初期化値を使う場合
     952                        # セルタイプの初期化値を使う場合
    992953                        ignoreErrors = ignoreErrors_attr.get_initializer.to_s
    993954                end
     
    1002963
    1003964        [EVENT_HANDLER, ERROR_HANDLER].each { |handler|
    1004                 # 呼び口の結合を取得
     965                # 呼び口の結合を取得
    1005966                call_join = cell.get_join_list.get_item(handler.call_port_name.to_sym)
    1006967
    1007                 # ハンドラタイプを判別する
     968                # ハンドラタイプを判別する
    1008969                matches = HANDLER_TYPES.select { |handler_type|
    1009970                        handler_type.validate_join(handler, cell, call_join)
     
    1015976                end
    1016977
    1017                         # 最初に見つかった有効なハンドラタイプを使用
     978                        # 最初に見つかった有効なハンドラタイプを使用
    1018979                ht = matches[0]
    1019980
    1020                         # 通知ハンドラで「エラーが発生するはずがない」のに「エラーハンドラが指定されている」
    1021                         # もしくはその逆のパターンを検出する。
    1022                         # (handler_flagがnilである場合、ハンドラタイプが不明であり、エラーが発生するか不明
    1023                         #  なため、検出は行わない。)
     981                        # 通知ハンドラで「エラーが発生するはずがない」のに「エラーハンドラが指定されている」
     982                        # もしくはその逆のパターンを検出する。
     983                        # (handler_flagがnilである場合、ハンドラタイプが不明であり、エラーが発生するか不明
     984                        #  なため、検出は行わない。)
    1024985                if handler == ERROR_HANDLER && !ht.is_a?(NullHandlerType) && !event_handler_might_fail
    1025986                        cdl_error( "ASP1004 cell $1: handler type $2 which never raises an error was inferred for the normal notification handler, but an error notification handler was specified.",
     
    1036997                end
    1037998
    1038                         # 通知方法の静的API記述を生成する
     999                        # 通知方法の静的API記述を生成する
    10391000                handler_flag = ht.gen_cfg_handler_type(handler)
    10401001                handler_flags << handler_flag if handler_flag
     
    10501011        }
    10511012
    1052                 # $id$等の置換
     1013                # $id$等の置換
    10531014                name_array = cell.get_celltype.get_name_array(cell)
    10541015                handler_args.collect! { |e|
     
    10601021                }
    10611022
    1062         # tecsgen.cfgの記述を生成する。
    1063         # factoryに対し、パラメータ置換を行う。
     1023        # tecsgen.cfgの記述を生成する。
     1024        # factoryに対し、パラメータ置換を行う。
    10641025        # {{attribute_name}} -> attribute_value
    10651026        text = @factory.gsub(/\{\{([a-zA-Z0-9_]*?)\}\}/) { |match|
     
    10671028                        subst_attr = cell.get_celltype.find(name)
    10681029
    1069                         # {{_handler_params_}} はハンドラの指定に置換する。
     1030                        # {{_handler_params_}} はハンドラの指定に置換する。
    10701031                        if name == :_handler_params_
    10711032                        args_joined = handler_flags.join(' | ')
     
    10781039
    10791040                        unless subst_attr
    1080                                 # 属性が見つからないというエラーはすでに報告されているので
    1081                                 # ここではダミー値を返しておくだけである。
     1041                                # 属性が見つからないというエラーはすでに報告されているので
     1042                                # ここではダミー値を返しておくだけである。
    10821043                                next ""
    10831044                        end
     
    10851046                        subst_attr_join = cell.get_join_list.get_item(name)
    10861047                        if subst_attr_join
    1087                                 # セル生成時に初期化する場合
     1048                                # セル生成時に初期化する場合
    10881049                                subst = subst_attr_join.get_rhs.to_s
    10891050                        else
    1090                                 # セルタイプの初期化値を使う場合
     1051                                # セルタイプの初期化値を使う場合
    10911052                                subst = subst_attr.get_initializer.to_s
    10921053                        end
    10931054
    1094                         # $id$等の置換
     1055                        # $id$等の置換
    10951056                        cell.get_celltype.subst_name(subst, name_array)
    10961057        }
    10971058
    1098         # 出力
     1059        # 出力
    10991060        kernelCfg.puts text
    11001061
Note: See TracChangeset for help on using the changeset viewer.