Skip to content

Commit

Permalink
convert gin to use phantom weak callbacks
Browse files Browse the repository at this point in the history
the old style callbacks are going away

BUG=

Review URL: https://codereview.chromium.org/1102513002

Cr-Commit-Position: refs/heads/master@{#326259}
  • Loading branch information
dcarney authored and Commit bot committed Apr 22, 2015
1 parent 79e175c commit 99ade90
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 19 deletions.
21 changes: 14 additions & 7 deletions gin/array_buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,10 @@ class ArrayBuffer::Private : public base::RefCounted<ArrayBuffer::Private> {
Private(v8::Isolate* isolate, v8::Handle<v8::ArrayBuffer> array);
~Private();

static void WeakCallback(
const v8::WeakCallbackData<v8::ArrayBuffer, Private>& data);
static void FirstWeakCallback(const v8::WeakCallbackInfo<Private>& data);
static void SecondWeakCallback(const v8::WeakCallbackInfo<Private>& data);

v8::Persistent<v8::ArrayBuffer> array_buffer_;
v8::Global<v8::ArrayBuffer> array_buffer_;
scoped_refptr<Private> self_reference_;
v8::Isolate* isolate_;
void* buffer_;
Expand Down Expand Up @@ -108,18 +108,25 @@ ArrayBuffer::Private::Private(v8::Isolate* isolate,
&g_array_buffer_wrapper_info);
array->SetAlignedPointerInInternalField(kEncodedValueIndex, this);

self_reference_ = this; // Cleared in WeakCallback.
array_buffer_.SetWeak(this, WeakCallback);
self_reference_ = this; // Cleared in SecondWeakCallback.
array_buffer_.SetWeak(this, FirstWeakCallback,
v8::WeakCallbackType::kParameter);
}

ArrayBuffer::Private::~Private() {
PerIsolateData::From(isolate_)->allocator()->Free(buffer_, length_);
}

void ArrayBuffer::Private::WeakCallback(
const v8::WeakCallbackData<v8::ArrayBuffer, Private>& data) {
void ArrayBuffer::Private::FirstWeakCallback(
const v8::WeakCallbackInfo<Private>& data) {
Private* parameter = data.GetParameter();
parameter->array_buffer_.Reset();
data.SetSecondPassCallback(SecondWeakCallback);
}

void ArrayBuffer::Private::SecondWeakCallback(
const v8::WeakCallbackInfo<Private>& data) {
Private* parameter = data.GetParameter();
parameter->self_reference_ = NULL;
}

Expand Down
13 changes: 10 additions & 3 deletions gin/function_template.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ namespace internal {

CallbackHolderBase::CallbackHolderBase(v8::Isolate* isolate)
: v8_ref_(isolate, v8::External::New(isolate, this)) {
v8_ref_.SetWeak(this, &CallbackHolderBase::WeakCallback);
v8_ref_.SetWeak(this, &CallbackHolderBase::FirstWeakCallback,
v8::WeakCallbackType::kParameter);
}

CallbackHolderBase::~CallbackHolderBase() {
Expand All @@ -22,9 +23,15 @@ v8::Handle<v8::External> CallbackHolderBase::GetHandle(v8::Isolate* isolate) {
}

// static
void CallbackHolderBase::WeakCallback(
const v8::WeakCallbackData<v8::External, CallbackHolderBase>& data) {
void CallbackHolderBase::FirstWeakCallback(
const v8::WeakCallbackInfo<CallbackHolderBase>& data) {
data.GetParameter()->v8_ref_.Reset();
data.SetSecondPassCallback(SecondWeakCallback);
}

// static
void CallbackHolderBase::SecondWeakCallback(
const v8::WeakCallbackInfo<CallbackHolderBase>& data) {
delete data.GetParameter();
}

Expand Down
8 changes: 5 additions & 3 deletions gin/function_template.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,12 @@ class GIN_EXPORT CallbackHolderBase {
virtual ~CallbackHolderBase();

private:
static void WeakCallback(
const v8::WeakCallbackData<v8::External, CallbackHolderBase>& data);
static void FirstWeakCallback(
const v8::WeakCallbackInfo<CallbackHolderBase>& data);
static void SecondWeakCallback(
const v8::WeakCallbackInfo<CallbackHolderBase>& data);

v8::Persistent<v8::External> v8_ref_;
v8::Global<v8::External> v8_ref_;

DISALLOW_COPY_AND_ASSIGN(CallbackHolderBase);
};
Expand Down
12 changes: 9 additions & 3 deletions gin/wrappable.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,16 @@ ObjectTemplateBuilder WrappableBase::GetObjectTemplateBuilder(
return ObjectTemplateBuilder(isolate);
}

void WrappableBase::WeakCallback(
const v8::WeakCallbackData<v8::Object, WrappableBase>& data) {
void WrappableBase::FirstWeakCallback(
const v8::WeakCallbackInfo<WrappableBase>& data) {
WrappableBase* wrappable = data.GetParameter();
wrappable->wrapper_.Reset();
data.SetSecondPassCallback(SecondWeakCallback);
}

void WrappableBase::SecondWeakCallback(
const v8::WeakCallbackInfo<WrappableBase>& data) {
WrappableBase* wrappable = data.GetParameter();
delete wrappable;
}

Expand Down Expand Up @@ -55,7 +61,7 @@ v8::Handle<v8::Object> WrappableBase::GetWrapperImpl(v8::Isolate* isolate,
wrapper->SetAlignedPointerInInternalField(kWrapperInfoIndex, info);
wrapper->SetAlignedPointerInInternalField(kEncodedValueIndex, this);
wrapper_.Reset(isolate, wrapper);
wrapper_.SetWeak(this, WeakCallback);
wrapper_.SetWeak(this, FirstWeakCallback, v8::WeakCallbackType::kParameter);
return wrapper;
}

Expand Down
8 changes: 5 additions & 3 deletions gin/wrappable.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,12 @@ class GIN_EXPORT WrappableBase {
WrapperInfo* wrapper_info);

private:
static void WeakCallback(
const v8::WeakCallbackData<v8::Object, WrappableBase>& data);
static void FirstWeakCallback(
const v8::WeakCallbackInfo<WrappableBase>& data);
static void SecondWeakCallback(
const v8::WeakCallbackInfo<WrappableBase>& data);

v8::Persistent<v8::Object> wrapper_; // Weak
v8::Global<v8::Object> wrapper_; // Weak

DISALLOW_COPY_AND_ASSIGN(WrappableBase);
};
Expand Down

0 comments on commit 99ade90

Please sign in to comment.