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

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 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
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
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
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 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698