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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 args.SetAt(5, array); | 64 args.SetAt(5, array); |
65 } | 65 } |
66 | 66 |
67 Exceptions::ThrowByType(Exceptions::kNoSuchMethod, args); | 67 Exceptions::ThrowByType(Exceptions::kNoSuchMethod, args); |
68 UNREACHABLE(); | 68 UNREACHABLE(); |
69 } | 69 } |
70 | 70 |
71 | 71 |
72 static void EnsureConstructorsAreCompiled(const Function& func) { | 72 static void EnsureConstructorsAreCompiled(const Function& func) { |
73 // Only generative constructors can have initializing formals. | 73 // Only generative constructors can have initializing formals. |
74 if (!func.IsConstructor()) return; | 74 if (!func.IsGenerativeConstructor()) return; |
75 | 75 |
76 Isolate* isolate = Isolate::Current(); | 76 Isolate* isolate = Isolate::Current(); |
77 const Class& cls = Class::Handle(isolate, func.Owner()); | 77 const Class& cls = Class::Handle(isolate, func.Owner()); |
78 const Error& error = Error::Handle( | 78 const Error& error = Error::Handle( |
79 isolate, cls.EnsureIsFinalized(Isolate::Current())); | 79 isolate, cls.EnsureIsFinalized(Isolate::Current())); |
80 if (!error.IsNull()) { | 80 if (!error.IsNull()) { |
81 Exceptions::PropagateError(error); | 81 Exceptions::PropagateError(error); |
82 UNREACHABLE(); | 82 UNREACHABLE(); |
83 } | 83 } |
84 if (!func.HasCode()) { | 84 if (!func.HasCode()) { |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 | 249 |
250 args.SetAt(2, owner_mirror); | 250 args.SetAt(2, owner_mirror); |
251 args.SetAt(3, Bool::Get(func.is_static())); | 251 args.SetAt(3, Bool::Get(func.is_static())); |
252 args.SetAt(4, Bool::Get(func.is_abstract())); | 252 args.SetAt(4, Bool::Get(func.is_abstract())); |
253 args.SetAt(5, Bool::Get(func.IsGetterFunction())); | 253 args.SetAt(5, Bool::Get(func.IsGetterFunction())); |
254 args.SetAt(6, Bool::Get(func.IsSetterFunction())); | 254 args.SetAt(6, Bool::Get(func.IsSetterFunction())); |
255 | 255 |
256 bool isConstructor = (func.kind() == RawFunction::kConstructor); | 256 bool isConstructor = (func.kind() == RawFunction::kConstructor); |
257 args.SetAt(7, Bool::Get(isConstructor)); | 257 args.SetAt(7, Bool::Get(isConstructor)); |
258 args.SetAt(8, Bool::Get(isConstructor && func.is_const())); | 258 args.SetAt(8, Bool::Get(isConstructor && func.is_const())); |
259 args.SetAt(9, Bool::Get(isConstructor && func.IsConstructor())); | 259 args.SetAt(9, Bool::Get(isConstructor && func.IsGenerativeConstructor())); |
260 args.SetAt(10, Bool::Get(isConstructor && func.is_redirecting())); | 260 args.SetAt(10, Bool::Get(isConstructor && func.is_redirecting())); |
261 args.SetAt(11, Bool::Get(isConstructor && func.IsFactory())); | 261 args.SetAt(11, Bool::Get(isConstructor && func.IsFactory())); |
262 | 262 |
263 return CreateMirror(Symbols::_LocalMethodMirror(), args); | 263 return CreateMirror(Symbols::_LocalMethodMirror(), args); |
264 } | 264 } |
265 | 265 |
266 | 266 |
267 static RawInstance* CreateVariableMirror(const Field& field, | 267 static RawInstance* CreateVariableMirror(const Field& field, |
268 const Instance& owner_mirror) { | 268 const Instance& owner_mirror) { |
269 const MirrorReference& field_ref = | 269 const MirrorReference& field_ref = |
(...skipping 1263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1533 String::Handle(String::Concat(klass_name, Symbols::Dot())); | 1533 String::Handle(String::Concat(klass_name, Symbols::Dot())); |
1534 if (!constructor_name.IsNull()) { | 1534 if (!constructor_name.IsNull()) { |
1535 internal_constructor_name = | 1535 internal_constructor_name = |
1536 String::Concat(internal_constructor_name, constructor_name); | 1536 String::Concat(internal_constructor_name, constructor_name); |
1537 } | 1537 } |
1538 | 1538 |
1539 Function& lookup_constructor = Function::Handle( | 1539 Function& lookup_constructor = Function::Handle( |
1540 klass.LookupFunction(internal_constructor_name)); | 1540 klass.LookupFunction(internal_constructor_name)); |
1541 | 1541 |
1542 if (lookup_constructor.IsNull() || | 1542 if (lookup_constructor.IsNull() || |
1543 !(lookup_constructor.IsConstructor() || lookup_constructor.IsFactory()) || | 1543 (lookup_constructor.kind() != RawFunction::kConstructor) || |
1544 !lookup_constructor.is_reflectable()) { | 1544 !lookup_constructor.is_reflectable()) { |
1545 // Pretend we didn't find the constructor at all when the arity is wrong | 1545 // Pretend we didn't find the constructor at all when the arity is wrong |
1546 // so as to produce the same NoSuchMethodError as the non-reflective case. | 1546 // so as to produce the same NoSuchMethodError as the non-reflective case. |
1547 lookup_constructor = Function::null(); | 1547 lookup_constructor = Function::null(); |
1548 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), | 1548 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), |
1549 internal_constructor_name, | 1549 internal_constructor_name, |
1550 lookup_constructor, | 1550 lookup_constructor, |
1551 Object::null_array(), | 1551 Object::null_array(), |
1552 InvocationMirror::kConstructor, | 1552 InvocationMirror::kConstructor, |
1553 InvocationMirror::kMethod); | 1553 InvocationMirror::kMethod); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1595 type = redirect_type.raw(); | 1595 type = redirect_type.raw(); |
1596 type_arguments = redirect_type.arguments(); | 1596 type_arguments = redirect_type.arguments(); |
1597 | 1597 |
1598 redirected_constructor = lookup_constructor.RedirectionTarget(); | 1598 redirected_constructor = lookup_constructor.RedirectionTarget(); |
1599 ASSERT(!redirected_constructor.IsNull()); | 1599 ASSERT(!redirected_constructor.IsNull()); |
1600 redirected_klass = type.type_class(); | 1600 redirected_klass = type.type_class(); |
1601 } | 1601 } |
1602 | 1602 |
1603 const intptr_t num_explicit_args = explicit_args.Length(); | 1603 const intptr_t num_explicit_args = explicit_args.Length(); |
1604 const intptr_t num_implicit_args = | 1604 const intptr_t num_implicit_args = |
1605 redirected_constructor.IsConstructor() ? 2 : 1; | 1605 redirected_constructor.IsGenerativeConstructor() ? 2 : 1; |
1606 const Array& args = | 1606 const Array& args = |
1607 Array::Handle(Array::New(num_implicit_args + num_explicit_args)); | 1607 Array::Handle(Array::New(num_implicit_args + num_explicit_args)); |
1608 | 1608 |
1609 // Copy over the explicit arguments. | 1609 // Copy over the explicit arguments. |
1610 Object& explicit_argument = Object::Handle(); | 1610 Object& explicit_argument = Object::Handle(); |
1611 for (int i = 0; i < num_explicit_args; i++) { | 1611 for (int i = 0; i < num_explicit_args; i++) { |
1612 explicit_argument = explicit_args.At(i); | 1612 explicit_argument = explicit_args.At(i); |
1613 args.SetAt(i + num_implicit_args, explicit_argument); | 1613 args.SetAt(i + num_implicit_args, explicit_argument); |
1614 } | 1614 } |
1615 | 1615 |
(...skipping 10 matching lines...) Expand all Loading... |
1626 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), | 1626 ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), |
1627 internal_constructor_name, | 1627 internal_constructor_name, |
1628 redirected_constructor, | 1628 redirected_constructor, |
1629 Object::null_array(), | 1629 Object::null_array(), |
1630 InvocationMirror::kConstructor, | 1630 InvocationMirror::kConstructor, |
1631 InvocationMirror::kMethod); | 1631 InvocationMirror::kMethod); |
1632 UNREACHABLE(); | 1632 UNREACHABLE(); |
1633 } | 1633 } |
1634 | 1634 |
1635 Instance& new_object = Instance::Handle(); | 1635 Instance& new_object = Instance::Handle(); |
1636 if (redirected_constructor.IsConstructor()) { | 1636 if (redirected_constructor.IsGenerativeConstructor()) { |
1637 // Constructors get the uninitialized object and a constructor phase. Note | 1637 // Constructors get the uninitialized object and a constructor phase. Note |
1638 // we have delayed allocation until after the function type and argument | 1638 // we have delayed allocation until after the function type and argument |
1639 // matching checks. | 1639 // matching checks. |
1640 new_object = Instance::New(redirected_klass); | 1640 new_object = Instance::New(redirected_klass); |
1641 if (!type_arguments.IsNull()) { | 1641 if (!type_arguments.IsNull()) { |
1642 // The type arguments will be null if the class has no type parameters, in | 1642 // The type arguments will be null if the class has no type parameters, in |
1643 // which case the following call would fail because there is no slot | 1643 // which case the following call would fail because there is no slot |
1644 // reserved in the object for the type vector. | 1644 // reserved in the object for the type vector. |
1645 new_object.SetTypeArguments(type_arguments); | 1645 new_object.SetTypeArguments(type_arguments); |
1646 } | 1646 } |
(...skipping 10 matching lines...) Expand all Loading... |
1657 args, | 1657 args, |
1658 args_descriptor_array)); | 1658 args_descriptor_array)); |
1659 if (result.IsError()) { | 1659 if (result.IsError()) { |
1660 Exceptions::PropagateError(Error::Cast(result)); | 1660 Exceptions::PropagateError(Error::Cast(result)); |
1661 UNREACHABLE(); | 1661 UNREACHABLE(); |
1662 } | 1662 } |
1663 | 1663 |
1664 // Factories may return null. | 1664 // Factories may return null. |
1665 ASSERT(result.IsInstance() || result.IsNull()); | 1665 ASSERT(result.IsInstance() || result.IsNull()); |
1666 | 1666 |
1667 if (redirected_constructor.IsConstructor()) { | 1667 if (redirected_constructor.IsGenerativeConstructor()) { |
1668 return new_object.raw(); | 1668 return new_object.raw(); |
1669 } else { | 1669 } else { |
1670 return result.raw(); | 1670 return result.raw(); |
1671 } | 1671 } |
1672 } | 1672 } |
1673 | 1673 |
1674 | 1674 |
1675 DEFINE_NATIVE_ENTRY(LibraryMirror_invoke, 5) { | 1675 DEFINE_NATIVE_ENTRY(LibraryMirror_invoke, 5) { |
1676 // Argument 0 is the mirror, which is unused by the native. It exists | 1676 // Argument 0 is the mirror, which is unused by the native. It exists |
1677 // because this native is an instance method in order to be polymorphic | 1677 // because this native is an instance method in order to be polymorphic |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1833 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 1833 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
1834 return CreateParameterMirrorList(func, owner); | 1834 return CreateParameterMirrorList(func, owner); |
1835 } | 1835 } |
1836 | 1836 |
1837 | 1837 |
1838 DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 2) { | 1838 DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 2) { |
1839 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1839 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
1840 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 1840 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
1841 GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); | 1841 GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); |
1842 // We handle constructors in Dart code. | 1842 // We handle constructors in Dart code. |
1843 ASSERT(!func.IsConstructor()); | 1843 ASSERT(!func.IsGenerativeConstructor()); |
1844 const AbstractType& type = AbstractType::Handle(func.result_type()); | 1844 const AbstractType& type = AbstractType::Handle(func.result_type()); |
1845 return InstantiateType(type, instantiator); | 1845 return InstantiateType(type, instantiator); |
1846 } | 1846 } |
1847 | 1847 |
1848 | 1848 |
1849 DEFINE_NATIVE_ENTRY(MethodMirror_source, 1) { | 1849 DEFINE_NATIVE_ENTRY(MethodMirror_source, 1) { |
1850 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1850 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
1851 const Function& func = Function::Handle(ref.GetFunctionReferent()); | 1851 const Function& func = Function::Handle(ref.GetFunctionReferent()); |
1852 if (func.IsImplicitConstructor() || func.IsSignatureFunction()) { | 1852 if (func.IsImplicitConstructor() || func.IsSignatureFunction()) { |
1853 // We may need to handle more cases when the restrictions on mixins are | 1853 // We may need to handle more cases when the restrictions on mixins are |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1965 } | 1965 } |
1966 | 1966 |
1967 DEFINE_NATIVE_ENTRY(TypeMirror_moreSpecificTest, 2) { | 1967 DEFINE_NATIVE_ENTRY(TypeMirror_moreSpecificTest, 2) { |
1968 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); | 1968 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); |
1969 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); | 1969 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); |
1970 return Bool::Get(a.IsMoreSpecificThan(b, NULL)).raw(); | 1970 return Bool::Get(a.IsMoreSpecificThan(b, NULL)).raw(); |
1971 } | 1971 } |
1972 | 1972 |
1973 | 1973 |
1974 } // namespace dart | 1974 } // namespace dart |
OLD | NEW |