RangeError Maximum call stack size exceededの回避

よしだとものり
記事: 134
登録日時: 2017年7月25日(火) 23:18

RangeError Maximum call stack size exceededの回避

投稿記事by よしだとものり » 2017年9月13日(水) 18:57

以下のプラグインコマンドで、firebase_initを呼び出すと
RangeError Maximum call stack size exceeded
と表示されます。

ID_INITは、以前は別のプラグインに入れてましたが、現在はまとめています。

それで原因は何かなと思い、ID_INITの部分をまるまる削除して実行すると
エラーが発生しなくなりました。

ID_INITは別のプラグインで問題なく動いており単純にgetTimeでID作って
変数に入れ、プラグインで保存しているだけですので、単純に関数呼び出しの
スタックオーバーフローなのかなと思います。

他の言語では故意にオーバフローするような記述をしない限り見たことないのですが
回避方法はあるのでしょうか?

//プラグインコマンド
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.apply(this, arguments);

if(command === 'ID_INIT'){
setTimeOut(id_init,0);
//セーブデータがあるなら
if(DataManager.isAnySavefileExists()){

//共有セーブデータからロード
utakata.CommonSaveManager.load();


}else{
var tmtmp = new Date();
tmtmp=tmtmp.getTime();
$gameVariables.setValue(userIdVariableNo,tmtmp);
utakata.CommonSaveManager.save();
}

}
if (command == 'firebase_init') {
//firebase初期化
TOMO_FireBase_init();
}

if (command == 'make_lobby') {
//firebase初期化
//lobby_View(args[0]);
//make_lobby(args[0],args[1],args[2],args[3],args[4]);
}
if (command == 'test1') {
//firebase初期化
//console.log($gameActors.actor(0).level);
}
if (command == 'lobby_View') {
//firebase初期化
//lobby_View(args[0]);
}
}

よしだとものり
記事: 134
登録日時: 2017年7月25日(火) 23:18

Re: RangeError Maximum call stack size exceededの回避

投稿記事by よしだとものり » 2017年9月14日(木) 15:11

原因はGame_Interpreter.prototype.pluginCommandのオーバライドをやりすぎた事だと
思います。
おそらくオブジェクトに関数を保存してそれを呼び出すコードをオーバライドすると
再起呼び出しみたいな感じになるのかもしれません。

ただおそらくですが、自分のプラグインが原因みたいですので
それだけが原因ではなく自分が作ったスクリプトですでにスタックがギリギリに
なってGame_Interpreter.prototype.pluginCommandの部分がとどめになっているのかも
しれません。
怪しい部分は分かったので自分のプラグインはすべてプラグインコマンド部分をまとめて
書いてみて様子をみます。
アバター
しぐれん
記事: 973
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: RangeError Maximum call stack size exceededの回避

投稿記事by しぐれん » 2017年9月14日(木) 16:58

再定義のための関数を退避させた変数名が重複したという可能性が考えられます。
再定義ようの変数はconstにすることをお勧めします。
また、即時間数で名前空間を分離するのも有効です。

コード: 全て選択

(function(){
//ここに処理を書く

})()
現在、プラグイン依頼はお休み中です。
よしだとものり
記事: 134
登録日時: 2017年7月25日(火) 23:18

Re: RangeError Maximum call stack size exceededの回避

投稿記事by よしだとものり » 2017年9月15日(金) 11:48

即時関数でコードを括ったら発生しなくなりました。
ありがとうございます。

constはやってないですが、すべてのプラグインにconst付けた方が
いいのでしょうか?
アバター
しぐれん
記事: 973
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: RangeError Maximum call stack size exceededの回避

投稿記事by しぐれん » 2017年9月15日(金) 16:00

私は関数の再定義はconstでやっています。
名前重複の場合は、エラーで落ちてくれます。
constの意味についてはES2015・constで調べれば出ます。
現在、プラグイン依頼はお休み中です。
よしだとものり
記事: 134
登録日時: 2017年7月25日(火) 23:18

Re: RangeError Maximum call stack size exceededの回避

投稿記事by よしだとものり » 2017年9月15日(金) 17:56

_Game_Interpreter_pluginCommandのvar をconstに変更しました。
メモリ消費量も減りそうですね

“MV:質問” へ戻る