X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/14957cd040308e3eeec43d26bae5d76da13fcd85..217a6308cd6a1dc049a0bb69263bd4c91f91c4d0:/runtime/Lookup.cpp diff --git a/runtime/Lookup.cpp b/runtime/Lookup.cpp index 25b516e..030aef5 100644 --- a/runtime/Lookup.cpp +++ b/runtime/Lookup.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 2012 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,10 +22,11 @@ #include "Executable.h" #include "JSFunction.h" +#include "Operations.h" namespace JSC { -void HashTable::createTable(JSGlobalData* globalData) const +void HashTable::createTable(VM* vm) const { ASSERT(!table); int linkIndex = compactHashSizeMask + 1; @@ -33,7 +34,7 @@ void HashTable::createTable(JSGlobalData* globalData) const for (int i = 0; i < compactSize; ++i) entries[i].setKey(0); for (int i = 0; values[i].key; ++i) { - StringImpl* identifier = Identifier::add(globalData, values[i].key).leakRef(); + StringImpl* identifier = Identifier::add(vm, values[i].key).leakRef(); int hashIndex = identifier->existingHash() & compactHashSizeMask; HashEntry* entry = &entries[hashIndex]; @@ -46,11 +47,7 @@ void HashTable::createTable(JSGlobalData* globalData) const entry = entry->next(); } - entry->initialize(identifier, values[i].attributes, values[i].value1, values[i].value2 -#if ENABLE(JIT) - , values[i].generator -#endif - ); + entry->initialize(identifier, values[i].attributes, values[i].value1, values[i].value2, values[i].intrinsic); } table = entries; } @@ -68,28 +65,27 @@ void HashTable::deleteTable() const } } -void setUpStaticFunctionSlot(ExecState* exec, const HashEntry* entry, JSObject* thisObj, const Identifier& propertyName, PropertySlot& slot) +bool setUpStaticFunctionSlot(ExecState* exec, const HashEntry* entry, JSObject* thisObj, PropertyName propertyName, PropertySlot& slot) { - ASSERT(thisObj->structure()->anonymousSlotCount() > 0); - ASSERT(thisObj->getAnonymousValue(0).isCell() && asObject(thisObj->getAnonymousValue(0).asCell())->isGlobalObject()); + ASSERT(thisObj->globalObject()); ASSERT(entry->attributes() & Function); - WriteBarrierBase* location = thisObj->getDirectLocation(exec->globalData(), propertyName); + PropertyOffset offset = thisObj->getDirectOffset(exec->vm(), propertyName); - if (!location) { - JSFunction* function; - JSGlobalObject* globalObject = asGlobalObject(thisObj->getAnonymousValue(0).asCell()); -#if ENABLE(JIT) && ENABLE(JIT_OPTIMIZE_NATIVE_CALL) - if (entry->generator()) - function = new (exec) JSFunction(exec, globalObject, globalObject->functionStructure(), entry->functionLength(), propertyName, exec->globalData().getHostFunction(entry->function(), entry->generator())); - else -#endif - function = new (exec) JSFunction(exec, globalObject, globalObject->functionStructure(), entry->functionLength(), propertyName, entry->function()); - - thisObj->putDirectFunction(exec->globalData(), propertyName, function, entry->attributes()); - location = thisObj->getDirectLocation(exec->globalData(), propertyName); + if (!isValidOffset(offset)) { + // If a property is ever deleted from an object with a static table, then we reify + // all static functions at that time - after this we shouldn't be re-adding anything. + if (thisObj->staticFunctionsReified()) + return false; + + thisObj->putDirectNativeFunction( + exec, thisObj->globalObject(), propertyName, entry->functionLength(), + entry->function(), entry->intrinsic(), entry->attributes()); + offset = thisObj->getDirectOffset(exec->vm(), propertyName); + ASSERT(isValidOffset(offset)); } - slot.setValue(thisObj, location->get(), thisObj->offsetForLocation(location)); + slot.setValue(thisObj, thisObj->getDirect(offset), offset); + return true; } } // namespace JSC