Roll out r145838
authormhahnenberg@apple.com <mhahnenberg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Mar 2013 21:52:35 +0000 (21:52 +0000)
committermhahnenberg@apple.com <mhahnenberg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Mar 2013 21:52:35 +0000 (21:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=112458

Unreviewed. Requested by Filip Pizlo.

Source/JavaScriptCore:

* CMakeLists.txt:
* DerivedSources.make:
* DerivedSources.pri:
* GNUmakefile.list.am:
* dfg/DFGOperations.cpp:
* interpreter/CallFrame.h:
(JSC::ExecState::objectPrototypeTable):
* jit/JITStubs.cpp:
(JSC::getByVal):
* llint/LLIntSlowPaths.cpp:
(JSC::LLInt::getByVal):
* runtime/CommonIdentifiers.h:
* runtime/JSCell.cpp:
(JSC):
* runtime/JSCell.h:
(JSCell):
* runtime/JSCellInlines.h:
(JSC):
(JSC::JSCell::fastGetOwnProperty):
* runtime/JSGlobalData.cpp:
(JSC):
(JSC::JSGlobalData::JSGlobalData):
(JSC::JSGlobalData::~JSGlobalData):
* runtime/JSGlobalData.h:
(JSGlobalData):
* runtime/JSObject.cpp:
(JSC):
* runtime/JSObject.h:
(JSObject):
(JSC):
* runtime/Lookup.cpp:
(JSC::setUpStaticFunctionSlot):
* runtime/ObjectPrototype.cpp:
(JSC):
(JSC::ObjectPrototype::finishCreation):
(JSC::ObjectPrototype::getOwnPropertySlot):
(JSC::ObjectPrototype::getOwnPropertyDescriptor):
* runtime/ObjectPrototype.h:
(JSC::ObjectPrototype::create):
(ObjectPrototype):
* runtime/PropertyMapHashTable.h:
(JSC::PropertyTable::findWithString):
* runtime/Structure.h:
(Structure):
* runtime/StructureInlines.h:
(JSC::Structure::get):

LayoutTests:

* fast/js/regress/script-tests/string-lookup-hit-identifier.js: Removed.
* fast/js/regress/script-tests/string-lookup-hit.js: Removed.
* fast/js/regress/script-tests/string-lookup-miss.js: Removed.
* fast/js/regress/string-lookup-hit-expected.txt: Removed.
* fast/js/regress/string-lookup-hit-identifier-expected.txt: Removed.
* fast/js/regress/string-lookup-hit-identifier.html: Removed.
* fast/js/regress/string-lookup-hit.html: Removed.
* fast/js/regress/string-lookup-miss-expected.txt: Removed.
* fast/js/regress/string-lookup-miss.html: Removed.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@145945 268f45cc-cd09-0410-ab3c-d52691b4dbfc

33 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/js/regress/script-tests/string-lookup-hit-identifier.js [deleted file]
LayoutTests/fast/js/regress/script-tests/string-lookup-hit.js [deleted file]
LayoutTests/fast/js/regress/script-tests/string-lookup-miss.js [deleted file]
LayoutTests/fast/js/regress/string-lookup-hit-expected.txt [deleted file]
LayoutTests/fast/js/regress/string-lookup-hit-identifier-expected.txt [deleted file]
LayoutTests/fast/js/regress/string-lookup-hit-identifier.html [deleted file]
LayoutTests/fast/js/regress/string-lookup-hit.html [deleted file]
LayoutTests/fast/js/regress/string-lookup-miss-expected.txt [deleted file]
LayoutTests/fast/js/regress/string-lookup-miss.html [deleted file]
Source/JavaScriptCore/CMakeLists.txt
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/DerivedSources.make
Source/JavaScriptCore/DerivedSources.pri
Source/JavaScriptCore/GNUmakefile.list.am
Source/JavaScriptCore/dfg/DFGOperations.cpp
Source/JavaScriptCore/interpreter/CallFrame.h
Source/JavaScriptCore/jit/JITStubs.cpp
Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
Source/JavaScriptCore/runtime/CommonIdentifiers.h
Source/JavaScriptCore/runtime/JSCell.cpp
Source/JavaScriptCore/runtime/JSCell.h
Source/JavaScriptCore/runtime/JSCellInlines.h
Source/JavaScriptCore/runtime/JSGlobalData.cpp
Source/JavaScriptCore/runtime/JSGlobalData.h
Source/JavaScriptCore/runtime/JSObject.cpp
Source/JavaScriptCore/runtime/JSObject.h
Source/JavaScriptCore/runtime/Lookup.cpp
Source/JavaScriptCore/runtime/ObjectPrototype.cpp
Source/JavaScriptCore/runtime/ObjectPrototype.h
Source/JavaScriptCore/runtime/PropertyMapHashTable.h
Source/JavaScriptCore/runtime/Structure.h
Source/JavaScriptCore/runtime/StructureInlines.h

index 99d8976..3f8498c 100644 (file)
@@ -1,3 +1,20 @@
+2013-03-15  Mark Hahnenberg  <mhahnenberg@apple.com>
+
+        Roll out r145838
+        https://bugs.webkit.org/show_bug.cgi?id=112458
+
+        Unreviewed. Requested by Filip Pizlo.
+
+        * fast/js/regress/script-tests/string-lookup-hit-identifier.js: Removed.
+        * fast/js/regress/script-tests/string-lookup-hit.js: Removed.
+        * fast/js/regress/script-tests/string-lookup-miss.js: Removed.
+        * fast/js/regress/string-lookup-hit-expected.txt: Removed.
+        * fast/js/regress/string-lookup-hit-identifier-expected.txt: Removed.
+        * fast/js/regress/string-lookup-hit-identifier.html: Removed.
+        * fast/js/regress/string-lookup-hit.html: Removed.
+        * fast/js/regress/string-lookup-miss-expected.txt: Removed.
+        * fast/js/regress/string-lookup-miss.html: Removed.
+
 2013-03-15  Rouslan Solomakhin  <rouslan@chromium.org>
 
         Move setAsynchronousSpellCheckingEnabled to internals.settings
diff --git a/LayoutTests/fast/js/regress/script-tests/string-lookup-hit-identifier.js b/LayoutTests/fast/js/regress/script-tests/string-lookup-hit-identifier.js
deleted file mode 100644 (file)
index 6bee1ea..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-var result = (function(){
-    var o = {};
-    for (var i = 0; i < 100; ++i)
-        o["a" + i] = 42;
-    var result = [];
-    var strings = [];
-    for (var i = 0; i < 100; ++i)
-        strings.push("a" + i);
-    for (var j = 0; j < 1000; ++j) {
-        for (var i = 0; i < 100; ++i)
-            result.push(o[strings[i]]);
-    }
-    return result.length;
-})();
-
-if (result != 100000)
-    throw "Error: bad result: " + result;
diff --git a/LayoutTests/fast/js/regress/script-tests/string-lookup-hit.js b/LayoutTests/fast/js/regress/script-tests/string-lookup-hit.js
deleted file mode 100644 (file)
index 37d9e7f..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-var result = (function(){
-    var o = {};
-    for (var i = 0; i < 100; ++i)
-        o["a" + i] = 42;
-    var result = [];
-    for (var j = 0; j < 1000; ++j) {
-        for (var i = 0; i < 100; ++i)
-            result.push(o["a" + i]);
-    }
-    return result.length;
-})();
-
-if (result != 100000)
-    throw "Error: bad result: " + result;
diff --git a/LayoutTests/fast/js/regress/script-tests/string-lookup-miss.js b/LayoutTests/fast/js/regress/script-tests/string-lookup-miss.js
deleted file mode 100644 (file)
index 19114df..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-var result = (function(){
-    var o = {};
-    for (var i = 0; i < 100; ++i)
-        o["a" + i] = 42;
-    var result = [];
-    for (var i = 0; i < 100000; ++i)
-        result.push(o["a" + i]);
-    return result.length;
-})();
-
-if (result != 100000)
-    throw "Error: bad result: " + result;
diff --git a/LayoutTests/fast/js/regress/string-lookup-hit-expected.txt b/LayoutTests/fast/js/regress/string-lookup-hit-expected.txt
deleted file mode 100644 (file)
index d92d2cd..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-JSRegress/string-lookup-hit
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS no exception thrown
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/LayoutTests/fast/js/regress/string-lookup-hit-identifier-expected.txt b/LayoutTests/fast/js/regress/string-lookup-hit-identifier-expected.txt
deleted file mode 100644 (file)
index d5f1d7f..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-JSRegress/string-lookup-hit-identifier
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS no exception thrown
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/LayoutTests/fast/js/regress/string-lookup-hit-identifier.html b/LayoutTests/fast/js/regress/string-lookup-hit-identifier.html
deleted file mode 100644 (file)
index 9ea00d5..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-<head>
-<script src="../resources/js-test-pre.js"></script>
-</head>
-<body>
-<script src="resources/regress-pre.js"></script>
-<script src="script-tests/string-lookup-hit-identifier.js"></script>
-<script src="resources/regress-post.js"></script>
-<script src="../resources/js-test-post.js"></script>
-</body>
-</html>
diff --git a/LayoutTests/fast/js/regress/string-lookup-hit.html b/LayoutTests/fast/js/regress/string-lookup-hit.html
deleted file mode 100644 (file)
index 914d125..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-<head>
-<script src="../resources/js-test-pre.js"></script>
-</head>
-<body>
-<script src="resources/regress-pre.js"></script>
-<script src="script-tests/string-lookup-hit.js"></script>
-<script src="resources/regress-post.js"></script>
-<script src="../resources/js-test-post.js"></script>
-</body>
-</html>
diff --git a/LayoutTests/fast/js/regress/string-lookup-miss-expected.txt b/LayoutTests/fast/js/regress/string-lookup-miss-expected.txt
deleted file mode 100644 (file)
index 12fffc5..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-JSRegress/string-lookup-miss
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS no exception thrown
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/LayoutTests/fast/js/regress/string-lookup-miss.html b/LayoutTests/fast/js/regress/string-lookup-miss.html
deleted file mode 100644 (file)
index b96ba51..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-<head>
-<script src="../resources/js-test-pre.js"></script>
-</head>
-<body>
-<script src="resources/regress-pre.js"></script>
-<script src="script-tests/string-lookup-miss.js"></script>
-<script src="resources/regress-post.js"></script>
-<script src="../resources/js-test-post.js"></script>
-</body>
-</html>
index 8b3b66f..9119120 100644 (file)
@@ -329,6 +329,7 @@ set(JavaScriptCore_LUT_FILES
     runtime/NumberConstructor.cpp
     runtime/NumberPrototype.cpp
     runtime/ObjectConstructor.cpp
+    runtime/ObjectPrototype.cpp
     runtime/RegExpConstructor.cpp
     runtime/RegExpObject.cpp
     runtime/RegExpPrototype.cpp
index b2832f5..e194cf4 100644 (file)
@@ -1,3 +1,57 @@
+2013-03-15  Mark Hahnenberg  <mhahnenberg@apple.com>
+
+        Roll out r145838
+        https://bugs.webkit.org/show_bug.cgi?id=112458
+
+        Unreviewed. Requested by Filip Pizlo.
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * DerivedSources.pri:
+        * GNUmakefile.list.am:
+        * dfg/DFGOperations.cpp:
+        * interpreter/CallFrame.h:
+        (JSC::ExecState::objectPrototypeTable):
+        * jit/JITStubs.cpp:
+        (JSC::getByVal):
+        * llint/LLIntSlowPaths.cpp:
+        (JSC::LLInt::getByVal):
+        * runtime/CommonIdentifiers.h:
+        * runtime/JSCell.cpp:
+        (JSC):
+        * runtime/JSCell.h:
+        (JSCell):
+        * runtime/JSCellInlines.h:
+        (JSC):
+        (JSC::JSCell::fastGetOwnProperty):
+        * runtime/JSGlobalData.cpp:
+        (JSC):
+        (JSC::JSGlobalData::JSGlobalData):
+        (JSC::JSGlobalData::~JSGlobalData):
+        * runtime/JSGlobalData.h:
+        (JSGlobalData):
+        * runtime/JSObject.cpp:
+        (JSC):
+        * runtime/JSObject.h:
+        (JSObject):
+        (JSC):
+        * runtime/Lookup.cpp:
+        (JSC::setUpStaticFunctionSlot):
+        * runtime/ObjectPrototype.cpp:
+        (JSC):
+        (JSC::ObjectPrototype::finishCreation):
+        (JSC::ObjectPrototype::getOwnPropertySlot):
+        (JSC::ObjectPrototype::getOwnPropertyDescriptor):
+        * runtime/ObjectPrototype.h:
+        (JSC::ObjectPrototype::create):
+        (ObjectPrototype):
+        * runtime/PropertyMapHashTable.h:
+        (JSC::PropertyTable::findWithString):
+        * runtime/Structure.h:
+        (Structure):
+        * runtime/StructureInlines.h:
+        (JSC::Structure::get):
+
 2013-03-15  Michael Saboff  <msaboff@apple.com>
 
         Cleanup of DFG and Baseline JIT debugging code
index 55a76e2..4c3b81e 100644 (file)
@@ -50,6 +50,7 @@ all : \
     NumberConstructor.lut.h \
     NumberPrototype.lut.h \
     ObjectConstructor.lut.h \
+    ObjectPrototype.lut.h \
     RegExpConstructor.lut.h \
     RegExpPrototype.lut.h \
     RegExpJitTables.h \
index d637569..8bbc29d 100644 (file)
@@ -20,6 +20,7 @@ LUT_FILES += \
     runtime/NumberConstructor.cpp \
     runtime/NumberPrototype.cpp \
     runtime/ObjectConstructor.cpp \
+    runtime/ObjectPrototype.cpp \
     runtime/RegExpConstructor.cpp \
     runtime/RegExpObject.cpp \
     runtime/RegExpPrototype.cpp \
index f418387..e63c78a 100644 (file)
@@ -24,6 +24,7 @@ javascriptcore_built_nosources += \
        DerivedSources/JavaScriptCore/NumberConstructor.lut.h \
        DerivedSources/JavaScriptCore/NumberPrototype.lut.h \
        DerivedSources/JavaScriptCore/ObjectConstructor.lut.h \
+   DerivedSources/JavaScriptCore/ObjectPrototype.lut.h \
        DerivedSources/JavaScriptCore/RegExpConstructor.lut.h \
        DerivedSources/JavaScriptCore/RegExpObject.lut.h \
        DerivedSources/JavaScriptCore/RegExpPrototype.lut.h \
index 454a519..4ccb911 100644 (file)
@@ -424,17 +424,19 @@ EncodedJSValue DFG_OPERATION operationGetByVal(ExecState* exec, EncodedJSValue e
     if (LIKELY(baseValue.isCell())) {
         JSCell* base = baseValue.asCell();
 
-        if (property.isUInt32())
+        if (property.isUInt32()) {
             return getByVal(exec, base, property.asUInt32());
-        if (property.isDouble()) {
+        } else if (property.isDouble()) {
             double propertyAsDouble = property.asDouble();
             uint32_t propertyAsUInt32 = static_cast<uint32_t>(propertyAsDouble);
             if (propertyAsUInt32 == propertyAsDouble)
                 return getByVal(exec, base, propertyAsUInt32);
-        } else if (property.isString())
-            return JSValue::encode(base->getByString(exec, asString(property)->value(exec)));
+        } else if (property.isString()) {
+            if (JSValue result = base->fastGetOwnProperty(exec, asString(property)->value(exec)))
+                return JSValue::encode(result);
+        }
     }
-    
+
     if (isName(property))
         return JSValue::encode(baseValue.get(exec, jsCast<NameInstance*>(property.asCell())->privateName()));
 
@@ -451,13 +453,15 @@ EncodedJSValue DFG_OPERATION operationGetByValCell(ExecState* exec, JSCell* base
 
     if (property.isUInt32())
         return getByVal(exec, base, property.asUInt32());
-    else if (property.isDouble()) {
+    if (property.isDouble()) {
         double propertyAsDouble = property.asDouble();
         uint32_t propertyAsUInt32 = static_cast<uint32_t>(propertyAsDouble);
         if (propertyAsUInt32 == propertyAsDouble)
             return getByVal(exec, base, propertyAsUInt32);
-    } else if (property.isString())
-        return JSValue::encode(base->getByString(exec, asString(property)->value(exec)));
+    } else if (property.isString()) {
+        if (JSValue result = base->fastGetOwnProperty(exec, asString(property)->value(exec)))
+            return JSValue::encode(result);
+    }
 
     if (isName(property))
         return JSValue::encode(JSValue(base).get(exec, jsCast<NameInstance*>(property.asCell())->privateName()));
index 9852b31..743f18d 100644 (file)
@@ -90,6 +90,7 @@ namespace JSC  {
         static const HashTable* numberConstructorTable(CallFrame* callFrame) { return callFrame->globalData().numberConstructorTable; }
         static const HashTable* numberPrototypeTable(CallFrame* callFrame) { return callFrame->globalData().numberPrototypeTable; }
         static const HashTable* objectConstructorTable(CallFrame* callFrame) { return callFrame->globalData().objectConstructorTable; }
+        static const HashTable* objectPrototypeTable(CallFrame* callFrame) { return callFrame->globalData().objectPrototypeTable; }
         static const HashTable* privateNamePrototypeTable(CallFrame* callFrame) { return callFrame->globalData().privateNamePrototypeTable; }
         static const HashTable* regExpTable(CallFrame* callFrame) { return callFrame->globalData().regExpTable; }
         static const HashTable* regExpConstructorTable(CallFrame* callFrame) { return callFrame->globalData().regExpConstructorTable; }
index 793551c..d3da846 100644 (file)
@@ -2417,8 +2417,10 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_construct_NotJSConstruct)
 static JSValue getByVal(
     CallFrame* callFrame, JSValue baseValue, JSValue subscript, ReturnAddressPtr returnAddress)
 {
-    if (LIKELY(baseValue.isCell() && subscript.isString()))
-        return baseValue.asCell()->getByString(callFrame, asString(subscript)->value(callFrame));
+    if (LIKELY(baseValue.isCell() && subscript.isString())) {
+        if (JSValue result = baseValue.asCell()->fastGetOwnProperty(callFrame, asString(subscript)->value(callFrame)))
+            return result;
+    }
 
     if (subscript.isUInt32()) {
         uint32_t i = subscript.asUInt32();
index 504b80d..c630cbc 100644 (file)
@@ -1060,8 +1060,10 @@ LLINT_SLOW_PATH_DECL(slow_path_del_by_id)
 
 inline JSValue getByVal(ExecState* exec, JSValue baseValue, JSValue subscript)
 {
-    if (LIKELY(baseValue.isCell() && subscript.isString()))
-        return baseValue.asCell()->getByString(exec, asString(subscript)->value(exec));
+    if (LIKELY(baseValue.isCell() && subscript.isString())) {
+        if (JSValue result = baseValue.asCell()->fastGetOwnProperty(exec, asString(subscript)->value(exec)))
+            return result;
+    }
     
     if (subscript.isUInt32()) {
         uint32_t i = subscript.asUInt32();
index fa9eeb0..93f7914 100644 (file)
     macro(valueOf) \
     macro(writable) \
     macro(displayName) \
-    macro(join) \
-    macro(__defineGetter__) \
-    macro(__defineSetter__) \
-    macro(__lookupGetter__) \
-    macro(__lookupSetter__)
+    macro(join)
 
 #define JSC_COMMON_IDENTIFIERS_EACH_KEYWORD(macro) \
     macro(null) \
index 215b4d5..da142e4 100644 (file)
@@ -227,10 +227,4 @@ bool JSCell::getOwnPropertyDescriptor(JSObject*, ExecState*, PropertyName, Prope
     return false;
 }
 
-JSValue JSCell::getByStringSlow(ExecState* exec, const String& name)
-{
-    Identifier ident(&exec->globalData(), name);
-    return JSValue(this).get(exec, ident);
-}
-
 } // namespace JSC
index 3a764c5..5342288 100644 (file)
@@ -122,8 +122,7 @@ public:
     // call this function, not its slower virtual counterpart. (For integer
     // property names, we want a similar interface with appropriate optimizations.)
     bool fastGetOwnPropertySlot(ExecState*, PropertyName, PropertySlot&);
-    
-    JSValue getByString(ExecState*, const String&);
+    JSValue fastGetOwnProperty(ExecState*, const String&);
 
     static ptrdiff_t structureOffset()
     {
@@ -162,10 +161,6 @@ protected:
 
 private:
     friend class LLIntOffsetsExtractor;
-    
-    template<typename KeyType>
-    JSValue getByStringAndKey(ExecState*, const String&, const KeyType&);
-    JSValue getByStringSlow(ExecState*, const String&);
         
     WriteBarrier<Structure> m_structure;
 };
index 6b04e3a..c87a02e 100644 (file)
@@ -169,46 +169,20 @@ ALWAYS_INLINE bool JSCell::fastGetOwnPropertySlot(ExecState* exec, PropertyName
     return methodTable()->getOwnPropertySlot(this, exec, propertyName, slot);
 }
 
-template<typename KeyType>
-ALWAYS_INLINE JSValue JSCell::getByStringAndKey(ExecState* exec, const String& name, const KeyType& key)
-{
-    JSCell* cell = this;
-    
-    while (true) {
-        if (UNLIKELY(cell->structure()->typeInfo().overridesGetOwnPropertySlot()))
-            return getByStringSlow(exec, name);
-        
-        unsigned attributes;
-        PropertyOffset offset = cell->structure()->get(exec->globalData(), key, attributes);
-        if (offset != invalidOffset) {
-            if (attributes & Accessor)
-                return cell->getByStringSlow(exec, name);
-            return asObject(cell)->getDirect(offset);
-        }
-        
-        JSValue prototype = cell->structure()->storedPrototype();
-        if (!prototype.isObject())
-            break;
-        cell = asObject(prototype);
-    }
-    
-    // Make sure we aren't going after indexed storage, and if we are, then just use that.
-    unsigned index = toUInt32FromStringImpl(name.impl());
-    if (index == PropertyName::NotAnIndex)
-        return jsUndefined();
-    
-    return JSValue(this).get(exec, index);
-}
-
 // Fast call to get a property where we may not yet have converted the string to an
 // identifier. The first time we perform a property access with a given string, try
 // performing the property map lookup without forming an identifier. We detect this
 // case by checking whether the hash has yet been set for this string.
-ALWAYS_INLINE JSValue JSCell::getByString(ExecState* exec, const String& name)
-{
-    if (name.impl()->hasHash())
-        return getByStringAndKey(exec, name, Identifier(exec, name));
-    return getByStringAndKey(exec, name, name);
+ALWAYS_INLINE JSValue JSCell::fastGetOwnProperty(ExecState* exec, const String& name)
+{
+    if (!structure()->typeInfo().overridesGetOwnPropertySlot() && !structure()->hasGetterSetterProperties()) {
+        PropertyOffset offset = name.impl()->hasHash()
+            ? structure()->get(exec->globalData(), Identifier(exec, name))
+            : structure()->get(exec->globalData(), name);
+        if (offset != invalidOffset)
+            return asObject(this)->locationForOffset(offset)->get();
+    }
+    return JSValue();
 }
 
 inline bool JSCell::toBoolean(ExecState* exec) const
index 36f2ffd..508a876 100644 (file)
@@ -93,6 +93,7 @@ extern const HashTable mathTable;
 extern const HashTable numberConstructorTable;
 extern const HashTable numberPrototypeTable;
 JS_EXPORTDATA extern const HashTable objectConstructorTable;
+extern const HashTable objectPrototypeTable;
 extern const HashTable privateNamePrototypeTable;
 extern const HashTable regExpTable;
 extern const HashTable regExpConstructorTable;
@@ -154,6 +155,7 @@ JSGlobalData::JSGlobalData(GlobalDataType globalDataType, HeapType heapType)
     , numberConstructorTable(fastNew<HashTable>(JSC::numberConstructorTable))
     , numberPrototypeTable(fastNew<HashTable>(JSC::numberPrototypeTable))
     , objectConstructorTable(fastNew<HashTable>(JSC::objectConstructorTable))
+    , objectPrototypeTable(fastNew<HashTable>(JSC::objectPrototypeTable))
     , privateNamePrototypeTable(fastNew<HashTable>(JSC::privateNamePrototypeTable))
     , regExpTable(fastNew<HashTable>(JSC::regExpTable))
     , regExpConstructorTable(fastNew<HashTable>(JSC::regExpConstructorTable))
@@ -284,6 +286,7 @@ JSGlobalData::~JSGlobalData()
     numberConstructorTable->deleteTable();
     numberPrototypeTable->deleteTable();
     objectConstructorTable->deleteTable();
+    objectPrototypeTable->deleteTable();
     privateNamePrototypeTable->deleteTable();
     regExpTable->deleteTable();
     regExpConstructorTable->deleteTable();
@@ -303,6 +306,7 @@ JSGlobalData::~JSGlobalData()
     fastDelete(const_cast<HashTable*>(numberConstructorTable));
     fastDelete(const_cast<HashTable*>(numberPrototypeTable));
     fastDelete(const_cast<HashTable*>(objectConstructorTable));
+    fastDelete(const_cast<HashTable*>(objectPrototypeTable));
     fastDelete(const_cast<HashTable*>(privateNamePrototypeTable));
     fastDelete(const_cast<HashTable*>(regExpTable));
     fastDelete(const_cast<HashTable*>(regExpConstructorTable));
index 570d85d..fad9ce6 100644 (file)
@@ -226,6 +226,7 @@ namespace JSC {
         const HashTable* numberConstructorTable;
         const HashTable* numberPrototypeTable;
         const HashTable* objectConstructorTable;
+        const HashTable* objectPrototypeTable;
         const HashTable* privateNamePrototypeTable;
         const HashTable* regExpTable;
         const HashTable* regExpConstructorTable;
index bd88b4d..78ba279 100644 (file)
@@ -2202,16 +2202,6 @@ bool JSObject::putDirectIndexBeyondVectorLength(ExecState* exec, unsigned i, JSV
     }
 }
 
-void JSObject::putDirectNativeFunction(ExecState* exec, JSGlobalObject* globalObject, const PropertyName& propertyName, unsigned functionLength, NativeFunction nativeFunction, Intrinsic intrinsic, unsigned attributes)
-{
-    StringImpl* name = propertyName.publicName();
-    ASSERT(name);
-    
-    JSFunction* function =
-        JSFunction::create(exec, globalObject, functionLength, name, nativeFunction, intrinsic);
-    putDirect(exec->globalData(), propertyName, function, attributes);
-}
-
 ALWAYS_INLINE unsigned JSObject::getNewVectorLength(unsigned currentVectorLength, unsigned currentLength, unsigned desiredLength)
 {
     ASSERT(desiredLength <= MAX_STORAGE_VECTOR_LENGTH);
index ebd5592..b7a7330 100644 (file)
@@ -565,8 +565,6 @@ public:
     void putDirect(JSGlobalData& globalData, PropertyOffset offset, JSValue value) { locationForOffset(offset)->set(globalData, this, value); }
     void putDirectUndefined(PropertyOffset offset) { locationForOffset(offset)->setUndefined(); }
 
-    void putDirectNativeFunction(ExecState*, JSGlobalObject*, const PropertyName&, unsigned functionLength, NativeFunction, Intrinsic, unsigned attributes);
-
     JS_EXPORT_PRIVATE static bool defineOwnProperty(JSObject*, ExecState*, PropertyName, PropertyDescriptor&, bool shouldThrow);
 
     bool isGlobalObject() const;
@@ -702,7 +700,7 @@ protected:
         ASSERT(structure()->isObject());
         ASSERT(classInfo());
     }
-    
+
     static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
     {
         return Structure::create(globalData, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), &s_info);
@@ -911,7 +909,6 @@ private:
     // Nobody should ever ask any of these questions on something already known to be a JSObject.
     using JSCell::isAPIValueWrapper;
     using JSCell::isGetterSetter;
-
     void getObject();
     void getString(ExecState* exec);
     void isObject();
@@ -1452,14 +1449,6 @@ inline int offsetRelativeToBase(PropertyOffset offset)
 
 COMPILE_ASSERT(!(sizeof(JSObject) % sizeof(WriteBarrierBase<Unknown>)), JSObject_inline_storage_has_correct_alignment);
 
-// Helper for defining native functions, if you're not using a static hash table.
-// Use this macro from within finishCreation() methods in prototypes. This assumes
-// you've defined variables called exec, globalObject, and globalData, and they
-// have the expected meanings. This also assumes that the function you're defining
-// doesn't have an intrinsic.
-#define JSC_NATIVE_FUNCTION(jsName, cppName, attributes, length) \
-    putDirectNativeFunction(exec, globalObject, globalData.propertyNames->jsName, (length), cppName, NoIntrinsic, (attributes))
-
 } // namespace JSC
 
 #endif // JSObject_h
index 546668b..067c5c0 100644 (file)
@@ -77,9 +77,11 @@ bool setUpStaticFunctionSlot(ExecState* exec, const HashEntry* entry, JSObject*
         if (thisObj->staticFunctionsReified())
             return false;
     
-        thisObj->putDirectNativeFunction(
-            exec, thisObj->globalObject(), propertyName, entry->functionLength(),
-            entry->function(), entry->intrinsic(), entry->attributes());
+        StringImpl* name = propertyName.publicName();
+        ASSERT(name);
+        
+        JSFunction* function = JSFunction::create(exec, thisObj->globalObject(), entry->functionLength(), name, entry->function(), entry->intrinsic());
+        thisObj->putDirect(exec->globalData(), propertyName, function, entry->attributes());
         offset = thisObj->getDirectOffset(exec->globalData(), propertyName);
         ASSERT(isValidOffset(offset));
     }
index 1625e43..3342e71 100644 (file)
@@ -40,40 +40,51 @@ static EncodedJSValue JSC_HOST_CALL objectProtoFuncLookupSetter(ExecState*);
 static EncodedJSValue JSC_HOST_CALL objectProtoFuncPropertyIsEnumerable(ExecState*);
 static EncodedJSValue JSC_HOST_CALL objectProtoFuncToLocaleString(ExecState*);
 
+}
+
+#include "ObjectPrototype.lut.h"
+
+namespace JSC {
+
 ASSERT_HAS_TRIVIAL_DESTRUCTOR(ObjectPrototype);
 
-const ClassInfo ObjectPrototype::s_info = { "Object", &JSNonFinalObject::s_info, 0, 0, CREATE_METHOD_TABLE(ObjectPrototype) };
+const ClassInfo ObjectPrototype::s_info = { "Object", &JSNonFinalObject::s_info, 0, ExecState::objectPrototypeTable, CREATE_METHOD_TABLE(ObjectPrototype) };
+
+/* Source for ObjectPrototype.lut.h
+@begin objectPrototypeTable
+  toString              objectProtoFuncToString                 DontEnum|Function 0
+  toLocaleString        objectProtoFuncToLocaleString           DontEnum|Function 0
+  valueOf               objectProtoFuncValueOf                  DontEnum|Function 0
+  hasOwnProperty        objectProtoFuncHasOwnProperty           DontEnum|Function 1
+  propertyIsEnumerable  objectProtoFuncPropertyIsEnumerable     DontEnum|Function 1
+  isPrototypeOf         objectProtoFuncIsPrototypeOf            DontEnum|Function 1
+  __defineGetter__      objectProtoFuncDefineGetter             DontEnum|Function 2
+  __defineSetter__      objectProtoFuncDefineSetter             DontEnum|Function 2
+  __lookupGetter__      objectProtoFuncLookupGetter             DontEnum|Function 1
+  __lookupSetter__      objectProtoFuncLookupSetter             DontEnum|Function 1
+@end
+*/
 
 ObjectPrototype::ObjectPrototype(ExecState* exec, Structure* stucture)
     : JSNonFinalObject(exec->globalData(), stucture)
 {
 }
 
-void ObjectPrototype::finishCreation(ExecState* exec, JSGlobalObject* globalObject)
+void ObjectPrototype::finishCreation(JSGlobalData& globalData, JSGlobalObject*)
 {
-    JSGlobalData& globalData = exec->globalData();
-    
     Base::finishCreation(globalData);
     ASSERT(inherits(&s_info));
     globalData.prototypeMap.addPrototype(this);
-    
-    JSC_NATIVE_FUNCTION(toString, objectProtoFuncToString, DontEnum, 0);
-    JSC_NATIVE_FUNCTION(toLocaleString, objectProtoFuncToLocaleString, DontEnum, 0);
-    JSC_NATIVE_FUNCTION(valueOf, objectProtoFuncValueOf, DontEnum, 0);
-    JSC_NATIVE_FUNCTION(hasOwnProperty, objectProtoFuncHasOwnProperty, DontEnum, 1);
-    JSC_NATIVE_FUNCTION(propertyIsEnumerable, objectProtoFuncPropertyIsEnumerable, DontEnum, 1);
-    JSC_NATIVE_FUNCTION(isPrototypeOf, objectProtoFuncIsPrototypeOf, DontEnum, 1);
-    JSC_NATIVE_FUNCTION(__defineGetter__, objectProtoFuncDefineGetter, DontEnum, 2);
-    JSC_NATIVE_FUNCTION(__defineSetter__, objectProtoFuncDefineSetter, DontEnum, 2);
-    JSC_NATIVE_FUNCTION(__lookupGetter__, objectProtoFuncLookupGetter, DontEnum, 1);
-    JSC_NATIVE_FUNCTION(__lookupSetter__, objectProtoFuncLookupSetter, DontEnum, 1);
 }
 
-ObjectPrototype* ObjectPrototype::create(ExecState* exec, JSGlobalObject* globalObject, Structure* structure)
+bool ObjectPrototype::getOwnPropertySlot(JSCell* cell, ExecState* exec, PropertyName propertyName, PropertySlot &slot)
+{
+    return getStaticFunctionSlot<JSNonFinalObject>(exec, ExecState::objectPrototypeTable(exec), jsCast<ObjectPrototype*>(cell), propertyName, slot);
+}
+
+bool ObjectPrototype::getOwnPropertyDescriptor(JSObject* object, ExecState* exec, PropertyName propertyName, PropertyDescriptor& descriptor)
 {
-    ObjectPrototype* prototype = new (NotNull, allocateCell<ObjectPrototype>(*exec->heap())) ObjectPrototype(exec, structure);
-    prototype->finishCreation(exec, globalObject);
-    return prototype;
+    return getStaticFunctionDescriptor<JSNonFinalObject>(exec, ExecState::objectPrototypeTable(exec), jsCast<ObjectPrototype*>(object), propertyName, descriptor);
 }
 
 // ------------------------------ Functions --------------------------------
index dc287ea..e3551d6 100644 (file)
@@ -29,7 +29,12 @@ namespace JSC {
     public:
         typedef JSNonFinalObject Base;
 
-        static ObjectPrototype* create(ExecState*, JSGlobalObject*, Structure*);
+        static ObjectPrototype* create(ExecState* exec, JSGlobalObject* globalObject, Structure* structure)
+        {
+            ObjectPrototype* prototype = new (NotNull, allocateCell<ObjectPrototype>(*exec->heap())) ObjectPrototype(exec, structure);
+            prototype->finishCreation(exec->globalData(), globalObject);
+            return prototype;
+        }
 
         static const ClassInfo s_info;
 
@@ -39,10 +44,14 @@ namespace JSC {
         }
 
     protected:
-        void finishCreation(ExecState*, JSGlobalObject*);
+        static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSNonFinalObject::StructureFlags;
+
+        void finishCreation(JSGlobalData&, JSGlobalObject*);
 
     private:
         ObjectPrototype(ExecState*, Structure*);
+        static bool getOwnPropertySlot(JSCell*, ExecState*, PropertyName, PropertySlot&);
+        static bool getOwnPropertyDescriptor(JSObject*, ExecState*, PropertyName, PropertyDescriptor&);
     };
 
     JS_EXPORT_PRIVATE EncodedJSValue JSC_HOST_CALL objectProtoFuncToString(ExecState*);
index 9fa91bb..54e2973 100644 (file)
@@ -311,7 +311,7 @@ inline PropertyTable::find_iterator PropertyTable::find(const KeyType& key)
 inline PropertyTable::find_iterator PropertyTable::findWithString(const KeyType& key)
 {
     ASSERT(key);
-    ASSERT(!key->isIdentifier());
+    ASSERT(!key->isIdentifier() && !key->hasHash());
     unsigned hash = key->hash();
     unsigned step = 0;
 
index c669e08..f56877d 100644 (file)
@@ -233,8 +233,7 @@ public:
     bool masqueradesAsUndefined(JSGlobalObject* lexicalGlobalObject);
 
     PropertyOffset get(JSGlobalData&, PropertyName);
-    PropertyOffset get(JSGlobalData&, PropertyName, unsigned& attributes);
-    PropertyOffset get(JSGlobalData&, const WTF::String& name, unsigned& attributes);
+    PropertyOffset get(JSGlobalData&, const WTF::String& name);
     JS_EXPORT_PRIVATE PropertyOffset get(JSGlobalData&, PropertyName, unsigned& attributes, JSCell*& specificValue);
 
     bool hasGetterSetterProperties() const { return m_hasGetterSetterProperties; }
index 5da1dde..522e827 100644 (file)
@@ -69,22 +69,7 @@ inline PropertyOffset Structure::get(JSGlobalData& globalData, PropertyName prop
     return entry ? entry->offset : invalidOffset;
 }
 
-inline PropertyOffset Structure::get(JSGlobalData& globalData, PropertyName propertyName, unsigned& attributes)
-{
-    ASSERT(structure()->classInfo() == &s_info);
-    materializePropertyMapIfNecessary(globalData);
-    if (!propertyTable())
-        return invalidOffset;
-
-    PropertyMapEntry* entry = propertyTable()->find(propertyName.uid()).first;
-    if (!entry)
-        return invalidOffset;
-    
-    attributes = entry->attributes;
-    return entry->offset;
-}
-
-inline PropertyOffset Structure::get(JSGlobalData& globalData, const WTF::String& name, unsigned& attributes)
+inline PropertyOffset Structure::get(JSGlobalData& globalData, const WTF::String& name)
 {
     ASSERT(structure()->classInfo() == &s_info);
     materializePropertyMapIfNecessary(globalData);
@@ -92,11 +77,7 @@ inline PropertyOffset Structure::get(JSGlobalData& globalData, const WTF::String
         return invalidOffset;
 
     PropertyMapEntry* entry = propertyTable()->findWithString(name.impl()).first;
-    if (!entry)
-        return invalidOffset;
-
-    attributes = entry->attributes;
-    return entry->offset;
+    return entry ? entry->offset : invalidOffset;
 }
     
 inline bool Structure::masqueradesAsUndefined(JSGlobalObject* lexicalGlobalObject)