| Index: test/mjsunit/set-prototype-of.js | 
| diff --git a/test/mjsunit/set-prototype-of.js b/test/mjsunit/set-prototype-of.js | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..02bd5e2ee62272b1acc22e31abffdf82e9fa5ebf | 
| --- /dev/null | 
| +++ b/test/mjsunit/set-prototype-of.js | 
| @@ -0,0 +1,170 @@ | 
| +// Copyright 2014 the V8 project authors. All rights reserved. | 
| +// Redistribution and use in source and binary forms, with or without | 
| +// modification, are permitted provided that the following conditions are | 
| +// met: | 
| +// | 
| +//     * Redistributions of source code must retain the above copyright | 
| +//       notice, this list of conditions and the following disclaimer. | 
| +//     * Redistributions in binary form must reproduce the above | 
| +//       copyright notice, this list of conditions and the following | 
| +//       disclaimer in the documentation and/or other materials provided | 
| +//       with the distribution. | 
| +//     * Neither the name of Google Inc. nor the names of its | 
| +//       contributors may be used to endorse or promote products derived | 
| +//       from this software without specific prior written permission. | 
| +// | 
| +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
| +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
| +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
| +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
| +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
| +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
| +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
| +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
| +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
| +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
| +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| + | 
| +// Flags: --harmony-symbols | 
| + | 
| + | 
| +function getObjects() { | 
| +  function func() {} | 
| +  return [ | 
| +    func, | 
| +    new func(), | 
| +    {x: 5}, | 
| +    /regexp/, | 
| +    ['array'], | 
| +    // new Error(), | 
| +    new Date(), | 
| +    new Number(1), | 
| +    new Boolean(true), | 
| +    new String('str'), | 
| +    Object(Symbol()) | 
| +  ]; | 
| +} | 
| + | 
| + | 
| +var coercibleValues = [ | 
| +  1, | 
| +  true, | 
| +  'string', | 
| +  Symbol() | 
| +]; | 
| + | 
| + | 
| +var nonCoercibleValues = [ | 
| +  undefined, | 
| +  null | 
| +]; | 
| + | 
| + | 
| +var valuesWithoutNull = coercibleValues.concat(undefined); | 
| + | 
| + | 
| +function TestSetPrototypeOfCoercibleValues() { | 
| +  for (var i = 0; i < coercibleValues.length; i++) { | 
| +    var value = coercibleValues[i]; | 
| +    assertThrows(function() { | 
| +      Object.getPrototypeOf(value); | 
| +    }, TypeError); | 
| + | 
| +    assertEquals(Object.setPrototypeOf(value, {}), value); | 
| + | 
| +    assertThrows(function() { | 
| +      Object.getPrototypeOf(value); | 
| +    }, TypeError); | 
| +  } | 
| +} | 
| +TestSetPrototypeOfCoercibleValues(); | 
| + | 
| + | 
| +function TestSetPrototypeOfNonCoercibleValues() { | 
| +  for (var i = 0; i < nonCoercibleValues.length; i++) { | 
| +    var value = nonCoercibleValues[i]; | 
| +    assertThrows(function() { | 
| +      Object.setPrototypeOf(value, {}); | 
| +    }, TypeError); | 
| +  } | 
| +} | 
| +TestSetPrototypeOfNonCoercibleValues(); | 
| + | 
| + | 
| +function TestSetPrototypeToNonObject(proto) { | 
| +  var objects = getObjects(); | 
| +  for (var i = 0; i < objects.length; i++) { | 
| +    var object = objects[i]; | 
| +    for (var j = 0; j < valuesWithoutNull.length; j++) { | 
| +      var proto = valuesWithoutNull[j]; | 
| +      assertThrows(function() { | 
| +        Object.setPrototypeOf(object, proto); | 
| +      }, TypeError); | 
| +    } | 
| +  } | 
| +} | 
| +TestSetPrototypeToNonObject(); | 
| + | 
| + | 
| +function TestSetPrototypeOf(object, proto) { | 
| +  assertEquals(Object.setPrototypeOf(object, proto), object); | 
| +  assertEquals(Object.getPrototypeOf(object), proto); | 
| +} | 
| + | 
| + | 
| +function TestSetPrototypeOfForObjects() { | 
| +  var objects1 = getObjects(); | 
| +  var objects2 = getObjects(); | 
| +  for (var i = 0; i < objects1.length; i++) { | 
| +    for (var j = 0; j < objects2.length; j++) { | 
| +      TestSetPrototypeOf(objects1[i], objects2[j]); | 
| +    } | 
| +  } | 
| +} | 
| +TestSetPrototypeOfForObjects(); | 
| + | 
| + | 
| +function TestSetPrototypeToNull() { | 
| +  var objects = getObjects(); | 
| +  for (var i = 0; i < objects.length; i++) { | 
| +    TestSetPrototypeOf(objects[i], null); | 
| +  } | 
| +} | 
| +TestSetPrototypeToNull(); | 
| + | 
| + | 
| +function TestSetPrototypeOfNonExtensibleObject() { | 
| +  var objects = getObjects(); | 
| +  var proto = {}; | 
| +  for (var i = 0; i < objects.length; i++) { | 
| +    var object = objects[i]; | 
| +    Object.preventExtensions(object); | 
| +    assertThrows(function() { | 
| +      Object.setPrototypeOf(object, proto); | 
| +    }, TypeError); | 
| +  } | 
| +} | 
| +TestSetPrototypeOfNonExtensibleObject(); | 
| + | 
| + | 
| +function TestLookup() { | 
| +  var object = {}; | 
| +  assertFalse('x' in object); | 
| +  assertFalse('y' in object); | 
| + | 
| +  var oldProto = { | 
| +    x: 'old x', | 
| +    y: 'old y' | 
| +  }; | 
| +  Object.setPrototypeOf(object, oldProto); | 
| +  assertEquals(object.x, 'old x'); | 
| +  assertEquals(object.y, 'old y'); | 
| + | 
| +  var newProto = { | 
| +    x: 'new x' | 
| +  }; | 
| +  Object.setPrototypeOf(object, newProto); | 
| +  assertEquals(object.x, 'new x'); | 
| +  assertFalse('y' in object); | 
| +} | 
| +TestLookup(); | 
|  |