Show More
Commit Description:
submission report
Commit Description:
submission report
References:
File last commit:
Show/Diff file:
Action:
node_modules/es-abstract/2017/TestIntegrityLevel.js
| 42 lines
| 1.2 KiB
| application/javascript
| JavascriptLexer
|
r789 | 'use strict'; | |||
var GetIntrinsic = require('../GetIntrinsic'); | ||||
var $gOPD = require('../helpers/getOwnPropertyDescriptor'); | ||||
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%'); | ||||
var $TypeError = GetIntrinsic('%TypeError%'); | ||||
var every = require('../helpers/every'); | ||||
var IsDataDescriptor = require('./IsDataDescriptor'); | ||||
var IsExtensible = require('./IsExtensible'); | ||||
var ToPropertyDescriptor = require('./ToPropertyDescriptor'); | ||||
var Type = require('./Type'); | ||||
// https://www.ecma-international.org/ecma-262/6.0/#sec-testintegritylevel | ||||
module.exports = function TestIntegrityLevel(O, level) { | ||||
if (Type(O) !== 'Object') { | ||||
throw new $TypeError('Assertion failed: Type(O) is not Object'); | ||||
} | ||||
if (level !== 'sealed' && level !== 'frozen') { | ||||
throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`'); | ||||
} | ||||
var status = IsExtensible(O); | ||||
if (status) { | ||||
return false; | ||||
} | ||||
var theKeys = $gOPN(O); | ||||
return theKeys.length === 0 || every(theKeys, function (k) { | ||||
var currentDesc = $gOPD(O, k); | ||||
if (typeof currentDesc !== 'undefined') { | ||||
if (currentDesc.configurable) { | ||||
return false; | ||||
} | ||||
if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) { | ||||
return false; | ||||
} | ||||
} | ||||
return true; | ||||
}); | ||||
}; | ||||