| Index: runtime/vm/object.cc
 | 
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
 | 
| index b9521e685f9797e196d6920253283e7dd1bff946..7896e0c93b6ddaf619a2fde424b89e80f12fb620 100644
 | 
| --- a/runtime/vm/object.cc
 | 
| +++ b/runtime/vm/object.cc
 | 
| @@ -1432,12 +1432,10 @@ RawError* Object::Init(Isolate* isolate, kernel::Program* kernel_program) {
 | 
|  
 | 
|      // Class that represents the Dart class _Closure and C++ class Closure.
 | 
|      cls = Class::New<Closure>();
 | 
| -    cls.set_type_arguments_field_offset(Closure::type_arguments_offset());
 | 
| -    cls.set_num_type_arguments(0);  // Although a closure has type_arguments_.
 | 
| -    cls.set_num_own_type_arguments(0);
 | 
| +    object_store->set_closure_class(cls);
 | 
| +    cls.ResetFinalization();  // To calculate field offsets from Dart source.
 | 
|      RegisterPrivateClass(cls, Symbols::_Closure(), core_lib);
 | 
|      pending_classes.Add(cls);
 | 
| -    object_store->set_closure_class(cls);
 | 
|  
 | 
|      cls = Class::New<WeakProperty>();
 | 
|      object_store->set_weak_property_class(cls);
 | 
| @@ -2530,7 +2528,6 @@ RawTypeParameter* Class::LookupTypeParameter(const String& type_name) const {
 | 
|  
 | 
|  
 | 
|  void Class::CalculateFieldOffsets() const {
 | 
| -  ASSERT(id() != kClosureCid);  // Class _Closure is prefinalized.
 | 
|    Array& flds = Array::Handle(fields());
 | 
|    const Class& super = Class::Handle(SuperClass());
 | 
|    intptr_t offset = 0;
 | 
| @@ -3634,7 +3631,7 @@ void Class::SetRefinalizeAfterPatch() const {
 | 
|  
 | 
|  
 | 
|  void Class::ResetFinalization() const {
 | 
| -  ASSERT(IsTopLevel());
 | 
| +  ASSERT(IsTopLevel() || IsClosureClass());
 | 
|    set_state_bits(
 | 
|        ClassFinalizedBits::update(RawClass::kAllocated, raw_ptr()->state_bits_));
 | 
|    set_state_bits(TypeFinalizedBit::update(false, raw_ptr()->state_bits_));
 | 
| @@ -15570,7 +15567,8 @@ RawAbstractType* Instance::GetType(Heap::Space space) const {
 | 
|      }
 | 
|      const Class& scope_cls = Class::Handle(type.type_class());
 | 
|      ASSERT(scope_cls.NumTypeArguments() > 0);
 | 
| -    TypeArguments& type_arguments = TypeArguments::Handle(GetTypeArguments());
 | 
| +    TypeArguments& type_arguments =
 | 
| +        TypeArguments::Handle(Closure::Cast(*this).instantiator());
 | 
|      type =
 | 
|          Type::New(scope_cls, type_arguments, TokenPosition::kNoSource, space);
 | 
|      type.set_signature(signature);
 | 
| @@ -15666,7 +15664,7 @@ bool Instance::IsInstanceOf(const AbstractType& other,
 | 
|      const Function& signature =
 | 
|          Function::Handle(zone, Closure::Cast(*this).function());
 | 
|      const TypeArguments& type_arguments =
 | 
| -        TypeArguments::Handle(zone, GetTypeArguments());
 | 
| +        TypeArguments::Handle(zone, Closure::Cast(*this).instantiator());
 | 
|      // TODO(regis): If signature function is generic, pass its type parameters
 | 
|      // as function instantiator, otherwise pass null.
 | 
|      // Pass the closure context as well to the the IsSubtypeOf call.
 | 
| 
 |