OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef VM_OBJECT_H_ | 5 #ifndef VM_OBJECT_H_ |
6 #define VM_OBJECT_H_ | 6 #define VM_OBJECT_H_ |
7 | 7 |
8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "platform/utils.h" | 10 #include "platform/utils.h" |
(...skipping 1625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1636 bool HasInstantiatedSignature() const; | 1636 bool HasInstantiatedSignature() const; |
1637 | 1637 |
1638 // Build a string of the form 'T, {b: B, c: C} representing the user | 1638 // Build a string of the form 'T, {b: B, c: C} representing the user |
1639 // visible formal parameters of the function. | 1639 // visible formal parameters of the function. |
1640 RawString* UserVisibleFormalParameters() const; | 1640 RawString* UserVisibleFormalParameters() const; |
1641 | 1641 |
1642 RawClass* Owner() const; | 1642 RawClass* Owner() const; |
1643 RawClass* origin() const; | 1643 RawClass* origin() const; |
1644 RawScript* script() const; | 1644 RawScript* script() const; |
1645 | 1645 |
1646 void set_regexp(const JSRegExp& value) const; | |
1647 RawJSRegExp* regexp() const { return raw_ptr()->regexp_; } | |
1648 | |
1649 void set_regexp_specialization(intptr_t cid) { | |
1650 raw_ptr()->regexp_specialization_ = cid; | |
Florian Schneider
2014/10/01 17:04:15
I think you can use the kind-specific data_ field
jgruber1
2014/10/03 18:59:54
data_ now stores the RawJSRegExp pointer, and I re
| |
1651 } | |
1652 intptr_t regexp_specialization() const { | |
1653 return raw_ptr()->regexp_specialization_; | |
1654 } | |
1655 | |
1646 RawAbstractType* result_type() const { return raw_ptr()->result_type_; } | 1656 RawAbstractType* result_type() const { return raw_ptr()->result_type_; } |
1647 void set_result_type(const AbstractType& value) const; | 1657 void set_result_type(const AbstractType& value) const; |
1648 | 1658 |
1649 RawAbstractType* ParameterTypeAt(intptr_t index) const; | 1659 RawAbstractType* ParameterTypeAt(intptr_t index) const; |
1650 void SetParameterTypeAt(intptr_t index, const AbstractType& value) const; | 1660 void SetParameterTypeAt(intptr_t index, const AbstractType& value) const; |
1651 RawArray* parameter_types() const { return raw_ptr()->parameter_types_; } | 1661 RawArray* parameter_types() const { return raw_ptr()->parameter_types_; } |
1652 void set_parameter_types(const Array& value) const; | 1662 void set_parameter_types(const Array& value) const; |
1653 | 1663 |
1654 // Parameter names are valid for all valid parameter indices, and are not | 1664 // Parameter names are valid for all valid parameter indices, and are not |
1655 // limited to named optional parameters. | 1665 // limited to named optional parameters. |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1764 } | 1774 } |
1765 switch (kind()) { | 1775 switch (kind()) { |
1766 case RawFunction::kRegularFunction: | 1776 case RawFunction::kRegularFunction: |
1767 case RawFunction::kGetterFunction: | 1777 case RawFunction::kGetterFunction: |
1768 case RawFunction::kSetterFunction: | 1778 case RawFunction::kSetterFunction: |
1769 case RawFunction::kImplicitGetter: | 1779 case RawFunction::kImplicitGetter: |
1770 case RawFunction::kImplicitSetter: | 1780 case RawFunction::kImplicitSetter: |
1771 case RawFunction::kMethodExtractor: | 1781 case RawFunction::kMethodExtractor: |
1772 case RawFunction::kNoSuchMethodDispatcher: | 1782 case RawFunction::kNoSuchMethodDispatcher: |
1773 case RawFunction::kInvokeFieldDispatcher: | 1783 case RawFunction::kInvokeFieldDispatcher: |
1784 case RawFunction::kIrregexpFunction: | |
1774 return true; | 1785 return true; |
1775 case RawFunction::kClosureFunction: | 1786 case RawFunction::kClosureFunction: |
1776 case RawFunction::kConstructor: | 1787 case RawFunction::kConstructor: |
1777 case RawFunction::kImplicitStaticFinalGetter: | 1788 case RawFunction::kImplicitStaticFinalGetter: |
1778 return false; | 1789 return false; |
1779 default: | 1790 default: |
1780 UNREACHABLE(); | 1791 UNREACHABLE(); |
1781 return false; | 1792 return false; |
1782 } | 1793 } |
1783 } | 1794 } |
1784 bool IsStaticFunction() const { | 1795 bool IsStaticFunction() const { |
1785 if (!is_static()) { | 1796 if (!is_static()) { |
1786 return false; | 1797 return false; |
1787 } | 1798 } |
1788 switch (kind()) { | 1799 switch (kind()) { |
1789 case RawFunction::kRegularFunction: | 1800 case RawFunction::kRegularFunction: |
1790 case RawFunction::kGetterFunction: | 1801 case RawFunction::kGetterFunction: |
1791 case RawFunction::kSetterFunction: | 1802 case RawFunction::kSetterFunction: |
1792 case RawFunction::kImplicitGetter: | 1803 case RawFunction::kImplicitGetter: |
1793 case RawFunction::kImplicitSetter: | 1804 case RawFunction::kImplicitSetter: |
1794 case RawFunction::kImplicitStaticFinalGetter: | 1805 case RawFunction::kImplicitStaticFinalGetter: |
1806 case RawFunction::kIrregexpFunction: | |
1795 return true; | 1807 return true; |
1796 case RawFunction::kClosureFunction: | 1808 case RawFunction::kClosureFunction: |
1797 case RawFunction::kConstructor: | 1809 case RawFunction::kConstructor: |
1798 return false; | 1810 return false; |
1799 default: | 1811 default: |
1800 UNREACHABLE(); | 1812 UNREACHABLE(); |
1801 return false; | 1813 return false; |
1802 } | 1814 } |
1803 } | 1815 } |
1804 bool IsInFactoryScope() const; | 1816 bool IsInFactoryScope() const; |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2024 bool IsImplicitSetterFunction() const { | 2036 bool IsImplicitSetterFunction() const { |
2025 return kind() == RawFunction::kImplicitSetter; | 2037 return kind() == RawFunction::kImplicitSetter; |
2026 } | 2038 } |
2027 | 2039 |
2028 // Returns true if this function represents a (possibly implicit) closure | 2040 // Returns true if this function represents a (possibly implicit) closure |
2029 // function. | 2041 // function. |
2030 bool IsClosureFunction() const { | 2042 bool IsClosureFunction() const { |
2031 return kind() == RawFunction::kClosureFunction; | 2043 return kind() == RawFunction::kClosureFunction; |
2032 } | 2044 } |
2033 | 2045 |
2046 // Returns true if this function represents a generated irregexp function. | |
2047 bool IsIrregexpFunction() const { | |
2048 return kind() == RawFunction::kIrregexpFunction; | |
2049 } | |
2050 | |
2034 // Returns true if this function represents an implicit closure function. | 2051 // Returns true if this function represents an implicit closure function. |
2035 bool IsImplicitClosureFunction() const; | 2052 bool IsImplicitClosureFunction() const; |
2036 | 2053 |
2037 // Returns true if this function represents a non implicit closure function. | 2054 // Returns true if this function represents a non implicit closure function. |
2038 bool IsNonImplicitClosureFunction() const { | 2055 bool IsNonImplicitClosureFunction() const { |
2039 return IsClosureFunction() && !IsImplicitClosureFunction(); | 2056 return IsClosureFunction() && !IsImplicitClosureFunction(); |
2040 } | 2057 } |
2041 | 2058 |
2042 // Returns true if this function represents an implicit static closure | 2059 // Returns true if this function represents an implicit static closure |
2043 // function. | 2060 // function. |
(...skipping 1456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3500 V(UnaryOp) \ | 3517 V(UnaryOp) \ |
3501 V(UnboxInteger) \ | 3518 V(UnboxInteger) \ |
3502 V(CheckClass) \ | 3519 V(CheckClass) \ |
3503 V(HoistedCheckClass) \ | 3520 V(HoistedCheckClass) \ |
3504 V(CheckSmi) \ | 3521 V(CheckSmi) \ |
3505 V(CheckArrayBound) \ | 3522 V(CheckArrayBound) \ |
3506 V(AtCall) \ | 3523 V(AtCall) \ |
3507 V(DoubleToSmi) \ | 3524 V(DoubleToSmi) \ |
3508 V(Int32Load) \ | 3525 V(Int32Load) \ |
3509 V(Uint32Load) \ | 3526 V(Uint32Load) \ |
3527 V(CodeUnitsLoad) \ | |
Florian Schneider
2014/10/01 17:04:15
No need, since I don't see any deoptimizations in
jgruber1
2014/10/03 18:59:54
Done.
| |
3510 V(GuardField) \ | 3528 V(GuardField) \ |
3511 V(TestCids) \ | 3529 V(TestCids) \ |
3512 V(NumReasons) \ | 3530 V(NumReasons) \ |
3513 | 3531 |
3514 enum DeoptReasonId { | 3532 enum DeoptReasonId { |
3515 #define DEFINE_ENUM_LIST(name) kDeopt##name, | 3533 #define DEFINE_ENUM_LIST(name) kDeopt##name, |
3516 DEOPT_REASONS(DEFINE_ENUM_LIST) | 3534 DEOPT_REASONS(DEFINE_ENUM_LIST) |
3517 #undef DEFINE_ENUM_LIST | 3535 #undef DEFINE_ENUM_LIST |
3518 }; | 3536 }; |
3519 | 3537 |
(...skipping 3641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7161 | 7179 |
7162 bool is_initialized() const { return (type() != kUnitialized); } | 7180 bool is_initialized() const { return (type() != kUnitialized); } |
7163 bool is_simple() const { return (type() == kSimple); } | 7181 bool is_simple() const { return (type() == kSimple); } |
7164 bool is_complex() const { return (type() == kComplex); } | 7182 bool is_complex() const { return (type() == kComplex); } |
7165 | 7183 |
7166 bool is_global() const { return (flags() & kGlobal); } | 7184 bool is_global() const { return (flags() & kGlobal); } |
7167 bool is_ignore_case() const { return (flags() & kIgnoreCase); } | 7185 bool is_ignore_case() const { return (flags() & kIgnoreCase); } |
7168 bool is_multi_line() const { return (flags() & kMultiLine); } | 7186 bool is_multi_line() const { return (flags() & kMultiLine); } |
7169 | 7187 |
7170 RawString* pattern() const { return raw_ptr()->pattern_; } | 7188 RawString* pattern() const { return raw_ptr()->pattern_; } |
7189 | |
7190 static intptr_t subject_offset(intptr_t cid) { | |
7191 switch (cid) { | |
7192 case kOneByteStringCid: return OFFSET_OF(RawJSRegExp, one_byte_subject_); | |
7193 case kTwoByteStringCid: return OFFSET_OF(RawJSRegExp, two_byte_subject_); | |
7194 case kExternalOneByteStringCid: | |
7195 return OFFSET_OF(RawJSRegExp, external_one_byte_subject_); | |
7196 case kExternalTwoByteStringCid: | |
7197 return OFFSET_OF(RawJSRegExp, external_two_byte_subject_); | |
7198 } | |
7199 | |
7200 UNREACHABLE(); | |
7201 return -1; | |
7202 } | |
7203 RawString* sample_subject(intptr_t cid) const { | |
7204 switch (cid) { | |
7205 case kOneByteStringCid: return raw_ptr()->one_byte_subject_; | |
7206 case kTwoByteStringCid: return raw_ptr()->two_byte_subject_; | |
7207 case kExternalOneByteStringCid: | |
7208 return raw_ptr()->external_one_byte_subject_; | |
7209 case kExternalTwoByteStringCid: | |
7210 return raw_ptr()->external_two_byte_subject_; | |
7211 } | |
7212 | |
7213 UNREACHABLE(); | |
7214 return String::null(); | |
7215 } | |
7216 | |
7171 RawSmi* num_bracket_expressions() const { | 7217 RawSmi* num_bracket_expressions() const { |
7172 return raw_ptr()->num_bracket_expressions_; | 7218 return raw_ptr()->num_bracket_expressions_; |
7173 } | 7219 } |
7174 | 7220 |
7221 static intptr_t function_offset(intptr_t cid) { | |
7222 switch (cid) { | |
7223 case kOneByteStringCid: return OFFSET_OF(RawJSRegExp, one_byte_function_); | |
7224 case kTwoByteStringCid: return OFFSET_OF(RawJSRegExp, two_byte_function_); | |
7225 case kExternalOneByteStringCid: | |
7226 return OFFSET_OF(RawJSRegExp, external_one_byte_function_); | |
7227 case kExternalTwoByteStringCid: | |
7228 return OFFSET_OF(RawJSRegExp, external_two_byte_function_); | |
7229 } | |
7230 | |
7231 UNREACHABLE(); | |
7232 return -1; | |
7233 } | |
7234 | |
7235 RawFunction* function(intptr_t cid) const { | |
7236 switch (cid) { | |
7237 case kOneByteStringCid: return raw_ptr()->one_byte_function_; | |
7238 case kTwoByteStringCid: return raw_ptr()->two_byte_function_; | |
7239 case kExternalOneByteStringCid: | |
7240 return raw_ptr()->external_one_byte_function_; | |
7241 case kExternalTwoByteStringCid: | |
7242 return raw_ptr()->external_two_byte_function_; | |
7243 } | |
7244 | |
7245 UNREACHABLE(); | |
7246 return Function::null(); | |
7247 } | |
7248 | |
7175 void set_pattern(const String& pattern) const; | 7249 void set_pattern(const String& pattern) const; |
7250 void set_function(intptr_t cid, const Function& value); | |
7251 void set_sample_subject(intptr_t cid, const String& value) const; | |
7252 | |
7176 void set_num_bracket_expressions(intptr_t value) const; | 7253 void set_num_bracket_expressions(intptr_t value) const; |
7177 void set_is_global() const { set_flags(flags() | kGlobal); } | 7254 void set_is_global() const { set_flags(flags() | kGlobal); } |
7178 void set_is_ignore_case() const { set_flags(flags() | kIgnoreCase); } | 7255 void set_is_ignore_case() const { set_flags(flags() | kIgnoreCase); } |
7179 void set_is_multi_line() const { set_flags(flags() | kMultiLine); } | 7256 void set_is_multi_line() const { set_flags(flags() | kMultiLine); } |
7180 void set_is_simple() const { set_type(kSimple); } | 7257 void set_is_simple() const { set_type(kSimple); } |
7181 void set_is_complex() const { set_type(kComplex); } | 7258 void set_is_complex() const { set_type(kComplex); } |
7182 | 7259 |
7183 void* GetDataStartAddress() const; | 7260 void* GetDataStartAddress() const; |
7184 static RawJSRegExp* FromDataStartAddress(void* data); | 7261 static RawJSRegExp* FromDataStartAddress(void* data); |
7185 const char* Flags() const; | 7262 const char* Flags() const; |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7478 | 7555 |
7479 | 7556 |
7480 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 7557 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
7481 intptr_t index) { | 7558 intptr_t index) { |
7482 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 7559 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
7483 } | 7560 } |
7484 | 7561 |
7485 } // namespace dart | 7562 } // namespace dart |
7486 | 7563 |
7487 #endif // VM_OBJECT_H_ | 7564 #endif // VM_OBJECT_H_ |
OLD | NEW |