OLD | NEW |
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 // Support for JS interoperability | 6 // Support for JS interoperability |
7 // --------------------------------------------------------------------------- | 7 // --------------------------------------------------------------------------- |
8 function SendPortSync() { | 8 function SendPortSync() { |
9 } | 9 } |
10 | 10 |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 if (args.length == 1) { | 293 if (args.length == 1) { |
294 return [ 'return', serialize(receiver[field] = args[0]) ]; | 294 return [ 'return', serialize(receiver[field] = args[0]) ]; |
295 } | 295 } |
296 } else if (kind == 'hasProperty') { | 296 } else if (kind == 'hasProperty') { |
297 var field = member; | 297 var field = member; |
298 return [ 'return', field in receiver ]; | 298 return [ 'return', field in receiver ]; |
299 } else if (kind == 'apply') { | 299 } else if (kind == 'apply') { |
300 // Direct function invocation. | 300 // Direct function invocation. |
301 return [ 'return', | 301 return [ 'return', |
302 serialize(receiver.apply(args[0], args.slice(1))) ]; | 302 serialize(receiver.apply(args[0], args.slice(1))) ]; |
| 303 } else if (kind == 'asMap') { |
| 304 if (member == 'containsValue') { |
| 305 var found = false; |
| 306 for (var p in receiver) { |
| 307 if (receiver[p] === args[0]) { |
| 308 found = true; |
| 309 break; |
| 310 } |
| 311 } |
| 312 return [ 'return', serialize(found) ]; |
| 313 } else if (member == 'addAll') { |
| 314 var map = args[0]; |
| 315 for (var p in map) { |
| 316 receiver[p] = map[p]; |
| 317 } |
| 318 return [ 'return', null ]; |
| 319 } else if (member == 'values') { |
| 320 var values = []; |
| 321 for (var p in receiver) { |
| 322 values.push(receiver[p]); |
| 323 } |
| 324 return [ 'return', serialize(values) ]; |
| 325 } else if (member == 'length') { |
| 326 return [ 'return', serialize(Object.keys(receiver).length) ]; |
| 327 } else { |
| 328 return [ 'throws', 'unsupported operation']; |
| 329 } |
303 } else if (member == '[]' && args.length == 1) { | 330 } else if (member == '[]' && args.length == 1) { |
304 // Index getter. | 331 // Index getter. |
305 return [ 'return', serialize(receiver[args[0]]) ]; | 332 return [ 'return', serialize(receiver[args[0]]) ]; |
306 } else if (member == '[]=' && args.length == 2) { | 333 } else if (member == '[]=' && args.length == 2) { |
307 // Index setter. | 334 // Index setter. |
308 return [ 'return', serialize(receiver[args[0]] = args[1]) ]; | 335 return [ 'return', serialize(receiver[args[0]] = args[1]) ]; |
309 } else { | 336 } else { |
310 // Member function invocation. | 337 // Member function invocation. |
311 var f = receiver[member]; | 338 var f = receiver[member]; |
312 if (f) { | 339 if (f) { |
(...skipping 16 matching lines...) Expand all Loading... |
329 function DartProxy(id, sendPort) { | 356 function DartProxy(id, sendPort) { |
330 this.id = id; | 357 this.id = id; |
331 this.port = sendPort; | 358 this.port = sendPort; |
332 } | 359 } |
333 | 360 |
334 // Serializes JS types to SendPortSync format: | 361 // Serializes JS types to SendPortSync format: |
335 // - primitives -> primitives | 362 // - primitives -> primitives |
336 // - sendport -> sendport | 363 // - sendport -> sendport |
337 // - Function -> [ 'funcref', function-id, sendport ] | 364 // - Function -> [ 'funcref', function-id, sendport ] |
338 // - Object -> [ 'objref', object-id, sendport ] | 365 // - Object -> [ 'objref', object-id, sendport ] |
| 366 // - Array -> [ 'arrayref', object-id, sendport ] |
339 function serialize(message) { | 367 function serialize(message) { |
340 if (message == null) { | 368 if (message == null) { |
341 return null; // Convert undefined to null. | 369 return null; // Convert undefined to null. |
342 } else if (typeof(message) == 'string' || | 370 } else if (typeof(message) == 'string' || |
343 typeof(message) == 'number' || | 371 typeof(message) == 'number' || |
344 typeof(message) == 'boolean') { | 372 typeof(message) == 'boolean') { |
345 // Primitives are passed directly through. | 373 // Primitives are passed directly through. |
346 return message; | 374 return message; |
347 } else if (message instanceof SendPortSync) { | 375 } else if (message instanceof SendPortSync) { |
348 // Non-proxied objects are serialized. | 376 // Non-proxied objects are serialized. |
349 return message; | 377 return message; |
350 } else if (typeof(message) == 'function') { | 378 } else if (typeof(message) == 'function') { |
351 if ('_dart_id' in message) { | 379 if ('_dart_id' in message) { |
352 // Remote function proxy. | 380 // Remote function proxy. |
353 var remoteId = message._dart_id; | 381 var remoteId = message._dart_id; |
354 var remoteSendPort = message._dart_port; | 382 var remoteSendPort = message._dart_port; |
355 return [ 'funcref', remoteId, remoteSendPort ]; | 383 return [ 'funcref', remoteId, remoteSendPort ]; |
356 } else { | 384 } else { |
357 // Local function proxy. | 385 // Local function proxy. |
358 return [ 'funcref', | 386 return [ 'funcref', |
359 proxiedObjectTable.add(message), | 387 proxiedObjectTable.add(message), |
360 proxiedObjectTable.sendPort ]; | 388 proxiedObjectTable.sendPort ]; |
361 } | 389 } |
362 } else if (message instanceof DartProxy) { | 390 } else if (message instanceof DartProxy) { |
363 // Remote object proxy. | 391 // Remote object proxy. |
364 return [ 'objref', message.id, message.port ]; | 392 return [ 'objref', message.id, message.port ]; |
365 } else { | 393 } else { |
366 // Local object proxy. | 394 // Local object proxy. |
367 return [ 'objref', | 395 return [ message instanceof Array ? 'arrayref' : 'objref', |
368 proxiedObjectTable.add(message), | 396 proxiedObjectTable.add(message), |
369 proxiedObjectTable.sendPort ]; | 397 proxiedObjectTable.sendPort ]; |
370 } | 398 } |
371 } | 399 } |
372 | 400 |
373 function deserialize(message) { | 401 function deserialize(message) { |
374 if (message == null) { | 402 if (message == null) { |
375 return null; // Convert undefined to null. | 403 return null; // Convert undefined to null. |
376 } else if (typeof(message) == 'string' || | 404 } else if (typeof(message) == 'string' || |
377 typeof(message) == 'number' || | 405 typeof(message) == 'number' || |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 port.receive(f); | 558 port.receive(f); |
531 window.registerPort(name, port.toSendPort()); | 559 window.registerPort(name, port.toSendPort()); |
532 } | 560 } |
533 | 561 |
534 makeGlobalPort('dart-js-context', context); | 562 makeGlobalPort('dart-js-context', context); |
535 makeGlobalPort('dart-js-create', construct); | 563 makeGlobalPort('dart-js-create', construct); |
536 makeGlobalPort('dart-js-instanceof', proxyInstanceof); | 564 makeGlobalPort('dart-js-instanceof', proxyInstanceof); |
537 makeGlobalPort('dart-js-delete-property', proxyDeleteProperty); | 565 makeGlobalPort('dart-js-delete-property', proxyDeleteProperty); |
538 makeGlobalPort('dart-js-convert', proxyConvert); | 566 makeGlobalPort('dart-js-convert', proxyConvert); |
539 })(); | 567 })(); |
OLD | NEW |