| Index: runtime/vm/object_reload.cc
|
| diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
|
| index ec79c6b69af9b20347e7d7d0c00b0b02c389bb88..03a5ffa6efacb8cbff80b20bb2c0ee0a7ac6a1d5 100644
|
| --- a/runtime/vm/object_reload.cc
|
| +++ b/runtime/vm/object_reload.cc
|
| @@ -57,7 +57,7 @@ void Function::ZeroEdgeCounters() const {
|
| }
|
|
|
|
|
| -void Code::ResetICDatas() const {
|
| +void Code::ResetICDatas(Zone* zone) const {
|
| // Iterate over the Code's object pool and reset all ICDatas.
|
| #ifdef TARGET_ARCH_IA32
|
| // IA32 does not have an object pool, but, we can iterate over all
|
| @@ -65,10 +65,10 @@ void Code::ResetICDatas() const {
|
| if (!is_alive()) {
|
| return;
|
| }
|
| - const Instructions& instrs = Instructions::Handle(instructions());
|
| + const Instructions& instrs = Instructions::Handle(zone, instructions());
|
| ASSERT(!instrs.IsNull());
|
| uword base_address = instrs.EntryPoint();
|
| - Object& object = Object::Handle();
|
| + Object& object = Object::Handle(zone);
|
| intptr_t offsets_length = pointer_offsets_length();
|
| const int32_t* offsets = raw_ptr()->data();
|
| for (intptr_t i = 0; i < offsets_length; i++) {
|
| @@ -85,8 +85,8 @@ void Code::ResetICDatas() const {
|
| }
|
| }
|
| #else
|
| - const ObjectPool& pool = ObjectPool::Handle(object_pool());
|
| - Object& object = Object::Handle();
|
| + const ObjectPool& pool = ObjectPool::Handle(zone, object_pool());
|
| + Object& object = Object::Handle(zone);
|
| ASSERT(!pool.IsNull());
|
| for (intptr_t i = 0; i < pool.Length(); i++) {
|
| ObjectPool::EntryType entry_type = pool.InfoAt(i);
|
| @@ -95,7 +95,7 @@ void Code::ResetICDatas() const {
|
| }
|
| object = pool.ObjectAt(i);
|
| if (object.IsICData()) {
|
| - ICData::Cast(object).Reset();
|
| + ICData::Cast(object).Reset(zone);
|
| }
|
| }
|
| #endif
|
| @@ -679,24 +679,24 @@ void Library::CheckReload(const Library& replacement,
|
| static const Function* static_call_target = NULL;
|
|
|
|
|
| -void ICData::Reset() const {
|
| +void ICData::Reset(Zone* zone) const {
|
| if (is_static_call()) {
|
| - const Function& old_target = Function::Handle(GetTargetAt(0));
|
| + const Function& old_target = Function::Handle(zone, GetTargetAt(0));
|
| if (old_target.IsNull()) {
|
| FATAL("old_target is NULL.\n");
|
| }
|
| static_call_target = &old_target;
|
|
|
| - const String& selector = String::Handle(old_target.name());
|
| - Function& new_target = Function::Handle();
|
| + const String& selector = String::Handle(zone, old_target.name());
|
| + Function& new_target = Function::Handle(zone);
|
| if (!old_target.is_static()) {
|
| if (old_target.kind() == RawFunction::kConstructor) {
|
| return; // Super constructor call.
|
| }
|
| - Function& caller = Function::Handle();
|
| + Function& caller = Function::Handle(zone);
|
| caller ^= Owner();
|
| ASSERT(!caller.is_static());
|
| - Class& cls = Class::Handle(caller.Owner());
|
| + Class& cls = Class::Handle(zone, caller.Owner());
|
| if (cls.raw() == old_target.Owner()) {
|
| // Dispatcher.
|
| if (caller.IsImplicitClosureFunction()) {
|
| @@ -707,7 +707,7 @@ void ICData::Reset() const {
|
| return;
|
| }
|
| const Function& caller_parent =
|
| - Function::Handle(caller.parent_function());
|
| + Function::Handle(zone, caller.parent_function());
|
| if (!caller_parent.IsNull()) {
|
| if (caller_parent.kind() == RawFunction::kInvokeFieldDispatcher) {
|
| return; // Call-through-getter.
|
| @@ -730,23 +730,30 @@ void ICData::Reset() const {
|
| }
|
| } else {
|
| // This can be incorrect if the call site was an unqualified invocation.
|
| - const Class& cls = Class::Handle(old_target.Owner());
|
| + const Class& cls = Class::Handle(zone, old_target.Owner());
|
| new_target = cls.LookupStaticFunction(selector);
|
| }
|
|
|
| - const Array& args_desc_array = Array::Handle(arguments_descriptor());
|
| + const Array& args_desc_array = Array::Handle(zone, arguments_descriptor());
|
| ArgumentsDescriptor args_desc(args_desc_array);
|
| if (new_target.IsNull() ||
|
| !new_target.AreValidArguments(args_desc, NULL)) {
|
| // TODO(rmacnak): Patch to a NSME stub.
|
| VTIR_Print("Cannot rebind static call to %s from %s\n",
|
| old_target.ToCString(),
|
| - Object::Handle(Owner()).ToCString());
|
| + Object::Handle(zone, Owner()).ToCString());
|
| return;
|
| }
|
| ClearAndSetStaticTarget(new_target);
|
| } else {
|
| - ClearWithSentinel();
|
| + intptr_t num_args = NumArgsTested();
|
| + if (num_args == 2) {
|
| + ClearWithSentinel();
|
| + } else {
|
| + const Array& data_array =
|
| + Array::Handle(zone, CachedEmptyICDataArray(num_args));
|
| + set_ic_data_array(data_array);
|
| + }
|
| }
|
| }
|
|
|
|
|