@SuppressWarnings("ReferenceEquality")
  final boolean isImplicitPrototype(ObjectType prototype) {
    for (ObjectType current = this; current != null; current = current.getImplicitPrototype()) {
      if (current.isTemplatizedType()) {
        current = current.toMaybeTemplatizedType().getReferencedType();
      }

      current = deeplyUnwrap(current);

      // The prototype should match exactly.
      // NOTE: the use of "==" here rather than isEquivalentTo is deliberate.  This method
      // is very hot in the type checker and relying on identity improves performance of both
      // type checking/type inferrence and property disambiguation.
      if (current != null && current == prototype) {
        return true;
      }
    }
    return false;
  }
@ SuppressWarnings ( "ReferenceEquality" ) final boolean isImplicitPrototype ( ObjectType prototype ) { for ( ObjectType current = this ; current != null ; current = current . getImplicitPrototype ( ) ) { if ( current . isTemplatizedType ( ) ) { current = current . toMaybeTemplatizedType ( ) . getReferencedType ( ) ; } current = deeplyUnwrap ( current ) ; if ( current != null && current == prototype ) { return true ; } } return false ; }
Checks that the prototype is an implicit prototype of this object. Since each object has an
implicit prototype, an implicit prototype's implicit prototype is also this implicit
prototype's.

@param prototype any prototype based object
@return {@code true} if {@code prototype} is {@code equal} to any object in this object's
implicit prototype chain.