anchor.diff:      JS.Expression result;
       if (member != null && member is MethodElement && !isStatic) {
         // Tear-off methods: explicitly bind it.
  +      // To be safe always use the symbolized name when binding on a native
  +      // class as bind assumes the name will match the name class sigatures
  +      // which is symbolized for native classes.
  +      var safeName = _emitMemberName(memberName,
  +          type: getStaticType(target),
  +          isStatic: isStatic,
  +          element: member,
  +          alwaysSymbolizeNative: true);
         if (isSuper) {
  -        result = _callHelper('bind(this, #, #.#)', [name, jsTarget, name]);
  +        result =
  +            _callHelper('bind(this, #, #.#)', [safeName, jsTarget, safeName]);
         } else if (_isObjectMemberCall(target, memberName)) {
           result = _callHelper('bind(#, #, #.#)',
               [jsTarget, _propertyName(memberName), _runtimeModule, memberName]);
         } else {
  -        result = _callHelper('bind(#, #)', [jsTarget, name]);
  +        result = _callHelper('bind(#, #)', [jsTarget, safeName]);
         }
       } else if (_isObjectMemberCall(target, memberName)) {
         result = _callHelper('#(#)', [memberName, jsTarget]);
  
positive.code:       while (baseType is TypeParameterType) {
          baseType = (baseType.element as TypeParameterElement).bound;
        }
        useExtension =
            baseType is InterfaceType && _isSymbolizedMember(baseType, name);
      }
  
      return useExtension
  
negative.code:       bool isStatic: false,
        bool useExtension,
        bool useDisplayName: false,
        bool alwaysSymbolizeNative: false,
        Element element}) {
      // Static members skip the rename steps and may require JS interop renames.
      if (isStatic) {
  