@@ -254,57 +254,55 @@ class class_singleton : public class_info
254
254
return scope.Escape (obj);
255
255
}
256
256
257
- using class_instances = std::vector<void *>;
258
- public:
259
- static class_singleton& create (v8::Isolate* isolate)
257
+ using class_singletons = std::vector<void *>;
258
+ static class_singletons& class_instances (v8::Isolate* isolate)
260
259
{
261
- // Get pointer to singleton instances from v8::Isolate
262
- class_instances* singletons =
263
- static_cast <class_instances *>(isolate->GetData (V8PP_ISOLATE_DATA_SLOT));
264
- if (!singletons )
260
+ # if defined(V8PP_ISOLATE_DATA_SLOT)
261
+ class_singletons* instances =
262
+ static_cast <class_singletons *>(isolate->GetData (V8PP_ISOLATE_DATA_SLOT));
263
+ if (!instances )
265
264
{
266
- // No singletons map yet, create and store it
267
- singletons = new class_instances;
268
- isolate->SetData (V8PP_ISOLATE_DATA_SLOT, singletons);
265
+ instances = new class_singletons;
266
+ isolate->SetData (V8PP_ISOLATE_DATA_SLOT, instances);
269
267
}
268
+ return *instances;
269
+ #else
270
+ static std::unordered_map<v8::Isolate*, class_singletons> instances;
271
+ return instances[isolate];
272
+ #endif
273
+ }
270
274
271
- class_type = static_cast <type_index>(singletons->size ());
275
+ public:
276
+ static class_singleton& create (v8::Isolate* isolate)
277
+ {
278
+ class_singletons& singletons = class_instances (isolate);
279
+ class_type = static_cast <type_index>(singletons.size ());
272
280
class_singleton* result = new class_singleton (isolate);
273
- singletons->emplace_back (result);
274
-
281
+ singletons.emplace_back (result);
275
282
return *result;
276
283
}
277
284
278
285
static void destroy (v8::Isolate* isolate)
279
286
{
280
- class_instances* singletons =
281
- static_cast <class_instances*>(isolate->GetData (V8PP_ISOLATE_DATA_SLOT));
282
- if (singletons)
287
+ class_singletons& singletons = class_instances (isolate);
288
+ if (class_type < singletons.size ())
283
289
{
284
- if (class_type < singletons->size ())
290
+ class_singleton* instance = static_cast <class_singleton*>(singletons[class_type]);
291
+ if (instance)
285
292
{
286
- class_singleton* instance = static_cast <class_singleton*>((*singletons)[class_type]);
287
293
instance->destroy_objects ();
288
294
delete instance;
289
- (*singletons)[class_type] = nullptr ;
290
- size_t const null_count = std::count (singletons->begin (), singletons->end (), nullptr );
291
- if (null_count == singletons->size ())
292
- {
293
- delete singletons;
294
- isolate->SetData (V8PP_ISOLATE_DATA_SLOT, nullptr );
295
- }
295
+ singletons[class_type] = nullptr ;
296
296
}
297
297
}
298
298
}
299
299
300
300
static class_singleton& instance (v8::Isolate* isolate)
301
301
{
302
- // Get pointer to singleton instances from v8::Isolate
303
- class_instances* singletons =
304
- static_cast <class_instances*>(isolate->GetData (V8PP_ISOLATE_DATA_SLOT));
305
- if (singletons && class_type < singletons->size ())
302
+ class_singletons& singletons = class_instances (isolate);
303
+ if (class_type < singletons.size ())
306
304
{
307
- class_singleton* result = static_cast <class_singleton*>((* singletons) [class_type]);
305
+ class_singleton* result = static_cast <class_singleton*>(singletons[class_type]);
308
306
if (result)
309
307
{
310
308
return *result;
0 commit comments