Skip to content

Commit 0e53b42

Browse files
committed
Merge pull request #5 from Dretch/ie8-fixes
Ensure compatibility with IE 8
2 parents 98e8260 + 6205629 commit 0e53b42

File tree

5 files changed

+184
-167
lines changed

5 files changed

+184
-167
lines changed

ByteBuffer.js

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
* @license ByteBuffer.js (c) 2013 Daniel Wirtz <[email protected]>
1919
* Released under the Apache License, Version 2.0
2020
* see: https://github.com/dcodeIO/ByteBuffer.js for details
21+
*
22+
* Note that this library carefully avoids using the array access operator
23+
* (i.e. buffer[x]) on ArrayBufferView subclasses (e.g. Uint8Array), and
24+
* uses DataView instead. This is required for IE 8 compatibility.
2125
*/
2226
(function(global) {
2327
"use strict";
@@ -1012,32 +1016,32 @@
10121016
// ref: http://code.google.com/searchframe#WTeibokF6gE/trunk/src/google/protobuf/io/coded_stream.cc
10131017
value = value >>> 0;
10141018
this.ensureCapacity(offset+ByteBuffer.calculateVarint32(value));
1015-
var dst = new Uint8Array(this.array),
1019+
var dst = new DataView(this.array),
10161020
size = 0;
1017-
dst[offset] = (value | 0x80);
1021+
dst.setUint8(offset, value | 0x80);
10181022
if (value >= (1 << 7)) {
1019-
dst[offset+1] = ((value >> 7) | 0x80);
1023+
dst.setUint8(offset+1, (value >> 7) | 0x80);
10201024
if (value >= (1 << 14)) {
1021-
dst[offset+2] = ((value >> 14) | 0x80);
1025+
dst.setUint8(offset+2, (value >> 14) | 0x80);
10221026
if (value >= (1 << 21)) {
1023-
dst[offset+3] = ((value >> 21) | 0x80);
1027+
dst.setUint8(offset+3, (value >> 21) | 0x80);
10241028
if (value >= (1 << 28)) {
1025-
dst[offset+4] = (value >> 28) & 0x7F;
1029+
dst.setUint8(offset+4, (value >> 28) & 0x7F);
10261030
size = 5;
10271031
} else {
1028-
dst[offset+3] &= 0x7F;
1032+
dst.setUint8(offset+3, dst.getUint8(offset+3) & 0x7F);
10291033
size = 4;
10301034
}
10311035
} else {
1032-
dst[offset+2] &= 0x7F;
1036+
dst.setUint8(offset+2, dst.getUint8(offset+2) & 0x7F);
10331037
size = 3;
10341038
}
10351039
} else {
1036-
dst[offset+1] &= 0x7F;
1040+
dst.setUint8(offset+1, dst.getUint8(offset+1) & 0x7F);
10371041
size = 2;
10381042
}
10391043
} else {
1040-
dst[offset] &= 0x7F;
1044+
dst.setUint8(offset, dst.getUint8(offset) & 0x7F);
10411045
size = 1;
10421046
}
10431047
if (advance) {
@@ -1060,12 +1064,12 @@
10601064
offset = typeof offset != 'undefined' ? offset : this.offset;
10611065
// ref: src/google/protobuf/io/coded_stream.cc
10621066

1063-
var src = new Uint8Array(this.array),
1067+
var src = new DataView(this.array),
10641068
count = 0,
10651069
b;
10661070
var value = 0 >>> 0;
10671071
do {
1068-
b = src[offset+count];
1072+
b = src.getUint8(offset+count);
10691073
value |= ((b&0x7F)<<(7*count)) >>> 0;
10701074
++count;
10711075
} while (b & 0x80);
@@ -1166,20 +1170,20 @@
11661170
size = ByteBuffer.calculateVarint64(value);
11671171

11681172
this.ensureCapacity(offset+size);
1169-
var dst = new Uint8Array(this.array);
1173+
var dst = new DataView(this.array);
11701174
switch (size) {
1171-
case 10: dst[offset+9] = ((part2 >>> 7) | 0x80);
1172-
case 9 : dst[offset+8] = ((part2 ) | 0x80);
1173-
case 8 : dst[offset+7] = ((part1 >>> 21) | 0x80);
1174-
case 7 : dst[offset+6] = ((part1 >>> 14) | 0x80);
1175-
case 6 : dst[offset+5] = ((part1 >>> 7) | 0x80);
1176-
case 5 : dst[offset+4] = ((part1 ) | 0x80);
1177-
case 4 : dst[offset+3] = ((part0 >>> 21) | 0x80);
1178-
case 3 : dst[offset+2] = ((part0 >>> 14) | 0x80);
1179-
case 2 : dst[offset+1] = ((part0 >>> 7) | 0x80);
1180-
case 1 : dst[offset+0] = ((part0 ) | 0x80);
1181-
}
1182-
dst[offset+size-1] &= 0x7F;
1175+
case 10: dst.setUint8(offset+9, (part2 >>> 7) | 0x80);
1176+
case 9 : dst.setUint8(offset+8, (part2 ) | 0x80);
1177+
case 8 : dst.setUint8(offset+7, (part1 >>> 21) | 0x80);
1178+
case 7 : dst.setUint8(offset+6, (part1 >>> 14) | 0x80);
1179+
case 6 : dst.setUint8(offset+5, (part1 >>> 7) | 0x80);
1180+
case 5 : dst.setUint8(offset+4, (part1 ) | 0x80);
1181+
case 4 : dst.setUint8(offset+3, (part0 >>> 21) | 0x80);
1182+
case 3 : dst.setUint8(offset+2, (part0 >>> 14) | 0x80);
1183+
case 2 : dst.setUint8(offset+1, (part0 >>> 7) | 0x80);
1184+
case 1 : dst.setUint8(offset+0, (part0 ) | 0x80);
1185+
}
1186+
dst.setUint8(offset+size-1, dst.getUint8(offset+size-1) & 0x7F);
11831187
if (advance) {
11841188
this.offset += size;
11851189
return this;
@@ -1204,18 +1208,18 @@
12041208
var start = offset;
12051209
// ref: src/google/protobuf/io/coded_stream.cc
12061210

1207-
var src = new Uint8Array(this.array);
1211+
var src = new DataView(this.array);
12081212
var part0, part1 = 0, part2 = 0, b;
1209-
b = src[offset++]; part0 = (b & 0x7F) ; if (b & 0x80) {
1210-
b = src[offset++]; part0 |= (b & 0x7F) << 7; if (b & 0x80) {
1211-
b = src[offset++]; part0 |= (b & 0x7F) << 14; if (b & 0x80) {
1212-
b = src[offset++]; part0 |= (b & 0x7F) << 21; if (b & 0x80) {
1213-
b = src[offset++]; part1 = (b & 0x7F) ; if (b & 0x80) {
1214-
b = src[offset++]; part1 |= (b & 0x7F) << 7; if (b & 0x80) {
1215-
b = src[offset++]; part1 |= (b & 0x7F) << 14; if (b & 0x80) {
1216-
b = src[offset++]; part1 |= (b & 0x7F) << 21; if (b & 0x80) {
1217-
b = src[offset++]; part2 = (b & 0x7F) ; if (b & 0x80) {
1218-
b = src[offset++]; part2 |= (b & 0x7F) << 7; if (b & 0x80) {
1213+
b = src.getUint8(offset++); part0 = (b & 0x7F) ; if (b & 0x80) {
1214+
b = src.getUint8(offset++); part0 |= (b & 0x7F) << 7; if (b & 0x80) {
1215+
b = src.getUint8(offset++); part0 |= (b & 0x7F) << 14; if (b & 0x80) {
1216+
b = src.getUint8(offset++); part0 |= (b & 0x7F) << 21; if (b & 0x80) {
1217+
b = src.getUint8(offset++); part1 = (b & 0x7F) ; if (b & 0x80) {
1218+
b = src.getUint8(offset++); part1 |= (b & 0x7F) << 7; if (b & 0x80) {
1219+
b = src.getUint8(offset++); part1 |= (b & 0x7F) << 14; if (b & 0x80) {
1220+
b = src.getUint8(offset++); part1 |= (b & 0x7F) << 21; if (b & 0x80) {
1221+
b = src.getUint8(offset++); part2 = (b & 0x7F) ; if (b & 0x80) {
1222+
b = src.getUint8(offset++); part2 |= (b & 0x7F) << 7; if (b & 0x80) {
12191223
throw(new Error("Data must be corrupt: Buffer overrun")); }}}}}}}}}}
12201224
var value = Long.from28Bits(part0, part1, part2, false);
12211225
if (advance) {
@@ -1860,7 +1864,7 @@
18601864
asArray = !!asArray;
18611865
wrap = typeof wrap != 'undefined' ? parseInt(wrap, 10) : 16;
18621866
if (wrap < 1) wrap = 16;
1863-
var out = "", lines = [], view = new Uint8Array(this.array);
1867+
var out = "", lines = [], view = new DataView(this.array);
18641868
if (this.offset == 0 && this.length == 0) {
18651869
out += "|";
18661870
} else if (this.length == 0) {
@@ -1875,7 +1879,7 @@
18751879
lines.push(out);
18761880
out = " ";
18771881
}
1878-
var val = view[i];
1882+
var val = view.getUint8(i);
18791883
val = val.toString(16).toUpperCase();
18801884
if (val.length < 2) val = "0"+val;
18811885
out += val;
@@ -1908,13 +1912,13 @@
19081912
asArray = !!asArray;
19091913
wrap = typeof wrap != 'undefined' ? parseInt(wrap, 10) : 16;
19101914
if (wrap < 1) wrap = 16;
1911-
var out = "", lines = [], view = new Uint8Array(this.array);
1915+
var out = "", lines = [], view = new DataView(this.array);
19121916
for (var i=0; i<this.array.byteLength; i++) {
19131917
if (i>0 && i%wrap == 0) {
19141918
lines.push(out);
19151919
out = "";
19161920
}
1917-
var val = view[i];
1921+
var val = view.getUint8(i);
19181922
if (val > 32 && val < 127) {
19191923
val = String.fromCharCode(val);
19201924
} else {

0 commit comments

Comments
 (0)