Index: runtime/vm/object.h |
diff --git a/runtime/vm/object.h b/runtime/vm/object.h |
index cd60a4f378647e708293e5e7ed9c6b31591aba03..772f34e068efd1840cd53842ecbf5218c0183fcb 100644 |
--- a/runtime/vm/object.h |
+++ b/runtime/vm/object.h |
@@ -1643,6 +1643,16 @@ class Function : public Object { |
RawClass* origin() const; |
RawScript* script() const; |
+ void set_regexp(const JSRegExp& value) const; |
+ RawJSRegExp* regexp() const { return raw_ptr()->regexp_; } |
+ |
+ void set_regexp_specialization(intptr_t cid) { |
+ raw_ptr()->regexp_specialization_ = cid; |
+ } |
+ intptr_t regexp_specialization() const { |
+ return raw_ptr()->regexp_specialization_; |
+ } |
+ |
RawAbstractType* result_type() const { return raw_ptr()->result_type_; } |
void set_result_type(const AbstractType& value) const; |
@@ -1771,6 +1781,7 @@ class Function : public Object { |
case RawFunction::kMethodExtractor: |
case RawFunction::kNoSuchMethodDispatcher: |
case RawFunction::kInvokeFieldDispatcher: |
+ case RawFunction::kIrregexpFunction: |
return true; |
case RawFunction::kClosureFunction: |
case RawFunction::kConstructor: |
@@ -1792,6 +1803,7 @@ class Function : public Object { |
case RawFunction::kImplicitGetter: |
case RawFunction::kImplicitSetter: |
case RawFunction::kImplicitStaticFinalGetter: |
+ case RawFunction::kIrregexpFunction: |
return true; |
case RawFunction::kClosureFunction: |
case RawFunction::kConstructor: |
@@ -2031,6 +2043,11 @@ class Function : public Object { |
return kind() == RawFunction::kClosureFunction; |
} |
+ // Returns true if this function represents a generated irregexp function. |
+ bool IsIrregexpFunction() const { |
+ return kind() == RawFunction::kIrregexpFunction; |
+ } |
+ |
// Returns true if this function represents an implicit closure function. |
bool IsImplicitClosureFunction() const; |
@@ -7168,11 +7185,63 @@ class JSRegExp : public Instance { |
bool is_multi_line() const { return (flags() & kMultiLine); } |
RawString* pattern() const { return raw_ptr()->pattern_; } |
+ |
+ static intptr_t subject_offset(intptr_t cid) { |
+ switch (cid) { |
+ case kOneByteStringCid: return OFFSET_OF(RawJSRegExp, one_byte_subject_); |
+ case kTwoByteStringCid: return OFFSET_OF(RawJSRegExp, two_byte_subject_); |
+ case kExternalOneByteStringCid: |
+ return OFFSET_OF(RawJSRegExp, external_one_byte_subject_); |
+ case kExternalTwoByteStringCid: |
+ return OFFSET_OF(RawJSRegExp, external_two_byte_subject_); |
+ } |
+ |
+ UNREACHABLE(); |
+ return -1; |
+ } |
+ RawString* sample_subject(intptr_t cid) const { |
+ switch (cid) { |
+ case kOneByteStringCid: return raw_ptr()->one_byte_subject_; |
+ case kTwoByteStringCid: return raw_ptr()->two_byte_subject_; |
+ case kExternalOneByteStringCid: |
+ return raw_ptr()->external_one_byte_subject_; |
+ case kExternalTwoByteStringCid: |
+ return raw_ptr()->external_two_byte_subject_; |
+ } |
+ |
+ UNREACHABLE(); |
+ return String::null(); |
+ } |
+ |
RawSmi* num_bracket_expressions() const { |
return raw_ptr()->num_bracket_expressions_; |
} |
+ static intptr_t function_offset(intptr_t cid) { |
+ switch (cid) { |
+ case kOneByteStringCid: return OFFSET_OF(RawJSRegExp, one_byte_function_); |
+ case kTwoByteStringCid: return OFFSET_OF(RawJSRegExp, two_byte_function_); |
+ case kExternalOneByteStringCid: |
+ return OFFSET_OF(RawJSRegExp, external_one_byte_function_); |
+ case kExternalTwoByteStringCid: |
+ return OFFSET_OF(RawJSRegExp, external_two_byte_function_); |
+ } |
+ |
+ UNREACHABLE(); |
+ return -1; |
+ } |
+ RawFunction* one_byte_function() const { |
+ return raw_ptr()->one_byte_function_; |
+ } |
+ |
+ RawFunction* two_byte_function() const { |
+ return raw_ptr()->two_byte_function_; |
+ } |
+ |
void set_pattern(const String& pattern) const; |
+ void set_function(intptr_t cid, const Function& value); |
+ void set_sample_subject(intptr_t cid, const String& value) const; |
+ |
void set_num_bracket_expressions(intptr_t value) const; |
void set_is_global() const { set_flags(flags() | kGlobal); } |
void set_is_ignore_case() const { set_flags(flags() | kIgnoreCase); } |