Skip to content
Snippets Groups Projects
Commit cc4ef3b8 authored by Lactozilla's avatar Lactozilla :speech_balloon:
Browse files

Add a branch limit

Clarify why a script was terminated
parent 985a0be2
Branches
No related tags found
No related merge requests found
...@@ -48,6 +48,9 @@ Environment::Environment() ...@@ -48,6 +48,9 @@ Environment::Environment()
// Not that we're adding any modules to it, though. :p // Not that we're adding any modules to it, though. :p
global->active = true; global->active = true;
// Set the branch limit (same as in ZDoom)
branchLimit = 2000000;
// Add the data & function pointers. // Add the data & function pointers.
// Starting with raw ACS0 codes. I'm using this classic-style // Starting with raw ACS0 codes. I'm using this classic-style
...@@ -441,5 +444,39 @@ ACSVM::Word Environment::callSpecImpl ...@@ -441,5 +444,39 @@ ACSVM::Word Environment::callSpecImpl
void Environment::printKill(ACSVM::Thread *thread, ACSVM::Word type, ACSVM::Word data) void Environment::printKill(ACSVM::Thread *thread, ACSVM::Word type, ACSVM::Word data)
{ {
CONS_Alert(CONS_ERROR, "ACSVM ERROR: Kill %u:%d at %lu\n", type, data, (thread->codePtr - thread->module->codeV.data() - 1)); std::string scriptName;
ACSVM::String *scriptNamePtr = (thread->script != nullptr) ? (thread->script->name.s) : nullptr;
if (scriptNamePtr && scriptNamePtr->len)
scriptName = std::string(scriptNamePtr->str);
else
scriptName = std::to_string((int)thread->script->name.i);
ACSVM::KillType killType = static_cast<ACSVM::KillType>(type);
if (killType == ACSVM::KillType::BranchLimit)
{
CONS_Alert(CONS_ERROR, "Terminated runaway script %s\n", scriptName.c_str());
return;
}
else if (killType == ACSVM::KillType::UnknownCode)
{
CONS_Alert(CONS_ERROR, "ACSVM ERROR: Unknown opcode %d in script %s\n", data, scriptName.c_str());
}
else if (killType == ACSVM::KillType::UnknownFunc)
{
CONS_Alert(CONS_ERROR, "ACSVM ERROR: Unknown function %d in script %s\n", data, scriptName.c_str());
}
else if (killType == ACSVM::KillType::OutOfBounds)
{
CONS_Alert(CONS_ERROR, "ACSVM ERROR: Jumped to out of bounds location %lu in script %s\n",
(thread->codePtr - thread->module->codeV.data() - 1), scriptName.c_str());
}
else
{
CONS_Alert(CONS_ERROR, "ACSVM ERROR: Kill %u:%d at %lu in script %s\n",
type, data, (thread->codePtr - thread->module->codeV.data() - 1), scriptName.c_str());
}
CONS_Printf("Script terminated.\n");
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment