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..02a701ce2e265357fc27f10e3326e703970e1061 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,29 @@ 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; |
+ for (i = 0; i < numberOfElements; ++i) { |
+ if (val[i]) |
+ byte |= (1 << i % 8); |
+ if (i % 8 === 7 || i == numberOfElements - 1) { |
+ Uint8.encode(this, byte); |
+ byte = 0; |
+ } |
+ } |
+ } else { |
+ for (var i = 0; i < numberOfElements; ++i) |
+ cls.encode(this, val[i]); |
} |
}; |
@@ -325,26 +327,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 +462,10 @@ define("mojo/public/js/bindings/codec", [ |
// Built-in types ----------------------------------------------------------- |
+ // This type is only used with ArrayOf(PackedBool). |
+ function PackedBool() { |
+ } |
+ |
function Int8() { |
} |
@@ -660,19 +651,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 +690,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; |
}); |