diff options
author | rubidium <rubidium@openttd.org> | 2010-11-24 17:00:37 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2010-11-24 17:00:37 +0000 |
commit | 090d6fb8b7be9906cd4dea1ed152ffc9bac8bef0 (patch) | |
tree | c405672538e408932352426daaa4883997546bdd /src/script/script_info.cpp | |
parent | 3330dee7e013d110d36c54a1e833b272a8762cab (diff) | |
download | openttd-090d6fb8b7be9906cd4dea1ed152ffc9bac8bef0.tar.xz |
(svn r21311) -Fix [FS#4260]: AIs in an infinite loop in e.g. autosave, but also getting settings and such from info.nut, would not be interrupted after a while causing OpenTTD to seem to not respond
Diffstat (limited to 'src/script/script_info.cpp')
-rw-r--r-- | src/script/script_info.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/script/script_info.cpp b/src/script/script_info.cpp index 807c42bc1..152bb02f3 100644 --- a/src/script/script_info.cpp +++ b/src/script/script_info.cpp @@ -16,6 +16,11 @@ #include "script_info.hpp" #include "script_scanner.hpp" +/** Number of operations to get the author and similar information. */ +static const int MAX_GET_OPS = 1000; +/** Number of operations to create an instance of an AI. */ +static const int MAX_CREATEINSTANCE_OPS = 100000; + ScriptFileInfo::~ScriptFileInfo() { free((void *)this->author); @@ -66,17 +71,17 @@ bool ScriptFileInfo::CheckMethod(const char *name) const info->main_script = strdup(scanner->GetMainScript()); /* Cache the data the info file gives us. */ - if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetAuthor", &info->author)) return SQ_ERROR; - if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetName", &info->name)) return SQ_ERROR; - if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetShortName", &info->short_name)) return SQ_ERROR; - if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetDescription", &info->description)) return SQ_ERROR; - if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetDate", &info->date)) return SQ_ERROR; - if (!info->engine->CallIntegerMethod(*info->SQ_instance, "GetVersion", &info->version)) return SQ_ERROR; - if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "CreateInstance", &info->instance_name)) return SQ_ERROR; + if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetAuthor", &info->author, MAX_GET_OPS)) return SQ_ERROR; + if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetName", &info->name, MAX_GET_OPS)) return SQ_ERROR; + if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetShortName", &info->short_name, MAX_GET_OPS)) return SQ_ERROR; + if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetDescription", &info->description, MAX_GET_OPS)) return SQ_ERROR; + if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetDate", &info->date, MAX_GET_OPS)) return SQ_ERROR; + if (!info->engine->CallIntegerMethod(*info->SQ_instance, "GetVersion", &info->version, MAX_GET_OPS)) return SQ_ERROR; + if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "CreateInstance", &info->instance_name, MAX_CREATEINSTANCE_OPS)) return SQ_ERROR; /* The GetURL function is optional. */ if (info->engine->MethodExists(*info->SQ_instance, "GetURL")) { - if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetURL", &info->url)) return SQ_ERROR; + if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetURL", &info->url, MAX_GET_OPS)) return SQ_ERROR; } return 0; |