Skip to content

Commit

Permalink
some additional validations for `{Object, Reflect}.{defineProperty, g…
Browse files Browse the repository at this point in the history
…etOwnPropertyDescriptor}`
  • Loading branch information
zloirock committed Jan 24, 2016
1 parent 3d625c8 commit 2b40e0b
Show file tree
Hide file tree
Showing 15 changed files with 140 additions and 41 deletions.
6 changes: 5 additions & 1 deletion library/modules/_object-dp.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
var anObject = require('./_an-object')
, IE8_DOM_DEFINE = require('./_ie8-dom-define')
, toPrimitive = require('./_to-primitive')
, dP = Object.defineProperty;

exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){
anObject(O);
P = toPrimitive(P, true);
anObject(Attributes);
if(IE8_DOM_DEFINE)try {
return dP(O, P, Attributes);
} catch(e){ /* empty */ }
if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
if('value' in Attributes)anObject(O)[P] = Attributes.value;
if('value' in Attributes)O[P] = Attributes.value;
return O;
};
4 changes: 4 additions & 0 deletions library/modules/_object-gopd.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
var pIE = require('./_object-pie')
, createDesc = require('./_property-desc')
, toIObject = require('./_to-iobject')
, toPrimitive = require('./_to-primitive')
, has = require('./_has')
, IE8_DOM_DEFINE = require('./_ie8-dom-define')
, gOPD = Object.getOwnPropertyDescriptor;

