Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(489)

Unified Diff: mojo/public/js/bindings/codec.js

Issue 377713004: Support packed arrays of booleans in Mojo messages (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Simplified Decoder.prototype.decodeBoolArray() Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/js/bindings/codec.js
diff --git a/mojo/public/js/bindings/codec.js b/mojo/public/js/bindings/codec.js
index 84c86c1299125a654fdf3a9dec84b6295bcf6bbc..9756f4a5d6b59ca478cc6187808c7a256556c308 100644
--- a/mojo/public/js/bindings/codec.js
+++ b/mojo/public/js/bindings/codec.js
@@ -229,6 +229,20 @@ define("mojo/public/js/bindings/codec", [
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 (i % 8 == 0)
+ byte = this.readUint8();
+ val[i] = (byte & (1 << i % 8)) ? true : false;
+ }
+ return val;
+ };
+
Decoder.prototype.decodeStruct = function(cls) {
return cls.decode(this);
};
@@ -249,6 +263,14 @@ 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) {
@@ -364,12 +386,13 @@ define("mojo/public/js/bindings/codec", [
this.next += numberOfElements;
};
- Encoder.prototype.encodeArray = function(cls, val) {
- var numberOfElements = val.length;
- var numberOfBytes = kArrayHeaderSize + cls.encodedSize * numberOfElements;
+ Encoder.prototype.encodeArray = function(cls, val, numberOfElements) {
+ if (numberOfElements === undefined)
+ numberOfElements = val.length;
+ var numberOfBytes = kArrayHeaderSize + cls.encodedSize * val.length;
this.writeUint32(numberOfBytes);
this.writeUint32(numberOfElements);
- for (var i = 0; i < numberOfElements; ++i) {
+ for (var i = 0; i < val.length; ++i) {
cls.encode(this, val[i]);
}
};
@@ -397,6 +420,23 @@ define("mojo/public/js/bindings/codec", [
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 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.prototype.encodeStringPointer = function(val) {
if (!val) {
this.encodePointer(val);
@@ -696,6 +736,19 @@ 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() {
}
@@ -734,6 +787,7 @@ define("mojo/public/js/bindings/codec", [
exports.String = String;
exports.PointerTo = PointerTo;
exports.ArrayOf = ArrayOf;
+ exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers;
exports.Handle = Handle;
return exports;
});

Powered by Google App Engine
This is Rietveld 408576698