2008-06-08 Cameron Zwarich <cwzwarich@uwaterloo.ca>
authorcwzwarich@webkit.org <cwzwarich@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 9 Jun 2008 00:57:28 +0000 (00:57 +0000)
committercwzwarich@webkit.org <cwzwarich@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 9 Jun 2008 00:57:28 +0000 (00:57 +0000)
        Reviewed by Darin.

        Bug 19346: REGRESSION: Mootools 1.2 Class inheritance broken in post-SquirrelFish merge
        <https://bugs.webkit.org/show_bug.cgi?id=19346>

        A check for whether a function's caller is eval code accidentally included
        the case where the caller's caller is native code. Add a CodeType field to
        CodeBlock and use this for the eval caller test instead.

        JavaScriptCore:

        * VM/CodeBlock.h:
        (KJS::CodeBlock::CodeBlock):
        (KJS::ProgramCodeBlock::ProgramCodeBlock):
        (KJS::EvalCodeBlock::EvalCodeBlock):
        * VM/Machine.cpp:
        (KJS::getCallerFunctionOffset):
        * kjs/nodes.cpp:
        (KJS::FunctionBodyNode::generateCode):
        (KJS::ProgramNode::generateCode):

        LayoutTests:

        * fast/js/function-dot-arguments-and-caller-expected.txt:
        * fast/js/function-dot-arguments-and-caller.html:

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

JavaScriptCore/ChangeLog
JavaScriptCore/VM/CodeBlock.h
JavaScriptCore/VM/Machine.cpp
JavaScriptCore/kjs/nodes.cpp
LayoutTests/ChangeLog
LayoutTests/fast/js/function-dot-arguments-and-caller-expected.txt
LayoutTests/fast/js/function-dot-arguments-and-caller.html

index 748bbbb1aaa20bf4a11b2c8fcb89fb4e99f62b05..bae85f42682d30621faeed0959858d2674571365 100644 (file)
@@ -1,3 +1,24 @@
+2008-06-08  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
+
+        Reviewed by Darin.
+
+        Bug 19346: REGRESSION: Mootools 1.2 Class inheritance broken in post-SquirrelFish merge
+        <https://bugs.webkit.org/show_bug.cgi?id=19346>
+
+        A check for whether a function's caller is eval code accidentally included
+        the case where the caller's caller is native code. Add a CodeType field to
+        CodeBlock and use this for the eval caller test instead.
+
+        * VM/CodeBlock.h:
+        (KJS::CodeBlock::CodeBlock):
+        (KJS::ProgramCodeBlock::ProgramCodeBlock):
+        (KJS::EvalCodeBlock::EvalCodeBlock):
+        * VM/Machine.cpp:
+        (KJS::getCallerFunctionOffset):
+        * kjs/nodes.cpp:
+        (KJS::FunctionBodyNode::generateCode):
+        (KJS::ProgramNode::generateCode):
+
 2008-06-07  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
 
         Reviewed by Dan Bernstein.