exports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P){
O = toIObject(O);
P = toPrimitive(P, true);
if(IE8_DOM_DEFINE)try {
return gOPD(O, P);
} catch(e){ /* empty */ }
Expand Down
9 changes: 6 additions & 3 deletions library/modules/es6.reflect.define-property.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
var dP = require('./_object-dp')
, $export = require('./_export')
, anObject = require('./_an-object');
var dP = require('./_object-dp')
, $export = require('./_export')
, anObject = require('./_an-object')
, toPrimitive = require('./_to-primitive');

// MS Edge has broken Reflect.defineProperty - throwing instead of returning false
$export($export.S + $export.F * require('./_fails')(function(){
Reflect.defineProperty(dP.f({}, 1, {value: 1}), 1, {value: 2});
}), 'Reflect', {
defineProperty: function defineProperty(target, propertyKey, attributes){
anObject(target);
propertyKey = toPrimitive(propertyKey, true);
anObject(attributes);
try {
dP.f(target, propertyKey, attributes);
return true;
Expand Down
13 changes: 8 additions & 5 deletions library/modules/es6.symbol.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ var global = require('./_global')
, isArray = require('./_is-array')
, anObject = require('./_an-object')
, toIObject = require('./_to-iobject')
, toPrimitive = require('./_to-primitive')
, createDesc = require('./_property-desc')
, _create = require('./_object-create')
, gOPNExt = require('./_object-gopn-ext')
Expand Down Expand Up @@ -66,7 +67,10 @@ var isSymbol = function(it){
};

var $defineProperty = function defineProperty(it, key, D){
if(D && has(AllSymbols, key)){
anObject(it);
key = toPrimitive(key, true);
anObject(D);
if(has(AllSymbols, key)){
if(!D.enumerable){
if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));
it[HIDDEN][key] = true;
Expand All @@ -89,12 +93,11 @@ var $create = function create(it, P){
return P === undefined ? _create(it) : $defineProperties(_create(it), P);
};
var $propertyIsEnumerable = function propertyIsEnumerable(key){
var E = isEnum.call(this, key);
return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key]
? E : true;
var E = isEnum.call(this, key = toPrimitive(key, true));
return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
};
var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){
var D = gOPD(it = toIObject(it), key);
var D = gOPD(it = toIObject(it), key = toPrimitive(key, true));
if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
return D;
};
Expand Down
6 changes: 5 additions & 1 deletion modules/_object-dp.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
var anObject = require('./_an-object')
, IE8_DOM_DEFINE = require('./_ie8-dom-define')
, toPrimitive = require('./_to-primitive')
, dP = Object.defineProperty;

exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){
anObject(O);
P = toPrimitive(P, true);
anObject(Attributes);
if(IE8_DOM_DEFINE)try {
return dP(O, P, Attributes);
} catch(e){ /* empty */ }
if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
if('value' in Attributes)anObject(O)[P] = Attributes.value;
if('value' in Attributes)O[P] = Attributes.value;
return O;
};
4 changes: 4 additions & 0 deletions modules/_object-gopd.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
var pIE = require('./_object-pie')
, createDesc = require('./_property-desc')
, toIObject = require('./_to-iobject')
, toPrimitive = require('./_to-primitive')
, has = require('./_has')
, IE8_DOM_DEFINE = require('./_ie8-dom-define')
, gOPD = Object.getOwnPropertyDescriptor;

exports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P){
O = toIObject(O);
P = toPrimitive(P, true);
if(IE8_DOM_DEFINE)try {
return gOPD(O, P);
} catch(e){ /* empty */ }
Expand Down
9 changes: 6 additions & 3 deletions modules/es6.reflect.define-property.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
var dP = require('./_object-dp')
, $export = require('./_export')
, anObject = require('./_an-object');
var dP = require('./_object-dp')
, $export = require('./_export')
, anObject = require('./_an-object')
, toPrimitive = require('./_to-primitive');

// MS Edge has broken Reflect.defineProperty - throwing instead of returning false
$export($export.S + $export.F * require('./_fails')(function(){
Reflect.defineProperty(dP.f({}, 1, {value: 1}), 1, {value: 2});
}), 'Reflect', {
defineProperty: function defineProperty(target, propertyKey, attributes){
anObject(target);
propertyKey = toPrimitive(propertyKey, true);
anObject(attributes);
try {
dP.f(target, propertyKey, attributes);
return true;
Expand Down
13 changes: 8 additions & 5 deletions modules/es6.symbol.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ var global = require('./_global')
, isArray = require('./_is-array')
, anObject = require('./_an-object')
, toIObject = require('./_to-iobject')
, toPrimitive = require('./_to-primitive')
, createDesc = require('./_property-desc')
, _create = require('./_object-create')
, gOPNExt = require('./_object-gopn-ext')
Expand Down Expand Up @@ -66,7 +67,10 @@ var isSymbol = function(it){
};

var $defineProperty = function defineProperty(it, key, D){
if(D && has(AllSymbols, key)){
anObject(it);
key = toPrimitive(key, true);
anObject(D);
if(has(AllSymbols, key)){
if(!D.enumerable){
if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));
it[HIDDEN][key] = true;
Expand All @@ -89,12 +93,11 @@ var $create = function create(it, P){
return P === undefined ? _create(it) : $defineProperties(_create(it), P);
};
var $propertyIsEnumerable = function propertyIsEnumerable(key){
var E = isEnum.call(this, key);
return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key]
? E : true;
var E = isEnum.call(this, key = toPrimitive(key, true));
return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
};
var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){
var D = gOPD(it = toIObject(it), key);
var D = gOPD(it = toIObject(it), key = toPrimitive(key, true));
if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
return D;
};
Expand Down
31 changes: 25 additions & 6 deletions tests/es.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 24 additions & 5 deletions tests/library.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 5 additions & 2 deletions tests/library/es6.object.define-property.ls
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@
module \ES6

test 'Object.defineProperty' (assert)!->
{defineProperty} = core.Object
{defineProperty, create} = core.Object
assert.isFunction defineProperty
assert.arity defineProperty, 3
assert.ok (rez = defineProperty src = {}, \q, value: 42) is src
assert.ok rez.q is 42
assert.ok rez.q is 42
assert.throws (!-> defineProperty 42 1 {})
assert.throws (!-> defineProperty {} create(null), {})
assert.throws (!-> defineProperty {} 1 1)
6 changes: 5 additions & 1 deletion tests/library/es6.reflect.define-property.ls
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ module \ES6

test 'Reflect.defineProperty' (assert)->
{defineProperty} = core.Reflect
{create} = core.Object
assert.isFunction defineProperty
assert.arity defineProperty, 3
if \name of defineProperty
Expand All @@ -17,4 +18,7 @@ test 'Reflect.defineProperty' (assert)->
defineProperty O, \foo, {value: 123, enumerable: on}
assert.deepEqual getOwnPropertyDescriptor(O, \foo), {value: 123, enumerable: on, configurable: no, writable: no}
assert.strictEqual defineProperty(O, \foo, {value: 42}), no
assert.throws (-> defineProperty 42, \foo, {value: 42}), TypeError, 'throws on primitive'
assert.throws (!-> defineProperty 42, \foo, {value: 42}), TypeError, 'throws on primitive'
assert.throws (!-> defineProperty 42 1 {})
assert.throws (!-> defineProperty {} create(null), {})
assert.throws (!-> defineProperty {} 1 1)
Loading

0 comments on commit 2b40e0b

Please sign in to comment.