In this example, the Persistent is allocated on the stack. If I want the 
callback to keep working after the Persistent goes out of scope, would I 
have to allocate it on the heap? Would I then have to delete the Persistent 
in the callback?

~Theodore

On Tuesday, March 15, 2016 at 11:12:23 AM UTC-7, Ian Bull wrote:
>
> Thank-you very much Pavel,
>
> This particular solution resulted in a core dump, but I noticed that the 
> SetWeak method that takes a WeakCallbackData is deprecated. When I used the 
> SetWeak method that takes the WeakCallbackInfo, things work as expected. 
>
> Thanks again,
> Ian
>
> ```
>
> Stack: [0x0000000111a61000,0x0000000111b61000],  sp=0x0000000111b5da08,  
> free space=1010k
>
> Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native 
> code)
>
> C  [libj2v8_macosx_x86_64.dylib+0x57f2]  v8::base::OS::Abort()+0x12
>
> C  [libj2v8_macosx_x86_64.dylib+0x2da7e1]  
> v8::internal::GlobalHandles::Node::PostGarbageCollectionProcessing(v8::internal::Isolate*)+0x1d1
>
> C  [libj2v8_macosx_x86_64.dylib+0x2dace5]  
> v8::internal::GlobalHandles::PostGarbageCollectionProcessing(v8::internal::GarbageCollector,
>  
> v8::GCCallbackFlags)+0x95
>
> C  [libj2v8_macosx_x86_64.dylib+0x2e81f0]  
> v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, 
> v8::GCCallbackFlags)+0x690
>
> C  [libj2v8_macosx_x86_64.dylib+0x2e775c]  
> v8::internal::Heap::CollectGarbage(v8::internal::GarbageCollector, char 
> const*, char const*, v8::GCCallbackFlags)+0x21c
>
> C  [libj2v8_macosx_x86_64.dylib+0x2b34e1]  
> v8::internal::Factory::NewFixedArray(int, v8::internal::PretenureFlag)+0x61
>
> ```
>
> On Tuesday, 15 March 2016 00:03:03 UTC-7, Pavel Medvedev wrote:
>>
>> Hi Ian,
>>
>> To delete user data on GC you need to create a weak persistent handle for 
>> your External. A user supplied callback function would be invoked on GC of 
>> this weak Persistent, and you can delete your data there, like this:
>>
>> MethodDescriptor* md = new MethodDescriptor();
>>
>> Local<External> ext =  External::New(isolate, md);
>> Persistent<External> pext(isolate, ext);
>> pext.SetWeak(data, [](v8::WeakCallbackData<External, MethodDescriptor> 
>> const& data)
>> {
>>     MethodDescriptor* md = data.GetParameter();
>>     delete md;
>> });
>>
>> Function::New(isolate, callback, External::New(isolate, md))
>>
>>
>> Note that GC could be called some time later (even it could)
>>
>> On Tuesday, March 15, 2016 at 12:15:10 AM UTC+3, Ian Bull wrote:
>>>
>>> I'm creating a Function with a C++ callback as follows:
>>>
>>> MethodDescriptor* md = new MethodDescriptor();
>>>
>>> md -> someFields = someValue;
>>>
>>> Function::New(isolate, callback, External::New(isolate, md))
>>>
>>>
>>> In this case I associate a MethodDescriptor (md) with the function so 
>>> that when my callback is invoked I can get information about this 
>>> particular instance. How can I get notified (via a callback or destructor) 
>>> that this Function has been GC'd so I can clean-up the memory I allocated 
>>> for the MethodDescriptor?
>>>
>>

-- 
-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to