1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "PrototypeMap.h" 28 29#include "JSGlobalObject.h" 30#include "JSCInlines.h" 31 32namespace JSC { 33 34void PrototypeMap::addPrototype(JSObject* object) 35{ 36 m_prototypes.add(object, object); 37 38 // Note that this method makes the somewhat odd decision to not check if this 39 // object currently has indexed accessors. We could do that check here, and if 40 // indexed accessors were found, we could tell the global object to have a bad 41 // time. But we avoid this, to allow the following to be always fast: 42 // 43 // 1) Create an object. 44 // 2) Give it a setter or read-only property that happens to have a numeric name. 45 // 3) Allocate objects that use this object as a prototype. 46 // 47 // This avoids anyone having a bad time. Even if the instance objects end up 48 // having indexed storage, the creation of indexed storage leads to a prototype 49 // chain walk that detects the presence of indexed setters and then does the 50 // right thing. As a result, having a bad time only happens if you add an 51 // indexed setter (or getter, or read-only field) to an object that is already 52 // used as a prototype. 53} 54 55Structure* PrototypeMap::emptyObjectStructureForPrototype(JSObject* prototype, unsigned inlineCapacity) 56{ 57 StructureMap::AddResult addResult = m_structures.add(std::make_pair(prototype, inlineCapacity), nullptr); 58 if (!addResult.isNewEntry) { 59 ASSERT(isPrototype(prototype)); 60 return addResult.iterator->value.get(); 61 } 62 63 addPrototype(prototype); 64 Structure* structure = JSFinalObject::createStructure( 65 prototype->globalObject()->vm(), prototype->globalObject(), prototype, inlineCapacity); 66 addResult.iterator->value = Weak<Structure>(structure); 67 return structure; 68} 69 70void PrototypeMap::clearEmptyObjectStructureForPrototype(JSObject* object, unsigned inlineCapacity) 71{ 72 m_structures.remove(std::make_pair(object, inlineCapacity)); 73} 74 75} // namespace JSC 76