JavaScriptCore:
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 17 Aug 2008 20:23:49 +0000 (20:23 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 17 Aug 2008 20:23:49 +0000 (20:23 +0000)
2008-08-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Cameron Zwarich.

        Made room for a free word in JSCell.

        SunSpider says no change.

        I changed JSCallbackObjectData, Arguments, JSArray, and RegExpObject to
        store auxiliary data in a secondary structure.

        I changed InternalFunction to store the function's name in the property
        map.

        I changed JSGlobalObjectData to use a virtual destructor, so WebCore's
        JSDOMWindowBaseData could inherit from it safely. (It's a strange design
        for JSDOMWindowBase to allocate an object that JSGlobalObject deletes,
        but that's really our only option, given the size constraint.)

        I also added a bunch of compile-time ASSERTs, and removed lots of comments
        in JSObject.h because they were often out of date, and they got in the
        way of reading what was actually going on.

        Also renamed JSArray::getLength to JSArray::length, to match our style
        guidelines.

WebCore:

2008-08-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Cameron Zwarich.

        Made room for a free word in JSCell.

        Changed JSDOMWindowBase to store its auxiliary data in a subclass of
        JSGlobalData, so the two could share a pointer.

        Added a bunch of ASSERTs, to help catch over-sized objects.

WebKit/mac:

2008-08-17  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Cameron Zwarich.

        Made room for a free word in JSCell.

        (Updated for JavaScriptCore changes.)

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

85 files changed:
JavaScriptCore/API/JSCallbackFunction.cpp
JavaScriptCore/API/JSCallbackObject.cpp
JavaScriptCore/API/JSCallbackObject.h
JavaScriptCore/API/JSCallbackObjectFunctions.h
JavaScriptCore/ChangeLog
JavaScriptCore/JavaScriptCore.exp
JavaScriptCore/VM/JSPropertyNameIterator.cpp
JavaScriptCore/VM/Machine.cpp
JavaScriptCore/kjs/Arguments.cpp
JavaScriptCore/kjs/Arguments.h
JavaScriptCore/kjs/ArrayConstructor.cpp
JavaScriptCore/kjs/ArrayPrototype.cpp
JavaScriptCore/kjs/BooleanConstructor.cpp
JavaScriptCore/kjs/BooleanObject.cpp
JavaScriptCore/kjs/BooleanPrototype.cpp
JavaScriptCore/kjs/DateConstructor.cpp
JavaScriptCore/kjs/DatePrototype.cpp
JavaScriptCore/kjs/DebuggerCallFrame.cpp
JavaScriptCore/kjs/DebuggerCallFrame.h
JavaScriptCore/kjs/ErrorConstructor.cpp
JavaScriptCore/kjs/ErrorPrototype.cpp
JavaScriptCore/kjs/FunctionConstructor.cpp
JavaScriptCore/kjs/FunctionPrototype.cpp
JavaScriptCore/kjs/GlobalEvalFunction.cpp
JavaScriptCore/kjs/InternalFunction.cpp
JavaScriptCore/kjs/InternalFunction.h
JavaScriptCore/kjs/JSActivation.cpp
JavaScriptCore/kjs/JSArray.cpp
JavaScriptCore/kjs/JSArray.h
JavaScriptCore/kjs/JSCell.h
JavaScriptCore/kjs/JSFunction.cpp
JavaScriptCore/kjs/JSFunction.h
JavaScriptCore/kjs/JSGlobalObject.cpp
JavaScriptCore/kjs/JSGlobalObject.h
JavaScriptCore/kjs/JSNotAnObject.cpp
JavaScriptCore/kjs/JSObject.cpp
JavaScriptCore/kjs/JSObject.h
JavaScriptCore/kjs/JSStaticScopeObject.cpp
JavaScriptCore/kjs/JSWrapperObject.cpp
JavaScriptCore/kjs/MathObject.cpp
JavaScriptCore/kjs/NativeErrorConstructor.cpp
JavaScriptCore/kjs/NativeErrorPrototype.cpp
JavaScriptCore/kjs/NumberConstructor.cpp
JavaScriptCore/kjs/NumberObject.cpp
JavaScriptCore/kjs/NumberPrototype.cpp
JavaScriptCore/kjs/ObjectConstructor.cpp
JavaScriptCore/kjs/ObjectPrototype.cpp
JavaScriptCore/kjs/PrototypeFunction.cpp
JavaScriptCore/kjs/RegExpConstructor.cpp
JavaScriptCore/kjs/RegExpObject.cpp
JavaScriptCore/kjs/RegExpObject.h
JavaScriptCore/kjs/RegExpPrototype.cpp
JavaScriptCore/kjs/Shell.cpp
JavaScriptCore/kjs/StringConstructor.cpp
JavaScriptCore/kjs/StringObject.cpp
JavaScriptCore/kjs/StringPrototype.cpp
JavaScriptCore/kjs/collector.h
JavaScriptCore/profiler/Profiler.cpp
WebCore/ChangeLog
WebCore/WebCore.xcodeproj/project.pbxproj
WebCore/bindings/js/JSDOMWindowBase.cpp
WebCore/bindings/js/JSDOMWindowBase.h
WebCore/bindings/js/JSDOMWindowCustom.h
WebCore/bindings/js/JSDOMWindowShell.cpp
WebCore/bindings/js/JSEventListener.cpp
WebCore/bindings/js/JSEventTargetNode.cpp
WebCore/bindings/js/JSHTMLInputElementBase.cpp
WebCore/bindings/js/JSHTMLOptionElementConstructor.cpp
WebCore/bindings/js/JSImageConstructor.cpp
WebCore/bindings/js/JSInspectedObjectWrapper.cpp
WebCore/bindings/js/JSInspectorCallbackWrapper.cpp
WebCore/bindings/js/JSNSResolver.cpp
WebCore/bindings/js/JSNamedNodesCollection.cpp
WebCore/bindings/js/JSNamedNodesCollection.h
WebCore/bindings/js/JSNodeFilterCondition.cpp
WebCore/bindings/js/JSQuarantinedObjectWrapper.cpp
WebCore/bindings/js/JSRGBColor.cpp
WebCore/bindings/js/JSXMLHttpRequestConstructor.cpp
WebCore/bindings/js/JSXSLTProcessorConstructor.cpp
WebCore/bindings/scripts/CodeGeneratorJS.pm
WebCore/bridge/jni/jni_utility.cpp
WebCore/bridge/runtime_method.cpp
WebKit/mac/ChangeLog
WebKit/mac/WebView/WebScriptDebugger.mm
WebKit/mac/WebView/WebView.mm

index a05347e5714bfc0cfa97269fdaa2d753169bc365..0cc70b7c0b2db72978b42e5ea0f807f3558e18cb 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(JSCallbackFunction);
+
 const ClassInfo JSCallbackFunction::info = { "CallbackFunction", &InternalFunction::info, 0, 0 };
 
 JSCallbackFunction::JSCallbackFunction(ExecState* exec, JSObjectCallAsFunctionCallback callback, const Identifier& name)
-    : InternalFunction(exec->lexicalGlobalObject()->functionPrototype(), name)
+    : InternalFunction(exec, exec->lexicalGlobalObject()->functionPrototype(), name)
     , m_callback(callback)
 {
 }
index a462535f868643a49b36c357c88101f78d59fcaa..b4bfb0f74e743cb25911baca987f444b7e484591 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(JSCallbackObject<JSObject>);
+ASSERT_CLASS_FITS_IN_CELL(JSCallbackObject<JSGlobalObject>);
+
 // Define the two types of JSCallbackObjects we support.
 template <> const ClassInfo JSCallbackObject<JSObject>::info = { "CallbackObject", 0, 0, 0 };
 template <> const ClassInfo JSCallbackObject<JSGlobalObject>::info = { "CallbackGlobalObject", 0, 0, 0 };
 
-COMPILE_ASSERT(sizeof(JSCallbackObject<JSGlobalObject>) <= CELL_SIZE, global_callback_object_fits_in_cell);
-
 } // namespace KJS
index 00c0f07c1ac129bf1d81aa18de9c574e1fb53e09..6752e0f3d08bf243ed353df47c2cd9857dab238f 100644 (file)
@@ -46,7 +46,7 @@ public:
 
     static const ClassInfo info;
 
-    JSClassRef classRef() const { return m_class; }
+    JSClassRef classRef() const { return m_callbackObjectData->jsClass; }
     bool inherits(JSClassRef) const;
 
 private:
@@ -82,9 +82,25 @@ private:
     static JSValue* staticValueGetter(ExecState*, const Identifier&, const PropertySlot&);
     static JSValue* staticFunctionGetter(ExecState*, const Identifier&, const PropertySlot&);
     static JSValue* callbackGetter(ExecState*, const Identifier&, const PropertySlot&);
+
+    struct JSCallbackObjectData {
+        JSCallbackObjectData(void* privateData_, JSClassRef jsClass_)
+            : privateData(privateData_)
+            , jsClass(jsClass_)
+        {
+            JSClassRetain(jsClass);
+        }
+        
+        ~JSCallbackObjectData()
+        {
+            JSClassRelease(jsClass);
+        }
+        
+        void* privateData;
+        JSClassRef jsClass;
+    };
     
-    void* m_privateData;
-    JSClassRef m_class;
+    OwnPtr<JSCallbackObjectData> m_callbackObjectData;
 };
 
 } // namespace KJS
