Skip to content

Commit

Permalink
[MERGE #6011 @akroshg] Fixing assertion while creating exception on e…
Browse files Browse the repository at this point in the history
…rror condition.

Merge pull request #6011 from akroshg:fix_6007

We are setting exception when the runtime already has exception. In that case instead of creating a new
exception we will use the same exception.
  • Loading branch information
akroshg committed Mar 14, 2019
2 parents 62d3d11 + 7b009c2 commit 0b281e7
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 160 deletions.
190 changes: 45 additions & 145 deletions bin/ch/WScriptJsrt.cpp
Expand Up @@ -246,40 +246,32 @@ JsValueRef WScriptJsrt::LoadScriptFileHelper(JsValueRef callee, JsValueRef *argu
}

Error:
if (errorCode != JsNoError)
{
JsValueRef errorObject;
JsValueRef errorMessageString;

if (wcscmp(errorMessage, _u("")) == 0) {
errorMessage = ConvertErrorCodeToMessage(errorCode);
}

ERROR_MESSAGE_TO_STRING(errCode, errorMessage, errorMessageString);

ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
ChakraRTInterface::JsSetException(errorObject);
}

SetExceptionIf(errorCode, errorMessage);
return returnValue;
}

void WScriptJsrt::SetExceptionIf(JsErrorCode errorCode, LPCWSTR errorMessage)
{
if (errorCode != JsNoError)
{
JsValueRef errorObject;
JsValueRef errorMessageString;

if (wcscmp(errorMessage, _u("")) == 0)
// If the exception is already is set - no need to create a new exception.
bool hasException = false;
if (!(ChakraRTInterface::JsHasException(&hasException) == JsNoError && hasException))
{
errorMessage = ConvertErrorCodeToMessage(errorCode);
}
JsValueRef errorObject;
JsValueRef errorMessageString;

if (wcscmp(errorMessage, _u("")) == 0)
{
errorMessage = ConvertErrorCodeToMessage(errorCode);
}

ERROR_MESSAGE_TO_STRING(errCode, errorMessage, errorMessageString);
ERROR_MESSAGE_TO_STRING(errCode, errorMessage, errorMessageString);

ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
ChakraRTInterface::JsSetException(errorObject);
ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
ChakraRTInterface::JsSetException(errorObject);
}
}
}

Expand Down Expand Up @@ -603,30 +595,7 @@ JsValueRef WScriptJsrt::LoadScriptHelper(JsValueRef callee, bool isConstructCall
}

Error:
if (errorCode != JsNoError)
{
// check and clear exception if any
bool hasException;
if (ChakraRTInterface::JsHasException(&hasException) == JsNoError && hasException)
{
JsValueRef unusedException = JS_INVALID_REFERENCE;
ChakraRTInterface::JsGetAndClearException(&unusedException);
unusedException;
}

JsValueRef errorObject;
JsValueRef errorMessageString;

if (wcscmp(errorMessage, _u("")) == 0) {
errorMessage = ConvertErrorCodeToMessage(errorCode);
}

ERROR_MESSAGE_TO_STRING(errCode, errorMessage, errorMessageString);

ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
ChakraRTInterface::JsSetException(errorObject);
}

SetExceptionIf(errorCode, errorMessage);
return returnValue;
}

