| Index: pkg/smoke/lib/mirrors.dart
 | 
| diff --git a/pkg/smoke/lib/mirrors.dart b/pkg/smoke/lib/mirrors.dart
 | 
| index bcaa42ab99ae4cfebfb2314b2a53c83e16a0ac38..4048aae776af947957faf1d8fe94e31bcb4cbd8d 100644
 | 
| --- a/pkg/smoke/lib/mirrors.dart
 | 
| +++ b/pkg/smoke/lib/mirrors.dart
 | 
| @@ -67,6 +67,19 @@ class ReflectiveObjectAccessorService implements ObjectAccessorService {
 | 
|  
 | 
|  /// Implements [TypeInspectorService] using mirrors.
 | 
|  class ReflectiveTypeInspectorService implements TypeInspectorService {
 | 
| +  bool isSubclassOf(Type type, Type supertype) {
 | 
| +    if (type == supertype || supertype == Object) return true;
 | 
| +    // TODO(sigmund): change to mirror.isSubclassOf when it gets implemented in
 | 
| +    // dart2js. (dartbug.com/12439)
 | 
| +    var mirror = reflectClass(type);
 | 
| +    var top = reflectClass(supertype);
 | 
| +    while (mirror != _objectType) {
 | 
| +      mirror = _safeSuperclass(mirror);
 | 
| +      if (mirror == top) return true;
 | 
| +    }
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
|    bool hasGetter(Type type, Symbol name) {
 | 
|      var mirror = reflectType(type);
 | 
|      if (mirror is! ClassMirror) return false;
 | 
| @@ -137,8 +150,12 @@ class ReflectiveTypeInspectorService implements TypeInspectorService {
 | 
|    }
 | 
|  
 | 
|    List<Declaration> _query(ClassMirror cls, QueryOptions options) {
 | 
| -    var result = (!options.includeInherited || cls.superclass == _objectType)
 | 
| -        ? [] : _query(cls.superclass, options);
 | 
| +    final visitParent = options.includeInherited && cls.superclass != null && 
 | 
| +        // TODO(sigmund): use _toType(cls.superclass) != options.includeUpTo
 | 
| +        // when dartbug.com/16925 gets fixed (_toType fails in dart2js if
 | 
| +        // applied to classes with type-arguments).
 | 
| +        cls.superclass != reflectClass(options.includeUpTo);
 | 
| +    var result = visitParent ? _query(cls.superclass, options) : [];
 | 
|      for (var member in cls.declarations.values) {
 | 
|        if (member is! VariableMirror && member is! MethodMirror) continue;
 | 
|        if (member.isStatic || member.isPrivate) continue;
 | 
| 
 |