Argument object created by "Function dot arguments" should use a clone of the argumen...
authormark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Jan 2015 00:49:31 +0000 (00:49 +0000)
committermark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Jan 2015 00:49:31 +0000 (00:49 +0000)
commit03561d5fd31e34407af3aa3958bafafe6078ccc4
tree1ecead0dcb127d7e1ea59c1a005e83be4cd65741
parent15ff27d70cdf2254787cb520b3d603b1b753da77
Argument object created by "Function dot arguments" should use a clone of the argument values.
<https://webkit.org/b/140093>

Reviewed by Geoffrey Garen.

After the change in <https://webkit.org/b/139827>, the dfg-tear-off-arguments-not-activation.js
test will crash.  The relevant code which manifests the issue is as follows:

    function bar() {
        return foo.arguments;
    }

    function foo(p) {
        var x = 42;
        if (p)
            return (function() { return x; });
        else
            return bar();
    }

In this case, foo() has no knowledge of bar() needing its LexicalEnvironment and
has dead code eliminated the SetLocal that stores it into its designated local.
In bar(), the factory for the Arguments object (for creating foo.arguments) tries
to read foo's LexicalEnvironment from its designated lexicalEnvironment local,
but instead, finds it to be uninitialized.  This results in a null pointer access
which causes a crash.

This can be resolved by having bar() instantiate a clone of the Arguments object
instead, and populate its elements with values fetched directly from foo's frame.
There's no need to reference foo's LexicalEnvironment (whether present or not).

* interpreter/StackVisitor.cpp:
(JSC::StackVisitor::Frame::createArguments):
* runtime/Arguments.h:
(JSC::Arguments::finishCreation):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@178145 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/interpreter/StackVisitor.cpp
Source/JavaScriptCore/runtime/Arguments.h