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"; |
| 11 | 11 |
| 12 // Memory ------------------------------------------------------------------- | 12 // Memory ------------------------------------------------------------------- |
| 13 | 13 |
| 14 var kAlignment = 8; | 14 var kAlignment = 8; |
| 15 | 15 |
| 16 function align(size) { | 16 function align(size) { |
| 17 return size + (kAlignment - (size % kAlignment)) % kAlignment; | 17 return size + (kAlignment - (size % kAlignment)) % kAlignment; |
| 18 } | 18 } |
| 19 | 19 |
| 20 function isAligned(offset) { | 20 function isAligned(offset) { |
| 21 return offset >= 0 && (offset % kAlignment) === 0; | 21 return offset >= 0 && (offset % kAlignment) === 0; |
| 22 } | 22 } |
| 23 | 23 |
| 24 // Constants ---------------------------------------------------------------- | 24 // Constants ---------------------------------------------------------------- |
| 25 | 25 |
| 26 var kArrayHeaderSize = 8; | 26 var kArrayHeaderSize = 8; |
| 27 var kStructHeaderSize = 8; | 27 var kStructHeaderSize = 8; |
| 28 var kMessageHeaderSize = 16; | 28 var kMessageHeaderSize = 16; |
| 29 var kMessageWithRequestIDHeaderSize = 24; | 29 var kMessageWithRequestIDHeaderSize = 24; |
| 30 var kMapStructSize = 16; | |
|
yzshen1
2014/10/15 05:58:02
It doesn't include the struct header itself, right
hansmuller
2014/10/15 21:45:46
Done.
| |
| 30 | 31 |
| 31 var kStructHeaderNumBytesOffset = 0; | 32 var kStructHeaderNumBytesOffset = 0; |
| 32 var kStructHeaderNumFieldsOffset = 4; | 33 var kStructHeaderNumFieldsOffset = 4; |
| 33 | 34 |
| 34 var kEncodedInvalidHandleValue = 0xFFFFFFFF; | 35 var kEncodedInvalidHandleValue = 0xFFFFFFFF; |
| 35 | 36 |
| 36 // Decoder ------------------------------------------------------------------ | 37 // Decoder ------------------------------------------------------------------ |
| 37 | 38 |
| 38 function Decoder(buffer, handles, base) { | 39 function Decoder(buffer, handles, base) { |
| 39 this.buffer = buffer; | 40 this.buffer = buffer; |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 173 }; | 174 }; |
| 174 | 175 |
| 175 Decoder.prototype.decodeStringPointer = function() { | 176 Decoder.prototype.decodeStringPointer = function() { |
| 176 var pointer = this.decodePointer(); | 177 var pointer = this.decodePointer(); |
| 177 if (!pointer) { | 178 if (!pointer) { |
| 178 return null; | 179 return null; |
| 179 } | 180 } |
| 180 return this.decodeAndCreateDecoder(pointer).decodeString(); | 181 return this.decodeAndCreateDecoder(pointer).decodeString(); |
| 181 }; | 182 }; |
| 182 | 183 |
| 184 Decoder.prototype.decodeMap = function(keyClass, valueClass) { | |
| 185 this.skip(4); // numberOfBytes | |
| 186 this.skip(4); // numberOfFields | |
|
qsr
2014/10/15 13:03:40
Don't you want to check that the header is the one
hansmuller
2014/10/15 21:45:46
Yes. That will happen when the incoming message is
| |
| 187 var keys = this.decodeArrayPointer(keyClass); | |
| 188 var values = this.decodeArrayPointer(valueClass); | |
| 189 var val = new Map(); | |
| 190 for (var i = 0; i < keys.length; i++) | |
| 191 val.set(keys[i], values[i]); | |
| 192 return val; | |
| 193 }; | |
| 194 | |
| 195 Decoder.prototype.decodeMapPointer = function(keyClass, valueClass) { | |
| 196 var pointer = this.decodePointer(); | |
| 197 if (!pointer) { | |
| 198 return null; | |
| 199 } | |
| 200 var decoder = this.decodeAndCreateDecoder(pointer); | |
| 201 return decoder.decodeMap(keyClass, valueClass); | |
| 202 }; | |
| 203 | |
| 183 // Encoder ------------------------------------------------------------------ | 204 // Encoder ------------------------------------------------------------------ |
| 184 | 205 |
| 185 function Encoder(buffer, handles, base) { | 206 function Encoder(buffer, handles, base) { |
| 186 this.buffer = buffer; | 207 this.buffer = buffer; |
| 187 this.handles = handles; | 208 this.handles = handles; |
| 188 this.base = base; | 209 this.base = base; |
| 189 this.next = base; | 210 this.next = base; |
| 190 } | 211 } |
| 191 | 212 |
| 192 Encoder.prototype.skip = function(offset) { | 213 Encoder.prototype.skip = function(offset) { |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 342 if (val == null) { | 363 if (val == null) { |
| 343 // Also handles undefined, since undefined == null. | 364 // Also handles undefined, since undefined == null. |
| 344 this.encodePointer(val); | 365 this.encodePointer(val); |
| 345 return; | 366 return; |
| 346 } | 367 } |
| 347 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); | 368 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); |
| 348 var encoder = this.createAndEncodeEncoder(encodedSize); | 369 var encoder = this.createAndEncodeEncoder(encodedSize); |
| 349 encoder.encodeString(val); | 370 encoder.encodeString(val); |
| 350 }; | 371 }; |
| 351 | 372 |
| 373 Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { | |
| 374 var keys = new Array(val.size); | |
| 375 var values = new Array(val.size); | |
| 376 var i = 0; | |
| 377 val.forEach(function(value, key) { | |
| 378 values[i] = value; | |
| 379 keys[i++] = key; | |
| 380 }); | |
|
abarth-chromium
2014/10/15 04:53:26
for (var [key, value] of val) {
...
}
https://d
hansmuller
2014/10/15 21:45:46
That would be nicer. I gave it a try; it doesn't a
| |
| 381 this.writeUint32(kMapStructSize); | |
|
yzshen1
2014/10/15 05:58:02
num_bytes should also include the header size.
hansmuller
2014/10/15 21:45:46
Yes it should! Sorry about that.
| |
| 382 this.writeUint32(2); | |
| 383 this.encodeArrayPointer(keyClass, keys); | |
| 384 this.encodeArrayPointer(valueClass, values); | |
| 385 } | |
| 386 | |
| 387 Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) { | |
| 388 if (val == null) { | |
| 389 // Also handles undefined, since undefined == null. | |
| 390 this.encodePointer(val); | |
| 391 return; | |
| 392 } | |
| 393 var encodedSize = kStructHeaderSize + kMapStructSize; | |
| 394 var encoder = this.createAndEncodeEncoder(encodedSize); | |
| 395 encoder.encodeMap(keyClass, valueClass, val); | |
| 396 }; | |
| 397 | |
| 352 // Message ------------------------------------------------------------------ | 398 // Message ------------------------------------------------------------------ |
| 353 | 399 |
| 354 var kMessageNameOffset = kStructHeaderSize; | 400 var kMessageNameOffset = kStructHeaderSize; |
| 355 var kMessageFlagsOffset = kMessageNameOffset + 4; | 401 var kMessageFlagsOffset = kMessageNameOffset + 4; |
| 356 var kMessageRequestIDOffset = kMessageFlagsOffset + 4; | 402 var kMessageRequestIDOffset = kMessageFlagsOffset + 4; |
| 357 | 403 |
| 358 var kMessageExpectsResponse = 1 << 0; | 404 var kMessageExpectsResponse = 1 << 0; |
| 359 var kMessageIsResponse = 1 << 1; | 405 var kMessageIsResponse = 1 << 1; |
| 360 | 406 |
| 361 function Message(buffer, handles) { | 407 function Message(buffer, handles) { |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 730 exports.NullableString = NullableString; | 776 exports.NullableString = NullableString; |
| 731 exports.PointerTo = PointerTo; | 777 exports.PointerTo = PointerTo; |
| 732 exports.NullablePointerTo = NullablePointerTo; | 778 exports.NullablePointerTo = NullablePointerTo; |
| 733 exports.ArrayOf = ArrayOf; | 779 exports.ArrayOf = ArrayOf; |
| 734 exports.NullableArrayOf = NullableArrayOf; | 780 exports.NullableArrayOf = NullableArrayOf; |
| 735 exports.PackedBool = PackedBool; | 781 exports.PackedBool = PackedBool; |
| 736 exports.Handle = Handle; | 782 exports.Handle = Handle; |
| 737 exports.NullableHandle = NullableHandle; | 783 exports.NullableHandle = NullableHandle; |
| 738 return exports; | 784 return exports; |
| 739 }); | 785 }); |
| OLD | NEW |