| Index: runtime/vm/object.h
|
| diff --git a/runtime/vm/object.h b/runtime/vm/object.h
|
| index 59c756a9233c0a8e68edafeef52e47f7b8b6cfb8..d7116ee18f8abc3941c7acac61e6968d72ae8af9 100644
|
| --- a/runtime/vm/object.h
|
| +++ b/runtime/vm/object.h
|
| @@ -2362,101 +2362,39 @@ class Function : public Object {
|
|
|
| intptr_t NumImplicitParameters() const;
|
|
|
| - static intptr_t usage_counter_offset() {
|
| #if defined(DART_PRECOMPILED_RUNTIME)
|
| - UNREACHABLE();
|
| - return 0;
|
| -#else
|
| - return OFFSET_OF(RawFunction, usage_counter_);
|
| -#endif
|
| - }
|
| - intptr_t usage_counter() const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - return 0;
|
| +#define DEFINE_GETTERS_AND_SETTERS(return_type, type, name) \
|
| + static intptr_t name##_offset() { \
|
| + UNREACHABLE(); \
|
| + return 0; \
|
| + } \
|
| + return_type name() const { return 0; } \
|
| + \
|
| + void set_##name(type value) const { UNREACHABLE(); }
|
| #else
|
| - return raw_ptr()->usage_counter_;
|
| -#endif
|
| +#define DEFINE_GETTERS_AND_SETTERS(return_type, type, name) \
|
| + static intptr_t name##_offset() { return OFFSET_OF(RawFunction, name##_); } \
|
| + return_type name() const { return raw_ptr()->name##_; } \
|
| + \
|
| + void set_##name(type value) const { \
|
| + StoreNonPointer(&raw_ptr()->name##_, value); \
|
| }
|
| - void set_usage_counter(intptr_t value) const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - UNREACHABLE();
|
| -#else
|
| - // TODO(Srdjan): Assert that this is thread-safe, i.e., only
|
| - // set from mutator-thread or while at a safepoint (e.g., during marking).
|
| - StoreNonPointer(&raw_ptr()->usage_counter_, value);
|
| #endif
|
| - }
|
|
|
| - int8_t deoptimization_counter() const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - return 0;
|
| -#else
|
| - return raw_ptr()->deoptimization_counter_;
|
| -#endif
|
| - }
|
| - void set_deoptimization_counter(int8_t value) const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - UNREACHABLE();
|
| -#else
|
| - ASSERT(value >= 0);
|
| - StoreNonPointer(&raw_ptr()->deoptimization_counter_, value);
|
| -#endif
|
| - }
|
| + JIT_FUNCTION_COUNTERS(DEFINE_GETTERS_AND_SETTERS)
|
|
|
| - static const intptr_t kMaxInstructionCount = (1 << 16) - 1;
|
| - intptr_t optimized_instruction_count() const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - UNREACHABLE();
|
| - return 0;
|
| -#else
|
| - return raw_ptr()->optimized_instruction_count_;
|
| -#endif
|
| - }
|
| - void set_optimized_instruction_count(intptr_t value) const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - UNREACHABLE();
|
| -#else
|
| - ASSERT(value >= 0);
|
| - if (value > kMaxInstructionCount) {
|
| - value = kMaxInstructionCount;
|
| - }
|
| - StoreNonPointer(&raw_ptr()->optimized_instruction_count_,
|
| - static_cast<uint16_t>(value));
|
| -#endif
|
| - }
|
| +#undef DEFINE_GETTERS_AND_SETTERS
|
|
|
| - intptr_t optimized_call_site_count() const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - return 0;
|
| -#else
|
| - return raw_ptr()->optimized_call_site_count_;
|
| -#endif
|
| - }
|
| - void set_optimized_call_site_count(intptr_t value) const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - UNREACHABLE();
|
| -#else
|
| - ASSERT(value >= 0);
|
| - if (value > kMaxInstructionCount) {
|
| - value = kMaxInstructionCount;
|
| - }
|
| - StoreNonPointer(&raw_ptr()->optimized_call_site_count_,
|
| - static_cast<uint16_t>(value));
|
| -#endif
|
| - }
|
| + static const intptr_t kMaxInstructionCount = (1 << 16) - 1;
|
|
|
| - intptr_t kernel_offset() const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - return 0;
|
| -#else
|
| - return raw_ptr()->kernel_offset_;
|
| -#endif
|
| + void SetOptimizedInstructionCountClamped(uintptr_t value) const {
|
| + if (value > kMaxInstructionCount) value = kMaxInstructionCount;
|
| + set_optimized_instruction_count(value);
|
| }
|
|
|
| - void set_kernel_offset(intptr_t kernel_offset) const {
|
| -#if !defined(DART_PRECOMPILED_RUNTIME)
|
| - StoreNonPointer(&raw_ptr()->kernel_offset_, kernel_offset);
|
| -#endif
|
| + void SetOptimizedCallSiteCountClamped(uintptr_t value) const {
|
| + if (value > kMaxInstructionCount) value = kMaxInstructionCount;
|
| + set_optimized_call_site_count(value);
|
| }
|
|
|
| RawTypedData* kernel_data() const { return raw_ptr()->kernel_data_; }
|
| @@ -2743,48 +2681,38 @@ class Function : public Object {
|
|
|
| void set_modifier(RawFunction::AsyncModifier value) const;
|
|
|
| - // 'was_compiled' is true if the function was compiled once in this
|
| + // 'WasCompiled' is true if the function was compiled once in this
|
| // VM instantiation. It is independent from presence of type feedback
|
| // (ic_data_array) and code, which may be loaded from a snapshot.
|
| - void set_was_compiled(bool value) const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - UNREACHABLE();
|
| -#else
|
| - StoreNonPointer(&raw_ptr()->was_compiled_, value ? 1 : 0);
|
| -#endif
|
| - }
|
| - bool was_compiled() const {
|
| -#if defined(DART_PRECOMPILED_RUNTIME)
|
| - UNREACHABLE();
|
| - return true;
|
| -#else
|
| - return raw_ptr()->was_compiled_ == 1;
|
| -#endif
|
| - }
|
| -
|
| -// static: Considered during class-side or top-level resolution rather than
|
| -// instance-side resolution.
|
| -// const: Valid target of a const constructor call.
|
| -// abstract: Skipped during instance-side resolution.
|
| -// reflectable: Enumerated by mirrors, invocable by mirrors. False for private
|
| -// functions of dart: libraries.
|
| -// debuggable: Valid location of a breakpoint. Synthetic code is not
|
| -// debuggable.
|
| -// visible: Frame is included in stack traces. Synthetic code such as
|
| -// dispatchers is not visible. Synthetic code that can trigger
|
| -// exceptions such as the outer async functions that create Futures
|
| -// is visible.
|
| -// optimizable: Candidate for going through the optimizing compiler. False for
|
| -// some functions known to be execute infrequently and functions
|
| -// which have been de-optimized too many times.
|
| -// instrinsic: Has a hand-written assembly prologue.
|
| -// inlinable: Candidate for inlining. False for functions with features we
|
| -// don't support during inlining (e.g., optional parameters),
|
| -// functions which are too big, etc.
|
| -// native: Bridge to C/C++ code.
|
| -// redirecting: Redirecting generative or factory constructor.
|
| -// external: Just a declaration that expects to be defined in another patch
|
| -// file.
|
| + void SetWasCompiled(bool value) const {
|
| + set_was_compiled_numeric(value ? 1 : 0);
|
| + }
|
| +
|
| + bool WasCompiled() const { return was_compiled_numeric() != 0; }
|
| +
|
| + // static: Considered during class-side or top-level resolution rather than
|
| + // instance-side resolution.
|
| + // const: Valid target of a const constructor call.
|
| + // abstract: Skipped during instance-side resolution.
|
| + // reflectable: Enumerated by mirrors, invocable by mirrors. False for private
|
| + // functions of dart: libraries.
|
| + // debuggable: Valid location of a breakpoint. Synthetic code is not
|
| + // debuggable.
|
| + // visible: Frame is included in stack traces. Synthetic code such as
|
| + // dispatchers is not visible. Synthetic code that can trigger
|
| + // exceptions such as the outer async functions that create Futures
|
| + // is visible.
|
| + // optimizable: Candidate for going through the optimizing compiler. False for
|
| + // some functions known to be execute infrequently and functions
|
| + // which have been de-optimized too many times.
|
| + // instrinsic: Has a hand-written assembly prologue.
|
| + // inlinable: Candidate for inlining. False for functions with features we
|
| + // don't support during inlining (e.g., optional parameters),
|
| + // functions which are too big, etc.
|
| + // native: Bridge to C/C++ code.
|
| + // redirecting: Redirecting generative or factory constructor.
|
| + // external: Just a declaration that expects to be defined in another patch
|
| + // file.
|
|
|
| #define FOR_EACH_FUNCTION_KIND_BIT(V) \
|
| V(Static, is_static) \
|
|
|