Ignore:
Timestamp:
May 22, 2019, 10:03:37 PM (5 years ago)
Author:
coas-nagasima
Message:

ビルドが通るよう更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/lib/GenTransparentMarshaler.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    8 #   ä¸Šè¨˜è‘—作権è€
    9 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    10 #   ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    11 #   å¤‰ãƒ»å†é
    12 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    13 #   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    14 #       æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    15 #       ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    16 #   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    17 #       ç”¨ã§ãã‚‹å½¢ã§å†é
    18 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    19 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    20 #       è€
    21 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    22 #       ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    23 #   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    24 #       ç”¨ã§ããªã„形で再é
    25 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    26 #       ã¨ï¼Ž
    27 #     (a) 再é
    28 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    29 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    30 #         ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    31 #     (b) 再é
    32 å¸ƒã®å½¢æ
    33 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    34 #         å ±å‘Šã™ã‚‹ã“と.
    35 #   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    36 #       å®³ã‹ã‚‰ã‚‚,上記著作権è€
    37 ãŠã‚ˆã³TOPPERSプロジェクトをå
    38 è²¬ã™ã‚‹ã“と.
    39 #       ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    40 #       ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    41 ãŠã‚ˆã³TOPPERSプロジェクトを
    42 #       å
    43 è²¬ã™ã‚‹ã“と.
     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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    5237#   $Id$
    5338#++
    5439
    55 #プラグインオプション用変数
     40#プラグインオプション用変数
    5641#@task_priority:: Integer
    5742#@channelCelltype:: String
     
    6045module GenTransparentMarshaler
    6146
    62   # プラグイン引数名と Proc
     47  # プラグイン引数名と Proc
    6348  RPCPluginArgProc = {
    6449    "taskPriority"    => Proc.new { |obj,rhs| obj.set_taskPriority rhs },
     
    6954  }
    7055
    71   #=== プラグイン引数 taskPriority のチェック
     56  #=== プラグイン引数 taskPriority のチェック
    7257  def set_taskPriority( rhs )
    7358    @task_priority = rhs
    7459  end
    7560
    76   #=== プラグイン引数 channelCelltype のチェック
     61  #=== プラグイン引数 channelCelltype のチェック
    7762  def set_channelCelltype( rhs )
    7863    @channelCelltype = rhs.to_sym
     
    8671  end
    8772
    88   #=== プラグイン引数 TDRCelltype のチェック
     73  #=== プラグイン引数 TDRCelltype のチェック
    8974  def set_TDRCelltype( rhs )
    9075    @TDRCelltype = rhs.to_sym
     
    9883  end
    9984
    100   #=== プラグイン引数 channelCellName のチェック
     85  #=== プラグイン引数 channelCellName のチェック
    10186  def set_channelCellName( rhs )
    10287    @channelCellName = rhs
     
    10893  end
    10994
    110   #=== プラグイン引数 PPAllocatorSize のチェック
     95  #=== プラグイン引数 PPAllocatorSize のチェック
    11196  def set_PPAllocatorSize( rhs )
    11297    @PPAllocatorSize = rhs
    11398  end
    11499
    115   #=== marshaler のセルタイプ名を設定する
     100  #=== marshaler のセルタイプ名を設定する
    116101  def initialize_transparent_marshaler cell_name
    117102    @task_priority = 8
     
    135120
    136121    f = CFile.open( @marshaler_celltype_file_name, "w" )
    137     # 同じå†
    138 å®¹ã‚’二度書く可能性あり (AppFile は不可)
     122    # 同じ内容を二度書く可能性あり (AppFile は不可)
    139123
    140124    f.print <<EOT
     
    157141  end
    158142
    159   #===  受け口関数の本体コードを生成(頭部と末尾は別途出力)
    160   #ct_name:: Symbol    (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
     143  #===  受け口関数の本体コードを生成(頭部と末尾は別途出力)
     144  #ct_name:: Symbol    (through プラグインで生成された) セルタイプ名 .Symbol として送られてくる(らしい)
    161145  def gen_ep_func_body( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    162146
    163     # unmarshaler クラスか?
     147    # unmarshaler クラスか?
    164148    if ct_name == @unmarshaler_celltype_name.to_sym then
    165149      gen_ep_func_body_unmarshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
     
    169153  end
    170154
    171   #===  marshal コードの生成
     155  #===  marshal コードの生成
    172156  def gen_ep_func_body_marshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    173157
     
    175159    b_ret_er = false
    176160
    177     # 関数の戻り値のå
    178 ƒã®åž‹ã‚’å¾—ã‚‹(typedef されている場合)
     161    # 関数の戻り値の元の型を得る(typedef されている場合)
    179162    type = func_type.get_type.get_original_type
    180163
    181     # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
     164    # 戻り値記憶用の変数を出力(void 型の関数では出力しない)
    182165    if ! type.is_void? then
    183166      if func_type.get_type.kind_of?( DefinedType ) && ( func_type.get_type.get_type_str == "ER" || func_type.get_type.get_type_str == "ER_INT" ) then
     
    194177    file.print( "    FLGPTN  flgptn;\n" )
    195178
    196     # 呼びå
    197 ˆã® signature を取り出す
     179    # 呼び先の signature を取り出す
    198180    signature = @signature
    199181
    200     # 関数 ID (整数値)
     182    # 関数 ID (整数値)
    201183    func_id = signature.get_id_from_func_name( func_name )
    202184    file.print( "    int16_t  func_id_ = #{func_id};    /* id of #{func_name}: #{func_id} */\n" )
    203185
    204     # シングルトンでないか?
     186    # シングルトンでないか?
    205187    if ! b_singleton then
    206188
    207       # singleton でなければ p_cellcb 取得コードを出力
     189      # singleton でなければ p_cellcb 取得コードを出力
    208190      file.print <<EOT
    209191    #{ct_name}_CB *p_cellcb;
     
    213195EOT
    214196
    215       # エラーを返すか?
     197      # エラーを返すか?
    216198      if b_ret_er then
    217199        file.print <<EOT
     
    223205        file.print <<EOT
    224206    }else{
    225         /* エラー処理コードをここに記述 */
    226     }
    227 EOT
    228       end
    229     end
    230 
    231     # channel lock コード
     207        /* エラー処理コードをここに記述 */
     208    }
     209EOT
     210      end
     211    end
     212
     213    # channel lock コード
    232214    file.print <<EOT
    233215    /* Channel Lock */
     
    237219EOT
    238220
    239     # SOP を送信
    240     file.print "    /* SOPの送出 */\n"
     221    # SOP を送信
     222    file.print "    /* SOPの送出 */\n"
    241223    file.print "    if( ( ercd_ = cTDR_sendSOP( true ) ) != E_OK )\n"
    242224    file.print "      goto error_reset;\n"
    243225
    244     # func_id を送信
    245     file.print "    /* 関数 id の送出 */\n"
     226    # func_id を送信
     227    file.print "    /* 関数 id の送出 */\n"
    246228    file.print "    if( ( ercd_ = cTDR_putInt16( func_id_ ) ) != E_OK )\n"
    247229    file.print "        goto error_reset;\n"
     
    250232    # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"
    251233
    252     b_get = false    # marshal なら put
     234    b_get = false    # marshal なら put
    253235    b_marshal = true  # marshal
    254236
    255     # in 方向のå
    256 ¥å‡ºåŠ›ã‚’出力
    257     file.print "    /* å
    258 ¥åŠ›å¼•æ•°é€å‡º */\n"
     237    # in 方向の入出力を出力
     238    file.print "    /* 入力引数送出 */\n"
    259239    print_params( params, file, 1, b_marshal, b_get, true, func_type.is_oneway? )
    260240    print_params( params, file, 1, b_marshal, b_get, false, func_type.is_oneway? )
     
    264244    end
    265245
    266     file.print "    /* EOPの送出(パケットの掃きだし) */\n"
     246    file.print "    /* EOPの送出(パケットの掃きだし) */\n"
    267247    if ! func_type.is_oneway? then
    268248      b_continue = "true"
     
    293273
    294274    if( b_void == false )then
    295       # 呼びå
    296 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     275      # 呼び元に戻り値をリターン
    297276      file.print( "    return retval_;\n" )
    298277    else
     
    307286EOT
    308287
    309     # channel lock コード
     288    # channel lock コード
    310289    file.print <<EOT
    311290    /* Channel Lock */
     
    316295
    317296    if( b_ret_er != false )then
    318       # 呼びå
    319 ƒã«æˆ»ã‚Šå€¤ã‚’リターン
     297      # 呼び元に戻り値をリターン
    320298      file.print( "    return ercd_;\n" )
    321299    else
     
    325303  end
    326304
    327   #===  unmarshal コードの生成
     305  #===  unmarshal コードの生成
    328306  def gen_ep_func_body_unmarshal( file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params )
    329307
     
    331309    b_ret_er = false
    332310
    333     # func_id を得るコードを生成
     311    # func_id を得るコードを生成
    334312    file.print <<EOT
    335313
     
    352330        file.print <<EOT
    353331    }else{
    354         /* エラー処理コードをここに記述 */
     332        /* エラー処理コードをここに記述 */
    355333    }
    356334EOT
     
    359337    file.print <<EOT
    360338
    361     /* SOPのチェック */
     339    /* SOPのチェック */
    362340    if( (ercd_=cTDR_receiveSOP( false )) != E_OK )
    363341        goto error_reset;
    364     /* func_id の取得 */
     342    /* func_id の取得 */
    365343    if( (ercd_=cTDR_getInt16( &func_id_ )) != E_OK )
    366344        goto error_reset;
     
    372350EOT
    373351
    374     # 呼びå
    375 ˆã® signature を取り出す
     352    # 呼び先の signature を取り出す
    376353    # port = @celltype.find( @next_cell_port_name )
    377354    # signature = port.get_signature
    378355    signature = @signature
    379356
    380     # through の signature に含まれる すべての関数について
     357    # through の signature に含まれる すべての関数について
    381358    signature.get_function_head_array.each { |f|
    382359      f_name = f.get_name
     
    384361      id = signature.get_id_from_func_name( f_name )
    385362
    386       # 関数は返り値を持つか?
     363      # 関数は返り値を持つか?
    387364      if f_type.get_type.is_void? then
    388365        b_void = true
     
    391368      end
    392369
    393       # パケットの終わりをチェック(未受け取りのデータが残っていないかチェック)
     370      # パケットの終わりをチェック(未受け取りのデータが残っていないかチェック)
    394371      file.print "    case #{id}:       /*** #{f_name} ***/ \n"
    395372      file.print "        if( tTransparentUnmarshaler_#{@signature.get_global_name}_#{f_name}() != E_OK )\n"
     
    400377
    401378    if @PPAllocatorSize then
    402       ppallocator_dealloc_str = "    /* PPAllocator のすべてを解放 */\n    cPPAllocator_dealloc_all();"
     379      ppallocator_dealloc_str = "    /* PPAllocator のすべてを解放 */\n    cPPAllocator_dealloc_all();"
    403380    else
    404381      ppallocator_dealloc_str = ""
     
    423400
    424401  # IN b_marshal, b_get
    425   #  b_marshal = true  && b_get == false   :  マーシャラでå
    426 ¥åŠ›å¼•æ•°é€å‡º
    427   #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
    428   #  b_marshal = false && b_get == true    :  アンマーシャラでå
    429 ¥åŠ›å¼•æ•°å—取
    430   #  b_marshal = false && b_get == get     :  アンマーシャラで出力引数送出
     402  #  b_marshal = true  && b_get == false   :  マーシャラで入力引数送出
     403  #  b_marshal = true  && b_get == true    :  マーシャラで出力引数受取
     404  #  b_marshal = false && b_get == true    :  アンマーシャラで入力引数受取
     405  #  b_marshal = false && b_get == get     :  アンマーシャラで出力引数送出
    431406  def print_params( params, file, nest, b_marshal, b_get, b_referenced, b_oneway = false )
    432407    params.each{ |param|
     
    439414      type = param.get_type
    440415      if b_oneway && dir == :IN && type.get_original_type.kind_of?( PtrType ) || type.get_original_type.kind_of?( ArrayType ) then
    441         # oneway, in, PtrType の場合コピー
     416        # oneway, in, PtrType の場合コピー
    442417        alloc_cp = "cPPAllocator_alloc"
    443418        alloc_cp_extra = nil
     
    461436  end
    462437
    463   #=== コピーしない引数渡しコードの出力
     438  #=== コピーしない引数渡しコードの出力
    464439  def print_param_nc( name, type, file, nest, b_marshal, outer, outer2, b_get )
    465440    indent = "    " * ( nest + 1 )
     
    481456        when :SIGNED
    482457          if bit_size == -1 || bit_size == -11 then
    483             # signed char の場合、signed を指定する
     458            # signed char の場合、signed を指定する
    484459            signC = "S"
    485460            sign  = "s"
     
    574549
    575550
    576   #=== PREAMBLE 部のコード生成
    577   # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
     551  #=== PREAMBLE 部のコード生成
     552  # アンマーシャラセルタイプの場合、アンマーシャラ関数のプロトタイプ宣言を生成
    578553  def gen_preamble file, b_singleton, ct_name, global_name
    579554    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    581556    end
    582557
    583     file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
    584     # signature に含まれる すべての関数について
     558    file.print "/* アンマーシャラ関数のプロトタイプ宣言 */\n"
     559    # signature に含まれる すべての関数について
    585560    @signature.get_function_head_array.each { |f|
    586561      f_name = f.get_name
     
    592567  end
    593568
    594   #=== POSTAMBLE 部のコード生成
    595   # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
     569  #=== POSTAMBLE 部のコード生成
     570  # アンマーシャラセルタイプの場合、アンマーシャラ関数の生成
    596571  def gen_postamble file, b_singleton, ct_name, global_name
    597572    if ct_name != @unmarshaler_celltype_name.to_sym then
     
    599574    end
    600575
    601     file.print "\n/*** アンマーシャラ関数 ***/\n\n"
     576    file.print "\n/*** アンマーシャラ関数 ***/\n\n"
    602577    @signature.get_function_head_array.each { |f|
    603578      f_name = f.get_name
     
    605580      id = @signature.get_id_from_func_name( f_name )
    606581
    607       # 関数は返り値を持つか?
     582      # 関数は返り値を持つか?
    608583      if f_type.get_type.is_void? then
    609584        b_void = true
     
    624599      file.print "      CELLCB  *p_cellcb;\n"
    625600
    626       # 引数を受取る変数の定義
     601      # 引数を受取る変数の定義
    627602      param_list = f.get_declarator.get_type.get_paramlist.get_items
    628603           # FuncHead->  Decl->    FuncType->ParamList
     
    639614        end
    640615
    641         type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
     616        type_str = type.get_type_str.gsub( /\bconst\b */, "" ) # "const" を外す
    642617
    643618        file.printf( "    %-12s %s%s%s%s;\n", type_str, aster, name, aster2, type.get_type_str_post )
    644619      }
    645620
    646       # 戻り値を受け取る変数の定義
     621      # 戻り値を受け取る変数の定義
    647622      if ! b_void then
    648623        if f.is_oneway? then
    649           retval_ptr = ""   # oneway の場合、受け取るが捨てられる
     624          retval_ptr = ""   # oneway の場合、受け取るが捨てられる
    650625        else
    651626          retval_ptr = "*"
     
    654629      end
    655630
    656       # in 方向のå
    657 ¥å‡ºåŠ›ã‚’å
    658 ¥åŠ›
    659       file.print "\n        /* å
    660 ¥åŠ›å¼•æ•°å—取 */\n"
    661       b_get = true    # unmarshal では get
     631      # in 方向の入出力を入力
     632      file.print "\n        /* 入力引数受取 */\n"
     633      b_get = true    # unmarshal では get
    662634      b_marshal  = false
    663635      print_params( param_list, file, 1, b_marshal, b_get, true, f.is_oneway? )
     
    668640      end
    669641
    670       # パケットの受信完了
    671       # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
    672       file.print "        /* パケット終わりをチェック */\n"
     642      # パケットの受信完了
     643      # mikan 本当は、対象関数を呼出す後に実施したい.呼出しパケットの使用終わりを宣言する目的として
     644      file.print "        /* パケット終わりをチェック */\n"
    673645      if ! f.is_oneway? then
    674646        b_continue = "true"
     
    679651      file.print "        goto error_reset;\n\n"
    680652
    681       # 対象関数を呼出す
    682       file.print "    /* 対象関数の呼出し */\n"
     653      # 対象関数を呼出す
     654      file.print "    /* 対象関数の呼出し */\n"
    683655      if b_void then
    684656        file.print( "    cServerCall_#{f_name}(" )
     
    695667      file.print( " );\n" )
    696668
    697       # 戻り値、出力引数の受取コードの生成
    698 
    699       # oneway の場合出力、戻り値が無く、受取をå¾
    700 ãŸãªã„(非同期な呼出し)
     669      # 戻り値、出力引数の受取コードの生成
     670
     671      # oneway の場合出力、戻り値が無く、受取を待たない(非同期な呼出し)
    701672      if ! f.is_oneway? then
    702673        file.print <<EOT
    703     /* 関数処理の終了を通知 */
     674    /* 関数処理の終了を通知 */
    704675    if( ( ercd_ = cEventflag_set( 0x01 ) ) != E_OK ){
    705676      goto error_reset;
Note: See TracChangeset for help on using the changeset viewer.