| 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',
|
|
|