Index: runtime/vm/isolate.h |
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h |
index a3e665eb7adf785c9d9ee708f1b2c25b8eba997e..316c26a488a9ca4e285ef916ed10bbac92b8a276 100644 |
--- a/runtime/vm/isolate.h |
+++ b/runtime/vm/isolate.h |
@@ -132,13 +132,15 @@ typedef FixedCache<intptr_t, CatchEntryState, 16> CatchEntryStateCache; |
// V(name, Dart_IsolateFlags-member-name, command-line-flag-name) |
// |
#define ISOLATE_FLAG_LIST(V) \ |
- V(type_checks, enable_type_checks, FLAG_enable_type_checks) \ |
- V(asserts, enable_asserts, FLAG_enable_asserts) \ |
- V(error_on_bad_type, enable_error_on_bad_type, FLAG_error_on_bad_type) \ |
- V(error_on_bad_override, enable_error_on_bad_override, \ |
+ V(type_checks, EnableTypeChecks, enable_type_checks, \ |
+ FLAG_enable_type_checks) \ |
+ V(asserts, EnableAsserts, enable_asserts, FLAG_enable_asserts) \ |
+ V(error_on_bad_type, ErrorOnBadType, enable_error_on_bad_type, \ |
+ FLAG_error_on_bad_type) \ |
+ V(error_on_bad_override, ErrorOnBadOverride, enable_error_on_bad_override, \ |
FLAG_error_on_bad_override) \ |
- V(use_field_guards, use_field_guards, FLAG_use_field_guards) \ |
- V(use_osr, use_osr, FLAG_use_osr) |
+ V(use_field_guards, UseFieldGuards, use_field_guards, FLAG_use_field_guards) \ |
+ V(use_osr, UseOsr, use_osr, FLAG_use_osr) |
class Isolate : public BaseIsolate { |
public: |
@@ -293,11 +295,11 @@ class Isolate : public BaseIsolate { |
MessageHandler* message_handler() const { return message_handler_; } |
void set_message_handler(MessageHandler* value) { message_handler_ = value; } |
- bool is_runnable() const { return is_runnable_; } |
+ bool is_runnable() const { return RunnableBit::decode(isolate_flags_); } |
void set_is_runnable(bool value) { |
- is_runnable_ = value; |
+ isolate_flags_ = RunnableBit::update(value, isolate_flags_); |
#if !defined(PRODUCT) |
- if (is_runnable_) { |
+ if (is_runnable()) { |
set_last_resume_timestamp(); |
} |
#endif |
@@ -330,9 +332,12 @@ class Isolate : public BaseIsolate { |
} |
#if !defined(PRODUCT) |
+ bool ResumeRequest() const { |
+ return ResumeRequestBit::decode(isolate_flags_); |
+ } |
// Lets the embedder know that a service message resulted in a resume request. |
void SetResumeRequest() { |
- resume_request_ = true; |
+ isolate_flags_ = ResumeRequestBit::update(true, isolate_flags_); |
set_last_resume_timestamp(); |
} |
@@ -345,8 +350,8 @@ class Isolate : public BaseIsolate { |
// Returns whether the vm service has requested that the debugger |
// resume execution. |
bool GetAndClearResumeRequest() { |
- bool resume_request = resume_request_; |
- resume_request_ = false; |
+ bool resume_request = ResumeRequestBit::decode(isolate_flags_); |
+ isolate_flags_ = ResumeRequestBit::update(false, isolate_flags_); |
return resume_request; |
} |
#endif |
@@ -369,8 +374,10 @@ class Isolate : public BaseIsolate { |
void RemoveErrorListener(const SendPort& listener); |
bool NotifyErrorListeners(const String& msg, const String& stacktrace); |
- bool ErrorsFatal() const { return errors_fatal_; } |
- void SetErrorsFatal(bool val) { errors_fatal_ = val; } |
+ bool ErrorsFatal() const { return ErrorsFatalBit::decode(isolate_flags_); } |
+ void SetErrorsFatal(bool val) { |
+ isolate_flags_ = ErrorsFatalBit::update(val, isolate_flags_); |
+ } |
Random* random() { return &random_; } |
@@ -514,7 +521,12 @@ class Isolate : public BaseIsolate { |
void DeleteReloadContext(); |
- bool HasAttemptedReload() const { return has_attempted_reload_; } |
+ bool HasAttemptedReload() const { |
+ return HasAttemptedReloadBit::decode(isolate_flags_); |
+ } |
+ void SetHasAttemptedReload(bool value) { |
+ isolate_flags_ = HasAttemptedReloadBit::update(value, isolate_flags_); |
+ } |
bool CanReload() const; |
@@ -528,14 +540,21 @@ class Isolate : public BaseIsolate { |
#if !defined(PRODUCT) |
bool should_pause_post_service_request() const { |
- return should_pause_post_service_request_; |
+ return ShouldPausePostServiceRequestBit::decode(isolate_flags_); |
} |
- void set_should_pause_post_service_request( |
- bool should_pause_post_service_request) { |
- should_pause_post_service_request_ = should_pause_post_service_request; |
+ void set_should_pause_post_service_request(bool value) { |
+ isolate_flags_ = |
+ ShouldPausePostServiceRequestBit::update(value, isolate_flags_); |
} |
#endif // !defined(PRODUCT) |
+ bool use_dart_frontend() const { |
+ return UseDartFrontEndBit::decode(isolate_flags_); |
+ } |
+ void set_use_dart_frontend(bool value) { |
+ isolate_flags_ = UseDartFrontEndBit::update(value, isolate_flags_); |
+ } |
+ |
RawError* PausePostRequest(); |
uword user_tag() const { return user_tag_; } |
@@ -584,14 +603,27 @@ class Isolate : public BaseIsolate { |
RawError* sticky_error() const { return sticky_error_; } |
void clear_sticky_error(); |
- bool compilation_allowed() const { return compilation_allowed_; } |
- void set_compilation_allowed(bool allowed) { compilation_allowed_ = allowed; } |
+ bool compilation_allowed() const { |
+ return CompilationAllowedBit::decode(isolate_flags_); |
+ } |
+ void set_compilation_allowed(bool allowed) { |
+ isolate_flags_ = CompilationAllowedBit::update(allowed, isolate_flags_); |
+ } |
// In precompilation we finalize all regular classes before compiling. |
- bool all_classes_finalized() const { return all_classes_finalized_; } |
- void set_all_classes_finalized(bool value) { all_classes_finalized_ = value; } |
+ bool all_classes_finalized() const { |
+ return AllClassesFinalizedBit::decode(isolate_flags_); |
+ } |
+ void set_all_classes_finalized(bool value) { |
+ isolate_flags_ = AllClassesFinalizedBit::update(value, isolate_flags_); |
+ } |
- void set_remapping_cids(bool value) { remapping_cids_ = value; } |
+ bool remapping_cids() const { |
+ return RemappingCidsBit::decode(isolate_flags_); |
+ } |
+ void set_remapping_cids(bool value) { |
+ isolate_flags_ = RemappingCidsBit::update(value, isolate_flags_); |
+ } |
// True during top level parsing. |
bool IsTopLevelParsing() { |
@@ -652,7 +684,12 @@ class Isolate : public BaseIsolate { |
intptr_t FindClosureIndex(const Function& needle) const; |
RawFunction* ClosureFunctionFromIndex(intptr_t idx) const; |
- bool is_service_isolate() const { return is_service_isolate_; } |
+ bool is_service_isolate() const { |
+ return ServiceIsolateBit::decode(isolate_flags_); |
+ } |
+ void set_is_service_isolate(bool value) { |
+ isolate_flags_ = ServiceIsolateBit::update(value, isolate_flags_); |
+ } |
// Isolate-specific flag handling. |
static void FlagsInitialize(Dart_IsolateFlags* api_flags); |
@@ -660,17 +697,19 @@ class Isolate : public BaseIsolate { |
void FlagsCopyFrom(const Dart_IsolateFlags& api_flags); |
#if defined(PRODUCT) |
-#define DECLARE_GETTER(name, isolate_flag_name, flag_name) \ |
+#define DECLARE_GETTER(name, bitname, isolate_flag_name, flag_name) \ |
bool name() const { return flag_name; } |
ISOLATE_FLAG_LIST(DECLARE_GETTER) |
#undef DECLARE_GETTER |
void set_use_osr(bool use_osr) { ASSERT(!use_osr); } |
#else // defined(PRODUCT) |
-#define DECLARE_GETTER(name, isolate_flag_name, flag_name) \ |
- bool name() const { return name##_; } |
+#define DECLARE_GETTER(name, bitname, isolate_flag_name, flag_name) \ |
+ bool name() const { return bitname##Bit::decode(isolate_flags_); } |
ISOLATE_FLAG_LIST(DECLARE_GETTER) |
#undef DECLARE_GETTER |
- void set_use_osr(bool use_osr) { use_osr_ = use_osr; } |
+ void set_use_osr(bool use_osr) { |
+ isolate_flags_ = UseOsrBit::update(use_osr, isolate_flags_); |
+ } |
#endif // defined(PRODUCT) |
static void KillAllIsolates(LibMsgId msg_id); |
@@ -766,31 +805,68 @@ class Isolate : public BaseIsolate { |
ClassTable class_table_; |
bool single_step_; |
- // Try to keep boolean fields together. |
- bool errors_fatal_; |
- bool is_runnable_; |
- bool is_service_isolate_; |
- bool compilation_allowed_; |
- bool all_classes_finalized_; |
- bool remapping_cids_; |
+ // Isolate specific flags. |
+ enum FlagBits { |
+ kErrorsFatalBit = 0, |
+ kIsRunnableBit = 1, |
+ kIsServiceIsolateBit = 2, |
+ kCompilationAllowedBit = 3, |
+ kAllClassesFinalizedBit = 4, |
+ kRemappingCidsBit = 5, |
+ kResumeRequestBit = 6, |
+ kHasAttemptedReloadBit = 7, |
+ kShouldPausePostServiceRequestBit = 8, |
+ kUseDartFrontEndBit = 9, |
+ kEnableTypeChecksBit = 10, |
+ kEnableAssertsBit = 11, |
+ kErrorOnBadTypeBit = 12, |
+ kErrorOnBadOverrideBit = 13, |
+ kUseFieldGuardsBit = 14, |
+ kUseOsrBit = 15, |
+ }; |
+ class ErrorsFatalBit : public BitField<uint32_t, bool, kErrorsFatalBit, 1> {}; |
+ class RunnableBit : public BitField<uint32_t, bool, kIsRunnableBit, 1> {}; |
+ class ServiceIsolateBit |
+ : public BitField<uint32_t, bool, kIsServiceIsolateBit, 1> {}; |
+ class CompilationAllowedBit |
+ : public BitField<uint32_t, bool, kCompilationAllowedBit, 1> {}; |
+ class AllClassesFinalizedBit |
+ : public BitField<uint32_t, bool, kAllClassesFinalizedBit, 1> {}; |
+ class RemappingCidsBit |
+ : public BitField<uint32_t, bool, kRemappingCidsBit, 1> {}; |
+ class ResumeRequestBit |
+ : public BitField<uint32_t, bool, kResumeRequestBit, 1> {}; |
+ class HasAttemptedReloadBit |
+ : public BitField<uint32_t, bool, kHasAttemptedReloadBit, 1> {}; |
+ class ShouldPausePostServiceRequestBit |
+ : public BitField<uint32_t, bool, kShouldPausePostServiceRequestBit, 1> { |
+ }; |
+ class UseDartFrontEndBit |
+ : public BitField<uint32_t, bool, kUseDartFrontEndBit, 1> {}; |
+ class EnableTypeChecksBit |
+ : public BitField<uint32_t, bool, kEnableTypeChecksBit, 1> {}; |
+ class EnableAssertsBit |
+ : public BitField<uint32_t, bool, kEnableAssertsBit, 1> {}; |
+ class ErrorOnBadTypeBit |
+ : public BitField<uint32_t, bool, kErrorOnBadTypeBit, 1> {}; |
+ class ErrorOnBadOverrideBit |
+ : public BitField<uint32_t, bool, kErrorOnBadOverrideBit, 1> {}; |
+ class UseFieldGuardsBit |
+ : public BitField<uint32_t, bool, kUseFieldGuardsBit, 1> {}; |
+ class UseOsrBit : public BitField<uint32_t, bool, kUseOsrBit, 1> {}; |
+ uint32_t isolate_flags_; |
+ |
+ // Background compilation. |
+ int16_t background_compiler_disabled_depth_; |
+ BackgroundCompiler* background_compiler_; |
// Fields that aren't needed in a product build go here with boolean flags at |
// the top. |
#if !defined(PRODUCT) |
- bool resume_request_; |
- bool has_attempted_reload_; // Has a reload ever been attempted? |
- // Should we pause in the debug message loop after this request? |
- bool should_pause_post_service_request_; |
- |
char* debugger_name_; |
Debugger* debugger_; |
int64_t last_resume_timestamp_; |
-// Isolate-specific flags. |
-#define DECLARE_FIELD(name, isolate_flag_name, flag_name) bool name##_; |
- ISOLATE_FLAG_LIST(DECLARE_FIELD) |
-#undef DECLARE_FIELD |
- |
// Timestamps of last operation via service. |
int64_t last_allocationprofile_accumulator_reset_timestamp_; |
int64_t last_allocationprofile_gc_timestamp_; |
@@ -871,10 +947,6 @@ class Isolate : public BaseIsolate { |
RawError* sticky_error_; |
- // Background compilation. |
- BackgroundCompiler* background_compiler_; |
- intptr_t background_compiler_disabled_depth_; |
- |
// Isolate list next pointer. |
Isolate* next_; |