Index: sdk/lib/_internal/compiler/implementation/lib/native_helper.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart |
index 98eea0219a45b27e85f188a3ba1c83a761dffd12..46d81be95f1a8aa1b16726b6975e4b54f19daff0 100644 |
--- a/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart |
+++ b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart |
@@ -118,6 +118,10 @@ void arraySet(List array, int index, var value) { |
JS('var', '#[#] = #', array, index, value); |
} |
+propertyGet(var object, String property) { |
+ return JS('var', '#[#]', object, property); |
+} |
+ |
void propertySet(var object, String property, var value) { |
JS('var', '#[#] = #', object, property, value); |
} |
@@ -201,31 +205,21 @@ dynamicBind(var obj, |
String name, |
var methods, |
List arguments) { |
- // The tag is related to the class name. E.g. the dart:html class |
- // '_ButtonElement' has the tag 'HTMLButtonElement'. TODO(erikcorry): rename |
- // getTypeNameOf to getTypeTag. |
String tag = getTypeNameOf(obj); |
- var hasOwnProperty = JS('var', 'Object.prototype.hasOwnProperty'); |
- var method = lookupDynamicClass(hasOwnProperty, methods, tag); |
+ var method = JS('var', '#[#]', methods, tag); |
if (method == null && _dynamicMetadata != null) { |
- // Look at the inheritance data, getting the class tags and using them |
- // to check the methods table for this method name. |
for (int i = 0; i < arrayLength(_dynamicMetadata); i++) { |
MetaInfo entry = arrayGet(_dynamicMetadata, i); |
- if (JS('bool', '#.call(#, #)', hasOwnProperty, entry._set, tag)) { |
- method = lookupDynamicClass(hasOwnProperty, methods, entry._tag); |
- // Stop if we found it in the methods array. |
+ if (JS('bool', '#', propertyGet(entry._set, tag))) { |
+ method = propertyGet(methods, entry._tag); |
if (method != null) break; |
} |
} |
} |
- // If we didn't find the method then look up in the Dart Object class, using |
- // getTypeNameOf in case the minifier has renamed Object. |
if (method == null) { |
- String nameOfObjectClass = getTypeNameOf(const Object()); |
- method = lookupDynamicClass(hasOwnProperty, methods, nameOfObjectClass); |
+ method = propertyGet(methods, 'Object'); |
} |
var proto = JS('var', 'Object.getPrototypeOf(#)', obj); |
@@ -245,24 +239,13 @@ dynamicBind(var obj, |
proto, name, name); |
} |
- if (JS('bool', '!#.call(#, #)', hasOwnProperty, proto, name)) { |
+ if (JS('bool', '!#.hasOwnProperty(#)', proto, name)) { |
defineProperty(proto, name, method); |
} |
return JS('var', '#.apply(#, #)', method, obj, arguments); |
} |
-// For each method name and class inheritance subtree, we use an ordinary JS |
-// object as a hash map to store the method for each class. Entries are added |
-// in native_emitter.dart (see dynamicName). In order to avoid the class names |
-// clashing with the method names on Object.prototype (needed for native |
-// objects) we must always use hasOwnProperty. |
-var lookupDynamicClass(var hasOwnProperty, var methods, String className) { |
- return JS('bool', '#.call(#, #)', hasOwnProperty, methods, className) ? |
- JS('var', '#[#]', methods, className) : |
- null; |
-} |
- |
/** |
* Code for doing the dynamic dispatch on JavaScript prototypes that are not |
* available at compile-time. Each property of a native Dart class |
@@ -290,10 +273,7 @@ dynamicFunction(name) { |
var methods = JS('var', '{}'); |
// If there is a method attached to the Dart Object class, use it as |
// the method to call in case no method is registered for that type. |
- var dartMethod = |
- JS('var', 'Object.getPrototypeOf(#)[#]', const Object(), name); |
- // Take the method from the Dart Object class if we didn't find it yet and it |
- // is there. |
+ var dartMethod = JS('var', 'Object.getPrototypeOf(#)[#]', const Object(), name); |
if (dartMethod != null) propertySet(methods, 'Object', dartMethod); |
var bind = JS('var', |