| 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 "include/dart_api.h" | 5 #include "include/dart_api.h" |
| 6 #include "include/dart_debugger_api.h" | 6 #include "include/dart_debugger_api.h" |
| 7 #include "include/dart_mirrors_api.h" | 7 #include "include/dart_mirrors_api.h" |
| 8 #include "vm/dart_api_impl.h" | 8 #include "vm/dart_api_impl.h" |
| 9 #include "vm/dart_api_state.h" // TODO(11742): Remove with CreateMirrorRef. | 9 #include "vm/dart_api_state.h" // TODO(11742): Remove with CreateMirrorRef. |
| 10 #include "vm/bootstrap_natives.h" | 10 #include "vm/bootstrap_natives.h" |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 Dart_Handle cls_name = NewString("_LazyFunctionTypeMirror"); | 284 Dart_Handle cls_name = NewString("_LazyFunctionTypeMirror"); |
| 285 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL); | 285 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL); |
| 286 | 286 |
| 287 Dart_Handle sig = Dart_ClassGetFunctionTypeSignature(target); | 287 Dart_Handle sig = Dart_ClassGetFunctionTypeSignature(target); |
| 288 Dart_Handle return_type = Dart_FunctionReturnType(sig); | 288 Dart_Handle return_type = Dart_FunctionReturnType(sig); |
| 289 if (Dart_IsError(return_type)) { | 289 if (Dart_IsError(return_type)) { |
| 290 return return_type; | 290 return return_type; |
| 291 } | 291 } |
| 292 | 292 |
| 293 Dart_Handle args[] = { | 293 Dart_Handle args[] = { |
| 294 CreateMirrorReference(target), |
| 294 CreateLazyMirror(return_type), | 295 CreateLazyMirror(return_type), |
| 295 CreateParameterMirrorListUsingApi(sig), | 296 CreateParameterMirrorListUsingApi(sig), |
| 296 }; | 297 }; |
| 297 return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args); | 298 return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args); |
| 298 } else { | 299 } else { |
| 299 Dart_Handle cls_name = NewString("_LazyTypeMirror"); | 300 Dart_Handle cls_name = NewString("_LazyTypeMirror"); |
| 300 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL); | 301 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL); |
| 301 Dart_Handle lib = Dart_ClassGetLibrary(target); | 302 Dart_Handle lib = Dart_ClassGetLibrary(target); |
| 302 Dart_Handle lib_url; | 303 Dart_Handle lib_url; |
| 303 if (Dart_IsNull(lib)) { | 304 if (Dart_IsNull(lib)) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 320 | 321 |
| 321 Dart_Handle args[] = { var_name, owner_mirror }; | 322 Dart_Handle args[] = { var_name, owner_mirror }; |
| 322 return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args); | 323 return Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args); |
| 323 } | 324 } |
| 324 | 325 |
| 325 UNREACHABLE(); | 326 UNREACHABLE(); |
| 326 return Dart_Null(); | 327 return Dart_Null(); |
| 327 } | 328 } |
| 328 | 329 |
| 329 | 330 |
| 330 static Dart_Handle CreateImplementsList(Dart_Handle intf) { | |
| 331 intptr_t len = 0; | |
| 332 Dart_Handle result = Dart_ClassGetInterfaceCount(intf, &len); | |
| 333 if (Dart_IsError(result)) { | |
| 334 return result; | |
| 335 } | |
| 336 | |
| 337 Dart_Handle mirror_list = Dart_NewList(len); | |
| 338 if (Dart_IsError(mirror_list)) { | |
| 339 return mirror_list; | |
| 340 } | |
| 341 | |
| 342 for (intptr_t i = 0; i < len; i++) { | |
| 343 Dart_Handle interface = Dart_ClassGetInterfaceAt(intf, i); | |
| 344 if (Dart_IsError(interface)) { | |
| 345 return interface; | |
| 346 } | |
| 347 Dart_Handle mirror = CreateLazyMirror(interface); | |
| 348 if (Dart_IsError(mirror)) { | |
| 349 return mirror; | |
| 350 } | |
| 351 Dart_Handle result = Dart_ListSetAt(mirror_list, i, mirror); | |
| 352 if (Dart_IsError(result)) { | |
| 353 return result; | |
| 354 } | |
| 355 } | |
| 356 return mirror_list; | |
| 357 } | |
| 358 | |
| 359 | |
| 360 static Dart_Handle CreateTypeVariableMirrorUsingApi(Dart_Handle type_var, | 331 static Dart_Handle CreateTypeVariableMirrorUsingApi(Dart_Handle type_var, |
| 361 Dart_Handle type_var_name, | 332 Dart_Handle type_var_name, |
| 362 Dart_Handle owner_mirror) { | 333 Dart_Handle owner_mirror) { |
| 363 ASSERT(Dart_IsTypeVariable(type_var)); | 334 ASSERT(Dart_IsTypeVariable(type_var)); |
| 364 Dart_Handle cls_name = NewString("_LocalTypeVariableMirrorImpl"); | 335 Dart_Handle cls_name = NewString("_LocalTypeVariableMirrorImpl"); |
| 365 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL); | 336 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL); |
| 366 if (Dart_IsError(type)) { | 337 if (Dart_IsError(type)) { |
| 367 return type; | 338 return type; |
| 368 } | 339 } |
| 369 | 340 |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 // reflection. | 472 // reflection. |
| 502 return CreateTypedefMirror(intf, intf_name, lib_mirror); | 473 return CreateTypedefMirror(intf, intf_name, lib_mirror); |
| 503 } | 474 } |
| 504 | 475 |
| 505 Dart_Handle cls_name = NewString("_LocalClassMirrorImpl"); | 476 Dart_Handle cls_name = NewString("_LocalClassMirrorImpl"); |
| 506 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL); | 477 Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL); |
| 507 if (Dart_IsError(type)) { | 478 if (Dart_IsError(type)) { |
| 508 return type; | 479 return type; |
| 509 } | 480 } |
| 510 | 481 |
| 511 Dart_Handle super_class = Dart_Null(); | |
| 512 // TODO(turnidge): Simplify code, now that default classes have been removed. | |
| 513 Dart_Handle default_class = Dart_Null(); | |
| 514 | |
| 515 Dart_Handle intf_mirror = CreateLazyMirror(intf); | 482 Dart_Handle intf_mirror = CreateLazyMirror(intf); |
| 516 if (Dart_IsError(intf_mirror)) { | 483 if (Dart_IsError(intf_mirror)) { |
| 517 return intf_mirror; | 484 return intf_mirror; |
| 518 } | 485 } |
| 519 Dart_Handle type_var_map = CreateTypeVariableMap(intf, intf_mirror); | 486 Dart_Handle type_var_map = CreateTypeVariableMap(intf, intf_mirror); |
| 520 if (Dart_IsError(type_var_map)) { | 487 if (Dart_IsError(type_var_map)) { |
| 521 return type_var_map; | 488 return type_var_map; |
| 522 } | 489 } |
| 523 | 490 |
| 524 Dart_Handle args[] = { | 491 Dart_Handle args[] = { |
| 525 CreateMirrorReference(intf), | 492 CreateMirrorReference(intf), |
| 526 Dart_Null(), // "name" | 493 Dart_Null(), // "name" |
| 527 Dart_NewBoolean(Dart_IsClass(intf)), | |
| 528 lib_mirror, | |
| 529 super_class, | |
| 530 CreateImplementsList(intf), | |
| 531 CreateLazyMirror(default_class), | |
| 532 type_var_map, | 494 type_var_map, |
| 533 }; | 495 }; |
| 534 Dart_Handle mirror = Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args); | 496 Dart_Handle mirror = Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args); |
| 535 return mirror; | 497 return mirror; |
| 536 } | 498 } |
| 537 | 499 |
| 538 | 500 |
| 539 static RawInstance* CreateMethodMirror(const Function& func, | 501 static RawInstance* CreateMethodMirror(const Function& func, |
| 540 const Instance& owner_mirror) { | 502 const Instance& owner_mirror) { |
| 541 const Array& args = Array::Handle(Array::New(11)); | 503 const Array& args = Array::Handle(Array::New(11)); |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 return CreateLibraryMirror(Library::Handle(klass.library())); | 925 return CreateLibraryMirror(Library::Handle(klass.library())); |
| 964 } | 926 } |
| 965 | 927 |
| 966 | 928 |
| 967 DEFINE_NATIVE_ENTRY(ClassMirror_supertype, 1) { | 929 DEFINE_NATIVE_ENTRY(ClassMirror_supertype, 1) { |
| 968 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 930 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 969 const Class& klass = Class::Handle(ref.GetClassReferent()); | 931 const Class& klass = Class::Handle(ref.GetClassReferent()); |
| 970 return klass.super_type(); | 932 return klass.super_type(); |
| 971 } | 933 } |
| 972 | 934 |
| 935 |
| 936 DEFINE_NATIVE_ENTRY(ClassMirror_interfaces, 1) { |
| 937 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 938 const Class& klass = Class::Handle(ref.GetClassReferent()); |
| 939 |
| 940 const Error& error = Error::Handle(klass.EnsureIsFinalized(isolate)); |
| 941 if (!error.IsNull()) { |
| 942 ThrowInvokeError(error); |
| 943 } |
| 944 |
| 945 return klass.interfaces(); |
| 946 } |
| 947 |
| 948 |
| 973 DEFINE_NATIVE_ENTRY(ClassMirror_members, 2) { | 949 DEFINE_NATIVE_ENTRY(ClassMirror_members, 2) { |
| 974 GET_NON_NULL_NATIVE_ARGUMENT(Instance, | 950 GET_NON_NULL_NATIVE_ARGUMENT(Instance, |
| 975 owner_mirror, | 951 owner_mirror, |
| 976 arguments->NativeArgAt(0)); | 952 arguments->NativeArgAt(0)); |
| 977 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); | 953 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
| 978 const Class& klass = Class::Handle(ref.GetClassReferent()); | 954 const Class& klass = Class::Handle(ref.GetClassReferent()); |
| 979 | 955 |
| 980 const Error& error = Error::Handle(klass.EnsureIsFinalized(isolate)); | 956 const Error& error = Error::Handle(klass.EnsureIsFinalized(isolate)); |
| 981 if (!error.IsNull()) { | 957 if (!error.IsNull()) { |
| 982 ThrowInvokeError(error); | 958 ThrowInvokeError(error); |
| (...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1730 | 1706 |
| 1731 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { | 1707 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { |
| 1732 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); | 1708 GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
| 1733 const Field& field = Field::Handle(ref.GetFieldReferent()); | 1709 const Field& field = Field::Handle(ref.GetFieldReferent()); |
| 1734 | 1710 |
| 1735 const AbstractType& type = AbstractType::Handle(field.type()); | 1711 const AbstractType& type = AbstractType::Handle(field.type()); |
| 1736 return CreateTypeMirror(type); | 1712 return CreateTypeMirror(type); |
| 1737 } | 1713 } |
| 1738 | 1714 |
| 1739 } // namespace dart | 1715 } // namespace dart |
| OLD | NEW |