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

Side by Side 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: 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | mojo/public/tools/bindings/generators/mojom_js_generator.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "mojo/public/js/bindings/buffer" 7 "mojo/public/js/bindings/buffer"
8 ], function(unicode, buffer) { 8 ], function(unicode, buffer) {
9 9
10 var kErrorUnsigned = "Passing negative value to unsigned"; 10 var kErrorUnsigned = "Passing negative value to unsigned";
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 var base = this.next; 128 var base = this.next;
129 this.next += numberOfElements; 129 this.next += numberOfElements;
130 return unicode.decodeUtf8String( 130 return unicode.decodeUtf8String(
131 new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements)); 131 new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements));
132 }; 132 };
133 133
134 Decoder.prototype.decodeArray = function(cls) { 134 Decoder.prototype.decodeArray = function(cls) {
135 var numberOfBytes = this.readUint32(); 135 var numberOfBytes = this.readUint32();
136 var numberOfElements = this.readUint32(); 136 var numberOfElements = this.readUint32();
137 var val = new Array(numberOfElements); 137 var val = new Array(numberOfElements);
138 for (var i = 0; i < numberOfElements; ++i) { 138 if (cls.cls === PackedBool) {
139 val[i] = cls.decode(this); 139 var byte;
140 for (var i = 0; i < numberOfElements; ++i) {
141 if (i % 8 === 0)
142 byte = this.readUint8();
143 val[i] = (byte & (1 << i % 8)) ? true : false;
144 }
145 } else {
146 for (var i = 0; i < numberOfElements; ++i) {
147 val[i] = cls.decode(this);
148 }
140 } 149 }
141 return val; 150 return val;
142 }; 151 };
143
144 Decoder.prototype.decodeBoolArray = function() {
145 var numberOfBytes = this.readUint32();
146 var numberOfElements = this.readUint32();
147
148 var val = new Array(numberOfElements);
149 var byte;
150 for (var i = 0; i < numberOfElements; ++i) {
151 if (i % 8 === 0)
152 byte = this.readUint8();
153 val[i] = (byte & (1 << i % 8)) ? true : false;
154 }
155 return val;
156 };
157 152
158 Decoder.prototype.decodeStruct = function(cls) { 153 Decoder.prototype.decodeStruct = function(cls) {
159 return cls.decode(this); 154 return cls.decode(this);
160 }; 155 };
161 156
162 Decoder.prototype.decodeStructPointer = function(cls) { 157 Decoder.prototype.decodeStructPointer = function(cls) {
163 var pointer = this.decodePointer(); 158 var pointer = this.decodePointer();
164 if (!pointer) { 159 if (!pointer) {
165 return null; 160 return null;
166 } 161 }
167 return cls.decode(this.decodeAndCreateDecoder(pointer)); 162 return cls.decode(this.decodeAndCreateDecoder(pointer));
168 }; 163 };
169 164
170 Decoder.prototype.decodeArrayPointer = function(cls) { 165 Decoder.prototype.decodeArrayPointer = function(cls) {
171 var pointer = this.decodePointer(); 166 var pointer = this.decodePointer();
172 if (!pointer) { 167 if (!pointer) {
173 return null; 168 return null;
174 } 169 }
175 return this.decodeAndCreateDecoder(pointer).decodeArray(cls); 170 return this.decodeAndCreateDecoder(pointer).decodeArray(cls);
176 }; 171 };
177 172
178 Decoder.prototype.decodeBoolArrayPointer = function() {
179 var pointer = this.decodePointer();
180 if (!pointer) {
181 return null;
182 }
183 return this.decodeAndCreateDecoder(pointer).decodeBoolArray();
184 };
185
186 Decoder.prototype.decodeStringPointer = function() { 173 Decoder.prototype.decodeStringPointer = function() {
187 var pointer = this.decodePointer(); 174 var pointer = this.decodePointer();
188 if (!pointer) { 175 if (!pointer) {
189 return null; 176 return null;
190 } 177 }
191 return this.decodeAndCreateDecoder(pointer).decodeString(); 178 return this.decodeAndCreateDecoder(pointer).decodeString();
192 }; 179 };
193 180
194 // Encoder ------------------------------------------------------------------ 181 // Encoder ------------------------------------------------------------------
195 182
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 Encoder.prototype.encodeString = function(val) { 276 Encoder.prototype.encodeString = function(val) {
290 var base = this.next + kArrayHeaderSize; 277 var base = this.next + kArrayHeaderSize;
291 var numberOfElements = unicode.encodeUtf8String( 278 var numberOfElements = unicode.encodeUtf8String(
292 val, new Uint8Array(this.buffer.arrayBuffer, base)); 279 val, new Uint8Array(this.buffer.arrayBuffer, base));
293 var numberOfBytes = kArrayHeaderSize + numberOfElements; 280 var numberOfBytes = kArrayHeaderSize + numberOfElements;
294 this.writeUint32(numberOfBytes); 281 this.writeUint32(numberOfBytes);
295 this.writeUint32(numberOfElements); 282 this.writeUint32(numberOfElements);
296 this.next += numberOfElements; 283 this.next += numberOfElements;
297 }; 284 };
298 285
299 Encoder.prototype.encodeArray = function(cls, val, numberOfElements) { 286 Encoder.prototype.encodeArray =
287 function(cls, val, numberOfElements, encodedSize) {
300 if (numberOfElements === undefined) 288 if (numberOfElements === undefined)
301 numberOfElements = val.length; 289 numberOfElements = val.length;
302 var numberOfBytes = kArrayHeaderSize + cls.encodedSize * val.length; 290 if (encodedSize === undefined)
303 this.writeUint32(numberOfBytes); 291 encodedSize = kArrayHeaderSize + cls.encodedSize * numberOfElements;
292
293 this.writeUint32(encodedSize);
304 this.writeUint32(numberOfElements); 294 this.writeUint32(numberOfElements);
305 for (var i = 0; i < val.length; ++i) { 295
306 cls.encode(this, val[i]); 296 if (cls.cls === PackedBool) {
297 var byte = 0;
298 var i = 0;
299 for (; i < numberOfElements; ++i) {
300 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.
301 Uint8.encode(this, byte);
302 byte = 0;
303 }
304 if (val[i])
305 byte |= (1 << i % 8);
306 }
307 if (i > 0 && (i - 1) % 8 != 0)
308 Uint8.encode(this, byte);
309 } else {
310 for (var i = 0; i < numberOfElements; ++i)
311 cls.encode(this, val[i]);
307 } 312 }
308 }; 313 };
309 314
310 Encoder.prototype.encodeStruct = function(cls, val) { 315 Encoder.prototype.encodeStruct = function(cls, val) {
311 return cls.encode(this, val); 316 return cls.encode(this, val);
312 }; 317 };
313 318
314 Encoder.prototype.encodeStructPointer = function(cls, val) { 319 Encoder.prototype.encodeStructPointer = function(cls, val) {
315 if (!val) { 320 if (!val) {
316 this.encodePointer(val); 321 this.encodePointer(val);
317 return; 322 return;
318 } 323 }
319 var encoder = this.createAndEncodeEncoder(cls.encodedSize); 324 var encoder = this.createAndEncodeEncoder(cls.encodedSize);
320 cls.encode(encoder, val); 325 cls.encode(encoder, val);
321 }; 326 };
322 327
323 Encoder.prototype.encodeArrayPointer = function(cls, val) { 328 Encoder.prototype.encodeArrayPointer = function(cls, val) {
324 if (!val) { 329 if (!val) {
325 this.encodePointer(val); 330 this.encodePointer(val);
326 return; 331 return;
327 } 332 }
328 var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length;
329 var encoder = this.createAndEncodeEncoder(encodedSize);
330 encoder.encodeArray(cls, val);
331 };
332
333 Encoder.prototype.encodeBoolArrayPointer = function(val) {
334 if (!val) {
335 this.encodePointer(val);
336 return;
337 }
338 var numberOfElements = val.length; 333 var numberOfElements = val.length;
339 var encodedSize = kArrayHeaderSize + Math.ceil(numberOfElements / 8); 334 var encodedSize = kArrayHeaderSize + ((cls.cls === PackedBool) ?
335 Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements);
340 var encoder = this.createAndEncodeEncoder(encodedSize); 336 var encoder = this.createAndEncodeEncoder(encodedSize);
341 337 encoder.encodeArray(cls, val, numberOfElements, encodedSize);
342 var bits = new Uint8Array(Math.ceil(numberOfElements / 8));
343 for (var i = 0; i < numberOfElements; i++) {
344 if (val[i])
345 bits[Math.floor(i / 8)] |= (1 << i % 8);
346 }
347 encoder.encodeArray(Uint8, bits, numberOfElements);
348 }; 338 };
349 339
350 Encoder.prototype.encodeStringPointer = function(val) { 340 Encoder.prototype.encodeStringPointer = function(val) {
351 if (!val) { 341 if (!val) {
352 this.encodePointer(val); 342 this.encodePointer(val);
353 return; 343 return;
354 } 344 }
355 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); 345 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
356 var encoder = this.createAndEncodeEncoder(encodedSize); 346 var encoder = this.createAndEncodeEncoder(encodedSize);
357 encoder.encodeString(val); 347 encoder.encodeString(val);
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 this.requestID = this.decoder.readUint64(); 458 this.requestID = this.decoder.readUint64();
469 this.decoder.skip(messageHeaderSize - this.decoder.next); 459 this.decoder.skip(messageHeaderSize - this.decoder.next);
470 } 460 }
471 461
472 MessageReader.prototype.decodeStruct = function(cls) { 462 MessageReader.prototype.decodeStruct = function(cls) {
473 return cls.decode(this.decoder); 463 return cls.decode(this.decoder);
474 }; 464 };
475 465
476 // Built-in types ----------------------------------------------------------- 466 // Built-in types -----------------------------------------------------------
477 467
468 // This type is only used with ArrayOf(PackedBool).
469 function PackedBool() {
470 }
471
478 function Int8() { 472 function Int8() {
479 } 473 }
480 474
481 Int8.encodedSize = 1; 475 Int8.encodedSize = 1;
482 476
483 Int8.decode = function(decoder) { 477 Int8.decode = function(decoder) {
484 return decoder.readInt8(); 478 return decoder.readInt8();
485 }; 479 };
486 480
487 Int8.encode = function(encoder, val) { 481 Int8.encode = function(encoder, val) {
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 ArrayOf.prototype.encodedSize = 8; 647 ArrayOf.prototype.encodedSize = 8;
654 648
655 ArrayOf.prototype.decode = function(decoder) { 649 ArrayOf.prototype.decode = function(decoder) {
656 return decoder.decodeArrayPointer(this.cls); 650 return decoder.decodeArrayPointer(this.cls);
657 }; 651 };
658 652
659 ArrayOf.prototype.encode = function(encoder, val) { 653 ArrayOf.prototype.encode = function(encoder, val) {
660 encoder.encodeArrayPointer(this.cls, val); 654 encoder.encodeArrayPointer(this.cls, val);
661 }; 655 };
662 656
663 function ArrayOfBoolArrayPointers() {
664 }
665
666 ArrayOfBoolArrayPointers.prototype.encodedSize = 8;
667
668 ArrayOfBoolArrayPointers.prototype.decode = function(decoder) {
669 return decoder.decodeBoolArrayPointer();
670 };
671
672 ArrayOfBoolArrayPointers.prototype.encode = function(encoder, val) {
673 encoder.encodeBoolArrayPointer(val);
674 };
675
676 function Handle() { 657 function Handle() {
677 } 658 }
678 659
679 Handle.encodedSize = 4; 660 Handle.encodedSize = 4;
680 661
681 Handle.decode = function(decoder) { 662 Handle.decode = function(decoder) {
682 return decoder.decodeHandle(); 663 return decoder.decodeHandle();
683 }; 664 };
684 665
685 Handle.encode = function(encoder, val) { 666 Handle.encode = function(encoder, val) {
(...skipping 19 matching lines...) Expand all
705 exports.Uint16 = Uint16; 686 exports.Uint16 = Uint16;
706 exports.Int32 = Int32; 687 exports.Int32 = Int32;
707 exports.Uint32 = Uint32; 688 exports.Uint32 = Uint32;
708 exports.Int64 = Int64; 689 exports.Int64 = Int64;
709 exports.Uint64 = Uint64; 690 exports.Uint64 = Uint64;
710 exports.Float = Float; 691 exports.Float = Float;
711 exports.Double = Double; 692 exports.Double = Double;
712 exports.String = String; 693 exports.String = String;
713 exports.PointerTo = PointerTo; 694 exports.PointerTo = PointerTo;
714 exports.ArrayOf = ArrayOf; 695 exports.ArrayOf = ArrayOf;
715 exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers; 696 exports.PackedBool = PackedBool;
716 exports.Handle = Handle; 697 exports.Handle = Handle;
717 return exports; 698 return exports;
718 }); 699 });
OLDNEW
« 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