2020/02/15

2020/02/15

  • コンパイラ読み回

# Gears

# 入出力Interface

  • IO Interfaceの方がいい気がしてきた
1
2
3
4
5
6
typedef struct IO <Type, Impl> {
    __code read(Impl* io, char* addr, __code next(...));
    __code write(Impl* io, char* addr, int n, __code next(...));
    __code close(Impl* io,int fd, __code next(...));
    __code next(...);
} IO; 
  • IO_File, IO_Pipeみたいなのを実装したい
  • struct fileはDataGearとして定義する
    • コレ自体をInterfaceとか、InterfaceのImplの引数のfieldに分解しない
    • DataGearを宣言する専用の構文がほしい気がする

# DataGear宣言用

1
2
3
4
typedef struct file  <Data> {
    int i;
    ...           
} file ; 

# やること

  • generate_contextでのstruct回収ルーチンの修正
    • parseに失敗したらskipするようにする
    • おわった
  • file Interfaceの残骸の削除

# generate_contextでのstruct回収ルーチンの修正

  • Gears::Utilの_parseでパースしている
  • typedef struct (.*) <.*> .* {に引っかからなかった場合、 対象から落とすようにした
    • 構文木みたいなのを作るタイミングで落としている
  • .hか.dgがみつからなかった場合でも落とす
1
2
3
4
5
6
7
     map {
       if ($new_dgs->{$kind}->{$_} =~ /^\d+$/) {
-        croak "failed: not found $_.(h|dg)\n";
+        carp "failed: not found $_.(h|dg)\n";
+        delete $new_dgs->{$kind}->{$_};
       }
     } keys %{$new_dgs->{$kind}};
  • 理論上は//:skipを書かなくてもすむようになった気がする

# __codeの引数に構造体があるケース

  • DataGearになっている場合は、 D_struct_nameになる都合上、 structとかunionが`stubの時点で落とされる
  • struct hogeを引数にいれている場合は hoge = Gearef(cbc_context, hoge)になるみたいな
  • 対処療法的にtypedefしているが、DataGearをいれる構文を入れたほうが早そう
    • とはいえgenerate_stub, generate_contextを直さないといけなさそう
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy