JavaScriptCore:
authormjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 May 2008 05:02:47 +0000 (05:02 +0000)
committermjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 May 2008 05:02:47 +0000 (05:02 +0000)
2008-05-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver and Sam.

        - fixed <rdar://problem/5815631> REGRESSION (r31239): Multiscope optimisation of function calls results in incorrect this value (breaks tvtv.de)

        Track global this value in the scope chain so we can retrieve it
        efficiently but it follows lexical scope properly.

        * kjs/ExecState.h:
        (KJS::ExecState::globalThisValue):
        * kjs/JSGlobalObject.h:
        (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData):
        * kjs/function_object.cpp:
        (KJS::FunctionObjectImp::construct):
        * kjs/scope_chain.h:
        (KJS::ScopeChainNode::ScopeChainNode):
        (KJS::ScopeChainNode::globalThisObject):
        (KJS::ScopeChainNode::push):
        (KJS::ScopeChain::ScopeChain):

LayoutTests:

2008-05-21  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Oliver and Sam.

        - tests for <rdar://problem/5815631> REGRESSION (r31239): Multiscope optimisation of function calls results in incorrect this value (breaks tvtv.de)

        * fast/frames/cross-site-this-expected.txt: Added.
        * fast/frames/cross-site-this.html: Added.
        * fast/frames/resources/cross-site-this-helper.html: Added.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/ExecState.h
JavaScriptCore/kjs/JSGlobalObject.h
JavaScriptCore/kjs/function_object.cpp
JavaScriptCore/kjs/scope_chain.h
LayoutTests/ChangeLog

index f1d347b9dc4f1c1d6a5ebf4e043efb111e3180d9..447768d2a0e70150d1fb2454d5fbb62c954e7b4e 100644 (file)
@@ -1,3 +1,24 @@
+2008-05-21  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Oliver and Sam.
+        
+        - fixed <rdar://problem/5815631> REGRESSION (r31239): Multiscope optimisation of function calls results in incorrect this value (breaks tvtv.de)
+        
+        Track global this value in the scope chain so we can retrieve it
+        efficiently but it follows lexical scope properly.
+
+        * kjs/ExecState.h:
+        (KJS::ExecState::globalThisValue):
+        * kjs/JSGlobalObject.h:
+        (KJS::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData):
+        * kjs/function_object.cpp:
+        (KJS::FunctionObjectImp::construct):
+        * kjs/scope_chain.h:
+        (KJS::ScopeChainNode::ScopeChainNode):
+        (KJS::ScopeChainNode::globalThisObject):
+        (KJS::ScopeChainNode::push):
+        (KJS::ScopeChain::ScopeChain):
+
 2008-05-21  Kevin McCullough  <kmccullough@apple.com>
 
         Sadness :(
index d4012a2c33ab86d0257d763bc8669225b513cc4c..7cef584de7c87d249fb3dcec34497f8f6e055af6 100644 (file)
@@ -80,7 +80,7 @@ namespace KJS  {
             return m_scopeChain->globalObject();
         }
         
-        JSObject* globalThisValue() const { return m_globalThisValue; }
+        JSObject* globalThisValue() const { return m_scopeChain->globalThisObject(); }
         
         Machine* machine() const { return m_machine; }
         
index e74f3615195935c44b7e871fd9d0d48fc5aac463..e4968620bf164f6f7ce233c619b9f9ac17927a51 100644 (file)
@@ -82,7 +82,7 @@ namespace KJS {
         struct JSGlobalObjectData : public JSVariableObjectData {
             JSGlobalObjectData(JSGlobalObject* globalObject, JSObject* thisValue)
                 : JSVariableObjectData(&symbolTable, registerFileStack.globalBasePointer(), 0)
-                , globalScopeChain(globalObject)
+                , globalScopeChain(globalObject, thisValue)
                 , globalExec(new ExecState(globalObject, thisValue, globalScopeChain.node()))
             {
             }
index dacbd43d9b3c5f0b1f40b42bbf3f3a4400b53b95..c02e0bf5132125b0aa3ca59fec08cd3d5556cadb 100644 (file)
@@ -172,7 +172,7 @@ JSObject* FunctionObjectImp::construct(ExecState* exec, const List& args, const
         return throwError(exec, SyntaxError, errMsg, errLine, sourceId, sourceURL);
     
     functionBody->setSource(SourceRange(source, 0, source->length()));
-    ScopeChain scopeChain(exec->lexicalGlobalObject());
+    ScopeChain scopeChain(exec->lexicalGlobalObject(), exec->globalThisValue());
 
     FunctionImp* fimp = new FunctionImp(exec, functionName, functionBody.get(), scopeChain.node());
 
index 5383932b50bd5dc770bc31fd0fbac761c32ceaf2..131b9f222142a4e9b751bc05aa03b9455b027bf6 100644 (file)
@@ -32,15 +32,17 @@ namespace KJS {
     
     class ScopeChainNode {
     public:
-        ScopeChainNode(ScopeChainNode* n, JSObject* o)
+        ScopeChainNode(ScopeChainNode* n, JSObject* o, JSObject* gt)
             : next(n)
             , object(o)
+            , globalThis(gt)
             , refCount(1)
         {
         }
 
         ScopeChainNode* next;
         JSObject* object;
+        JSObject* globalThis;
         int refCount;
         
         void deref() { if (--refCount == 0) release(); }
@@ -67,6 +69,7 @@ namespace KJS {
         ScopeChainIterator end() const;
         
         JSGlobalObject* globalObject() const; // defined in JSGlobalObject.h
+        JSObject* globalThisObject() const { return globalThis; }
         
 #ifndef NDEBUG        
         void print() const;
@@ -76,7 +79,7 @@ namespace KJS {
     inline ScopeChainNode* ScopeChainNode::push(JSObject* o)
     {
         ASSERT(o);
-        return new ScopeChainNode(this, o);
+        return new ScopeChainNode(this, o, globalThis);
     }
 
     inline ScopeChainNode* ScopeChainNode::pop()
@@ -143,8 +146,8 @@ namespace KJS {
 
     class ScopeChain {
     public:
-        ScopeChain(JSObject* o)
-            : _node(new ScopeChainNode(0, o))
+    ScopeChain(JSObject* o, JSObject* globalThis)
+            : _node(new ScopeChainNode(0, o, globalThis))
         {
         }
 
index 513cc11df82c9109ef8ecb24525e1fa5851f8600..c032ca55c5349b93102a4f7779c0de1c3692d652 100644 (file)
@@ -1,3 +1,13 @@
+2008-05-21  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Oliver and Sam.
+        
+        - tests for <rdar://problem/5815631> REGRESSION (r31239): Multiscope optimisation of function calls results in incorrect this value (breaks tvtv.de)
+
+        * fast/frames/cross-site-this-expected.txt: Added.
+        * fast/frames/cross-site-this.html: Added.
+        * fast/frames/resources/cross-site-this-helper.html: Added.
+
 2008-05-21  Adele Peterson  <adele@apple.com>
 
         Reviewed by Adam.