Chromium Code Reviews| Index: mojo/public/js/bindings/codec.js |
| diff --git a/mojo/public/js/bindings/codec.js b/mojo/public/js/bindings/codec.js |
| index 9365dd2fba12105eba61b6ea65725e542bb66a4c..d5f325bef08556b66f6f3203627855c5607fee5d 100644 |
| --- a/mojo/public/js/bindings/codec.js |
| +++ b/mojo/public/js/bindings/codec.js |
| @@ -135,22 +135,17 @@ define("mojo/public/js/bindings/codec", [ |
| var numberOfBytes = this.readUint32(); |
| var numberOfElements = this.readUint32(); |
| var val = new Array(numberOfElements); |
| - for (var i = 0; i < numberOfElements; ++i) { |
| - val[i] = cls.decode(this); |
| - } |
| - return val; |
| - }; |
| - |
| - Decoder.prototype.decodeBoolArray = function() { |
| - var numberOfBytes = this.readUint32(); |
| - var numberOfElements = this.readUint32(); |
| - |
| - var val = new Array(numberOfElements); |
| - var byte; |
| - for (var i = 0; i < numberOfElements; ++i) { |
| + if (cls.cls === PackedBool) { |
| + var byte; |
| + for (var i = 0; i < numberOfElements; ++i) { |
| if (i % 8 === 0) |
| - byte = this.readUint8(); |
| + byte = this.readUint8(); |
| val[i] = (byte & (1 << i % 8)) ? true : false; |
| + } |
| + } else { |
| + for (var i = 0; i < numberOfElements; ++i) { |
| + val[i] = cls.decode(this); |
| + } |
| } |
| return val; |
| }; |
| @@ -175,14 +170,6 @@ define("mojo/public/js/bindings/codec", [ |
| return this.decodeAndCreateDecoder(pointer).decodeArray(cls); |
| }; |
| - Decoder.prototype.decodeBoolArrayPointer = function() { |
| - var pointer = this.decodePointer(); |
| - if (!pointer) { |
| - return null; |
| - } |
| - return this.decodeAndCreateDecoder(pointer).decodeBoolArray(); |
| - }; |
| - |
| Decoder.prototype.decodeStringPointer = function() { |
| var pointer = this.decodePointer(); |
| if (!pointer) { |
| @@ -296,14 +283,32 @@ define("mojo/public/js/bindings/codec", [ |
| this.next += numberOfElements; |
| }; |
| - Encoder.prototype.encodeArray = function(cls, val, numberOfElements) { |
| + Encoder.prototype.encodeArray = |
| + function(cls, val, numberOfElements, encodedSize) { |
| if (numberOfElements === undefined) |
| numberOfElements = val.length; |
| - var numberOfBytes = kArrayHeaderSize + cls.encodedSize * val.length; |
| - this.writeUint32(numberOfBytes); |
| + if (encodedSize === undefined) |
| + encodedSize = kArrayHeaderSize + cls.encodedSize * numberOfElements; |
| + |
| + this.writeUint32(encodedSize); |
| this.writeUint32(numberOfElements); |
| - for (var i = 0; i < val.length; ++i) { |
| - cls.encode(this, val[i]); |
| + |
| + if (cls.cls === PackedBool) { |
| + var byte = 0; |
| + var i = 0; |
| + for (; i < numberOfElements; ++i) { |
| + if (i > 0 && i % 8 === 0) { |
|
Matt Perry
2014/08/11 21:24:32
alternative: move this if to the end of the for st
hansmuller
2014/08/11 21:43:48
Excellent suggestion, that's much simpler.
|
| + Uint8.encode(this, byte); |
| + byte = 0; |
| + } |
| + if (val[i]) |
| + byte |= (1 << i % 8); |
| + } |
| + if (i > 0 && (i - 1) % 8 != 0) |
| + Uint8.encode(this, byte); |
| + } else { |
| + for (var i = 0; i < numberOfElements; ++i) |
| + cls.encode(this, val[i]); |
| } |
| }; |
| @@ -325,26 +330,11 @@ define("mojo/public/js/bindings/codec", [ |
| this.encodePointer(val); |
| return; |
| } |
| - var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length; |
| - var encoder = this.createAndEncodeEncoder(encodedSize); |
| - encoder.encodeArray(cls, val); |
| - }; |
| - |
| - Encoder.prototype.encodeBoolArrayPointer = function(val) { |
| - if (!val) { |
| - this.encodePointer(val); |
| - return; |
| - } |
| var numberOfElements = val.length; |
| - var encodedSize = kArrayHeaderSize + Math.ceil(numberOfElements / 8); |
| + var encodedSize = kArrayHeaderSize + ((cls.cls === PackedBool) ? |
| + Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements); |
| var encoder = this.createAndEncodeEncoder(encodedSize); |
| - |
| - var bits = new Uint8Array(Math.ceil(numberOfElements / 8)); |
| - for (var i = 0; i < numberOfElements; i++) { |
| - if (val[i]) |
| - bits[Math.floor(i / 8)] |= (1 << i % 8); |
| - } |
| - encoder.encodeArray(Uint8, bits, numberOfElements); |
| + encoder.encodeArray(cls, val, numberOfElements, encodedSize); |
| }; |
| Encoder.prototype.encodeStringPointer = function(val) { |
| @@ -475,6 +465,10 @@ define("mojo/public/js/bindings/codec", [ |
| // Built-in types ----------------------------------------------------------- |
| + // This type is only used with ArrayOf(PackedBool). |
| + function PackedBool() { |
| + } |
| + |
| function Int8() { |
| } |
| @@ -660,19 +654,6 @@ define("mojo/public/js/bindings/codec", [ |
| encoder.encodeArrayPointer(this.cls, val); |
| }; |
| - function ArrayOfBoolArrayPointers() { |
| - } |
| - |
| - ArrayOfBoolArrayPointers.prototype.encodedSize = 8; |
| - |
| - ArrayOfBoolArrayPointers.prototype.decode = function(decoder) { |
| - return decoder.decodeBoolArrayPointer(); |
| - }; |
| - |
| - ArrayOfBoolArrayPointers.prototype.encode = function(encoder, val) { |
| - encoder.encodeBoolArrayPointer(val); |
| - }; |
| - |
| function Handle() { |
| } |
| @@ -712,7 +693,7 @@ define("mojo/public/js/bindings/codec", [ |
| exports.String = String; |
| exports.PointerTo = PointerTo; |
| exports.ArrayOf = ArrayOf; |
| - exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers; |
| + exports.PackedBool = PackedBool; |
| exports.Handle = Handle; |
| return exports; |
| }); |