diff --git a/test/annexB/language/expressions/object/__proto__-duplicate-computed.js b/test/annexB/language/expressions/object/__proto__-duplicate-computed.js new file mode 100644 index 0000000000000000000000000000000000000000..838511019ccb00e66355a389e8a8e5b9bef67edf --- /dev/null +++ b/test/annexB/language/expressions/object/__proto__-duplicate-computed.js @@ -0,0 +1,54 @@ +// Copyright (C) 2017 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-__proto__-property-names-in-object-initializers +es6id: B.3.1 +description: > + The syntax error for duplicate `__proto__` property is not valid if the duplicate is a + ComputedPropertyName +info: | + B.3.1__proto__ Property Names in Object Initializers + + It is a Syntax Error if PropertyNameList of PropertyDefinitionList contains any duplicate + entries for "__proto__" and at least two of those entries were obtained from productions of + the form + PropertyDefinition : PropertyName : AssignmentExpression . + + 12.2.6.6 Static Semantics: PropertyNameList + + ... + 3. Append PropName of PropertyDefinition to the end of list. + ... + + 12.2.6.5 Static Semantics: PropName + + ComputedPropertyName : [ AssignmentExpression ] + 1. Return empty. +---*/ + +var obj; +var proto = {}; +var ownProp = {}; + +obj = { + __proto__: proto, + ['__proto__']: {}, + ['__proto__']: ownProp +}; + +assert.sameValue( + Object.getPrototypeOf(obj), + proto, + 'prototype is defined' +); + +assert( + Object.hasOwnProperty.call(obj, '__proto__'), + 'has own property __proto__' +); + +assert.sameValue( + obj.__proto__, + ownProp, + 'own property value' +); diff --git a/test/language/expressions/object/computed-__proto__.js b/test/language/expressions/object/computed-__proto__.js new file mode 100644 index 0000000000000000000000000000000000000000..a4040ed31d7a43b182b5b87a2185ddf5cd68a768 --- /dev/null +++ b/test/language/expressions/object/computed-__proto__.js @@ -0,0 +1,177 @@ +// Copyright (C) 2017 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: prod-PropertyDefinition +description: > + computed __proto__ property key is assigned to an own property +info: | + 12.2.6 Object Initializer + + PropertyDefinition[Yield, Await] : + PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await] + + PropertyName[Yield, Await] : + LiteralPropertyName + ComputedPropertyName[?Yield, ?Await] + + ComputedPropertyName[Yield, Await] : + [ AssignmentExpression[+In, ?Yield, ?Await] ] + + B.3.1__proto__ Property Names in Object Initializers + + ... + 5. If propKey is the String value "__proto__" and if IsComputedPropertyKey(propKey) + is false, then + a. If Type(propValue) is either Object or Null, then + i. Return object.[[SetPrototypeOf]](propValue). + b. Return NormalCompletion(empty). +---*/ + +var obj; +var sample = {}; + +obj = { + ['__proto__']: sample +}; +assert.sameValue( + Object.getPrototypeOf(obj), + Object.prototype, + 'does not change the object prototype (ordinary object)' +); +assert( + obj.hasOwnProperty('__proto__'), + 'computed __proto__ property is set as an own property (ordinary object)' +); +assert.sameValue( + obj.__proto__, + sample, + 'value is properly defined (ordinary object)' +); + +obj = { + ['__proto__']: null +}; +assert.sameValue( + Object.getPrototypeOf(obj), + Object.prototype, + 'does not change the object prototype (null)' +); +assert( + obj.hasOwnProperty('__proto__'), + 'computed __proto__ property is set as an own property (null)' +); +assert.sameValue( + obj.__proto__, + null, + 'value is properly defined (null)' +); + +obj = { + ['__proto__']: undefined +}; +assert.sameValue( + Object.getPrototypeOf(obj), + Object.prototype, + 'does not change the object prototype (undefined)' +); +assert( + obj.hasOwnProperty('__proto__'), + 'computed __proto__ property is set as an own property (undefined)' +); +assert.sameValue( + obj.__proto__, + undefined, + 'value is properly defined (undefined)' +); + +var func = function() {}; +obj = { + ['__proto__']: func +}; +assert.sameValue( + Object.getPrototypeOf(obj), + Object.prototype, + 'does not change the object prototype (func)' +); +assert( + obj.hasOwnProperty('__proto__'), + 'computed __proto__ property is set as an own property (func)' +); +assert.sameValue( + obj.__proto__, + func, + 'value is properly defined (func)' +); + +var symbol = Symbol('Leo'); +obj = { + ['__proto__']: symbol +}; +assert.sameValue( + Object.getPrototypeOf(obj), + Object.prototype, + 'does not change the object prototype (symbol)' +); +assert( + obj.hasOwnProperty('__proto__'), + 'computed __proto__ property is set as an own property (symbol)' +); +assert.sameValue( + obj.__proto__, + symbol, + 'value is properly defined (symbol)' +); + +obj = { + ['__proto__']: 42 +}; +assert.sameValue( + Object.getPrototypeOf(obj), + Object.prototype, + 'does not change the object prototype (number)' +); +assert( + obj.hasOwnProperty('__proto__'), + 'computed __proto__ property is set as an own property (number)' +); +assert.sameValue( + obj.__proto__, + 42, + 'value is properly defined (number)' +); + +obj = { + ['__proto__']: '' +}; +assert.sameValue( + Object.getPrototypeOf(obj), + Object.prototype, + 'does not change the object prototype (string)' +); +assert( + obj.hasOwnProperty('__proto__'), + 'computed __proto__ property is set as an own property (string)' +); +assert.sameValue( + obj.__proto__, + '', + 'value is properly defined (string)' +); + +obj = { + ['__proto__']: false +}; +assert.sameValue( + Object.getPrototypeOf(obj), + Object.prototype, + 'does not change the object prototype (boolean)' +); +assert( + obj.hasOwnProperty('__proto__'), + 'computed __proto__ property is set as an own property (boolean)' +); +assert.sameValue( + obj.__proto__, + false, + 'value is properly defined (boolean)' +);