Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(158)

Side by Side Diff: mojo/public/js/bindings/codec.js

Issue 654843005: Mojo JS Bindings: add support for associative arrays (Mojo map type) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 kMapStructPayloadSize = 16;
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
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
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
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 });
381 this.writeUint32(kStructHeaderSize + kMapStructPayloadSize);
382 this.writeUint32(2); // two fields: keys, values
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 + kMapStructPayloadSize;
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 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize); 699 var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize);
654 this.cls.encode(objectEncoder, val); 700 this.cls.encode(objectEncoder, val);
655 }; 701 };
656 702
657 function NullablePointerTo(cls) { 703 function NullablePointerTo(cls) {
658 PointerTo.call(this, cls); 704 PointerTo.call(this, cls);
659 } 705 }
660 706
661 NullablePointerTo.prototype = Object.create(PointerTo.prototype); 707 NullablePointerTo.prototype = Object.create(PointerTo.prototype);
662 708
663 function ArrayOf(cls) { 709 function ArrayOf(cls, length) {
664 this.cls = cls; 710 this.cls = cls;
711 this.length = length || 0;
665 } 712 }
666 713
667 ArrayOf.prototype.encodedSize = 8; 714 ArrayOf.prototype.encodedSize = 8;
668 715
716 ArrayOf.prototype.dimensions = function() {
717 return [this.length].concat(
718 (this.cls instanceof ArrayOf) ? this.cls.dimensions() : []);
719 }
720
669 ArrayOf.prototype.decode = function(decoder) { 721 ArrayOf.prototype.decode = function(decoder) {
670 return decoder.decodeArrayPointer(this.cls); 722 return decoder.decodeArrayPointer(this.cls);
671 }; 723 };
672 724
673 ArrayOf.prototype.encode = function(encoder, val) { 725 ArrayOf.prototype.encode = function(encoder, val) {
674 encoder.encodeArrayPointer(this.cls, val); 726 encoder.encodeArrayPointer(this.cls, val);
675 }; 727 };
676 728
677 function NullableArrayOf(cls) { 729 function NullableArrayOf(cls) {
678 ArrayOf.call(this, cls); 730 ArrayOf.call(this, cls);
(...skipping 24 matching lines...) Expand all
703 NullableHandle.encode = Handle.encode; 755 NullableHandle.encode = Handle.encode;
704 756
705 var exports = {}; 757 var exports = {};
706 exports.align = align; 758 exports.align = align;
707 exports.isAligned = isAligned; 759 exports.isAligned = isAligned;
708 exports.Message = Message; 760 exports.Message = Message;
709 exports.MessageBuilder = MessageBuilder; 761 exports.MessageBuilder = MessageBuilder;
710 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; 762 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
711 exports.MessageReader = MessageReader; 763 exports.MessageReader = MessageReader;
712 exports.kArrayHeaderSize = kArrayHeaderSize; 764 exports.kArrayHeaderSize = kArrayHeaderSize;
765 exports.kMapStructPayloadSize = kMapStructPayloadSize;
713 exports.kStructHeaderSize = kStructHeaderSize; 766 exports.kStructHeaderSize = kStructHeaderSize;
714 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; 767 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue;
715 exports.kMessageHeaderSize = kMessageHeaderSize; 768 exports.kMessageHeaderSize = kMessageHeaderSize;
716 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; 769 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize;
717 exports.kMessageExpectsResponse = kMessageExpectsResponse; 770 exports.kMessageExpectsResponse = kMessageExpectsResponse;
718 exports.kMessageIsResponse = kMessageIsResponse; 771 exports.kMessageIsResponse = kMessageIsResponse;
719 exports.Int8 = Int8; 772 exports.Int8 = Int8;
720 exports.Uint8 = Uint8; 773 exports.Uint8 = Uint8;
721 exports.Int16 = Int16; 774 exports.Int16 = Int16;
722 exports.Uint16 = Uint16; 775 exports.Uint16 = Uint16;
723 exports.Int32 = Int32; 776 exports.Int32 = Int32;
724 exports.Uint32 = Uint32; 777 exports.Uint32 = Uint32;
725 exports.Int64 = Int64; 778 exports.Int64 = Int64;
726 exports.Uint64 = Uint64; 779 exports.Uint64 = Uint64;
727 exports.Float = Float; 780 exports.Float = Float;
728 exports.Double = Double; 781 exports.Double = Double;
729 exports.String = String; 782 exports.String = String;
730 exports.NullableString = NullableString; 783 exports.NullableString = NullableString;
731 exports.PointerTo = PointerTo; 784 exports.PointerTo = PointerTo;
732 exports.NullablePointerTo = NullablePointerTo; 785 exports.NullablePointerTo = NullablePointerTo;
733 exports.ArrayOf = ArrayOf; 786 exports.ArrayOf = ArrayOf;
734 exports.NullableArrayOf = NullableArrayOf; 787 exports.NullableArrayOf = NullableArrayOf;
735 exports.PackedBool = PackedBool; 788 exports.PackedBool = PackedBool;
736 exports.Handle = Handle; 789 exports.Handle = Handle;
737 exports.NullableHandle = NullableHandle; 790 exports.NullableHandle = NullableHandle;
738 return exports; 791 return exports;
739 }); 792 });
OLDNEW
« no previous file with comments | « mojo/public/interfaces/bindings/tests/test_structs.mojom ('k') | mojo/public/js/bindings/struct_unittests.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698