Changeset 27216 in webkit for trunk/JavaScriptCore/kjs


Ignore:
Timestamp:
Oct 29, 2007, 12:05:49 AM (18 years ago)
Author:
oliver
Message:

Added nodes to allow Assignment, TypeOf, and prefix operators to
make use of the new optimised local variable look up.

5% gain on sunspider

Reviewed by Darin

Location:
trunk/JavaScriptCore/kjs
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r27215 r27216  
    11771177}
    11781178
     1179void TypeOfResolveNode::optimizeVariableAccess(FunctionBodyNode* functionBody, DeclarationStacks::NodeStack&)
     1180{
     1181    size_t index = functionBody->symbolTable().get(m_ident.ustring().rep());
     1182    if (index != missingSymbolMarker())
     1183        new (this) LocalTypeOfAccessNode(index);
     1184}
     1185
     1186JSValue* LocalTypeOfAccessNode::evaluate(ExecState* exec)
     1187{
     1188    ActivationImp* variableObject = static_cast<ActivationImp*>(exec->variableObject());
     1189    ASSERT(variableObject->isActivation());
     1190    ASSERT(variableObject == exec->scopeChain().top());
     1191    return typeStringForValue(variableObject->localStorage()[m_index].value);
     1192}
     1193
    11791194JSValue *TypeOfResolveNode::evaluate(ExecState *exec)
    11801195{
     
    12141229
    12151230// ------------------------------ PrefixResolveNode ----------------------------------
     1231
     1232void PrefixResolveNode::optimizeVariableAccess(FunctionBodyNode* functionBody, DeclarationStacks::NodeStack&)
     1233{
     1234    size_t index = functionBody->symbolTable().get(m_ident.ustring().rep());
     1235    if (index != missingSymbolMarker())
     1236        new (this) PrefixLocalAccessNode(index);
     1237}
     1238
     1239JSValue* PrefixLocalAccessNode::evaluate(ExecState* exec)
     1240{
     1241    ActivationImp* variableObject = static_cast<ActivationImp*>(exec->variableObject());
     1242    ASSERT(variableObject->isActivation());
     1243    ASSERT(variableObject == exec->scopeChain().top());
     1244    JSValue* v = variableObject->localStorage()[m_index].value;
     1245
     1246    double n = v->toNumber(exec);
     1247       
     1248    double newValue = (m_oper == OpPlusPlus) ? n + 1 : n - 1;
     1249    JSValue* n2 = jsNumber(newValue);
     1250    variableObject->localStorage()[m_index].value = n2;
     1251    return n2;
     1252}
    12161253
    12171254JSValue *PrefixResolveNode::evaluate(ExecState *exec)
     
    19642001// ------------------------------ AssignResolveNode -----------------------------------
    19652002
    1966 void AssignResolveNode::optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack& nodeStack)
     2003void AssignResolveNode::optimizeVariableAccess(FunctionBodyNode* functionBody, DeclarationStacks::NodeStack& nodeStack)
    19672004{
    19682005    nodeStack.append(m_right.get());
     2006    size_t index = functionBody->symbolTable().get(m_ident.ustring().rep());
     2007    if (index != missingSymbolMarker())
     2008        new (this) AssignLocalAccessNode(index);
     2009}
     2010
     2011JSValue* AssignLocalAccessNode::evaluate(ExecState* exec)
     2012{
     2013    ActivationImp* variableObject = static_cast<ActivationImp*>(exec->variableObject());
     2014    ASSERT(variableObject->isActivation());
     2015    ASSERT(variableObject == exec->scopeChain().top());
     2016    JSValue* v;
     2017
     2018    if (m_oper == OpEqual)
     2019        v = m_right->evaluate(exec);
     2020    else {
     2021        JSValue* v1 = variableObject->localStorage()[m_index].value;
     2022        KJS_CHECKEXCEPTIONVALUE
     2023        JSValue* v2 = m_right->evaluate(exec);
     2024        v = valueForReadModifyAssignment(exec, v1, v2, m_oper);
     2025    }
     2026
     2027    KJS_CHECKEXCEPTIONVALUE
     2028
     2029    variableObject->localStorage()[m_index].value = v;
     2030    return v;
    19692031}
    19702032
  • trunk/JavaScriptCore/kjs/nodes.h

    r27215 r27216  
    684684  class TypeOfResolveNode : public Node {
    685685  public:
    686     TypeOfResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {}
     686    TypeOfResolveNode(const Identifier &s) KJS_FAST_CALL
     687        : m_ident(s)
     688    {
     689    }
     690   
     691    TypeOfResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
     692        : Node(PlacementNewAdopt)
     693        , m_ident(PlacementNewAdopt)
     694    {
     695    }
     696
     697    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     698   
    687699    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    688700    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    689701    virtual Precedence precedence() const { return PrecUnary; }
    690   private:
     702
     703    const Identifier& identifier() const KJS_FAST_CALL { return m_ident; }
     704
     705  protected:
    691706    Identifier m_ident;
     707    size_t m_index; // Used by LocalTypeOfNode.
     708  };
     709   
     710  class LocalTypeOfAccessNode : public TypeOfResolveNode {
     711  public:
     712    LocalTypeOfAccessNode(size_t i) KJS_FAST_CALL
     713        : TypeOfResolveNode(PlacementNewAdopt)
     714    {
     715        ASSERT(i != missingSymbolMarker());
     716        m_index = i;
     717    }
     718
     719    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    692720  };
    693721
     
    705733  class PrefixResolveNode : public Node {
    706734  public:
    707     PrefixResolveNode(const Identifier& i, Operator o) KJS_FAST_CALL : m_ident(i), m_oper(o) {}
     735    PrefixResolveNode(const Identifier &s, Operator o) KJS_FAST_CALL
     736        : m_ident(s)
     737        , m_oper(o)
     738    {
     739    }
     740   
     741    PrefixResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
     742        : Node(PlacementNewAdopt)
     743        , m_ident(PlacementNewAdopt)
     744        , m_oper(m_oper)
     745    {
     746    }
     747   
     748    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
     749
    708750    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    709751    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    710752    virtual Precedence precedence() const { return PrecUnary; }
    711   private:
     753
     754  protected:
    712755    Identifier m_ident;
    713756    Operator m_oper;
     757    size_t m_index;
     758  };
     759
     760  class PrefixLocalAccessNode : public PrefixResolveNode {
     761  public:
     762    PrefixLocalAccessNode(size_t i) KJS_FAST_CALL
     763        : PrefixResolveNode(PlacementNewAdopt)
     764    {
     765        ASSERT(i != missingSymbolMarker());
     766        m_index = i;
     767    }
     768   
     769    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    714770  };
    715771
     
    11121168  public:
    11131169    AssignResolveNode(const Identifier &ident, Operator oper, Node *right) KJS_FAST_CALL
    1114       : m_ident(ident), m_oper(oper), m_right(right) {}
     1170      : m_ident(ident)
     1171      , m_oper(oper)
     1172      , m_right(right)
     1173      {
     1174      }
     1175
     1176    AssignResolveNode(PlacementNewAdoptType) KJS_FAST_CALL
     1177      : Node(PlacementNewAdopt)
     1178      , m_ident(PlacementNewAdopt)
     1179      , m_oper(m_oper)
     1180      , m_right(PlacementNewAdopt)
     1181    {
     1182    }
     1183
    11151184    virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;
    11161185    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
     
    11211190    Operator m_oper;
    11221191    RefPtr<Node> m_right;
     1192    size_t m_index;
     1193  };
     1194
     1195  class AssignLocalAccessNode : public AssignResolveNode {
     1196  public:
     1197    AssignLocalAccessNode(size_t i) KJS_FAST_CALL
     1198        : AssignResolveNode(PlacementNewAdopt)
     1199    {
     1200        ASSERT(i != missingSymbolMarker());
     1201        m_index = i;
     1202    }
     1203   
     1204    JSValue* evaluate(ExecState*) KJS_FAST_CALL;
    11231205  };
    11241206
Note: See TracChangeset for help on using the changeset viewer.