TREE_OPERANDの選択
今日は文法まわりを若干。リスト構築子。
全てのオブジェクトはnamespaceであって、namespaceの実体はただのハッシュテーブルのリストでしかないわけだ。
まあ、これは別に構わない。当初の予定通り。
けど、GCC内部のtreeにはハッシュテーブルを持てない物がいくつか存在する。例えば、tree_expは、
struct tree_exp GTY(()) { struct tree_common common; int complexity; tree GTY ((special ("tree_exp"), desc ("TREE_CODE ((tree) &%0)"))) operands[1]; };
こんな構造になってて、余計な空間なんて入ってないわけだ。だから、
var obj = namespace{ }; obj.nanika_flag = true; /* OK。obj内のハッシュテーブルに nanika_flag が暗黙に定義される */ var expr = gcc.build_nt( gcc.PLUS_EXPR, 3, 4); expr.nanika_flag = true; /* expr はハッシュテーブルを持ってないので、どうしようもない… */
こういうことはできなくなる。まあ、それは仕方無いか。
で、TREE_OPERANDの話。struct tree_expr内のoperandsはTREE_OPERANDマクロで参照できる。
/* GCC 内のCのソースだと思って */ tree expr = build_nt(PLUS_EXPR,bulid_int_2(3,0),build_int_2(4,0)); tree lhs = TREE_OPERAND(expr,0); /* こーやると、定数3が拾える */
まあ、これはいいか。と、すると、ILOG内では、
var expr = gcc.bulid_nt(gcc.PLUS_EXPR,3,4); var lhs = expr[0]; /* 配列っぽく */
こんな感じにするといいだろうか。ただ、これやると、他のは'[]'演算子はハッシュテーブルへの参照なのに、ここだけ特別扱いになってしまうわけだ。
まあ、ようするに、どうしようか迷ったっていう話。多分これで実装すると思う。だったら最初から書くなって話なんだけど。