以下のプラグインコマンドで、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]);
}
}
RangeError Maximum call stack size exceededの回避
Re: RangeError Maximum call stack size exceededの回避
原因はGame_Interpreter.prototype.pluginCommandのオーバライドをやりすぎた事だと
思います。
おそらくオブジェクトに関数を保存してそれを呼び出すコードをオーバライドすると
再起呼び出しみたいな感じになるのかもしれません。
ただおそらくですが、自分のプラグインが原因みたいですので
それだけが原因ではなく自分が作ったスクリプトですでにスタックがギリギリに
なってGame_Interpreter.prototype.pluginCommandの部分がとどめになっているのかも
しれません。
怪しい部分は分かったので自分のプラグインはすべてプラグインコマンド部分をまとめて
書いてみて様子をみます。
思います。
おそらくオブジェクトに関数を保存してそれを呼び出すコードをオーバライドすると
再起呼び出しみたいな感じになるのかもしれません。
ただおそらくですが、自分のプラグインが原因みたいですので
それだけが原因ではなく自分が作ったスクリプトですでにスタックがギリギリに
なってGame_Interpreter.prototype.pluginCommandの部分がとどめになっているのかも
しれません。
怪しい部分は分かったので自分のプラグインはすべてプラグインコマンド部分をまとめて
書いてみて様子をみます。
Re: RangeError Maximum call stack size exceededの回避
再定義のための関数を退避させた変数名が重複したという可能性が考えられます。
再定義ようの変数はconstにすることをお勧めします。
また、即時間数で名前空間を分離するのも有効です。
再定義ようの変数はconstにすることをお勧めします。
また、即時間数で名前空間を分離するのも有効です。
コード: 全て選択
(function(){
//ここに処理を書く
})()
現在、プラグイン依頼はお休み中です。
Re: RangeError Maximum call stack size exceededの回避
即時関数でコードを括ったら発生しなくなりました。
ありがとうございます。
constはやってないですが、すべてのプラグインにconst付けた方が
いいのでしょうか?
ありがとうございます。
constはやってないですが、すべてのプラグインにconst付けた方が
いいのでしょうか?
Re: RangeError Maximum call stack size exceededの回避
私は関数の再定義はconstでやっています。
名前重複の場合は、エラーで落ちてくれます。
constの意味についてはES2015・constで調べれば出ます。
名前重複の場合は、エラーで落ちてくれます。
constの意味についてはES2015・constで調べれば出ます。
現在、プラグイン依頼はお休み中です。
Re: RangeError Maximum call stack size exceededの回避
_Game_Interpreter_pluginCommandのvar をconstに変更しました。
メモリ消費量も減りそうですね
メモリ消費量も減りそうですね