diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 5e0de52322496b..9dbf3f0f6eab7b 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -163,24 +163,20 @@ void CallbackInfo::WeakCallback(Isolate* isolate, Local object) { // Buffer methods bool HasInstance(Local val) { - return val->IsObject() && HasInstance(val.As()); + return val->IsUint8Array(); } bool HasInstance(Local obj) { - if (!obj->IsUint8Array()) - return false; - Local array = obj.As(); - Environment* env = Environment::GetCurrent(array->GetIsolate()); - return array->GetPrototype()->StrictEquals(env->buffer_prototype_object()); + return obj->IsUint8Array(); } char* Data(Local val) { - CHECK(val->IsObject()); - // Use a fully qualified name here to work around a bug in gcc 4.2. - // It mistakes an unadorned call to Data() for the v8::String::Data type. - return node::Buffer::Data(val.As()); + CHECK(val->IsUint8Array()); + Local ui = val.As(); + ArrayBuffer::Contents ab_c = ui->Buffer()->GetContents(); + return static_cast(ab_c.Data()) + ui->ByteOffset(); } @@ -193,8 +189,9 @@ char* Data(Local obj) { size_t Length(Local val) { - CHECK(val->IsObject()); - return Length(val.As()); + CHECK(val->IsUint8Array()); + Local ui = val.As(); + return ui->ByteLength(); } diff --git a/test/parallel/test-buffer-inheritance.js b/test/parallel/test-buffer-inheritance.js new file mode 100644 index 00000000000000..eb2f4a531d0b38 --- /dev/null +++ b/test/parallel/test-buffer-inheritance.js @@ -0,0 +1,38 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + + +function T(n) { + const ui8 = new Uint8Array(n); + Object.setPrototypeOf(ui8, T.prototype); + return ui8; +} +Object.setPrototypeOf(T.prototype, Buffer.prototype); +Object.setPrototypeOf(T, Buffer); + +T.prototype.sum = function sum() { + let cntr = 0; + for (let i = 0; i < this.length; i++) + cntr += this[i]; + return cntr; +}; + + +const vals = [new T(4), T(4)]; + +vals.forEach(function(t) { + assert.equal(t.constructor, T); + assert.equal(t.__proto__, T.prototype); + assert.equal(t.__proto__.__proto__, Buffer.prototype); + + t.fill(5); + let cntr = 0; + for (let i = 0; i < t.length; i++) + cntr += t[i]; + assert.equal(t.length * 5, cntr); + + // Check this does not throw + t.toString(); +});