|
13 | 13 | * * |
14 | 14 | * hprose BytesIO for HTML5. * |
15 | 15 | * * |
16 | | - * LastModified: Aug 21, 2015 * |
| 16 | + * LastModified: Feb 5, 2016 * |
17 | 17 | * Author: Ma Bingyao <andot@hprose.com> * |
18 | 18 | * * |
19 | 19 | \**********************************************************/ |
|
22 | 22 | (function (global, undefined) { |
23 | 23 | 'use strict'; |
24 | 24 |
|
| 25 | + var arrayLikeObjectArgumentsEnabled = true; |
| 26 | + |
| 27 | + try { |
| 28 | + String.fromCharCode.apply(String, new Uint8Array([1, 2])); |
| 29 | + } |
| 30 | + catch (e) { |
| 31 | + arrayLikeObjectArgumentsEnabled = false; |
| 32 | + Object.defineProperty(Array.prototype, 'subarray', { value: Array.prototype.slice }); |
| 33 | + } |
| 34 | + |
25 | 35 | var Future = global.hprose.Future; |
26 | 36 |
|
27 | 37 | var _EMPTY_BYTES = new Uint8Array(0); |
|
80 | 90 | } |
81 | 91 |
|
82 | 92 | function readShortString(bytes, n) { |
83 | | - var charCodes = new Uint16Array(n); |
| 93 | + var charCodes = new Array(n); |
84 | 94 | var i = 0, off = 0; |
85 | 95 | for (var len = bytes.length; i < n && off < len; i++) { |
86 | 96 | var unit = bytes[off++]; |
|
138 | 148 | } |
139 | 149 | } |
140 | 150 | if (i < n) { |
141 | | - charCodes = charCodes.subarray(0, i); |
| 151 | + charCodes.length = i; |
142 | 152 | } |
143 | 153 | return [String.fromCharCode.apply(String, charCodes), off]; |
144 | 154 | } |
145 | 155 |
|
146 | 156 | function readLongString(bytes, n) { |
147 | 157 | var buf = []; |
148 | | - var charCodes = new Uint16Array(0xffff); |
| 158 | + var charCodes = new Array(0xffff); |
149 | 159 | var i = 0, off = 0; |
150 | 160 | for (var len = bytes.length; i < n && off < len; i++) { |
151 | 161 | var unit = bytes[off++]; |
|
203 | 213 | } |
204 | 214 | if (i >= 65534) { |
205 | 215 | var size = i + 1; |
206 | | - buf.push(String.fromCharCode.apply(String, charCodes.subarray(0, size))); |
| 216 | + charCodes.length = size; |
| 217 | + buf.push(String.fromCharCode.apply(String, charCodes)); |
207 | 218 | n -= size; |
208 | 219 | i = -1; |
209 | 220 | } |
210 | 221 | } |
211 | 222 | if (i > 0) { |
212 | | - buf.push(String.fromCharCode.apply(String, charCodes.subarray(0, i))); |
| 223 | + charCodes.length = i; |
| 224 | + buf.push(String.fromCharCode.apply(String, charCodes)); |
213 | 225 | } |
214 | 226 | return [buf.join(''), off]; |
215 | 227 | } |
|
279 | 291 | return [bytes.subarray(0, off), off]; |
280 | 292 | } |
281 | 293 |
|
| 294 | + function toArray(bytes) { |
| 295 | + var n = bytes.length; |
| 296 | + var a = new Array(bytes.length); |
| 297 | + for (var i = 0; i < n; ++i) { |
| 298 | + a[i] = bytes[i]; |
| 299 | + } |
| 300 | + return a; |
| 301 | + } |
| 302 | + |
282 | 303 | function pow2roundup(x) { |
283 | 304 | --x; |
284 | 305 | x |= x >> 1; |
|
360 | 381 | _EMPTY_BYTES : |
361 | 382 | this._bytes.subarray(0, this._length); |
362 | 383 | } }, |
| 384 | + buffer: { get : function() { |
| 385 | + if (this._bytes === null) { |
| 386 | + return _EMPTY_BYTES.buffer; |
| 387 | + } |
| 388 | + if (this._bytes.buffer.slice) { |
| 389 | + return this._bytes.buffer.slice(0, this._length); |
| 390 | + } |
| 391 | + var buf = new Uint8Array(this._length); |
| 392 | + buf.set(this._bytes.subarray(0, this._length)); |
| 393 | + return buf.buffer; |
| 394 | + } }, |
363 | 395 | mark: { value: function() { |
364 | 396 | this._wmark = this._length; |
365 | 397 | this._rmark = this._off; |
|
555 | 587 | } |
556 | 588 | if (n === 0) return ''; |
557 | 589 | var bytes = this._bytes.subarray(this._off, this._off += n); |
| 590 | + var charCodes = (arrayLikeObjectArgumentsEnabled ? bytes : toArray(bytes)); |
558 | 591 | if (n < 100000) { |
559 | | - return String.fromCharCode.apply(String, bytes); |
| 592 | + return String.fromCharCode.apply(String, charCodes); |
560 | 593 | } |
561 | 594 | var remain = n & 0xffff; |
562 | 595 | var count = n >> 16; |
563 | 596 | var a = new Array(remain ? count + 1 : count); |
564 | 597 | for (var i = 0; i < count; ++i) { |
565 | | - a[i] = String.fromCharCode.apply(String, bytes.subarray(i << 16, (i + 1) << 16)); |
| 598 | + a[i] = String.fromCharCode.apply(String, charCodes.subarray(i << 16, (i + 1) << 16)); |
566 | 599 | } |
567 | 600 | if (remain) { |
568 | | - a[count] = String.fromCharCode.apply(String, bytes.subarray(count << 16, n)); |
| 601 | + a[count] = String.fromCharCode.apply(String, charCodes.subarray(count << 16, n)); |
569 | 602 | } |
570 | 603 | return a.join(''); |
571 | 604 | } }, |
|
0 commit comments