@@ -156,23 +156,33 @@ public ChakraCoreJsEngine(ChakraCoreSettings settings)
156
156
_externalObjectFinalizeCallback = ExternalObjectFinalizeCallback ;
157
157
_promiseContinuationCallback = PromiseContinuationCallback ;
158
158
159
- _dispatcher . Invoke ( ( ) =>
159
+ try
160
160
{
161
- try
161
+ _dispatcher . Invoke ( ( ) =>
162
162
{
163
163
_jsRuntime = JsRuntime . Create ( attributes , null ) ;
164
164
_jsRuntime . MemoryLimit = settings . MemoryLimit ;
165
165
166
166
_jsContext = _jsRuntime . CreateContext ( ) ;
167
- _jsContext . AddRef ( ) ;
168
- }
169
- catch ( Exception e )
167
+ if ( _jsContext . IsValid )
168
+ {
169
+ _jsContext . AddRef ( ) ;
170
+ }
171
+ } ) ;
172
+ }
173
+ catch ( Exception e )
174
+ {
175
+ throw new JsEngineLoadException (
176
+ string . Format ( CoreStrings . Runtime_JsEngineNotLoaded ,
177
+ EngineName , e . Message ) , EngineName , EngineVersion , e ) ;
178
+ }
179
+ finally
180
+ {
181
+ if ( ! _jsContext . IsValid )
170
182
{
171
- throw new JsEngineLoadException (
172
- string . Format ( CoreStrings . Runtime_JsEngineNotLoaded ,
173
- EngineName , e . Message ) , EngineName , EngineVersion , e ) ;
183
+ Dispose ( ) ;
174
184
}
175
- } ) ;
185
+ }
176
186
}
177
187
178
188
/// <summary>
@@ -249,8 +259,15 @@ private JsScope CreateJsScope()
249
259
private static void PromiseContinuationCallback ( JsValue task , IntPtr callbackState )
250
260
{
251
261
task . AddRef ( ) ;
252
- task . CallFunction ( JsValue . GlobalObject ) ;
253
- task . Release ( ) ;
262
+
263
+ try
264
+ {
265
+ task . CallFunction ( JsValue . GlobalObject ) ;
266
+ }
267
+ finally
268
+ {
269
+ task . Release ( ) ;
270
+ }
254
271
}
255
272
256
273
#region Mapping
@@ -1061,11 +1078,17 @@ protected override object InnerCallFunction(string functionName, params object[]
1061
1078
. Concat ( processedArgs )
1062
1079
. ToArray ( )
1063
1080
;
1064
- resultValue = functionValue . CallFunction ( allProcessedArgs ) ;
1065
1081
1066
- foreach ( JsValue processedArg in processedArgs )
1082
+ try
1067
1083
{
1068
- RemoveReferenceToValue ( processedArg ) ;
1084
+ resultValue = functionValue . CallFunction ( allProcessedArgs ) ;
1085
+ }
1086
+ finally
1087
+ {
1088
+ foreach ( JsValue processedArg in processedArgs )
1089
+ {
1090
+ RemoveReferenceToValue ( processedArg ) ;
1091
+ }
1069
1092
}
1070
1093
}
1071
1094
else
@@ -1160,7 +1183,16 @@ protected override void InnerSetVariableValue(string variableName, object value)
1160
1183
try
1161
1184
{
1162
1185
JsValue inputValue = MapToScriptType ( value ) ;
1163
- JsValue . GlobalObject . SetProperty ( variableName , inputValue , true ) ;
1186
+ AddReferenceToValue ( inputValue ) ;
1187
+
1188
+ try
1189
+ {
1190
+ JsValue . GlobalObject . SetProperty ( variableName , inputValue , true ) ;
1191
+ }
1192
+ finally
1193
+ {
1194
+ RemoveReferenceToValue ( inputValue ) ;
1195
+ }
1164
1196
}
1165
1197
catch ( OriginalJsException e )
1166
1198
{
@@ -1264,7 +1296,10 @@ private void Dispose(bool disposing)
1264
1296
{
1265
1297
_dispatcher . Invoke ( ( ) =>
1266
1298
{
1267
- _jsContext . Release ( ) ;
1299
+ if ( _jsContext . IsValid )
1300
+ {
1301
+ _jsContext . Release ( ) ;
1302
+ }
1268
1303
_jsRuntime . Dispose ( ) ;
1269
1304
} ) ;
1270
1305
_dispatcher . Dispose ( ) ;
0 commit comments