Expand Down Expand Up @@ -746,7 +715,6 @@ JsValueRef WScriptJsrt::LoadScript(JsValueRef callee, LPCSTR fileName,
JsErrorCode errorCode = JsNoError;
LPCWSTR errorMessage = _u("Internal error.");
JsValueRef returnValue = JS_INVALID_REFERENCE;
JsErrorCode innerErrorCode = JsNoError;
JsContextRef currentContext = JS_INVALID_REFERENCE;
JsRuntimeHandle runtime = JS_INVALID_RUNTIME_HANDLE;
void *callbackArg = (finalizeCallback != nullptr ? (void*)fileContent : nullptr);
Expand Down Expand Up @@ -887,35 +855,7 @@ JsValueRef WScriptJsrt::LoadScript(JsValueRef callee, LPCSTR fileName,
JsValueRef value = returnValue;
if (errorCode != JsNoError)
{
if (innerErrorCode != JsNoError)
{
// Failed to retrieve the inner error message, so set a custom error string
errorMessage = ConvertErrorCodeToMessage(errorCode);
}

JsValueRef error = JS_INVALID_REFERENCE;
JsValueRef messageProperty = JS_INVALID_REFERENCE;

ERROR_MESSAGE_TO_STRING(errCode, errorMessage, messageProperty);

if (errCode == JsNoError)
{
errCode = ChakraRTInterface::JsCreateError(messageProperty, &error);
if (errCode == JsNoError)
{
bool hasException = false;
errorCode = ChakraRTInterface::JsHasException(&hasException);
if (errorCode == JsNoError && !hasException)
{
errCode = ChakraRTInterface::JsSetException(error);
}
else if (errCode == JsNoError)
{
errCode = JsErrorInExceptionState;
}
}
}

SetExceptionIf(errorCode, errorMessage);
ChakraRTInterface::JsDoubleToNumber(errorCode, &value);
}

Expand All @@ -927,6 +867,8 @@ JsValueRef WScriptJsrt::LoadScript(JsValueRef callee, LPCSTR fileName,
JsValueRef WScriptJsrt::SetTimeoutCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState)
{
LPCWSTR errorMessage = _u("invalid call to WScript.SetTimeout");
JsErrorCode errorCode = JsNoError;
HRESULT hr = S_OK;

JsValueRef function;
JsValueRef timerId;
Expand All @@ -936,79 +878,53 @@ JsValueRef WScriptJsrt::SetTimeoutCallback(JsValueRef callee, bool isConstructCa

if (argumentCount != 3)
{
errorCode = JsErrorInvalidArgument;
goto Error;
}

function = arguments[1];

IfJsrtError(ChakraRTInterface::JsNumberToDouble(arguments[2], &tmp));
IfJsrtErrorSetGo(ChakraRTInterface::JsNumberToDouble(arguments[2], &tmp));

time = static_cast<int>(tmp);
msg = new CallbackMessage(time, function);
messageQueue->InsertSorted(msg);

IfJsrtError(ChakraRTInterface::JsDoubleToNumber(static_cast<double>(msg->GetId()), &timerId));
IfJsrtErrorSetGo(ChakraRTInterface::JsDoubleToNumber(static_cast<double>(msg->GetId()), &timerId));
return timerId;

Error:
JsValueRef errorObject;
JsValueRef errorMessageString;

ERROR_MESSAGE_TO_STRING(errorCode, errorMessage, errorMessageString);

if (errorCode != JsNoError)
{
errorCode = ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);

if (errorCode != JsNoError)
{
ChakraRTInterface::JsSetException(errorObject);
}
}

SetExceptionIf(errorCode, errorMessage);
return JS_INVALID_REFERENCE;
}

JsValueRef WScriptJsrt::ClearTimeoutCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState)
{
LPCWSTR errorMessage = _u("invalid call to WScript.ClearTimeout");
JsErrorCode errorCode = JsNoError;
HRESULT hr = S_OK;

if (argumentCount != 2)
{
errorCode = JsErrorInvalidArgument;
goto Error;
}

unsigned int timerId;
double tmp;
JsValueRef undef;
JsValueRef global;

IfJsrtError(ChakraRTInterface::JsNumberToDouble(arguments[1], &tmp));

timerId = static_cast<int>(tmp);
messageQueue->RemoveById(timerId);

IfJsrtError(ChakraRTInterface::JsGetGlobalObject(&global));
IfJsrtError(ChakraRTInterface::JsGetUndefinedValue(&undef));
if (ChakraRTInterface::JsNumberToDouble(arguments[1], &tmp) == JsNoError)
{
timerId = static_cast<int>(tmp);
messageQueue->RemoveById(timerId);
}

IfJsrtErrorSetGo(ChakraRTInterface::JsGetUndefinedValue(&undef));
return undef;

Error:
JsValueRef errorObject;
JsValueRef errorMessageString;

ERROR_MESSAGE_TO_STRING(errorCode, errorMessage, errorMessageString);

if (errorCode != JsNoError)
{
errorCode = ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);

if (errorCode != JsNoError)
{
ChakraRTInterface::JsSetException(errorObject);
}
}

SetExceptionIf(errorCode, errorMessage);
return JS_INVALID_REFERENCE;
}

