OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "lib/mirrors.h" | 5 #include "lib/mirrors.h" |
6 | 6 |
7 #include "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
8 #include "vm/bootstrap_natives.h" | 8 #include "vm/bootstrap_natives.h" |
9 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 1708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1719 | 1719 |
1720 type = redirect_type.raw(); | 1720 type = redirect_type.raw(); |
1721 type_arguments = redirect_type.arguments(); | 1721 type_arguments = redirect_type.arguments(); |
1722 | 1722 |
1723 redirected_constructor = lookup_constructor.RedirectionTarget(); | 1723 redirected_constructor = lookup_constructor.RedirectionTarget(); |
1724 ASSERT(!redirected_constructor.IsNull()); | 1724 ASSERT(!redirected_constructor.IsNull()); |
1725 redirected_klass = type.type_class(); | 1725 redirected_klass = type.type_class(); |
1726 } | 1726 } |
1727 | 1727 |
1728 const intptr_t num_explicit_args = explicit_args.Length(); | 1728 const intptr_t num_explicit_args = explicit_args.Length(); |
1729 const intptr_t num_implicit_args = | 1729 const intptr_t num_implicit_args = 1; |
1730 redirected_constructor.IsGenerativeConstructor() ? 2 : 1; | |
1731 const Array& args = | 1730 const Array& args = |
1732 Array::Handle(Array::New(num_implicit_args + num_explicit_args)); | 1731 Array::Handle(Array::New(num_implicit_args + num_explicit_args)); |
1733 | 1732 |
1734 // Copy over the explicit arguments. | 1733 // Copy over the explicit arguments. |
1735 Object& explicit_argument = Object::Handle(); | 1734 Object& explicit_argument = Object::Handle(); |
1736 for (int i = 0; i < num_explicit_args; i++) { | 1735 for (int i = 0; i < num_explicit_args; i++) { |
1737 explicit_argument = explicit_args.At(i); | 1736 explicit_argument = explicit_args.At(i); |
1738 args.SetAt(i + num_implicit_args, explicit_argument); | 1737 args.SetAt(i + num_implicit_args, explicit_argument); |
1739 } | 1738 } |
1740 | 1739 |
(...skipping 10 matching lines...) Expand all Loading... |
1751 redirected_constructor, | 1750 redirected_constructor, |
1752 explicit_args, | 1751 explicit_args, |
1753 arg_names, | 1752 arg_names, |
1754 InvocationMirror::kConstructor, | 1753 InvocationMirror::kConstructor, |
1755 InvocationMirror::kMethod); | 1754 InvocationMirror::kMethod); |
1756 UNREACHABLE(); | 1755 UNREACHABLE(); |
1757 } | 1756 } |
1758 | 1757 |
1759 Instance& new_object = Instance::Handle(); | 1758 Instance& new_object = Instance::Handle(); |
1760 if (redirected_constructor.IsGenerativeConstructor()) { | 1759 if (redirected_constructor.IsGenerativeConstructor()) { |
1761 // Constructors get the uninitialized object and a constructor phase. Note | 1760 // Constructors get the uninitialized object. |
1762 // we have delayed allocation until after the function type and argument | 1761 // Note we have delayed allocation until after the function |
1763 // matching checks. | 1762 // type and argument matching checks. |
1764 new_object = Instance::New(redirected_klass); | 1763 new_object = Instance::New(redirected_klass); |
1765 if (!type_arguments.IsNull()) { | 1764 if (!type_arguments.IsNull()) { |
1766 // The type arguments will be null if the class has no type parameters, in | 1765 // The type arguments will be null if the class has no type parameters, in |
1767 // which case the following call would fail because there is no slot | 1766 // which case the following call would fail because there is no slot |
1768 // reserved in the object for the type vector. | 1767 // reserved in the object for the type vector. |
1769 new_object.SetTypeArguments(type_arguments); | 1768 new_object.SetTypeArguments(type_arguments); |
1770 } | 1769 } |
1771 args.SetAt(0, new_object); | 1770 args.SetAt(0, new_object); |
1772 args.SetAt(1, Smi::Handle(Smi::New(Function::kCtorPhaseAll))); | |
1773 } else { | 1771 } else { |
1774 // Factories get type arguments. | 1772 // Factories get type arguments. |
1775 args.SetAt(0, type_arguments); | 1773 args.SetAt(0, type_arguments); |
1776 } | 1774 } |
1777 | 1775 |
1778 // Invoke the constructor and return the new object. | 1776 // Invoke the constructor and return the new object. |
1779 const Object& result = | 1777 const Object& result = |
1780 Object::Handle(DartEntry::InvokeFunction(redirected_constructor, | 1778 Object::Handle(DartEntry::InvokeFunction(redirected_constructor, |
1781 args, | 1779 args, |
1782 args_descriptor_array)); | 1780 args_descriptor_array)); |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2111 } | 2109 } |
2112 | 2110 |
2113 DEFINE_NATIVE_ENTRY(TypeMirror_subtypeTest, 2) { | 2111 DEFINE_NATIVE_ENTRY(TypeMirror_subtypeTest, 2) { |
2114 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); | 2112 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); |
2115 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); | 2113 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); |
2116 return Bool::Get(a.IsSubtypeOf(b, NULL)).raw(); | 2114 return Bool::Get(a.IsSubtypeOf(b, NULL)).raw(); |
2117 } | 2115 } |
2118 | 2116 |
2119 | 2117 |
2120 } // namespace dart | 2118 } // namespace dart |
OLD | NEW |