Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(224)

Side by Side Diff: src/ast.h

Issue 17378: Capture register clearing on loop iteration (Closed)
Patch Set: Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/jsregexp.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1196 matching lines...) Expand 10 before | Expand all | Expand 10 after
1207 class ThisFunction: public Expression { 1207 class ThisFunction: public Expression {
1208 public: 1208 public:
1209 virtual void Accept(AstVisitor* v); 1209 virtual void Accept(AstVisitor* v);
1210 }; 1210 };
1211 1211
1212 1212
1213 // ---------------------------------------------------------------------------- 1213 // ----------------------------------------------------------------------------
1214 // Regular expressions 1214 // Regular expressions
1215 1215
1216 1216
1217 class RegExpVisitor BASE_EMBEDDED {
1218 public:
1219 virtual ~RegExpVisitor() { }
1220 #define MAKE_CASE(Name) \
1221 virtual void* Visit##Name(RegExp##Name*, void* data) = 0;
1222 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE)
1223 #undef MAKE_CASE
1224 };
1225
1226
1217 class RegExpTree: public ZoneObject { 1227 class RegExpTree: public ZoneObject {
1218 public: 1228 public:
1219 static const int kInfinity = kMaxInt; 1229 static const int kInfinity = kMaxInt;
1220 virtual ~RegExpTree() { } 1230 virtual ~RegExpTree() { }
1221 virtual void* Accept(RegExpVisitor* visitor, void* data) = 0; 1231 virtual void* Accept(RegExpVisitor* visitor, void* data) = 0;
1222 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 1232 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
1223 RegExpNode* on_success) = 0; 1233 RegExpNode* on_success) = 0;
1224 virtual bool IsTextElement() { return false; } 1234 virtual bool IsTextElement() { return false; }
1225 virtual int min_match() = 0; 1235 virtual int min_match() = 0;
1226 virtual int max_match() = 0; 1236 virtual int max_match() = 0;
1237 // Returns the interval of registers used for captures within this
1238 // expression.
1239 virtual Interval CaptureRegisters() { return Interval::Empty(); }
1227 virtual void AppendToText(RegExpText* text); 1240 virtual void AppendToText(RegExpText* text);
1228 SmartPointer<const char> ToString(); 1241 SmartPointer<const char> ToString();
1229 #define MAKE_ASTYPE(Name) \ 1242 #define MAKE_ASTYPE(Name) \
1230 virtual RegExp##Name* As##Name(); \ 1243 virtual RegExp##Name* As##Name(); \
1231 virtual bool Is##Name(); 1244 virtual bool Is##Name();
1232 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ASTYPE) 1245 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ASTYPE)
1233 #undef MAKE_ASTYPE 1246 #undef MAKE_ASTYPE
1234 }; 1247 };
1235 1248
1236 1249
1237 class RegExpDisjunction: public RegExpTree { 1250 class RegExpDisjunction: public RegExpTree {
1238 public: 1251 public:
1239 explicit RegExpDisjunction(ZoneList<RegExpTree*>* alternatives); 1252 explicit RegExpDisjunction(ZoneList<RegExpTree*>* alternatives);
1240 virtual void* Accept(RegExpVisitor* visitor, void* data); 1253 virtual void* Accept(RegExpVisitor* visitor, void* data);
1241 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 1254 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
1242 RegExpNode* on_success); 1255 RegExpNode* on_success);
1243 virtual RegExpDisjunction* AsDisjunction(); 1256 virtual RegExpDisjunction* AsDisjunction();
1257 virtual Interval CaptureRegisters();
1244 virtual bool IsDisjunction(); 1258 virtual bool IsDisjunction();
1245 virtual int min_match() { return min_match_; } 1259 virtual int min_match() { return min_match_; }
1246 virtual int max_match() { return max_match_; } 1260 virtual int max_match() { return max_match_; }
1247 ZoneList<RegExpTree*>* alternatives() { return alternatives_; } 1261 ZoneList<RegExpTree*>* alternatives() { return alternatives_; }
1248 private: 1262 private:
1249 ZoneList<RegExpTree*>* alternatives_; 1263 ZoneList<RegExpTree*>* alternatives_;
1250 int min_match_; 1264 int min_match_;
1251 int max_match_; 1265 int max_match_;
1252 }; 1266 };
1253 1267
1254 1268
1255 class RegExpAlternative: public RegExpTree { 1269 class RegExpAlternative: public RegExpTree {
1256 public: 1270 public:
1257 explicit RegExpAlternative(ZoneList<RegExpTree*>* nodes); 1271 explicit RegExpAlternative(ZoneList<RegExpTree*>* nodes);
1258 virtual void* Accept(RegExpVisitor* visitor, void* data); 1272 virtual void* Accept(RegExpVisitor* visitor, void* data);
1259 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 1273 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
1260 RegExpNode* on_success); 1274 RegExpNode* on_success);
1261 virtual RegExpAlternative* AsAlternative(); 1275 virtual RegExpAlternative* AsAlternative();
1276 virtual Interval CaptureRegisters();
1262 virtual bool IsAlternative(); 1277 virtual bool IsAlternative();
1263 virtual int min_match() { return min_match_; } 1278 virtual int min_match() { return min_match_; }
1264 virtual int max_match() { return max_match_; } 1279 virtual int max_match() { return max_match_; }
1265 ZoneList<RegExpTree*>* nodes() { return nodes_; } 1280 ZoneList<RegExpTree*>* nodes() { return nodes_; }
1266 private: 1281 private:
1267 ZoneList<RegExpTree*>* nodes_; 1282 ZoneList<RegExpTree*>* nodes_;
1268 int min_match_; 1283 int min_match_;
1269 int max_match_; 1284 int max_match_;
1270 }; 1285 };
1271 1286
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 virtual void* Accept(RegExpVisitor* visitor, void* data); 1431 virtual void* Accept(RegExpVisitor* visitor, void* data);
1417 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 1432 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
1418 RegExpNode* on_success); 1433 RegExpNode* on_success);
1419 static RegExpNode* ToNode(int min, 1434 static RegExpNode* ToNode(int min,
1420 int max, 1435 int max,
1421 bool is_greedy, 1436 bool is_greedy,
1422 RegExpTree* body, 1437 RegExpTree* body,
1423 RegExpCompiler* compiler, 1438 RegExpCompiler* compiler,
1424 RegExpNode* on_success); 1439 RegExpNode* on_success);
1425 virtual RegExpQuantifier* AsQuantifier(); 1440 virtual RegExpQuantifier* AsQuantifier();
1441 virtual Interval CaptureRegisters();
1426 virtual bool IsQuantifier(); 1442 virtual bool IsQuantifier();
1427 virtual int min_match() { return min_match_; } 1443 virtual int min_match() { return min_match_; }
1428 virtual int max_match() { return max_match_; } 1444 virtual int max_match() { return max_match_; }
1429 int min() { return min_; } 1445 int min() { return min_; }
1430 int max() { return max_; } 1446 int max() { return max_; }
1431 bool is_greedy() { return is_greedy_; } 1447 bool is_greedy() { return is_greedy_; }
1432 RegExpTree* body() { return body_; } 1448 RegExpTree* body() { return body_; }
1433 private: 1449 private:
1434 int min_; 1450 int min_;
1435 int max_; 1451 int max_;
(...skipping 15 matching lines...) Expand all
1451 explicit RegExpCapture(RegExpTree* body, int index) 1467 explicit RegExpCapture(RegExpTree* body, int index)
1452 : body_(body), index_(index), available_(CAPTURE_AVAILABLE) { } 1468 : body_(body), index_(index), available_(CAPTURE_AVAILABLE) { }
1453 virtual void* Accept(RegExpVisitor* visitor, void* data); 1469 virtual void* Accept(RegExpVisitor* visitor, void* data);
1454 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 1470 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
1455 RegExpNode* on_success); 1471 RegExpNode* on_success);
1456 static RegExpNode* ToNode(RegExpTree* body, 1472 static RegExpNode* ToNode(RegExpTree* body,
1457 int index, 1473 int index,
1458 RegExpCompiler* compiler, 1474 RegExpCompiler* compiler,
1459 RegExpNode* on_success); 1475 RegExpNode* on_success);
1460 virtual RegExpCapture* AsCapture(); 1476 virtual RegExpCapture* AsCapture();
1477 virtual Interval CaptureRegisters();
1461 virtual bool IsCapture(); 1478 virtual bool IsCapture();
1462 virtual int min_match() { return body_->min_match(); } 1479 virtual int min_match() { return body_->min_match(); }
1463 virtual int max_match() { return body_->max_match(); } 1480 virtual int max_match() { return body_->max_match(); }
1464 RegExpTree* body() { return body_; } 1481 RegExpTree* body() { return body_; }
1465 int index() { return index_; } 1482 int index() { return index_; }
1466 inline CaptureAvailability available() { return available_; } 1483 inline CaptureAvailability available() { return available_; }
1467 inline void set_available(CaptureAvailability availability) { 1484 inline void set_available(CaptureAvailability availability) {
1468 available_ = availability; 1485 available_ = availability;
1469 } 1486 }
1470 static int StartRegister(int index) { return index * 2; } 1487 static int StartRegister(int index) { return index * 2; }
1471 static int EndRegister(int index) { return index * 2 + 1; } 1488 static int EndRegister(int index) { return index * 2 + 1; }
1472 private: 1489 private:
1473 RegExpTree* body_; 1490 RegExpTree* body_;
1474 int index_; 1491 int index_;
1475 CaptureAvailability available_; 1492 CaptureAvailability available_;
1476 }; 1493 };
1477 1494
1478 1495
1479 class RegExpLookahead: public RegExpTree { 1496 class RegExpLookahead: public RegExpTree {
1480 public: 1497 public:
1481 RegExpLookahead(RegExpTree* body, bool is_positive) 1498 RegExpLookahead(RegExpTree* body, bool is_positive)
1482 : body_(body), 1499 : body_(body),
1483 is_positive_(is_positive) { } 1500 is_positive_(is_positive) { }
1484 virtual void* Accept(RegExpVisitor* visitor, void* data); 1501 virtual void* Accept(RegExpVisitor* visitor, void* data);
1485 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 1502 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
1486 RegExpNode* on_success); 1503 RegExpNode* on_success);
1487 virtual RegExpLookahead* AsLookahead(); 1504 virtual RegExpLookahead* AsLookahead();
1505 virtual Interval CaptureRegisters();
1488 virtual bool IsLookahead(); 1506 virtual bool IsLookahead();
1489 virtual int min_match() { return 0; } 1507 virtual int min_match() { return 0; }
1490 virtual int max_match() { return 0; } 1508 virtual int max_match() { return 0; }
1491 RegExpTree* body() { return body_; } 1509 RegExpTree* body() { return body_; }
1492 bool is_positive() { return is_positive_; } 1510 bool is_positive() { return is_positive_; }
1493 private: 1511 private:
1494 RegExpTree* body_; 1512 RegExpTree* body_;
1495 bool is_positive_; 1513 bool is_positive_;
1496 }; 1514 };
1497 1515
(...skipping 25 matching lines...) Expand all
1523 virtual RegExpEmpty* AsEmpty(); 1541 virtual RegExpEmpty* AsEmpty();
1524 virtual bool IsEmpty(); 1542 virtual bool IsEmpty();
1525 virtual int min_match() { return 0; } 1543 virtual int min_match() { return 0; }
1526 virtual int max_match() { return 0; } 1544 virtual int max_match() { return 0; }
1527 static RegExpEmpty* GetInstance() { return &kInstance; } 1545 static RegExpEmpty* GetInstance() { return &kInstance; }
1528 private: 1546 private:
1529 static RegExpEmpty kInstance; 1547 static RegExpEmpty kInstance;
1530 }; 1548 };
1531 1549
1532 1550
1533 class RegExpVisitor BASE_EMBEDDED {
1534 public:
1535 virtual ~RegExpVisitor() { }
1536 #define MAKE_CASE(Name) \
1537 virtual void* Visit##Name(RegExp##Name*, void* data) = 0;
1538 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE)
1539 #undef MAKE_CASE
1540 };
1541
1542
1543 // ---------------------------------------------------------------------------- 1551 // ----------------------------------------------------------------------------
1544 // Basic visitor 1552 // Basic visitor
1545 // - leaf node visitors are abstract. 1553 // - leaf node visitors are abstract.
1546 1554
1547 class AstVisitor BASE_EMBEDDED { 1555 class AstVisitor BASE_EMBEDDED {
1548 public: 1556 public:
1549 AstVisitor() : stack_overflow_(false) { } 1557 AstVisitor() : stack_overflow_(false) { }
1550 virtual ~AstVisitor() { } 1558 virtual ~AstVisitor() { }
1551 1559
1552 // Dispatch 1560 // Dispatch
(...skipping 25 matching lines...) Expand all
1578 #undef DEF_VISIT 1586 #undef DEF_VISIT
1579 1587
1580 private: 1588 private:
1581 bool stack_overflow_; 1589 bool stack_overflow_;
1582 }; 1590 };
1583 1591
1584 1592
1585 } } // namespace v8::internal 1593 } } // namespace v8::internal
1586 1594
1587 #endif // V8_AST_H_ 1595 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/jsregexp.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698