練炭ブログ

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

DMonkey: インスタンス['メソッド名']() で this が Global になる

コメントなし»
Global.foo = 'this is Global';

function Foo () { }
Foo.prototype.foo = 'this is Foo';
Foo.prototype.p = function () {
  // alert (nameOf (this));
  alert (this.foo);
};

var a = new Foo ();
a.p ();   // this is Foo

a ['p'] ();   // this is Global

インスタンス.メソッド名() による呼び出しでは this がそのインスタンス自体を指しますが、インスタンス['メソッド名']() では this が Global を指してしまいます。

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