mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-24 04:51:19 +00:00
The VM now properly aborts on critical errors
This commit is contained in:
parent
3b2359959e
commit
65af26f962
3 changed files with 43 additions and 9 deletions
|
@ -156,6 +156,14 @@ enum
|
||||||
ATAG_RNG, // pointer to FRandom
|
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
|
class VMFunction : public DObject
|
||||||
{
|
{
|
||||||
DECLARE_ABSTRACT_CLASS(VMFunction, DObject);
|
DECLARE_ABSTRACT_CLASS(VMFunction, DObject);
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
#define ASSERTKA(x) assert(sfunc != NULL && (unsigned)(x) < sfunc->NumKonstA)
|
#define ASSERTKA(x) assert(sfunc != NULL && (unsigned)(x) < sfunc->NumKonstA)
|
||||||
#define ASSERTKS(x) assert(sfunc != NULL && (unsigned)(x) < sfunc->NumKonstS)
|
#define ASSERTKS(x) assert(sfunc != NULL && (unsigned)(x) < sfunc->NumKonstS)
|
||||||
|
|
||||||
#define THROW(x)
|
#define THROW(x) throw(EVMAbortException(x))
|
||||||
|
|
||||||
#define CMPJMP(test) \
|
#define CMPJMP(test) \
|
||||||
if ((test) == (a & CMP_CHECK)) { \
|
if ((test) == (a & CMP_CHECK)) { \
|
||||||
|
@ -54,14 +54,6 @@
|
||||||
pc += 1; \
|
pc += 1; \
|
||||||
}
|
}
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
X_READ_NIL,
|
|
||||||
X_WRITE_NIL,
|
|
||||||
X_TOO_MANY_TRIES,
|
|
||||||
X_ARRAY_OUT_OF_BOUNDS
|
|
||||||
};
|
|
||||||
|
|
||||||
#define GETADDR(a,o,x) \
|
#define GETADDR(a,o,x) \
|
||||||
if (a == NULL) { THROW(x); } \
|
if (a == NULL) { THROW(x); } \
|
||||||
ptr = (VM_SBYTE *)a + o
|
ptr = (VM_SBYTE *)a + o
|
||||||
|
|
|
@ -407,6 +407,40 @@ int VMFrameStack::Call(VMFunction *func, VMValue *params, int numparams, VMRetur
|
||||||
}
|
}
|
||||||
throw;
|
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 (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
if (allocated)
|
if (allocated)
|
||||||
|
|
Loading…
Reference in a new issue