| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index 2d92205554635666901ee1a3882c8cc812ab28f3..bdf7f975ebf38847b53f5210fe5c28c21d55e578 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -5696,21 +5696,36 @@ RawRegExp* Function::regexp() const {
|
| }
|
|
|
|
|
| +class StickySpecialization : public BitField<intptr_t, bool, 0, 1> {};
|
| +class StringSpecializationCid
|
| + : public BitField<intptr_t, intptr_t, 1, RawObject::kClassIdTagSize> {};
|
| +
|
| +
|
| intptr_t Function::string_specialization_cid() const {
|
| ASSERT(kind() == RawFunction::kIrregexpFunction);
|
| const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data_));
|
| - return Smi::Value(Smi::RawCast(pair.At(1)));
|
| + return StringSpecializationCid::decode(Smi::Value(Smi::RawCast(pair.At(1))));
|
| +}
|
| +
|
| +
|
| +bool Function::is_sticky_specialization() const {
|
| + ASSERT(kind() == RawFunction::kIrregexpFunction);
|
| + const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data_));
|
| + return StickySpecialization::decode(Smi::Value(Smi::RawCast(pair.At(1))));
|
| }
|
|
|
|
|
| void Function::SetRegExpData(const RegExp& regexp,
|
| - intptr_t string_specialization_cid) const {
|
| + intptr_t string_specialization_cid,
|
| + bool sticky) const {
|
| ASSERT(kind() == RawFunction::kIrregexpFunction);
|
| ASSERT(RawObject::IsStringClassId(string_specialization_cid));
|
| ASSERT(raw_ptr()->data_ == Object::null());
|
| const Array& pair = Array::Handle(Array::New(2, Heap::kOld));
|
| pair.SetAt(0, regexp);
|
| - pair.SetAt(1, Smi::Handle(Smi::New(string_specialization_cid)));
|
| + pair.SetAt(1, Smi::Handle(Smi::New(StickySpecialization::encode(sticky) |
|
| + StringSpecializationCid::encode(
|
| + string_specialization_cid))));
|
| set_data(pair);
|
| }
|
|
|
| @@ -22392,16 +22407,28 @@ void RegExp::set_pattern(const String& pattern) const {
|
| }
|
|
|
|
|
| -void RegExp::set_function(intptr_t cid, const Function& value) const {
|
| - StorePointer(FunctionAddr(cid), value.raw());
|
| +void RegExp::set_function(intptr_t cid,
|
| + bool sticky,
|
| + const Function& value) const {
|
| + StorePointer(FunctionAddr(cid, sticky), value.raw());
|
| }
|
|
|
|
|
| -void RegExp::set_bytecode(bool is_one_byte, const TypedData& bytecode) const {
|
| - if (is_one_byte) {
|
| - StorePointer(&raw_ptr()->one_byte_bytecode_, bytecode.raw());
|
| +void RegExp::set_bytecode(bool is_one_byte,
|
| + bool sticky,
|
| + const TypedData& bytecode) const {
|
| + if (sticky) {
|
| + if (is_one_byte) {
|
| + StorePointer(&raw_ptr()->one_byte_sticky_.bytecode_, bytecode.raw());
|
| + } else {
|
| + StorePointer(&raw_ptr()->two_byte_sticky_.bytecode_, bytecode.raw());
|
| + }
|
| } else {
|
| - StorePointer(&raw_ptr()->two_byte_bytecode_, bytecode.raw());
|
| + if (is_one_byte) {
|
| + StorePointer(&raw_ptr()->one_byte_.bytecode_, bytecode.raw());
|
| + } else {
|
| + StorePointer(&raw_ptr()->two_byte_.bytecode_, bytecode.raw());
|
| + }
|
| }
|
| }
|
|
|
|
|