From 172d4dd23e0ae5fd58873807cd93208424db3b0f Mon Sep 17 00:00:00 2001 From: yexo Date: Thu, 20 Aug 2009 10:58:22 +0000 Subject: [PATCH] (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(-) diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp index 0562cccb83..da14941d52 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);