Changeset 36871 in webkit for trunk/JavaScriptCore
- Timestamp:
- Sep 24, 2008, 3:19:05 PM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r36865 r36871 1 2008-09-24 Kevin McCullough <[email protected]> 2 3 Reviewed by Geoff. 4 5 Bug 21031: Breakpoints in the condition of loops only breaks the first 6 time 7 - Now when setting breakpoints in the condition of a loop (for, while, 8 for in, and do while) will successfully break each time throught the 9 loop. 10 - For 'for' loops we need a little more complicated behavior that cannot 11 be accomplished without some more significant changes: 12 https://bugs.webkit.org/show_bug.cgi?id=21073 13 14 * kjs/nodes.cpp: 15 (JSC::statementListEmitCode): We don't want to blindly emit a debug hook 16 at the first line of loops, instead let the loop emit the debug hooks. 17 (JSC::DoWhileNode::emitCode): 18 (JSC::WhileNode::emitCode): 19 (JSC::ForNode::emitCode): 20 (JSC::ForInNode::emitCode): 21 * kjs/nodes.h: 22 (JSC::StatementNode::): 23 (JSC::DoWhileNode::): 24 (JSC::WhileNode::): 25 (JSC::ForInNode::): 26 1 27 2008-09-24 Geoffrey Garen <[email protected]> 2 28 -
trunk/JavaScriptCore/kjs/nodes.cpp
r36821 r36871 1085 1085 for (StatementVector::iterator it = statements.begin(); it != end; ++it) { 1086 1086 StatementNode* n = it->get(); 1087 generator.emitDebugHook(WillExecuteStatement, n->isDoWhile() ? n->lastLine() : n->firstLine(), n->lastLine()); 1087 if(!n->isLoop()) 1088 generator.emitDebugHook(WillExecuteStatement, n->firstLine(), n->lastLine()); 1088 1089 generator.emitNode(dst, n); 1089 1090 } … … 1212 1213 generator.emitLabel(topOfLoop.get()); 1213 1214 1215 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); 1216 1214 1217 if (!m_statement->isBlock()) 1215 1218 generator.emitDebugHook(WillExecuteStatement, m_statement->firstLine(), m_statement->lastLine()); … … 1217 1220 RefPtr<LabelID> continueTarget = generator.newLabel(); 1218 1221 RefPtr<LabelID> breakTarget = generator.newLabel(); 1219 1222 1220 1223 generator.pushJumpContext(&m_labelStack, continueTarget.get(), breakTarget.get(), true); 1221 1224 RefPtr<RegisterID> result = generator.emitNode(dst, m_statement.get()); 1222 1225 generator.popJumpContext(); 1223 1226 1224 1227 generator.emitLabel(continueTarget.get()); 1228 generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo()); 1225 1229 RegisterID* cond = generator.emitNode(m_expr.get()); 1226 1230 generator.emitJumpIfTrue(cond, topOfLoop.get()); … … 1243 1247 if (!m_statement->isBlock()) 1244 1248 generator.emitDebugHook(WillExecuteStatement, m_statement->firstLine(), m_statement->lastLine()); 1245 1249 1246 1250 generator.pushJumpContext(&m_labelStack, continueTarget.get(), breakTarget.get(), true); 1247 1251 generator.emitNode(dst, m_statement.get()); … … 1249 1253 1250 1254 generator.emitLabel(continueTarget.get()); 1255 generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo()); 1251 1256 RegisterID* cond = generator.emitNode(m_expr.get()); 1252 1257 generator.emitJumpIfTrue(cond, topOfLoop.get()); … … 1262 1267 RegisterID* ForNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1263 1268 { 1269 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); 1270 1264 1271 if (m_expr1) 1265 1272 generator.emitNode(ignoredResult(), m_expr1.get()); 1266 1273 1267 1274 RefPtr<LabelID> topOfLoop = generator.newLabel(); 1268 1275 RefPtr<LabelID> beforeCondition = generator.newLabel(); … … 1291 1298 1292 1299 generator.emitLabel(breakTarget.get()); 1300 1293 1301 return result.get(); 1294 1302 } … … 1372 1380 generator.emitNode(dst, m_statement.get()); 1373 1381 generator.popJumpContext(); 1382 1383 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); 1374 1384 1375 1385 if (!m_statement->isBlock()) -
trunk/JavaScriptCore/kjs/nodes.h
r36809 r36871 235 235 236 236 virtual bool isBlock() const JSC_FAST_CALL { return false; } 237 virtual bool is DoWhile() const JSC_FAST_CALL { return false; }237 virtual bool isLoop() const JSC_FAST_CALL { return false; } 238 238 protected: 239 239 LabelStack m_labelStack; … … 1938 1938 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1939 1939 1940 virtual bool is DoWhile() const JSC_FAST_CALL { return true; }1940 virtual bool isLoop() const JSC_FAST_CALL { return true; } 1941 1941 private: 1942 1942 RefPtr<StatementNode> m_statement; … … 1956 1956 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1957 1957 1958 virtual bool isLoop() const JSC_FAST_CALL { return true; } 1958 1959 private: 1959 1960 RefPtr<ExpressionNode> m_expr; … … 1977 1978 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1978 1979 1980 virtual bool isLoop() const JSC_FAST_CALL { return true; } 1979 1981 private: 1980 1982 RefPtr<ExpressionNode> m_expr1; … … 1993 1995 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1994 1996 1997 virtual bool isLoop() const JSC_FAST_CALL { return true; } 1995 1998 private: 1996 1999 Identifier m_ident;
Note:
See TracChangeset
for help on using the changeset viewer.