11805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 21805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// Redistribution and use in source and binary forms, with or without 31805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// modification, are permitted provided that the following conditions are 41805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// met: 51805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// 61805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// * Redistributions of source code must retain the above copyright 71805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// notice, this list of conditions and the following disclaimer. 81805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// * Redistributions in binary form must reproduce the above 91805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// copyright notice, this list of conditions and the following 101805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// disclaimer in the documentation and/or other materials provided 111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// with the distribution. 121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// * Neither the name of Google Inc. nor the names of its 131805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// contributors may be used to endorse or promote products derived 141805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// from this software without specific prior written permission. 151805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// 161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 191805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 201805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 211805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 221805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 231805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 241805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 251805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 261805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 271805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org 281805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// Flags: --expose-natives-as=builtins 291805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org 30f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org// Checks that all function properties of the builtin object that are actually 311805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// constructors (recognized by having properties on their .prototype object), 321805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// have only unconfigurable properties on the prototype, and the methods 331805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// are also non-writable. 341805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org 351805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgvar names = Object.getOwnPropertyNames(builtins); 361805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org 371805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction isFunction(obj) { 381805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org return typeof obj == "function"; 391805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org} 401805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org 41cdbcce18778eb3df29e0aebc9743531b2be9956dmachenbach@chromium.orgfunction isV8Native(name) { 42cdbcce18778eb3df29e0aebc9743531b2be9956dmachenbach@chromium.org return name == "GeneratorFunctionPrototype" || 43cdbcce18778eb3df29e0aebc9743531b2be9956dmachenbach@chromium.org name == "SetIterator" || 448640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org name == "MapIterator" || 458640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org name == "ArrayIterator" || 468640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org name == "StringIterator"; 47cdbcce18778eb3df29e0aebc9743531b2be9956dmachenbach@chromium.org} 48cdbcce18778eb3df29e0aebc9743531b2be9956dmachenbach@chromium.org 491805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction checkConstructor(func, name) { 501805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org // A constructor is a function with a prototype and properties on the 511805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org // prototype object besides "constructor"; 521805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org if (name.charAt(0) == "$") return; 531805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org if (typeof func.prototype != "object") return; 541805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org var propNames = Object.getOwnPropertyNames(func.prototype); 551805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org if (propNames.length == 0 || 561805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org (propNames.length == 1 && propNames[0] == "constructor")) { 571805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org // Not a constructor. 581805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org return; 591805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org } 601805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org var proto_desc = Object.getOwnPropertyDescriptor(func, "prototype"); 611805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertTrue(proto_desc.hasOwnProperty("value"), name); 621805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertFalse(proto_desc.writable, name); 631805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertFalse(proto_desc.configurable, name); 641805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org var prototype = proto_desc.value; 65cdbcce18778eb3df29e0aebc9743531b2be9956dmachenbach@chromium.org assertEquals(isV8Native(name) ? Object.prototype : null, 66e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Object.getPrototypeOf(prototype), 67e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org name); 681805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org for (var i = 0; i < propNames.length; i++) { 691805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org var propName = propNames[i]; 701805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org if (propName == "constructor") continue; 71cdbcce18778eb3df29e0aebc9743531b2be9956dmachenbach@chromium.org if (isV8Native(name)) continue; 721805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org var testName = name + "-" + propName; 731805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org var propDesc = Object.getOwnPropertyDescriptor(prototype, propName); 741805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertTrue(propDesc.hasOwnProperty("value"), testName); 751805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertFalse(propDesc.configurable, testName); 761805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org if (isFunction(propDesc.value)) { 771805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertFalse(propDesc.writable, testName); 781805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org } 791805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org } 801805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org} 811805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org 821805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfor (var i = 0; i < names.length; i++) { 831805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org var name = names[i]; 841805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org var desc = Object.getOwnPropertyDescriptor(builtins, name); 851805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertTrue(desc.hasOwnProperty("value")); 861805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org var value = desc.value; 871805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org if (isFunction(value)) { 881805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org checkConstructor(value, name); 891805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org } 901805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org} 91