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

Unified Diff: src/jsregexp.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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/ast.cc ('k') | src/jsregexp.cc » ('j') | src/jsregexp.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/jsregexp.h
diff --git a/src/jsregexp.h b/src/jsregexp.h
index de99dc71ad506eefdc1937151a22ee988065799b..e1e65f6b4e42e77c774bbf986499b0019c2e76f6 100644
--- a/src/jsregexp.h
+++ b/src/jsregexp.h
@@ -664,6 +664,30 @@ class RegExpNode: public ZoneObject {
};
+// A simple closed interval.
+class Interval {
+ public:
+ Interval() : from_(kNone), to_(kNone) { }
+ Interval(short from, short to) : from_(from), to_(to) { }
+ Interval Union(Interval that) {
+ if (that.from_ == kNone) return *this;
+ else if (from_ == kNone) return that;
+ else return Interval(Min(from_, that.from_), Max(to_, that.to_));
+ }
+ bool Contains(int value) {
+ return (from_ <= value) && (value <= to_);
+ }
+ bool is_empty() { return from_ == kNone; }
+ short from() { return from_; }
+ short to() { return to_; }
+ static Interval Empty() { return Interval(); }
+ static const int kNone = -1;
+ private:
+ short from_;
+ short to_;
+};
+
+
class SeqRegExpNode: public RegExpNode {
public:
explicit SeqRegExpNode(RegExpNode* on_success)
@@ -683,24 +707,24 @@ class ActionNode: public SeqRegExpNode {
STORE_POSITION,
BEGIN_SUBMATCH,
POSITIVE_SUBMATCH_SUCCESS,
- EMPTY_MATCH_CHECK
+ EMPTY_MATCH_CHECK,
+ CLEAR_CAPTURES
};
static ActionNode* SetRegister(int reg, int val, RegExpNode* on_success);
static ActionNode* IncrementRegister(int reg, RegExpNode* on_success);
static ActionNode* StorePosition(int reg, RegExpNode* on_success);
- static ActionNode* BeginSubmatch(
- int stack_pointer_reg,
- int position_reg,
- RegExpNode* on_success);
- static ActionNode* PositiveSubmatchSuccess(
- int stack_pointer_reg,
- int restore_reg,
- RegExpNode* on_success);
- static ActionNode* EmptyMatchCheck(
- int start_register,
- int repetition_register,
- int repetition_limit,
- RegExpNode* on_success);
+ static ActionNode* ClearCaptures(Interval range,
+ RegExpNode* on_success);
Erik Corry 2009/01/14 09:24:31 This fits on one line.
Christian Plesner Hansen 2009/01/14 11:31:35 Fixed
+ static ActionNode* BeginSubmatch(int stack_pointer_reg,
+ int position_reg,
+ RegExpNode* on_success);
+ static ActionNode* PositiveSubmatchSuccess(int stack_pointer_reg,
+ int restore_reg,
+ RegExpNode* on_success);
+ static ActionNode* EmptyMatchCheck(int start_register,
+ int repetition_register,
+ int repetition_limit,
+ RegExpNode* on_success);
virtual void Accept(NodeVisitor* visitor);
virtual bool Emit(RegExpCompiler* compiler, GenerationVariant* variant);
virtual int EatsAtLeast(int recursion_depth);
@@ -736,6 +760,10 @@ class ActionNode: public SeqRegExpNode {
int repetition_register;
int repetition_limit;
} u_empty_match_check;
+ struct {
+ int range_from;
Erik Corry 2009/01/14 09:24:31 Can't we just have an Interval here?
Christian Plesner Hansen 2009/01/14 11:31:35 I thought so too but it turns out that you can't h
+ int range_to;
+ } u_clear_captures;
} data_;
ActionNode(Type type, RegExpNode* on_success)
: SeqRegExpNode(on_success),
@@ -980,6 +1008,7 @@ class GenerationVariant {
DeferredAction(ActionNode::Type type, int reg)
: type_(type), reg_(reg), next_(NULL) { }
DeferredAction* next() { return next_; }
+ bool Mentions(int reg);
Erik Corry 2009/01/14 09:24:31 It's messy that this is not a private method, sinc
Christian Plesner Hansen 2009/01/14 11:31:35 I'm not sure -- all other operations than the one
int reg() { return reg_; }
ActionNode::Type type() { return type_; }
private:
@@ -1010,6 +1039,16 @@ class GenerationVariant {
int value_;
};
+ class DeferredClearCaptures : public DeferredAction {
+ public:
+ DeferredClearCaptures(Interval range)
+ : DeferredAction(ActionNode::CLEAR_CAPTURES, -1),
+ range_(range) { }
+ Interval range() { return range_; }
+ private:
+ Interval range_;
+ };
+
class DeferredIncrementRegister: public DeferredAction {
public:
explicit DeferredIncrementRegister(int reg)
« no previous file with comments | « src/ast.cc ('k') | src/jsregexp.cc » ('j') | src/jsregexp.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698