diff options
author | Brian White <mscdex@mscdex.net> | 2017-04-10 05:07:58 -0400 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-04-14 22:36:46 +0200 |
commit | 4749ec2aa31523c7dad796695c223f9d1a2f1c34 (patch) | |
tree | 664bda46c9c5a946c6d4c348eb6bd33df30cc398 /lib/buffer.js | |
parent | 3ee4a1a281d6bd4bd7be0577aed41a0f1c9bb1a0 (diff) | |
download | android-node-v8-4749ec2aa31523c7dad796695c223f9d1a2f1c34.tar.gz android-node-v8-4749ec2aa31523c7dad796695c223f9d1a2f1c34.tar.bz2 android-node-v8-4749ec2aa31523c7dad796695c223f9d1a2f1c34.zip |
buffer: optimize write()
PR-URL: https://github.com/nodejs/node/pull/12361
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'lib/buffer.js')
-rw-r--r-- | lib/buffer.js | 94 |
1 files changed, 49 insertions, 45 deletions
diff --git a/lib/buffer.js b/lib/buffer.js index 1e3478909b..58447ece59 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -786,9 +786,7 @@ Buffer.prototype.fill = function fill(val, start, end, encoding) { Buffer.prototype.write = function(string, offset, length, encoding) { // Buffer#write(string); if (offset === undefined) { - encoding = 'utf8'; - length = this.length; - offset = 0; + return this.utf8Write(string, 0, this.length); // Buffer#write(string, encoding) } else if (length === undefined && typeof offset === 'string') { @@ -801,12 +799,17 @@ Buffer.prototype.write = function(string, offset, length, encoding) { offset = offset >>> 0; if (isFinite(length)) { length = length >>> 0; - if (encoding === undefined) - encoding = 'utf8'; } else { encoding = length; length = undefined; } + + var remaining = this.length - offset; + if (length === undefined || length > remaining) + length = remaining; + + if (string.length > 0 && (length < 0 || offset < 0)) + throw new RangeError('Attempt to write outside buffer bounds'); } else { // if someone is still calling the obsolete form of write(), tell them. // we don't want eg buf.write("foo", "utf8", 10) to silently turn into @@ -815,50 +818,51 @@ Buffer.prototype.write = function(string, offset, length, encoding) { 'is no longer supported'); } - var remaining = this.length - offset; - if (length === undefined || length > remaining) - length = remaining; - - if (string.length > 0 && (length < 0 || offset < 0)) - throw new RangeError('Attempt to write outside buffer bounds'); - - if (!encoding) - encoding = 'utf8'; - - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'hex': - return this.hexWrite(string, offset, length); - - case 'utf8': - case 'utf-8': - return this.utf8Write(string, offset, length); - - case 'ascii': - return this.asciiWrite(string, offset, length); + if (!encoding) return this.utf8Write(string, offset, length); - case 'latin1': - case 'binary': + encoding += ''; + switch (encoding.length) { + case 4: + if (encoding === 'utf8') return this.utf8Write(string, offset, length); + if (encoding === 'ucs2') return this.ucs2Write(string, offset, length); + encoding = encoding.toLowerCase(); + if (encoding === 'utf8') return this.utf8Write(string, offset, length); + if (encoding === 'ucs2') return this.ucs2Write(string, offset, length); + break; + case 5: + if (encoding === 'utf-8') return this.utf8Write(string, offset, length); + if (encoding === 'ascii') return this.asciiWrite(string, offset, length); + if (encoding === 'ucs-2') return this.ucs2Write(string, offset, length); + encoding = encoding.toLowerCase(); + if (encoding === 'utf-8') return this.utf8Write(string, offset, length); + if (encoding === 'ascii') return this.asciiWrite(string, offset, length); + if (encoding === 'ucs-2') return this.ucs2Write(string, offset, length); + break; + case 7: + if (encoding === 'utf16le' || encoding.toLowerCase() === 'utf16le') + return this.ucs2Write(string, offset, length); + break; + case 8: + if (encoding === 'utf-16le' || encoding.toLowerCase() === 'utf-16le') + return this.ucs2Write(string, offset, length); + break; + case 6: + if (encoding === 'latin1' || encoding === 'binary') return this.latin1Write(string, offset, length); - - case 'base64': - // Warning: maxLength not taken into account in base64Write + if (encoding === 'base64') return this.base64Write(string, offset, length); - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return this.ucs2Write(string, offset, length); - - default: - if (loweredCase) - throw new TypeError('Unknown encoding: ' + encoding); - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } + encoding = encoding.toLowerCase(); + if (encoding === 'latin1' || encoding === 'binary') + return this.latin1Write(string, offset, length); + if (encoding === 'base64') + return this.base64Write(string, offset, length); + break; + case 3: + if (encoding === 'hex' || encoding.toLowerCase() === 'hex') + return this.hexWrite(string, offset, length); + break; } + throw new TypeError('Unknown encoding: ' + encoding); }; |