code: private boolean setPrototypeNoCheck(ObjectType prototype, Node propertyNode) {
      ObjectType oldPrototype = prototypeSlot == null ? null : (ObjectType) prototypeSlot.getType();
      boolean replacedPrototype = oldPrototype != null;
  
      this.prototypeSlot =
          new Property("prototype", prototype, true, propertyNode == null ? source : propertyNode);
      prototype.setOwnerFunction(this);
  
      if (oldPrototype != null) {
        // Disassociating the old prototype makes this easier to debug--
        // we don't have to worry about two prototypes running around.
        oldPrototype.setOwnerFunction(null);
      }
  
      if (isConstructor() || isInterface()) {
        FunctionType superClass = getSuperClassConstructor();
        if (superClass != null) {
          superClass.addSubType(this);
          wasAddedToExtendedConstructorSubtypes = true;
        }
  
        if (isInterface()) {
          for (ObjectType interfaceType : getExtendedInterfaces()) {
            if (interfaceType.getConstructor() != null) {
              interfaceType.getConstructor().addSubType(this);
            }
          }
        }
      }
  
      if (replacedPrototype) {
        clearCachedValues();
      }
  
      return true;
    }
docs: Set the prototype without doing any sanity checks.