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

Side by Side 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: 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 define("mojo/public/js/bindings/codec", [ 5 define("mojo/public/js/bindings/codec", [
6 "mojo/public/js/bindings/unicode" 6 "mojo/public/js/bindings/unicode"
7 ], function(unicode) { 7 ], function(unicode) {
8 8
9 var kErrorUnsigned = "Passing negative value to unsigned"; 9 var kErrorUnsigned = "Passing negative value to unsigned";
10 10
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 Decoder.prototype.decodeArray = function(cls) { 222 Decoder.prototype.decodeArray = function(cls) {
223 var numberOfBytes = this.readUint32(); 223 var numberOfBytes = this.readUint32();
224 var numberOfElements = this.readUint32(); 224 var numberOfElements = this.readUint32();
225 var val = new Array(numberOfElements); 225 var val = new Array(numberOfElements);
226 for (var i = 0; i < numberOfElements; ++i) { 226 for (var i = 0; i < numberOfElements; ++i) {
227 val[i] = cls.decode(this); 227 val[i] = cls.decode(this);
228 } 228 }
229 return val; 229 return val;
230 }; 230 };
231 231
232 Decoder.prototype.decodeBoolArray = function() {
233 var numberOfBytes = this.readUint32();
234 var numberOfElements = this.readUint32();
235
236 var bitsLength = Math.ceil(numberOfElements / 8);
237 var bits = new Uint8Array(bitsLength);
238 for (var i = 0; i < bitsLength; ++i) {
239 bits[i] = Uint8.decode(this);
240 }
241
242 var val = new Array(numberOfElements);
243 for (var i = 0; i < numberOfElements; ++i) {
244 val[i] = (bits[Math.floor(i / 8)] & (1 << i % 8)) ? true : false;
245 }
246 return val;
247 };
248
232 Decoder.prototype.decodeStruct = function(cls) { 249 Decoder.prototype.decodeStruct = function(cls) {
233 return cls.decode(this); 250 return cls.decode(this);
234 }; 251 };
235 252
236 Decoder.prototype.decodeStructPointer = function(cls) { 253 Decoder.prototype.decodeStructPointer = function(cls) {
237 var pointer = this.decodePointer(); 254 var pointer = this.decodePointer();
238 if (!pointer) { 255 if (!pointer) {
239 return null; 256 return null;
240 } 257 }
241 return cls.decode(this.decodeAndCreateDecoder(pointer)); 258 return cls.decode(this.decodeAndCreateDecoder(pointer));
242 }; 259 };
243 260
244 Decoder.prototype.decodeArrayPointer = function(cls) { 261 Decoder.prototype.decodeArrayPointer = function(cls) {
245 var pointer = this.decodePointer(); 262 var pointer = this.decodePointer();
246 if (!pointer) { 263 if (!pointer) {
247 return null; 264 return null;
248 } 265 }
249 return this.decodeAndCreateDecoder(pointer).decodeArray(cls); 266 return this.decodeAndCreateDecoder(pointer).decodeArray(cls);
250 }; 267 };
251 268
269 Decoder.prototype.decodeBoolArrayPointer = function() {
270 var pointer = this.decodePointer();
271 if (!pointer) {
272 return null;
273 }
274 return this.decodeAndCreateDecoder(pointer).decodeBoolArray();
275 };
276
252 Decoder.prototype.decodeStringPointer = function() { 277 Decoder.prototype.decodeStringPointer = function() {
253 var pointer = this.decodePointer(); 278 var pointer = this.decodePointer();
254 if (!pointer) { 279 if (!pointer) {
255 return null; 280 return null;
256 } 281 }
257 return this.decodeAndCreateDecoder(pointer).decodeString(); 282 return this.decodeAndCreateDecoder(pointer).decodeString();
258 }; 283 };
259 284
260 // Encoder ------------------------------------------------------------------ 285 // Encoder ------------------------------------------------------------------
261 286
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 Encoder.prototype.encodeString = function(val) { 382 Encoder.prototype.encodeString = function(val) {
358 var base = this.next + kArrayHeaderSize; 383 var base = this.next + kArrayHeaderSize;
359 var numberOfElements = unicode.encodeUtf8String( 384 var numberOfElements = unicode.encodeUtf8String(
360 val, new Uint8Array(this.buffer.arrayBuffer, base)); 385 val, new Uint8Array(this.buffer.arrayBuffer, base));
361 var numberOfBytes = kArrayHeaderSize + numberOfElements; 386 var numberOfBytes = kArrayHeaderSize + numberOfElements;
362 this.writeUint32(numberOfBytes); 387 this.writeUint32(numberOfBytes);
363 this.writeUint32(numberOfElements); 388 this.writeUint32(numberOfElements);
364 this.next += numberOfElements; 389 this.next += numberOfElements;
365 }; 390 };
366 391
367 Encoder.prototype.encodeArray = function(cls, val) { 392 Encoder.prototype.encodeArray = function(cls, val, numberOfElements) {
368 var numberOfElements = val.length; 393 if (numberOfElements === undefined)
369 var numberOfBytes = kArrayHeaderSize + cls.encodedSize * numberOfElements; 394 numberOfElements = val.length;
395 var valLength = val.length;
Matt Perry 2014/07/07 22:45:45 nit: why not just use val.length everywhere?
396 var numberOfBytes = kArrayHeaderSize + cls.encodedSize * valLength;
370 this.writeUint32(numberOfBytes); 397 this.writeUint32(numberOfBytes);
371 this.writeUint32(numberOfElements); 398 this.writeUint32(numberOfElements);
372 for (var i = 0; i < numberOfElements; ++i) { 399 for (var i = 0; i < valLength; ++i) {
373 cls.encode(this, val[i]); 400 cls.encode(this, val[i]);
374 } 401 }
375 }; 402 };
376 403
377 Encoder.prototype.encodeStruct = function(cls, val) { 404 Encoder.prototype.encodeStruct = function(cls, val) {
378 return cls.encode(this, val); 405 return cls.encode(this, val);
379 }; 406 };
380 407
381 Encoder.prototype.encodeStructPointer = function(cls, val) { 408 Encoder.prototype.encodeStructPointer = function(cls, val) {
382 if (!val) { 409 if (!val) {
383 this.encodePointer(val); 410 this.encodePointer(val);
384 return; 411 return;
385 } 412 }
386 var encoder = this.createAndEncodeEncoder(cls.encodedSize); 413 var encoder = this.createAndEncodeEncoder(cls.encodedSize);
387 cls.encode(encoder, val); 414 cls.encode(encoder, val);
388 }; 415 };
389 416
390 Encoder.prototype.encodeArrayPointer = function(cls, val) { 417 Encoder.prototype.encodeArrayPointer = function(cls, val) {
391 if (!val) { 418 if (!val) {
392 this.encodePointer(val); 419 this.encodePointer(val);
393 return; 420 return;
394 } 421 }
395 var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length; 422 var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length;
396 var encoder = this.createAndEncodeEncoder(encodedSize); 423 var encoder = this.createAndEncodeEncoder(encodedSize);
397 encoder.encodeArray(cls, val); 424 encoder.encodeArray(cls, val);
398 }; 425 };
399 426
427 Encoder.prototype.encodeBoolArrayPointer = function(val) {
428 if (!val) {
429 this.encodePointer(val);
430 return;
431 }
432 var numberOfElements = val.length;
433 var encodedSize = kArrayHeaderSize + Math.ceil(numberOfElements / 8);
Matt Perry 2014/07/07 22:45:45 do you also need to add cls.encodedSize? That rese
434 var encoder = this.createAndEncodeEncoder(encodedSize);
435
436 var bits = new Uint8Array(Math.ceil(numberOfElements / 8));
437 for (var i = 0; i < numberOfElements; i++) {
438 if (val[i])
439 bits[Math.floor(i / 8)] |= (1 << i % 8);
440 }
441 encoder.encodeArray(Uint8, bits, numberOfElements);
442 };
443
400 Encoder.prototype.encodeStringPointer = function(val) { 444 Encoder.prototype.encodeStringPointer = function(val) {
401 if (!val) { 445 if (!val) {
402 this.encodePointer(val); 446 this.encodePointer(val);
403 return; 447 return;
404 } 448 }
405 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); 449 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
406 var encoder = this.createAndEncodeEncoder(encodedSize); 450 var encoder = this.createAndEncodeEncoder(encodedSize);
407 encoder.encodeString(val); 451 encoder.encodeString(val);
408 }; 452 };
409 453
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 ArrayOf.prototype.encodedSize = 8; 733 ArrayOf.prototype.encodedSize = 8;
690 734
691 ArrayOf.prototype.decode = function(decoder) { 735 ArrayOf.prototype.decode = function(decoder) {
692 return decoder.decodeArrayPointer(this.cls); 736 return decoder.decodeArrayPointer(this.cls);
693 }; 737 };
694 738
695 ArrayOf.prototype.encode = function(encoder, val) { 739 ArrayOf.prototype.encode = function(encoder, val) {
696 encoder.encodeArrayPointer(this.cls, val); 740 encoder.encodeArrayPointer(this.cls, val);
697 }; 741 };
698 742
743 function ArrayOfBool() {
744 }
745
746 ArrayOfBool.prototype.encodedSize = 8;
747
748 ArrayOfBool.prototype.decode = function(decoder) {
749 return decoder.decodeBoolArrayPointer();
750 };
751
752 ArrayOfBool.prototype.encode = function(encoder, val) {
753 encoder.encodeBoolArrayPointer(val);
754 };
755
699 function Handle() { 756 function Handle() {
700 } 757 }
701 758
702 Handle.encodedSize = 4; 759 Handle.encodedSize = 4;
703 760
704 Handle.decode = function(decoder) { 761 Handle.decode = function(decoder) {
705 return decoder.decodeHandle(); 762 return decoder.decodeHandle();
706 }; 763 };
707 764
708 Handle.encode = function(encoder, val) { 765 Handle.encode = function(encoder, val) {
(...skipping 18 matching lines...) Expand all
727 exports.Uint16 = Uint16; 784 exports.Uint16 = Uint16;
728 exports.Int32 = Int32; 785 exports.Int32 = Int32;
729 exports.Uint32 = Uint32; 786 exports.Uint32 = Uint32;
730 exports.Int64 = Int64; 787 exports.Int64 = Int64;
731 exports.Uint64 = Uint64; 788 exports.Uint64 = Uint64;
732 exports.Float = Float; 789 exports.Float = Float;
733 exports.Double = Double; 790 exports.Double = Double;
734 exports.String = String; 791 exports.String = String;
735 exports.PointerTo = PointerTo; 792 exports.PointerTo = PointerTo;
736 exports.ArrayOf = ArrayOf; 793 exports.ArrayOf = ArrayOf;
794 exports.ArrayOfBool = ArrayOfBool;
737 exports.Handle = Handle; 795 exports.Handle = Handle;
738 return exports; 796 return exports;
739 }); 797 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698