summaryrefslogtreecommitdiff
path: root/lib/querystring.js
diff options
context:
space:
mode:
authorBrian White <mscdex@mscdex.net>2017-01-16 09:46:36 -0500
committerBrian White <mscdex@mscdex.net>2017-01-25 02:22:26 -0500
commit3bdcbdb1a085b35a3a50112a51781b31d8814294 (patch)
treeb85db1882318a07c7838b70827dbc929fc73f35a /lib/querystring.js
parent05f38be556e27cb4a6efb325e24c4108148a77ad (diff)
downloadandroid-node-v8-3bdcbdb1a085b35a3a50112a51781b31d8814294.tar.gz
android-node-v8-3bdcbdb1a085b35a3a50112a51781b31d8814294.tar.bz2
android-node-v8-3bdcbdb1a085b35a3a50112a51781b31d8814294.zip
querystring: improve unescapeBuffer performance
PR-URL: https://github.com/nodejs/node/pull/10837 Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib/querystring.js')
-rw-r--r--lib/querystring.js54
1 files changed, 35 insertions, 19 deletions
diff --git a/lib/querystring.js b/lib/querystring.js
index 2ced10c72d..5ccb5fa77b 100644
--- a/lib/querystring.js
+++ b/lib/querystring.js
@@ -22,15 +22,41 @@ const Buffer = require('buffer').Buffer;
function ParsedQueryString() {}
ParsedQueryString.prototype = Object.create(null);
-
+const unhexTable = [
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0 - 15
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16 - 31
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 32 - 47
+ +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, -1, -1, -1, -1, -1, -1, // 48 - 63
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 64 - 79
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 80 - 95
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 96 - 111
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 112 - 127
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128 ...
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // ... 255
+];
// a safe fast alternative to decodeURIComponent
function unescapeBuffer(s, decodeSpaces) {
var out = Buffer.allocUnsafe(s.length);
var state = 0;
- var n, m, hexchar;
+ var n, m, hexchar, c;
- for (var inIndex = 0, outIndex = 0; inIndex <= s.length; inIndex++) {
- var c = inIndex < s.length ? s.charCodeAt(inIndex) : NaN;
+ for (var inIndex = 0, outIndex = 0; ; inIndex++) {
+ if (inIndex < s.length) {
+ c = s.charCodeAt(inIndex);
+ } else {
+ if (state > 0) {
+ out[outIndex++] = 37/*%*/;
+ if (state === 2)
+ out[outIndex++] = hexchar;
+ }
+ break;
+ }
switch (state) {
case 0: // Any character
switch (c) {
@@ -51,13 +77,8 @@ function unescapeBuffer(s, decodeSpaces) {
case 1: // First hex digit
hexchar = c;
- if (c >= 48/*0*/ && c <= 57/*9*/) {
- n = c - 48/*0*/;
- } else if (c >= 65/*A*/ && c <= 70/*F*/) {
- n = c - 65/*A*/ + 10;
- } else if (c >= 97/*a*/ && c <= 102/*f*/) {
- n = c - 97/*a*/ + 10;
- } else {
+ n = unhexTable[c];
+ if (!(n >= 0)) {
out[outIndex++] = 37/*%*/;
out[outIndex++] = c;
state = 0;
@@ -68,13 +89,8 @@ function unescapeBuffer(s, decodeSpaces) {
case 2: // Second hex digit
state = 0;
- if (c >= 48/*0*/ && c <= 57/*9*/) {
- m = c - 48/*0*/;
- } else if (c >= 65/*A*/ && c <= 70/*F*/) {
- m = c - 65/*A*/ + 10;
- } else if (c >= 97/*a*/ && c <= 102/*f*/) {
- m = c - 97/*a*/ + 10;
- } else {
+ m = unhexTable[c];
+ if (!(m >= 0)) {
out[outIndex++] = 37/*%*/;
out[outIndex++] = hexchar;
out[outIndex++] = c;
@@ -87,7 +103,7 @@ function unescapeBuffer(s, decodeSpaces) {
// TODO support returning arbitrary buffers.
- return out.slice(0, outIndex - 1);
+ return out.slice(0, outIndex);
}