OLD | NEW |
---|---|
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 /// This library defines runtime operations on objects used by the code | 5 /// This library defines runtime operations on objects used by the code |
6 /// generator. | 6 /// generator. |
7 part of dart._runtime; | 7 part of dart._runtime; |
8 | 8 |
9 class InvocationImpl extends Invocation { | 9 class InvocationImpl extends Invocation { |
10 final Symbol memberName; | 10 final Symbol memberName; |
(...skipping 11 matching lines...) Expand all Loading... | |
22 : memberName = _dartSymbol(memberName), | 22 : memberName = _dartSymbol(memberName), |
23 namedArguments = _namedArgsToSymbols(namedArguments); | 23 namedArguments = _namedArgsToSymbols(namedArguments); |
24 | 24 |
25 static Map<Symbol, dynamic> _namedArgsToSymbols(namedArgs) { | 25 static Map<Symbol, dynamic> _namedArgsToSymbols(namedArgs) { |
26 if (namedArgs == null) return {}; | 26 if (namedArgs == null) return {}; |
27 return new Map.fromIterable(getOwnPropertyNames(namedArgs), | 27 return new Map.fromIterable(getOwnPropertyNames(namedArgs), |
28 key: _dartSymbol, value: (k) => JS('', '#[#]', namedArgs, k)); | 28 key: _dartSymbol, value: (k) => JS('', '#[#]', namedArgs, k)); |
29 } | 29 } |
30 } | 30 } |
31 | 31 |
32 /// Given an object and a method name, tear off the method. | |
33 /// Sets the runtime type of the torn off method appropriately, | |
34 /// and also binds the object. | |
35 /// | |
36 /// If the optional `f` argument is passed in, it will be used as the method. | |
37 /// This supports cases like `super.foo` where we need to tear off the method | |
38 /// from the superclass, not from the `obj` directly. | |
39 /// TODO(leafp): Consider caching the tearoff on the object? | |
40 bind(obj, name, f) { | |
41 if (f == null) f = JS('', '#[#]', obj, name); | |
42 | |
43 // TODO(jmesserly): it would be nice to do this lazily, but JS interop seems | |
44 // to require us to be eager (the test below). | |
45 var sig = getMethodType(getType(obj), name); | |
46 | |
47 // JS interop case: do not bind this for compatibility with the dart2js | |
48 // implementation where we cannot bind this reliably here until we trust | |
49 // types more. | |
50 if (sig == null) return f; | |
51 | |
52 f = JS('', '#.bind(#)', f, obj); | |
53 JS( | |
54 '', | |
55 r'''#[dartx["=="]] = function boundMethodEquals(other) { | |
56 return other[#] === this[#] && other[#] === this[#]; | |
vsm
2017/05/09 22:50:15
check other is non-null too?
Jennifer Messerly
2017/05/09 23:10:33
equality operator is spec'd to check for this:
Ev
Jennifer Messerly
2017/05/09 23:11:17
(in other words, it checks before the operator met
| |
57 }''', | |
58 f, | |
59 _boundMethodTarget, | |
60 _boundMethodTarget, | |
61 _boundMethodName, | |
62 _boundMethodName); | |
63 JS('', '#[#] = #', f, _boundMethodTarget, obj); | |
64 JS('', '#[#] = #', f, _boundMethodName, name); | |
65 tag(f, sig); | |
66 return f; | |
67 } | |
68 | |
69 final _boundMethodTarget = JS('', 'Symbol("_boundMethodTarget")'); | |
70 final _boundMethodName = JS('', 'Symbol("_boundMethodName")'); | |
71 | |
72 /// Instantiate a generic method. | |
73 /// | |
74 /// We need to apply the type arguments both to the function, as well as its | |
75 /// associated function type. | |
76 gbind(f, @rest typeArgs) { | |
77 var result = JS('', '#.apply(null, #)', f, typeArgs); | |
78 var sig = JS('', '#.instantiate(#)', _getRuntimeType(f), typeArgs); | |
79 tag(result, sig); | |
80 return result; | |
81 } | |
82 | |
32 // Warning: dload, dput, and dsend assume they are never called on methods | 83 // Warning: dload, dput, and dsend assume they are never called on methods |
33 // implemented by the Object base class as those methods can always be | 84 // implemented by the Object base class as those methods can always be |
34 // statically resolved. | 85 // statically resolved. |
35 dload(obj, field) { | 86 dload(obj, field) { |
36 var f = _canonicalMember(obj, field); | 87 var f = _canonicalMember(obj, field); |
37 | 88 |
38 _trackCall(obj); | 89 _trackCall(obj); |
39 if (f != null) { | 90 if (f != null) { |
40 var type = getType(obj); | 91 var type = getType(obj); |
41 | 92 |
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
908 name = '+' + name; | 959 name = '+' + name; |
909 } | 960 } |
910 return name; | 961 return name; |
911 } | 962 } |
912 | 963 |
913 /// Emulates the implicit "loadLibrary" function provided by a deferred library. | 964 /// Emulates the implicit "loadLibrary" function provided by a deferred library. |
914 /// | 965 /// |
915 /// Libraries are not actually deferred in DDC, so this just returns a future | 966 /// Libraries are not actually deferred in DDC, so this just returns a future |
916 /// that completes immediately. | 967 /// that completes immediately. |
917 Future loadLibrary() => new Future.value(); | 968 Future loadLibrary() => new Future.value(); |
OLD | NEW |