Changeset 33341
- Timestamp:
- 05/12/08 23:04:11 (6 months ago)
- Location:
- branches/squirrelfish/JavaScriptCore
- Files:
-
- 4 modified
-
ChangeLog (modified) (1 diff)
-
VM/CodeGenerator.cpp (modified) (7 diffs)
-
VM/CodeGenerator.h (modified) (2 diffs)
-
kjs/nodes.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/squirrelfish/JavaScriptCore/ChangeLog
r33340 r33341 1 2008-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 1 27 2008-05-04 Maciej Stachowiak <mjs@apple.com> 2 28 -
branches/squirrelfish/JavaScriptCore/VM/CodeGenerator.cpp
r33340 r33341 139 139 } 140 140 141 bool CodeGenerator::addVar(const Identifier& ident, RegisterID*& r0 )141 bool CodeGenerator::addVar(const Identifier& ident, RegisterID*& r0, bool isConstant) 142 142 { 143 143 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); 145 146 146 147 if (!result.second) … … 183 184 m_nextVar -= size; 184 185 } 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. 186 187 187 188 JSGlobalObject* globalObject = static_cast<JSGlobalObject*>(scopeChain.bottom()); … … 193 194 for (size_t i = 0; i < functionStack.size(); ++i) { 194 195 FuncDeclNode* funcDecl = functionStack[i]; 195 emitNewFunction(addVar(funcDecl->m_ident ), funcDecl);196 emitNewFunction(addVar(funcDecl->m_ident, false), funcDecl); 196 197 } 197 198 198 199 for (size_t i = 0; i < varStack.size(); ++i) { 199 200 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()); 201 202 } 202 203 } else { … … 233 234 234 235 m_functions.add(ident.ustring().rep()); 235 emitNewFunction(addVar(ident ), funcDecl);236 emitNewFunction(addVar(ident, false), funcDecl); 236 237 } 237 238 … … 242 243 243 244 RegisterID* r0; 244 if (addVar(ident, r0 ))245 if (addVar(ident, r0, varStack[i].second & DeclarationStacks::IsConstant)) 245 246 emitLoad(r0, jsUndefined()); 246 247 } … … 267 268 , m_propertyNames(CommonIdentifiers::shared()) 268 269 { 269 addVar(m_propertyNames->thisIdentifier );270 addVar(m_propertyNames->thisIdentifier, false); 270 271 271 272 for (size_t i = 0; i < varStack.size(); ++i) … … 319 320 320 321 return &m_locals[localsIndex(index)]; 322 } 323 324 bool CodeGenerator::isLocalConstant(const Identifier& ident) 325 { 326 return symbolTable().get(ident.ustring().rep()).attributes & ReadOnly; 321 327 } 322 328 -
branches/squirrelfish/JavaScriptCore/VM/CodeGenerator.h
r33340 r33341 91 91 RegisterID* registerForLocalConstInit(const Identifier&); 92 92 93 bool isLocalConstant(const Identifier&); 94 93 95 // Returns the next available temporary register. Registers returned by 94 96 // newTemporary require a modified form of reference counting: any … … 258 260 259 261 // Returns the RegisterID corresponding to ident. 260 RegisterID* addVar(const Identifier& ident )262 RegisterID* addVar(const Identifier& ident, bool isConstant) 261 263 { 262 264 RegisterID* local; 263 addVar(ident, local );265 addVar(ident, local, isConstant); 264 266 return local; 265 267 } 266 268 267 269 // 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); 269 271 270 272 void addParameter(const Identifier&); -
branches/squirrelfish/JavaScriptCore/kjs/nodes.cpp
r33340 r33341 1738 1738 // and emit a PreInc instead of a PostInc. A post-pass to eliminate dead 1739 1739 // 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 1741 1744 return generator.emitPostInc(generator.finalDestination(dst), local); 1745 } 1742 1746 1743 1747 RefPtr<RegisterID> value = generator.newTemporary(); … … 1818 1822 // and emit a PreDec instead of a PostDec. A post-pass to eliminate dead 1819 1823 // 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 1821 1828 return generator.emitPostDec(generator.finalDestination(dst), local); 1829 } 1822 1830 1823 1831 RefPtr<RegisterID> value = generator.newTemporary(); … … 2336 2344 { 2337 2345 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 2338 2351 generator.emitPreInc(local); 2339 2352 return generator.moveToDestinationIfNeeded(dst, local); … … 2401 2414 { 2402 2415 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 2403 2421 generator.emitPreDec(local); 2404 2422 return generator.moveToDestinationIfNeeded(dst, local); … … 4137 4155 RegisterID* ReadModifyResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst) 4138 4156 { 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 4140 4163 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); 4142 4165 return generator.moveToDestinationIfNeeded(dst, result); 4143 4166 } … … 4167 4190 { 4168 4191 if (RegisterID* local = generator.registerForLocal(m_ident)) { 4192 if (generator.isLocalConstant(m_ident)) 4193 return generator.emitNode(dst, m_right.get()); 4194 4169 4195 RegisterID* result = generator.emitNode(local, m_right.get()); 4170 4196 return generator.moveToDestinationIfNeeded(dst, result);