Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 }); |
| OLD | NEW |