| Index: runtime/lib/invocation_mirror_patch.dart | 
| =================================================================== | 
| --- runtime/lib/invocation_mirror_patch.dart	(revision 29041) | 
| +++ runtime/lib/invocation_mirror_patch.dart	(working copy) | 
| @@ -13,20 +13,22 @@ | 
| static const int _TYPE_BITS = 2; | 
| static const int _TYPE_MASK = (1 << _TYPE_BITS) - 1; | 
|  | 
| -  // These values, except _DYNAMIC, are only used when throwing | 
| +  // These values, except _DYNAMIC and _SUPER, are only used when throwing | 
| // NoSuchMethodError for compile-time resolution failures. | 
| static const int _DYNAMIC = 0; | 
| -  static const int _STATIC = 1; | 
| -  static const int _CONSTRUCTOR = 2; | 
| -  static const int _TOP_LEVEL = 3; | 
| +  static const int _SUPER = 1; | 
| +  static const int _STATIC = 2; | 
| +  static const int _CONSTRUCTOR = 3; | 
| +  static const int _TOP_LEVEL = 4; | 
| static const int _CALL_SHIFT = _TYPE_BITS; | 
| -  static const int _CALL_BITS = 2; | 
| +  static const int _CALL_BITS = 3; | 
| static const int _CALL_MASK = (1 << _CALL_BITS) - 1; | 
|  | 
| // Internal representation of the invocation mirror. | 
| final String _functionName; | 
| final List _argumentsDescriptor; | 
| final List _arguments; | 
| +  final bool _isSuperInvocation; | 
|  | 
| // External representation of the invocation mirror; populated on demand. | 
| Symbol _memberName; | 
| @@ -45,7 +47,7 @@ | 
| new _collection_dev.Symbol.unvalidated( | 
| _functionName.substring(4) + "="); | 
| } else { | 
| -      _type = _METHOD; | 
| +      _type = _isSuperInvocation ? (_SUPER << _CALL_SHIFT) | _METHOD : _METHOD; | 
| _memberName = new _collection_dev.Symbol.unvalidated(_functionName); | 
| } | 
| } | 
| @@ -93,38 +95,43 @@ | 
| if (_type == null) { | 
| _setMemberNameAndType(); | 
| } | 
| -    return _type == _METHOD; | 
| +    return (_type & _TYPE_MASK) == _METHOD; | 
| } | 
|  | 
| bool get isAccessor { | 
| if (_type == null) { | 
| _setMemberNameAndType(); | 
| } | 
| -    return _type != _METHOD; | 
| +    return (_type & _TYPE_MASK) != _METHOD; | 
| } | 
|  | 
| bool get isGetter { | 
| if (_type == null) { | 
| _setMemberNameAndType(); | 
| } | 
| -    return _type == _GETTER; | 
| +    return (_type & _TYPE_MASK) == _GETTER; | 
| } | 
|  | 
| bool get isSetter { | 
| if (_type == null) { | 
| _setMemberNameAndType(); | 
| } | 
| -    return _type == _SETTER; | 
| +    return (_type & _TYPE_MASK) == _SETTER; | 
| } | 
|  | 
| _InvocationMirror(this._functionName, | 
| this._argumentsDescriptor, | 
| -                    this._arguments); | 
| +                    this._arguments, | 
| +                    this._isSuperInvocation); | 
|  | 
| static _allocateInvocationMirror(String functionName, | 
| List argumentsDescriptor, | 
| -                                   List arguments) { | 
| -    return new _InvocationMirror(functionName, argumentsDescriptor, arguments); | 
| +                                   List arguments, | 
| +                                   bool isSuperInvocation) { | 
| +    return new _InvocationMirror(functionName, | 
| +                                 argumentsDescriptor, | 
| +                                 arguments, | 
| +                                 isSuperInvocation); | 
| } | 
|  | 
| static _invoke(Object receiver, | 
|  |