sprcs.cpp 関連ドキュメント: C#Interface に関するドキュメントの厚生は次のとおり。 3.C#Interface.txt -+- 31.sprcs.cpp.txt(*) (*) 本ドキュメント ソースファイル: bin/src/swig/Source/Modules/sprcs.cpp (1) 関数一覧(このソースの中にあるものだけ) top() +- FindNodeR() 再帰 +- get_node_info() | +- debug_break_at() | +- unqualified_name() | +- analyze_syntax() | | +- analyze_function() | | | +- analyze_init_funcargs() | | | | +- analyze_count_funcargs() | | | +- get_node_info() 既出 | | | +- analyze_error() | | | +- analyze_skip() | | +- analyze_array() | | | +- analyze_get_id() | | | +- unqualified_name() | | | +- analyze_error() | | | +- analyze_skip() | | +- analyze_qualifier() | | | +- analyze_error() | | | +- analyze_skip() | | +- analyze_vector() | | | +- analyze_get_id() | | | +- unqualified_name() | | | +- analyze_error() | | | +- analyze_skip() | | +- analyze_get_id() | | +- unqualified_name() | | +- analyze_error() | | +- analyze_skip() | +- analyze_type_hook() | | +- analyze_type_hook_1() | | +- unqualified_name() | +- analyze_name_hook() | | +- replace_partial_string() | +- set_type_info() | +- analyze_enum() | | +- unqualified_name() | | +- cs_qualified_name() | +- analyze_vector() 既出 | +- analyze_qualifier() 既出 | +- unqualified_name() | +- strip_paren() | +- analyze_cpp_type_repr() | +- analyze_marshaltype() | +- analyze_cs_type_hook() | +- cs_qualified_name() +- cs_qualified_name() +- unqualified_name() +- print_nodes_info() +- dump_tree() 再帰 +- DescImp() | +- get_node_info() 既出 | +- debug_break_at() | +- unqualified_name() | +- generate_new_class() | | +- get_struct_info() | | | +- string_on_heap() | | | +- FindNodeByAttrR() 再帰 | | | +- get_node_info() 既出 | | | +- make_wrapper_name() | | | +- wrapper_name_print() | | | | +- make_wrapper_type() | | | +- make_wrapper_type() | | +- is_newable_class() | | | +- FindNodeR() 再帰 | | | +- get_node_info() 既出 | | +- is_virtual() | | +- generate_constructor() | | | +- get_node_info() 既出 | | | +- need_generate_constructor() | | | +- generate_constructor_with_full_members() | | | +- strip_type_modifier() | | | +- unqualified_name() | | | +- strip_type_modifier_1() | | | +- analyze_type_modifier() | | | +- strip_type_modifier_1() | | +- free_struct_info() | | +- generate_type_conversion_operator() | | | +- get_struct_info() 既出 | | | +- generate_type_conversion_operator_copy_members() | | | +- free_struct_info() | | +- has_print_facility() | | | +- unqualified_name() | | | +- force_generate_tostring() | | +- print_facility_name() | | +- generate_to_string() | | +- print_facility_name() | +- FindNode() | +- analyze_cs_type_hook_2() | +- make_wrapper_name() 既出 | +- generate_wrapper_accessor() | | +- make_wrapper_name() 既出 | +- snap_path_info() | +- generate_wrapper_accessor_struct() | | +- make_wrapper_type() | | +- make_wrapper_name() 既出 | | +- make_wrapper_name_type_part() | | | +- strip_type_modifier() 既出 | | +- strip_type_modifier_1() | | +- cs_qualified_name() | +- generate_string_get() | +- generate_string_set() | +- FindNodeByAttrR() 再帰 | +- cs_qualified_name() | +- generate_enum_def() | | +- get_node_info() 既出 | +- analyze_error() | +- dump_node_info() 再帰 | +- FindNodeR() 再帰 | +- generate_new_class_struct() | +- get_struct_info() 既出 | +- is_newable_class() 既出 | +- is_virtual() | +- get_node_info() 既出 | +- make_wrapper_name() 既出 | +- FindNodeByAttrR() 再帰 | +- generate_type_conversion_operators() | | +- get_struct_info() 既出 | | +- generate_type_conversion_operator_copy_members() | | +- free_struct_info() | +- generate_type_conversion_operator() 既出 +- IfImp() | +- get_node_info() 既出 | +- debug_break_at() | +- unqualified_name() | +- generate_new_class() 既出 | +- FindNode() | +- analyze_cs_type_hook_2() | +- snap_path_info() | +- FindNodeByAttrR() 再帰 | +- overname() | +- wrapper_name_print() 既出 | +- generate_string_set() | +- analyze_error() | +- dump_node_info() 再帰 | +- generate_string_get() | +- make_wrapper_name() 既出 | +- generate_wrapper_accessor_struct() 既出 | +- cs_qualified_name() | +- unqualified_name() | +- FindNodeR() 再帰 | +- generate_enum_def() 既出 +- TypeMapImp() +- get_node_info() 既出 (2) ファイルポインタ cpp SprExport/xxx.cpp に出力 cs SprCSharp/xxx.cs に出力 csp SprImport/xxx.cs に出力 cpp_wrap SprExport/xxx.wrapper.cpp に出力 cs_wrap SprCSharp/xxx.wrapper.cs に出力 csp_wrap SprImport/xxx.wrapper.csp に出力 gip .info に出力(デバッグ用情報ファイル) snap_cpp, snap_cpp_wrap それぞれ cpp, cpp_wrap の file scope 版 snap_cs, cnap_cs_wrap それぞれ cs, cs_wrap の file scope 版 snap_csp, snap_csp_wrap それぞれ csp, csp_wrap の file scope 版 (3) マクロ ALERT(node_or_str,message) (Alert) の出力 FREE_UNMANAGED_MEMORY string を返すために C++ 側に一時的に確保した領域を解放する コードを有効にする(メモリリークを抑える) DLLIMPORT DllImport 行の定義 EQ(p,q) 文字列の比較(一致で true)ポインタが NULL だと例外発生 EQc(p,q) 文字列の比較(一致で true)ポインタが NULL だと false EQ2(p,q) 先頭2文字の比較(一致で true)ポインタが NULL だと例外発生 ENDWITH(p,s) 第1文字列が第2文字列で終わっているとき true BEGINWITH(p,s) 第1文字列が第2文字列で始まっているとき true ALIGNMENT メモリ境界 ※これは size_t を C# のどの型にするかに用いている。ただし sprcs.cpp をビルドする platform で決まるので、生成された C# ソースをビルドする platform と合わせないと 結果が間違ってくる。C# 側の条件付きコンパイルに移行できれば解決する(?)。 MAX_NAMELEN 識別子長の上限値(チェックなしで使っている箇所あり) HACK UTTimerIf::TimerFunc に関する特別処理 以下はデバッグ用マクロ SNAP 次のデバッグ処理を有効にする ファイルポインタ snap_xxx, snap_xxx_wrap これらは file scope マクロ SNAP_ANA_PATHx, WRAPPER_NAME_PRINT DUMP マクロ DUMP_NODE_INFO を有効にする DUMP_TREE ツリーダンプ(簡易版)を出力する(.info ファイル) SHOW_ALL_TYPES Desc/If の子ノードで処理をスキップするノードもダンプする GATHER_INFO デバッグ用情報ファイル(.info)に情報を出力する BREAK_NODE_NO ノード番号によるブレークポイントを有効にする(ノード番号を設定) ※関数 debug_break_at() にブレークポイントを設定する必要あり SNAP_ANA_PATH4(a,b,c,d) スナップショットマクロ(4引数) SNAP_ANA_PATH3(a,b,c) スナップショットマクロ(3引数) WRAPPER_NAME_PRINT(a,b,c,d,e,f) ラッパクラス名のスナップショット DUMP_NODE_INFO(a,b,c,d) ノード情報のダンプ (4) 構造体(新たに定義したもの) (a) ノード解析情報 struct nodeinfo_t { int no; ノード番号 (*1) char* sym_name; ノードの sym:name 属性 (*1) char* name; ノードの name 属性 (*1) char* decl; ノードの decl 属性 (*1) char* access; ノードの access 属性 (*1) char* storage; ノードの storage 属性 (*1) char* kind; ノードの kind 属性 (*1) char* type; ノードの type 属性 (*1) is_function なら uq_type から取り出す (*2) char* uq_name; name から :: 以前をすべて除いたもの (*1) char* uq_type; type から Spr:: と std:: を除いたもの (*1) char* overname; ノードの sym:overname 属性(関数のオーバーロード) (*1) char* cpp_name; uq_name または name_hook_table で置き換えたもの (*4) char* cpp_type; 解析した情報から再構成する (*3) char* cs_name; uq_name の :: を _ で置き換えたもの (*4) char* cs_type; TypeConv テーブルで uq_type に対応するもの (*2) char* cs_im_type; cs_type から :: 以前を取り除いたもの (*5) char* cs_marshaltype; TypeConv テーブルで uq_type に対応するもの is_array のときは特別 (*6) int is_typedef; kind == typedef のとき true (*2) int is_variable; kind == variable または uq_type が基本型 or void* or string のとき true (*2) int is_intrinsic; uq_type が基本型のとき true int is_vector; uq_type が [std::]vector<...> なら true (*8) int is_string; uq_type == string || uq_type == string のとき true (*2) int is_function; kind == function && kind != typedef のとき true (*1) int is_struct; kind == struct のとき true (*1) または TypeConv テーブルに見つからないとき true (*2) int is_array; array_size が non-NULL ならその数値 (*7) int is_pointer; pointer_level > 0 なら true (*7) int is_reference; decl が r. を含んでいたら true (*7)(*9) int is_const; decl が q(const) を含んでいたら true (*9) int is_volatile; cpp_type が q(volatile) を含んでいたら true (*9) int is_enum; uq_type が enum で始まっていたら true (*10) int is_void; uq_type == void && !is_pointer のとき true (*1) int is_void_ptr; uq_type == void && is_pointer のとき true (*1) int is_bool; uq_type == bool のとき true (*1) int is_static; storage == static のとき true (*1) int is_virtual; storage == virtual のとき true (*1) char* array_size; decl が a(...) を含んでいたらその数値 (*11) int pointer_level; decl が p. を含んでいる回数 (*7)(*9) int num_args; decl が f(...) を含んでいるときその引数の個数 (*12) struct nodeinfo_t* funcargs; decl の f(...) を解析して設定 (*12)(*13) }; (*1) get_node_info() で設定 (*2) set_type_info() で設定 (*3) analyze_cpp_type_repr() で設定 (*4) analyze_name_hook() で設定 (*5) cs_type_hook() で設定 (*6) analyze_marshaltype() で設定 (*7) analyze_syntax() で設定 (*8) analyze_vector() で設定 (*9) analyze_type_modifier() で設定 (*10) analyze_enum() で設定 (*11) analyze_array() で設定 (*12) analyze_init_funcargs() で設定 (*12) analyze_function() で設定 (b) データ型変換テーブル(定数) struct typeconv_t { int kind; 種別(1: 基本型, 2: void*, 3: string, 4: vector, 5: それ以外) char* cpp_type; C++ における型表現 char* cs_type; C# における型表現 char* cs_marshaltype; [MarshalAs(UnmanagedType.XX)] の XX に代入する型表現 int count; 未使用 }; (c) 型修飾子テーブル(定数) static const char* type_modifiers[] = { "p.", ポインタ "r.", 参照 "q(const).", const "qconst.", const "q(volatile).", volatile "qvolatile.", volatile NULL }; (d) クラスメンバ変数情報 struct struct_info_t { char* name; クラス名 int num_members; メンバ変数個数 struct struct_members_info_t** members; メンバ情報テーブル }; struct struct_members_info_t { Node* node; ノードポインタ char* name; ノード情報のコピー(get_node_info() で取得) char* cs_name; 同上 char* cs_type; 同上 char* cpp_name; 同上 char* cpp_type; 同上 int is_bool; 同上 int is_vector; 同上 int is_array; 同上 int is_string; 同上 int is_struct; 同上 int is_pointer; 同上 int is_reference; 同上 }; (5) マップ変数(新たに定義したもの) . . . . . . . + . . . . . . . . . . . . . map typedef_map; key: typedef 名, value: typedef 定義 map class_map; key: class/struct 名, value: 1 map enum_map; key: enum 名, value: 1 map intf_map; key: If/IfInfo 名, value: 1 map vintf_map; key: SPR_VIFDEF 名, value: 1 map delegate_key_map; key: 関数引数名, value: 1 map delegate_func_map; key: 関数引数名, value: 関数引数名 map delegate_type_map; key: 関数引数名, value: 関数型 map delegate_args_map; key: 関数引数名, value: 関数引数の引数 map signature_map; key: 関数引数名+関数引数の引数, value: 1 map signature_args_map; key: 関数引数名, value: 関数引数の引数(cast 形式) map wrapper_map; key: wrapper 名, value: 1 map fd_pair_map; key: クラス名−末尾文字, value: 見つけた数 ※クラス名の末尾が f か d のもののみが対象 (6) 処理の概要 (a) DescImp() ・新しいクラスの生成開始      すべての子ノード(cdecl)について ・次のノードはスキップする ・%ignore ・変数でない ・static である(ただし static int は const int にする) ・protected ・private ・typedef された関数ポインタ ・次のような場合分けをしてコードを生成する ・vector or array ・基本型 ・ポインタ ・bool ・その他 ・string <-- 無駄な if のネストがある! ・struct ・enum ・ポインタ ・その他 ・enum ・クラス直下の enum ・クラス生成終了 ・Struct クラスの生成 (b) IfImp() ・新しいクラスの生成開始      すべての子ノード(cdecl)について ・次のノードはスキップする ・関数でない ・privateyy ・virtual ・defaultargs ・関数引数を delegate するための前処理 ・typedef された関数はスキップする [SprExport] ・関数定義 ・仮引数並び ・実引数に関する前処理 ・vector or array ・基本型 ・string ・struct ・関数本体 ・左辺側 ・右辺側 ・関数値に関する処理 ・vector or array ・基本型 ・string ・struct [SprCSharp] ・関数引数の場合の前処理 ・関数定義 ・引数並び ・引数に関する前処理 ・string ・その他 ・関数本体 ・左辺側 ・右辺側 ・関数値に関する後処理 ・bool ・char* ・string ・vector or array ・struct ・void 以外 [SprImport] ・関数宣言 ・引数並び ・enum (c) generate_new_class_struct() class Vec3dStruct など、f/d ペアをもつクラスの C# local 版クラス生成 (d) generate_type_conversion_operator() generate_type_conversion_operators() generate_type_conversion_operator_copy_members() 暗黙の型変換定義の生成 (e) is_newable_class() constructor が private or protected なら new 不可 Spr::IfInfo も new 不可 (f) is_virtual() 次のものは virtual UTAccessBase, UTTimerProvider, FWSceneFactory, FWSdkFactory, DRUpp, DVInputPort, DVOutputPort, DVOrientation, HISpidarCalcBase, HISpidarCalc3Dof, HISpidarCalc6Dof, CRSdkFactory (g) generate_constructor() default constructor は必ず作る If なら cast operator を作る If 以外なら copy constructor 以外で定義されている constructor を作る (h) need_generate_constructor() 次のものは constructor を作る Vec2f, Vec2d, Vec3f, Vec3d, Vec4f, Vec4d, Quaternionf, Quaterniond, Posef, Posed, Matrix3f, Matrix3d, Vec2i, Vec3i, Vec6d, Curve3f (i) generate_constructor_with_full_members() 全メンバを引数にもつ constructor を作る (j) has_print_facility() メンバに Print, print, operator << をもつものは ToString() 生成可とする その他、ToString() 強制生成と判定したものも生成可とする (k) force_generate_tostring() 次のものは強制的に ToString() を生成するものとする Vec, Quaternion, Pose, Matrix, Affine で始まるクラス ただし MatrixExtension は除く (l) generate_to_string() ToString() 関数を生成する (m) generate_enum_def() enum 定義を生成する (n) make_wrapper_name() make_wrapper_type() make_wrapper_name_type_part() wrapper クラス名を決める (o) generate_wrapper_accessor() wrapper クラスのアクセッサを生成する (p) generate_wrapper_accessor_struct() wrapper クラスの C# local 版クラスを生成する (q) generate_string_get() generate_string_set() string の getter/setter 生成のヘルパー (r) get_node_info() ノード情報の取得 (s) unqualified_name() Spr::, std:: を取り除く forace == 1 なら最後の : 以前を取り除く (t) cs_qualified_name() 修飾名の中の :: を . に置き換える (u) set_type_info() type 文字列を解析して uq_type, cpp_type, cs_type, is_typedef, is_variable, is_intrinsic, is_struct, is_string, cs_marshaltype を設定する (v) analyze_vector() type または decl の中の vector<...> を解析して型情報を取り出す (w) analyze_enum() enum の判定をする (x) analyze_syntax() decl または type の解析のトップ (y) analyze_get_id() 識別子部分の切り出し (z) analyze_function() analyze_array() function および array の解析をする (A) analyze_qualifier() q(const) の解析をする (B) analyze_type_modifier() 型修飾子の解析をする(analyze_qualifier と一部重複する) (C) strip_type_modifier() strip_type_modifier_1() 型修飾子を取り除く (D) analyze_type_hook() analyze_type_hook_1() typedef_map に登録されていたら型情報を置き換える (E) analyze_cs_type_hook() managed <=> unmanaged 間でやりとりする情報の型を調整する(C# 側) (F) analyze_cs_type_hook_2() 名前のうち . 以降を取り出す (G) analyze_name_hook() 名前の置換えをする checked は C# の reserved word なので checked_ とする その他、SprCOLLADA::, gimite:: などは取り除く (H) replace_partial_string() 文字列のうち指定された部分文字列を他の部分文字列で置き換える (I) analyze_skip() 次に文字 . が現れるまでスキップする (J) analyze_init_funcargs() analyze_count_funcargs() 関数引数解析のための初期処理 (K) overname() オーバーロード関数の識別 (L) analyze_cpp_type_repr() C++ の型表現を構成する (M) analyze_error() 解析時のエラー処理 (N) get_struct_info() free_struct_info() StructInfo の作成とメモリの解放 (O) string_on_heap() heap 上にメモリを確保する (P) snap_path_info() dump_node_info() print_nodes_info() dump_tree() debug_break_at() デバッグ用 以上