Chromium Code Reviews| Index: runtime/vm/isolate.cc |
| diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc |
| index 40159cf9d80a7ddcdc6b3e1e0f3850e803d53236..2432df990bfa34e8945bc702086c827c4bef13c6 100644 |
| --- a/runtime/vm/isolate.cc |
| +++ b/runtime/vm/isolate.cc |
| @@ -54,6 +54,32 @@ DEFINE_FLAG(charp, isolate_log_filter, NULL, |
| "Log isolates whose name include the filter. " |
| "Default: service isolate log messages are suppressed."); |
| +// TODO(iposva): Make these isolate specific flags inaccessible using the |
| +// regular FLAG_xyz pattern. |
| +// These flags are per-isolate and only influence the defaults. |
| +DEFINE_FLAG(bool, enable_asserts, false, "Enable assert statements."); |
| +DEFINE_FLAG(bool, enable_type_checks, false, "Enable type checks."); |
| +DEFINE_FLAG(bool, error_on_bad_override, false, |
| + "Report error for bad overrides."); |
| +DEFINE_FLAG(bool, error_on_bad_type, false, |
| + "Report error for malformed types."); |
| + |
| +static void CheckedModeHandler(bool value) { |
| + FLAG_enable_asserts = value; |
| + FLAG_enable_type_checks = value; |
| +} |
| + |
| +// --enable-checked-mode and --checked both enable checked mode which is |
| +// equivalent to setting --enable-asserts and --enable-type-checks. |
| +DEFINE_FLAG_HANDLER(CheckedModeHandler, |
| + enable_checked_mode, |
| + "Enable checked mode."); |
| + |
| +DEFINE_FLAG_HANDLER(CheckedModeHandler, |
| + checked, |
| + "Enable checked mode."); |
| + |
| + |
| // Quick access to the locally defined isolate() method. |
| #define I (isolate()) |
| @@ -536,6 +562,35 @@ bool IsolateMessageHandler::ProcessUnhandledException(const Error& result) { |
| } |
| +Isolate::Flags::Flags() |
| + : type_checks_(FLAG_enable_type_checks), |
| + asserts_(FLAG_enable_asserts), |
| + error_on_bad_type_(FLAG_error_on_bad_type), |
| + error_on_bad_override_(FLAG_error_on_bad_override) {} |
| + |
| + |
| +void Isolate::Flags::CopyFrom(const Flags& orig) { |
| + type_checks_ = orig.type_checks(); |
| + asserts_ = orig.asserts(); |
| + error_on_bad_type_ = orig.error_on_bad_type(); |
| + error_on_bad_override_ = orig.error_on_bad_override(); |
| +} |
| + |
| + |
| +void Isolate::Flags::CopyFrom(const Dart_IsolateFlags& api_flags) { |
| + type_checks_ = api_flags.enable_type_checks; |
| + asserts_ = api_flags.enable_asserts; |
| + // Leave others at defaults. |
| +} |
| + |
| + |
| +void Isolate::Flags::CopyTo(Dart_IsolateFlags* api_flags) const { |
| + api_flags->version = DART_FLAGS_CURRENT_VERSION; |
| + api_flags->enable_type_checks = type_checks(); |
| + api_flags->enable_asserts = asserts(); |
| +} |
| + |
| + |
| #if defined(DEBUG) |
| // static |
| void BaseIsolate::AssertCurrent(BaseIsolate* isolate) { |
| @@ -553,7 +608,7 @@ void BaseIsolate::AssertCurrent(BaseIsolate* isolate) { |
| #define REUSABLE_HANDLE_INITIALIZERS(object) \ |
| object##_handle_(NULL), |
| -Isolate::Isolate() |
| +Isolate::Isolate(const Dart_IsolateFlags& api_flags) |
| : mutator_thread_(NULL), |
| vm_tag_(0), |
| store_buffer_(), |
| @@ -578,7 +633,7 @@ Isolate::Isolate() |
| single_step_(false), |
| resume_request_(false), |
| has_compiled_(false), |
| - strict_compilation_(false), |
| + flags_(), |
|
Florian Schneider
2015/06/08 11:25:49
flags_(api_flags) and remove .CopyFrom below
|
| random_(), |
| simulator_(NULL), |
| long_jump_base_(NULL), |
| @@ -620,6 +675,7 @@ Isolate::Isolate() |
| REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) |
| REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) |
| reusable_handles_() { |
| + flags_.CopyFrom(api_flags); |
| set_vm_tag(VMTag::kEmbedderTagId); |
| set_user_tag(UserTags::kDefaultUserTag); |
| } |
| @@ -671,8 +727,10 @@ void Isolate::InitOnce() { |
| } |
| -Isolate* Isolate::Init(const char* name_prefix, bool is_vm_isolate) { |
| - Isolate* result = new Isolate(); |
| +Isolate* Isolate::Init(const char* name_prefix, |
| + const Dart_IsolateFlags& api_flags, |
| + bool is_vm_isolate) { |
| + Isolate* result = new Isolate(api_flags); |
| ASSERT(result != NULL); |
| // Initialize metrics. |
| @@ -1803,8 +1861,7 @@ static RawInstance* DeserializeObject(Isolate* isolate, |
| IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, |
| const Function& func, |
| const Instance& message, |
| - bool paused, |
| - bool checkedFlag) |
| + bool paused) |
| : isolate_(NULL), |
| parent_port_(parent_port), |
| script_url_(NULL), |
| @@ -1816,8 +1873,8 @@ IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, |
| serialized_args_len_(0), |
| serialized_message_(NULL), |
| serialized_message_len_(0), |
| - paused_(paused), |
| - checked_(checkedFlag) { |
| + isolate_flags_(), |
|
Florian Schneider
2015/06/08 11:25:49
isolate(Isolate::Current()->flags()) and remove ->
|
| + paused_(paused) { |
| script_url_ = NULL; |
| const Class& cls = Class::Handle(func.Owner()); |
| const Library& lib = Library::Handle(cls.library()); |
| @@ -1835,6 +1892,8 @@ IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, |
| &serialized_message_, |
| &serialized_message_len_, |
| can_send_any_object); |
| + // Inherit flags from spawning isolate. |
| + isolate_flags()->CopyFrom(Isolate::Current()->flags()); |
| } |
| @@ -1843,8 +1902,7 @@ IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, |
| const char* package_root, |
| const Instance& args, |
| const Instance& message, |
| - bool paused, |
| - bool checkedFlag) |
| + bool paused) |
| : isolate_(NULL), |
| parent_port_(parent_port), |
| package_root_(NULL), |
| @@ -1855,8 +1913,8 @@ IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, |
| serialized_args_len_(0), |
| serialized_message_(NULL), |
| serialized_message_len_(0), |
| - paused_(paused), |
| - checked_(checkedFlag) { |
| + isolate_flags_(), |
|
Florian Schneider
2015/06/08 11:25:49
isolate_flags_(Isolate::Current()->flags()) and r
|
| + paused_(paused) { |
| script_url_ = strdup(script_url); |
| if (package_root != NULL) { |
| package_root_ = strdup(package_root); |
| @@ -1872,6 +1930,9 @@ IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, |
| &serialized_message_, |
| &serialized_message_len_, |
| can_send_any_object); |
| + // By default inherit flags from spawning isolate. These can be overridden |
| + // from the calling code. |
| + isolate_flags()->CopyFrom(Isolate::Current()->flags()); |
| } |