Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 "use strict"; | 5 "use strict"; |
| 6 | 6 |
| 7 // This file relies on the fact that the following declaration has been made | 7 // This file relies on the fact that the following declaration has been made |
| 8 // in runtime.js: | 8 // in runtime.js: |
| 9 // var $Array = global.Array; | 9 // var $Array = global.Array; |
| 10 | 10 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 76 function URIHexCharsToCharCode(highChar, lowChar) { | 76 function URIHexCharsToCharCode(highChar, lowChar) { |
| 77 var highCode = HexValueOf(highChar); | 77 var highCode = HexValueOf(highChar); |
| 78 var lowCode = HexValueOf(lowChar); | 78 var lowCode = HexValueOf(lowChar); |
| 79 if (highCode == -1 || lowCode == -1) { | 79 if (highCode == -1 || lowCode == -1) { |
| 80 throw new $URIError("URI malformed"); | 80 throw new $URIError("URI malformed"); |
| 81 } | 81 } |
| 82 return (highCode << 4) | lowCode; | 82 return (highCode << 4) | lowCode; |
| 83 } | 83 } |
| 84 | 84 |
| 85 | 85 |
| 86 function URIDecodeOctets(octets, result, index) { | 86 // Users of this macro must ensure that OCTETS is an array and RESULT is a |
| 87 if (!IS_STRING(result)) throw new $URIError("Internal error"); | 87 // sufficiently long two-byte sequential string. |
| 88 // INDEX will be modified as characters are added to RESULT. | |
| 89 macro URI_DECODE_OCTETS(OCTETS, RESULT, INDEX) | |
|
rossberg
2014/05/21 14:30:15
Let's at least add a comment that explains why thi
| |
| 88 var value; | 90 var value; |
| 89 var o0 = octets[0]; | 91 var o0 = OCTETS[0]; |
| 90 if (o0 < 0x80) { | 92 if (o0 < 0x80) { |
| 91 value = o0; | 93 value = o0; |
| 92 } else if (o0 < 0xc2) { | 94 } else if (o0 < 0xc2) { |
| 93 throw new $URIError("URI malformed"); | 95 throw new $URIError("URI malformed"); |
| 94 } else { | 96 } else { |
| 95 var o1 = octets[1]; | 97 var o1 = OCTETS[1]; |
| 96 if (o0 < 0xe0) { | 98 if (o0 < 0xe0) { |
| 97 var a = o0 & 0x1f; | 99 var a = o0 & 0x1f; |
| 98 if ((o1 < 0x80) || (o1 > 0xbf)) { | 100 if ((o1 < 0x80) || (o1 > 0xbf)) { |
| 99 throw new $URIError("URI malformed"); | 101 throw new $URIError("URI malformed"); |
| 100 } | 102 } |
| 101 var b = o1 & 0x3f; | 103 var b = o1 & 0x3f; |
| 102 value = (a << 6) + b; | 104 value = (a << 6) + b; |
| 103 if (value < 0x80 || value > 0x7ff) { | 105 if (value < 0x80 || value > 0x7ff) { |
| 104 throw new $URIError("URI malformed"); | 106 throw new $URIError("URI malformed"); |
| 105 } | 107 } |
| 106 } else { | 108 } else { |
| 107 var o2 = octets[2]; | 109 var o2 = OCTETS[2]; |
| 108 if (o0 < 0xf0) { | 110 if (o0 < 0xf0) { |
| 109 var a = o0 & 0x0f; | 111 var a = o0 & 0x0f; |
| 110 if ((o1 < 0x80) || (o1 > 0xbf)) { | 112 if ((o1 < 0x80) || (o1 > 0xbf)) { |
| 111 throw new $URIError("URI malformed"); | 113 throw new $URIError("URI malformed"); |
| 112 } | 114 } |
| 113 var b = o1 & 0x3f; | 115 var b = o1 & 0x3f; |
| 114 if ((o2 < 0x80) || (o2 > 0xbf)) { | 116 if ((o2 < 0x80) || (o2 > 0xbf)) { |
| 115 throw new $URIError("URI malformed"); | 117 throw new $URIError("URI malformed"); |
| 116 } | 118 } |
| 117 var c = o2 & 0x3f; | 119 var c = o2 & 0x3f; |
| 118 value = (a << 12) + (b << 6) + c; | 120 value = (a << 12) + (b << 6) + c; |
| 119 if ((value < 0x800) || (value > 0xffff)) { | 121 if ((value < 0x800) || (value > 0xffff)) { |
| 120 throw new $URIError("URI malformed"); | 122 throw new $URIError("URI malformed"); |
| 121 } | 123 } |
| 122 } else { | 124 } else { |
| 123 var o3 = octets[3]; | 125 var o3 = OCTETS[3]; |
| 124 if (o0 < 0xf8) { | 126 if (o0 < 0xf8) { |
| 125 var a = (o0 & 0x07); | 127 var a = (o0 & 0x07); |
| 126 if ((o1 < 0x80) || (o1 > 0xbf)) { | 128 if ((o1 < 0x80) || (o1 > 0xbf)) { |
| 127 throw new $URIError("URI malformed"); | 129 throw new $URIError("URI malformed"); |
| 128 } | 130 } |
| 129 var b = (o1 & 0x3f); | 131 var b = (o1 & 0x3f); |
| 130 if ((o2 < 0x80) || (o2 > 0xbf)) { | 132 if ((o2 < 0x80) || (o2 > 0xbf)) { |
| 131 throw new $URIError("URI malformed"); | 133 throw new $URIError("URI malformed"); |
| 132 } | 134 } |
| 133 var c = (o2 & 0x3f); | 135 var c = (o2 & 0x3f); |
| 134 if ((o3 < 0x80) || (o3 > 0xbf)) { | 136 if ((o3 < 0x80) || (o3 > 0xbf)) { |
| 135 throw new $URIError("URI malformed"); | 137 throw new $URIError("URI malformed"); |
| 136 } | 138 } |
| 137 var d = (o3 & 0x3f); | 139 var d = (o3 & 0x3f); |
| 138 value = (a << 18) + (b << 12) + (c << 6) + d; | 140 value = (a << 18) + (b << 12) + (c << 6) + d; |
| 139 if ((value < 0x10000) || (value > 0x10ffff)) { | 141 if ((value < 0x10000) || (value > 0x10ffff)) { |
| 140 throw new $URIError("URI malformed"); | 142 throw new $URIError("URI malformed"); |
| 141 } | 143 } |
| 142 } else { | 144 } else { |
| 143 throw new $URIError("URI malformed"); | 145 throw new $URIError("URI malformed"); |
| 144 } | 146 } |
| 145 } | 147 } |
| 146 } | 148 } |
| 147 } | 149 } |
| 148 if (0xD800 <= value && value <= 0xDFFF) { | 150 if (0xD800 <= value && value <= 0xDFFF) { |
| 149 throw new $URIError("URI malformed"); | 151 throw new $URIError("URI malformed"); |
| 150 } | 152 } |
| 151 if (value < 0x10000) { | 153 if (value < 0x10000) { |
| 152 if (index < 0 || index >= result.length) { | 154 %_TwoByteSeqStringSetChar(RESULT, INDEX++, value); |
| 153 throw new $URIError("Internal error"); | |
| 154 } | |
| 155 %_TwoByteSeqStringSetChar(result, index++, value); | |
| 156 return index; | |
| 157 } else { | 155 } else { |
| 158 if (index < 0 || index >= result.length - 1) { | 156 %_TwoByteSeqStringSetChar(RESULT, INDEX++, (value >> 10) + 0xd7c0); |
| 159 throw new $URIError("Internal error"); | 157 %_TwoByteSeqStringSetChar(RESULT, INDEX++, (value & 0x3ff) + 0xdc00); |
| 160 } | |
| 161 %_TwoByteSeqStringSetChar(result, index++, (value >> 10) + 0xd7c0); | |
| 162 %_TwoByteSeqStringSetChar(result, index++, (value & 0x3ff) + 0xdc00); | |
| 163 return index; | |
| 164 } | 158 } |
| 165 } | 159 endmacro |
| 166 | 160 |
| 167 | 161 |
| 168 // ECMA-262, section 15.1.3 | 162 // ECMA-262, section 15.1.3 |
| 169 function Encode(uri, unescape) { | 163 function Encode(uri, unescape) { |
| 170 var uriLength = uri.length; | 164 var uriLength = uri.length; |
| 171 var array = new InternalArray(uriLength); | 165 var array = new InternalArray(uriLength); |
| 172 var index = 0; | 166 var index = 0; |
| 173 for (var k = 0; k < uriLength; k++) { | 167 for (var k = 0; k < uriLength; k++) { |
| 174 var cc1 = uri.charCodeAt(k); | 168 var cc1 = uri.charCodeAt(k); |
| 175 if (unescape(cc1)) { | 169 if (unescape(cc1)) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 241 while (((cc << ++n) & 0x80) != 0) { } | 235 while (((cc << ++n) & 0x80) != 0) { } |
| 242 if (n == 1 || n > 4) throw new $URIError("URI malformed"); | 236 if (n == 1 || n > 4) throw new $URIError("URI malformed"); |
| 243 var octets = new $Array(n); | 237 var octets = new $Array(n); |
| 244 octets[0] = cc; | 238 octets[0] = cc; |
| 245 if (k + 3 * (n - 1) >= uriLength) throw new $URIError("URI malformed"); | 239 if (k + 3 * (n - 1) >= uriLength) throw new $URIError("URI malformed"); |
| 246 for (var i = 1; i < n; i++) { | 240 for (var i = 1; i < n; i++) { |
| 247 if (uri.charAt(++k) != '%') throw new $URIError("URI malformed"); | 241 if (uri.charAt(++k) != '%') throw new $URIError("URI malformed"); |
| 248 octets[i] = URIHexCharsToCharCode(uri.charCodeAt(++k), | 242 octets[i] = URIHexCharsToCharCode(uri.charCodeAt(++k), |
| 249 uri.charCodeAt(++k)); | 243 uri.charCodeAt(++k)); |
| 250 } | 244 } |
| 251 index = URIDecodeOctets(octets, two_byte, index); | 245 URI_DECODE_OCTETS(octets, two_byte, index); |
| 252 } else if (reserved(cc)) { | 246 } else if (reserved(cc)) { |
| 253 %_TwoByteSeqStringSetChar(two_byte, index++, 37); // '%'. | 247 %_TwoByteSeqStringSetChar(two_byte, index++, 37); // '%'. |
| 254 %_TwoByteSeqStringSetChar(two_byte, index++, uri.charCodeAt(k - 1)); | 248 %_TwoByteSeqStringSetChar(two_byte, index++, uri.charCodeAt(k - 1)); |
| 255 %_TwoByteSeqStringSetChar(two_byte, index++, uri.charCodeAt(k)); | 249 %_TwoByteSeqStringSetChar(two_byte, index++, uri.charCodeAt(k)); |
| 256 } else { | 250 } else { |
| 257 %_TwoByteSeqStringSetChar(two_byte, index++, cc); | 251 %_TwoByteSeqStringSetChar(two_byte, index++, cc); |
| 258 } | 252 } |
| 259 } else { | 253 } else { |
| 260 %_TwoByteSeqStringSetChar(two_byte, index++, code); | 254 %_TwoByteSeqStringSetChar(two_byte, index++, code); |
| 261 } | 255 } |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 434 "escape", URIEscapeJS, | 428 "escape", URIEscapeJS, |
| 435 "unescape", URIUnescapeJS, | 429 "unescape", URIUnescapeJS, |
| 436 "decodeURI", URIDecode, | 430 "decodeURI", URIDecode, |
| 437 "decodeURIComponent", URIDecodeComponent, | 431 "decodeURIComponent", URIDecodeComponent, |
| 438 "encodeURI", URIEncode, | 432 "encodeURI", URIEncode, |
| 439 "encodeURIComponent", URIEncodeComponent | 433 "encodeURIComponent", URIEncodeComponent |
| 440 )); | 434 )); |
| 441 } | 435 } |
| 442 | 436 |
| 443 SetUpUri(); | 437 SetUpUri(); |
| OLD | NEW |