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

Side by Side Diff: sdk/lib/js/dartium/js_dartium.dart

Issue 26092003: Maintain referential integrity of proxy instances in dart:js (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /** 5 /**
6 * The js.dart library provides simple JavaScript invocation from Dart that 6 * The js.dart library provides simple JavaScript invocation from Dart that
7 * works on both Dartium and on other modern browsers via Dart2JS. 7 * works on both Dartium and on other modern browsers via Dart2JS.
8 * 8 *
9 * It provides a model based on scoped [JsObject] objects. Proxies give Dart 9 * It provides a model based on scoped [JsObject] objects. Proxies give Dart
10 * code access to JavaScript objects, fields, and functions as well as the 10 * code access to JavaScript objects, fields, and functions as well as the
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 throw 'Invocation unsupported on non-function Dart proxies'; 276 throw 'Invocation unsupported on non-function Dart proxies';
277 } 277 }
278 } catch (e) { 278 } catch (e) {
279 // TODO(vsm): callSync should just handle exceptions itself. 279 // TODO(vsm): callSync should just handle exceptions itself.
280 return ['throws', '$e']; 280 return ['throws', '$e'];
281 } 281 }
282 }); 282 });
283 } 283 }
284 284
285 // Adds a new object to the table and return a new ID for it. 285 // Adds a new object to the table and return a new ID for it.
286 String add(x) { 286 String add(x, {String id}) {
287 // TODO(vsm): Cache x and reuse id. 287 // TODO(vsm): Cache x and reuse id.
288 final id = '$_name-${_nextId++}'; 288 id = (id != null) ? id : '$_name-${_nextId++}';
289 _registry[id] = x; 289 _registry[id] = x;
290 return id; 290 return id;
291 } 291 }
292 292
293 // Gets an object by ID. 293 // Gets an object by ID.
294 Object get(String id) { 294 Object get(String id) {
295 return _registry[id]; 295 return _registry[id];
296 } 296 }
297 297
298 // Gets the current number of objects kept alive by this table. 298 // Gets the current number of objects kept alive by this table.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 } 340 }
341 341
342 _deserialize(var message) { 342 _deserialize(var message) {
343 deserializeFunction(message) { 343 deserializeFunction(message) {
344 var id = message[1]; 344 var id = message[1];
345 var port = message[2]; 345 var port = message[2];
346 if (port == _proxiedObjectTable.sendPort) { 346 if (port == _proxiedObjectTable.sendPort) {
347 // Local function. 347 // Local function.
348 return _proxiedObjectTable.get(id); 348 return _proxiedObjectTable.get(id);
349 } else { 349 } else {
350 // Remote function. Forward to its port. 350 // Remote function.
alexandre.ardhuin 2013/10/07 08:56:54 _proxiedObjectTable currently contains only Dart l
justinfagnani 2013/10/07 17:49:13 I'm ok with the name, since it's either holding pr
351 return new JsFunction._internal(port, id); 351 var jsFunction = _proxiedObjectTable.get(id);
352 if (jsFunction == null) {
353 jsFunction = new JsFunction._internal(port, id);
354 _proxiedObjectTable.add(jsFunction, id: id);
355 }
356 return jsFunction;
352 } 357 }
353 } 358 }
354 359
355 deserializeObject(message) { 360 deserializeObject(message) {
356 var id = message[1]; 361 var id = message[1];
357 var port = message[2]; 362 var port = message[2];
358 if (port == _proxiedObjectTable.sendPort) { 363 if (port == _proxiedObjectTable.sendPort) {
359 // Local object. 364 // Local object.
360 return _proxiedObjectTable.get(id); 365 return _proxiedObjectTable.get(id);
361 } else { 366 } else {
362 // Remote object. 367 // Remote object.
363 return new JsObject._internal(port, id); 368 var jsObject = _proxiedObjectTable.get(id);
369 if (jsObject == null) {
370 jsObject = new JsObject._internal(port, id);
371 _proxiedObjectTable.add(jsObject, id: id);
372 }
373 return jsObject;
364 } 374 }
365 } 375 }
366 376
367 if (message == null) { 377 if (message == null) {
368 return null; // Convert undefined to null. 378 return null; // Convert undefined to null.
369 } else if (message is String || 379 } else if (message is String ||
370 message is num || 380 message is num ||
371 message is bool) { 381 message is bool) {
372 // Primitives are passed directly through. 382 // Primitives are passed directly through.
373 return message; 383 return message;
374 } else if (message is SendPortSync) { 384 } else if (message is SendPortSync) {
375 // Serialized type. 385 // Serialized type.
376 return message; 386 return message;
377 } 387 }
378 var tag = message[0]; 388 var tag = message[0];
379 switch (tag) { 389 switch (tag) {
380 case 'funcref': return deserializeFunction(message); 390 case 'funcref': return deserializeFunction(message);
381 case 'objref': return deserializeObject(message); 391 case 'objref': return deserializeObject(message);
382 } 392 }
383 throw 'Unsupported serialized data: $message'; 393 throw 'Unsupported serialized data: $message';
384 } 394 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698