diff options
Diffstat (limited to 'src/node_modules/es-abstract/helpers/DefineOwnProperty.js')
-rw-r--r-- | src/node_modules/es-abstract/helpers/DefineOwnProperty.js | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/node_modules/es-abstract/helpers/DefineOwnProperty.js b/src/node_modules/es-abstract/helpers/DefineOwnProperty.js new file mode 100644 index 0000000..99ace10 --- /dev/null +++ b/src/node_modules/es-abstract/helpers/DefineOwnProperty.js @@ -0,0 +1,45 @@ +'use strict'; + +var GetIntrinsic = require('../GetIntrinsic'); + +var $defineProperty = GetIntrinsic('%Object.defineProperty%', true); + +if ($defineProperty) { + try { + $defineProperty({}, 'a', { value: 1 }); + } catch (e) { + // IE 8 has a broken defineProperty + $defineProperty = null; + } +} + +var callBound = require('../helpers/callBound'); + +var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable'); + +// eslint-disable-next-line max-params +module.exports = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) { + if (!$defineProperty) { + if (!IsDataDescriptor(desc)) { + // ES3 does not support getters/setters + return false; + } + if (!desc['[[Configurable]]'] || !desc['[[Writable]]']) { + return false; + } + + // fallback for ES3 + if (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) { + // a non-enumerable existing property + return false; + } + + // property does not exist at all, or exists but is enumerable + var V = desc['[[Value]]']; + // eslint-disable-next-line no-param-reassign + O[P] = V; // will use [[Define]] + return SameValue(O[P], V); + } + $defineProperty(O, P, FromPropertyDescriptor(desc)); + return true; +}; |