Skip to content

Commit 7b009c2

Browse files
committed
Fixing assertion while creating exception on error condition.
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.
1 parent a247f4f commit 7b009c2

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)