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

Side by Side Diff: runtime/vm/dart_api_impl.cc

Issue 411633002: Fix for issue 19817 (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 5 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 | « runtime/vm/dart_api_impl.h ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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_mirrors_api.h" 6 #include "include/dart_mirrors_api.h"
7 #include "include/dart_native_api.h" 7 #include "include/dart_native_api.h"
8 8
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "vm/bigint_operations.h" 10 #include "vm/bigint_operations.h"
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 const ReusableObjectHandleScope& reuse, Dart_Handle dart_handle) { 364 const ReusableObjectHandleScope& reuse, Dart_Handle dart_handle) {
365 Object& ref = reuse.Handle(); 365 Object& ref = reuse.Handle();
366 ref = Api::UnwrapHandle(dart_handle); 366 ref = Api::UnwrapHandle(dart_handle);
367 if (ref.IsInstance()) { 367 if (ref.IsInstance()) {
368 return Instance::Cast(ref); 368 return Instance::Cast(ref);
369 } 369 }
370 return Object::null_instance(); 370 return Object::null_instance();
371 } 371 }
372 372
373 373
374 Dart_Handle Api::CheckIsolateState(Isolate* isolate) { 374 Dart_Handle Api::CheckAndFinalizePendingClasses(Isolate* isolate) {
375 if (!isolate->AllowClassFinalization()) { 375 if (!isolate->AllowClassFinalization()) {
376 // Class finalization is blocked for the isolate. Do nothing. 376 // Class finalization is blocked for the isolate. Do nothing.
377 return Api::Success(); 377 return Api::Success();
378 } 378 }
379 if (ClassFinalizer::ProcessPendingClasses()) { 379 if (ClassFinalizer::ProcessPendingClasses()) {
380 return Api::Success(); 380 return Api::Success();
381 } 381 }
382 ASSERT(isolate->object_store()->sticky_error() != Object::null()); 382 ASSERT(isolate->object_store()->sticky_error() != Object::null());
383 return Api::NewHandle(isolate, isolate->object_store()->sticky_error()); 383 return Api::NewHandle(isolate, isolate->object_store()->sticky_error());
384 } 384 }
(...skipping 1008 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 intptr_t* size) { 1393 intptr_t* size) {
1394 Isolate* isolate = Isolate::Current(); 1394 Isolate* isolate = Isolate::Current();
1395 DARTSCOPE(isolate); 1395 DARTSCOPE(isolate);
1396 TIMERSCOPE(isolate, time_creating_snapshot); 1396 TIMERSCOPE(isolate, time_creating_snapshot);
1397 if (buffer == NULL) { 1397 if (buffer == NULL) {
1398 RETURN_NULL_ERROR(buffer); 1398 RETURN_NULL_ERROR(buffer);
1399 } 1399 }
1400 if (size == NULL) { 1400 if (size == NULL) {
1401 RETURN_NULL_ERROR(size); 1401 RETURN_NULL_ERROR(size);
1402 } 1402 }
1403 Dart_Handle state = Api::CheckIsolateState(isolate); 1403 // Finalize all classes if needed.
1404 Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate);
1404 if (::Dart_IsError(state)) { 1405 if (::Dart_IsError(state)) {
1405 return state; 1406 return state;
1406 } 1407 }
1407 // Since this is only a snapshot the root library should not be set. 1408 // Since this is only a snapshot the root library should not be set.
1408 isolate->object_store()->set_root_library(Library::Handle(isolate)); 1409 isolate->object_store()->set_root_library(Library::Handle(isolate));
1409 FullSnapshotWriter writer(buffer, ApiReallocate); 1410 FullSnapshotWriter writer(buffer, ApiReallocate);
1410 writer.WriteFullSnapshot(); 1411 writer.WriteFullSnapshot();
1411 *size = writer.BytesWritten(); 1412 *size = writer.BytesWritten();
1412 return Api::Success(); 1413 return Api::Success();
1413 } 1414 }
1414 1415
1415 1416
1416 DART_EXPORT Dart_Handle Dart_CreateScriptSnapshot(uint8_t** buffer, 1417 DART_EXPORT Dart_Handle Dart_CreateScriptSnapshot(uint8_t** buffer,
1417 intptr_t* size) { 1418 intptr_t* size) {
1418 Isolate* isolate = Isolate::Current(); 1419 Isolate* isolate = Isolate::Current();
1419 DARTSCOPE(isolate); 1420 DARTSCOPE(isolate);
1420 TIMERSCOPE(isolate, time_creating_snapshot); 1421 TIMERSCOPE(isolate, time_creating_snapshot);
1421 if (buffer == NULL) { 1422 if (buffer == NULL) {
1422 RETURN_NULL_ERROR(buffer); 1423 RETURN_NULL_ERROR(buffer);
1423 } 1424 }
1424 if (size == NULL) { 1425 if (size == NULL) {
1425 RETURN_NULL_ERROR(size); 1426 RETURN_NULL_ERROR(size);
1426 } 1427 }
1427 Dart_Handle state = Api::CheckIsolateState(isolate); 1428 // Finalize all classes if needed.
1429 Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate);
1428 if (::Dart_IsError(state)) { 1430 if (::Dart_IsError(state)) {
1429 return state; 1431 return state;
1430 } 1432 }
1431 Library& library = 1433 Library& library =
1432 Library::Handle(isolate, isolate->object_store()->root_library()); 1434 Library::Handle(isolate, isolate->object_store()->root_library());
1433 if (library.IsNull()) { 1435 if (library.IsNull()) {
1434 return 1436 return
1435 Api::NewError("%s expects the isolate to have a script loaded in it.", 1437 Api::NewError("%s expects the isolate to have a script loaded in it.",
1436 CURRENT_FUNC); 1438 CURRENT_FUNC);
1437 } 1439 }
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
1708 Dart_Handle type, 1710 Dart_Handle type,
1709 bool* value) { 1711 bool* value) {
1710 Isolate* isolate = Isolate::Current(); 1712 Isolate* isolate = Isolate::Current();
1711 DARTSCOPE(isolate); 1713 DARTSCOPE(isolate);
1712 1714
1713 const Type& type_obj = Api::UnwrapTypeHandle(isolate, type); 1715 const Type& type_obj = Api::UnwrapTypeHandle(isolate, type);
1714 if (type_obj.IsNull()) { 1716 if (type_obj.IsNull()) {
1715 *value = false; 1717 *value = false;
1716 RETURN_TYPE_ERROR(isolate, type, Type); 1718 RETURN_TYPE_ERROR(isolate, type, Type);
1717 } 1719 }
1720 if (!type_obj.IsFinalized()) {
1721 return Api::NewError(
1722 "%s expects argument 'type' to be a fully resolved type.",
1723 CURRENT_FUNC);
1724 }
1718 if (object == Api::Null()) { 1725 if (object == Api::Null()) {
1719 *value = false; 1726 *value = false;
1720 return Api::Success(); 1727 return Api::Success();
1721 } 1728 }
1722 const Instance& instance = Api::UnwrapInstanceHandle(isolate, object); 1729 const Instance& instance = Api::UnwrapInstanceHandle(isolate, object);
1723 if (instance.IsNull()) { 1730 if (instance.IsNull()) {
1724 *value = false; 1731 *value = false;
1725 RETURN_TYPE_ERROR(isolate, object, Instance); 1732 RETURN_TYPE_ERROR(isolate, object, Instance);
1726 } 1733 }
1727 // Finalize all classes.
1728 Dart_Handle state = Api::CheckIsolateState(isolate);
1729 if (::Dart_IsError(state)) {
1730 *value = false;
1731 return state;
1732 }
1733 CHECK_CALLBACK_STATE(isolate); 1734 CHECK_CALLBACK_STATE(isolate);
1734 Error& malformed_type_error = Error::Handle(isolate); 1735 Error& malformed_type_error = Error::Handle(isolate);
1735 *value = instance.IsInstanceOf(type_obj, 1736 *value = instance.IsInstanceOf(type_obj,
1736 Object::null_type_arguments(), 1737 Object::null_type_arguments(),
1737 &malformed_type_error); 1738 &malformed_type_error);
1738 ASSERT(malformed_type_error.IsNull()); // Type was created from a class. 1739 ASSERT(malformed_type_error.IsNull()); // Type was created from a class.
1739 return Api::Success(); 1740 return Api::Success();
1740 } 1741 }
1741 1742
1742 1743
(...skipping 1756 matching lines...) Expand 10 before | Expand all | Expand 10 after
3499 CURRENT_FUNC); 3500 CURRENT_FUNC);
3500 } 3501 }
3501 3502
3502 // Get the class to instantiate. 3503 // Get the class to instantiate.
3503 Object& unchecked_type = Object::Handle(Api::UnwrapHandle(type)); 3504 Object& unchecked_type = Object::Handle(Api::UnwrapHandle(type));
3504 if (unchecked_type.IsNull() || !unchecked_type.IsType()) { 3505 if (unchecked_type.IsNull() || !unchecked_type.IsType()) {
3505 RETURN_TYPE_ERROR(isolate, type, Type); 3506 RETURN_TYPE_ERROR(isolate, type, Type);
3506 } 3507 }
3507 Type& type_obj = Type::Handle(); 3508 Type& type_obj = Type::Handle();
3508 type_obj ^= unchecked_type.raw(); 3509 type_obj ^= unchecked_type.raw();
3510 if (!type_obj.IsFinalized()) {
3511 return Api::NewError(
3512 "%s expects argument 'type' to be a fully resolved type.",
3513 CURRENT_FUNC);
3514 }
3509 Class& cls = Class::Handle(isolate, type_obj.type_class()); 3515 Class& cls = Class::Handle(isolate, type_obj.type_class());
3510 TypeArguments& type_arguments = 3516 TypeArguments& type_arguments =
3511 TypeArguments::Handle(isolate, type_obj.arguments()); 3517 TypeArguments::Handle(isolate, type_obj.arguments());
3512 3518
3513 const String& base_constructor_name = String::Handle(isolate, cls.Name()); 3519 const String& base_constructor_name = String::Handle(isolate, cls.Name());
3514 3520
3515 // And get the name of the constructor to invoke. 3521 // And get the name of the constructor to invoke.
3516 String& dot_name = String::Handle(isolate); 3522 String& dot_name = String::Handle(isolate);
3517 result = Api::UnwrapHandle(constructor_name); 3523 result = Api::UnwrapHandle(constructor_name);
3518 if (result.IsNull()) { 3524 if (result.IsNull()) {
3519 dot_name = Symbols::Dot().raw(); 3525 dot_name = Symbols::Dot().raw();
3520 } else if (result.IsString()) { 3526 } else if (result.IsString()) {
3521 dot_name = String::Concat(Symbols::Dot(), String::Cast(result)); 3527 dot_name = String::Concat(Symbols::Dot(), String::Cast(result));
3522 } else { 3528 } else {
3523 RETURN_TYPE_ERROR(isolate, constructor_name, String); 3529 RETURN_TYPE_ERROR(isolate, constructor_name, String);
3524 } 3530 }
3525 Dart_Handle state = Api::CheckIsolateState(isolate);
3526 if (::Dart_IsError(state)) {
3527 return state;
3528 }
3529 3531
3530 // Resolve the constructor. 3532 // Resolve the constructor.
3531 String& constr_name = 3533 String& constr_name =
3532 String::Handle(String::Concat(base_constructor_name, dot_name)); 3534 String::Handle(String::Concat(base_constructor_name, dot_name));
3533 result = ResolveConstructor("Dart_New", 3535 result = ResolveConstructor("Dart_New",
3534 cls, 3536 cls,
3535 base_constructor_name, 3537 base_constructor_name,
3536 constr_name, 3538 constr_name,
3537 number_of_arguments); 3539 number_of_arguments);
3538 if (result.IsError()) { 3540 if (result.IsError()) {
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
3746 } 3748 }
3747 const String& constructor_name = Api::UnwrapStringHandle(isolate, name); 3749 const String& constructor_name = Api::UnwrapStringHandle(isolate, name);
3748 if (constructor_name.IsNull()) { 3750 if (constructor_name.IsNull()) {
3749 RETURN_TYPE_ERROR(isolate, name, String); 3751 RETURN_TYPE_ERROR(isolate, name, String);
3750 } 3752 }
3751 const Instance& instance = Api::UnwrapInstanceHandle(isolate, object); 3753 const Instance& instance = Api::UnwrapInstanceHandle(isolate, object);
3752 if (instance.IsNull()) { 3754 if (instance.IsNull()) {
3753 RETURN_TYPE_ERROR(isolate, object, Instance); 3755 RETURN_TYPE_ERROR(isolate, object, Instance);
3754 } 3756 }
3755 3757
3756 // Since we have allocated an object it would mean that all classes 3758 // Since we have allocated an object it would mean that the type
3757 // are finalized and hence it is not necessary to call 3759 // is finalized.
3758 // Api::CheckIsolateState.
3759 // TODO(asiva): How do we ensure that a constructor is not called more than 3760 // TODO(asiva): How do we ensure that a constructor is not called more than
3760 // once for the same object. 3761 // once for the same object.
3761 3762
3762 // Construct name of the constructor to invoke. 3763 // Construct name of the constructor to invoke.
3763 const Type& type_obj = Type::Handle(isolate, instance.GetType()); 3764 const Type& type_obj = Type::Handle(isolate, instance.GetType());
3764 const Class& cls = Class::Handle(isolate, type_obj.type_class()); 3765 const Class& cls = Class::Handle(isolate, type_obj.type_class());
3765 const String& class_name = String::Handle(isolate, cls.Name()); 3766 const String& class_name = String::Handle(isolate, cls.Name());
3766 const Array& strings = Array::Handle(Array::New(3)); 3767 const Array& strings = Array::Handle(Array::New(3));
3767 strings.SetAt(0, class_name); 3768 strings.SetAt(0, class_name);
3768 strings.SetAt(1, Symbols::Dot()); 3769 strings.SetAt(1, Symbols::Dot());
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
3834 "%s expects argument 'number_of_arguments' to be non-negative.", 3835 "%s expects argument 'number_of_arguments' to be non-negative.",
3835 CURRENT_FUNC); 3836 CURRENT_FUNC);
3836 } 3837 }
3837 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(target)); 3838 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(target));
3838 if (obj.IsError()) { 3839 if (obj.IsError()) {
3839 return target; 3840 return target;
3840 } 3841 }
3841 Dart_Handle result; 3842 Dart_Handle result;
3842 Array& args = Array::Handle(isolate); 3843 Array& args = Array::Handle(isolate);
3843 if (obj.IsType()) { 3844 if (obj.IsType()) {
3844 // Finalize all classes. 3845 if (!Type::Cast(obj).IsFinalized()) {
3845 Dart_Handle state = Api::CheckIsolateState(isolate); 3846 return Api::NewError(
3846 if (::Dart_IsError(state)) { 3847 "%s expects argument 'target' to be a fully resolved type.",
3847 return state; 3848 CURRENT_FUNC);
3848 } 3849 }
3849 3850
3850 const Class& cls = Class::Handle(isolate, Type::Cast(obj).type_class()); 3851 const Class& cls = Class::Handle(isolate, Type::Cast(obj).type_class());
3851 const Function& function = Function::Handle( 3852 const Function& function = Function::Handle(
3852 isolate, 3853 isolate,
3853 Resolver::ResolveStatic(cls, 3854 Resolver::ResolveStatic(cls,
3854 function_name, 3855 function_name,
3855 number_of_arguments, 3856 number_of_arguments,
3856 Object::empty_array())); 3857 Object::empty_array()));
3857 if (function.IsNull()) { 3858 if (function.IsNull()) {
3858 const String& cls_name = String::Handle(isolate, cls.Name()); 3859 const String& cls_name = String::Handle(isolate, cls.Name());
3859 return Api::NewError("%s: did not find static method '%s.%s'.", 3860 return Api::NewError("%s: did not find static method '%s.%s'.",
3860 CURRENT_FUNC, 3861 CURRENT_FUNC,
3861 cls_name.ToCString(), 3862 cls_name.ToCString(),
3862 function_name.ToCString()); 3863 function_name.ToCString());
3863 } 3864 }
3864 // Setup args and check for malformed arguments in the arguments list. 3865 // Setup args and check for malformed arguments in the arguments list.
3865 result = SetupArguments(isolate, number_of_arguments, arguments, 0, &args); 3866 result = SetupArguments(isolate, number_of_arguments, arguments, 0, &args);
3866 if (!::Dart_IsError(result)) { 3867 if (!::Dart_IsError(result)) {
3867 result = Api::NewHandle(isolate, 3868 result = Api::NewHandle(isolate,
3868 DartEntry::InvokeFunction(function, args)); 3869 DartEntry::InvokeFunction(function, args));
3869 } 3870 }
3870 return result; 3871 return result;
3871 } else if (obj.IsNull() || obj.IsInstance()) { 3872 } else if (obj.IsNull() || obj.IsInstance()) {
3872 // Since we have allocated an object it would mean that all classes 3873 // Since we have allocated an object it would mean that the type of the
3873 // are finalized and hence it is not necessary to call 3874 // receiver is already resolved and finalized, hence it is not necessary
3874 // Api::CheckIsolateState. 3875 // to check here.
3875 Instance& instance = Instance::Handle(isolate); 3876 Instance& instance = Instance::Handle(isolate);
3876 instance ^= obj.raw(); 3877 instance ^= obj.raw();
3877 ArgumentsDescriptor args_desc( 3878 ArgumentsDescriptor args_desc(
3878 Array::Handle(ArgumentsDescriptor::New(number_of_arguments + 1))); 3879 Array::Handle(ArgumentsDescriptor::New(number_of_arguments + 1)));
3879 const Function& function = Function::Handle( 3880 const Function& function = Function::Handle(
3880 isolate, 3881 isolate,
3881 Resolver::ResolveDynamic(instance, function_name, args_desc)); 3882 Resolver::ResolveDynamic(instance, function_name, args_desc));
3882 if (function.IsNull()) { 3883 if (function.IsNull()) {
3883 // Setup args and check for malformed arguments in the arguments list. 3884 // Setup args and check for malformed arguments in the arguments list.
3884 result = SetupArguments(isolate, 3885 result = SetupArguments(isolate,
(...skipping 18 matching lines...) Expand all
3903 if (!::Dart_IsError(result)) { 3904 if (!::Dart_IsError(result)) {
3904 args.SetAt(0, instance); 3905 args.SetAt(0, instance);
3905 result = Api::NewHandle(isolate, 3906 result = Api::NewHandle(isolate,
3906 DartEntry::InvokeFunction(function, args)); 3907 DartEntry::InvokeFunction(function, args));
3907 } 3908 }
3908 return result; 3909 return result;
3909 } else if (obj.IsLibrary()) { 3910 } else if (obj.IsLibrary()) {
3910 // Check whether class finalization is needed. 3911 // Check whether class finalization is needed.
3911 const Library& lib = Library::Cast(obj); 3912 const Library& lib = Library::Cast(obj);
3912 3913
3913 // Finalize all classes if needed. 3914 // Check that the library is loaded.
3914 Dart_Handle state = Api::CheckIsolateState(isolate); 3915 if (!lib.Loaded()) {
3915 if (::Dart_IsError(state)) { 3916 return Api::NewError(
3916 return state; 3917 "%s expects library argument 'target' to be loaded.",
3918 CURRENT_FUNC);
3917 } 3919 }
3918 3920
3919 const Function& function = 3921 const Function& function =
3920 Function::Handle(isolate, 3922 Function::Handle(isolate,
3921 lib.LookupFunctionAllowPrivate(function_name)); 3923 lib.LookupFunctionAllowPrivate(function_name));
3922 if (function.IsNull()) { 3924 if (function.IsNull()) {
3923 return Api::NewError("%s: did not find top-level function '%s'.", 3925 return Api::NewError("%s: did not find top-level function '%s'.",
3924 CURRENT_FUNC, 3926 CURRENT_FUNC,
3925 function_name.ToCString()); 3927 function_name.ToCString());
3926 } 3928 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
3987 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) { 3989 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) {
3988 Isolate* isolate = Isolate::Current(); 3990 Isolate* isolate = Isolate::Current();
3989 DARTSCOPE(isolate); 3991 DARTSCOPE(isolate);
3990 CHECK_CALLBACK_STATE(isolate); 3992 CHECK_CALLBACK_STATE(isolate);
3991 3993
3992 const String& field_name = Api::UnwrapStringHandle(isolate, name); 3994 const String& field_name = Api::UnwrapStringHandle(isolate, name);
3993 if (field_name.IsNull()) { 3995 if (field_name.IsNull()) {
3994 RETURN_TYPE_ERROR(isolate, name, String); 3996 RETURN_TYPE_ERROR(isolate, name, String);
3995 } 3997 }
3996 3998
3997 // Finalize all classes.
3998 Dart_Handle state = Api::CheckIsolateState(isolate);
3999 if (::Dart_IsError(state)) {
4000 return state;
4001 }
4002
4003 Field& field = Field::Handle(isolate); 3999 Field& field = Field::Handle(isolate);
4004 Function& getter = Function::Handle(isolate); 4000 Function& getter = Function::Handle(isolate);
4005 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(container)); 4001 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(container));
4006 if (obj.IsNull()) { 4002 if (obj.IsNull()) {
4007 return Api::NewError("%s expects argument 'container' to be non-null.", 4003 return Api::NewError("%s expects argument 'container' to be non-null.",
4008 CURRENT_FUNC); 4004 CURRENT_FUNC);
4009 } else if (obj.IsType()) { 4005 } else if (obj.IsType()) {
4006 if (!Type::Cast(obj).IsFinalized()) {
4007 return Api::NewError(
4008 "%s expects argument 'container' to be a fully resolved type.",
4009 CURRENT_FUNC);
4010 }
4010 // To access a static field we may need to use the Field or the 4011 // To access a static field we may need to use the Field or the
4011 // getter Function. 4012 // getter Function.
4012 Class& cls = Class::Handle(isolate, Type::Cast(obj).type_class()); 4013 Class& cls = Class::Handle(isolate, Type::Cast(obj).type_class());
4013 4014
4014 field = cls.LookupStaticField(field_name); 4015 field = cls.LookupStaticField(field_name);
4015 if (field.IsNull() || field.IsUninitialized()) { 4016 if (field.IsNull() || field.IsUninitialized()) {
4016 const String& getter_name = 4017 const String& getter_name =
4017 String::Handle(isolate, Field::GetterName(field_name)); 4018 String::Handle(isolate, Field::GetterName(field_name));
4018 getter = cls.LookupStaticFunctionAllowPrivate(getter_name); 4019 getter = cls.LookupStaticFunctionAllowPrivate(getter_name);
4019 } 4020 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4058 args, 4059 args,
4059 args_descriptor)); 4060 args_descriptor));
4060 } 4061 }
4061 return Api::NewHandle(isolate, DartEntry::InvokeFunction(getter, args)); 4062 return Api::NewHandle(isolate, DartEntry::InvokeFunction(getter, args));
4062 4063
4063 } else if (obj.IsLibrary()) { 4064 } else if (obj.IsLibrary()) {
4064 // To access a top-level we may need to use the Field or the 4065 // To access a top-level we may need to use the Field or the
4065 // getter Function. The getter function may either be in the 4066 // getter Function. The getter function may either be in the
4066 // library or in the field's owner class, depending. 4067 // library or in the field's owner class, depending.
4067 const Library& lib = Library::Cast(obj); 4068 const Library& lib = Library::Cast(obj);
4069 // Check that the library is loaded.
4070 if (!lib.Loaded()) {
4071 return Api::NewError(
4072 "%s expects library argument 'container' to be loaded.",
4073 CURRENT_FUNC);
4074 }
4068 field = lib.LookupFieldAllowPrivate(field_name); 4075 field = lib.LookupFieldAllowPrivate(field_name);
4069 if (field.IsNull()) { 4076 if (field.IsNull()) {
4070 // No field found and no ambiguity error. Check for a getter in the lib. 4077 // No field found and no ambiguity error. Check for a getter in the lib.
4071 const String& getter_name = 4078 const String& getter_name =
4072 String::Handle(isolate, Field::GetterName(field_name)); 4079 String::Handle(isolate, Field::GetterName(field_name));
4073 getter = lib.LookupFunctionAllowPrivate(getter_name); 4080 getter = lib.LookupFunctionAllowPrivate(getter_name);
4074 } else if (!field.IsNull() && field.IsUninitialized()) { 4081 } else if (!field.IsNull() && field.IsUninitialized()) {
4075 // A field was found. Check for a getter in the field's owner classs. 4082 // A field was found. Check for a getter in the field's owner classs.
4076 const Class& cls = Class::Handle(isolate, field.owner()); 4083 const Class& cls = Class::Handle(isolate, field.owner());
4077 const String& getter_name = 4084 const String& getter_name =
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4113 } 4120 }
4114 4121
4115 // Since null is allowed for value, we don't use UnwrapInstanceHandle. 4122 // Since null is allowed for value, we don't use UnwrapInstanceHandle.
4116 const Object& value_obj = Object::Handle(isolate, Api::UnwrapHandle(value)); 4123 const Object& value_obj = Object::Handle(isolate, Api::UnwrapHandle(value));
4117 if (!value_obj.IsNull() && !value_obj.IsInstance()) { 4124 if (!value_obj.IsNull() && !value_obj.IsInstance()) {
4118 RETURN_TYPE_ERROR(isolate, value, Instance); 4125 RETURN_TYPE_ERROR(isolate, value, Instance);
4119 } 4126 }
4120 Instance& value_instance = Instance::Handle(isolate); 4127 Instance& value_instance = Instance::Handle(isolate);
4121 value_instance ^= value_obj.raw(); 4128 value_instance ^= value_obj.raw();
4122 4129
4123 // Finalize all classes.
4124 Dart_Handle state = Api::CheckIsolateState(isolate);
4125 if (::Dart_IsError(state)) {
4126 return state;
4127 }
4128 Field& field = Field::Handle(isolate); 4130 Field& field = Field::Handle(isolate);
4129 Function& setter = Function::Handle(isolate); 4131 Function& setter = Function::Handle(isolate);
4130 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(container)); 4132 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(container));
4131 if (obj.IsNull()) { 4133 if (obj.IsNull()) {
4132 return Api::NewError("%s expects argument 'container' to be non-null.", 4134 return Api::NewError("%s expects argument 'container' to be non-null.",
4133 CURRENT_FUNC); 4135 CURRENT_FUNC);
4134 } else if (obj.IsType()) { 4136 } else if (obj.IsType()) {
4137 if (!Type::Cast(obj).IsFinalized()) {
4138 return Api::NewError(
4139 "%s expects argument 'container' to be a fully resolved type.",
4140 CURRENT_FUNC);
4141 }
4142
4135 // To access a static field we may need to use the Field or the 4143 // To access a static field we may need to use the Field or the
4136 // setter Function. 4144 // setter Function.
4137 Class& cls = Class::Handle(isolate, Type::Cast(obj).type_class()); 4145 Class& cls = Class::Handle(isolate, Type::Cast(obj).type_class());
4138 4146
4139 field = cls.LookupStaticField(field_name); 4147 field = cls.LookupStaticField(field_name);
4140 if (field.IsNull()) { 4148 if (field.IsNull()) {
4141 String& setter_name = 4149 String& setter_name =
4142 String::Handle(isolate, Field::SetterName(field_name)); 4150 String::Handle(isolate, Field::SetterName(field_name));
4143 setter = cls.LookupStaticFunctionAllowPrivate(setter_name); 4151 setter = cls.LookupStaticFunctionAllowPrivate(setter_name);
4144 } 4152 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
4203 args, 4211 args,
4204 args_descriptor)); 4212 args_descriptor));
4205 } 4213 }
4206 return Api::NewHandle(isolate, DartEntry::InvokeFunction(setter, args)); 4214 return Api::NewHandle(isolate, DartEntry::InvokeFunction(setter, args));
4207 4215
4208 } else if (obj.IsLibrary()) { 4216 } else if (obj.IsLibrary()) {
4209 // To access a top-level we may need to use the Field or the 4217 // To access a top-level we may need to use the Field or the
4210 // setter Function. The setter function may either be in the 4218 // setter Function. The setter function may either be in the
4211 // library or in the field's owner class, depending. 4219 // library or in the field's owner class, depending.
4212 const Library& lib = Library::Cast(obj); 4220 const Library& lib = Library::Cast(obj);
4221 // Check that the library is loaded.
4222 if (!lib.Loaded()) {
4223 return Api::NewError(
4224 "%s expects library argument 'container' to be loaded.",
4225 CURRENT_FUNC);
4226 }
4213 field = lib.LookupFieldAllowPrivate(field_name); 4227 field = lib.LookupFieldAllowPrivate(field_name);
4214 if (field.IsNull()) { 4228 if (field.IsNull()) {
4215 const String& setter_name = 4229 const String& setter_name =
4216 String::Handle(isolate, Field::SetterName(field_name)); 4230 String::Handle(isolate, Field::SetterName(field_name));
4217 setter ^= lib.LookupFunctionAllowPrivate(setter_name); 4231 setter ^= lib.LookupFunctionAllowPrivate(setter_name);
4218 } 4232 }
4219 4233
4220 if (!setter.IsNull()) { 4234 if (!setter.IsNull()) {
4221 // Invoke the setter and return the result. 4235 // Invoke the setter and return the result.
4222 const int kNumArgs = 1; 4236 const int kNumArgs = 1;
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after
4913 intptr_t number_of_type_arguments, 4927 intptr_t number_of_type_arguments,
4914 Dart_Handle* type_arguments) { 4928 Dart_Handle* type_arguments) {
4915 Isolate* isolate = Isolate::Current(); 4929 Isolate* isolate = Isolate::Current();
4916 DARTSCOPE(isolate); 4930 DARTSCOPE(isolate);
4917 4931
4918 // Validate the input arguments. 4932 // Validate the input arguments.
4919 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 4933 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
4920 if (lib.IsNull()) { 4934 if (lib.IsNull()) {
4921 RETURN_TYPE_ERROR(isolate, library, Library); 4935 RETURN_TYPE_ERROR(isolate, library, Library);
4922 } 4936 }
4937 if (!lib.Loaded()) {
4938 return Api::NewError(
4939 "%s expects library argument 'library' to be loaded.",
4940 CURRENT_FUNC);
4941 }
4923 const String& name_str = Api::UnwrapStringHandle(isolate, class_name); 4942 const String& name_str = Api::UnwrapStringHandle(isolate, class_name);
4924 if (name_str.IsNull()) { 4943 if (name_str.IsNull()) {
4925 RETURN_TYPE_ERROR(isolate, class_name, String); 4944 RETURN_TYPE_ERROR(isolate, class_name, String);
4926 } 4945 }
4927 // Ensure all classes are finalized.
4928 Dart_Handle state = Api::CheckIsolateState(isolate);
4929 if (::Dart_IsError(state)) {
4930 return state;
4931 }
4932 const Class& cls = 4946 const Class& cls =
4933 Class::Handle(isolate, lib.LookupClassAllowPrivate(name_str)); 4947 Class::Handle(isolate, lib.LookupClassAllowPrivate(name_str));
4934 if (cls.IsNull()) { 4948 if (cls.IsNull()) {
4935 const String& lib_name = String::Handle(isolate, lib.name()); 4949 const String& lib_name = String::Handle(isolate, lib.name());
4936 return Api::NewError("Type '%s' not found in library '%s'.", 4950 return Api::NewError("Type '%s' not found in library '%s'.",
4937 name_str.ToCString(), lib_name.ToCString()); 4951 name_str.ToCString(), lib_name.ToCString());
4938 } 4952 }
4939 if (cls.NumTypeArguments() == 0) { 4953 if (cls.NumTypeArguments() == 0) {
4940 if (number_of_type_arguments != 0) { 4954 if (number_of_type_arguments != 0) {
4941 return Api::NewError("Invalid number of type arguments specified, " 4955 return Api::NewError("Invalid number of type arguments specified, "
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
5048 Dart_Handle result; 5062 Dart_Handle result;
5049 CompileSource(isolate, library, script, &result); 5063 CompileSource(isolate, library, script, &result);
5050 // Propagate the error out right now. 5064 // Propagate the error out right now.
5051 if (::Dart_IsError(result)) { 5065 if (::Dart_IsError(result)) {
5052 return result; 5066 return result;
5053 } 5067 }
5054 5068
5055 // If this is the dart:_builtin library, register it with the VM. 5069 // If this is the dart:_builtin library, register it with the VM.
5056 if (url_str.Equals("dart:_builtin")) { 5070 if (url_str.Equals("dart:_builtin")) {
5057 isolate->object_store()->set_builtin_library(library); 5071 isolate->object_store()->set_builtin_library(library);
5058 Dart_Handle state = Api::CheckIsolateState(isolate); 5072 Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate);
5059 if (::Dart_IsError(state)) { 5073 if (::Dart_IsError(state)) {
5060 return state; 5074 return state;
5061 } 5075 }
5062 } 5076 }
5063 return result; 5077 return result;
5064 } 5078 }
5065 5079
5066 5080
5067 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library, 5081 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library,
5068 Dart_Handle import, 5082 Dart_Handle import,
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
5174 Isolate* isolate = Isolate::Current(); 5188 Isolate* isolate = Isolate::Current();
5175 DARTSCOPE(isolate); 5189 DARTSCOPE(isolate);
5176 CHECK_CALLBACK_STATE(isolate); 5190 CHECK_CALLBACK_STATE(isolate);
5177 5191
5178 isolate->DoneLoading(); 5192 isolate->DoneLoading();
5179 5193
5180 // TODO(hausner): move the remaining code below (finalization and 5194 // TODO(hausner): move the remaining code below (finalization and
5181 // invoing of _completeDeferredLoads) into Isolate::DoneLoading(). 5195 // invoing of _completeDeferredLoads) into Isolate::DoneLoading().
5182 5196
5183 // Finalize all classes if needed. 5197 // Finalize all classes if needed.
5184 Dart_Handle state = Api::CheckIsolateState(isolate); 5198 Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate);
5185 if (::Dart_IsError(state)) { 5199 if (::Dart_IsError(state)) {
5186 return state; 5200 return state;
5187 } 5201 }
5188 5202
5189 if (complete_futures) { 5203 if (complete_futures) {
5190 const Library& corelib = Library::Handle(isolate, Library::CoreLibrary()); 5204 const Library& corelib = Library::Handle(isolate, Library::CoreLibrary());
5191 const String& function_name = 5205 const String& function_name =
5192 String::Handle(isolate, String::New("_completeDeferredLoads")); 5206 String::Handle(isolate, String::New("_completeDeferredLoads"));
5193 const Function& function = 5207 const Function& function =
5194 Function::Handle(isolate, 5208 Function::Handle(isolate,
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
5288 5302
5289 5303
5290 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( 5304 DART_EXPORT void Dart_RegisterRootServiceRequestCallback(
5291 const char* name, 5305 const char* name,
5292 Dart_ServiceRequestCallback callback, 5306 Dart_ServiceRequestCallback callback,
5293 void* user_data) { 5307 void* user_data) {
5294 Service::RegisterRootEmbedderCallback(name, callback, user_data); 5308 Service::RegisterRootEmbedderCallback(name, callback, user_data);
5295 } 5309 }
5296 5310
5297 } // namespace dart 5311 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_impl.h ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698