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 } |
Ryan Sleevi
2014/12/30 04:54:17
The original code had the benefit that it properly
| |
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 string literals, not objects like new String("foo"). | |
375 if (typeof(val) !== "string") { | |
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)) { | |
Ryan Sleevi
2014/12/30 04:54:17
This is another surprising change, as it prevents
| |
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 |