summaryrefslogtreecommitdiff
path: root/lib/buffer.js
diff options
context:
space:
mode:
authorBrian White <mscdex@mscdex.net>2017-04-10 05:07:58 -0400
committerAnna Henningsen <anna@addaleax.net>2017-04-14 22:36:46 +0200
commit4749ec2aa31523c7dad796695c223f9d1a2f1c34 (patch)
tree664bda46c9c5a946c6d4c348eb6bd33df30cc398 /lib/buffer.js
parent3ee4a1a281d6bd4bd7be0577aed41a0f1c9bb1a0 (diff)
downloadandroid-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.js94
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);
};