index ad44731ebb2f1987ba9a2f5c8ed8e6e072edd768..39df1df0a18b192695981f7d997c833fdc10dc9e 100644 (file)
@@ -56,7 +56,7 @@ namespace KJS {
     };
 
     struct CodeBlock {
-        CodeBlock(ScopeNode* ownerNode_)
+        CodeBlock(ScopeNode* ownerNode_, CodeType codeType_)
             : ownerNode(ownerNode_)
             , numTemporaries(0)
             , numVars(0)
@@ -64,6 +64,7 @@ namespace KJS {
             , numLocals(0)
             , needsFullScopeChain(ownerNode_->usesEval() || ownerNode_->needsClosure())
             , usesEval(ownerNode_->usesEval())
+            , codeType(codeType_)
         {
         }
 
@@ -81,6 +82,7 @@ namespace KJS {
         int thisRegister;
         bool needsFullScopeChain;
         bool usesEval;
+        CodeType codeType;
 
         Vector<Instruction> instructions;
 
@@ -101,8 +103,8 @@ namespace KJS {
     // responsible for marking it.
 
     struct ProgramCodeBlock : public CodeBlock {
-        ProgramCodeBlock(ScopeNode* ownerNode, JSGlobalObject* globalObject_)
-            : CodeBlock(ownerNode)
+        ProgramCodeBlock(ScopeNode* ownerNode_, CodeType codeType_, JSGlobalObject* globalObject_)
+            : CodeBlock(ownerNode_, codeType_)
             , globalObject(globalObject_)
         {
             globalObject->codeBlocks().add(this);
@@ -118,8 +120,8 @@ namespace KJS {
     };
 
     struct EvalCodeBlock : public ProgramCodeBlock {
-        EvalCodeBlock(ScopeNode* ownerNode, JSGlobalObject* globalObject_)
-            : ProgramCodeBlock(ownerNode, globalObject_)
+        EvalCodeBlock(ScopeNode* ownerNode_, JSGlobalObject* globalObject_)
+            : ProgramCodeBlock(ownerNode_, EvalCode, globalObject_)
         {
         }
     };
index 7220727fc2d315f5da8beb5e40b0e8735281fe71..6303470e3e2216a58d9eca29a35f9361915e607c 100644 (file)
@@ -64,15 +64,14 @@ bool getCallerFunctionOffset(Register** registerBase, int callOffset, int& calle
     CodeBlock* callerCodeBlock = callFrame[Machine::CallerCodeBlock].u.codeBlock;
     if (!callerCodeBlock) // test for top frame of re-entrant function call
         return false;
-
+    
+    if (callerCodeBlock->codeType == EvalCode)
+        return false;
+    
     callerOffset = callFrame[Machine::CallerRegisterOffset].u.i - callerCodeBlock->numLocals - Machine::CallFrameHeaderSize;
     if (callerOffset < 0) // test for global frame
         return false;
 
-    Register* callerCallFrame = (*registerBase) + callerOffset;
-    if (!callerCallFrame[Machine::CallerCodeBlock].u.codeBlock) // test for eval frame
-        return false;
-
     return true;
 }
 
index 7877b7fe6aad80dd889840bfb3234e3e6aba341b..d687fd5251b83f38b9e5155174bb5c2426d93a93 100644 (file)
@@ -1817,7 +1817,7 @@ void FunctionBodyNode::generateCode(ScopeChainNode* sc)
     ScopeChain scopeChain(sc);
     JSGlobalObject* globalObject = scopeChain.globalObject();
 
-    m_code.set(new CodeBlock(this));
+    m_code.set(new CodeBlock(this, FunctionCode));
 
     CodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_symbolTable, m_code.get());
     generator.generate();
@@ -1853,7 +1853,7 @@ void ProgramNode::generateCode(ScopeChainNode* sc, bool canCreateGlobals)
     ScopeChain scopeChain(sc);
     JSGlobalObject* globalObject = scopeChain.globalObject();
     
-    m_code.set(new ProgramCodeBlock(this, globalObject));
+    m_code.set(new ProgramCodeBlock(this, GlobalCode, globalObject));
     
     CodeGenerator generator(this, globalObject->debugger(), scopeChain, &globalObject->symbolTable(), m_code.get(), m_varStack, m_functionStack, canCreateGlobals);
     generator.generate();
index 0bc443e4e706a965cca08046838cbb75997d2a26..64b85b7df0f8a5f1bf1ca900f503ff00b2f9a778 100644 (file)
@@ -1,3 +1,15 @@
+2008-06-08  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
+
+        Reviewed by Darin.
+
+        Test for:
+
+        Bug 19346: REGRESSION: Mootools 1.2 Class inheritance broken in post-SquirrelFish merge
+        <https://bugs.webkit.org/show_bug.cgi?id=19346>
+
+        * fast/js/function-dot-arguments-and-caller-expected.txt:
+        * fast/js/function-dot-arguments-and-caller.html:
+
 2008-06-08  Vincent Ricard  <magic@magicninja.org>
 
         Reviewed by Darin.
index d933948f9f147144b32ca3142f56d34816e80c69..bc9d9cbc79f860b07475d7457cd41c3f26566fd9 100644 (file)
@@ -2,5 +2,5 @@ This page tests function.caller and function.arguments in interesting nested sco
 
 If the test passes, you'll see a series of PASS messages below.
 
-PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS
+PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS,PASS
 
index 2587728ba7e22483b7795e98f044a7f3cf09707f..36c4998ae409ec7c5fcb46f8c70b8ecb7ff6fa97 100644 (file)
@@ -81,6 +81,14 @@ eval('(function f() { return f.caller instanceof Object ? "FAIL" : "PASS"; })()'
 
 (function f() {
     return String({ toString: function g() { return g.caller instanceof Object ? "FAIL" : "PASS"; } });
+})(),
+
+(function f() {
+    function g() { return h.apply(this); }
+    function h() { return k(); }
+    function k() { return k.caller instanceof Object ? "PASS" : "FAIL"; }
+    
+    return g();
 })()
 ];