Index: runtime/vm/object.h |
diff --git a/runtime/vm/object.h b/runtime/vm/object.h |
index 0765fcc28fc31f9c6a14df52823b0377d89249e8..cdd3c5ea6f8e881e994e03a85ce714fedf10a014 100644 |
--- a/runtime/vm/object.h |
+++ b/runtime/vm/object.h |
@@ -2215,8 +2215,10 @@ class Function : public Object { |
RawRegExp* regexp() const; |
intptr_t string_specialization_cid() const; |
+ bool is_sticky_specialization() const; |
void SetRegExpData(const RegExp& regexp, |
- intptr_t string_specialization_cid) const; |
+ intptr_t string_specialization_cid, |
+ bool sticky) const; |
RawString* native_name() const; |
void set_native_name(const String& name) const; |
@@ -8447,37 +8449,59 @@ class RegExp : public Instance { |
return raw_ptr()->num_bracket_expressions_; |
} |
- RawTypedData* bytecode(bool is_one_byte) const { |
- return is_one_byte ? raw_ptr()->one_byte_bytecode_ |
- : raw_ptr()->two_byte_bytecode_; |
+ RawTypedData* bytecode(bool is_one_byte, bool sticky) const { |
+ if (sticky) { |
+ return is_one_byte ? raw_ptr()->one_byte_sticky_.bytecode_ |
+ : raw_ptr()->two_byte_sticky_.bytecode_; |
+ } else { |
+ return is_one_byte ? raw_ptr()->one_byte_.bytecode_ |
+ : raw_ptr()->two_byte_.bytecode_; |
+ } |
} |
- static intptr_t function_offset(intptr_t cid) { |
- switch (cid) { |
- case kOneByteStringCid: |
- return OFFSET_OF(RawRegExp, one_byte_function_); |
- case kTwoByteStringCid: |
- return OFFSET_OF(RawRegExp, two_byte_function_); |
- case kExternalOneByteStringCid: |
- return OFFSET_OF(RawRegExp, external_one_byte_function_); |
- case kExternalTwoByteStringCid: |
- return OFFSET_OF(RawRegExp, external_two_byte_function_); |
+ static intptr_t function_offset(intptr_t cid, bool sticky) { |
+ if (sticky) { |
+ switch (cid) { |
+ case kOneByteStringCid: |
+ return OFFSET_OF(RawRegExp, one_byte_sticky_.function_); |
+ case kTwoByteStringCid: |
+ return OFFSET_OF(RawRegExp, two_byte_sticky_.function_); |
+ case kExternalOneByteStringCid: |
+ return OFFSET_OF(RawRegExp, external_one_byte_sticky_function_); |
+ case kExternalTwoByteStringCid: |
+ return OFFSET_OF(RawRegExp, external_two_byte_sticky_function_); |
+ } |
+ } else { |
+ switch (cid) { |
+ case kOneByteStringCid: |
+ return OFFSET_OF(RawRegExp, one_byte_.function_); |
+ case kTwoByteStringCid: |
+ return OFFSET_OF(RawRegExp, two_byte_.function_); |
+ case kExternalOneByteStringCid: |
+ return OFFSET_OF(RawRegExp, external_one_byte_function_); |
+ case kExternalTwoByteStringCid: |
+ return OFFSET_OF(RawRegExp, external_two_byte_function_); |
+ } |
} |
UNREACHABLE(); |
return -1; |
} |
- RawFunction** FunctionAddr(intptr_t cid) const { |
+ RawFunction** FunctionAddr(intptr_t cid, bool sticky) const { |
return reinterpret_cast<RawFunction**>( |
- FieldAddrAtOffset(function_offset(cid))); |
+ FieldAddrAtOffset(function_offset(cid, sticky))); |
} |
- RawFunction* function(intptr_t cid) const { return *FunctionAddr(cid); } |
+ RawFunction* function(intptr_t cid, bool sticky) const { |
+ return *FunctionAddr(cid, sticky); |
+ } |
void set_pattern(const String& pattern) const; |
- void set_function(intptr_t cid, const Function& value) const; |
- void set_bytecode(bool is_one_byte, const TypedData& bytecode) const; |
+ void set_function(intptr_t cid, bool sticky, const Function& value) const; |
+ void set_bytecode(bool is_one_byte, |
+ bool sticky, |
+ const TypedData& bytecode) const; |
void set_num_bracket_expressions(intptr_t value) const; |
void set_is_global() const { set_flags(flags() | kGlobal); } |