@@ -163,7 +163,7 @@ JavascriptContext::JavascriptContext()
163
163
isolate->SetFatalErrorHandler (FatalErrorCallback);
164
164
165
165
mExternals = gcnew System::Collections::Generic::Dictionary<System::Object ^, WrappedJavascriptExternal>();
166
- mFunctions = gcnew System::Collections::Generic::List <System::Object ^>();
166
+ mFunctions = gcnew System::Collections::Generic::HashSet <System::WeakReference ^>();
167
167
HandleScope scope (isolate);
168
168
mContext = new Persistent<Context>(isolate, Context::New (isolate));
169
169
terminateRuns = false ;
@@ -178,8 +178,11 @@ JavascriptContext::~JavascriptContext()
178
178
v8::Isolate::Scope isolate_scope (isolate);
179
179
for each (WrappedJavascriptExternal wrapped in mExternals ->Values )
180
180
delete wrapped.Pointer ;
181
- for each (JavascriptFunction^ f in mFunctions )
182
- delete f;
181
+ for each (System::WeakReference^ f in mFunctions ) {
182
+ JavascriptFunction ^function = safe_cast<JavascriptFunction ^>(f->Target );
183
+ if (function != nullptr )
184
+ delete function;
185
+ }
183
186
delete mContext ;
184
187
delete mExternals ;
185
188
delete mFunctions ;
@@ -499,7 +502,9 @@ JavascriptContext::GetObjectWrapperTemplate()
499
502
void
500
503
JavascriptContext::RegisterFunction (System::Object^ f)
501
504
{
502
- mFunctions ->Add (f);
505
+ // Note that while we do store WeakReferences, we never clean up this hashtable,
506
+ // so it will just grow and grow.
507
+ mFunctions ->Add (gcnew System::WeakReference (f));
503
508
}
504
509
505
510
// //////////////////////////////////////////////////////////////////////////////////////////////////
0 commit comments