Changeset 38047 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp
- Timestamp:
- Oct 31, 2008, 12:59:08 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/nodes.cpp
r38040 r38047 31 31 #include "JSGlobalObject.h" 32 32 #include "JSStaticScopeObject.h" 33 #include "LabelScope.h" 33 34 #include "Parser.h" 34 35 #include "PropertyNameArray.h" … … 1175 1176 RegisterID* DoWhileNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1176 1177 { 1178 RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop); 1179 1177 1180 RefPtr<LabelID> topOfLoop = generator.newLabel(); 1178 1181 generator.emitLabel(topOfLoop.get()); … … 1182 1185 if (!m_statement->isBlock()) 1183 1186 generator.emitDebugHook(WillExecuteStatement, m_statement->firstLine(), m_statement->lastLine()); 1184 1185 RefPtr<LabelID> continueTarget = generator.newLabel(); 1186 RefPtr<LabelID> breakTarget = generator.newLabel(); 1187 1188 generator.pushJumpContext(&m_labelStack, continueTarget.get(), breakTarget.get(), true); 1187 1189 1188 RefPtr<RegisterID> result = generator.emitNode(dst, m_statement.get()); 1190 generator.popJumpContext(); 1191 1192 generator.emitLabel(continueTarget.get()); 1189 1190 generator.emitLabel(scope->continueTarget()); 1193 1191 generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo()); 1194 1192 RegisterID* cond = generator.emitNode(m_expr.get()); 1195 1193 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1196 1194 1197 generator.emitLabel( breakTarget.get());1195 generator.emitLabel(scope->breakTarget()); 1198 1196 return result.get(); 1199 1197 } … … 1203 1201 RegisterID* WhileNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1204 1202 { 1203 RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop); 1204 1205 generator.emitJump(scope->continueTarget()); 1206 1205 1207 RefPtr<LabelID> topOfLoop = generator.newLabel(); 1206 RefPtr<LabelID> continueTarget = generator.newLabel();1207 RefPtr<LabelID> breakTarget = generator.newLabel();1208 1209 generator.emitJump(continueTarget.get());1210 1208 generator.emitLabel(topOfLoop.get()); 1211 1209 … … 1213 1211 generator.emitDebugHook(WillExecuteStatement, m_statement->firstLine(), m_statement->lastLine()); 1214 1212 1215 generator.pushJumpContext(&m_labelStack, continueTarget.get(), breakTarget.get(), true);1216 1213 generator.emitNode(dst, m_statement.get()); 1217 generator.popJumpContext(); 1218 1219 generator.emitLabel(continueTarget.get()); 1214 1215 generator.emitLabel(scope->continueTarget()); 1220 1216 generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo()); 1221 1217 RegisterID* cond = generator.emitNode(m_expr.get()); 1222 1218 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1223 1219 1224 generator.emitLabel( breakTarget.get());1220 generator.emitLabel(scope->breakTarget()); 1225 1221 1226 1222 // FIXME: This should return the last statement executed so that it can be returned as a Completion … … 1235 1231 dst = 0; 1236 1232 1233 RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop); 1234 1237 1235 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); 1238 1236 … … 1240 1238 generator.emitNode(ignoredResult(), m_expr1.get()); 1241 1239 1240 RefPtr<LabelID> condition = generator.newLabel(); 1241 generator.emitJump(condition.get()); 1242 1242 1243 RefPtr<LabelID> topOfLoop = generator.newLabel(); 1243 RefPtr<LabelID> beforeCondition = generator.newLabel();1244 RefPtr<LabelID> continueTarget = generator.newLabel();1245 RefPtr<LabelID> breakTarget = generator.newLabel();1246 generator.emitJump(beforeCondition.get());1247 1248 1244 generator.emitLabel(topOfLoop.get()); 1249 generator.pushJumpContext(&m_labelStack, continueTarget.get(), breakTarget.get(), true); 1245 1250 1246 if (!m_statement->isBlock()) 1251 1247 generator.emitDebugHook(WillExecuteStatement, m_statement->firstLine(), m_statement->lastLine()); 1252 1248 RefPtr<RegisterID> result = generator.emitNode(dst, m_statement.get()); 1253 generator.popJumpContext(); 1254 generator.emitLabel( continueTarget.get());1249 1250 generator.emitLabel(scope->continueTarget()); 1255 1251 if (m_expr3) 1256 1252 generator.emitNode(ignoredResult(), m_expr3.get()); 1257 1253 1258 generator.emitLabel( beforeCondition.get());1254 generator.emitLabel(condition.get()); 1259 1255 if (m_expr2) { 1260 1256 RegisterID* cond = generator.emitNode(m_expr2.get()); 1261 1257 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1262 } else {1258 } else 1263 1259 generator.emitJump(topOfLoop.get()); 1264 } 1265 1266 generator.emitLabel(breakTarget.get()); 1267 1260 1261 generator.emitLabel(scope->breakTarget()); 1268 1262 return result.get(); 1269 1263 } … … 1299 1293 RegisterID* ForInNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1300 1294 { 1295 RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop); 1296 1301 1297 if (!m_lexpr->isLocation()) 1302 1298 return emitThrowError(generator, ReferenceError, "Left side of for-in statement is not a reference."); 1303 RefPtr<LabelID> loopStart = generator.newLabel(); 1299 1304 1300 RefPtr<LabelID> continueTarget = generator.newLabel(); 1305 RefPtr<LabelID> breakTarget = generator.newLabel();1306 1301 1307 1302 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); … … 1311 1306 RegisterID* forInBase = generator.emitNode(m_expr.get()); 1312 1307 RefPtr<RegisterID> iter = generator.emitGetPropertyNames(generator.newTemporary(), forInBase); 1313 generator.emitJump(continueTarget.get()); 1308 generator.emitJump(scope->continueTarget()); 1309 1310 RefPtr<LabelID> loopStart = generator.newLabel(); 1314 1311 generator.emitLabel(loopStart.get()); 1312 1315 1313 RegisterID* propertyName; 1316 1314 if (m_lexpr->isResolveNode()) { … … 1346 1344 } 1347 1345 1348 generator.pushJumpContext(&m_labelStack, continueTarget.get(), breakTarget.get(), true);1349 1346 if (!m_statement->isBlock()) 1350 1347 generator.emitDebugHook(WillExecuteStatement, m_statement->firstLine(), m_statement->lastLine()); 1351 1348 generator.emitNode(dst, m_statement.get()); 1352 generator.popJumpContext(); 1353 1354 generator.emitLabel(continueTarget.get()); 1349 1350 generator.emitLabel(scope->continueTarget()); 1355 1351 generator.emitNextPropertyName(propertyName, iter.get(), loopStart.get()); 1356 generator.emitLabel( breakTarget.get());1352 generator.emitLabel(scope->breakTarget()); 1357 1353 return dst; 1358 1354 } … … 1363 1359 RegisterID* ContinueNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1364 1360 { 1365 if (!generator.inContinueContext()) 1366 return emitThrowError(generator, SyntaxError, "Invalid continue statement."); 1367 1368 JumpContext* targetContext = generator.jumpContextForContinue(m_ident); 1369 1370 if (!targetContext) { 1371 if (m_ident.isEmpty()) 1372 return emitThrowError(generator, SyntaxError, "Invalid continue statement."); 1373 else 1374 return emitThrowError(generator, SyntaxError, "Label %s not found.", m_ident); 1375 } 1376 1377 if (!targetContext->continueTarget) 1378 return emitThrowError(generator, SyntaxError, "Invalid continue statement."); 1379 1380 generator.emitJumpScopes(targetContext->continueTarget, targetContext->scopeDepth); 1381 1361 LabelScope* scope = generator.continueTarget(m_ident); 1362 1363 if (!scope) 1364 return m_ident.isEmpty() 1365 ? emitThrowError(generator, SyntaxError, "Invalid continue statement.") 1366 : emitThrowError(generator, SyntaxError, "Undefined label: '%s'.", m_ident); 1367 1368 generator.emitJumpScopes(scope->continueTarget(), scope->scopeDepth()); 1382 1369 return dst; 1383 1370 } … … 1388 1375 RegisterID* BreakNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1389 1376 { 1390 if (!generator.inJumpContext()) 1391 return emitThrowError(generator, SyntaxError, "Invalid break statement."); 1377 LabelScope* scope = generator.breakTarget(m_ident); 1392 1378 1393 JumpContext* targetContext = generator.jumpContextForBreak(m_ident); 1394 1395 if (!targetContext) { 1396 if (m_ident.isEmpty()) 1397 return emitThrowError(generator, SyntaxError, "Invalid break statement."); 1398 else 1399 return emitThrowError(generator, SyntaxError, "Label %s not found.", m_ident); 1400 } 1401 1402 ASSERT(targetContext->breakTarget); 1403 1404 generator.emitJumpScopes(targetContext->breakTarget, targetContext->scopeDepth); 1405 1379 if (!scope) 1380 return m_ident.isEmpty() 1381 ? emitThrowError(generator, SyntaxError, "Invalid break statement.") 1382 : emitThrowError(generator, SyntaxError, "Undefined label: '%s'.", m_ident); 1383 1384 generator.emitJumpScopes(scope->breakTarget(), scope->scopeDepth()); 1406 1385 return dst; 1407 1386 } … … 1584 1563 RegisterID* SwitchNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1585 1564 { 1586 RefPtr<Label ID> breakTarget = generator.newLabel();1565 RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Switch); 1587 1566 1588 1567 RefPtr<RegisterID> r0 = generator.emitNode(m_expr.get()); 1589 generator.pushJumpContext(&m_labelStack, 0, breakTarget.get(), true);1590 1568 RegisterID* r1 = m_block->emitCodeForBlock(generator, r0.get(), dst); 1591 generator.popJumpContext(); 1592 1593 generator.emitLabel(breakTarget.get()); 1594 1569 1570 generator.emitLabel(scope->breakTarget()); 1595 1571 return r1; 1596 1572 } … … 1600 1576 RegisterID* LabelNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1601 1577 { 1602 if (generator.jumpContextForBreak(m_label)) 1603 return emitThrowError(generator, SyntaxError, "Duplicated label %s found.", m_label); 1604 1605 RefPtr<LabelID> l0 = generator.newLabel(); 1606 m_labelStack.push(m_label); 1607 generator.pushJumpContext(&m_labelStack, 0, l0.get(), false); 1608 1578 if (generator.breakTarget(m_name)) 1579 return emitThrowError(generator, SyntaxError, "Duplicate label: %s.", m_name); 1580 1581 RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::NamedLabel, &m_name); 1609 1582 RegisterID* r0 = generator.emitNode(dst, m_statement.get()); 1610 1611 generator.popJumpContext(); 1612 m_labelStack.pop(); 1613 1614 generator.emitLabel(l0.get()); 1583 1584 generator.emitLabel(scope->breakTarget()); 1615 1585 return r0; 1616 1586 }
Note:
See TracChangeset
for help on using the changeset viewer.