Expand All @@ -1021,14 +937,18 @@ void QueueDebugOperation(JsValueRef function, const DebugOperationFunc& operatio
JsValueRef WScriptJsrt::AttachCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState)
{
LPCWSTR errorMessage = _u("WScript.Attach requires a function, like WScript.Attach(foo);");
JsErrorCode errorCode = JsNoError;
HRESULT hr = S_OK;
JsValueType argumentType = JsUndefined;
if (argumentCount != 2)
{
errorCode = JsErrorInvalidArgument;
goto Error;
}
IfJsrtError(ChakraRTInterface::JsGetValueType(arguments[1], &argumentType));
IfJsrtErrorSetGo(ChakraRTInterface::JsGetValueType(arguments[1], &argumentType));
if (argumentType != JsFunction)
{
errorCode = JsErrorInvalidArgument;
goto Error;
}
QueueDebugOperation(arguments[1], [](WScriptJsrt::CallbackMessage& msg)
Expand All @@ -1045,33 +965,25 @@ JsValueRef WScriptJsrt::AttachCallback(JsValueRef callee, bool isConstructCall,
return msg.CallFunction("");
});
Error:
JsValueRef errorObject;
JsValueRef errorMessageString;

ERROR_MESSAGE_TO_STRING(errorCode, errorMessage, errorMessageString);

if (errorCode != JsNoError)
{
errorCode = ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
if (errorCode != JsNoError)
{
ChakraRTInterface::JsSetException(errorObject);
}
}
SetExceptionIf(errorCode, errorMessage);
return JS_INVALID_REFERENCE;
}

JsValueRef WScriptJsrt::DetachCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState)
{
LPCWSTR errorMessage = _u("WScript.Detach requires a function, like WScript.Detach(foo);");
JsErrorCode errorCode = JsNoError;
HRESULT hr = S_OK;
JsValueType argumentType = JsUndefined;
if (argumentCount != 2)
{
errorCode = JsErrorInvalidArgument;
goto Error;
}
IfJsrtError(ChakraRTInterface::JsGetValueType(arguments[1], &argumentType));
IfJsrtErrorSetGo(ChakraRTInterface::JsGetValueType(arguments[1], &argumentType));
if (argumentType != JsFunction)
{
errorCode = JsErrorInvalidArgument;
goto Error;
}
QueueDebugOperation(arguments[1], [](WScriptJsrt::CallbackMessage& msg)
Expand All @@ -1088,19 +1000,7 @@ JsValueRef WScriptJsrt::DetachCallback(JsValueRef callee, bool isConstructCall,
return msg.CallFunction("");
});
Error:
JsValueRef errorObject;
JsValueRef errorMessageString;

ERROR_MESSAGE_TO_STRING(errorCode, errorMessage, errorMessageString);

if (errorCode != JsNoError)
{
errorCode = ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
if (errorCode != JsNoError)
{
ChakraRTInterface::JsSetException(errorObject);
}
}
SetExceptionIf(errorCode, errorMessage);
return JS_INVALID_REFERENCE;
}

Expand Down
2 changes: 0 additions & 2 deletions bin/ch/stdafx.h
Expand Up @@ -129,7 +129,6 @@ do { \
if ((jsErrorCode) != JsNoError) { \
fwprintf(stderr, _u("ERROR: ") _u(#expr) _u(" failed. JsErrorCode=0x%x (%s)\n"), jsErrorCode, Helpers::JsErrorCodeToString(jsErrorCode)); \
fflush(stderr); \
Assert(false); \
return JS_INVALID_REFERENCE; \
} \
} while (0)
Expand All @@ -140,7 +139,6 @@ do { \
if ((jsErrorCode) != JsNoError) { \
fwprintf(stderr, _u("ERROR: ") _u(#expr) _u(" failed. JsErrorCode=0x%x (%s)\n"), jsErrorCode, Helpers::JsErrorCodeToString(jsErrorCode)); \
fflush(stderr); \
Assert(false); \
return false; \
} \
} while (0)
Expand Down

0 comments on commit 0b281e7

Please sign in to comment.