Implement PH7_VmGenericError();
The build was successful.
Details
The build was successful.
Details
This commit is contained in:
parent
a2acf64272
commit
eea9eee6e5
80
engine/vm.c
80
engine/vm.c
|
@ -1900,6 +1900,86 @@ PH7_PRIVATE sxi32 PH7_VmMemoryError(
|
||||||
* get aborted and VM will be properly shut down when returned SXERR_ABORT */
|
* get aborted and VM will be properly shut down when returned SXERR_ABORT */
|
||||||
return SXERR_ABORT;
|
return SXERR_ABORT;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Throw a run-time error and invoke the supplied VM output consumer callback.
|
||||||
|
*/
|
||||||
|
PH7_PRIVATE sxi32 PH7_VmGenericError(
|
||||||
|
ph7_vm *pVm, /* Target VM */
|
||||||
|
sxi32 iErr, /* Severity level: [i.e: Error, Warning, Notice or Deprecated] */
|
||||||
|
const char *zMessage /* Null terminated error message */
|
||||||
|
) {
|
||||||
|
const char *zErr;
|
||||||
|
sxi32 rc = SXRET_OK;
|
||||||
|
switch(iErr) {
|
||||||
|
case PH7_CTX_WARNING:
|
||||||
|
zErr = "Warning: ";
|
||||||
|
break;
|
||||||
|
case PH7_CTX_NOTICE:
|
||||||
|
zErr = "Notice: ";
|
||||||
|
break;
|
||||||
|
case PH7_CTX_DEPRECATED:
|
||||||
|
zErr = "Deprecated: ";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
iErr = PH7_CTX_ERR;
|
||||||
|
zErr = "Error: ";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(pVm->bErrReport) {
|
||||||
|
SyBlob sWorker;
|
||||||
|
SySet pDebug;
|
||||||
|
VmDebugTrace *pTrace;
|
||||||
|
sxu32 nLine;
|
||||||
|
SyString sFileName;
|
||||||
|
SyString *pFile;
|
||||||
|
if((VmExtractDebugTrace(&(*pVm), &pDebug) == SXRET_OK) && (SySetUsed(&pDebug) > 0)) {
|
||||||
|
/* Extract file name and line number from debug trace */
|
||||||
|
SySetGetNextEntry(&pDebug, (void **)&pTrace);
|
||||||
|
pFile = pTrace->pFile;
|
||||||
|
nLine = pTrace->nLine;
|
||||||
|
} else if(SySetUsed(&pVm->aInstrSet) > 0) {
|
||||||
|
/* Extract file name and line number from instructions set */
|
||||||
|
VmInstr *pInstr = SySetPeek(&pVm->aInstrSet);
|
||||||
|
pFile = pInstr->pFile;
|
||||||
|
nLine = pInstr->iLine;
|
||||||
|
} else {
|
||||||
|
/* Failover to some location in memory */
|
||||||
|
SyStringInitFromBuf(&sFileName, "[MEMORY]", 8);
|
||||||
|
pFile = &sFileName;
|
||||||
|
nLine = 1;
|
||||||
|
}
|
||||||
|
/* Initialize the working buffer */
|
||||||
|
SyBlobInit(&sWorker, &pVm->sAllocator);
|
||||||
|
SyBlobAppend(&sWorker, zErr, SyStrlen(zErr));
|
||||||
|
SyBlobAppend(&sWorker, zMessage, SyStrlen(zMessage));
|
||||||
|
/* Append file name and line number */
|
||||||
|
SyBlobFormat(&sWorker, " in %z:%u", pFile, nLine);
|
||||||
|
if(SySetUsed(&pDebug) > 0) {
|
||||||
|
/* Append stack trace */
|
||||||
|
do {
|
||||||
|
if(pTrace->pClassName) {
|
||||||
|
const char *sOperator;
|
||||||
|
if(pTrace->bThis) {
|
||||||
|
sOperator = "->";
|
||||||
|
} else {
|
||||||
|
sOperator = "::";
|
||||||
|
}
|
||||||
|
SyBlobFormat(&sWorker, "\n at %z%s%z() [%z:%u]", pTrace->pClassName, sOperator, pTrace->pFuncName, pTrace->pFile, pTrace->nLine);
|
||||||
|
} else {
|
||||||
|
SyBlobFormat(&sWorker, "\n at %z() [%z:%u]", pTrace->pFuncName, pTrace->pFile, pTrace->nLine);
|
||||||
|
}
|
||||||
|
} while(SySetGetNextEntry(&pDebug, (void **)&pTrace) == SXRET_OK);
|
||||||
|
}
|
||||||
|
/* Consume the error message */
|
||||||
|
rc = VmCallErrorHandler(&(*pVm), &sWorker);
|
||||||
|
}
|
||||||
|
if(iErr == PH7_CTX_ERR) {
|
||||||
|
/* Set exit code to 255 and abort script execution */
|
||||||
|
pVm->iExitStatus = 255;
|
||||||
|
rc = SXERR_ABORT;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Throw a run-time error and invoke the supplied VM output consumer callback.
|
* Throw a run-time error and invoke the supplied VM output consumer callback.
|
||||||
* Refer to the implementation of [ph7_context_throw_error()] for additional
|
* Refer to the implementation of [ph7_context_throw_error()] for additional
|
||||||
|
|
Loading…
Reference in New Issue