index 9ac5a62ca8ed9864876c3f27d7a5e84cf4da6d7a..dbf581d6243d2b76cec718225354254479345e89 100644 (file)
@@ -42,8 +42,7 @@ namespace KJS {
 template <class Base>
 JSCallbackObject<Base>::JSCallbackObject(ExecState* exec, JSClassRef jsClass, JSValue* prototype, void* data)
     : Base(prototype)
-    , m_privateData(data)
-    , m_class(JSClassRetain(jsClass))
+    , m_callbackObjectData(new JSCallbackObjectData(data, jsClass))
 {
     init(exec);
 }
@@ -52,8 +51,7 @@ JSCallbackObject<Base>::JSCallbackObject(ExecState* exec, JSClassRef jsClass, JS
 // FIXME: Move this into a separate JSGlobalCallbackObject class derived from this one.
 template <class Base>
 JSCallbackObject<Base>::JSCallbackObject(JSClassRef jsClass)
-    : m_privateData(0)
-    , m_class(JSClassRetain(jsClass))
+    : m_callbackObjectData(new JSCallbackObjectData(0, jsClass))
 {
     ASSERT(Base::isGlobalObject());
     init(static_cast<JSGlobalObject*>(this)->globalExec());
@@ -65,7 +63,7 @@ void JSCallbackObject<Base>::init(ExecState* exec)
     ASSERT(exec);
     
     Vector<JSObjectInitializeCallback, 16> initRoutines;
-    JSClassRef jsClass = m_class;
+    JSClassRef jsClass = classRef();
     do {
         if (JSObjectInitializeCallback initialize = jsClass->initialize)
             initRoutines.append(initialize);
@@ -83,18 +81,15 @@ JSCallbackObject<Base>::~JSCallbackObject()
 {
     JSObjectRef thisRef = toRef(this);
     
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)
-        if (JSObjectFinalizeCallback finalize = jsClass->finalize) {
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass)
+        if (JSObjectFinalizeCallback finalize = jsClass->finalize)
             finalize(thisRef);
-        }
-            
-    JSClassRelease(m_class);
 }
 
 template <class Base>
 UString JSCallbackObject<Base>::className() const
 {
-    UString thisClassName = m_class->className();
+    UString thisClassName = classRef()->className();
     if (!thisClassName.isNull())
         return thisClassName;
     
@@ -108,7 +103,7 @@ bool JSCallbackObject<Base>::getOwnPropertySlot(ExecState* exec, const Identifie
     JSObjectRef thisRef = toRef(this);
     RefPtr<OpaqueJSString> propertyNameRef;
     
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) {
         // optional optimization to bypass getProperty in cases when we only need to know if the property exists
         if (JSObjectHasPropertyCallback hasProperty = jsClass->hasProperty) {
             if (!propertyNameRef)
@@ -161,7 +156,7 @@ void JSCallbackObject<Base>::put(ExecState* exec, const Identifier& propertyName
     RefPtr<OpaqueJSString> propertyNameRef;
     JSValueRef valueRef = toRef(value);
     
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) {
         if (JSObjectSetPropertyCallback setProperty = jsClass->setProperty) {
             if (!propertyNameRef)
                 propertyNameRef = OpaqueJSString::create(propertyName.ustring());
@@ -209,7 +204,7 @@ bool JSCallbackObject<Base>::deleteProperty(ExecState* exec, const Identifier& p
     JSObjectRef thisRef = toRef(this);
     RefPtr<OpaqueJSString> propertyNameRef;
     
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) {
         if (JSObjectDeletePropertyCallback deleteProperty = jsClass->deleteProperty) {
             if (!propertyNameRef)
                 propertyNameRef = OpaqueJSString::create(propertyName.ustring());
@@ -246,7 +241,7 @@ bool JSCallbackObject<Base>::deleteProperty(ExecState* exec, unsigned propertyNa
 template <class Base>
 ConstructType JSCallbackObject<Base>::getConstructData(ConstructData& constructData)
 {
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) {
         if (jsClass->callAsConstructor) {
             constructData.native.function = construct;
             return ConstructTypeHost;
@@ -278,7 +273,7 @@ JSObject* JSCallbackObject<Base>::construct(ExecState* exec, JSObject* construct
 template <class Base>
 bool JSCallbackObject<Base>::implementsHasInstance() const
 {
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass)
         if (jsClass->hasInstance)
             return true;
     
@@ -291,7 +286,7 @@ bool JSCallbackObject<Base>::hasInstance(ExecState *exec, JSValue *value)
     JSContextRef execRef = toRef(exec);
     JSObjectRef thisRef = toRef(this);
     
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) {
         if (JSObjectHasInstanceCallback hasInstance = jsClass->hasInstance)
             return hasInstance(execRef, thisRef, toRef(value), toRef(exec->exceptionSlot()));
     }
@@ -302,7 +297,7 @@ bool JSCallbackObject<Base>::hasInstance(ExecState *exec, JSValue *value)
 template <class Base>
 CallType JSCallbackObject<Base>::getCallData(CallData& callData)
 {
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) {
         if (jsClass->callAsFunction) {
             callData.native.function = call;
             return CallTypeHost;
@@ -318,7 +313,7 @@ JSValue* JSCallbackObject<Base>::call(ExecState* exec, JSObject* functionObject,
     JSObjectRef functionRef = toRef(functionObject);
     JSObjectRef thisObjRef = toRef(thisValue->toThisObject(exec));
     
-    for (JSClassRef jsClass = static_cast<JSCallbackObject<Base>*>(functionObject)->m_class; jsClass; jsClass = jsClass->parentClass) {
+    for (JSClassRef jsClass = static_cast<JSCallbackObject<Base>*>(functionObject)->classRef(); jsClass; jsClass = jsClass->parentClass) {
         if (JSObjectCallAsFunctionCallback callAsFunction = jsClass->callAsFunction) {
             int argumentCount = static_cast<int>(args.size());
             Vector<JSValueRef, 16> arguments(argumentCount);
@@ -338,7 +333,7 @@ void JSCallbackObject<Base>::getPropertyNames(ExecState* exec, PropertyNameArray
     JSContextRef execRef = toRef(exec);
     JSObjectRef thisRef = toRef(this);
     
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass) {
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) {
         if (JSObjectGetPropertyNamesCallback getPropertyNames = jsClass->getPropertyNames)
             getPropertyNames(execRef, thisRef, toRef(&propertyNames));
         
@@ -379,7 +374,7 @@ double JSCallbackObject<Base>::toNumber(ExecState* exec) const
     JSContextRef ctx = toRef(exec);
     JSObjectRef thisRef = toRef(this);
     
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass)
         if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) {
             if (JSValueRef value = convertToType(ctx, thisRef, kJSTypeNumber, toRef(exec->exceptionSlot())))
                 return toJS(value)->getNumber();
@@ -394,7 +389,7 @@ UString JSCallbackObject<Base>::toString(ExecState* exec) const
     JSContextRef ctx = toRef(exec);
     JSObjectRef thisRef = toRef(this);
     
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass)
         if (JSObjectConvertToTypeCallback convertToType = jsClass->convertToType) {
             JSValueRef value = convertToType(ctx, thisRef, kJSTypeString, toRef(exec->exceptionSlot()));
             if (value)
@@ -407,19 +402,19 @@ UString JSCallbackObject<Base>::toString(ExecState* exec) const
 template <class Base>
 void JSCallbackObject<Base>::setPrivate(void* data)
 {
-    m_privateData = data;
+    m_callbackObjectData->privateData = data;
 }
 
 template <class Base>
 void* JSCallbackObject<Base>::getPrivate()
 {
-    return m_privateData;
+    return m_callbackObjectData->privateData;
 }
 
 template <class Base>
 bool JSCallbackObject<Base>::inherits(JSClassRef c) const
 {
-    for (JSClassRef jsClass = m_class; jsClass; jsClass = jsClass->parentClass)
+    for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass)
         if (jsClass == c)
             return true;
     
@@ -443,7 +438,7 @@ JSValue* JSCallbackObject<Base>::staticValueGetter(ExecState* exec, const Identi
     JSObjectRef thisRef = toRef(thisObj);
     RefPtr<OpaqueJSString> propertyNameRef;
     
-    for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parentClass)
+    for (JSClassRef jsClass = thisObj->classRef(); jsClass; jsClass = jsClass->parentClass)
         if (OpaqueJSClassStaticValuesTable* staticValues = jsClass->staticValues(exec))
             if (StaticValueEntry* entry = staticValues->get(propertyName.ustring().rep()))
                 if (JSObjectGetPropertyCallback getProperty = entry->getProperty) {
@@ -467,7 +462,7 @@ JSValue* JSCallbackObject<Base>::staticFunctionGetter(ExecState* exec, const Ide
     if (thisObj->Base::getOwnPropertySlot(exec, propertyName, slot2))
         return slot2.getValue(exec, propertyName);
     
-    for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parentClass) {
+    for (JSClassRef jsClass = thisObj->classRef(); jsClass; jsClass = jsClass->parentClass) {
         if (OpaqueJSClassStaticFunctionsTable* staticFunctions = jsClass->staticFunctions(exec)) {
             if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) {
                 if (JSObjectCallAsFunctionCallback callAsFunction = entry->callAsFunction) {
@@ -491,7 +486,7 @@ JSValue* JSCallbackObject<Base>::callbackGetter(ExecState* exec, const Identifie
     JSObjectRef thisRef = toRef(thisObj);
     RefPtr<OpaqueJSString> propertyNameRef;
     
-    for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parentClass)
+    for (JSClassRef jsClass = thisObj->classRef(); jsClass; jsClass = jsClass->parentClass)
         if (JSObjectGetPropertyCallback getProperty = jsClass->getProperty) {
             if (!propertyNameRef)
                 propertyNameRef = OpaqueJSString::create(propertyName.ustring());
index 74b10dbf8025ba9bb2ea90c3c87ec47ec6dafb43..35628571b6e4c2d6d8f0d1691ae2d379a046016a 100644 (file)
@@ -1,3 +1,29 @@
+2008-08-17  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Cameron Zwarich.
+
+        Made room for a free word in JSCell.
+        
+        SunSpider says no change.
+        
+        I changed JSCallbackObjectData, Arguments, JSArray, and RegExpObject to
+        store auxiliary data in a secondary structure.
+
+        I changed InternalFunction to store the function's name in the property
+        map.
+        
+        I changed JSGlobalObjectData to use a virtual destructor, so WebCore's
+        JSDOMWindowBaseData could inherit from it safely. (It's a strange design
+        for JSDOMWindowBase to allocate an object that JSGlobalObject deletes,
+        but that's really our only option, given the size constraint.)
+        
+        I also added a bunch of compile-time ASSERTs, and removed lots of comments
+        in JSObject.h because they were often out of date, and they got in the
+        way of reading what was actually going on.
+        
+        Also renamed JSArray::getLength to JSArray::length, to match our style
+        guidelines.
+
 2008-08-16  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Oliver Hunt.
index 02a2a6583db90fe9e79a2e839e63d8bf760f31b4..987df0839a0ec042d43b5feb5cf6eb57c742e046 100644 (file)
@@ -131,11 +131,8 @@ __ZN3KJS14JSGlobalObjectD2Ev
 __ZN3KJS14JSGlobalObjectnwEmPNS_12JSGlobalDataE
 __ZN3KJS14constructArrayEPNS_9ExecStateERKNS_7ArgListE
 __ZN3KJS15JSWrapperObject4markEv
-__ZN3KJS16InternalFunction14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
-__ZN3KJS16InternalFunction18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE
-__ZN3KJS16InternalFunction3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE
 __ZN3KJS16InternalFunction4infoE
-__ZN3KJS16InternalFunctionC2EPNS_17FunctionPrototypeERKNS_10IdentifierE
+__ZN3KJS16InternalFunctionC2EPNS_9ExecStateEPNS_17FunctionPrototypeERKNS_10IdentifierE
 __ZN3KJS16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
 __ZN3KJS16JSVariableObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE
 __ZN3KJS16JSVariableObject16setRegisterArrayEPNS_8RegisterEm
@@ -208,7 +205,7 @@ __ZN3KJS8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE
 __ZN3KJS8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
 __ZN3KJS8JSObject14deletePropertyEPNS_9ExecStateEj
 __ZN3KJS8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE
-__ZN3KJS8JSObject17putDirectFunctionEPNS_16InternalFunctionEj
+__ZN3KJS8JSObject17putDirectFunctionEPNS_9ExecStateEPNS_16InternalFunctionEj
 __ZN3KJS8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueEj
 __ZN3KJS8JSObject17putWithAttributesEPNS_9ExecStateEjPNS_7JSValueEj
 __ZN3KJS8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE
index 0c14ea01fdf3595f33368bb0f59603e317277594..b30a5e1908153daa2c0728d7a897ec4b791676d0 100644 (file)
@@ -36,7 +36,7 @@
 
 namespace KJS {
 
-COMPILE_ASSERT(sizeof(JSPropertyNameIterator) <= CellSize<sizeof(void*)>::m_value, JSPropertyNameIteratorSizeASSERT);
+ASSERT_CLASS_FITS_IN_CELL(JSPropertyNameIterator);
 
 JSPropertyNameIterator* JSPropertyNameIterator::create(ExecState* exec, JSValue* v)
 {
index cf1ffe886b158e8fe157698513887426c6280bdb..a7b0d0a7d3ba2bb3c6e927dd91c2e823c1906030 100644 (file)
@@ -645,7 +645,7 @@ NEVER_INLINE bool Machine::unwindCallFrame(ExecState* exec, JSValue* exceptionVa
     Register* callFrame = r - oldCodeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
 
     if (Debugger* debugger = exec->dynamicGlobalObject()->debugger()) {
-        DebuggerCallFrame debuggerCallFrame(exec->dynamicGlobalObject(), codeBlock, scopeChain, r, exceptionValue);
+        DebuggerCallFrame debuggerCallFrame(exec, exec->dynamicGlobalObject(), codeBlock, scopeChain, r, exceptionValue);
         if (callFrame[RegisterFile::Callee].jsValue(exec))
             debugger->returnEvent(debuggerCallFrame, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->lastLine());
         else
@@ -723,7 +723,7 @@ NEVER_INLINE Instruction* Machine::throwException(ExecState* exec, JSValue*& exc
     }
 
     if (Debugger* debugger = exec->dynamicGlobalObject()->debugger()) {
-        DebuggerCallFrame debuggerCallFrame(exec->dynamicGlobalObject(), codeBlock, scopeChain, r, exceptionValue);
+        DebuggerCallFrame debuggerCallFrame(exec, exec->dynamicGlobalObject(), codeBlock, scopeChain, r, exceptionValue);
         debugger->exception(debuggerCallFrame, codeBlock->ownerNode->sourceId(), codeBlock->lineNumberForVPC(vPC));
     }
 
@@ -955,7 +955,7 @@ NEVER_INLINE void Machine::debug(ExecState* exec, const Instruction* vPC, const
     if (!debugger)
         return;
 
-    DebuggerCallFrame debuggerCallFrame(exec->dynamicGlobalObject(), codeBlock, scopeChain, r, 0);
+    DebuggerCallFrame debuggerCallFrame(exec, exec->dynamicGlobalObject(), codeBlock, scopeChain, r, 0);
 
     switch((DebugHookID)debugHookID) {
     case DidEnterCallFrame: {
index 2519c282344df4f9a48dbde9ebae5b302aa3685b..5ab58783e1045ffa7f1e6996a482dd9102284642 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(Arguments);
+
 const ClassInfo Arguments::info = { "Arguments", 0, 0, 0 };
 
 // ECMA 10.1.8
 Arguments::Arguments(ExecState* exec, JSFunction* function, const ArgList& args, JSActivation* activation)
     : JSObject(exec->lexicalGlobalObject()->objectPrototype())
-    , m_activationObject(activation)
-    , m_indexToNameMap(function, args)
+    , d(new ArgumentsData(activation, function, args))
 {
+    ASSERT(activation);
+
     putDirect(exec->propertyNames().callee, function, DontEnum);
     putDirect(exec, exec->propertyNames().length, args.size(), DontEnum);
   
@@ -47,7 +50,7 @@ Arguments::Arguments(ExecState* exec, JSFunction* function, const ArgList& args,
     ArgList::const_iterator end = args.end();
     for (ArgList::const_iterator it = args.begin(); it != end; ++it, ++i) {
         Identifier name = Identifier::from(exec, i);
-        if (!m_indexToNameMap.isMapped(name))
+        if (!d->indexToNameMap.isMapped(name))
             putDirect(name, (*it).jsValue(exec), DontEnum);
     }
 }
@@ -55,19 +58,19 @@ Arguments::Arguments(ExecState* exec, JSFunction* function, const ArgList& args,
 void Arguments::mark() 
 {
     JSObject::mark();
-    if (m_activationObject && !m_activationObject->marked())
-        m_activationObject->mark();
+    if (!d->activation->marked())
+        d->activation->mark();
 }
 
 JSValue* Arguments::mappedIndexGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot)
 {
       Arguments* thisObj = static_cast<Arguments*>(slot.slotBase());
-      return thisObj->m_activationObject->get(exec, thisObj->m_indexToNameMap[propertyName]);
+      return thisObj->d->activation->get(exec, thisObj->d->indexToNameMap[propertyName]);
 }
 
 bool Arguments::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
 {
-    if (m_indexToNameMap.isMapped(propertyName)) {
+    if (d->indexToNameMap.isMapped(propertyName)) {
         slot.setCustom(this, mappedIndexGetter);
         return true;
     }
@@ -77,16 +80,16 @@ bool Arguments::getOwnPropertySlot(ExecState* exec, const Identifier& propertyNa
 
 void Arguments::put(ExecState* exec, const Identifier& propertyName, JSValue* value)
 {
-    if (m_indexToNameMap.isMapped(propertyName))
-        m_activationObject->put(exec, m_indexToNameMap[propertyName], value);
+    if (d->indexToNameMap.isMapped(propertyName))
+        d->activation->put(exec, d->indexToNameMap[propertyName], value);
     else
         JSObject::put(exec, propertyName, value);
 }
 
 bool Arguments::deleteProperty(ExecState* exec, const Identifier& propertyName) 
 {
-    if (m_indexToNameMap.isMapped(propertyName)) {
-        m_indexToNameMap.unMap(exec, propertyName);
+    if (d->indexToNameMap.isMapped(propertyName)) {
+        d->indexToNameMap.unMap(exec, propertyName);
         return true;
     }
 
index 9ff911c35bef34515c28d59294b52a5a4faee2f9..9ce52681323f415bb84fea0316e9eb07c19739b9 100644 (file)
@@ -47,8 +47,18 @@ namespace KJS {
     private:
         static JSValue* mappedIndexGetter(ExecState*, const Identifier&, const PropertySlot& slot);
 
-        JSActivation* m_activationObject;
-        mutable IndexToNameMap m_indexToNameMap;
+        struct ArgumentsData {
+            ArgumentsData(JSActivation* activation_, JSFunction* function_, const ArgList& args_)
+                : activation(activation_)
+                , indexToNameMap(function_, args_)
+            {
+            }
+
+            JSActivation* activation;
+            mutable IndexToNameMap indexToNameMap;
+        };
+        
+        OwnPtr<ArgumentsData> d;
     };
 
 } // namespace KJS
index 7eacb7464e1955148cf230cc5c4e3df51f88ac56..01d59926d52799f59006b01ee6d52d51064c8345 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(ArrayConstructor);
+
 ArrayConstructor::ArrayConstructor(ExecState* exec, FunctionPrototype* functionPrototype, ArrayPrototype* arrayPrototype)
-    : InternalFunction(functionPrototype, Identifier(exec, arrayPrototype->classInfo()->className))
+    : InternalFunction(exec, functionPrototype, Identifier(exec, arrayPrototype->classInfo()->className))
 {
     // ECMA 15.4.3.1 Array.prototype
     putDirect(exec->propertyNames().prototype, arrayPrototype, DontEnum | DontDelete | ReadOnly);
index 15e571277a0e14dbb011b57ae3608a1e144a04d1..8700cef997a4d75c361bdbdf9fc5df05484169bf 100644 (file)
@@ -34,6 +34,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(ArrayPrototype);
+
 static JSValue* arrayProtoFuncToString(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* arrayProtoFuncToLocaleString(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* arrayProtoFuncConcat(ExecState*, JSObject*, JSValue*, const ArgList&);
@@ -262,7 +264,7 @@ JSValue* arrayProtoFuncConcat(ExecState* exec, JSObject*, JSValue* thisValue, co
     while (1) {
         if (curArg->isObject(&JSArray::info)) {
             JSArray* curArray = static_cast<JSArray*>(curArg);
-            unsigned length = curArray->getLength();
+            unsigned length = curArray->length();
             for (unsigned k = 0; k < length; ++k) {
                 if (JSValue* v = getProperty(exec, curArray, k))
                     arr->put(exec, n, v);
index 5468eef1c79556db155bd09293afcac516499320..0f7614f74cf22fa68d52a54a76a61ea0cede896c 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(BooleanConstructor);
+
 BooleanConstructor::BooleanConstructor(ExecState* exec, FunctionPrototype* functionPrototype, BooleanPrototype* booleanPrototype)
-    : InternalFunction(functionPrototype, Identifier(exec, booleanPrototype->classInfo()->className))
+    : InternalFunction(exec, functionPrototype, Identifier(exec, booleanPrototype->classInfo()->className))
 {
     putDirect(exec->propertyNames().prototype, booleanPrototype, DontEnum | DontDelete | ReadOnly);
 
index 14db84ab25e8b0062e644639e22a7a9f00d4c15e..dc34ea618eab6ebf81244508264c10ff1432a80c 100644 (file)
@@ -23,6 +23,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(BooleanObject);
+
 const ClassInfo BooleanObject::info = { "Boolean", 0, 0, 0 };
 
 BooleanObject::BooleanObject(JSObject* prototype)
index b73b28786baf5f5343f3bfbb6d0df8283df2bc97..17b8d0d16971c3aee1469c31b7974e554f82c78a 100644 (file)
@@ -29,6 +29,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(BooleanPrototype);
+
 // Functions
 static JSValue* booleanProtoFuncToString(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* booleanProtoFuncValueOf(ExecState*, JSObject*, JSValue*, const ArgList&);
@@ -40,8 +42,8 @@ BooleanPrototype::BooleanPrototype(ExecState* exec, ObjectPrototype* objectProto
 {
     setInternalValue(jsBoolean(false));
 
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, booleanProtoFuncToString), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, booleanProtoFuncValueOf), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, booleanProtoFuncToString), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, booleanProtoFuncValueOf), DontEnum);
 }
 
 
index e4ae3421c03642e056394e8c2fc213dff5eb6bdb..a04b9896ba1412588dd11c65f1a8772150f03935 100644 (file)
@@ -45,18 +45,20 @@ namespace KJS {
 
 // TODO: MakeTime (15.9.11.1) etc. ?
 
+ASSERT_CLASS_FITS_IN_CELL(DateConstructor);
+
 static JSValue* dateParse(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* dateNow(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* dateUTC(ExecState*, JSObject*, JSValue*, const ArgList&);
 
 DateConstructor::DateConstructor(ExecState* exec, FunctionPrototype* functionPrototype, DatePrototype* datePrototype)
-    : InternalFunction(functionPrototype, Identifier(exec, datePrototype->classInfo()->className))
+    : InternalFunction(exec, functionPrototype, Identifier(exec, datePrototype->classInfo()->className))
 {
       putDirect(exec->propertyNames().prototype, datePrototype, DontEnum|DontDelete|ReadOnly);
 
-      putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().parse, dateParse), DontEnum);
-      putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 7, exec->propertyNames().UTC, dateUTC), DontEnum);
-      putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().now, dateNow), DontEnum);
+      putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().parse, dateParse), DontEnum);
+      putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 7, exec->propertyNames().UTC, dateUTC), DontEnum);
+      putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().now, dateNow), DontEnum);
 
       putDirect(exec, exec->propertyNames().length, 7, ReadOnly | DontEnum | DontDelete);
 }
index 6638bed1f610e0d6c80db516c25ae24bfdae5f5d..39491433b7c2a157cb40511dc8fda0ba9ecddf80 100644 (file)
@@ -56,6 +56,8 @@ using namespace WTF;
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(DatePrototype);
+
 static JSValue* dateProtoFuncGetDate(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* dateProtoFuncGetDay(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* dateProtoFuncGetFullYear(ExecState*, JSObject*, JSValue*, const ArgList&);
index 27e71fa995db183777807a5d2615f251e0af2474..a0bb392ba4a3516a46b3d24a1bd3f2bafa8ddd0d 100644 (file)
@@ -49,7 +49,7 @@ const UString* DebuggerCallFrame::functionName() const
     JSFunction* function = static_cast<JSFunction*>(callFrame()[RegisterFile::Callee].getJSValue());
     if (!function)
         return 0;
-    return &function->functionName().ustring();
+    return &function->name(m_exec);
 }
 
 DebuggerCallFrame::Type DebuggerCallFrame::type() const
index 9b7d52658356db7f23a1f2cbe007eff03e22a7c3..2749b5a80de1bd208067e670b9159552036d950d 100644 (file)
@@ -32,6 +32,7 @@
 namespace KJS {
     
     class CodeBlock;
+    class ExecState;
     class JSGlobalObject;
     class JSObject;
     class JSValue;
@@ -47,8 +48,9 @@ namespace KJS {
             FunctionType
         };
 
-        DebuggerCallFrame(JSGlobalObject* dynamicGlobalObject, const CodeBlock* codeBlock, ScopeChainNode* scopeChain, Register* r, JSValue* exception)
-            : m_dynamicGlobalObject(dynamicGlobalObject)
+        DebuggerCallFrame(ExecState* exec, JSGlobalObject* dynamicGlobalObject, const CodeBlock* codeBlock, ScopeChainNode* scopeChain, Register* r, JSValue* exception)
+            : m_exec(exec)
+            , m_dynamicGlobalObject(dynamicGlobalObject)
             , m_codeBlock(codeBlock)
             , m_scopeChain(scopeChain)
             , m_registers(r)
@@ -67,6 +69,7 @@ namespace KJS {
     private:
         Register* callFrame() const;
 
+        ExecState* m_exec;
         JSGlobalObject* m_dynamicGlobalObject;
         const CodeBlock* m_codeBlock;
         ScopeChainNode* m_scopeChain;
index 54b7c44d3852c7f813a66ca01922d9d9cda9c1bb..8c061a004f79cf3bcd2fef95735e7c17000f0ad8 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(ErrorConstructor);
+
 ErrorConstructor::ErrorConstructor(ExecState* exec, FunctionPrototype* functionPrototype, ErrorPrototype* errorPrototype)
-    : InternalFunction(functionPrototype, Identifier(exec, errorPrototype->classInfo()->className))
+    : InternalFunction(exec, functionPrototype, Identifier(exec, errorPrototype->classInfo()->className))
 {
     // ECMA 15.11.3.1 Error.prototype
     putDirect(exec->propertyNames().prototype, errorPrototype, DontEnum | DontDelete | ReadOnly);
index 6606036d89c193910682a953825f17bcd3b6d481..913e78394b389914a9cf419c6d27e211ef60a83d 100644 (file)
@@ -29,6 +29,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(ErrorPrototype);
+
 static JSValue* errorProtoFuncToString(ExecState*, JSObject*, JSValue*, const ArgList&);
 
 // ECMA 15.9.4
@@ -40,7 +42,7 @@ ErrorPrototype::ErrorPrototype(ExecState* exec, ObjectPrototype* objectPrototype
     putDirect(exec->propertyNames().name, jsString(exec, "Error"), DontEnum);
     putDirect(exec->propertyNames().message, jsString(exec, "Unknown error"), DontEnum);
 
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, errorProtoFuncToString), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, errorProtoFuncToString), DontEnum);
 }
 
 JSValue* errorProtoFuncToString(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
index a00b148f689157963d2f9886012996c66a606f96..ce2906ac80e8edbfce118a01cfb75f730ab4f9fd 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(FunctionConstructor);
+
 FunctionConstructor::FunctionConstructor(ExecState* exec, FunctionPrototype* functionPrototype)
-    : InternalFunction(functionPrototype, Identifier(exec, functionPrototype->classInfo()->className))
+    : InternalFunction(exec, functionPrototype, Identifier(exec, functionPrototype->classInfo()->className))
 {
     putDirect(exec->propertyNames().prototype, functionPrototype, DontEnum | DontDelete | ReadOnly);
 
index a39aabc782274e65c34e622e9123ef9e1dcdf555..cc7c7641e42b5fa50081b5ab7f362f3830287cd2 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(FunctionPrototype);
+
 static JSValue* functionProtoFuncToString(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* functionProtoFuncApply(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* functionProtoFuncCall(ExecState*, JSObject*, JSValue*, const ArgList&);
 
 FunctionPrototype::FunctionPrototype(ExecState* exec)
+    : InternalFunction(exec)
 {
     putDirect(exec->propertyNames().length, jsNumber(exec, 0), DontDelete | ReadOnly | DontEnum);
 
-    putDirectFunction(new (exec) PrototypeFunction(exec, this, 0, exec->propertyNames().toString, functionProtoFuncToString), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, this, 2, exec->propertyNames().apply, functionProtoFuncApply), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, this, 1, exec->propertyNames().call, functionProtoFuncCall), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, this, 0, exec->propertyNames().toString, functionProtoFuncToString), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, this, 2, exec->propertyNames().apply, functionProtoFuncApply), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, this, 1, exec->propertyNames().call, functionProtoFuncCall), DontEnum);
 }
 
 static JSValue* callFunctionPrototype(ExecState*, JSObject*, JSValue*, const ArgList&)
@@ -58,17 +61,17 @@ CallType FunctionPrototype::getCallData(CallData& callData)
 
 JSValue* functionProtoFuncToString(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
 {
-    if (!thisValue->isObject(&InternalFunction::info))
-        return throwError(exec, TypeError);
-
-    InternalFunction* function = static_cast<InternalFunction*>(thisValue);
+    if (thisValue->isObject(&JSFunction::info)) {
+        JSFunction* function = static_cast<JSFunction*>(thisValue);
+        return jsString(exec, "function " + function->name(exec) + "(" + function->m_body->paramString() + ") " + function->m_body->toSourceString());
+    }
 
-    if (function->inherits(&JSFunction::info)) {
-        JSFunction* fi = static_cast<JSFunction*>(thisValue);
-        return jsString(exec, "function " + fi->functionName().ustring() + "(" + fi->m_body->paramString() + ") " + fi->m_body->toSourceString());
+    if (thisValue->isObject(&InternalFunction::info)) {
+        InternalFunction* function = static_cast<InternalFunction*>(thisValue);
+        return jsString(exec, "function " + function->name(exec) + "() {\n    [native code]\n}");
     }
 
-    return jsString(exec, "function " + function->functionName().ustring() + "() {\n    [native code]\n}");
+    return throwError(exec, TypeError);
 }
 
 JSValue* functionProtoFuncApply(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
index 8737c4433a97e56dc2cf97f4156a3d7dab39d91d..0039c69e53ebd1f56d0c1296f9f0056aaf8a6e4b 100644 (file)
@@ -31,6 +31,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(GlobalEvalFunction);
+
 GlobalEvalFunction::GlobalEvalFunction(ExecState* exec, FunctionPrototype* functionPrototype, int len, const Identifier& name, NativeFunction function, JSGlobalObject* cachedGlobalObject)
     : PrototypeFunction(exec, functionPrototype, len, name, function)
     , m_cachedGlobalObject(cachedGlobalObject)
index 00d15e12f9d5224ddbb30b2480c8adcf2be81ef0..7974edf1fb8f0c21dc73f13322c917bbaeae8a20 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(InternalFunction);
+
 const ClassInfo InternalFunction::info = { "Function", 0, 0, 0 };
 
-InternalFunction::InternalFunction()
+InternalFunction::InternalFunction(ExecState* exec)
 {
+    putDirect(exec->propertyNames().name, jsString(exec, exec->propertyNames().nullIdentifier.ustring()), DontDelete | ReadOnly | DontEnum);
 }
 
-InternalFunction::InternalFunction(FunctionPrototype* prototype, const Identifier& name)
+InternalFunction::InternalFunction(ExecState* exec, FunctionPrototype* prototype, const Identifier& name)
     : JSObject(prototype)
-    , m_name(name)
-{
-}
-
-bool InternalFunction::implementsHasInstance() const
 {
-    return true;
+    putDirect(exec->propertyNames().name, jsString(exec, name.ustring()), DontDelete | ReadOnly | DontEnum);
 }
 
-bool InternalFunction::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+const UString& InternalFunction::name(ExecState* exec)
 {
-    if (propertyName == exec->propertyNames().name) {
-        slot.setCustom(this, nameGetter);
-        return true;
-    }
-
-    return JSObject::getOwnPropertySlot(exec, propertyName, slot);
+    JSValue* v = getDirect(exec->propertyNames().name);
+    ASSERT(v->isString());
+    return static_cast<JSString*>(v)->value();
 }
 
-void InternalFunction::put(ExecState* exec, const Identifier& propertyName, JSValue* value)
-{
-    if (propertyName == exec->propertyNames().name)
-        return;
-    JSObject::put(exec, propertyName, value);
-}
-
-bool InternalFunction::deleteProperty(ExecState* exec, const Identifier& propertyName)
-{
-    if (propertyName == exec->propertyNames().name)
-        return false;
-    return JSObject::deleteProperty(exec, propertyName);
-}
-
-JSValue* InternalFunction::nameGetter(ExecState* exec, const Identifier&, const PropertySlot& slot)
+bool InternalFunction::implementsHasInstance() const
 {
-    InternalFunction* thisObj = static_cast<InternalFunction*>(slot.slotBase());
-    return jsString(exec, thisObj->functionName().ustring());
+    return true;
 }
 
 } // namespace KJS
index e4a5e268d8c8a1ee8a7ea9df630b80b90a23f5ea..9e0bc972d85640abab9f8fd575f48807f128d136 100644 (file)
@@ -35,23 +35,16 @@ namespace KJS {
     public:
         virtual const ClassInfo* classInfo() const { return &info; }
         static const ClassInfo info;
-
-        virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
-        virtual void put(ExecState*, const Identifier& propertyName, JSValue*);
-        virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
-
-        const Identifier& functionName() const { return m_name; }
+        
+        const UString& name(ExecState*);
 
     protected:
-        InternalFunction();
-        InternalFunction(FunctionPrototype*, const Identifier&);
+        InternalFunction(ExecState*);
+        InternalFunction(ExecState*, FunctionPrototype*, const Identifier&);
 
     private:
-        static JSValue* nameGetter(ExecState*, const Identifier&, const PropertySlot&);
         virtual CallType getCallData(CallData&) = 0;
         virtual bool implementsHasInstance() const;
-
-        Identifier m_name;
     };
 
 } // namespace KJS
index a1fbb848a95fea576943204ef63ce3b171e6678c..28eab5273a73aa17b9ecd65bb5badf6efd306d4a 100644 (file)
@@ -37,6 +37,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(JSActivation);
+
 const ClassInfo JSActivation::info = { "JSActivation", 0, 0, 0 };
 
 JSActivation::JSActivation(PassRefPtr<FunctionBodyNode> functionBody, Register* registers)
index 7d3ab76bb90cb15a33439280b40010a4ce90445c..2dcd40382e78b037202d81f119e01124e53a24b1 100644 (file)
@@ -35,6 +35,8 @@ using namespace std;
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(JSArray);
+
 // Overview of JSArray
 //
 // Properties of JSArray objects may be stored in one of three locations:
@@ -128,10 +130,10 @@ JSArray::JSArray(JSValue* prototype, unsigned initialLength)
 {
     unsigned initialCapacity = min(initialLength, MIN_SPARSE_ARRAY_INDEX);
 
-    m_length = initialLength;
-    m_fastAccessCutoff = 0;
     m_storage = static_cast<ArrayStorage*>(fastZeroedMalloc(storageSize(initialCapacity)));
+    m_fastAccessCutoff = 0;
     m_storage->m_vectorLength = initialCapacity;
+    m_storage->m_length = initialLength;
 
     Heap::heap(this)->reportExtraMemoryCost(initialCapacity * sizeof(JSValue*));
 
@@ -143,7 +145,6 @@ JSArray::JSArray(ExecState* exec, JSObject* prototype, const ArgList& list)
 {
     unsigned length = list.size();
 
-    m_length = length;
     m_fastAccessCutoff = length;
 
     ArrayStorage* storage = static_cast<ArrayStorage*>(fastMalloc(storageSize(length)));
@@ -151,6 +152,7 @@ JSArray::JSArray(ExecState* exec, JSObject* prototype, const ArgList& list)
     storage->m_vectorLength = length;
     storage->m_numValuesInVector = length;
     storage->m_sparseValueMap = 0;
+    storage->m_length = length;
 
     size_t i = 0;
     ArgList::const_iterator end = list.end();
@@ -177,7 +179,7 @@ bool JSArray::getOwnPropertySlot(ExecState* exec, unsigned i, PropertySlot& slot
 {
     ArrayStorage* storage = m_storage;
 
-    if (i >= m_length) {
+    if (i >= storage->m_length) {
         if (i > MAX_ARRAY_INDEX)
             return getOwnPropertySlot(exec, Identifier::from(exec, i), slot);
         return false;
@@ -205,7 +207,7 @@ bool JSArray::getOwnPropertySlot(ExecState* exec, unsigned i, PropertySlot& slot
 bool JSArray::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
 {
     if (propertyName == exec->propertyNames().length) {
-        slot.setValue(jsNumber(exec, getLength()));
+        slot.setValue(jsNumber(exec, length()));
         return true;
     }
 
@@ -244,10 +246,10 @@ void JSArray::put(ExecState* exec, unsigned i, JSValue* value)
 {
     checkConsistency();
 
-    unsigned length = m_length;
+    unsigned length = m_storage->m_length;
     if (i >= length && i <= MAX_ARRAY_INDEX) {
         length = i + 1;
-        m_length = length;
+        m_storage->m_length = length;
     }
 
     if (i < m_storage->m_vectorLength) {
@@ -258,8 +260,8 @@ void JSArray::put(ExecState* exec, unsigned i, JSValue* value)
             return;
         }
         valueSlot = value;
-        if (++m_storage->m_numValuesInVector == m_length)
-            m_fastAccessCutoff = m_length;
+        if (++m_storage->m_numValuesInVector == m_storage->m_length)
+            m_fastAccessCutoff = m_storage->m_length;
         checkConsistency();
         return;
     }
@@ -413,7 +415,7 @@ void JSArray::getPropertyNames(ExecState* exec, PropertyNameArray& propertyNames
 
     ArrayStorage* storage = m_storage;
 
-    unsigned usedVectorLength = min(m_length, storage->m_vectorLength);
+    unsigned usedVectorLength = min(storage->m_length, storage->m_vectorLength);
     for (unsigned i = 0; i < usedVectorLength; ++i) {
         if (storage->m_vector[i])
             propertyNames.add(Identifier::from(exec, i));
@@ -459,7 +461,7 @@ void JSArray::setLength(unsigned newLength)
 
     ArrayStorage* storage = m_storage;
 
-    unsigned length = m_length;
+    unsigned length = m_storage->m_length;
 
     if (newLength < length) {
         if (m_fastAccessCutoff > newLength)
@@ -487,7 +489,7 @@ void JSArray::setLength(unsigned newLength)
         }
     }
 
-    m_length = newLength;
+    m_storage->m_length = newLength;
 
     checkConsistency();
 }
@@ -498,7 +500,7 @@ void JSArray::mark()
 
     ArrayStorage* storage = m_storage;
 
-    unsigned usedVectorLength = min(m_length, storage->m_vectorLength);
+    unsigned usedVectorLength = min(storage->m_length, storage->m_vectorLength);
     for (unsigned i = 0; i < usedVectorLength; ++i) {
         JSValue* value = storage->m_vector[i];
         if (value && !value->marked())
@@ -661,14 +663,14 @@ void JSArray::sort(ExecState* exec, JSValue* compareFunction, CallType callType,
 
     // The maximum tree depth is compiled in - but the caller is clearly up to no good
     // if a larger array is passed.
-    ASSERT(m_length <= static_cast<unsigned>(std::numeric_limits<int>::max()));
-    if (m_length > static_cast<unsigned>(std::numeric_limits<int>::max()))
+    ASSERT(m_storage->m_length <= static_cast<unsigned>(std::numeric_limits<int>::max()));
+    if (m_storage->m_length > static_cast<unsigned>(std::numeric_limits<int>::max()))
         return;
 
-    if (!m_length)
+    if (!m_storage->m_length)
         return;
 
-    unsigned usedVectorLength = min(m_length, m_storage->m_vectorLength);
+    unsigned usedVectorLength = min(m_storage->m_length, m_storage->m_vectorLength);
 
     AVLTree<AVLTreeAbstractorForArrayCompare, 44> tree; // Depth 44 is enough for 2^31 items
     tree.abstractor().m_exec = exec;
@@ -765,7 +767,7 @@ unsigned JSArray::compactForSorting()
 
     ArrayStorage* storage = m_storage;
 
-    unsigned usedVectorLength = min(m_length, storage->m_vectorLength);
+    unsigned usedVectorLength = min(m_storage->m_length, storage->m_vectorLength);
 
     unsigned numDefined = 0;
     unsigned numUndefined = 0;
@@ -835,13 +837,13 @@ void JSArray::checkConsistency(ConsistencyCheckType type)
     if (type == SortConsistencyCheck)
         ASSERT(!m_storage->m_sparseValueMap);
 
-    ASSERT(m_fastAccessCutoff <= m_length);
+    ASSERT(m_fastAccessCutoff <= m_storage->m_length);
     ASSERT(m_fastAccessCutoff <= m_storage->m_numValuesInVector);
 
     unsigned numValuesInVector = 0;
     for (unsigned i = 0; i < m_storage->m_vectorLength; ++i) {
         if (JSValue* value = m_storage->m_vector[i]) {
-            ASSERT(i < m_length);
+            ASSERT(i < m_storage->m_length);
             if (type != DestructorConsistencyCheck)
                 value->type(); // Likely to crash if the object was deallocated.
             ++numValuesInVector;
@@ -857,7 +859,7 @@ void JSArray::checkConsistency(ConsistencyCheckType type)
         SparseArrayValueMap::iterator end = m_storage->m_sparseValueMap->end();
         for (SparseArrayValueMap::iterator it = m_storage->m_sparseValueMap->begin(); it != end; ++it) {
             unsigned index = it->first;
-            ASSERT(index < m_length);
+            ASSERT(index < m_storage->m_length);
             ASSERT(index >= m_storage->m_vectorLength);
             ASSERT(index <= MAX_ARRAY_INDEX);
             ASSERT(it->second);
index 9f59428317e6c734e9691b6e1032aca79e39709d..847061e0c48723d97f752ae03bd1213b607645ca 100644 (file)
@@ -29,6 +29,7 @@ namespace KJS {
     typedef HashMap<unsigned, JSValue*> SparseArrayValueMap;
 
     struct ArrayStorage {
+        unsigned m_length;
         unsigned m_vectorLength;
         unsigned m_numValuesInVector;
         SparseArrayValueMap* m_sparseValueMap;
@@ -48,7 +49,7 @@ namespace KJS {
 
         static const ClassInfo info;
 
-        unsigned getLength() const { return m_length; }
+        unsigned length() const { return m_storage->m_length; }
         void setLength(unsigned); // OK to use on new arrays, but not if it might be a RegExpMatchArray.
 
         void sort(ExecState*);
@@ -91,7 +92,6 @@ namespace KJS {
         enum ConsistencyCheckType { NormalConsistencyCheck, DestructorConsistencyCheck, SortConsistencyCheck };
         void checkConsistency(ConsistencyCheckType = NormalConsistencyCheck);
 
-        unsigned m_length;
         unsigned m_fastAccessCutoff;
         ArrayStorage* m_storage;
     };
index 18ce5a7d89b133a81b2e4afa9d0844c5e52f96fb..7d644fb547684122cff99a162f6b409d61ae6d77 100644 (file)
@@ -96,6 +96,8 @@ namespace KJS {
         // Base implementation, but for non-object classes implements getPropertySlot.
         virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
         virtual bool getOwnPropertySlot(ExecState*, unsigned propertyName, PropertySlot&);
+        
+        intptr_t reserved; // Reserved for work in progress.
     };
 
     inline JSCell::JSCell()
index 83d9975712ff977157ac27d61290c305aecb1aa1..9552aa7deebf19f87bbece1f7aafeae8cfe5ea71 100644 (file)
@@ -25,6 +25,7 @@
 #include "config.h"
 #include "JSFunction.h"
 
+#include "CommonIdentifiers.h"
 #include "ExecState.h"
 #include "FunctionPrototype.h"
 #include "JSGlobalObject.h"
@@ -39,10 +40,12 @@ using namespace Unicode;
 
 namespace KJS {
 
-const ClassInfo JSFunction::info = { "Function", &InternalFunction::info, 0, 0 };
+ASSERT_CLASS_FITS_IN_CELL(JSFunction);
+
+const ClassInfo JSFunction::info = { "Function", 0, 0, 0 };
 
 JSFunction::JSFunction(ExecState* exec, const Identifier& name, FunctionBodyNode* body, ScopeChainNode* scopeChainNode)
-    : InternalFunction(exec->lexicalGlobalObject()->functionPrototype(), name)
+    : Base(exec, exec->lexicalGlobalObject()->functionPrototype(), name)
     , m_body(body)
     , m_scopeChain(scopeChainNode)
 {
@@ -50,7 +53,7 @@ JSFunction::JSFunction(ExecState* exec, const Identifier& name, FunctionBodyNode
 
 void JSFunction::mark()
 {
-    InternalFunction::mark();
+    Base::mark();
     m_body->mark();
     m_scopeChain.mark();
 }
@@ -102,21 +105,21 @@ bool JSFunction::getOwnPropertySlot(ExecState* exec, const Identifier& propertyN
         return true;
     }
 
-    return InternalFunction::getOwnPropertySlot(exec, propertyName, slot);
+    return Base::getOwnPropertySlot(exec, propertyName, slot);
 }
 
 void JSFunction::put(ExecState* exec, const Identifier& propertyName, JSValue* value)
 {
     if (propertyName == exec->propertyNames().arguments || propertyName == exec->propertyNames().length)
         return;
-    InternalFunction::put(exec, propertyName, value);
+    Base::put(exec, propertyName, value);
 }
 
 bool JSFunction::deleteProperty(ExecState* exec, const Identifier& propertyName)
 {
     if (propertyName == exec->propertyNames().arguments || propertyName == exec->propertyNames().length)
         return false;
-    return InternalFunction::deleteProperty(exec, propertyName);
+    return Base::deleteProperty(exec, propertyName);
 }
 
 /* Returns the parameter name corresponding to the given index. eg:
index 04639f06c2c7719fad216f8e6a2e0a79788f0cae..5013d630d575ca2d19e5c207465898585e2d42fb 100644 (file)
@@ -38,6 +38,7 @@ namespace KJS {
     class JSGlobalObject;
 
     class JSFunction : public InternalFunction {
+        typedef InternalFunction Base;
     public:
         JSFunction(ExecState*, const Identifier&, FunctionBodyNode*, ScopeChainNode*);
 
index a95e50bf6360368299b595d4ceae54e52541c31e..723d676f448af19a581b40d492bf7c19e84151dd 100644 (file)
@@ -62,6 +62,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(JSGlobalObject);
+
 // Default number of ticks before a timeout check should be done.
 static const int initialTickCountThreshold = 255;
 
@@ -311,19 +313,19 @@ void JSGlobalObject::reset(JSValue* prototype)
     // Set global functions.
 
     d()->evalFunction = new (exec) GlobalEvalFunction(exec, d()->functionPrototype, 1, exec->propertyNames().eval, globalFuncEval, this);
-    putDirectFunction(d()->evalFunction, DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 2, Identifier(exec, "parseInt"), globalFuncParseInt), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "parseFloat"), globalFuncParseFloat), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isNaN"), globalFuncIsNaN), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isFinite"), globalFuncIsFinite), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "escape"), globalFuncEscape), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "unescape"), globalFuncUnescape), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURI"), globalFuncDecodeURI), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURIComponent"), globalFuncDecodeURIComponent), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURI"), globalFuncEncodeURI), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURIComponent"), globalFuncEncodeURIComponent), DontEnum);
+    putDirectFunction(exec, d()->evalFunction, DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 2, Identifier(exec, "parseInt"), globalFuncParseInt), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "parseFloat"), globalFuncParseFloat), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isNaN"), globalFuncIsNaN), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isFinite"), globalFuncIsFinite), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "escape"), globalFuncEscape), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "unescape"), globalFuncUnescape), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURI"), globalFuncDecodeURI), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURIComponent"), globalFuncDecodeURIComponent), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURI"), globalFuncEncodeURI), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURIComponent"), globalFuncEncodeURIComponent), DontEnum);
 #ifndef NDEBUG
-    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "kjsprint"), globalFuncKJSPrint), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "kjsprint"), globalFuncKJSPrint), DontEnum);
 #endif
 
     // Set prototype, and also insert the object prototype at the end of the chain.
index e84d2a97a4e5b0d535193e23472075b0e1107f51..313c997a98faec0f2a64607196ab6a56f9086c29 100644 (file)
@@ -77,6 +77,10 @@ namespace KJS {
                 , globalScopeChain(globalObject, thisValue)
             {
             }
+            
+            virtual ~JSGlobalObjectData()
+            {
+            }
 
             JSGlobalObject* next;
             JSGlobalObject* prev;
@@ -133,8 +137,8 @@ namespace KJS {
         }
 
     protected:
-        JSGlobalObject(JSValue* prototype, JSObject* globalThisValue)
-            : JSVariableObject(prototype, new JSGlobalObjectData(this, globalThisValue))
+        JSGlobalObject(JSValue* prototype, JSGlobalObjectData* d, JSObject* globalThisValue)
+            : JSVariableObject(prototype, d)
         {
             init(globalThisValue);
         }
index 4934d49a44aec426546d1c23c60447698d2c313b..6d770accb744a3fda2f14209bf069e116c22b657 100644 (file)
@@ -34,6 +34,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(JSNotAnObject);
+
 // JSValue methods
 JSValue* JSNotAnObject::toPrimitive(ExecState* exec, JSType) const
 {
index fa67a6c405f3b6fb84e073ca87e1396ffa1893e1..c309c21bc48483280a24b4f8b16cfb0b51c1692a 100644 (file)
@@ -42,6 +42,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(JSObject);
+
 void JSObject::mark()
 {
     JSCell::mark();
@@ -460,9 +462,9 @@ void JSObject::removeDirect(const Identifier& propertyName)
     m_propertyMap.remove(propertyName);
 }
 
-void JSObject::putDirectFunction(InternalFunction* function, unsigned attr)
+void JSObject::putDirectFunction(ExecState* exec, InternalFunction* function, unsigned attr)
 {
-    putDirect(function->functionName(), function, attr);
+    putDirect(Identifier(exec, function->name(exec)), function, attr);
 }
 
 NEVER_INLINE void JSObject::fillGetterPropertySlot(PropertySlot& slot, JSValue** location)
index 31809c4e3d5e222004a49111269d205bd253a7ae..9cfffcabb81c8a59d1fb212ba5e64db244b6e5dc 100644 (file)
@@ -69,115 +69,13 @@ namespace KJS {
         virtual void mark();
         virtual JSType type() const;
 
-        /**
-         * A pointer to a ClassInfo struct for this class. This provides a basic
-         * facility for run-time type information, and can be used to check an
-         * object's class an inheritance (see inherits()). This should
-         * always return a statically declared pointer, or 0 to indicate that
-         * there is no class information.
-         *
-         * This is primarily useful if you have application-defined classes that you
-         * wish to check against for casting purposes.
-         *
-         * For example, to specify the class info for classes FooImp and BarImp,
-         * where FooImp inherits from BarImp, you would add the following in your
-         * class declarations:
-         *
-         * \code
-         *   class BarImp : public JSObject {
-         *     virtual const ClassInfo *classInfo() const { return &info; }
-         *     static const ClassInfo info;
-         *     // ...
-         *   };
-         *
-         *   class FooImp : public JSObject {
-         *     virtual const ClassInfo *classInfo() const { return &info; }
-         *     static const ClassInfo info;
-         *     // ...
-         *   };
-         * \endcode
-         *
-         * And in your source file:
-         *
-         * \code
-         *   const ClassInfo BarImp::info = { "Bar", 0, 0, 0 }; // no parent class
-         *   const ClassInfo FooImp::info = { "Foo", &BarImp::info, 0, 0 };
-         * \endcode
-         *
-         * @see inherits()
-         */
-
-        /**
-         * Checks whether this object inherits from the class with the specified
-         * classInfo() pointer. This requires that both this class and the other
-         * class return a non-NULL pointer for their classInfo() methods (otherwise
-         * it will return false).
-         *
-         * For example, for two JSObject pointers obj1 and obj2, you can check
-         * if obj1's class inherits from obj2's class using the following:
-         *
-         *   if (obj1->inherits(obj2->classInfo())) {
-         *     // ...
-         *   }
-         *
-         * If you have a handle to a statically declared ClassInfo, such as in the
-         * classInfo() example, you can check for inheritance without needing
-         * an instance of the other class:
-         *
-         *   if (obj1->inherits(FooImp::info)) {
-         *     // ...
-         *   }
-         *
-         * @param cinfo The ClassInfo pointer for the class you want to check
-         * inheritance against.
-         * @return true if this object's class inherits from class with the
-         * ClassInfo pointer specified in cinfo
-         */
         bool inherits(const ClassInfo* classInfo) const { return isObject(classInfo); } // FIXME: Merge with isObject.
 
-        // internal properties (ECMA 262-3 8.6.2)
-
-        /**
-         * Returns the prototype of this object. Note that this is not the same as
-         * the "prototype" property.
-         *
-         * See ECMA 8.6.2
-         *
-         * @return The object's prototype
-         */
         JSValue* prototype() const;
         void setPrototype(JSValue* prototype);
 
-        /**
-         * Returns the class name of the object
-         *
-         * See ECMA 8.6.2
-         *
-         * @return The object's class name
-         */
-        /**
-         * Implementation of the [[Class]] internal property (implemented by all
-         * Objects)
-         *
-         * The default implementation uses classInfo().
-         * You should either implement classInfo(), or
-         * if you simply need a classname, you can reimplement className()
-         * instead.
-         */
         virtual UString className() const;
 
-        /**
-         * Retrieves the specified property from the object. If neither the object
-         * or any other object in its prototype chain have the property, this
-         * function will return Undefined.
-         *
-         * See ECMA 8.6.2.1
-         *
-         * @param exec The current execution state
-         * @param propertyName The name of the property to retrieve
-         *
-         * @return The specified property, or Undefined
-         */
         JSValue* get(ExecState*, const Identifier& propertyName) const;
         JSValue* get(ExecState*, unsigned propertyName) const;
 
@@ -187,97 +85,24 @@ namespace KJS {
         virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
         virtual bool getOwnPropertySlot(ExecState*, unsigned propertyName, PropertySlot&);
 
-        /**
-         * Sets the specified property.
-         *
-         * See ECMA 8.6.2.2
-         *
-         * @param exec The current execution state
-         * @param propertyName The name of the property to set
-         * @param propertyValue The value to set
-         */
         virtual void put(ExecState*, const Identifier& propertyName, JSValue* value);
         virtual void put(ExecState*, unsigned propertyName, JSValue* value);
 
         virtual void putWithAttributes(ExecState*, const Identifier& propertyName, JSValue* value, unsigned attributes);
         virtual void putWithAttributes(ExecState*, unsigned propertyName, JSValue* value, unsigned attributes);
 
-        /**
-         * Checks if a property is enumerable, that is if it doesn't have the DontEnum
-         * flag set
-         *
-         * See ECMA 15.2.4
-         * @param exec The current execution state
-         * @param propertyName The name of the property
-         * @return true if the property is enumerable, otherwise false
-         */
         bool propertyIsEnumerable(ExecState*, const Identifier& propertyName) const;
 
-        /**
-         * Checks to see whether the object (or any object in its prototype chain)
-         * has a property with the specified name.
-         *
-         * See ECMA 8.6.2.4
-         *
-         * @param exec The current execution state
-         * @param propertyName The name of the property to check for
-         * @return true if the object has the property, otherwise false
-         */
         bool hasProperty(ExecState*, const Identifier& propertyName) const;
         bool hasProperty(ExecState*, unsigned propertyName) const;
         bool hasOwnProperty(ExecState*, const Identifier& propertyName) const;
 
-        /**
-         * Removes the specified property from the object.
-         *
-         * See ECMA 8.6.2.5
-         *
-         * @param exec The current execution state
-         * @param propertyName The name of the property to delete
-         * @return true if the property was successfully deleted or did not
-         * exist on the object. false if deleting the specified property is not
-         * allowed.
-         */
         virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
         virtual bool deleteProperty(ExecState*, unsigned propertyName);
 
-        /**
-         * Converts the object into a primitive value. The value return may differ
-         * depending on the supplied hint
-         *
-         * See ECMA 8.6.2.6
-         *
-         * @param exec The current execution state
-         * @param hint The desired primitive type to convert to
-         * @return A primitive value converted from the objetc. Note that the
-         * type of primitive value returned may not be the same as the requested
-         * hint.
-         */
-        /**
-         * Implementation of the [[DefaultValue]] internal property (implemented by
-         * all Objects)
-         */
         virtual JSValue* defaultValue(ExecState*, JSType hint) const;
 
-        /**
-         * Whether or not the object implements the hasInstance() method. If this
-         * returns false you should not call the hasInstance() method on this
-         * object (typically, an assertion will fail to indicate this).
-         *
-         * @return true if this object implements the hasInstance() method,
-         * otherwise false
-         */
         virtual bool implementsHasInstance() const;
-
-        /**
-         * Checks whether value delegates behavior to this object. Used by the
-         * instanceof operator.
-         *
-         * @param exec The current execution state
-         * @param value The value to check
-         * @return true if value delegates behavior to this object, otherwise
-         * false
-         */
         virtual bool hasInstance(ExecState*, JSValue*);
 
         virtual void getPropertyNames(ExecState*, PropertyNameArray&);
@@ -298,8 +123,6 @@ namespace KJS {
         virtual bool masqueradeAsUndefined() const { return false; }
 
         // This get function only looks at the property map.
-        // This is used e.g. by lookupOrCreateFunction (to cache a function, we don't want
-        // to look up in the prototype, it might already exist there)
         JSValue* getDirect(const Identifier& propertyName) const { return m_propertyMap.get(propertyName); }
         JSValue** getDirectLocation(const Identifier& propertyName) { return m_propertyMap.getLocation(propertyName); }
         JSValue** getDirectLocation(const Identifier& propertyName, bool& isWriteable) { return m_propertyMap.getLocation(propertyName, isWriteable); }
@@ -309,7 +132,7 @@ namespace KJS {
         bool hasCustomProperties() { return !m_propertyMap.isEmpty(); }
 
         // convenience to add a function property under the function's own built-in name
-        void putDirectFunction(InternalFunction*, unsigned attr = 0);
+        void putDirectFunction(ExecState*, InternalFunction*, unsigned attr = 0);
 
         void fillGetterPropertySlot(PropertySlot&, JSValue** location);
 
index eb3ddc830b43a9fa5b4e41d8397ea8527734aa8a..8480621baeb6a621de5f84e28288a01d04344965 100644 (file)
@@ -29,6 +29,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(JSStaticScopeObject);
+
 JSObject* JSStaticScopeObject::toThisObject(ExecState* exec) const
 {
     return exec->globalThisValue();
index 2d626f9b2129dddc3f894daef61944ca3f18d6ff..b14d12bcab77857416337186a5da0d790499aa4e 100644 (file)
@@ -25,6 +25,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(JSWrapperObject);
+
 void JSWrapperObject::mark() 
 {
     JSObject::mark();
index b6ddd1656d67a39972f264b84898bfb1a3daeb0b..24c66f5f7464de6f3d4f0d0e3c245184a962ad62 100644 (file)
@@ -29,6 +29,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(MathObject);
+
 static JSValue* mathProtoFuncAbs(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* mathProtoFuncACos(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* mathProtoFuncASin(ExecState*, JSObject*, JSValue*, const ArgList&);
index 1f2e1d45c44074dc9788179caa3269a06d584260..87d8b531eb634489790c8471e34a893747e27a3c 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(NativeErrorConstructor);
+
 const ClassInfo NativeErrorConstructor::info = { "Function", &InternalFunction::info, 0, 0 };
 
 NativeErrorConstructor::NativeErrorConstructor(ExecState* exec, FunctionPrototype* functionPrototype, NativeErrorPrototype* nativeErrorPrototype)
-    : InternalFunction(functionPrototype, Identifier(exec, nativeErrorPrototype->getDirect(exec->propertyNames().name)->getString()))
+    : InternalFunction(exec, functionPrototype, Identifier(exec, nativeErrorPrototype->getDirect(exec->propertyNames().name)->getString()))
     , m_proto(nativeErrorPrototype)
 {
     putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete | ReadOnly | DontEnum); // ECMA 15.11.7.5
index 0c5936e20ca20838954825792b284e51c56a5d61..dc60a072cbc6dea5e67e2829f0c9c0dfe24d114e 100644 (file)
@@ -27,6 +27,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(NativeErrorPrototype);
+
 NativeErrorPrototype::NativeErrorPrototype(ExecState* exec, ErrorPrototype* errorPrototype, const UString& name, const UString& message)
     : JSObject(errorPrototype)
 {
index c89b1bec6c46f86aa38722ebf5f1afa278c28778..213c77f22a735095aaa6051f92cdad2e41edb608 100644 (file)
@@ -28,6 +28,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(NativeErrorConstructor);
+
 const ClassInfo NumberConstructor::info = { "Function", &InternalFunction::info, 0, ExecState::numberTable };
 
 /* Source for NumberObject.lut.h
@@ -40,7 +42,7 @@ const ClassInfo NumberConstructor::info = { "Function", &InternalFunction::info,
 @end
 */
 NumberConstructor::NumberConstructor(ExecState* exec, FunctionPrototype* functionPrototype, NumberPrototype* numberPrototype)
-    : InternalFunction(functionPrototype, Identifier(exec, numberPrototype->info.className))
+    : InternalFunction(exec, functionPrototype, Identifier(exec, numberPrototype->info.className))
 {
     // Number.Prototype
     putDirect(exec->propertyNames().prototype, numberPrototype, DontEnum | DontDelete | ReadOnly);
index b47aceb56766f523bf57bc533d564d333144088e..e02e7eef24a4f6f9508bbc610d924f882a46d3e7 100644 (file)
@@ -27,6 +27,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(NumberObject);
+
 const ClassInfo NumberObject::info = { "Number", 0, 0, 0 };
 
 NumberObject::NumberObject(JSObject* prototype)
index 61385ac663cb75c127043fa40a96d309e5e6188e..be83424b378bbd5e0987883481c7e91ea6bd3985 100644 (file)
@@ -35,6 +35,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(NumberPrototype);
+
 static JSValue* numberProtoFuncToString(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* numberProtoFuncToLocaleString(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* numberProtoFuncValueOf(ExecState*, JSObject*, JSValue*, const ArgList&);
@@ -51,12 +53,12 @@ NumberPrototype::NumberPrototype(ExecState* exec, ObjectPrototype* objectPrototy
 
     // The constructor will be added later, after NumberConstructor has been constructed
 
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toString, numberProtoFuncToString), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toLocaleString, numberProtoFuncToLocaleString), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, numberProtoFuncValueOf), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toFixed, numberProtoFuncToFixed), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toExponential, numberProtoFuncToExponential), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toPrecision, numberProtoFuncToPrecision), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toString, numberProtoFuncToString), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toLocaleString, numberProtoFuncToLocaleString), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, numberProtoFuncValueOf), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toFixed, numberProtoFuncToFixed), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toExponential, numberProtoFuncToExponential), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toPrecision, numberProtoFuncToPrecision), DontEnum);
 }
 
 // ------------------------------ Functions ---------------------------
index 3661a8e29b2dc652fd5fe5cc4c1313f59796ce24..c5c974dbca28c59b2726e9c2c9ab8ef2f9a9c2b3 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(ObjectConstructor);
+
 ObjectConstructor::ObjectConstructor(ExecState* exec, ObjectPrototype* objectPrototype, FunctionPrototype* functionPrototype)
-    : InternalFunction(functionPrototype, Identifier(exec, "Object"))
+    : InternalFunction(exec, functionPrototype, Identifier(exec, "Object"))
 {
     // ECMA 15.2.3.1
     putDirect(exec->propertyNames().prototype, objectPrototype, DontEnum | DontDelete | ReadOnly);
index 872d25ac5f178a2ca3adfc2789e2cf9b58c81770..c9c1a0d7b10f1dfd0c03fa1a7528d7e8320a9983 100644 (file)
@@ -28,6 +28,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(ObjectPrototype);
+
 static JSValue* objectProtoFuncValueOf(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* objectProtoFuncHasOwnProperty(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* objectProtoFuncIsPrototypeOf(ExecState*, JSObject*, JSValue*, const ArgList&);
@@ -41,18 +43,18 @@ static JSValue* objectProtoFuncToLocaleString(ExecState*, JSObject*, JSValue*, c
 ObjectPrototype::ObjectPrototype(ExecState* exec, FunctionPrototype* functionPrototype)
     : JSObject() // [[Prototype]] is null
 {
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, objectProtoFuncToString), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toLocaleString, objectProtoFuncToLocaleString), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, objectProtoFuncValueOf), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().hasOwnProperty, objectProtoFuncHasOwnProperty), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().propertyIsEnumerable, objectProtoFuncPropertyIsEnumerable), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().isPrototypeOf, objectProtoFuncIsPrototypeOf), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, objectProtoFuncToString), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toLocaleString, objectProtoFuncToLocaleString), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, objectProtoFuncValueOf), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().hasOwnProperty, objectProtoFuncHasOwnProperty), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().propertyIsEnumerable, objectProtoFuncPropertyIsEnumerable), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().isPrototypeOf, objectProtoFuncIsPrototypeOf), DontEnum);
 
     // Mozilla extensions
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 2, exec->propertyNames().__defineGetter__, objectProtoFuncDefineGetter), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 2, exec->propertyNames().__defineSetter__, objectProtoFuncDefineSetter), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().__lookupGetter__, objectProtoFuncLookupGetter), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().__lookupSetter__, objectProtoFuncLookupSetter), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 2, exec->propertyNames().__defineGetter__, objectProtoFuncDefineGetter), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 2, exec->propertyNames().__defineSetter__, objectProtoFuncDefineSetter), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().__lookupGetter__, objectProtoFuncLookupGetter), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().__lookupSetter__, objectProtoFuncLookupSetter), DontEnum);
 }
 
 
index cfeebcc1770aef209066bf40a0b1f6b5d7ad4dfa..d3e01b4ef7b3ae9d9383cb76ddb519d0193df20f 100644 (file)
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(PrototypeFunction);
+
 PrototypeFunction::PrototypeFunction(ExecState* exec, int length, const Identifier& name, NativeFunction function)
-    : InternalFunction(exec->lexicalGlobalObject()->functionPrototype(), name)
+    : InternalFunction(exec, exec->lexicalGlobalObject()->functionPrototype(), name)
     , m_function(function)
 {
     ASSERT_ARG(function, function);
@@ -40,7 +42,7 @@ PrototypeFunction::PrototypeFunction(ExecState* exec, int length, const Identifi
 }
 
 PrototypeFunction::PrototypeFunction(ExecState* exec, FunctionPrototype* functionPrototype, int length, const Identifier& name, NativeFunction function)
-    : InternalFunction(functionPrototype, name)
+    : InternalFunction(exec, functionPrototype, name)
     , m_function(function)
 {
     ASSERT_ARG(function, function);
index 2cbc8841cf1d707b19611a981fd08c49e2582dc8..20dd93d516f2fe024045b51970717726a0d011f9 100644 (file)
@@ -33,6 +33,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(RegExpConstructor);
+
 const ClassInfo RegExpConstructor::info = { "Function", &InternalFunction::info, 0, ExecState::regExpConstructorTable };
 
 /* Source for RegExpConstructor.lut.h
@@ -76,7 +78,7 @@ struct RegExpConstructorPrivate {
 };
 
 RegExpConstructor::RegExpConstructor(ExecState* exec, FunctionPrototype* functionPrototype, RegExpPrototype* regExpPrototype)
-    : InternalFunction(functionPrototype, Identifier(exec, "RegExp"))
+    : InternalFunction(exec, functionPrototype, Identifier(exec, "RegExp"))
     , d(new RegExpConstructorPrivate)
 {
     // ECMA 15.10.5.1 RegExp.prototype
index 8e079c0a6d783e52bd621c439741d6bcfa611f1f..e626a8d5cc755c4451e673490c661514fd205227 100644 (file)
@@ -30,6 +30,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(RegExpObject);
+
 const ClassInfo RegExpObject::info = { "RegExp", 0, 0, ExecState::regExpTable };
 
 /* Source for RegExpObject.lut.h
@@ -44,8 +46,7 @@ const ClassInfo RegExpObject::info = { "RegExp", 0, 0, ExecState::regExpTable };
 
 RegExpObject::RegExpObject(RegExpPrototype* regExpPrototype, PassRefPtr<RegExp> regExp)
     : JSObject(regExpPrototype)
-    , m_regExp(regExp)
-    , m_lastIndex(0)
+    , d(new RegExpObjectData(regExp, 0))
 {
 }
 
@@ -62,15 +63,15 @@ JSValue* RegExpObject::getValueProperty(ExecState* exec, int token) const
 {
     switch (token) {
         case Global:
-            return jsBoolean(m_regExp->global());
+            return jsBoolean(d->regExp->global());
         case IgnoreCase:
-            return jsBoolean(m_regExp->ignoreCase());
+            return jsBoolean(d->regExp->ignoreCase());
         case Multiline:
-            return jsBoolean(m_regExp->multiline());
+            return jsBoolean(d->regExp->multiline());
         case Source:
-            return jsString(exec, m_regExp->pattern());
+            return jsString(exec, d->regExp->pattern());
         case LastIndex:
-            return jsNumber(exec, m_lastIndex);
+            return jsNumber(exec, d->lastIndex);
     }
     
     ASSERT_NOT_REACHED();
@@ -86,7 +87,7 @@ void RegExpObject::putValueProperty(ExecState* exec, int token, JSValue* value)
 {
     UNUSED_PARAM(token);
     ASSERT(token == LastIndex);
-    m_lastIndex = value->toInteger(exec);
+    d->lastIndex = value->toInteger(exec);
 }
 
 bool RegExpObject::match(ExecState* exec, const ArgList& args)
@@ -107,20 +108,20 @@ bool RegExpObject::match(ExecState* exec, const ArgList& args)
     bool global = get(exec, exec->propertyNames().global)->toBoolean(exec);
     int lastIndex = 0;
     if (global) {
-        if (m_lastIndex < 0 || m_lastIndex > input.size()) {
-            m_lastIndex = 0;
+        if (d->lastIndex < 0 || d->lastIndex > input.size()) {
+            d->lastIndex = 0;
             return false;
         }
-        lastIndex = static_cast<int>(m_lastIndex);
+        lastIndex = static_cast<int>(d->lastIndex);
     }
 
     int foundIndex;
     int foundLength;
-    regExpObj->performMatch(m_regExp.get(), input, lastIndex, foundIndex, foundLength);
+    regExpObj->performMatch(d->regExp.get(), input, lastIndex, foundIndex, foundLength);
 
     if (global) {
         lastIndex = foundIndex < 0 ? 0 : foundIndex + foundLength;
-        m_lastIndex = lastIndex;
+        d->lastIndex = lastIndex;
     }
 
     return foundIndex >= 0;
index 9e84c9c63683406463bcb902fc2f053a334a3125..6e4c29801960bb445694de7a64e0f6e6ef9699ff 100644 (file)
@@ -35,8 +35,8 @@ namespace KJS {
         RegExpObject(RegExpPrototype*, PassRefPtr<RegExp>);
         virtual ~RegExpObject();
 
-        void setRegExp(PassRefPtr<RegExp> r) { m_regExp = r; }
-        RegExp* regExp() const { return m_regExp.get(); }
+        void setRegExp(PassRefPtr<RegExp> r) { d->regExp = r; }
+        RegExp* regExp() const { return d->regExp.get(); }
 
         JSValue* test(ExecState*, const ArgList&);
         JSValue* exec(ExecState*, const ArgList&);
@@ -49,15 +49,25 @@ namespace KJS {
         virtual const ClassInfo* classInfo() const { return &info; }
         static const ClassInfo info;
 
-        void setLastIndex(double lastIndex) { m_lastIndex = lastIndex; }
+        void setLastIndex(double lastIndex) { d->lastIndex = lastIndex; }
 
     private:
         bool match(ExecState*, const ArgList&);
 
         virtual CallType getCallData(CallData&);
-
-        RefPtr<RegExp> m_regExp;
-        double m_lastIndex;
+        
+        struct RegExpObjectData {
+            RegExpObjectData(PassRefPtr<RegExp> regExp_, double lastIndex_)
+                : regExp(regExp_)
+                , lastIndex(lastIndex_)
+            {
+            }
+
+            RefPtr<RegExp> regExp;
+            double lastIndex;
+        };
+        
+        OwnPtr<RegExpObjectData> d;
     };
 
 } // namespace KJS
index 6eaaf3411a7b1e6f4571423eaccc46d125dd0bf2..82eb22628cf57f80bfcd364fd1f2c4f24c12b214 100644 (file)
@@ -34,6 +34,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(RegExpPrototype);
+
 static JSValue* regExpProtoFuncTest(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* regExpProtoFuncExec(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* regExpProtoFuncCompile(ExecState*, JSObject*, JSValue*, const ArgList&);
@@ -46,10 +48,10 @@ const ClassInfo RegExpPrototype::info = { "RegExpPrototype", 0, 0, 0 };
 RegExpPrototype::RegExpPrototype(ExecState* exec, ObjectPrototype* objectPrototype, FunctionPrototype* functionPrototype)
     : JSObject(objectPrototype)
 {
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().compile, regExpProtoFuncCompile), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().exec, regExpProtoFuncExec), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().test, regExpProtoFuncTest), DontEnum);
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, regExpProtoFuncToString), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().compile, regExpProtoFuncCompile), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().exec, regExpProtoFuncExec), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().test, regExpProtoFuncTest), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, regExpProtoFuncToString), DontEnum);
 }
 
 // ------------------------------ Functions ---------------------------
index 368f9999c4ac1f20336738d6c8039e38349a748f..620fa74e1d311d8e2a9bf323880191d6309460c7 100644 (file)
@@ -165,17 +165,18 @@ public:
     virtual UString className() const { return "global"; }
 };
 COMPILE_ASSERT(!IsInteger<GlobalObject>::value, WTF_IsInteger_GlobalObject_false);
+ASSERT_CLASS_FITS_IN_CELL(GlobalObject);
 
 GlobalObject::GlobalObject(Vector<UString>& arguments)
 {
-    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "debug"), functionDebug));
-    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "print"), functionPrint));
-    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "quit"), functionQuit));
-    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "gc"), functionGC));
-    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "version"), functionVersion));
-    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "run"), functionRun));
-    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "load"), functionLoad));
-    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "readline"), functionReadline));
+    putDirectFunction(globalExec(), new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "debug"), functionDebug));
+    putDirectFunction(globalExec(), new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "print"), functionPrint));
+    putDirectFunction(globalExec(), new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "quit"), functionQuit));
+    putDirectFunction(globalExec(), new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "gc"), functionGC));
+    putDirectFunction(globalExec(), new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "version"), functionVersion));
+    putDirectFunction(globalExec(), new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "run"), functionRun));
+    putDirectFunction(globalExec(), new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "load"), functionLoad));
+    putDirectFunction(globalExec(), new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "readline"), functionReadline));
 
     JSObject* array = constructEmptyArray(globalExec());
     for (size_t i = 0; i < arguments.size(); ++i)
index 14c2c9f988f2587625baebd749624e64206caf5a..66edfc4789a42acb22875f8f06cd5e57f3f04ed0 100644 (file)
@@ -44,14 +44,16 @@ static JSValue* stringFromCharCode(ExecState* exec, JSObject*, JSValue*, const A
     return jsString(exec, s);
 }
 
+ASSERT_CLASS_FITS_IN_CELL(StringConstructor);
+
 StringConstructor::StringConstructor(ExecState* exec, FunctionPrototype* functionPrototype, StringPrototype* stringPrototype)
-    : InternalFunction(functionPrototype, Identifier(exec, stringPrototype->classInfo()->className))
+    : InternalFunction(exec, functionPrototype, Identifier(exec, stringPrototype->classInfo()->className))
 {
     // ECMA 15.5.3.1 String.prototype
     putDirect(exec->propertyNames().prototype, stringPrototype, ReadOnly | DontEnum | DontDelete);
 
     // ECMA 15.5.3.2 fromCharCode()
-    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().fromCharCode, stringFromCharCode), DontEnum);
+    putDirectFunction(exec, new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().fromCharCode, stringFromCharCode), DontEnum);
 
     // no. of arguments for constructor
     putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly | DontEnum | DontDelete);
index 0ad18d26892bfedea003575faf77facd0d207c6f..e6aa6d68a630aa300869687d4350d4a41f0d8c4e 100644 (file)
@@ -25,6 +25,8 @@
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(StringObject);
+
 const ClassInfo StringObject::info = { "String", 0, 0, 0 };
 
 StringObject::StringObject(ExecState* exec, JSObject* prototype)
index 3426bffdd8170582e0e7874b8cbf5bb78151509b..22bd337e51aeeabbdc4a45270ff991c240250170 100644 (file)
@@ -34,6 +34,8 @@ using namespace WTF;
 
 namespace KJS {
 
+ASSERT_CLASS_FITS_IN_CELL(StringPrototype);
+
 static JSValue* stringProtoFuncToString(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* stringProtoFuncCharAt(ExecState*, JSObject*, JSValue*, const ArgList&);
 static JSValue* stringProtoFuncCharCodeAt(ExecState*, JSObject*, JSValue*, const ArgList&);
index 32a0f9f4ddc421b263019bd29e36bc011d21c622..aa4c0804152323d91f8cde1443a3ae77cbd08717 100644 (file)
@@ -34,6 +34,8 @@
 #include <pthread.h>
 #endif
 
+#define ASSERT_CLASS_FITS_IN_CELL(class) COMPILE_ASSERT(sizeof(class) <= CELL_SIZE, class_fits_in_cell)
+
 namespace KJS {
 
     class ArgList;
index 326b5449bec2149c5f93051df95495bd80fb8415..3ee337037004c09b8247fdacee2cac46afe2f4aa 100644 (file)
@@ -29,6 +29,7 @@
 #include "config.h"
 #include "Profiler.h"
 
+#include "CommonIdentifiers.h"
 #include "ExecState.h"
 #include "JSFunction.h"
 #include "JSGlobalObject.h"
@@ -43,9 +44,9 @@ static const char* GlobalCodeExecution = "(program)";
 static const char* AnonymousFunction = "(anonymous function)";
 static unsigned ProfilesUID = 0;
 
-static CallIdentifier createCallIdentifier(JSObject*);
-static CallIdentifier createCallIdentifier(const UString& sourceURL, int startingLineNumber);
-static CallIdentifier createCallIdentifierFromFunctionImp(JSFunction*);
+static CallIdentifier createCallIdentifier(ExecState*, JSObject*);
+static CallIdentifier createCallIdentifier(ExecState*, const UString& sourceURL, int startingLineNumber);
+static CallIdentifier createCallIdentifierFromFunctionImp(ExecState*, JSFunction*);
 
 Profiler* Profiler::s_sharedProfiler = 0;
 Profiler* Profiler::s_sharedEnabledProfilerReference = 0;
@@ -115,14 +116,14 @@ void Profiler::willExecute(ExecState* exec, JSObject* calledFunction)
 {
     ASSERT(!m_currentProfiles.isEmpty());
 
-    dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::willExecute, createCallIdentifier(calledFunction), exec->lexicalGlobalObject()->profileGroup());
+    dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::willExecute, createCallIdentifier(exec, calledFunction), exec->lexicalGlobalObject()->profileGroup());
 }
 
 void Profiler::willExecute(ExecState* exec, const UString& sourceURL, int startingLineNumber)
 {
     ASSERT(!m_currentProfiles.isEmpty());
 
-    CallIdentifier callIdentifier = createCallIdentifier(sourceURL, startingLineNumber);
+    CallIdentifier callIdentifier = createCallIdentifier(exec, sourceURL, startingLineNumber);
 
     dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::willExecute, callIdentifier, exec->lexicalGlobalObject()->profileGroup());
 }
@@ -131,39 +132,36 @@ void Profiler::didExecute(ExecState* exec, JSObject* calledFunction)
 {
     ASSERT(!m_currentProfiles.isEmpty());
 
-    dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::didExecute, createCallIdentifier(calledFunction), exec->lexicalGlobalObject()->profileGroup());
+    dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::didExecute, createCallIdentifier(exec, calledFunction), exec->lexicalGlobalObject()->profileGroup());
 }
 
 void Profiler::didExecute(ExecState* exec, const UString& sourceURL, int startingLineNumber)
 {
     ASSERT(!m_currentProfiles.isEmpty());
 
-    dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::didExecute, createCallIdentifier(sourceURL, startingLineNumber), exec->lexicalGlobalObject()->profileGroup());
+    dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::didExecute, createCallIdentifier(exec, sourceURL, startingLineNumber), exec->lexicalGlobalObject()->profileGroup());
 }
 
-CallIdentifier createCallIdentifier(JSObject* calledFunction)
+CallIdentifier createCallIdentifier(ExecState* exec, JSObject* calledFunction)
 {
     if (calledFunction->inherits(&JSFunction::info))
-        return createCallIdentifierFromFunctionImp(static_cast<JSFunction*>(calledFunction));
+        return createCallIdentifierFromFunctionImp(exec, static_cast<JSFunction*>(calledFunction));
     if (calledFunction->inherits(&InternalFunction::info))
-        return CallIdentifier(static_cast<InternalFunction*>(calledFunction)->functionName().ustring(), "", 0);
+        return CallIdentifier(static_cast<InternalFunction*>(calledFunction)->name(exec), "", 0);
 
     UString name = "(" + calledFunction->className() + " object)";
     return CallIdentifier(name, 0, 0);
 }
 
-CallIdentifier createCallIdentifier(const UString& sourceURL, int startingLineNumber)
+CallIdentifier createCallIdentifier(ExecState*, const UString& sourceURL, int startingLineNumber)
 {
     return CallIdentifier(GlobalCodeExecution, sourceURL, startingLineNumber);
 }
 
-CallIdentifier createCallIdentifierFromFunctionImp(JSFunction* functionImp)
+CallIdentifier createCallIdentifierFromFunctionImp(ExecState* exec, JSFunction* function)
 {
-    UString name = functionImp->functionName().ustring();
-    if (name.isEmpty())
-        name = AnonymousFunction;
-
-    return CallIdentifier(name, functionImp->m_body->sourceURL(), functionImp->m_body->lineNo());
+    const UString& name = function->name(exec);
+    return CallIdentifier(name.isEmpty() ? AnonymousFunction : name, function->m_body->sourceURL(), function->m_body->lineNo());
 }
 
 } // namespace KJS
index 0811522d7f54c90d7fb821912f3bc180477ac7db..4dd0b3890d24296548ab789c905ee9c1c638f146 100644 (file)
@@ -1,3 +1,14 @@
+2008-08-17  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Cameron Zwarich.
+
+        Made room for a free word in JSCell.
+        
+        Changed JSDOMWindowBase to store its auxiliary data in a subclass of
+        JSGlobalData, so the two could share a pointer.
+        
+        Added a bunch of ASSERTs, to help catch over-sized objects.
+
 2008-08-15  Mark Rowe  <mrowe@apple.com>
 
         Reviewed by Dan Bernstein.
index 07e1244f4aea7ef7f53893b110aadfdc4563305c..e7f971a7abc248ff6c0a7007d99b6309b2ea5b03 100644 (file)
                        productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
                        projectDirPath = "";
                        projectRoot = "";
-                       projectRoots = (
-                               "",
-                       );
                        targets = (
                                93F198A508245E59001E9ABC /* WebCore */,
                                DD041FBE09D9DDBE0010AF2A /* Derived Sources */,
index 794db0ac90c39f3afdf22fa80d999083c4780793..fb1244842af5f2f2868ebbcec07c99335b34a2bc 100644 (file)
@@ -192,17 +192,24 @@ const ClassInfo JSDOMWindowBase::s_info = { "Window", 0, &JSDOMWindowBaseTable,
 @end
 */
 
+JSDOMWindowBase::JSDOMWindowBaseData::JSDOMWindowBaseData(PassRefPtr<DOMWindow> window_, JSDOMWindowBase* jsWindow_, JSDOMWindowShell* shell_)
+    : JSGlobalObjectData(jsWindow_, shell_)
+    , impl(window_)
+    , evt(0)
+    , returnValueSlot(0)
+    , shell(shell_)
+{
+}
+
 JSDOMWindowBase::JSDOMWindowBase(JSObject* prototype, DOMWindow* window, JSDOMWindowShell* shell)
-    : JSGlobalObject(prototype, shell)
-    , m_impl(window)
-    , d(new JSDOMWindowBasePrivate(shell))
+    : JSGlobalObject(prototype, new JSDOMWindowBaseData(window, this, shell), shell)
 {
     // Time in milliseconds before the script timeout handler kicks in.
     setTimeoutTime(10000);
 
     GlobalPropertyInfo staticGlobals[] = {
         GlobalPropertyInfo(Identifier(globalExec(), "document"), jsNull(), DontDelete | ReadOnly),
-        GlobalPropertyInfo(Identifier(globalExec(), "window"), d->m_shell, DontDelete | ReadOnly)
+        GlobalPropertyInfo(Identifier(globalExec(), "window"), d()->shell, DontDelete | ReadOnly)
     };
     
     addStaticGlobals(staticGlobals, sizeof(staticGlobals) / sizeof(GlobalPropertyInfo));
@@ -210,35 +217,35 @@ JSDOMWindowBase::JSDOMWindowBase(JSObject* prototype, DOMWindow* window, JSDOMWi
 
 void JSDOMWindowBase::updateDocument()
 {
-    ASSERT(m_impl->document());
+    ASSERT(d()->impl->document());
     ExecState* exec = globalExec();
-    symbolTablePutWithAttributes(Identifier(exec, "document"), toJS(exec, m_impl->document()), DontDelete | ReadOnly);
+    symbolTablePutWithAttributes(Identifier(exec, "document"), toJS(exec, d()->impl->document()), DontDelete | ReadOnly);
 }
 
 JSDOMWindowBase::~JSDOMWindowBase()
 {
-    if (m_impl->frame())
-        m_impl->frame()->script()->clearFormerWindow(asJSDOMWindow(this));
+    if (d()->impl->frame())
+        d()->impl->frame()->script()->clearFormerWindow(asJSDOMWindow(this));
 
     clearAllTimeouts();
 
     // Clear any backpointers to the window
 
-    ListenersMap::iterator i2 = d->jsEventListeners.begin();
-    ListenersMap::iterator e2 = d->jsEventListeners.end();
+    ListenersMap::iterator i2 = d()->jsEventListeners.begin();
+    ListenersMap::iterator e2 = d()->jsEventListeners.end();
     for (; i2 != e2; ++i2)
         i2->second->clearWindow();
-    i2 = d->jsHTMLEventListeners.begin();
-    e2 = d->jsHTMLEventListeners.end();
+    i2 = d()->jsHTMLEventListeners.begin();
+    e2 = d()->jsHTMLEventListeners.end();
     for (; i2 != e2; ++i2)
         i2->second->clearWindow();
 
-    UnprotectedListenersMap::iterator i1 = d->jsUnprotectedEventListeners.begin();
-    UnprotectedListenersMap::iterator e1 = d->jsUnprotectedEventListeners.end();
+    UnprotectedListenersMap::iterator i1 = d()->jsUnprotectedEventListeners.begin();
+    UnprotectedListenersMap::iterator e1 = d()->jsUnprotectedEventListeners.end();
     for (; i1 != e1; ++i1)
         i1->second->clearWindow();
-    i1 = d->jsUnprotectedHTMLEventListeners.begin();
-    e1 = d->jsUnprotectedHTMLEventListeners.end();
+    i1 = d()->jsUnprotectedHTMLEventListeners.begin();
+    e1 = d()->jsUnprotectedHTMLEventListeners.end();
     for (; i1 != e1; ++i1)
         i1->second->clearWindow();
 }
@@ -431,9 +438,9 @@ JSValue *JSDOMWindowBase::getValueProperty(ExecState *exec, int token) const
     case Event_:
       if (!allowsAccessFrom(exec))
         return jsUndefined();
-      if (!d->m_evt)
+      if (!d()->evt)
         return jsUndefined();
-      return toJS(exec, d->m_evt);
+      return toJS(exec, d()->evt);
     case Image:
       if (!allowsAccessFrom(exec))
         return jsUndefined();
@@ -834,7 +841,7 @@ JSEventListener* JSDOMWindowBase::findJSEventListener(JSValue* val, bool html)
     if (!val->isObject())
         return 0;
     JSObject* object = static_cast<JSObject*>(val);
-    ListenersMap& listeners = html ? d->jsHTMLEventListeners : d->jsEventListeners;
+    ListenersMap& listeners = html ? d()->jsHTMLEventListeners : d()->jsEventListeners;
     return listeners.get(object);
 }
 
@@ -857,7 +864,7 @@ JSUnprotectedEventListener* JSDOMWindowBase::findJSUnprotectedEventListener(Exec
     if (!val->isObject())
         return 0;
     JSObject* object = static_cast<JSObject*>(val);
-    UnprotectedListenersMap& listeners = html ? d->jsUnprotectedHTMLEventListeners : d->jsUnprotectedEventListeners;
+    UnprotectedListenersMap& listeners = html ? d()->jsUnprotectedHTMLEventListeners : d()->jsUnprotectedEventListeners;
     return listeners.get(object);
 }
 
@@ -876,13 +883,13 @@ PassRefPtr<JSUnprotectedEventListener> JSDOMWindowBase::findOrCreateJSUnprotecte
 
 void JSDOMWindowBase::clearHelperObjectProperties()
 {
-    d->m_evt = 0;
+    d()->evt = 0;
 }
 
 void JSDOMWindowBase::clear()
 {
-    if (d->m_returnValueSlot && !*d->m_returnValueSlot)
-        *d->m_returnValueSlot = getDirect(Identifier(globalExec(), "returnValue"));
+    if (d()->returnValueSlot && !*d()->returnValueSlot)
+        *d()->returnValueSlot = getDirect(Identifier(globalExec(), "returnValue"));
 
     clearAllTimeouts();
     clearHelperObjectProperties();
@@ -890,12 +897,12 @@ void JSDOMWindowBase::clear()
 
 void JSDOMWindowBase::setCurrentEvent(Event* evt)
 {
-    d->m_evt = evt;
+    d()->evt = evt;
 }
 
 Event* JSDOMWindowBase::currentEvent()
 {
-    return d->m_evt;
+    return d()->evt;
 }
 
 JSObject* JSDOMWindowBase::toThisObject(ExecState*) const
@@ -905,7 +912,7 @@ JSObject* JSDOMWindowBase::toThisObject(ExecState*) const
 
 JSDOMWindowShell* JSDOMWindowBase::shell() const
 {
-    return d->m_shell;
+    return d()->shell;
 }
 
 JSGlobalData* JSDOMWindowBase::commonJSGlobalData()
@@ -1153,15 +1160,15 @@ JSValue* windowProtoFuncNotImplemented(ExecState* exec, JSObject*, JSValue* this
 
 void JSDOMWindowBase::setReturnValueSlot(JSValue** slot)
 {
-    d->m_returnValueSlot = slot;
+    d()->returnValueSlot = slot;
 }
 
 ////////////////////// timeouts ////////////////////////
 
 void JSDOMWindowBase::clearAllTimeouts()
 {
-    deleteAllValues(d->m_timeouts);
-    d->m_timeouts.clear();
+    deleteAllValues(d()->timeouts);
+    d()->timeouts.clear();
 }
 
 int JSDOMWindowBase::installTimeout(ScheduledAction* a, int t, bool singleShot)
@@ -1174,8 +1181,8 @@ int JSDOMWindowBase::installTimeout(ScheduledAction* a, int t, bool singleShot)
 
     int nestLevel = timerNestingLevel + 1;
     DOMWindowTimer* timer = new DOMWindowTimer(timeoutId, nestLevel, this, a);
-    ASSERT(!d->m_timeouts.get(timeoutId));
-    d->m_timeouts.set(timeoutId, timer);
+    ASSERT(!d()->timeouts.get(timeoutId));
+    d()->timeouts.set(timeoutId, timer);
     // Use a minimum interval of 10 ms to match other browsers, but only once we've
     // nested enough to notice that we're repeating.
     // Faster timers might be "better", but they're incompatible.
@@ -1201,14 +1208,14 @@ int JSDOMWindowBase::installTimeout(ExecState* exec, JSValue* func, const ArgLis
 
 PausedTimeouts* JSDOMWindowBase::pauseTimeouts()
 {
-    size_t count = d->m_timeouts.size();
+    size_t count = d()->timeouts.size();
     if (count == 0)
         return 0;
 
     PausedTimeout* t = new PausedTimeout [count];
     PausedTimeouts* result = new PausedTimeouts(t, count);
 
-    JSDOMWindowBasePrivate::TimeoutsMap::iterator it = d->m_timeouts.begin();
+    JSDOMWindowBaseData::TimeoutsMap::iterator it = d()->timeouts.begin();
     for (size_t i = 0; i != count; ++i, ++it) {
         int timeoutId = it->first;
         DOMWindowTimer* timer = it->second;
@@ -1218,10 +1225,10 @@ PausedTimeouts* JSDOMWindowBase::pauseTimeouts()
         t[i].repeatInterval = timer->repeatInterval();
         t[i].action = timer->takeAction();
     }
-    ASSERT(it == d->m_timeouts.end());
+    ASSERT(it == d()->timeouts.end());
 
-    deleteAllValues(d->m_timeouts);
-    d->m_timeouts.clear();
+    deleteAllValues(d()->timeouts);
+    d()->timeouts.clear();
 
     return result;
 }
@@ -1235,7 +1242,7 @@ void JSDOMWindowBase::resumeTimeouts(PausedTimeouts* timeouts)
     for (size_t i = 0; i != count; ++i) {
         int timeoutId = array[i].timeoutId;
         DOMWindowTimer* timer = new DOMWindowTimer(timeoutId, array[i].nestingLevel, this, array[i].action);
-        d->m_timeouts.set(timeoutId, timer);
+        d()->timeouts.set(timeoutId, timer);
         timer->start(array[i].nextFireInterval, array[i].repeatInterval);
     }
     delete [] array;
@@ -1249,7 +1256,7 @@ void JSDOMWindowBase::clearTimeout(int timeoutId, bool delAction)
     if (timeoutId <= 0)
         return;
 
-    delete d->m_timeouts.take(timeoutId);
+    delete d()->timeouts.take(timeoutId);
 }
 
 void JSDOMWindowBase::timerFired(DOMWindowTimer* timer)
@@ -1261,7 +1268,7 @@ void JSDOMWindowBase::timerFired(DOMWindowTimer* timer)
         timer->action()->execute(shell());
         // The DOMWindowTimer object may have been deleted or replaced during execution,
         // so we re-fetch it.
-        timer = d->m_timeouts.get(timeoutId);
+        timer = d()->timeouts.get(timeoutId);
         if (!timer)
             return;
 
@@ -1275,7 +1282,7 @@ void JSDOMWindowBase::timerFired(DOMWindowTimer* timer)
 
     // Delete timer before executing the action for one-shot timers.
     ScheduledAction* action = timer->takeAction();
-    d->m_timeouts.remove(timer->timeoutId());
+    d()->timeouts.remove(timer->timeoutId());
     delete timer;
     action->execute(shell());
 
@@ -1289,22 +1296,22 @@ void JSDOMWindowBase::disconnectFrame()
 
 JSDOMWindowBase::ListenersMap& JSDOMWindowBase::jsEventListeners()
 {
-    return d->jsEventListeners;
+    return d()->jsEventListeners;
 }
 
 JSDOMWindowBase::ListenersMap& JSDOMWindowBase::jsHTMLEventListeners()
 {
-    return d->jsHTMLEventListeners;
+    return d()->jsHTMLEventListeners;
 }
 
 JSDOMWindowBase::UnprotectedListenersMap& JSDOMWindowBase::jsUnprotectedEventListeners()
 {
-    return d->jsUnprotectedEventListeners;
+    return d()->jsUnprotectedEventListeners;
 }
 
 JSDOMWindowBase::UnprotectedListenersMap& JSDOMWindowBase::jsUnprotectedHTMLEventListeners()
 {
-    return d->jsUnprotectedHTMLEventListeners;
+    return d()->jsUnprotectedHTMLEventListeners;
 }
 
 void DOMWindowTimer::fired()
index 05ce6b4e8377f3b3eb140505165e69c779189855..9ccb8dc07a5dcd017052a13eb9052c6027f278d2 100644 (file)
@@ -60,7 +60,7 @@ namespace WebCore {
 
         void updateDocument();
 
-        DOMWindow* impl() const { return m_impl.get(); }
+        DOMWindow* impl() const { return d()->impl.get(); }
 
         void disconnectFrame();
 
@@ -146,6 +146,23 @@ namespace WebCore {
         };
 
     private:
+        struct JSDOMWindowBaseData : public JSGlobalObjectData {
+            JSDOMWindowBaseData(PassRefPtr<DOMWindow> window_, JSDOMWindowBase* jsWindow_, JSDOMWindowShell* shell_);
+
+            RefPtr<DOMWindow> impl;
+
+            JSDOMWindowBase::ListenersMap jsEventListeners;
+            JSDOMWindowBase::ListenersMap jsHTMLEventListeners;
+            JSDOMWindowBase::UnprotectedListenersMap jsUnprotectedEventListeners;
+            JSDOMWindowBase::UnprotectedListenersMap jsUnprotectedHTMLEventListeners;
+            Event* evt;
+            KJS::JSValue** returnValueSlot;
+            JSDOMWindowShell* shell;
+
+            typedef HashMap<int, DOMWindowTimer*> TimeoutsMap;
+            TimeoutsMap timeouts;
+        };
+        
         KJS::JSValue* getListener(KJS::ExecState*, const AtomicString& eventType) const;
         void setListener(KJS::ExecState*, const AtomicString& eventType, KJS::JSValue* function);
 
@@ -159,9 +176,8 @@ namespace WebCore {
 
         bool allowsAccessFromPrivate(const KJS::JSGlobalObject*) const;
         String crossDomainAccessErrorMessage(const KJS::JSGlobalObject*) const;
-
-        RefPtr<DOMWindow> m_impl;
-        OwnPtr<JSDOMWindowBasePrivate> d;
+        
+        JSDOMWindowBaseData* d() const { return static_cast<JSDOMWindowBaseData*>(KJS::JSVariableObject::d); }
     };
 
     // Returns a JSDOMWindow or jsNull()
index 944bf85789c62dd6a991538331cb42edd6695643..ad9d63f10b85ad4d715cf2f3438bce82a5f557af 100644 (file)
 
 namespace WebCore {
 
-struct JSDOMWindowBasePrivate {
-    JSDOMWindowBasePrivate(JSDOMWindowShell* shell)
-        : m_evt(0)
-        , m_returnValueSlot(0)
-        , m_shell(shell)
-    {
-    }
-
-    JSDOMWindowBase::ListenersMap jsEventListeners;
-    JSDOMWindowBase::ListenersMap jsHTMLEventListeners;
-    JSDOMWindowBase::UnprotectedListenersMap jsUnprotectedEventListeners;
-    JSDOMWindowBase::UnprotectedListenersMap jsUnprotectedHTMLEventListeners;
-    Event* m_evt;
-    KJS::JSValue** m_returnValueSlot;
-    JSDOMWindowShell* m_shell;
-
-    typedef HashMap<int, DOMWindowTimer*> TimeoutsMap;
-    TimeoutsMap m_timeouts;
-};
-
 inline JSDOMWindow* asJSDOMWindow(KJS::JSGlobalObject* globalObject)
 {
     return static_cast<JSDOMWindow*>(globalObject);
@@ -180,7 +160,7 @@ inline bool JSDOMWindowBase::allowsAccessFrom(KJS::ExecState* exec, String& mess
 ALWAYS_INLINE bool JSDOMWindowBase::allowsAccessFromPrivate(const JSGlobalObject* other) const
 {
     const JSDOMWindow* originWindow = asJSDOMWindow(other);
-    const JSDOMWindow* targetWindow = d->m_shell->window();
+    const JSDOMWindow* targetWindow = d()->shell->window();
 
     if (originWindow == targetWindow)
         return true;
index 094e62d92354519ef2df1715b93725bf1d70cf38..85365183608a805d951fd44e0091986a1ed90691 100644 (file)
@@ -39,6 +39,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSDOMWindowShell)
+
 const ClassInfo JSDOMWindowShell::s_info = { "JSDOMWindowShell", 0, 0, 0 };
 
 JSDOMWindowShell::JSDOMWindowShell(DOMWindow* domWindow)
index c085b59c9b54181b5dd4be016e8b8bbe2138aa1a..ca178391f729bd9d5c0394b3d7c2c387a4114912 100644 (file)
@@ -41,6 +41,8 @@ namespace WebCore {
 
 using namespace EventNames;
 
+ASSERT_CLASS_FITS_IN_CELL(JSAbstractEventListener)
+
 void JSAbstractEventListener::handleEvent(Event* event, bool isWindowEvent)
 {
     JSObject* listener = listenerObj();
index da545fb31314e10e5a576316512866394f5754df..353fc2aebdb07fb12778d8af0d57b7269837e036 100644 (file)
@@ -34,6 +34,8 @@ namespace WebCore {
 
 using namespace KJS;
 
+ASSERT_CLASS_FITS_IN_CELL(JSEventTargetNode)
+
 JSEventTargetNode::JSEventTargetNode(JSObject* prototype, Node* node)
     : JSNode(prototype, node)
 {
index f0936627ca473d13390ac60a5c16bbb41ef4897d..8e027b252c0c255fe77f592cd0672faa0a335ce1 100644 (file)
@@ -26,6 +26,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSHTMLInputElementBase)
+
 static JSValue* jsHTMLInputElementBaseFunctionSetSelectionRange(ExecState*, JSObject*, JSValue*, const ArgList&);
 
 }
index de3201e12306b79e71d998e08e8de2c9db8b86c0..b0b473ce2c3f73e028be575ddbce9ae977ac2c37 100644 (file)
@@ -29,6 +29,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSHTMLOptionElementConstructor)
+
 const ClassInfo JSHTMLOptionElementConstructor::s_info = { "OptionConstructor", 0, 0, 0 };
 
 JSHTMLOptionElementConstructor::JSHTMLOptionElementConstructor(ExecState* exec, Document* document)
index cae40b05af84ca294ab82928fec61129b0c87cc2..18ea6f41a0b580ab90c0851d5f27b75333c400e4 100644 (file)
@@ -28,6 +28,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSImageConstructor)
+
 const ClassInfo JSImageConstructor::s_info = { "ImageConstructor", 0, 0, 0 };
 
 JSImageConstructor::JSImageConstructor(ExecState* exec, Document* document)
index d0d5478efa43a79fb4e1e035cfa5ffa0351c4a48..6bab117a23220ee1f98dc110344b359590f0ac69 100644 (file)
@@ -32,6 +32,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSInspectedObjectWrapper)
+
 typedef HashMap<JSObject*, JSInspectedObjectWrapper*> WrapperMap;
 typedef HashMap<JSGlobalObject*, WrapperMap*> GlobalObjectWrapperMap;
 
index 83c278c1b9fa2ea45627de118041af3986afeefd..7735ad362d817cf0262a6caf9382eab17a1b8c2f 100644 (file)
@@ -32,6 +32,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSInspectorCallbackWrapper)
+
 typedef HashMap<JSObject*, JSInspectorCallbackWrapper*> WrapperMap;
 
 static WrapperMap& wrappers()
index 35f7def578c1996b6bec3d5fd307b9350fe28a71..669d1e1e1ae32bc714c3046dbb1cda4f4b986ee8 100644 (file)
@@ -35,6 +35,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSNSResolver)
+
 JSNSResolver::JSNSResolver(JSValue* resolver)
     : m_resolver(resolver)
 {
index 4e23d61146372f6e42050c74d1333aeaf0d6f5f4..9374758d5842605cc853b3d6803569085a28884d 100644 (file)
@@ -35,6 +35,8 @@ namespace WebCore {
 
 using namespace KJS;
 
+ASSERT_CLASS_FITS_IN_CELL(JSNamedNodesCollection)
+
 const ClassInfo JSNamedNodesCollection::s_info = { "Collection", 0, 0, 0 };
 
 // Such a collection is usually very short-lived, it only exists
@@ -42,20 +44,20 @@ const ClassInfo JSNamedNodesCollection::s_info = { "Collection", 0, 0, 0 };
 // so it shouldn't be a problem that it's storing all the nodes (with the same name). (David)
 JSNamedNodesCollection::JSNamedNodesCollection(KJS::JSObject* prototype, const Vector<RefPtr<Node> >& nodes)
     : DOMObject(prototype)
-    , m_nodes(nodes)
+    , m_nodes(new Vector<RefPtr<Node> >(nodes))
 {
 }
 
 JSValue* JSNamedNodesCollection::lengthGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot)
 {
     JSNamedNodesCollection* thisObj = static_cast<JSNamedNodesCollection*>(slot.slotBase());
-    return jsNumber(exec, thisObj->m_nodes.size());
+    return jsNumber(exec, thisObj->m_nodes->size());
 }
 
 JSValue* JSNamedNodesCollection::indexGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot)
 {
     JSNamedNodesCollection *thisObj = static_cast<JSNamedNodesCollection*>(slot.slotBase());
-    return toJS(exec, thisObj->m_nodes[slot.index()].get());
+    return toJS(exec, (*thisObj->m_nodes)[slot.index()].get());
 }
 
 bool JSNamedNodesCollection::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
@@ -67,7 +69,7 @@ bool JSNamedNodesCollection::getOwnPropertySlot(ExecState* exec, const Identifie
 
     bool ok;
     unsigned index = propertyName.toUInt32(&ok);
-    if (ok && index < m_nodes.size()) {
+    if (ok && index < m_nodes->size()) {
         slot.setCustomIndex(this, index, indexGetter);
         return true;
     }
@@ -76,8 +78,8 @@ bool JSNamedNodesCollection::getOwnPropertySlot(ExecState* exec, const Identifie
     // document.formName.name result by id as well as be index.
 
     AtomicString atomicPropertyName = propertyName;
-    for (unsigned i = 0; i < m_nodes.size(); i++) {
-        Node* node = m_nodes[i].get();
+    for (unsigned i = 0; i < m_nodes->size(); i++) {
+        Node* node = (*m_nodes)[i].get();
         if (node->hasAttributes() && node->attributes()->id() == atomicPropertyName) {
             slot.setCustomIndex(this, i, indexGetter);
             return true;
index 54ccd853f52dd28d18114e3f67284fde2c046d75..beed7cb1a3919a211d18acab1cda5522ba9ccdb3 100644 (file)
@@ -48,7 +48,7 @@ namespace WebCore {
         static KJS::JSValue* lengthGetter(KJS::ExecState*, const KJS::Identifier&, const KJS::PropertySlot&);
         static KJS::JSValue* indexGetter(KJS::ExecState*, const KJS::Identifier&, const KJS::PropertySlot&);
 
-        Vector<RefPtr<Node> > m_nodes;
+        OwnPtr<Vector<RefPtr<Node> > > m_nodes;
     };
 
 } // namespace WebCore
index 784327acd20d292821556da0b4694144fe3084d3..7b1bbc5d1a0a8d5c85cb8f2824a6c4d8df40fb44 100644 (file)
@@ -28,6 +28,8 @@ namespace WebCore {
 
 using namespace KJS;
 
+ASSERT_CLASS_FITS_IN_CELL(JSNodeFilterCondition)
+
 JSNodeFilterCondition::JSNodeFilterCondition(JSValue* filter)
     : m_filter(filter)
 {
index 78840b3ad5003137855ffbcbeef943451ac979d0..355e12ef0d2e1c8d0e2b990624e8b0000a0d446e 100644 (file)
@@ -32,6 +32,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSQuarantinedObjectWrapper)
+
 const ClassInfo JSQuarantinedObjectWrapper::s_info = { "JSQuarantinedObjectWrapper", 0, 0, 0 };
 
 JSQuarantinedObjectWrapper* JSQuarantinedObjectWrapper::asWrapper(JSValue* value)
index 0b3bb5a704bcc5749476d49ef86f8fedb6672720..19043465a9e470f06547af2083bf68ed4405fc13 100644 (file)
@@ -32,6 +32,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSRGBColor)
+
 const ClassInfo JSRGBColor::s_info = { "RGBColor", 0, &JSRGBColorTable, 0 };
 
 /*
index de9c2e8fea567e746a91b6827dbf105623ddb592..e8e76d0a1ffa5f0816d172d10fb6104f3de07b2b 100644 (file)
@@ -28,6 +28,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSXMLHttpRequestConstructor)
+
 const ClassInfo JSXMLHttpRequestConstructor::s_info = { "XMLHttpRequestConstructor", 0, 0, 0 };
 
 JSXMLHttpRequestConstructor::JSXMLHttpRequestConstructor(ExecState* exec, Document* document)
index 0d10651000daf60fb2860fd4c0369ec73ccde3a7..bad605779c3a2ca57329b6539a723973ccb2c143 100644 (file)
@@ -37,6 +37,8 @@ using namespace KJS;
 
 namespace WebCore {
 
+ASSERT_CLASS_FITS_IN_CELL(JSXSLTProcessorConstructor)
+
 const ClassInfo JSXSLTProcessorConstructor::s_info = { "XSLTProcessorConsructor", 0, 0, 0 };
 
 JSXSLTProcessorConstructor::JSXSLTProcessorConstructor(ExecState* exec)
index 6d49fed237e4ab9e794522f8772b7a94e03a9df4..cd2b9576f5e0b4e1cf037a1ce24ef87775d26e8a 100644 (file)
@@ -727,6 +727,8 @@ sub GenerateImplementation
     push(@implContent, "\nusing namespace KJS;\n\n");
     push(@implContent, "namespace WebCore {\n\n");
 
+    push(@implContent, "ASSERT_CLASS_FITS_IN_CELL($className)\n\n");
+
     # - Add all attributes in a hashtable definition
     my $numAttributes = @{$dataNode->attributes};
     $numAttributes++ if $dataNode->extendedAttributes->{"GenerateConstructor"};
index b67d39b4b7c157c91f330565cb740cb718adfa32..3ca231705fed9c6c6ecab785ce0272896db25005 100644 (file)
@@ -354,7 +354,7 @@ static jobject convertArrayInstanceToJavaArray(ExecState *exec, JSValue *value,
     // the requested Java Array type requested, unless the array type is some object array
     // other than a string.
     JSArray *jsArray = static_cast<JSArray *>(value);
-    unsigned length = jsArray->getLength();
+    unsigned length = jsArray->length();
     jobjectArray jarray = 0;
     
     // Build the correct array type
index de7964d66ebadcee95d68bf02af81b9d678d0b36..7375bb208c4dd6d3b5b3363bb879d0f59a28318b 100644 (file)
@@ -34,8 +34,10 @@ namespace KJS {
 
 using namespace Bindings;
 
+ASSERT_CLASS_FITS_IN_CELL(RuntimeMethod);
+
 RuntimeMethod::RuntimeMethod(ExecState *exec, const Identifier &ident, Bindings::MethodList &m) 
-    : InternalFunction(exec->lexicalGlobalObject()->functionPrototype(), ident)
+    : InternalFunction(exec, exec->lexicalGlobalObject()->functionPrototype(), ident)
     , _methodList(new MethodList(m))
 {
 }
index 6d6193bad163a7c29ef4549c85af7a4d858798bd..12524b801d26af95515e91896b1d33421d4a2bab 100644 (file)
@@ -1,3 +1,11 @@
+2008-08-17  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Cameron Zwarich.
+
+        Made room for a free word in JSCell.
+        
+        (Updated for JavaScriptCore changes.)
+
 2008-08-15  Mark Rowe  <mrowe@apple.com>
 
         Rubber-stamped by Geoff Garen.
index 3df95f37f2e5e1df3d09d441dcadbe18531cd54c..5d3a64d3b228d4f04819fb879e1e65d930c1740c 100644 (file)
@@ -80,7 +80,7 @@ WebScriptDebugger::WebScriptDebugger(JSGlobalObject* globalObject)
     : m_callingDelegate(false)
 {
     attach(globalObject);
-    DebuggerCallFrame globalCallFrame(globalObject, 0, globalObject->globalScopeChain().node(), 0, 0);
+    DebuggerCallFrame globalCallFrame(0, globalObject, 0, globalObject->globalScopeChain().node(), 0, 0);
     callEvent(globalCallFrame, 0, -1);
 }
 
index c81ae56544e6a6694939167fc47e6e814651a1ce..9efcb69e76d6a42f4556ae13477109f28ed39f44 100644 (file)
@@ -3250,7 +3250,7 @@ static NSAppleEventDescriptor* aeDescFromJSValue(ExecState* exec, JSValue* jsVal
                     
                     JSArray* array = static_cast<JSArray*>(object);
                     aeDesc = [NSAppleEventDescriptor listDescriptor];
-                    unsigned numItems = array->getLength();
+                    unsigned numItems = array->length();
                     for (unsigned i = 0; i < numItems; ++i)
                         [aeDesc insertDescriptor:aeDescFromJSValue(exec, array->get(exec, i)) atIndex:0];