Index: runtime/vm/object.h |
diff --git a/runtime/vm/object.h b/runtime/vm/object.h |
index c5796e7e7969742ce4278f27510857b67230e521..e179ba5d9b26e9e589271ca78beb17f794a8a629 100644 |
--- a/runtime/vm/object.h |
+++ b/runtime/vm/object.h |
@@ -25,6 +25,8 @@ |
namespace dart { |
+DECLARE_FLAG(bool, use_jscre); |
+ |
// Forward declarations. |
#define DEFINE_FORWARD_DECLARATION(clazz) \ |
class clazz; |
@@ -1723,6 +1725,14 @@ class Function : public Object { |
RawClass* origin() const; |
RawScript* script() const; |
+ void set_regexp(const JSRegExp& value) const; |
+ RawJSRegExp* regexp() const; |
+ |
+ // Get and set the class id this function is specialized for. Only set for |
+ // irregexp functions. |
+ intptr_t regexp_cid() const { return raw_ptr()->regexp_cid_; } |
+ void set_regexp_cid(intptr_t regexp_cid) const; |
+ |
RawAbstractType* result_type() const { return raw_ptr()->result_type_; } |
void set_result_type(const AbstractType& value) const; |
@@ -1852,6 +1862,7 @@ class Function : public Object { |
case RawFunction::kClosureFunction: |
case RawFunction::kConstructor: |
case RawFunction::kImplicitStaticFinalGetter: |
+ case RawFunction::kIrregexpFunction: |
return false; |
default: |
UNREACHABLE(); |
@@ -1869,6 +1880,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: |
@@ -2063,6 +2075,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; |
@@ -4546,6 +4563,7 @@ class Instance : public Object { |
friend class Class; |
friend class Closure; |
friend class DeferredObject; |
+ friend class JSRegExp; |
friend class SnapshotWriter; |
friend class StubCode; |
friend class TypedDataView; |
@@ -7223,7 +7241,34 @@ class JSRegExp : public Instance { |
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** FunctionAddr(intptr_t cid) const { |
+ return reinterpret_cast<RawFunction**>( |
+ FieldAddrAtOffset(function_offset(cid))); |
+ } |
+ |
+ RawFunction* function(intptr_t cid) const { |
+ return *FunctionAddr(cid); |
+ } |
+ |
void set_pattern(const String& pattern) const; |
+ void set_function(intptr_t cid, const Function& 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); } |
@@ -7242,7 +7287,10 @@ class JSRegExp : public Instance { |
static intptr_t InstanceSize() { |
ASSERT(sizeof(RawJSRegExp) == OFFSET_OF_RETURNED_VALUE(RawJSRegExp, data)); |
- return 0; |
+ if (FLAG_use_jscre) { |
+ return 0; |
+ } |
+ return RoundedAllocationSize(sizeof(RawJSRegExp)); |
} |
static intptr_t InstanceSize(intptr_t len) { |