Changeset 33341

Show
Ignore:
Timestamp:
05/12/08 23:04:11 (6 months ago)
Author:
mrowe@apple.com
Message:

Bug 18749: SQUIRRELFISH: const support is broken
<https://bugs.webkit.org/show_bug.cgi?id=18749>

Cameron Zwarich <cwzwarich@uwaterloo.ca>
Reviewed by Oliver.

Adds support for const during code generation.

Fixes 2 layout tests.

Location:
branches/squirrelfish/JavaScriptCore
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • branches/squirrelfish/JavaScriptCore/ChangeLog

    r33340 r33341  
     12008-05-05  Cameron Zwarich  <cwzwarich@uwaterloo.ca> 
     2 
     3        Reviewed by Oliver. 
     4 
     5        Bug 18749: SQUIRRELFISH: const support is broken 
     6        <https://bugs.webkit.org/show_bug.cgi?id=18749> 
     7 
     8        Adds support for const during code generation. 
     9 
     10        Fixes 2 layout tests. 
     11 
     12        * ChangeLog: 
     13        * VM/CodeGenerator.cpp: 
     14        (KJS::CodeGenerator::addVar): 
     15        (KJS::CodeGenerator::CodeGenerator): 
     16        (KJS::CodeGenerator::isLocalConstant): 
     17        * VM/CodeGenerator.h: 
     18        (KJS::CodeGenerator::addVar): 
     19        * kjs/nodes.cpp: 
     20        (KJS::PostIncResolveNode::emitCode): 
     21        (KJS::PostDecResolveNode::emitCode): 
     22        (KJS::PreIncResolveNode::emitCode): 
     23        (KJS::PreDecResolveNode::emitCode): 
     24        (KJS::ReadModifyResolveNode::emitCode): 
     25        (KJS::AssignResolveNode::emitCode): 
     26 
    1272008-05-04  Maciej Stachowiak  <mjs@apple.com> 
    228 
  • branches/squirrelfish/JavaScriptCore/VM/CodeGenerator.cpp

    r33340 r33341  
    139139} 
    140140 
    141 bool CodeGenerator::addVar(const Identifier& ident, RegisterID*& r0) 
     141bool CodeGenerator::addVar(const Identifier& ident, RegisterID*& r0, bool isConstant) 
    142142{ 
    143143    int index = m_nextVar; 
    144     pair<SymbolTable::iterator, bool> result = symbolTable().add(ident.ustring().rep(), index); 
     144    SymbolTableEntry newEntry(index, isConstant ? ReadOnly : 0); 
     145    pair<SymbolTable::iterator, bool> result = symbolTable().add(ident.ustring().rep(), newEntry); 
    145146 
    146147    if (!result.second) 
     
    183184        m_nextVar -= size; 
    184185    } else 
    185         addVar(m_propertyNames->thisIdentifier); // No need to make "this" a true parameter, since it's not passed by our caller. 
     186        addVar(m_propertyNames->thisIdentifier, false); // No need to make "this" a true parameter, since it's not passed by our caller. 
    186187 
    187188    JSGlobalObject* globalObject = static_cast<JSGlobalObject*>(scopeChain.bottom()); 
     
    193194        for (size_t i = 0; i < functionStack.size(); ++i) { 
    194195            FuncDeclNode* funcDecl = functionStack[i]; 
    195             emitNewFunction(addVar(funcDecl->m_ident), funcDecl); 
     196            emitNewFunction(addVar(funcDecl->m_ident, false), funcDecl); 
    196197        } 
    197198         
    198199        for (size_t i = 0; i < varStack.size(); ++i) { 
    199200            if (!globalObject->hasProperty(exec, varStack[i].first)) 
    200                 emitLoad(addVar(varStack[i].first), jsUndefined()); 
     201                emitLoad(addVar(varStack[i].first, varStack[i].second & DeclarationStacks::IsConstant), jsUndefined()); 
    201202        } 
    202203    } else { 
     
    233234         
    234235        m_functions.add(ident.ustring().rep()); 
    235         emitNewFunction(addVar(ident), funcDecl); 
     236        emitNewFunction(addVar(ident, false), funcDecl); 
    236237    } 
    237238 
     
    242243         
    243244        RegisterID* r0; 
    244         if (addVar(ident, r0)) 
     245        if (addVar(ident, r0, varStack[i].second & DeclarationStacks::IsConstant)) 
    245246            emitLoad(r0, jsUndefined()); 
    246247    } 
     
    267268    , m_propertyNames(CommonIdentifiers::shared()) 
    268269{ 
    269     addVar(m_propertyNames->thisIdentifier); 
     270    addVar(m_propertyNames->thisIdentifier, false); 
    270271     
    271272    for (size_t i = 0; i < varStack.size(); ++i) 
     
    319320     
    320321    return &m_locals[localsIndex(index)]; 
     322} 
     323 
     324bool CodeGenerator::isLocalConstant(const Identifier& ident) 
     325{ 
     326    return symbolTable().get(ident.ustring().rep()).attributes & ReadOnly; 
    321327} 
    322328 
  • branches/squirrelfish/JavaScriptCore/VM/CodeGenerator.h

    r33340 r33341  
    9191        RegisterID* registerForLocalConstInit(const Identifier&); 
    9292 
     93        bool isLocalConstant(const Identifier&); 
     94 
    9395        // Returns the next available temporary register. Registers returned by 
    9496        // newTemporary require a modified form of reference counting: any 
     
    258260         
    259261        // Returns the RegisterID corresponding to ident. 
    260         RegisterID* addVar(const Identifier& ident) 
     262        RegisterID* addVar(const Identifier& ident, bool isConstant) 
    261263        { 
    262264            RegisterID* local; 
    263             addVar(ident, local); 
     265            addVar(ident, local, isConstant); 
    264266            return local; 
    265267        } 
    266268 
    267269        // Returns true if a new RegisterID was added, false if a pre-existing RegisterID was re-used. 
    268         bool addVar(const Identifier&, RegisterID*&); 
     270        bool addVar(const Identifier&, RegisterID*&, bool isConstant); 
    269271 
    270272        void addParameter(const Identifier&); 
  • branches/squirrelfish/JavaScriptCore/kjs/nodes.cpp

    r33340 r33341  
    17381738    // and emit a PreInc instead of a PostInc. A post-pass to eliminate dead 
    17391739    // code would work, too. 
    1740     if (RegisterID* local = generator.registerForLocal(m_ident)) 
     1740    if (RegisterID* local = generator.registerForLocal(m_ident)) { 
     1741        if (generator.isLocalConstant(m_ident)) 
     1742            return generator.emitToJSNumber(generator.finalDestination(dst), local); 
     1743         
    17411744        return generator.emitPostInc(generator.finalDestination(dst), local); 
     1745    } 
    17421746 
    17431747    RefPtr<RegisterID> value = generator.newTemporary(); 
     
    18181822    // and emit a PreDec instead of a PostDec. A post-pass to eliminate dead 
    18191823    // code would work, too. 
    1820     if (RegisterID* local = generator.registerForLocal(m_ident)) 
     1824    if (RegisterID* local = generator.registerForLocal(m_ident)) { 
     1825        if (generator.isLocalConstant(m_ident)) 
     1826            return generator.emitToJSNumber(generator.finalDestination(dst), local); 
     1827         
    18211828        return generator.emitPostDec(generator.finalDestination(dst), local); 
     1829    } 
    18221830 
    18231831    RefPtr<RegisterID> value = generator.newTemporary(); 
     
    23362344{ 
    23372345    if (RegisterID* local = generator.registerForLocal(m_ident)) { 
     2346        if (generator.isLocalConstant(m_ident)) { 
     2347            RefPtr<RegisterID> r0 = generator.emitLoad(generator.finalDestination(dst), 1.0); 
     2348            return generator.emitAdd(r0.get(), local, r0.get()); 
     2349        } 
     2350         
    23382351        generator.emitPreInc(local); 
    23392352        return generator.moveToDestinationIfNeeded(dst, local); 
     
    24012414{ 
    24022415    if (RegisterID* local = generator.registerForLocal(m_ident)) { 
     2416        if (generator.isLocalConstant(m_ident)) { 
     2417            RefPtr<RegisterID> r0 = generator.emitLoad(generator.finalDestination(dst), -1.0); 
     2418            return generator.emitAdd(r0.get(), local, r0.get()); 
     2419        } 
     2420         
    24032421        generator.emitPreDec(local); 
    24042422        return generator.moveToDestinationIfNeeded(dst, local); 
     
    41374155RegisterID* ReadModifyResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst) 
    41384156{ 
    4139     if (RegisterID* dst = generator.registerForLocal(m_ident)) { 
     4157    if (RegisterID* local = generator.registerForLocal(m_ident)) { 
     4158        if (generator.isLocalConstant(m_ident)) { 
     4159            RegisterID* src2 = generator.emitNode(m_right.get()); 
     4160            return emitReadModifyAssignment(generator, generator.finalDestination(dst), local, src2, m_operator); 
     4161        } 
     4162         
    41404163        RegisterID* src2 = generator.emitNode(m_right.get()); 
    4141         RegisterID* result = emitReadModifyAssignment(generator, dst, dst, src2, m_operator); 
     4164        RegisterID* result = emitReadModifyAssignment(generator, local, local, src2, m_operator); 
    41424165        return generator.moveToDestinationIfNeeded(dst, result); 
    41434166    } 
     
    41674190{ 
    41684191    if (RegisterID* local = generator.registerForLocal(m_ident)) { 
     4192        if (generator.isLocalConstant(m_ident)) 
     4193            return generator.emitNode(dst, m_right.get()); 
     4194         
    41694195        RegisterID* result = generator.emitNode(local, m_right.get()); 
    41704196        return generator.moveToDestinationIfNeeded(dst, result);