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