練炭ブログ

萌え壁紙、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

DMonkey: 配列を挟んでオブジェクトを循環参照するとエラーになる

コメントなし»
function Foo () {
  this.a = [ this ];
}

function OnStartThread () {
  var f = new Foo ();
}

上記スクリプトを実行すると、EInvalidPointer: Invalid pointer operation と表示されてダウンロードスレッドがエラー終了してしまいます。

常にエラーになるわけではなく、正常に終了する場合もあります。その場合は再度アイテムを登録したり、Irvine を再起動すると発症するようになったりします。厳密な発生条件は不明で、OS などの環境によっては全く発生しないかもしれません。

OnStartThread() 自体は正常に終了して、スクリプト環境の終了処理内(DMonkey のガベージコレクタとか)でエラーが起きているような感じですが、詳しい状況は不明です。

対処としては配列内に循環参照を入れないようにするしかないと思いますが、データの保存場所が配列でなくてもよいいなら、代わりにオブジェクトを使えば回避できるはずです。

  this.a = { length: 0 };
  this.a [this.a.length++] = this;

テスト用スクリプトファイル
添付ファイル:dmonkey_circref_test.zip

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です