トップ «前の日記(2003-11-07 (Fri)) 最新 次の日記(2003-11-12 (Wed))» 編集   RSS 1.0 FEED  

Journal InTime


2003-11-11 (Tue) [長年日記]

_ monitor.rb

Gennady Bystritskyさんという人から変更の提案をもらったのでコードの見直し。

あまりにもひどいので、テストを書いてリファクタリング。 rubyのtest/以下にテストがいろいろあるようだけど、lib直下のライブラリの テストはどこに置くべきなんだろう。

まあ、とりあえずコードだけcommitしとくか。

_ attribute parameter中のtypeof(void)

mcs(monoのC#コンパイラ)で、

[SatherNameAttribute("times!")]
[IterReturnTypeAttribute(typeof(void))]
public static __itertype_times __iter_times(int self)
{
    return new __itertype_times(self);
}

のようなコードをコンパイルしようとすると、

int.cs(301) error CS0182: An attribute argument must be a constant expression,
typeof expression or array creation expression

のようなエラーになるようだ。

mcsのソースの該当部(attribute.cs:137)を見ると、

if (e is Constant) {
	result = ((Constant) e).GetValue ();
	return true;
} else if (e is TypeOf) {
	result = ((TypeOf) e).TypeArg;
	return true;
} else if (e is ArrayCreation){
	result =  ((ArrayCreation) e).EncodeAsAttribute ();
	if (result != null)
		return true;
}

result = null;
Error_AttributeArgumentNotValid (loc);
return false;

となっている。

TypeOfはtypeof演算子に対応する抽象構文木のノードを表現するクラスなのでtypeof(void) も許されそうなものだが、実はtypeof(void)はTypeOfVoidという別のクラスで表現されていて、 しかもTypeOfとTypeOfVoidには継承関係がないらしい。

ECMAの"C# Language Specification"を見てもとくにtypeof(void)だけ除外するような 記述はなさそうだし(いつものように斜め読みだけど)、Visual C#では上記のようなコードは 通るようだ。 ってことはmcsのバグかな。 (cvs updateしたら直ってたりして…最近そういうことがよくあるのだ。)