| 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_;
|
|
|
|
|