mirror of
https://github.com/nodejs/node.git
synced 2025-05-06 11:29:26 +00:00

Native Buffer method calls do not require anything from the prototype. So it is unnecessary to check if the Object's prototype is equal to Buffer.prototype. This fixes an issue that prevents Buffer from being inherited the ES5 way. Now the following will work: function A(n) { const b = new Buffer(n); Object.setPrototypeOf(b, A.prototype); return b; } Object.setPrototypeOf(A.prototype, Buffer.prototype); Object.setPrototypeOf(A, Buffer); console.log(new A(4)); Fix: https://github.com/nodejs/node/issues/2882 PR-URL: https://github.com/nodejs/node/pull/3080 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
39 lines
782 B
JavaScript
39 lines
782 B
JavaScript
'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();
|
|
});
|