@@ -62,6 +62,15 @@ class Cached<v8::Value> : public CachedBase<v8::Value> {
6262 void operator =(v8::Handle<v8::Value> that);
6363};
6464
65+ template <class TypeName >
66+ inline v8::Local<TypeName> PersistentToLocal (
67+ const v8::Persistent<TypeName>& persistent);
68+
69+ template <class TypeName >
70+ inline v8::Local<TypeName> PersistentToLocal (
71+ v8::Isolate* isolate,
72+ const v8::Persistent<TypeName>& persistent);
73+
6574template <typename TypeName>
6675v8::Handle<v8::Value> MakeCallback (
6776 const v8::Persistent<v8::Object>& recv,
@@ -244,13 +253,31 @@ inline MUST_USE_RESULT bool ParseArrayIndex(v8::Handle<v8::Value> arg,
244253 return true ;
245254}
246255
256+ template <class TypeName >
257+ inline v8::Local<TypeName> PersistentToLocal (
258+ const v8::Persistent<TypeName>& persistent) {
259+ return PersistentToLocal (node_isolate, persistent);
260+ }
261+
262+ template <class TypeName >
263+ inline v8::Local<TypeName> PersistentToLocal (
264+ v8::Isolate* isolate,
265+ const v8::Persistent<TypeName>& persistent) {
266+ if (persistent.IsWeak ()) {
267+ return v8::Local<TypeName>::New (isolate, persistent);
268+ } else {
269+ return *reinterpret_cast <v8::Local<TypeName>*>(
270+ const_cast <v8::Persistent<TypeName>*>(&persistent));
271+ }
272+ }
273+
247274template <typename TypeName>
248275CachedBase<TypeName>::CachedBase() {
249276}
250277
251278template <typename TypeName>
252279CachedBase<TypeName>::operator v8::Handle<TypeName>() const {
253- return v8::Local<TypeName>:: New (node_isolate, handle_);
280+ return PersistentToLocal ( handle_);
254281}
255282
256283template <typename TypeName>
@@ -305,8 +332,7 @@ v8::Handle<v8::Value> MakeCallback(
305332 const TypeName method,
306333 int argc,
307334 v8::Handle<v8::Value>* argv) {
308- v8::Local<v8::Object> recv_obj =
309- v8::Local<v8::Object>::New (node_isolate, recv);
335+ v8::Local<v8::Object> recv_obj = PersistentToLocal (recv);
310336 return MakeCallback (recv_obj, method, argc, argv);
311337}
312338
@@ -323,15 +349,14 @@ v8::Handle<v8::Value> MakeCallback(
323349inline bool HasInstance (v8::Persistent<v8::FunctionTemplate>& function_template,
324350 v8::Handle<v8::Value> value) {
325351 v8::Local<v8::FunctionTemplate> function_template_handle =
326- v8::Local<v8::FunctionTemplate>:: New (node_isolate, function_template);
352+ PersistentToLocal ( function_template);
327353 return function_template_handle->HasInstance (value);
328354}
329355
330356inline v8::Local<v8::Object> NewInstance (v8::Persistent<v8::Function>& ctor,
331357 int argc,
332358 v8::Handle<v8::Value>* argv) {
333- v8::Local<v8::Function> constructor_handle =
334- v8::Local<v8::Function>::New (node_isolate, ctor);
359+ v8::Local<v8::Function> constructor_handle = PersistentToLocal (ctor);
335360 return constructor_handle->NewInstance (argc, argv);
336361}
337362
@@ -341,14 +366,14 @@ template <typename TypeName>
341366inline char * Data (v8::Persistent<TypeName>& val) {
342367 NODE_EXTERN char * Data (v8::Handle<v8::Value>);
343368 NODE_EXTERN char * Data (v8::Handle<v8::Object>);
344- return Data (v8::Local<TypeName>:: New (node_isolate, val));
369+ return Data (PersistentToLocal ( val));
345370}
346371
347372template <typename TypeName>
348373inline size_t Length (v8::Persistent<TypeName>& val) {
349374 NODE_EXTERN size_t Length (v8::Handle<v8::Value>);
350375 NODE_EXTERN size_t Length (v8::Handle<v8::Object>);
351- return Length (v8::Local<TypeName>:: New (node_isolate, val));
376+ return Length (PersistentToLocal ( val));
352377}
353378
354379} // namespace Buffer
0 commit comments