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

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: Fixed a typo 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 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
703 NullableHandle.encode = Handle.encode; 749 NullableHandle.encode = Handle.encode;
704 750
705 var exports = {}; 751 var exports = {};
706 exports.align = align; 752 exports.align = align;
707 exports.isAligned = isAligned; 753 exports.isAligned = isAligned;
708 exports.Message = Message; 754 exports.Message = Message;
709 exports.MessageBuilder = MessageBuilder; 755 exports.MessageBuilder = MessageBuilder;
710 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; 756 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
711 exports.MessageReader = MessageReader; 757 exports.MessageReader = MessageReader;
712 exports.kArrayHeaderSize = kArrayHeaderSize; 758 exports.kArrayHeaderSize = kArrayHeaderSize;
759 exports.kMapStructPayloadSize = kMapStructPayloadSize;
713 exports.kStructHeaderSize = kStructHeaderSize; 760 exports.kStructHeaderSize = kStructHeaderSize;
714 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; 761 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue;
715 exports.kMessageHeaderSize = kMessageHeaderSize; 762 exports.kMessageHeaderSize = kMessageHeaderSize;
716 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; 763 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize;
717 exports.kMessageExpectsResponse = kMessageExpectsResponse; 764 exports.kMessageExpectsResponse = kMessageExpectsResponse;
718 exports.kMessageIsResponse = kMessageIsResponse; 765 exports.kMessageIsResponse = kMessageIsResponse;
719 exports.Int8 = Int8; 766 exports.Int8 = Int8;
720 exports.Uint8 = Uint8; 767 exports.Uint8 = Uint8;
721 exports.Int16 = Int16; 768 exports.Int16 = Int16;
722 exports.Uint16 = Uint16; 769 exports.Uint16 = Uint16;
723 exports.Int32 = Int32; 770 exports.Int32 = Int32;
724 exports.Uint32 = Uint32; 771 exports.Uint32 = Uint32;
725 exports.Int64 = Int64; 772 exports.Int64 = Int64;
726 exports.Uint64 = Uint64; 773 exports.Uint64 = Uint64;
727 exports.Float = Float; 774 exports.Float = Float;
728 exports.Double = Double; 775 exports.Double = Double;
729 exports.String = String; 776 exports.String = String;
730 exports.NullableString = NullableString; 777 exports.NullableString = NullableString;
731 exports.PointerTo = PointerTo; 778 exports.PointerTo = PointerTo;
732 exports.NullablePointerTo = NullablePointerTo; 779 exports.NullablePointerTo = NullablePointerTo;
733 exports.ArrayOf = ArrayOf; 780 exports.ArrayOf = ArrayOf;
734 exports.NullableArrayOf = NullableArrayOf; 781 exports.NullableArrayOf = NullableArrayOf;
735 exports.PackedBool = PackedBool; 782 exports.PackedBool = PackedBool;
736 exports.Handle = Handle; 783 exports.Handle = Handle;
737 exports.NullableHandle = NullableHandle; 784 exports.NullableHandle = NullableHandle;
738 return exports; 785 return exports;
739 }); 786 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698