On Tue, Dec 1, 2009 at 3:56 PM, Abdulla Kamar <[email protected]> wrote: > It still doesn't seem to work for me, here's the exact code I use: > > v8::Handle< v8::Object > handle( v8::Object::Cast( *value ) ); > v8::Persistent< v8::Object >( handle ).ClearWeak(); > > "value" is a "const v8::Handle< v8::Value >&" that I get from a "const > v8::Arguments&" to a function. The value is previously created as a > Persistent from another function. Using the code from above, the callback > for the weak reference is still being run on GC.
I don't remember immediately, but if you got it via Arguments, it could be saved into a local handle. Even if it's not a case right now, I doubt v8 would ever guarantee you that. So to clear weakness flag you need to access that persistent handle, sorry. There might be some hacky ways like storing a pointer to the handle into the object itself, or, e.g. as Chromium does it---maintain an additional map from, say, DOM objects to _unique_ persistent handles. hth and yours, anton. > > 2009/12/1 Søren Gjesse <[email protected]> >> >> Sorry for the confusion I you should use the Persistent constructor to >> cast a Handle to Persistent when the Handle refers to a Persistent. >> Handle<Object> x >> ... // x is know to be a persistent handle. >> Persistent<Object>(x).ClearWeak(); >> In the following sample the callback XXXCallback will never be called. >> void XXXCallback(v8::Persistent<v8::Value> handle, void*) { >> printf("XXX\n"); >> handle.Dispose(); >> } >> void ClearWeak(v8::Handle<v8::Object> handle) { >> v8::Persistent<v8::Object>(handle).ClearWeak(); >> } >> >> void main(...) { >> v8::HandleScope scope; >> ... // Create and enter context. >> v8::Persistent<v8::Object> handle; >> { >> v8::HandleScope scope; >> handle = v8::Persistent<v8::Object>::New(v8::Object::New()); >> handle.MakeWeak(NULL, XXXCallback); >> } >> ClearWeak(handle); >> .. // More stuff eventually causing GC. >> } >> >> Regards, >> Søren >> On Tue, Dec 1, 2009 at 12:16, Abdulla Kamar <[email protected]> >> wrote: >>> >>> I assumed that you could construct a persistent directly, as the header >>> has the following statement for the persistent constructor that takes a >>> handle: >>> >>> "Casts" a plain handle which is known to be a persistent handle to a >>> persistent handle. >>> >>> The cast for a persistent takes a persistent, and the persistent >>> construct that takes a handle requires is explicit, so I did the following: >>> >>> v8::Persistent< v8::Object > persistent( v8::Object::Cast( *value ) ); >>> v8::Persistent< v8::Object >::Cast( persistent ).ClearWeak(); >>> >>> But that doesn't seem to work. Instead, I've just set the pointer stored >>> in the object to null, which seems to work for now but feels like a hack. >>> -- >>> Thank you >>> Abdulla >>> >>> -- >>> v8-users mailing list >>> [email protected] >>> http://groups.google.com/group/v8-users >> >> -- >> v8-users mailing list >> [email protected] >> http://groups.google.com/group/v8-users > > > -- > Thank you > Abdulla > > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
