Changeset 131516 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Oct 16, 2012, 3:28:32 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r130612 r131516 142 142 bool ResolveNode::isPure(BytecodeGenerator& generator) const 143 143 { 144 return generator.resolve(m_ident).is Static();144 return generator.resolve(m_ident).isRegister(); 145 145 } 146 146 … … 430 430 generator.emitLoad(callArguments.thisRegister(), jsUndefined()); 431 431 return generator.emitCall(generator.finalDestinationOrIgnored(dst, callArguments.thisRegister()), func.get(), callArguments, divot(), startOffset(), endOffset()); 432 }433 434 if (resolveResult.isStatic()) {435 RefPtr<RegisterID> func = generator.newTemporary();436 CallArguments callArguments(generator, m_args);437 generator.emitGetStaticVar(func.get(), resolveResult, m_ident);438 generator.emitLoad(callArguments.thisRegister(), jsUndefined());439 return generator.emitCall(generator.finalDestinationOrIgnored(dst, func.get()), func.get(), callArguments, divot(), startOffset(), endOffset());440 432 } 441 433 … … 624 616 return emitPostIncOrDec(generator, generator.finalDestination(dst), local, m_operator); 625 617 } 626 627 if (resolveResult.isStatic() && !resolveResult.isReadOnly()) {628 RefPtr<RegisterID> value = generator.emitGetStaticVar(generator.newTemporary(), resolveResult, ident);629 RegisterID* oldValue;630 if (dst == generator.ignoredResult()) {631 oldValue = 0;632 emitPreIncOrDec(generator, value.get(), m_operator);633 } else634 oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);635 generator.emitPutStaticVar(resolveResult, ident, value.get());636 return oldValue;637 }638 618 639 619 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 640 620 RefPtr<RegisterID> value = generator.newTemporary(); 641 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), resolveResult, ident); 621 NonlocalResolveInfo resolveInfo; 622 RefPtr<RegisterID> base = generator.emitResolveWithBaseForPut(generator.newTemporary(), value.get(), resolveResult, ident, resolveInfo); 642 623 RegisterID* oldValue; 643 624 if (dst == generator.ignoredResult()) { … … 646 627 } else 647 628 oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator); 648 generator.emitPut ById(base.get(), ident, value.get());629 generator.emitPutToBase(base.get(), ident, value.get(), resolveInfo); 649 630 return oldValue; 650 631 } … … 821 802 } 822 803 823 if (resolveResult.isStatic() && !resolveResult.isReadOnly()) {824 RefPtr<RegisterID> propDst = generator.emitGetStaticVar(generator.tempDestination(dst), resolveResult, ident);825 emitPreIncOrDec(generator, propDst.get(), m_operator);826 generator.emitPutStaticVar(resolveResult, ident, propDst.get());827 return generator.moveToDestinationIfNeeded(dst, propDst.get());828 }829 830 804 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 831 805 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 832 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), propDst.get(), resolveResult, ident); 806 NonlocalResolveInfo resolveVerifier; 807 RefPtr<RegisterID> base = generator.emitResolveWithBaseForPut(generator.newTemporary(), propDst.get(), resolveResult, ident, resolveVerifier); 833 808 emitPreIncOrDec(generator, propDst.get(), m_operator); 834 generator.emitPut ById(base.get(), ident, propDst.get());809 generator.emitPutToBase(base.get(), ident, propDst.get(), resolveVerifier); 835 810 return generator.moveToDestinationIfNeeded(dst, propDst.get()); 836 811 } … … 1258 1233 } 1259 1234 1260 if (resolveResult.isStatic() && !resolveResult.isReadOnly()) {1261 RefPtr<RegisterID> src1 = generator.emitGetStaticVar(generator.tempDestination(dst), resolveResult, m_ident);1262 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));1263 generator.emitPutStaticVar(resolveResult, m_ident, result);1264 return result;1265 }1266 1267 1235 RefPtr<RegisterID> src1 = generator.tempDestination(dst); 1268 1236 generator.emitExpressionInfo(divot() - startOffset() + m_ident.length(), m_ident.length(), 0); 1269 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), src1.get(), resolveResult, m_ident); 1237 NonlocalResolveInfo resolveVerifier; 1238 RefPtr<RegisterID> base = generator.emitResolveWithBaseForPut(generator.newTemporary(), src1.get(), resolveResult, m_ident, resolveVerifier); 1270 1239 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()), this); 1271 return generator.emitPut ById(base.get(), m_ident, result);1240 return generator.emitPutToBase(base.get(), m_ident, result, resolveVerifier); 1272 1241 } 1273 1242 … … 1278 1247 ResolveResult resolveResult = generator.resolve(m_ident); 1279 1248 1280 if (RegisterID *local = resolveResult.local()) {1249 if (RegisterID* local = resolveResult.local()) { 1281 1250 if (resolveResult.isReadOnly()) { 1282 1251 generator.emitReadOnlyExceptionIfNeeded(); … … 1287 1256 } 1288 1257 1289 if (resolveResult.isStatic() && !resolveResult.isReadOnly()) { 1290 if (dst == generator.ignoredResult()) 1291 dst = 0; 1292 RegisterID* value = generator.emitNode(dst, m_right); 1293 generator.emitPutStaticVar(resolveResult, m_ident, value); 1294 return value; 1295 } 1296 1297 RefPtr<RegisterID> base = generator.emitResolveBaseForPut(generator.newTemporary(), resolveResult, m_ident); 1258 NonlocalResolveInfo resolveVerifier; 1259 RefPtr<RegisterID> base = generator.emitResolveBaseForPut(generator.newTemporary(), resolveResult, m_ident, resolveVerifier); 1298 1260 if (dst == generator.ignoredResult()) 1299 1261 dst = 0; 1300 1262 RegisterID* value = generator.emitNode(dst, m_right); 1301 1263 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1302 return generator.emitPut ById(base.get(), m_ident, value);1264 return generator.emitPutToBase(base.get(), m_ident, value, resolveVerifier); 1303 1265 } 1304 1266 … … 1395 1357 RefPtr<RegisterID> value = m_init ? generator.emitNode(m_init) : generator.emitLoad(0, jsUndefined()); 1396 1358 1397 if (resolveResult.isStatic()) { 1398 if (generator.codeType() == GlobalCode) 1399 return generator.emitInitGlobalConst(resolveResult, m_ident, value.get()); 1400 return generator.emitPutStaticVar(resolveResult, m_ident, value.get()); 1359 if (generator.codeType() == GlobalCode) { 1360 if (RegisterID* result = generator.emitInitGlobalConst(m_ident, value.get())) 1361 return result; 1401 1362 } 1402 1363 if (generator.codeType() != EvalCode) 1403 1364 return value.get(); 1404 1365 1405 // FIXME: While this code should only be hit in an eval block, it will assign 1406 // to the wrong base if m_ident exists in an intervening with scope. 1366 // FIXME: This will result in incorrect assignment if m_ident exists in an intervening with scope. 1407 1367 RefPtr<RegisterID> base = generator.emitResolveBase(generator.newTemporary(), resolveResult, m_ident); 1408 1368 return generator.emitPutById(base.get(), m_ident, value.get()); … … 1692 1652 propertyName = generator.newTemporary(); 1693 1653 RefPtr<RegisterID> protect = propertyName; 1694 RegisterID* base = generator.emitResolveBaseForPut(generator.newTemporary(), resolveResult, ident); 1654 NonlocalResolveInfo resolveVerifier; 1655 RegisterID* base = generator.emitResolveBaseForPut(generator.newTemporary(), resolveResult, ident, resolveVerifier); 1695 1656 1696 1657 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1697 generator.emitPut ById(base, ident, propertyName);1658 generator.emitPutToBase(base, ident, propertyName, resolveVerifier); 1698 1659 } else { 1699 1660 expectedSubscript = generator.emitMove(generator.newTemporary(), propertyName);
Note:
See TracChangeset
for help on using the changeset viewer.