From 8839bdbefdf4fcd1fa4c2d6d35381055049872d7 Mon Sep 17 00:00:00 2001 From: yexo Date: Thu, 20 Aug 2009 10:58:22 +0000 Subject: (svn r17232) -Fix (r17223): Kill an AI when it tries to Sleep / execute a DoCommand during Save() instead of failing to save --- src/ai/ai_instance.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp index 0562cccb8..da14941d5 100644 --- a/src/ai/ai_instance.cpp +++ b/src/ai/ai_instance.cpp @@ -602,11 +602,25 @@ void AIInstance::Save() /* We don't want to be interrupted during the save function. */ bool backup_allow = AIObject::GetAllowDoCommand(); AIObject::SetAllowDoCommand(false); - if (!this->engine->CallMethod(*this->instance, "Save", &savedata)) { - /* The script crashed in the Save function. We can't kill - * it here, but do so in the next AI tick. */ + try { + if (!this->engine->CallMethod(*this->instance, "Save", &savedata)) { + /* The script crashed in the Save function. We can't kill + * it here, but do so in the next AI tick. */ + SaveEmpty(); + this->engine->CrashOccurred(); + return; + } + } catch (AI_FatalError e) { + /* If we don't mark the AI as dead here cleaning up the squirrel + * stack could throw AI_FatalError again. */ + this->is_dead = true; + this->engine->ThrowError(e.GetErrorMessage()); + this->engine->ResumeError(); SaveEmpty(); - this->engine->CrashOccurred(); + /* We can't kill the AI here, so mark it as crashed (not dead) and + * kill it in the next AI tick. */ + this->is_dead = false; + this->engine->CrashOccured(); return; } AIObject::SetAllowDoCommand(backup_allow); -- cgit v1.2.3-70-g09d2