Skip to content

Commit 0b281e7

Browse files
committed
[MERGE #6011 @akroshg] Fixing assertion while creating exception on error 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.
2 parents 62d3d11 + 7b009c2 commit 0b281e7

File tree

3 files changed

+58
-160
lines changed

3 files changed

+58
-160
lines changed

bin/ch/WScriptJsrt.cpp

Lines changed: 45 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -246,40 +246,32 @@ JsValueRef WScriptJsrt::LoadScriptFileHelper(JsValueRef callee, JsValueRef *argu
246246
}
247247

248248
Error:
249-
if (errorCode != JsNoError)
250-
{
251-
JsValueRef errorObject;
252-
JsValueRef errorMessageString;
253-
254-
if (wcscmp(errorMessage, _u("")) == 0) {
255-
errorMessage = ConvertErrorCodeToMessage(errorCode);
256-
}
257-
258-
ERROR_MESSAGE_TO_STRING(errCode, errorMessage, errorMessageString);
259-
260-
ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
261-
ChakraRTInterface::JsSetException(errorObject);
262-
}
263249

250+
SetExceptionIf(errorCode, errorMessage);
264251
return returnValue;
265252
}
266253

267254
void WScriptJsrt::SetExceptionIf(JsErrorCode errorCode, LPCWSTR errorMessage)
268255
{
269256
if (errorCode != JsNoError)
270257
{
271-
JsValueRef errorObject;
272-
JsValueRef errorMessageString;
273-
274-
if (wcscmp(errorMessage, _u("")) == 0)
258+
// If the exception is already is set - no need to create a new exception.
259+
bool hasException = false;
260+
if (!(ChakraRTInterface::JsHasException(&hasException) == JsNoError && hasException))
275261
{
276-
errorMessage = ConvertErrorCodeToMessage(errorCode);
277-
}
262+
JsValueRef errorObject;
263+
JsValueRef errorMessageString;
264+
265+
if (wcscmp(errorMessage, _u("")) == 0)
266+
{
267+
errorMessage = ConvertErrorCodeToMessage(errorCode);
268+
}
278269

279-
ERROR_MESSAGE_TO_STRING(errCode, errorMessage, errorMessageString);
270+
ERROR_MESSAGE_TO_STRING(errCode, errorMessage, errorMessageString);
280271

281-
ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
282-
ChakraRTInterface::JsSetException(errorObject);
272+
ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
273+
ChakraRTInterface::JsSetException(errorObject);
274+
}
283275
}
284276
}
285277

@@ -603,30 +595,7 @@ JsValueRef WScriptJsrt::LoadScriptHelper(JsValueRef callee, bool isConstructCall
603595
}
604596

605597
Error:
606-
if (errorCode != JsNoError)
607-
{
608-
// check and clear exception if any
609-
bool hasException;
610-
if (ChakraRTInterface::JsHasException(&hasException) == JsNoError && hasException)
611-
{
612-
JsValueRef unusedException = JS_INVALID_REFERENCE;
613-
ChakraRTInterface::JsGetAndClearException(&unusedException);
614-
unusedException;
615-
}
616-
617-
JsValueRef errorObject;
618-
JsValueRef errorMessageString;
619-
620-
if (wcscmp(errorMessage, _u("")) == 0) {
621-
errorMessage = ConvertErrorCodeToMessage(errorCode);
622-
}
623-
624-
ERROR_MESSAGE_TO_STRING(errCode, errorMessage, errorMessageString);
625-
626-
ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
627-
ChakraRTInterface::JsSetException(errorObject);
628-
}
629-
598+
SetExceptionIf(errorCode, errorMessage);
630599
return returnValue;
631600
}
632601

