Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
buffer: replace deprecated SetWeak usage
Old style SetWeak is now deprecated, and weakness now works like
phantom references. This means we no longer have a reference to the
object in the weak callback. We use a kInternalFields style weak
callback which provides us with the contents of 2 internal fields
where we can squirrel away the native buffer pointer.

We can no longer neuter the buffer in the weak callback, but that
should be unnecessary as the object is going to be GC'd during the
current gc cycle.
  • Loading branch information
ofrobots committed Feb 24, 2016
commit dcecbde399df0dbffc12203a223f610ce4ae712f
24 changes: 13 additions & 11 deletions src/node_buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ using v8::Uint32;
using v8::Uint32Array;
using v8::Uint8Array;
using v8::Value;
using v8::WeakCallbackData;
using v8::WeakCallbackInfo;


class CallbackInfo {
Expand All @@ -83,8 +83,8 @@ class CallbackInfo {
FreeCallback callback,
void* hint = 0);
private:
static void WeakCallback(const WeakCallbackData<ArrayBuffer, CallbackInfo>&);
inline void WeakCallback(Isolate* isolate, Local<ArrayBuffer> object);
static void WeakCallback(const WeakCallbackInfo<CallbackInfo>&);
inline void WeakCallback(Isolate* isolate, char* const data);
inline CallbackInfo(Isolate* isolate,
Local<ArrayBuffer> object,
FreeCallback callback,
Expand Down Expand Up @@ -122,7 +122,10 @@ CallbackInfo::CallbackInfo(Isolate* isolate,
if (object->ByteLength() != 0)
CHECK_NE(data, nullptr);

persistent_.SetWeak(this, WeakCallback);
object->SetAlignedPointerInInternalField(kBufferInternalFieldIndex, data);

persistent_.SetWeak(this, WeakCallback,
v8::WeakCallbackType::kInternalFields);
persistent_.SetWrapperClassId(BUFFER_ID);
persistent_.MarkIndependent();
isolate->AdjustAmountOfExternalAllocatedMemory(sizeof(*this));
Expand All @@ -135,16 +138,15 @@ CallbackInfo::~CallbackInfo() {


void CallbackInfo::WeakCallback(
const WeakCallbackData<ArrayBuffer, CallbackInfo>& data) {
data.GetParameter()->WeakCallback(data.GetIsolate(), data.GetValue());
const WeakCallbackInfo<CallbackInfo>& data) {
data.GetParameter()->WeakCallback(
data.GetIsolate(),
static_cast<char*>(data.GetInternalField(kBufferInternalFieldIndex)));
}


void CallbackInfo::WeakCallback(Isolate* isolate, Local<ArrayBuffer> buf) {
ArrayBuffer::Contents obj_c = buf->GetContents();
char* const obj_data = static_cast<char*>(obj_c.Data());
buf->Neuter();
callback_(obj_data, hint_);
void CallbackInfo::WeakCallback(Isolate* isolate, char* const data) {
callback_(data, hint_);
int64_t change_in_bytes = -static_cast<int64_t>(sizeof(*this));
isolate->AdjustAmountOfExternalAllocatedMemory(change_in_bytes);

Expand Down
4 changes: 4 additions & 0 deletions src/node_buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ namespace Buffer {
static const unsigned int kMaxLength =
sizeof(int32_t) == sizeof(intptr_t) ? 0x3fffffff : 0x7fffffff;

// Buffers have two internal fields, the first of which is reserved for use by
// Node.
static const unsigned int kBufferInternalFieldIndex = 0;

NODE_EXTERN typedef void (*FreeCallback)(char* data, void* hint);

NODE_EXTERN bool HasInstance(v8::Local<v8::Value> val);
Expand Down