Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/MrubyBridgeSignaturePlugin.rb
- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/MrubyBridgeSignaturePlugin.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby;charset=UTF-8
r388 r389 5 5 # Copyright (C) 2008-2017 by TOPPERS Project 6 6 # 7 # ä¸è¨èä½æ¨©è 8 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 9 # ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 10 # å¤ã»åé 11 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 12 # (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 13 # 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 14 # ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 15 # (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 16 # ç¨ã§ããå½¢ã§åé 17 å¸ããå ´åã«ã¯ï¼åé 18 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 19 # è 20 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 21 # ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 22 # (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 23 # ç¨ã§ããªãå½¢ã§åé 24 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 25 # ã¨ï¼ 26 # (a) åé 27 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 28 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 29 # ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 30 # (b) åé 31 å¸ã®å½¢æ 32 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 33 # å ±åãããã¨ï¼ 34 # (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 35 # 害ãããï¼ä¸è¨èä½æ¨©è 36 ããã³TOPPERSããã¸ã§ã¯ããå 37 責ãããã¨ï¼ 38 # ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 39 # ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 40 ããã³TOPPERSããã¸ã§ã¯ãã 41 # å 42 責ãããã¨ï¼ 7 # 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 8 # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 9 # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 10 # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 11 # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 12 # スコード中に含まれていること. 13 # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 14 # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 15 # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 16 # の無保証規定を掲載すること. 17 # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 18 # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 19 # と. 20 # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 21 # 作権表示,この利用条件および下記の無保証規定を掲載すること. 22 # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 23 # 報告すること. 24 # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 25 # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 26 # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 27 # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 28 # 免責すること. 43 29 # 44 # æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 45 ã 46 # ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 47 # ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 48 # ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 49 # ã®è²¬ä»»ãè² ããªãï¼ 30 # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 31 # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 32 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 33 # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 34 # の責任を負わない. 50 35 # 51 36 # $Id$ … … 53 38 54 39 # Todo: 55 # çæãããã®40 # 生成するもの 56 41 # gen_cdl_file 57 # ããªãã¸åæåã»ã«ã¿ã¤ã (ã·ã°ããã£ãã¨)58 # @@init_celltypes ã«è¨é²59 # ããªãã¸ã»ã«ã¿ã¤ã (ã·ã°ããã£ãã¨)60 # @@celltypes ã«è¨é²61 # æ§é ä½ã»ã«ã¿ã¤ã62 # @@struct_list ã«è¨é²42 # ブリッジ初期化セルタイプ (シグニチャごと) 43 # @@init_celltypes に記録 44 # ブリッジセルタイプ (シグニチャごと) 45 # @@celltypes に記録 46 # 構造体セルタイプ 47 # @@struct_list に記録 63 48 # new_cell 64 # TECS åæåã»ã«(ãããã¿ã¤ã宣è¨)65 # @@VM_init_cells ã«è¨é²66 # @@VM_struct_list ã«è¨é²67 # @@VM_ptr_list ã«è¨é²49 # TECS 初期化セル(プロトタイプ宣言) 50 # @@VM_init_cells に記録 51 # @@VM_struct_list に記録 52 # @@VM_ptr_list に記録 68 53 # gen_post_code 69 # æ§é ä½åæåã»ã«70 # ãã¤ã³ã¿åæåã»ã«71 # TECS åæåã»ã«54 # 構造体初期化セル 55 # ポインタ初期化セル 56 # TECS 初期化セル 72 57 # 73 # ep_func ã®ä½æ74 # signature, ãã¤ã³ã¿ãæ§é ä½ â¦ åæååãå£ï¼mruby VM ã¸ã®ç»é²75 # ãã¤ã³ã¿76 # preamble ã®ä½æ77 # ãã¤ã³ã¿ãæ§é ä½ â¦ ã¢ã¯ã»ã¹ç¨ã³ã¼ãã®çæ78 # signature ⦠ããªãã¸é¢æ°ã®ãããã¿ã¤ã宣è¨79 # postamble ã®ä½æ80 # signature ⦠ããªãã¸é¢æ°ã®å®ç¾©58 # ep_func の作成 59 # signature, ポインタ、構造体 … 初期化受け口=mruby VM への登録 60 # ポインタ 61 # preamble の作成 62 # ポインタ、構造体 … アクセス用コードの生成 63 # signature … ブリッジ関数のプロトタイプ宣言 64 # postamble の作成 65 # signature … ブリッジ関数の定義 81 66 82 67 class MrubyBridgeSignaturePlugin < SignaturePlugin 83 68 84 # ãã©ã°ã¤ã³å¼æ°å=> Proc69 # プラグイン引数名 => Proc 85 70 MrubyBridgePluginArgProc = { 86 71 "ignoreUnsigned" => Proc.new { |obj,rhs| obj.set_ignoreUnsigned rhs }, … … 92 77 @@b_no_banner = false # 93 78 @@b_gen_post_code_by_dependent = false # true if gen_post_code is called by MrubyBridgeCellPlugin 94 @@celltypes = { } # {celltype_name => [ BridgePlugin ã®ã¤ã³ã¹ã¿ã³ã¹ã®é 95 å } 96 @@init_celltypes = { } # {celltype_name => [ BridgePlugin ã®ã¤ã³ã¹ã¿ã³ã¹ã®é 97 å } 79 @@celltypes = { } # {celltype_name => [ BridgePlugin のインスタンスの配列 } 80 @@init_celltypes = { } # {celltype_name => [ BridgePlugin のインスタンスの配列 } 98 81 @@struct_list = { } # {struct_name=>StructType} 99 @@ptr_list = { } # {ptr_celltype_name=> @@TYPE_MAP ã®å¯¾å¿ãããã®}82 @@ptr_list = { } # {ptr_celltype_name=> @@TYPE_MAP の対応するもの} 100 83 @@VM_list = { } # VM_name => true 101 @@VM_celltypes = { } # VM_name => { @celltype_name => ã»ã«ã®é 102 å } 84 @@VM_celltypes = { } # VM_name => { @celltype_name => セルの配列 } 103 85 @@VM_struct_list = { } # {name=>StructType} 104 @@VM_ptr_list = { } # { VM_name => {name=> @@TYPE_MAP ã®å¯¾å¿ãããã®} }86 @@VM_ptr_list = { } # { VM_name => {name=> @@TYPE_MAP の対応するもの} } 105 87 @@TYPE_MAP = { # type_str class GET_SET 106 88 :char_t => [:char_t, "Char", :Char, :INT ], … … 119 101 120 102 :int => [:int, "Int", :Int, :INT ], 121 :char => [:char, "Char", :Char, :INT ], # char 㯠char_t ã¨ãã¦æ±ã103 :char => [:char, "Char", :Char, :INT ], # char は char_t として扱う 122 104 :short => [:short, "Short", :Int, :INT ], 123 105 :long => [:long, "Long", :Int, :INT ], … … 141 123 # included or excluded functions 142 124 143 ### ãã¼ããããæç¹ã§å®è¡ããã###144 145 # -I ã« $(TECSPATH)/mruby ã追å125 ### ロードされた時点で実行される ### 126 127 # -I に $(TECSPATH)/mruby を追加 146 128 # TECSGEN::Makefile.add_obj "$(MRUBY_MAIN_OBJ)" 147 129 TECSGEN::Makefile.add_ldflag "-lmruby -L$(MRUBYPATH)/lib -lm" … … 150 132 # TECSGEN::Makefile.add_var "MRUBY_MAIN_OBJ", "$(_TECS_OBJ_DIR)tecs_mruby.o", "CHANGE this if your have your main" 151 133 152 #=== ãã©ã°ã¤ã³ã¤ã³ã¹ã¿ã³ã¹ã®åæå153 # æ»ãå¤ãå¼æ°ã®åã使ç¨å¯è½ãªãã®ããã§ãã¯ãã134 #=== プラグインインスタンスの初期化 135 # 戻り値、引数の型が使用可能なものかチェックする 154 136 # 155 137 def initialize( signature, option ) … … 184 166 185 167 if signature.get_function_head_array == nil then 186 return # 以åã«ææ³ã¨ã©ã¼çºç168 return # 以前に文法エラー発生 187 169 end 188 170 … … 281 263 when FloatType 282 264 when PtrType 283 ttype_org = type_org.get_type # ãã¤ã³ã¿ã®æãã¦ããå 284 ã®å 285 ttype = ttype_org.get_original_type # ä¸è¨ã® typedef ããã¦ããå ´åãå 286 ã®å 265 ttype_org = type_org.get_type # ポインタの指している先の型 266 ttype = ttype_org.get_original_type # 上記の typedef されている場合、元の型 287 267 register_ptr_type ttype_org, fh 288 268 … … 340 320 end 341 321 342 #=== æ§é ä½ã®ã¡ã³ãã¼ã®åã®ãã§ãã¯322 #=== 構造体のメンバーの型のチェック 343 323 def check_struct_member struct_type, fh 344 324 #p "tag name:#{struct_type.get_name}" … … 349 329 cdl_info( "MRI9999 tagless-struct cannot be handled, $1 automatcally excluded", fh.get_name ) 350 330 @auto_exclude_list[ fh.get_name ] = fh 351 return # ç»é²ããªãããã«æã¡åã331 return # 登録しないように打ち切る 352 332 else 353 333 cdl_error( "MRB10007 tagless-struct cannot be handled") … … 363 343 d.get_name, d.get_type.get_type_str + d.get_type.get_type_str_post, fh.get_name ) 364 344 @auto_exclude_list[ fh.get_name ] = fh 365 return # ç»é²ããªãããã«æã¡åã345 return # 登録しないように打ち切る 366 346 else 367 347 cdl_error( "MRB1006 $1: type $2 not allowed for struct member", d.get_name, d.get_type.get_type_str + d.get_type.get_type_str_post ) … … 400 380 return 401 381 end 402 tstr = ttype.get_type_str.sub( /const /, "" ) # const ã¯ç¡è¦403 tstr = tstr.sub( /volatile /, "" ) # volatile ãç¡è¦382 tstr = ttype.get_type_str.sub( /const /, "" ) # const は無視 383 tstr = tstr.sub( /volatile /, "" ) # volatile も無視 404 384 if @b_ignoreUnsigned then 405 tstr = tstr.sub( /unsigned /, "" ) # volatile ãç¡è¦406 tstr = tstr.sub( /uint/, "int" ) # volatile ãç¡è¦407 tstr = tstr.sub( /[cs]char/, "char" ) # volatile ãç¡è¦385 tstr = tstr.sub( /unsigned /, "" ) # volatile も無視 386 tstr = tstr.sub( /uint/, "int" ) # volatile も無視 387 tstr = tstr.sub( /[cs]char/, "char" ) # volatile も無視 408 388 end 409 389 return @@TYPE_MAP[ tstr.to_sym ] 410 390 end 411 391 412 #=== CDL ãã¡ã¤ã«ã®çæ413 # typedef, signature, celltype, cell ã³ã¼ããçæ414 #file:: FILE çæãããã¡ã¤ã«392 #=== CDL ファイルの生成 393 # typedef, signature, celltype, cell コードを生成 394 #file:: FILE 生成するファイル 415 395 def gen_cdl_file(file) 416 396 417 # ããªãã¸ã»ã«ã¿ã¤ãã®çæ397 # ブリッジセルタイプの生成 418 398 if @@celltypes[ @celltype_name ] == nil then 419 399 @@celltypes[ @celltype_name ] = [ self ] … … 458 438 EOT 459 439 460 # æ§é ä½ã»ã«ã¿ã¤ãã®çæ440 # 構造体セルタイプの生成 461 441 @struct_list.each{ |name, sttype| 462 442 if @@struct_list[ name ] == nil then … … 479 459 end 480 460 481 #=== gen_cdl_file ã§å®ç¾©ããã»ã«ã¿ã¤ãã« æ°ããã»ã«ãå®ç¾©ããã482 # cell ã®ã»ã«ã¿ã¤ãã®ååã¯@celltype_name461 #=== gen_cdl_file で定義したセルタイプに 新しいセルが定義された 462 # cell のセルタイプの名前は @celltype_name 483 463 def new_cell cell 484 464 if cell.get_celltype.get_name != @celltype_name then … … 499 479 file = CFile.open( initializer_celltype_cdl, "w" ) 500 480 501 # TECS åæåã»ã«(ãããã¿ã¤ã宣è¨)481 # TECS 初期化セル(プロトタイプ宣言) 502 482 print_msg " MrubyBridgePlugin: join your VM's cInitialize to #{vm_name}_TECSInitializer.eInitialize\n" 503 483 … … 544 524 end 545 525 546 #=== ãã©ã°ã¤ã³ã CDL ã® POST ã³ã¼ããçæ547 # tmp_plugin_post_code.cdl ã¸ã®åºå526 #=== プラグインが CDL の POST コードを生成 527 # tmp_plugin_post_code.cdl への出力 548 528 def self.gen_post_code file 549 529 dbgPrint "#{self.name}: gen_post_code\n" … … 580 560 # EOT 581 561 582 # gen_post_code ã§çæãã celltype 㯠gen_ep_func ãå¼ã³åºãããªã#847562 # gen_post_code で生成した celltype は gen_ep_func が呼び出されない #847 583 563 # @@struct_list.each{ |name,sttype| 584 564 # file.print <<EOT … … 649 629 end 650 630 651 ####### 以ä¸ã³ã¼ãçæ段é######652 653 #=== åãå£é¢æ°ã®æ¬ä½ã³ã¼ããçæï¼é é¨ã¨æ«å°¾ã¯å¥éåºåï¼654 #ct_name:: Symbol ( ãã©ã°ã¤ã³ã§çæããã) ã»ã«ã¿ã¤ãå ï¼Symbol ã¨ãã¦éããã¦ãã631 ####### 以下コード生成段階 ###### 632 633 #=== 受け口関数の本体コードを生成(頭部と末尾は別途出力) 634 #ct_name:: Symbol (プラグインで生成された) セルタイプ名 .Symbol として送られてくる 655 635 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 ) 656 636 if @@celltypes[ ct_name ] then … … 756 736 end 757 737 758 #=== åãå£é¢æ°ã® preamble (Cè¨èª)ãçæãã 759 # å¿ 760 è¦ãªã preamble é¨ã«åºåãã 761 #file:: FILE åºåå 762 ãã¡ã¤ã« 738 #=== 受け口関数の preamble (C言語)を生成する 739 # 必要なら preamble 部に出力する 740 #file:: FILE 出力先ファイル 763 741 #b_singleton:: bool true if singleton 764 742 #ct_name:: Symbol … … 805 783 806 784 def gen_preamble_instance( file, b_singleton, ct_name, global_ct_name ) 807 # ã#1005 MrubyBridgePlugin-test ã®ãã«ãã«å¤±æãã«ã¦è¿½å808 # ã#1004 idx_is_id ã true ã®å ´å(domain ã®å ´åã¯æªæå®ã§ã true) ã® CBP ã®ãããã¿ã¤ã宣è¨ãã«ã¦ä¸è¦ã«ãªãè¦è¾¼ã¿785 # 「#1005 MrubyBridgePlugin-test のビルドに失敗」にて追加 786 # 「#1004 idx_is_id が true の場合(domain の場合は未指定でも true) の CBP のプロトタイプ宣言」にて不要になる見込み 809 787 nsp = NamespacePath.new( :nMruby, true ) 810 788 nsp.append! ct_name … … 1250 1228 if( param.get_size ) then 1251 1229 sz_str = param.get_size.to_s 1252 elsif param.get_string then # mikan ã¨ãããã size_is 㨠string ã®åææå® (äºéãã¤ã³ã¿) ã¯ãªã1230 elsif param.get_string then # mikan とりあえず size_is と string の同時指定 (二重ポインタ) はなし 1253 1231 sz_str = param.get_string.to_s 1254 1232 else 1255 1233 sz_str = "1" 1256 1234 end 1257 # unsigned åã®å ´åã«ã¯ cast ãå¿ 1258 è¦ 1235 # unsigned 型の場合には cast が必要 1259 1236 if ttype.get_original_type.get_type_str != param.get_type.get_type.get_type_str then 1260 1237 cast_str = "(#{param.get_type.get_type_str})" … … 1286 1263 end 1287 1264 1288 #=== ãã©ã°ã¤ã³å¼æ°ignoreUnsigned1265 #=== プラグイン引数 ignoreUnsigned 1289 1266 def set_ignoreUnsigned rhs 1290 1267 if rhs == "true" || rhs == nil then … … 1292 1269 end 1293 1270 end 1294 #=== ãã©ã°ã¤ã³å¼æ°include1271 #=== プラグイン引数 include 1295 1272 def set_include rhs 1296 1273 funcs = rhs.split ',' … … 1310 1287 } 1311 1288 end 1312 #=== ãã©ã°ã¤ã³å¼æ°exclude1289 #=== プラグイン引数 exclude 1313 1290 def set_exclude rhs 1314 1291 funcs = rhs.split ',' … … 1323 1300 } 1324 1301 end 1325 #=== ãã©ã°ã¤ã³å¼æ°auto_exclude1302 #=== プラグイン引数 auto_exclude 1326 1303 def set_auto_exclude rhs 1327 1304 if rhs == "false" then -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.