Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: runtime/lib/mirrors.cc

Issue 23020025: Implement ParameterMirror.{isFinal,hasDefaultValue,defaultValue}. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | runtime/lib/mirrors_impl.dart » ('j') | runtime/lib/mirrors_impl.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/invocation_mirror.h" 5 #include "lib/invocation_mirror.h"
6 #include "vm/bootstrap_natives.h" 6 #include "vm/bootstrap_natives.h"
7 #include "vm/class_finalizer.h" 7 #include "vm/class_finalizer.h"
8 #include "vm/dart_entry.h" 8 #include "vm/dart_entry.h"
9 #include "vm/exceptions.h" 9 #include "vm/exceptions.h"
10 #include "vm/object_store.h" 10 #include "vm/object_store.h"
11 #include "vm/parser.h"
11 #include "vm/port.h" 12 #include "vm/port.h"
12 #include "vm/symbols.h" 13 #include "vm/symbols.h"
13 14
14 namespace dart { 15 namespace dart {
15 16
16 static RawInstance* CreateMirror(const String& mirror_class_name, 17 static RawInstance* CreateMirror(const String& mirror_class_name,
17 const Array& constructor_arguments) { 18 const Array& constructor_arguments) {
18 const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary()); 19 const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary());
19 const String& constructor_name = Symbols::Dot(); 20 const String& constructor_name = Symbols::Dot();
20 21
21 const Object& result = Object::Handle( 22 const Object& result = Object::Handle(
22 DartLibraryCalls::InstanceCreate(mirrors_lib, 23 DartLibraryCalls::InstanceCreate(mirrors_lib,
23 mirror_class_name, 24 mirror_class_name,
24 constructor_name, 25 constructor_name,
25 constructor_arguments)); 26 constructor_arguments));
26 ASSERT(!result.IsError()); 27 ASSERT(!result.IsError());
27 return Instance::Cast(result).raw(); 28 return Instance::Cast(result).raw();
28 } 29 }
29 30
30 31
32 // Note a "raw type" is not the same as a RawType.
Michael Lippautz (Google) 2013/08/21 20:37:36 Moving the throw stuff to the top of the file, sin
33 static RawAbstractType* RawTypeOfClass(const Class& cls) {
34 Type& type = Type::Handle(Type::New(cls,
35 Object::null_abstract_type_arguments(),
36 Scanner::kDummyTokenIndex));
37 return ClassFinalizer::FinalizeType(cls, type, ClassFinalizer::kCanonicalize);
38 }
39
40
41 static void ThrowMirroredCompilationError(const String& message) {
42 Array& args = Array::Handle(Array::New(1));
43 args.SetAt(0, message);
44
45 Exceptions::ThrowByType(Exceptions::kMirroredCompilationError, args);
46 UNREACHABLE();
47 }
48
49
50 static void ThrowInvokeError(const Error& error) {
51 if (error.IsLanguageError()) {
52 // A compilation error that was delayed by lazy compilation.
53 const LanguageError& compilation_error = LanguageError::Cast(error);
54 String& message = String::Handle(compilation_error.message());
55 ThrowMirroredCompilationError(message);
56 UNREACHABLE();
57 }
58 Exceptions::PropagateError(error);
59 UNREACHABLE();
60 }
61
62
63 static void ThrowNoSuchMethod(const Instance& receiver,
64 const String& function_name,
65 const Function& function,
66 const InvocationMirror::Call call,
67 const InvocationMirror::Type type) {
68 const Smi& invocation_type = Smi::Handle(Smi::New(
69 InvocationMirror::EncodeType(call, type)));
70
71 const Array& args = Array::Handle(Array::New(6));
72 args.SetAt(0, receiver);
73 args.SetAt(1, function_name);
74 args.SetAt(2, invocation_type);
75 if (!function.IsNull()) {
76 const int total_num_parameters = function.NumParameters();
77 const Array& array = Array::Handle(Array::New(total_num_parameters));
78 String& param_name = String::Handle();
79 for (int i = 0; i < total_num_parameters; i++) {
80 param_name = function.ParameterNameAt(i);
81 array.SetAt(i, param_name);
82 }
83 args.SetAt(5, array);
84 }
85
86 Exceptions::ThrowByType(Exceptions::kNoSuchMethod, args);
87 UNREACHABLE();
88 }
89
90
91 static void ThrowNoSuchMethod(const Class& klass,
92 const String& function_name,
93 const Function& function,
94 const InvocationMirror::Call call,
95 const InvocationMirror::Type type) {
96 AbstractType& runtime_type = AbstractType::Handle(RawTypeOfClass(klass));
97
98 ThrowNoSuchMethod(runtime_type,
99 function_name,
100 function,
101 call,
102 type);
103 UNREACHABLE();
104 }
105
106
107 static void ThrowNoSuchMethod(const Library& library,
108 const String& function_name,
109 const Function& function,
110 const InvocationMirror::Call call,
111 const InvocationMirror::Type type) {
112 ThrowNoSuchMethod(Instance::null_instance(),
113 function_name,
114 function,
115 call,
116 type);
117 UNREACHABLE();
118 }
119
120
31 DEFINE_NATIVE_ENTRY(Mirrors_isLocalPort, 1) { 121 DEFINE_NATIVE_ENTRY(Mirrors_isLocalPort, 1) {
32 GET_NON_NULL_NATIVE_ARGUMENT(Instance, port, arguments->NativeArgAt(0)); 122 GET_NON_NULL_NATIVE_ARGUMENT(Instance, port, arguments->NativeArgAt(0));
33 123
34 // Get the port id from the SendPort instance. 124 // Get the port id from the SendPort instance.
35 const Object& id_obj = Object::Handle(DartLibraryCalls::PortGetId(port)); 125 const Object& id_obj = Object::Handle(DartLibraryCalls::PortGetId(port));
36 if (id_obj.IsError()) { 126 if (id_obj.IsError()) {
37 Exceptions::PropagateError(Error::Cast(id_obj)); 127 Exceptions::PropagateError(Error::Cast(id_obj));
38 UNREACHABLE(); 128 UNREACHABLE();
39 } 129 }
40 ASSERT(id_obj.IsSmi() || id_obj.IsMint()); 130 ASSERT(id_obj.IsSmi() || id_obj.IsMint());
41 Integer& id = Integer::Handle(); 131 Integer& id = Integer::Handle();
42 id ^= id_obj.raw(); 132 id ^= id_obj.raw();
43 Dart_Port port_id = static_cast<Dart_Port>(id.AsInt64Value()); 133 Dart_Port port_id = static_cast<Dart_Port>(id.AsInt64Value());
44 return Bool::Get(PortMap::IsLocalPort(port_id)); 134 return Bool::Get(PortMap::IsLocalPort(port_id));
45 } 135 }
46 136
47 137
48 static RawInstance* CreateParameterMirrorList(const Function& func, 138 static RawInstance* CreateParameterMirrorList(const Function& func,
49 const Instance& owner_mirror) { 139 const Instance& owner_mirror) {
50 HANDLESCOPE(Isolate::Current()); 140 HANDLESCOPE(Isolate::Current());
51 const intptr_t implicit_param_count = func.NumImplicitParameters(); 141 const intptr_t implicit_param_count = func.NumImplicitParameters();
52 const intptr_t non_implicit_param_count = func.NumParameters() - 142 const intptr_t non_implicit_param_count = func.NumParameters() -
53 implicit_param_count; 143 implicit_param_count;
54 const intptr_t index_of_first_optional_param = 144 const intptr_t index_of_first_optional_param =
55 non_implicit_param_count - func.NumOptionalParameters(); 145 non_implicit_param_count - func.NumOptionalParameters();
56 const intptr_t index_of_first_named_param = 146 const intptr_t index_of_first_named_param =
57 non_implicit_param_count - func.NumOptionalNamedParameters(); 147 non_implicit_param_count - func.NumOptionalNamedParameters();
58 const Array& results = Array::Handle(Array::New(non_implicit_param_count)); 148 const Array& results = Array::Handle(Array::New(non_implicit_param_count));
59 const Array& args = Array::Handle(Array::New(6)); 149 const Array& args = Array::Handle(Array::New(8));
150
151 // Return for synthetic functions and getters.
152 if (func.IsGetterFunction() ||
153 func.IsImplicitConstructor() ||
154 func.IsImplicitGetterFunction() ||
155 func.IsImplicitSetterFunction()) {
156 return results.raw();
157 }
158
60 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func))); 159 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func)));
61 args.SetAt(2, owner_mirror); 160 args.SetAt(2, owner_mirror);
161
62 Smi& pos = Smi::Handle(); 162 Smi& pos = Smi::Handle();
63 String& name = String::Handle(); 163 String& name = String::Handle();
64 Instance& param = Instance::Handle(); 164 Instance& param = Instance::Handle();
165 Bool& is_final = Bool::Handle();
166 Object& default_value = Object::Handle();
167
168 // Reparse the function for the following information:
169 // * The default value of a parameter.
170 // * Whether a parameters has been deflared as final.
171 const Object& result = Object::Handle(Parser::ParseFunctionParameters(func));
172 if (result.IsError()) {
173 ThrowInvokeError(Error::Cast(result));
174 UNREACHABLE();
175 }
176
177 const Array& param_descriptor = Array::Cast(result);
178 ASSERT(param_descriptor.Length() == (2 * non_implicit_param_count));
65 for (intptr_t i = 0; i < non_implicit_param_count; i++) { 179 for (intptr_t i = 0; i < non_implicit_param_count; i++) {
66 pos ^= Smi::New(i); 180 pos ^= Smi::New(i);
67 name ^= func.ParameterNameAt(implicit_param_count + i); 181 name ^= func.ParameterNameAt(implicit_param_count + i);
182 is_final ^= param_descriptor.At(i * 2);
183 default_value = param_descriptor.At(i * 2 + 1);
184 ASSERT(default_value.IsNull() || default_value.IsInstance());
185
68 args.SetAt(1, name); 186 args.SetAt(1, name);
69 args.SetAt(3, pos); 187 args.SetAt(3, pos);
70 args.SetAt(4, (i >= index_of_first_optional_param) ? 188 args.SetAt(4, (i >= index_of_first_optional_param) ?
71 Bool::True() : Bool::False()); 189 Bool::True() : Bool::False());
72 args.SetAt(5, (i >= index_of_first_named_param) ? 190 args.SetAt(5, (i >= index_of_first_named_param) ?
73 Bool::True() : Bool::False()); 191 Bool::True() : Bool::False());
192 args.SetAt(6, is_final.value() ? Bool::True() : Bool::False());
rmacnak 2013/08/23 23:15:27 is_final is already a handle, so you can pass it t
Michael Lippautz (Google) 2013/08/24 00:17:21 Done.
193 args.SetAt(7, default_value);
74 param ^= CreateMirror(Symbols::_LocalParameterMirrorImpl(), args); 194 param ^= CreateMirror(Symbols::_LocalParameterMirrorImpl(), args);
75 results.SetAt(i, param); 195 results.SetAt(i, param);
76 } 196 }
77 results.MakeImmutable(); 197 results.MakeImmutable();
78 return results.raw(); 198 return results.raw();
79 } 199 }
80 200
81 201
82 static RawInstance* CreateTypeVariableMirror(const TypeParameter& param, 202 static RawInstance* CreateTypeVariableMirror(const TypeParameter& param,
83 const Instance& owner_mirror) { 203 const Instance& owner_mirror) {
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 322
203 const Array& args = Array::Handle(Array::New(4)); 323 const Array& args = Array::Handle(Array::New(4));
204 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls))); 324 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
205 args.SetAt(1, type); 325 args.SetAt(1, type);
206 args.SetAt(2, String::Handle(cls.UserVisibleName())); 326 args.SetAt(2, String::Handle(cls.UserVisibleName()));
207 args.SetAt(3, is_generic); 327 args.SetAt(3, is_generic);
208 return CreateMirror(Symbols::_LocalClassMirrorImpl(), args); 328 return CreateMirror(Symbols::_LocalClassMirrorImpl(), args);
209 } 329 }
210 330
211 331
212 // Note a "raw type" is not the same as a RawType.
213 static RawAbstractType* RawTypeOfClass(const Class& cls) {
214 Type& type = Type::Handle(Type::New(cls,
215 Object::null_abstract_type_arguments(),
216 Scanner::kDummyTokenIndex));
217 return ClassFinalizer::FinalizeType(cls, type, ClassFinalizer::kCanonicalize);
218 }
219
220
221 static RawInstance* CreateLibraryMirror(const Library& lib) { 332 static RawInstance* CreateLibraryMirror(const Library& lib) {
222 const Array& args = Array::Handle(Array::New(3)); 333 const Array& args = Array::Handle(Array::New(3));
223 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(lib))); 334 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(lib)));
224 String& str = String::Handle(); 335 String& str = String::Handle();
225 str = lib.name(); 336 str = lib.name();
226 args.SetAt(1, str); 337 args.SetAt(1, str);
227 str = lib.url(); 338 str = lib.url();
228 args.SetAt(2, str); 339 args.SetAt(2, str);
229 return CreateMirror(Symbols::_LocalLibraryMirrorImpl(), args); 340 return CreateMirror(Symbols::_LocalLibraryMirrorImpl(), args);
230 } 341 }
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 } 428 }
318 } 429 }
319 430
320 431
321 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 1) { 432 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 1) {
322 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0)); 433 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
323 return CreateTypeMirror(type); 434 return CreateTypeMirror(type);
324 } 435 }
325 436
326 437
327 static void ThrowMirroredCompilationError(const String& message) {
328 Array& args = Array::Handle(Array::New(1));
329 args.SetAt(0, message);
330
331 Exceptions::ThrowByType(Exceptions::kMirroredCompilationError, args);
332 UNREACHABLE();
333 }
334
335
336 static void ThrowInvokeError(const Error& error) {
337 if (error.IsLanguageError()) {
338 // A compilation error that was delayed by lazy compilation.
339 const LanguageError& compilation_error = LanguageError::Cast(error);
340 String& message = String::Handle(compilation_error.message());
341 ThrowMirroredCompilationError(message);
342 UNREACHABLE();
343 }
344 Exceptions::PropagateError(error);
345 UNREACHABLE();
346 }
347
348
349 DEFINE_NATIVE_ENTRY(MirrorReference_equals, 2) { 438 DEFINE_NATIVE_ENTRY(MirrorReference_equals, 2) {
350 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, a, arguments->NativeArgAt(0)); 439 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, a, arguments->NativeArgAt(0));
351 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, b, arguments->NativeArgAt(1)); 440 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, b, arguments->NativeArgAt(1));
352 return Bool::Get(a.referent() == b.referent()); 441 return Bool::Get(a.referent() == b.referent());
353 } 442 }
354 443
355 444
356 DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) { 445 DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) {
357 const MirrorReference& decl_ref = 446 const MirrorReference& decl_ref =
358 MirrorReference::CheckedHandle(arguments->NativeArgAt(0)); 447 MirrorReference::CheckedHandle(arguments->NativeArgAt(0));
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 ASSERT(!closure.IsNull()); 923 ASSERT(!closure.IsNull());
835 924
836 Function& function = Function::Handle(); 925 Function& function = Function::Handle();
837 bool callable = closure.IsCallable(&function, NULL); 926 bool callable = closure.IsCallable(&function, NULL);
838 ASSERT(callable); 927 ASSERT(callable);
839 928
840 return CreateMethodMirror(function, Instance::null_instance()); 929 return CreateMethodMirror(function, Instance::null_instance());
841 } 930 }
842 931
843 932
844 static void ThrowNoSuchMethod(const Instance& receiver,
845 const String& function_name,
846 const Function& function,
847 const InvocationMirror::Call call,
848 const InvocationMirror::Type type) {
849 const Smi& invocation_type = Smi::Handle(Smi::New(
850 InvocationMirror::EncodeType(call, type)));
851
852 const Array& args = Array::Handle(Array::New(6));
853 args.SetAt(0, receiver);
854 args.SetAt(1, function_name);
855 args.SetAt(2, invocation_type);
856 if (!function.IsNull()) {
857 const int total_num_parameters = function.NumParameters();
858 const Array& array = Array::Handle(Array::New(total_num_parameters));
859 String& param_name = String::Handle();
860 for (int i = 0; i < total_num_parameters; i++) {
861 param_name = function.ParameterNameAt(i);
862 array.SetAt(i, param_name);
863 }
864 args.SetAt(5, array);
865 }
866
867 Exceptions::ThrowByType(Exceptions::kNoSuchMethod, args);
868 UNREACHABLE();
869 }
870
871
872 static void ThrowNoSuchMethod(const Class& klass,
873 const String& function_name,
874 const Function& function,
875 const InvocationMirror::Call call,
876 const InvocationMirror::Type type) {
877 AbstractType& runtime_type = AbstractType::Handle(RawTypeOfClass(klass));
878
879 ThrowNoSuchMethod(runtime_type,
880 function_name,
881 function,
882 call,
883 type);
884 UNREACHABLE();
885 }
886
887
888 static void ThrowNoSuchMethod(const Library& library,
889 const String& function_name,
890 const Function& function,
891 const InvocationMirror::Call call,
892 const InvocationMirror::Type type) {
893 ThrowNoSuchMethod(Instance::null_instance(),
894 function_name,
895 function,
896 call,
897 type);
898 UNREACHABLE();
899 }
900
901
902 DEFINE_NATIVE_ENTRY(ClassMirror_invoke, 4) { 933 DEFINE_NATIVE_ENTRY(ClassMirror_invoke, 4) {
903 // Argument 0 is the mirror, which is unused by the native. It exists 934 // Argument 0 is the mirror, which is unused by the native. It exists
904 // because this native is an instance method in order to be polymorphic 935 // because this native is an instance method in order to be polymorphic
905 // with its cousins. 936 // with its cousins.
906 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); 937 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
907 const Class& klass = Class::Handle(ref.GetClassReferent()); 938 const Class& klass = Class::Handle(ref.GetClassReferent());
908 GET_NON_NULL_NATIVE_ARGUMENT( 939 GET_NON_NULL_NATIVE_ARGUMENT(
909 String, function_name, arguments->NativeArgAt(2)); 940 String, function_name, arguments->NativeArgAt(2));
910 GET_NON_NULL_NATIVE_ARGUMENT( 941 GET_NON_NULL_NATIVE_ARGUMENT(
911 Array, positional_args, arguments->NativeArgAt(3)); 942 Array, positional_args, arguments->NativeArgAt(3));
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
1301 } 1332 }
1302 1333
1303 1334
1304 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { 1335 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) {
1305 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); 1336 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
1306 const Field& field = Field::Handle(ref.GetFieldReferent()); 1337 const Field& field = Field::Handle(ref.GetFieldReferent());
1307 return field.type(); 1338 return field.type();
1308 } 1339 }
1309 1340
1310 } // namespace dart 1341 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/lib/mirrors_impl.dart » ('j') | runtime/lib/mirrors_impl.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698