Ignore:
Timestamp:
Sep 29, 2008, 5:46:25 PM (17 years ago)
Author:
[email protected]
Message:

JavaScriptCore:

2008-09-29 Geoffrey Garen <[email protected]>

Reviewed by Cameron Zwarich.


Store the callee ScopeChain, not the caller ScopeChain, in the call frame
header. Nix the "scopeChain" local variable and ExecState::m_scopeChain, and
access the callee ScopeChain through the call frame header instead.

Profit: call + return are simpler, because they don't have to update the
"scopeChain" local variable, or ExecState::m_scopeChain.


Because CTI keeps "r" in a register, reading the callee ScopeChain relative
to "r" can be very fast, in any cases we care to optimize.

0% speedup on empty function call benchmark. (5.5% speedup in bytecode.)
0% speedup on SunSpider. (7.5% speedup on controlflow-recursive.)
2% speedup on SunSpider --v8.
2% speedup on v8 benchmark.

  • VM/CTI.cpp: Changed scope chain access to read the scope chain from the call frame header. Sped up op_ret by changing it not to fuss with the "scopeChain" local variable or ExecState::m_scopeChain.
  • VM/CTI.h: Updated CTI trampolines not to take a ScopeChainNode* argument, since that's stored in the call frame header now.
  • VM/Machine.cpp: Access "scopeChain" and "codeBlock" through new helper functions that read from the call frame header. Updated functions operating on ExecState::m_callFrame to account for / take advantage of the fact that Exec:m_callFrame is now never NULL.


Fixed a bug in op_construct, where it would use the caller's default
object prototype, rather than the callee's, when constructing a new object.

  • VM/Machine.h: Made some helper functions available. Removed ScopeChainNode* arguments to a lot of functions, since the ScopeChainNode* is now stored in the call frame header.
  • VM/RegisterFile.h: Renamed "CallerScopeChain" to "ScopeChain", since that's what it is now.
  • kjs/DebuggerCallFrame.cpp: Updated for change to ExecState signature.
  • kjs/ExecState.cpp:
  • kjs/ExecState.h: Nixed ExecState::m_callFrame, along with the unused isGlobalObject function.
  • kjs/JSGlobalObject.cpp:
  • kjs/JSGlobalObject.h: Gave the global object a fake call frame in which to store the global scope chain, since our code now assumes that it can always read the scope chain out of the ExecState's call frame.

JavaScriptGlue:

2008-09-29 Geoffrey Garen <[email protected]>

Not reviewed.


Forwarding headers to fix the build.

  • ForwardingHeaders/kjs/CTI.h: Copied from ForwardingHeaders/kjs/ExecState.h.
  • ForwardingHeaders/kjs/ustring.h: Copied from ForwardingHeaders/kjs/ExecState.h.
  • ForwardingHeaders/masm: Added.
  • ForwardingHeaders/masm/X86Assembler.h: Added.
  • ForwardingHeaders/profiler: Added.
  • ForwardingHeaders/profiler/Profiler.h: Added.

LayoutTests:

2008-09-29 Geoffrey Garen <[email protected]>

Reviewed by Cameron Zwarich.


Test case for which prototype is used when calling "new" across windows.

  • fast/js/construct-global-object-expected.txt: Added.
  • fast/js/construct-global-object.html: Added.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/ExecState.h

    r36263 r37086  
    2525
    2626#include "JSGlobalData.h"
     27#include "Machine.h"
    2728#include "ScopeChain.h"
    2829
     
    5354        friend class DebuggerCallFrame;
    5455    public:
    55         ExecState(JSGlobalObject*, JSObject* globalThisValue, ScopeChainNode* globalScopeChain);
     56        ExecState(JSGlobalObject*, JSObject* globalThisValue, Register* callFrame);
    5657
    5758        // Global object in which execution began.
     
    6263        JSGlobalObject* lexicalGlobalObject() const
    6364        {
    64             return m_scopeChain->globalObject();
     65            return Machine::scopeChain(m_callFrame)->globalObject();
    6566        }
    6667       
    67         JSObject* globalThisValue() const { return m_scopeChain->globalThisObject(); }
     68        JSObject* globalThisValue() const { return Machine::scopeChain(m_callFrame)->globalThisObject(); }
    6869               
    6970        // Exception propogation.
     
    100101        ExecState() { }
    101102
    102         ExecState(ExecState*, RegisterFile*, ScopeChainNode*, Register* callFrame);
     103        ExecState(ExecState*, RegisterFile*, Register* callFrame);
    103104
    104105        bool isGlobalObject(JSObject*) const;
     
    116117        ExecState* m_prev;
    117118        RegisterFile* m_registerFile;
    118         ScopeChainNode* m_scopeChain;
    119119        Register* m_callFrame; // The most recent call frame.
    120120    };
Note: See TracChangeset for help on using the changeset viewer.