blob: 1a378a41b6d3ed082c58a06d4a87aaa12083dee7 [file] [log] [blame]
Leo Repp58b9f112021-11-22 11:57:47 +01001'use strict';
2
3var GetIntrinsic = require('get-intrinsic');
4
5var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
6
7if ($defineProperty) {
8 try {
9 $defineProperty({}, 'a', { value: 1 });
10 } catch (e) {
11 // IE 8 has a broken defineProperty
12 $defineProperty = null;
13 }
14}
15
16var callBound = require('call-bind/callBound');
17
18var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
19
20// eslint-disable-next-line max-params
21module.exports = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) {
22 if (!$defineProperty) {
23 if (!IsDataDescriptor(desc)) {
24 // ES3 does not support getters/setters
25 return false;
26 }
27 if (!desc['[[Configurable]]'] || !desc['[[Writable]]']) {
28 return false;
29 }
30
31 // fallback for ES3
32 if (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) {
33 // a non-enumerable existing property
34 return false;
35 }
36
37 // property does not exist at all, or exists but is enumerable
38 var V = desc['[[Value]]'];
39 // eslint-disable-next-line no-param-reassign
40 O[P] = V; // will use [[Define]]
41 return SameValue(O[P], V);
42 }
43 $defineProperty(O, P, FromPropertyDescriptor(desc));
44 return true;
45};