Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(828)

Unified Diff: runtime/vm/object.h

Issue 619903002: Generalize bounds checks. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/object.h
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index de2d3aeb02cbc6a2a2f2128d92eb3a42afc90431..b36df2610cc2295dc7fb17d6464a1525f8ee546e 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1770,9 +1770,6 @@ class Function : public Object {
static const char* KindToCString(RawFunction::Kind kind);
- bool is_static() const { return StaticBit::decode(raw_ptr()->kind_tag_); }
- bool is_const() const { return ConstBit::decode(raw_ptr()->kind_tag_); }
- bool is_external() const { return ExternalBit::decode(raw_ptr()->kind_tag_); }
bool IsConstructor() const {
return (kind() == RawFunction::kConstructor) && !is_static();
}
@@ -1914,29 +1911,7 @@ class Function : public Object {
void SetIsOptimizable(bool value) const;
void SetIsNativeAutoSetupScope(bool value) const;
- bool is_async_closure() const {
- return AsyncClosureBit::decode(raw_ptr()->kind_tag_);
- }
- void set_is_async_closure(bool value) const;
-
- bool is_native() const { return NativeBit::decode(raw_ptr()->kind_tag_); }
- void set_is_native(bool value) const;
-
- bool is_abstract() const { return AbstractBit::decode(raw_ptr()->kind_tag_); }
- void set_is_abstract(bool value) const;
-
- bool IsInlineable() const;
- void set_is_inlinable(bool value) const;
-
- bool is_visible() const {
- return VisibleBit::decode(raw_ptr()->kind_tag_);
- }
- void set_is_visible(bool value) const;
-
- bool is_intrinsic() const {
- return IntrinsicBit::decode(raw_ptr()->kind_tag_);
- }
- void set_is_intrinsic(bool value) const;
+ bool CanBeInlined() const;
MethodRecognizer::Kind recognized_kind() const {
return RecognizedBits::decode(raw_ptr()->kind_tag_);
@@ -1947,31 +1922,6 @@ class Function : public Object {
return recognized_kind() != MethodRecognizer::kUnknown;
}
- bool is_redirecting() const {
- return RedirectingBit::decode(raw_ptr()->kind_tag_);
- }
- void set_is_redirecting(bool value) const;
-
- bool allows_hoisting_check_class() const {
- return AllowsHoistingCheckClassBit::decode(raw_ptr()->kind_tag_);
- }
- void set_allows_hoisting_check_class(bool value) const;
-
- bool always_inline() const {
- return AlwaysInlineBit::decode(raw_ptr()->kind_tag_);
- }
- void set_always_inline(bool value) const {
- set_kind_tag(AlwaysInlineBit::update(value, raw_ptr()->kind_tag_));
- }
-
- bool is_polymorphic_target() const {
- return PolymorphicTargetBit::decode(raw_ptr()->kind_tag_);
- }
- void set_is_polymorphic_target(bool value) const {
- set_kind_tag(PolymorphicTargetBit::update(value, raw_ptr()->kind_tag_));
- }
-
-
bool HasOptimizedCode() const;
// Returns true if the argument counts are valid for calling this function.
@@ -2141,6 +2091,33 @@ class Function : public Object {
void set_modifier(RawFunction::AsyncModifier value) const;
+#define FOR_EACH_FUNCTION_KIND_BIT(V) \
+ V(Static, is_static) \
+ V(Const, is_const) \
+ V(Abstract, is_abstract) \
+ V(Visible, is_visible) \
+ V(Optimizable, is_optimizable) \
+ V(Inlinable, is_inlinable) \
+ V(Intrinsic, is_intrinsic) \
+ V(Native, is_native) \
+ V(Redirecting, is_redirecting) \
+ V(External, is_external) \
+ V(AllowsHoistingCheckClass, allows_hoisting_check_class) \
+ V(AllowsBoundsCheckGeneralization, allows_bounds_check_generalization) \
+ V(AsyncClosure, is_async_closure) \
+ V(AlwaysInline, always_inline) \
+ V(PolymorphicTarget, is_polymorphic_target) \
+
+#define DEFINE_ACCESSORS(name, accessor_name) \
+ void set_##accessor_name(bool value) const { \
+ set_kind_tag(name##Bit::update(value, raw_ptr()->kind_tag_)); \
+ } \
+ bool accessor_name() const { \
+ return name##Bit::decode(raw_ptr()->kind_tag_); \
+ }
+FOR_EACH_FUNCTION_KIND_BIT(DEFINE_ACCESSORS)
+#undef DEFINE_ACCESSORS
+
private:
void set_ic_data_array(const Array& value) const;
@@ -2149,22 +2126,11 @@ class Function : public Object {
kKindTagSize = 4,
kRecognizedTagPos = kKindTagPos + kKindTagSize,
kRecognizedTagSize = 8,
+ kModifierPos = kRecognizedTagPos + kRecognizedTagSize,
// Single bit sized fields start here.
- kStaticBit = kRecognizedTagPos + kRecognizedTagSize,
- kConstBit,
- kAbstractBit,
- kVisibleBit,
- kOptimizableBit,
- kInlinableBit,
- kIntrinsicBit,
- kNativeBit,
- kRedirectingBit,
- kExternalBit,
- kAllowsHoistingCheckClassBit,
- kModifierPos,
- kAsyncClosureBit,
- kAlwaysInlineBit,
- kPolymorphicTargetBit,
+#define DECLARE_BIT(name, _) k##name##Bit,
+FOR_EACH_FUNCTION_KIND_BIT(DECLARE_BIT)
+#undef DECLARE_BIT
kNumTagBits
};
@@ -2179,30 +2145,16 @@ class Function : public Object {
class RecognizedBits : public BitField<MethodRecognizer::Kind,
kRecognizedTagPos,
kRecognizedTagSize> {};
- class StaticBit : public BitField<bool, kStaticBit, 1> {};
- class ConstBit : public BitField<bool, kConstBit, 1> {};
- class AbstractBit : public BitField<bool, kAbstractBit, 1> {};
- class VisibleBit : public BitField<bool, kVisibleBit, 1> {};
- class OptimizableBit : public BitField<bool, kOptimizableBit, 1> {};
- class InlinableBit : public BitField<bool, kInlinableBit, 1> {};
- class IntrinsicBit : public BitField<bool, kIntrinsicBit, 1> {};
- class NativeBit : public BitField<bool, kNativeBit, 1> {};
- class ExternalBit : public BitField<bool, kExternalBit, 1> {};
- class RedirectingBit : public BitField<bool, kRedirectingBit, 1> {};
- class AllowsHoistingCheckClassBit :
- public BitField<bool, kAllowsHoistingCheckClassBit, 1> {}; // NOLINT
class ModifierBits :
public BitField<RawFunction::AsyncModifier, kModifierPos, 1> {}; // NOLINT
- class AsyncClosureBit : public BitField<bool, kAsyncClosureBit, 1> {};
- class AlwaysInlineBit : public BitField<bool, kAlwaysInlineBit, 1> {};
- class PolymorphicTargetBit :
- public BitField<bool, kPolymorphicTargetBit, 1> {}; // NOLINT
+
+#define DEFINE_BIT(name, _) \
+ class name##Bit : public BitField<bool, k##name##Bit, 1> {};
+FOR_EACH_FUNCTION_KIND_BIT(DEFINE_BIT)
+#undef DEFINE_BIT
void set_name(const String& value) const;
void set_kind(RawFunction::Kind value) const;
- void set_is_static(bool value) const;
- void set_is_const(bool value) const;
- void set_is_external(bool value) const;
void set_parent_function(const Function& value) const;
void set_owner(const Object& value) const;
RawFunction* implicit_closure_function() const;
@@ -2214,10 +2166,6 @@ class Function : public Object {
void set_num_optional_parameters(intptr_t value) const; // Encoded value.
void set_kind_tag(intptr_t value) const;
void set_data(const Object& value) const;
- bool is_optimizable() const {
- return OptimizableBit::decode(raw_ptr()->kind_tag_);
- }
- void set_is_optimizable(bool value) const;
static RawFunction* New();
@@ -3529,7 +3477,6 @@ class ICData : public Object {
V(UnaryOp) \
V(UnboxInteger) \
V(CheckClass) \
- V(HoistedCheckClass) \
V(CheckSmi) \
V(CheckArrayBound) \
V(AtCall) \
@@ -3546,6 +3493,14 @@ class ICData : public Object {
#undef DEFINE_ENUM_LIST
};
+ enum DeoptFlags {
+ // Deoptimization is caused by an optimistically hoisted instruction.
+ kHoisted = 1 << 0,
+
+ // Deoptimization is caused by an optimistically generalized bounds check.
+ kGeneralized = 1 << 1
+ };
+
bool HasDeoptReasons() const { return DeoptReasons() != 0; }
uint32_t DeoptReasons() const;
void SetDeoptReasons(uint32_t reasons) const;
@@ -3789,8 +3744,9 @@ class Code : public Object {
return raw_ptr()->static_calls_target_table_;
}
- RawDeoptInfo* GetDeoptInfoAtPc(
- uword pc, ICData::DeoptReasonId* deopt_reason) const;
+ RawDeoptInfo* GetDeoptInfoAtPc(uword pc,
+ ICData::DeoptReasonId* deopt_reason,
+ uint32_t* deopt_flags) const;
// Returns null if there is no static call at 'pc'.
RawFunction* GetStaticCallTargetFunctionAt(uword pc) const;

Powered by Google App Engine
This is Rietveld 408576698