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

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

Issue 460063002: Refactor JavaScript support for packed boolean arrays (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merged Created 6 years, 4 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
« no previous file with comments | « no previous file | mojo/public/tools/bindings/generators/mojom_js_generator.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
});
« no previous file with comments | « no previous file | mojo/public/tools/bindings/generators/mojom_js_generator.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698