The VM now properly aborts on critical errors

This commit is contained in:
Leonard2 2016-09-14 12:30:11 +02:00
parent 3b2359959e
commit 65af26f962
3 changed files with 43 additions and 9 deletions

View File

@ -156,6 +156,14 @@ enum
ATAG_RNG, // pointer to FRandom
};
enum EVMAbortException
{
X_READ_NIL,
X_WRITE_NIL,
X_TOO_MANY_TRIES,
X_ARRAY_OUT_OF_BOUNDS,
};
class VMFunction : public DObject
{
DECLARE_ABSTRACT_CLASS(VMFunction, DObject);

View File

@ -44,7 +44,7 @@
#define ASSERTKA(x) assert(sfunc != NULL && (unsigned)(x) < sfunc->NumKonstA)
#define ASSERTKS(x) assert(sfunc != NULL && (unsigned)(x) < sfunc->NumKonstS)
#define THROW(x)
#define THROW(x) throw(EVMAbortException(x))
#define CMPJMP(test) \
if ((test) == (a & CMP_CHECK)) { \
@ -54,14 +54,6 @@
pc += 1; \
}
enum
{
X_READ_NIL,
X_WRITE_NIL,
X_TOO_MANY_TRIES,
X_ARRAY_OUT_OF_BOUNDS
};
#define GETADDR(a,o,x) \
if (a == NULL) { THROW(x); } \
ptr = (VM_SBYTE *)a + o

View File

@ -407,6 +407,40 @@ int VMFrameStack::Call(VMFunction *func, VMValue *params, int numparams, VMRetur
}
throw;
}
catch (EVMAbortException exception)
{
if (allocated)
{
PopFrame();
}
if (trap != nullptr)
{
*trap = nullptr;
}
Printf("VM execution aborted: ");
switch (exception)
{
case X_READ_NIL:
Printf("tried to read from address zero.");
break;
case X_WRITE_NIL:
Printf("tried to write to address zero.");
break;
case X_TOO_MANY_TRIES:
Printf("too many try-catch blocks.");
break;
case X_ARRAY_OUT_OF_BOUNDS:
Printf("array access out of bounds.");
break;
}
Printf("\n");
return -1;
}
catch (...)
{
if (allocated)