X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..14957cd040308e3eeec43d26bae5d76da13fcd85:/runtime/Lookup.cpp diff --git a/runtime/Lookup.cpp b/runtime/Lookup.cpp index 98133a8..25b516e 100644 --- a/runtime/Lookup.cpp +++ b/runtime/Lookup.cpp @@ -20,33 +20,21 @@ #include "config.h" #include "Lookup.h" -#include "PrototypeFunction.h" +#include "Executable.h" +#include "JSFunction.h" namespace JSC { void HashTable::createTable(JSGlobalData* globalData) const { -#if ENABLE(PERFECT_HASH_SIZE) - ASSERT(!table); - HashEntry* entries = new HashEntry[hashSizeMask + 1]; - for (int i = 0; i <= hashSizeMask; ++i) - entries[i].setKey(0); - for (int i = 0; values[i].key; ++i) { - UString::Rep* identifier = Identifier::add(globalData, values[i].key).releaseRef(); - int hashIndex = identifier->computedHash() & hashSizeMask; - ASSERT(!entries[hashIndex].key()); - entries[hashIndex].initialize(identifier, values[i].attributes, values[i].value1, values[i].value2); - } - table = entries; -#else ASSERT(!table); int linkIndex = compactHashSizeMask + 1; HashEntry* entries = new HashEntry[compactSize]; for (int i = 0; i < compactSize; ++i) entries[i].setKey(0); for (int i = 0; values[i].key; ++i) { - UString::Rep* identifier = Identifier::add(globalData, values[i].key).releaseRef(); - int hashIndex = identifier->computedHash() & compactHashSizeMask; + StringImpl* identifier = Identifier::add(globalData, values[i].key).leakRef(); + int hashIndex = identifier->existingHash() & compactHashSizeMask; HashEntry* entry = &entries[hashIndex]; if (entry->key()) { @@ -58,22 +46,21 @@ void HashTable::createTable(JSGlobalData* globalData) const entry = entry->next(); } - entry->initialize(identifier, values[i].attributes, values[i].value1, values[i].value2); + entry->initialize(identifier, values[i].attributes, values[i].value1, values[i].value2 +#if ENABLE(JIT) + , values[i].generator +#endif + ); } table = entries; -#endif } void HashTable::deleteTable() const { if (table) { -#if ENABLE(PERFECT_HASH_SIZE) - int max = hashSizeMask + 1; -#else int max = compactSize; -#endif for (int i = 0; i != max; ++i) { - if (UString::Rep* key = table[i].key()) + if (StringImpl* key = table[i].key()) key->deref(); } delete [] table; @@ -83,16 +70,26 @@ void HashTable::deleteTable() const void setUpStaticFunctionSlot(ExecState* exec, const HashEntry* entry, JSObject* thisObj, const Identifier& propertyName, PropertySlot& slot) { + ASSERT(thisObj->structure()->anonymousSlotCount() > 0); + ASSERT(thisObj->getAnonymousValue(0).isCell() && asObject(thisObj->getAnonymousValue(0).asCell())->isGlobalObject()); ASSERT(entry->attributes() & Function); - JSValuePtr* location = thisObj->getDirectLocation(propertyName); + WriteBarrierBase* location = thisObj->getDirectLocation(exec->globalData(), propertyName); if (!location) { - PrototypeFunction* function = new (exec) PrototypeFunction(exec, entry->functionLength(), propertyName, entry->function()); - thisObj->putDirect(propertyName, function, entry->attributes()); - location = thisObj->getDirectLocation(propertyName); + 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); } - slot.setValueSlot(thisObj, location, thisObj->offsetForLocation(location)); + slot.setValue(thisObj, location->get(), thisObj->offsetForLocation(location)); } } // namespace JSC