@@ -746,7 +715,6 @@ JsValueRef WScriptJsrt::LoadScript(JsValueRef callee, LPCSTR fileName,
746715
JsErrorCode errorCode = JsNoError;
747716
LPCWSTR errorMessage = _u("Internal error.");
748717
JsValueRef returnValue = JS_INVALID_REFERENCE;
749-
JsErrorCode innerErrorCode = JsNoError;
750718
JsContextRef currentContext = JS_INVALID_REFERENCE;
751719
JsRuntimeHandle runtime = JS_INVALID_RUNTIME_HANDLE;
752720
void *callbackArg = (finalizeCallback != nullptr ? (void*)fileContent : nullptr);
@@ -887,35 +855,7 @@ JsValueRef WScriptJsrt::LoadScript(JsValueRef callee, LPCSTR fileName,
887855
JsValueRef value = returnValue;
888856
if (errorCode != JsNoError)
889857
{
890-
if (innerErrorCode != JsNoError)
891-
{
892-
// Failed to retrieve the inner error message, so set a custom error string
893-
errorMessage = ConvertErrorCodeToMessage(errorCode);
894-
}
895-
896-
JsValueRef error = JS_INVALID_REFERENCE;
897-
JsValueRef messageProperty = JS_INVALID_REFERENCE;
898-
899-
ERROR_MESSAGE_TO_STRING(errCode, errorMessage, messageProperty);
900-
901-
if (errCode == JsNoError)
902-
{
903-
errCode = ChakraRTInterface::JsCreateError(messageProperty, &error);
904-
if (errCode == JsNoError)
905-
{
906-
bool hasException = false;
907-
errorCode = ChakraRTInterface::JsHasException(&hasException);
908-
if (errorCode == JsNoError && !hasException)
909-
{
910-
errCode = ChakraRTInterface::JsSetException(error);
911-
}
912-
else if (errCode == JsNoError)
913-
{
914-
errCode = JsErrorInExceptionState;
915-
}
916-
}
917-
}
918-
858+
SetExceptionIf(errorCode, errorMessage);
919859
ChakraRTInterface::JsDoubleToNumber(errorCode, &value);
920860
}
921861

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

931873
JsValueRef function;
932874
JsValueRef timerId;
@@ -936,79 +878,53 @@ JsValueRef WScriptJsrt::SetTimeoutCallback(JsValueRef callee, bool isConstructCa
936878

937879
if (argumentCount != 3)
938880
{
881+
errorCode = JsErrorInvalidArgument;
939882
goto Error;
940883
}
941884

942885
function = arguments[1];
943886

944-
IfJsrtError(ChakraRTInterface::JsNumberToDouble(arguments[2], &tmp));
887+
IfJsrtErrorSetGo(ChakraRTInterface::JsNumberToDouble(arguments[2], &tmp));
945888

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

950-
IfJsrtError(ChakraRTInterface::JsDoubleToNumber(static_cast<double>(msg->GetId()), &timerId));
893+
IfJsrtErrorSetGo(ChakraRTInterface::JsDoubleToNumber(static_cast<double>(msg->GetId()), &timerId));
951894
return timerId;
952895

953896
Error:
954-
JsValueRef errorObject;
955-
JsValueRef errorMessageString;
956-
957-
ERROR_MESSAGE_TO_STRING(errorCode, errorMessage, errorMessageString);
958-
959-
if (errorCode != JsNoError)
960-
{
961-
errorCode = ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
962-
963-
if (errorCode != JsNoError)
964-
{
965-
ChakraRTInterface::JsSetException(errorObject);
966-
}
967-
}
968-
897+
SetExceptionIf(errorCode, errorMessage);
969898
return JS_INVALID_REFERENCE;
970899
}
971900

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

976907
if (argumentCount != 2)
977908
{
909+
errorCode = JsErrorInvalidArgument;
978910
goto Error;
979911
}
980912

981913
unsigned int timerId;
982914
double tmp;
983915
JsValueRef undef;
984-
JsValueRef global;
985916

986-
IfJsrtError(ChakraRTInterface::JsNumberToDouble(arguments[1], &tmp));
987-
988-
timerId = static_cast<int>(tmp);
989-
messageQueue->RemoveById(timerId);
990-
991-
IfJsrtError(ChakraRTInterface::JsGetGlobalObject(&global));
992-
IfJsrtError(ChakraRTInterface::JsGetUndefinedValue(&undef));
917+
if (ChakraRTInterface::JsNumberToDouble(arguments[1], &tmp) == JsNoError)
918+
{
919+
timerId = static_cast<int>(tmp);
920+
messageQueue->RemoveById(timerId);
921+
}
993922

923+
IfJsrtErrorSetGo(ChakraRTInterface::JsGetUndefinedValue(&undef));
994924
return undef;
995925

996926
Error:
997-
JsValueRef errorObject;
998-
JsValueRef errorMessageString;
999-
1000-
ERROR_MESSAGE_TO_STRING(errorCode, errorMessage, errorMessageString);
1001-
1002-
if (errorCode != JsNoError)
1003-
{
1004-
errorCode = ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
1005-
1006-
if (errorCode != JsNoError)
1007-
{
1008-
ChakraRTInterface::JsSetException(errorObject);
1009-
}
1010-
}
1011-
927+
SetExceptionIf(errorCode, errorMessage);
1012928
return JS_INVALID_REFERENCE;
1013929
}
1014930

@@ -1021,14 +937,18 @@ void QueueDebugOperation(JsValueRef function, const DebugOperationFunc& operatio
1021937
JsValueRef WScriptJsrt::AttachCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState)
1022938
{
1023939
LPCWSTR errorMessage = _u("WScript.Attach requires a function, like WScript.Attach(foo);");
940+
JsErrorCode errorCode = JsNoError;
941+
HRESULT hr = S_OK;
1024942
JsValueType argumentType = JsUndefined;
1025943
if (argumentCount != 2)
1026944
{
945+
errorCode = JsErrorInvalidArgument;
1027946
goto Error;
1028947
}
1029-
IfJsrtError(ChakraRTInterface::JsGetValueType(arguments[1], &argumentType));
948+
IfJsrtErrorSetGo(ChakraRTInterface::JsGetValueType(arguments[1], &argumentType));
1030949
if (argumentType != JsFunction)
1031950
{
951+
errorCode = JsErrorInvalidArgument;
1032952
goto Error;
1033953
}
1034954
QueueDebugOperation(arguments[1], [](WScriptJsrt::CallbackMessage& msg)
@@ -1045,33 +965,25 @@ JsValueRef WScriptJsrt::AttachCallback(JsValueRef callee, bool isConstructCall,
1045965
return msg.CallFunction("");
1046966
});
1047967
Error:
1048-
JsValueRef errorObject;
1049-
JsValueRef errorMessageString;
1050-
1051-
ERROR_MESSAGE_TO_STRING(errorCode, errorMessage, errorMessageString);
1052-
1053-
if (errorCode != JsNoError)
1054-
{
1055-
errorCode = ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
1056-
if (errorCode != JsNoError)
1057-
{
1058-
ChakraRTInterface::JsSetException(errorObject);
1059-
}
1060-
}
968+
SetExceptionIf(errorCode, errorMessage);
1061969
return JS_INVALID_REFERENCE;
1062970
}
1063971

1064972
JsValueRef WScriptJsrt::DetachCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState)
1065973
{
1066974
LPCWSTR errorMessage = _u("WScript.Detach requires a function, like WScript.Detach(foo);");
975+
JsErrorCode errorCode = JsNoError;
976+
HRESULT hr = S_OK;
1067977
JsValueType argumentType = JsUndefined;
1068978
if (argumentCount != 2)
1069979
{
980+
errorCode = JsErrorInvalidArgument;
1070981
goto Error;
1071982
}
1072-
IfJsrtError(ChakraRTInterface::JsGetValueType(arguments[1], &argumentType));
983+
IfJsrtErrorSetGo(ChakraRTInterface::JsGetValueType(arguments[1], &argumentType));
1073984
if (argumentType != JsFunction)
1074985
{
986+
errorCode = JsErrorInvalidArgument;
1075987
goto Error;
1076988
}
1077989
QueueDebugOperation(arguments[1], [](WScriptJsrt::CallbackMessage& msg)
@@ -1088,19 +1000,7 @@ JsValueRef WScriptJsrt::DetachCallback(JsValueRef callee, bool isConstructCall,
10881000
return msg.CallFunction("");
10891001
});
10901002
Error:
1091-
JsValueRef errorObject;
1092-
JsValueRef errorMessageString;
1093-
1094-
ERROR_MESSAGE_TO_STRING(errorCode, errorMessage, errorMessageString);
1095-
1096-
if (errorCode != JsNoError)
1097-
{
1098-
errorCode = ChakraRTInterface::JsCreateError(errorMessageString, &errorObject);
1099-
if (errorCode != JsNoError)
1100-
{
1101-
ChakraRTInterface::JsSetException(errorObject);
1102-
}
1103-
}
1003+
SetExceptionIf(errorCode, errorMessage);
11041004
return JS_INVALID_REFERENCE;
11051005
}
11061006

bin/ch/stdafx.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ do { \
129129
if ((jsErrorCode) != JsNoError) { \
130130
fwprintf(stderr, _u("ERROR: ") _u(#expr) _u(" failed. JsErrorCode=0x%x (%s)\n"), jsErrorCode, Helpers::JsErrorCodeToString(jsErrorCode)); \
131131
fflush(stderr); \
132-
Assert(false); \
133132
return JS_INVALID_REFERENCE; \
134133
} \
135134
} while (0)
@@ -140,7 +139,6 @@ do { \
140139
if ((jsErrorCode) != JsNoError) { \
141140
fwprintf(stderr, _u("ERROR: ") _u(#expr) _u(" failed. JsErrorCode=0x%x (%s)\n"), jsErrorCode, Helpers::JsErrorCodeToString(jsErrorCode)); \
142141
fflush(stderr); \
143-
Assert(false); \
144142
return false; \
145143
} \
146144
} while (0)

0 commit comments

Comments
 (0)