whole_func_string: function frozen(obj, prop, descriptor) {
    if (descriptor === undefined) {
      /* istanbul ignore else  */
      warn('You are using @frozen on an undefined property. This property will become a frozen undefined forever, which is meaningless');
      return {
        value: undefined,
        writable: false,
        enumerable: false,
        configurable: false
      };
    }
    descriptor.enumerable = false;
    descriptor.configurable = false;
    if (isAccessorDescriptor(descriptor)) {
      var _get = descriptor.get;
  
      descriptor.set = undefined;
      if (!isFunction(_get)) {
        /* istanbul ignore else  */
        warn('You are using @frozen on one accessor descriptor without getter. This property will become a frozen undefined finally.Which maybe meaningless.');
        return;
      }
      return {
        get: function get() {
          var value = bind$1(_get, this)();
          defineProperty$2$1(this, prop, {
            value: value,
            writable: false,
            configurable: false,
            enumerable: false
          });
          return value;
        },
  
        set: undefined,
        configurable: false,
        enumerable: false
      };
    }
    // $FlowFixMe: comeon, can disjoint union be reliable?
    descriptor.writable = false;
    return descriptor;
  }
func_code_string: function frozen(obj, prop, descriptor) {
    if (descriptor === undefined) {
      /* istanbul ignore else  */
      warn('You are using @frozen on an undefined property. This property will become a frozen undefined forever, which is meaningless');
      return {
        value: undefined,
        writable: false,
        enumerable: false,
        configurable: false
      };
    }
    descriptor.enumerable = false;
    descriptor.configurable = false;
    if (isAccessorDescriptor(descriptor)) {
      var _get = descriptor.get;
  
      descriptor.set = undefined;
      if (!isFunction(_get)) {
        /* istanbul ignore else  */
        warn('You are using @frozen on one accessor descriptor without getter. This property will become a frozen undefined finally.Which maybe meaningless.');
        return;
      }
      return {
        get: function get() {
          var value = bind$1(_get, this)();
          defineProperty$2$1(this, prop, {
            value: value,
            writable: false,
            configurable: false,
            enumerable: false
          });
          return value;
        },
  
        set: undefined,
        configurable: false,
        enumerable: false
      };
    }
    // $FlowFixMe: comeon, can disjoint union be reliable?
    descriptor.writable = false;
    return descriptor;
  }
func_documentation_string: make one attr only can be read, but could not be rewrited/ deleted
  @param {Object} obj
  @param {string} prop
  @param {Object} descriptor
  @return {descriptor}