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

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: 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 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 for (i = 0; i < numberOfElements; ++i) {
299 if (val[i])
300 byte |= (1 << i % 8);
301 if (i % 8 === 7 || i == numberOfElements - 1) {
302 Uint8.encode(this, byte);
303 byte = 0;
304 }
305 }
306 } else {
307 for (var i = 0; i < numberOfElements; ++i)
308 cls.encode(this, val[i]);
307 } 309 }
308 }; 310 };
309 311
310 Encoder.prototype.encodeStruct = function(cls, val) { 312 Encoder.prototype.encodeStruct = function(cls, val) {
311 return cls.encode(this, val); 313 return cls.encode(this, val);
312 }; 314 };
313 315
314 Encoder.prototype.encodeStructPointer = function(cls, val) { 316 Encoder.prototype.encodeStructPointer = function(cls, val) {
315 if (!val) { 317 if (!val) {
316 this.encodePointer(val); 318 this.encodePointer(val);
317 return; 319 return;
318 } 320 }
319 var encoder = this.createAndEncodeEncoder(cls.encodedSize); 321 var encoder = this.createAndEncodeEncoder(cls.encodedSize);
320 cls.encode(encoder, val); 322 cls.encode(encoder, val);
321 }; 323 };
322 324
323 Encoder.prototype.encodeArrayPointer = function(cls, val) { 325 Encoder.prototype.encodeArrayPointer = function(cls, val) {
324 if (!val) { 326 if (!val) {
325 this.encodePointer(val); 327 this.encodePointer(val);
326 return; 328 return;
327 } 329 }
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; 330 var numberOfElements = val.length;
339 var encodedSize = kArrayHeaderSize + Math.ceil(numberOfElements / 8); 331 var encodedSize = kArrayHeaderSize + ((cls.cls === PackedBool) ?
332 Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements);
340 var encoder = this.createAndEncodeEncoder(encodedSize); 333 var encoder = this.createAndEncodeEncoder(encodedSize);
341 334 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 }; 335 };
349 336
350 Encoder.prototype.encodeStringPointer = function(val) { 337 Encoder.prototype.encodeStringPointer = function(val) {
351 if (!val) { 338 if (!val) {
352 this.encodePointer(val); 339 this.encodePointer(val);
353 return; 340 return;
354 } 341 }
355 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); 342 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
356 var encoder = this.createAndEncodeEncoder(encodedSize); 343 var encoder = this.createAndEncodeEncoder(encodedSize);
357 encoder.encodeString(val); 344 encoder.encodeString(val);
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 this.requestID = this.decoder.readUint64(); 455 this.requestID = this.decoder.readUint64();
469 this.decoder.skip(messageHeaderSize - this.decoder.next); 456 this.decoder.skip(messageHeaderSize - this.decoder.next);
470 } 457 }
471 458
472 MessageReader.prototype.decodeStruct = function(cls) { 459 MessageReader.prototype.decodeStruct = function(cls) {
473 return cls.decode(this.decoder); 460 return cls.decode(this.decoder);
474 }; 461 };
475 462
476 // Built-in types ----------------------------------------------------------- 463 // Built-in types -----------------------------------------------------------
477 464
465 // This type is only used with ArrayOf(PackedBool).
466 function PackedBool() {
467 }
468
478 function Int8() { 469 function Int8() {
479 } 470 }
480 471
481 Int8.encodedSize = 1; 472 Int8.encodedSize = 1;
482 473
483 Int8.decode = function(decoder) { 474 Int8.decode = function(decoder) {
484 return decoder.readInt8(); 475 return decoder.readInt8();
485 }; 476 };
486 477
487 Int8.encode = function(encoder, val) { 478 Int8.encode = function(encoder, val) {
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 ArrayOf.prototype.encodedSize = 8; 644 ArrayOf.prototype.encodedSize = 8;
654 645
655 ArrayOf.prototype.decode = function(decoder) { 646 ArrayOf.prototype.decode = function(decoder) {
656 return decoder.decodeArrayPointer(this.cls); 647 return decoder.decodeArrayPointer(this.cls);
657 }; 648 };
658 649
659 ArrayOf.prototype.encode = function(encoder, val) { 650 ArrayOf.prototype.encode = function(encoder, val) {
660 encoder.encodeArrayPointer(this.cls, val); 651 encoder.encodeArrayPointer(this.cls, val);
661 }; 652 };
662 653
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() { 654 function Handle() {
677 } 655 }
678 656
679 Handle.encodedSize = 4; 657 Handle.encodedSize = 4;
680 658
681 Handle.decode = function(decoder) { 659 Handle.decode = function(decoder) {
682 return decoder.decodeHandle(); 660 return decoder.decodeHandle();
683 }; 661 };
684 662
685 Handle.encode = function(encoder, val) { 663 Handle.encode = function(encoder, val) {
(...skipping 19 matching lines...) Expand all
705 exports.Uint16 = Uint16; 683 exports.Uint16 = Uint16;
706 exports.Int32 = Int32; 684 exports.Int32 = Int32;
707 exports.Uint32 = Uint32; 685 exports.Uint32 = Uint32;
708 exports.Int64 = Int64; 686 exports.Int64 = Int64;
709 exports.Uint64 = Uint64; 687 exports.Uint64 = Uint64;
710 exports.Float = Float; 688 exports.Float = Float;
711 exports.Double = Double; 689 exports.Double = Double;
712 exports.String = String; 690 exports.String = String;
713 exports.PointerTo = PointerTo; 691 exports.PointerTo = PointerTo;
714 exports.ArrayOf = ArrayOf; 692 exports.ArrayOf = ArrayOf;
715 exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers; 693 exports.PackedBool = PackedBool;
716 exports.Handle = Handle; 694 exports.Handle = Handle;
717 return exports; 695 return exports;
718 }); 696 });
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