Skip to content

[experimental] confirm ffigen feasibility #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from

Conversation

sensuikan1973
Copy link
Owner

@sensuikan1973 sensuikan1973 commented Jan 23, 2021

ffigen が今回の用途に耐えれるかを確認する、実験 PR なのでマージはしない。
作業ログとして立ててある。

ffigen は実験段階なことは分かってるが、以下のことを考慮すると contribute 前提で導入しちゃってもいい気持ち。

  • Inline Array struct を持つ struct がだいぶめんどい。これが一番でかい。
  • 保守性 up。binding の細かい定義や管理を yaml に押し付けられる。

@sensuikan1973
Copy link
Owner Author

sensuikan1973 commented Jan 23, 2021

ffigen 2.0.0-nullsafety.1 で生成したものを使った sample 動かしてみたが、ごく簡単なもの(struct がシンプルな function)はちゃんと動いた。

$ dart sample.dart
Edax version 4.4 Jan 20 2021 21:16:12 for Apple
copyright 1998 - 2017 Richard Delorme

0
34628173824

すごい。ただ、問題が 2 つある。

  • IDE のレスポンス低下
    • config で絞り込めるものは限られてるので、生成されるファイルがメチャデカになってしまう。それにより、補完のレスポンスが悪い。
      • 不便ではあるが、binding 部分なんて一度その上の wrapper 実装したら、そう触ることのない部分なのでこれは許容できる。
  • nest した struct に対応してない
    • これが辛い。 とにかくこれなのよ...
    • 生成されたのを見たが残念ながら、struct が nest しているものは class 定義が空のままになっていた。
      class Move extends ffi.Struct {} // oh...
$ pub run ffigen --config ffigen.yaml
Running in Directory: '/Users/shimizunaoki/DartProjects/libedax4dart'
[WARNING]: Prefer adding Key 'description' to your config.
Input Headers: [edax-reversi/include/stdbool.h, edax-reversi/src/ui.h]
[SEVERE] : Header edax-reversi/src/ui.h: Total errors/warnings: 1.
[SEVERE] :     edax-reversi/src/board.h:17:10: fatal error: 'stdbool.h' file not found [Lexical or Preprocessor Issue]
[SEVERE] : Null check operator used on a null value
[SEVERE] : #0      Type.isIncompleteStruct (package:ffigen/src/code_generator/type.dart:167:45)
dart-lang/ffigen#1      _structMembersVisitor (package:ffigen/src/header_parser/sub_parsers/structdecl_parser.dart:156:21)
dart-lang/ffigen#2      _FfiCallback_structMembersVisitor (dart:ffi)
dart-lang/native#540      FfiTrampoline (dart:ffi)
dart-lang/native#541      Clang.clang_visitChildren (package:ffigen/src/header_parser/clang_bindings/clang_bindings.dart:703:59)
dart-lang/native#542      _setStructMembers (package:ffigen/src/header_parser/sub_parsers/structdecl_parser.dart:87:28)
dart-lang/native#543      parseStructDeclaration (package:ffigen/src/header_parser/sub_parsers/structdecl_parser.dart:71:5)
dart-lang/native#530      _rootCursorVisitor (package:ffigen/src/header_parser/translation_unit_parser.dart:54:25)
dart-lang/native#531      _FfiCallback_rootCursorVisitor (dart:ffi)
dart-lang/ffigen#9      FfiTrampoline (dart:ffi)
dart-lang/native#532     Clang.clang_visitChildren (package:ffigen/src/header_parser/clang_bindings/clang_bindings.dart:703:59)
dart-lang/native#533     parseTranslationUnit (package:ffigen/src/header_parser/translation_unit_parser.dart:28:28)
dart-lang/native#534     parseToBindings (package:ffigen/src/header_parser/parser.dart:101:21)
dart-lang/native#535     parse (package:ffigen/src/header_parser/parser.dart:24:20)
dart-lang/native#536     main (package:ffigen/src/executables/ffigen.dart:42:19)
dart-lang/ffigen#15     _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:281:32)
dart-lang/ffigen#16     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
[SEVERE] : Exception: Exception thrown in a dart function called via C, use --verbose to see more details
[SEVERE] : #0      visitChildrenResultChecker (package:ffigen/src/header_parser/utils.dart:21:5)
dart-lang/ffigen#1      _setStructMembers (package:ffigen/src/header_parser/sub_parsers/structdecl_parser.dart:94:3)
dart-lang/ffigen#2      parseStructDeclaration (package:ffigen/src/header_parser/sub_parsers/structdecl_parser.dart:71:5)
dart-lang/native#540      _rootCursorVisitor (package:ffigen/src/header_parser/translation_unit_parser.dart:54:25)
dart-lang/native#541      _FfiCallback_rootCursorVisitor (dart:ffi)
dart-lang/native#542      FfiTrampoline (dart:ffi)
dart-lang/native#543      Clang.clang_visitChildren (package:ffigen/src/header_parser/clang_bindings/clang_bindings.dart:703:59)
dart-lang/native#530      parseTranslationUnit (package:ffigen/src/header_parser/translation_unit_parser.dart:28:28)
dart-lang/native#531      parseToBindings (package:ffigen/src/header_parser/parser.dart:101:21)
dart-lang/ffigen#9      parse (package:ffigen/src/header_parser/parser.dart:24:20)
dart-lang/native#532     main (package:ffigen/src/executables/ffigen.dart:42:19)
dart-lang/native#533     _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:281:32)
dart-lang/native#534     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
Unhandled exception:
Exception: Exception thrown in a dart function called via C, use --verbose to see more details
#0      visitChildrenResultChecker (package:ffigen/src/header_parser/utils.dart:21:5)
dart-lang/ffigen#1      parseTranslationUnit (package:ffigen/src/header_parser/translation_unit_parser.dart:35:3)
dart-lang/ffigen#2      parseToBindings (package:ffigen/src/header_parser/parser.dart:101:21)
dart-lang/native#540      parse (package:ffigen/src/header_parser/parser.dart:24:20)
dart-lang/native#541      main (package:ffigen/src/executables/ffigen.dart:42:19)
dart-lang/native#542      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:281:32)
dart-lang/native#543      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)

@sensuikan1973
Copy link
Owner Author

sensuikan1973 commented Jan 23, 2021

まあエラーにもある通り、なんか null check operator を null に当てて死んでるぽい。
https://github.com/dart-lang/ffigen/blob/568695cdbfe012c611ab446f2a85d4a9d67a21bb/lib/src/code_generator/type.dart#L167 あたりかな。

まあ dev 系リリースには null safety の対応が漏れているとかでバグってんのかな、多分。追いきれてはない。

@sensuikan1973
Copy link
Owner Author

んー、inline struct array の workaround 対応部分だけをガッともらって、今のベタ実装に入れるのが安定ぽいなあ。
それしつつ、ffigen に contribute かなあ。

@sensuikan1973
Copy link
Owner Author

うん、決めた。

ffigen は採用しない。(実験段階と明記されているのだからしょうがない。)
そして、inline の sturct array は面倒いので、ffigen の生成コード参考に実装する。
また、ffigen の dev 系リリースも動かしたりバグ追ったりした感じ、もう少しで今回の用途に耐えられそうなので、手の空いてる時に issue たてたり contribute していきたい。

@sensuikan1973 sensuikan1973 deleted the experimental_ffigen branch January 23, 2021 14:10
@sensuikan1973
Copy link
Owner Author

^ の生成ファイル貼っとく。
generated_bindings.dart.txt

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant