テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(macro-of-inline report) マクロの生成に成功した

(Erlang VMの解説のように有用な記事が書けなくてすいません)

以下の見た目異常なコードはコンパイルが通る.

もとのインライン関数をASTにして, その上でリネームやコード挿入などの改変をして, 最終的にマクロの形で吐き出すという手順です.

pycparserは本当に素晴らしい. 私の書いたコードは実質100行程度です. Cコードに対して何かしたい時(果たしてそんな機会がどれほどあるかは不明ですが), Pythonが書けるならばまず検討していいと思う. 生成されるASTとコードを読めば, 使い方はすぐ分かる.

あとはAnyノードパッチのマージ. 頼むで!

struct T {
        int x;
};

#define fun(x, y, f, g, t, ys) \
do { \
  int ZZKb = x; \
  char *xWjJ = y; \
  struct T *nkaS = t; \
  int qtME = *xWjJ; \
  int *MjsU = &qtME; \
  int byYi[3]; \
  ZZKb = qtME; \
  while (ZZKb) \
  { \
    int aFTI; \
    aFTI = 0; \
    aFTI = 0; \
    do \
    { \
      aFTI += aFTI; \
    } \
    while (aFTI); \
  } \
 \
  int hsUX; \
  if (*xWjJ) \
  { \
    nkaS->x = f(*xWjJ); \
  } \
  else \
  { \
    g(nkaS->x); \
  } \
 \
  do \
  { \
    struct T PPJf; \
    PPJf.x = 1; \
  } \
  while (0); \
} while(0)

main()
{
}

再掲: もとのインライン関数

nline void fun(int x, char *y, int (*f)(int), void (*g)(char c), struct T *t, int ys[3])
{
        int z = *y;
        int *pz = &z;
        int xs[3];
        x = z;
        while (x) {
                int x;
                x = 0;
                x = 0;
                do {
                        x += x;
                } while (x);
        }
        int alpha;
        if (*y) {
                t->x = f(*y);
        } else {
                g(t->x);
        }
        do {
                struct T t;
                t.x = 1;
        } while (0);
}