| 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/codec", [ | 5 define("mojo/public/js/codec", [ |
| 6 "mojo/public/js/unicode", | 6 "mojo/public/js/unicode", |
| 7 "mojo/public/js/buffer", | 7 "mojo/public/js/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"; |
| 11 var kErrorArray = "Passing non Array for array type"; |
| 12 var kErrorString = "Passing non String for string type"; |
| 13 var kErrorMap = "Passing non Map for map type"; |
| 11 | 14 |
| 12 // Memory ------------------------------------------------------------------- | 15 // Memory ------------------------------------------------------------------- |
| 13 | 16 |
| 14 var kAlignment = 8; | 17 var kAlignment = 8; |
| 15 | 18 |
| 16 function align(size) { | 19 function align(size) { |
| 17 return size + (kAlignment - (size % kAlignment)) % kAlignment; | 20 return size + (kAlignment - (size % kAlignment)) % kAlignment; |
| 18 } | 21 } |
| 19 | 22 |
| 20 function isAligned(offset) { | 23 function isAligned(offset) { |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 var encoder = this.createAndEncodeEncoder(cls.encodedSize); | 348 var encoder = this.createAndEncodeEncoder(cls.encodedSize); |
| 346 cls.encode(encoder, val); | 349 cls.encode(encoder, val); |
| 347 }; | 350 }; |
| 348 | 351 |
| 349 Encoder.prototype.encodeArrayPointer = function(cls, val) { | 352 Encoder.prototype.encodeArrayPointer = function(cls, val) { |
| 350 if (val == null) { | 353 if (val == null) { |
| 351 // Also handles undefined, since undefined == null. | 354 // Also handles undefined, since undefined == null. |
| 352 this.encodePointer(val); | 355 this.encodePointer(val); |
| 353 return; | 356 return; |
| 354 } | 357 } |
| 358 if (!(val instanceof Array)) { |
| 359 throw new Error(kErrorArray); |
| 360 } |
| 355 var numberOfElements = val.length; | 361 var numberOfElements = val.length; |
| 356 var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ? | 362 var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ? |
| 357 Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements); | 363 Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements); |
| 358 var encoder = this.createAndEncodeEncoder(encodedSize); | 364 var encoder = this.createAndEncodeEncoder(encodedSize); |
| 359 encoder.encodeArray(cls, val, numberOfElements, encodedSize); | 365 encoder.encodeArray(cls, val, numberOfElements, encodedSize); |
| 360 }; | 366 }; |
| 361 | 367 |
| 362 Encoder.prototype.encodeStringPointer = function(val) { | 368 Encoder.prototype.encodeStringPointer = function(val) { |
| 363 if (val == null) { | 369 if (val == null) { |
| 364 // Also handles undefined, since undefined == null. | 370 // Also handles undefined, since undefined == null. |
| 365 this.encodePointer(val); | 371 this.encodePointer(val); |
| 366 return; | 372 return; |
| 367 } | 373 } |
| 374 // Only accepts string primivites, not String Objects like new String("foo") |
| 375 if (typeof(val) !== "string") { |
| 376 throw new Error(kErrorString); |
| 377 } |
| 368 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); | 378 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); |
| 369 var encoder = this.createAndEncodeEncoder(encodedSize); | 379 var encoder = this.createAndEncodeEncoder(encodedSize); |
| 370 encoder.encodeString(val); | 380 encoder.encodeString(val); |
| 371 }; | 381 }; |
| 372 | 382 |
| 373 Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { | 383 Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { |
| 374 var keys = new Array(val.size); | 384 var keys = new Array(val.size); |
| 375 var values = new Array(val.size); | 385 var values = new Array(val.size); |
| 376 var i = 0; | 386 var i = 0; |
| 377 val.forEach(function(value, key) { | 387 val.forEach(function(value, key) { |
| 378 values[i] = value; | 388 values[i] = value; |
| 379 keys[i++] = key; | 389 keys[i++] = key; |
| 380 }); | 390 }); |
| 381 this.writeUint32(kStructHeaderSize + kMapStructPayloadSize); | 391 this.writeUint32(kStructHeaderSize + kMapStructPayloadSize); |
| 382 this.writeUint32(2); // two fields: keys, values | 392 this.writeUint32(2); // two fields: keys, values |
| 383 this.encodeArrayPointer(keyClass, keys); | 393 this.encodeArrayPointer(keyClass, keys); |
| 384 this.encodeArrayPointer(valueClass, values); | 394 this.encodeArrayPointer(valueClass, values); |
| 385 } | 395 } |
| 386 | 396 |
| 387 Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) { | 397 Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) { |
| 388 if (val == null) { | 398 if (val == null) { |
| 389 // Also handles undefined, since undefined == null. | 399 // Also handles undefined, since undefined == null. |
| 390 this.encodePointer(val); | 400 this.encodePointer(val); |
| 391 return; | 401 return; |
| 392 } | 402 } |
| 403 if (!(val instanceof Map)) { |
| 404 throw new Error(kErrorMap); |
| 405 } |
| 393 var encodedSize = kStructHeaderSize + kMapStructPayloadSize; | 406 var encodedSize = kStructHeaderSize + kMapStructPayloadSize; |
| 394 var encoder = this.createAndEncodeEncoder(encodedSize); | 407 var encoder = this.createAndEncodeEncoder(encodedSize); |
| 395 encoder.encodeMap(keyClass, valueClass, val); | 408 encoder.encodeMap(keyClass, valueClass, val); |
| 396 }; | 409 }; |
| 397 | 410 |
| 398 // Message ------------------------------------------------------------------ | 411 // Message ------------------------------------------------------------------ |
| 399 | 412 |
| 400 var kMessageNameOffset = kStructHeaderSize; | 413 var kMessageNameOffset = kStructHeaderSize; |
| 401 var kMessageFlagsOffset = kMessageNameOffset + 4; | 414 var kMessageFlagsOffset = kMessageNameOffset + 4; |
| 402 var kMessageRequestIDOffset = kMessageFlagsOffset + 4; | 415 var kMessageRequestIDOffset = kMessageFlagsOffset + 4; |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 806 exports.NullablePointerTo = NullablePointerTo; | 819 exports.NullablePointerTo = NullablePointerTo; |
| 807 exports.ArrayOf = ArrayOf; | 820 exports.ArrayOf = ArrayOf; |
| 808 exports.NullableArrayOf = NullableArrayOf; | 821 exports.NullableArrayOf = NullableArrayOf; |
| 809 exports.PackedBool = PackedBool; | 822 exports.PackedBool = PackedBool; |
| 810 exports.Handle = Handle; | 823 exports.Handle = Handle; |
| 811 exports.NullableHandle = NullableHandle; | 824 exports.NullableHandle = NullableHandle; |
| 812 exports.MapOf = MapOf; | 825 exports.MapOf = MapOf; |
| 813 exports.NullableMapOf = NullableMapOf; | 826 exports.NullableMapOf = NullableMapOf; |
| 814 return exports; | 827 return exports; |
| 815 }); | 828 }); |
| OLD | NEW |