| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index 4da9ecd01ec1304147118f93a32f9d8a29ea3896..04c77edc519f1770ccc368e887f5020028213dca 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -6907,8 +6907,9 @@ RawInstance* Function::ImplicitStaticClosure() const {
|
| ObjectStore* object_store = isolate->object_store();
|
| const Context& context =
|
| Context::Handle(zone, object_store->empty_context());
|
| - Instance& closure =
|
| - Instance::Handle(zone, Closure::New(*this, context, Heap::kOld));
|
| + const TypeArguments& instantiator = TypeArguments::Handle(zone);
|
| + Instance& closure = Instance::Handle(
|
| + zone, Closure::New(instantiator, *this, context, Heap::kOld));
|
| set_implicit_static_closure(closure);
|
| }
|
| return implicit_static_closure();
|
| @@ -6917,17 +6918,16 @@ RawInstance* Function::ImplicitStaticClosure() const {
|
|
|
| RawInstance* Function::ImplicitInstanceClosure(const Instance& receiver) const {
|
| ASSERT(IsImplicitClosureFunction());
|
| - const Type& signature_type = Type::Handle(SignatureType());
|
| - const Class& cls = Class::Handle(signature_type.type_class());
|
| - const Context& context = Context::Handle(Context::New(1));
|
| + Zone* zone = Thread::Current()->zone();
|
| + const Type& signature_type = Type::Handle(zone, SignatureType());
|
| + const Class& cls = Class::Handle(zone, signature_type.type_class());
|
| + const Context& context = Context::Handle(zone, Context::New(1));
|
| context.SetAt(0, receiver);
|
| - const Instance& result = Instance::Handle(Closure::New(*this, context));
|
| + TypeArguments& instantiator = TypeArguments::Handle(zone);
|
| if (cls.IsGeneric()) {
|
| - const TypeArguments& type_arguments =
|
| - TypeArguments::Handle(receiver.GetTypeArguments());
|
| - result.SetTypeArguments(type_arguments);
|
| + instantiator = receiver.GetTypeArguments();
|
| }
|
| - return result.raw();
|
| + return Closure::New(instantiator, *this, context);
|
| }
|
|
|
|
|
| @@ -22385,7 +22385,8 @@ const char* Closure::ToCString() const {
|
| }
|
|
|
|
|
| -RawClosure* Closure::New(const Function& function,
|
| +RawClosure* Closure::New(const TypeArguments& instantiator,
|
| + const Function& function,
|
| const Context& context,
|
| Heap::Space space) {
|
| Closure& result = Closure::Handle();
|
| @@ -22394,6 +22395,7 @@ RawClosure* Closure::New(const Function& function,
|
| Object::Allocate(Closure::kClassId, Closure::InstanceSize(), space);
|
| NoSafepointScope no_safepoint;
|
| result ^= raw;
|
| + result.StorePointer(&result.raw_ptr()->instantiator_, instantiator.raw());
|
| result.StorePointer(&result.raw_ptr()->function_, function.raw());
|
| result.StorePointer(&result.raw_ptr()->context_, context.raw());
|
| }
|
|
|