public void BugFix_IDispatchExArgLeak_SetProperty_JScript() { // ReSharper disable RedundantAssignment engine.Dispose(); engine = new JScriptEngine(); WeakReference wr = null; new Action(() => { object x = Guid.NewGuid(); wr = new WeakReference(x); var result = x.ToString(); engine.Script.x = x; x = null; GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); Assert.AreEqual(result, engine.Evaluate("x.ToString()")); engine.Script.x = null; engine.CollectGarbage(true); })(); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); Assert.IsFalse(wr.IsAlive); // ReSharper restore RedundantAssignment }
public void BugFix_IDispatchExArgLeak_InvokeMethod_JScript() { // ReSharper disable RedundantAssignment engine.Dispose(); engine = new JScriptEngine(); WeakReference wr1 = null; WeakReference wr2 = null; new Action(() => { object x1 = Guid.NewGuid(); wr1 = new WeakReference(x1); object x2 = Guid.NewGuid(); wr2 = new WeakReference(x2); engine.Execute("function foo(x1, x2) { return x1.ToString() + x2.ToString(); }"); Assert.AreEqual(x1.ToString() + x2, engine.Script.foo(x1, x2)); engine.CollectGarbage(true); })(); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); Assert.IsFalse(wr1.IsAlive); Assert.IsFalse(wr2.IsAlive); // ReSharper restore RedundantAssignment }
public void JScriptEngine_CollectGarbage() { engine.Execute(@"x = []; for (i = 0; i < 1024 * 1024; i++) { x.push(x); }"); engine.CollectGarbage(true); // can't test JScript GC effectiveness }