defineProperty = (object, prop, descriptor) => {
  // We used to do the following, until we had to reopen Safari bug
  // https://bugs.webkit.org/show_bug.cgi?id=222538#c17
  // Once this is fixed, we may restore it.
  // // Object.defineProperty is allowed to fail silently so we use
  // // Object.defineProperties instead.
  // return defineProperties(object, { [prop]: descriptor });

  // Instead, to workaround the Safari bug
  const result = originalDefineProperty(object, prop, descriptor);
  if (result !== object) {
    // See https://github.com/endojs/endo/blob/master/packages/ses/error-codes/SES_DEFINE_PROPERTY_FAILED_SILENTLY.md
    throw TypeError(
      `Please report that the original defineProperty silently failed to set ${stringifyJson(
        String(prop),
      )}. (SES_DEFINE_PROPERTY_FAILED_SILENTLY)`,
    );
  }
  return result;
}
@module Captures native intrinsics during initialization, so vetted shims
(running between initialization of SES and calling lockdown) are free to
modify the environment without compromising the integrity of SES. For
example, a vetted shim can modify Object.assign because we capture and
export Object and assign here, then never again consult Object to get its
assign property.

This pattern of use is enforced by eslint rules no-restricted-globals and
no-polymorphic-call.
We maintain the list of restricted globals in ../package.json.