Hi,
I'm updating v8 from v10.2.154.26 to v 12.4.254.
I found out kFinalizer is deprecated in the newer version so I have to rework the weakcall back part in my implementation.
When I simply change the kFinalizer in to kParameter in my SetWeak call, the program crashes when I calles SetAlignedPointerInInternalField in the destructor of my class under certain circumstance.
I'm wondering what's the correct way to use internal field, and the reason why it's crashing if I change WeakCallbackType from kFinalizer to kParameter.
The following is some code segment of my implementation.
class A {
v8::Persistent<v8::Object> mObject;
}
A::~A ()
{
if ( !mObject.IsEmpty() )
mObject.ClearWeak();
mObject.Reset();
}
void
A::Wrap (v8::Local<v8::Object> const &object)
{
object->SetAlignedPointerInInternalField(0, this);
mObject.Reset(v8::Isolate::GetCurrent(), object);
}
B::B() :A() {}
B::~B()
{
if (!mObject.IsEmpty() && GetRuntime()->IsValid())
{
v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(v8::Isolate::GetCurrent(), mObject);
obj->SetAlignedPointerInInternalField(0, NULL); // Crashes here, seems obj is already collected, Is this needed to prevent dangling pointer?
}
}
C::C()
:B()
{
v8::Local<v8::Object> target =
Initialize()->GetFunction(ctx).ToLocalChecked()
->NewInstance(ctx).ToLocalChecked();
Wrap(target);
mObject.SetWeak(this, WeakCallback, v8::WeakCallbackType::kParameter); // Was kFinalizer in previous version, no crash.
}
C::~C()
{
mObject.ClearWeak();
}
void
B::WeakCallback(const v8::WeakCallbackInfo<C>& data)
{
C* self = data.GetParameter();
self->EarlyComplete();
delete self;
}
--
--
v8-users mailing list
v8-u...@googlegroups.com
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 v8-users+u...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/v8-users/77f84ccf-b1ba-4967-81ab-89a312be8af3n%40googlegroups.com.