| Index: runtime/vm/object.cc | 
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc | 
| index 7643cdbfc5ffc2cd79a4b1b9842a94c0f83fca24..612202cdbdfad71f7edd9764589c700f6d161847 100644 | 
| --- a/runtime/vm/object.cc | 
| +++ b/runtime/vm/object.cc | 
| @@ -2022,7 +2022,7 @@ void Class::set_type_parameters(const TypeArguments& value) const { | 
|  | 
|  | 
| intptr_t Class::NumTypeParameters(Isolate* isolate) const { | 
| -  if (IsMixinApplication() && !is_mixin_type_applied()) { | 
| +  if (IsAnonymousMixinApplication() && !is_mixin_type_applied()) { | 
| ClassFinalizer::ApplyMixinType(*this); | 
| } | 
| if (type_parameters() == TypeArguments::null()) { | 
| @@ -2049,7 +2049,7 @@ intptr_t Class::NumOwnTypeArguments() const { | 
| set_num_own_type_arguments(num_type_params); | 
| return num_type_params; | 
| } | 
| -  ASSERT(!IsMixinApplication() || is_mixin_type_applied()); | 
| +  ASSERT(!IsAnonymousMixinApplication() || is_mixin_type_applied()); | 
| const AbstractType& sup_type = AbstractType::Handle(isolate, super_type()); | 
| const TypeArguments& sup_type_args = | 
| TypeArguments::Handle(isolate, sup_type.arguments()); | 
| @@ -3186,13 +3186,15 @@ void Class::set_mixin(const Type& value) const { | 
|  | 
|  | 
| bool Class::IsMixinApplication() const { | 
| -  return mixin() != Type::null(); | 
| +  return mixin() != Type::null() || is_mixin_app_alias(); | 
| } | 
|  | 
| + | 
| bool Class::IsAnonymousMixinApplication() const { | 
| return IsMixinApplication() && !is_mixin_app_alias(); | 
| } | 
|  | 
| + | 
| void Class::set_patch_class(const Class& cls) const { | 
| ASSERT(patch_class() == Class::null()); | 
| StorePointer(&raw_ptr()->patch_class_, cls.raw()); | 
| @@ -5081,6 +5083,28 @@ void Function::SetRedirectionTarget(const Function& target) const { | 
| } | 
|  | 
|  | 
| +bool Function::IsForwardingConstructor() const { | 
| +  if (!IsImplicitConstructor()) return false; | 
| +  const Class& owner = Class::Handle(Owner()); | 
| +  return owner.IsMixinApplication(); | 
| +} | 
| + | 
| + | 
| +RawFunction* Function::ForwardingTarget() const { | 
| +  ASSERT(IsForwardingConstructor()); | 
| +  Object& obj = Object::Handle(raw_ptr()->data_); | 
| +  ASSERT(!obj.IsNull()); | 
| +  return Function::Cast(obj).raw(); | 
| +} | 
| + | 
| + | 
| +void Function::SetForwardingTarget(const Function& target) const { | 
| +  ASSERT(IsForwardingConstructor()); | 
| +  ASSERT(Object::Handle(raw_ptr()->data_).IsNull()); | 
| +  set_data(target); | 
| +} | 
| + | 
| + | 
| void Function::set_data(const Object& value) const { | 
| StorePointer(&raw_ptr()->data_, value.raw()); | 
| } | 
|  |