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

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

Issue 1310463005: - Ensure that HandleScope is initialized with a thread. (Remove (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Address review comments Created 5 years, 3 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
« 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/class_finalizer.h" 10 #include "vm/class_finalizer.h"
(...skipping 27 matching lines...) Expand all
38 #include "vm/tags.h" 38 #include "vm/tags.h"
39 #include "vm/thread_registry.h" 39 #include "vm/thread_registry.h"
40 #include "vm/timeline.h" 40 #include "vm/timeline.h"
41 #include "vm/timer.h" 41 #include "vm/timer.h"
42 #include "vm/unicode.h" 42 #include "vm/unicode.h"
43 #include "vm/verifier.h" 43 #include "vm/verifier.h"
44 #include "vm/version.h" 44 #include "vm/version.h"
45 45
46 namespace dart { 46 namespace dart {
47 47
48 // Facilitate quick access to the current zone once we have the curren thread.
49 #define Z (T->zone())
50
51
48 DECLARE_FLAG(bool, load_deferred_eagerly); 52 DECLARE_FLAG(bool, load_deferred_eagerly);
49 DECLARE_FLAG(bool, print_class_table); 53 DECLARE_FLAG(bool, print_class_table);
50 DECLARE_FLAG(bool, verify_handles); 54 DECLARE_FLAG(bool, verify_handles);
51 #if defined(DART_NO_SNAPSHOT) 55 #if defined(DART_NO_SNAPSHOT)
52 DEFINE_FLAG(bool, check_function_fingerprints, true, 56 DEFINE_FLAG(bool, check_function_fingerprints, true,
53 "Check function fingerprints"); 57 "Check function fingerprints");
54 #endif // defined(DART_NO_SNAPSHOT). 58 #endif // defined(DART_NO_SNAPSHOT).
55 DEFINE_FLAG(bool, trace_api, false, 59 DEFINE_FLAG(bool, trace_api, false,
56 "Trace invocation of API calls (debug mode only)"); 60 "Trace invocation of API calls (debug mode only)");
57 DEFINE_FLAG(bool, verify_acquired_data, false, 61 DEFINE_FLAG(bool, verify_acquired_data, false,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 } 113 }
110 114
111 private: 115 private:
112 Class& classHandle_; 116 Class& classHandle_;
113 Function& funcHandle_; 117 Function& funcHandle_;
114 AbstractType& typeHandle_; 118 AbstractType& typeHandle_;
115 }; 119 };
116 #endif // #if defined(DEBUG). 120 #endif // #if defined(DEBUG).
117 121
118 122
119 static RawInstance* GetListInstance(Isolate* isolate, const Object& obj) { 123 static RawInstance* GetListInstance(Zone* zone, const Object& obj) {
120 if (obj.IsInstance()) { 124 if (obj.IsInstance()) {
121 const Library& core_lib = Library::Handle(Library::CoreLibrary()); 125 const Library& core_lib = Library::Handle(zone, Library::CoreLibrary());
122 const Class& list_class = 126 const Class& list_class =
123 Class::Handle(core_lib.LookupClass(Symbols::List())); 127 Class::Handle(zone, core_lib.LookupClass(Symbols::List()));
124 ASSERT(!list_class.IsNull()); 128 ASSERT(!list_class.IsNull());
125 const Instance& instance = Instance::Cast(obj); 129 const Instance& instance = Instance::Cast(obj);
126 const Class& obj_class = Class::Handle(isolate, obj.clazz()); 130 const Class& obj_class = Class::Handle(zone, obj.clazz());
127 Error& malformed_type_error = Error::Handle(isolate); 131 Error& malformed_type_error = Error::Handle(zone);
128 if (obj_class.IsSubtypeOf(Object::null_type_arguments(), 132 if (obj_class.IsSubtypeOf(Object::null_type_arguments(),
129 list_class, 133 list_class,
130 Object::null_type_arguments(), 134 Object::null_type_arguments(),
131 &malformed_type_error)) { 135 &malformed_type_error)) {
132 ASSERT(malformed_type_error.IsNull()); // Type is a raw List. 136 ASSERT(malformed_type_error.IsNull()); // Type is a raw List.
133 return instance.raw(); 137 return instance.raw();
134 } 138 }
135 } 139 }
136 return Instance::null(); 140 return Instance::null();
137 } 141 }
138 142
139 static RawInstance* GetMapInstance(Isolate* isolate, const Object& obj) { 143 static RawInstance* GetMapInstance(Zone* zone, const Object& obj) {
140 if (obj.IsInstance()) { 144 if (obj.IsInstance()) {
141 const Library& core_lib = Library::Handle(Library::CoreLibrary()); 145 const Library& core_lib = Library::Handle(zone, Library::CoreLibrary());
142 const Class& map_class = 146 const Class& map_class =
143 Class::Handle(core_lib.LookupClass(Symbols::Map())); 147 Class::Handle(core_lib.LookupClass(Symbols::Map()));
144 ASSERT(!map_class.IsNull()); 148 ASSERT(!map_class.IsNull());
145 const Instance& instance = Instance::Cast(obj); 149 const Instance& instance = Instance::Cast(obj);
146 const Class& obj_class = Class::Handle(isolate, obj.clazz()); 150 const Class& obj_class = Class::Handle(zone, obj.clazz());
147 Error& malformed_type_error = Error::Handle(isolate); 151 Error& malformed_type_error = Error::Handle(zone);
148 if (obj_class.IsSubtypeOf(Object::null_type_arguments(), 152 if (obj_class.IsSubtypeOf(Object::null_type_arguments(),
149 map_class, 153 map_class,
150 Object::null_type_arguments(), 154 Object::null_type_arguments(),
151 &malformed_type_error)) { 155 &malformed_type_error)) {
152 ASSERT(malformed_type_error.IsNull()); // Type is a raw Map. 156 ASSERT(malformed_type_error.IsNull()); // Type is a raw Map.
153 return instance.raw(); 157 return instance.raw();
154 } 158 }
155 } 159 }
156 return Instance::null(); 160 return Instance::null();
157 } 161 }
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 return Api::NewHandle(isolate, isolate->object_store()->sticky_error()); 440 return Api::NewHandle(isolate, isolate->object_store()->sticky_error());
437 } 441 }
438 442
439 443
440 Dart_Isolate Api::CastIsolate(Isolate* isolate) { 444 Dart_Isolate Api::CastIsolate(Isolate* isolate) {
441 return reinterpret_cast<Dart_Isolate>(isolate); 445 return reinterpret_cast<Dart_Isolate>(isolate);
442 } 446 }
443 447
444 448
445 Dart_Handle Api::NewError(const char* format, ...) { 449 Dart_Handle Api::NewError(const char* format, ...) {
446 Thread* thread = Thread::Current(); 450 DARTSCOPE(Thread::Current());
447 Isolate* isolate = thread->isolate(); 451 CHECK_CALLBACK_STATE(I);
448 Zone* zone = thread->zone();
449 DARTSCOPE(isolate);
450 CHECK_CALLBACK_STATE(isolate);
451 452
452 va_list args; 453 va_list args;
453 va_start(args, format); 454 va_start(args, format);
454 intptr_t len = OS::VSNPrint(NULL, 0, format, args); 455 intptr_t len = OS::VSNPrint(NULL, 0, format, args);
455 va_end(args); 456 va_end(args);
456 457
457 char* buffer = zone->Alloc<char>(len + 1); 458 char* buffer = Z->Alloc<char>(len + 1);
458 va_list args2; 459 va_list args2;
459 va_start(args2, format); 460 va_start(args2, format);
460 OS::VSNPrint(buffer, (len + 1), format, args2); 461 OS::VSNPrint(buffer, (len + 1), format, args2);
461 va_end(args2); 462 va_end(args2);
462 463
463 const String& message = String::Handle(zone, String::New(buffer)); 464 const String& message = String::Handle(Z, String::New(buffer));
464 return Api::NewHandle(isolate, ApiError::New(message)); 465 return Api::NewHandle(I, ApiError::New(message));
465 } 466 }
466 467
467 468
468 void Api::SetupAcquiredError(Isolate* isolate) { 469 void Api::SetupAcquiredError(Isolate* isolate) {
469 ASSERT(isolate != NULL); 470 ASSERT(isolate != NULL);
470 ApiState* state = isolate->api_state(); 471 ApiState* state = isolate->api_state();
471 ASSERT(state != NULL); 472 ASSERT(state != NULL);
472 state->SetupAcquiredError(); 473 state->SetupAcquiredError();
473 } 474 }
474 475
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 } 739 }
739 740
740 741
741 DART_EXPORT bool Dart_IsFatalError(Dart_Handle object) { 742 DART_EXPORT bool Dart_IsFatalError(Dart_Handle object) {
742 TRACE_API_CALL(CURRENT_FUNC); 743 TRACE_API_CALL(CURRENT_FUNC);
743 return Api::ClassId(object) == kUnwindErrorCid; 744 return Api::ClassId(object) == kUnwindErrorCid;
744 } 745 }
745 746
746 747
747 DART_EXPORT const char* Dart_GetError(Dart_Handle handle) { 748 DART_EXPORT const char* Dart_GetError(Dart_Handle handle) {
748 Isolate* isolate = Isolate::Current(); 749 DARTSCOPE(Thread::Current());
749 DARTSCOPE(isolate); 750 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle));
750 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
751 if (obj.IsError()) { 751 if (obj.IsError()) {
752 const Error& error = Error::Cast(obj); 752 const Error& error = Error::Cast(obj);
753 const char* str = error.ToErrorCString(); 753 const char* str = error.ToErrorCString();
754 intptr_t len = strlen(str) + 1; 754 intptr_t len = strlen(str) + 1;
755 char* str_copy = Api::TopScope(isolate)->zone()->Alloc<char>(len); 755 char* str_copy = Api::TopScope(I)->zone()->Alloc<char>(len);
756 strncpy(str_copy, str, len); 756 strncpy(str_copy, str, len);
757 // Strip a possible trailing '\n'. 757 // Strip a possible trailing '\n'.
758 if ((len > 1) && (str_copy[len - 2] == '\n')) { 758 if ((len > 1) && (str_copy[len - 2] == '\n')) {
759 str_copy[len - 2] = '\0'; 759 str_copy[len - 2] = '\0';
760 } 760 }
761 return str_copy; 761 return str_copy;
762 } else { 762 } else {
763 return ""; 763 return "";
764 } 764 }
765 } 765 }
766 766
767 767
768 DART_EXPORT bool Dart_ErrorHasException(Dart_Handle handle) { 768 DART_EXPORT bool Dart_ErrorHasException(Dart_Handle handle) {
769 Isolate* isolate = Isolate::Current(); 769 DARTSCOPE(Thread::Current());
770 DARTSCOPE(isolate); 770 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle));
771 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
772 return obj.IsUnhandledException(); 771 return obj.IsUnhandledException();
773 } 772 }
774 773
775 774
776 DART_EXPORT Dart_Handle Dart_ErrorGetException(Dart_Handle handle) { 775 DART_EXPORT Dart_Handle Dart_ErrorGetException(Dart_Handle handle) {
777 Isolate* isolate = Isolate::Current(); 776 DARTSCOPE(Thread::Current());
778 DARTSCOPE(isolate); 777 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle));
779 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
780 if (obj.IsUnhandledException()) { 778 if (obj.IsUnhandledException()) {
781 const UnhandledException& error = UnhandledException::Cast(obj); 779 const UnhandledException& error = UnhandledException::Cast(obj);
782 return Api::NewHandle(isolate, error.exception()); 780 return Api::NewHandle(I, error.exception());
783 } else if (obj.IsError()) { 781 } else if (obj.IsError()) {
784 return Api::NewError("This error is not an unhandled exception error."); 782 return Api::NewError("This error is not an unhandled exception error.");
785 } else { 783 } else {
786 return Api::NewError("Can only get exceptions from error handles."); 784 return Api::NewError("Can only get exceptions from error handles.");
787 } 785 }
788 } 786 }
789 787
790 788
791 DART_EXPORT Dart_Handle Dart_ErrorGetStacktrace(Dart_Handle handle) { 789 DART_EXPORT Dart_Handle Dart_ErrorGetStacktrace(Dart_Handle handle) {
792 Isolate* isolate = Isolate::Current(); 790 DARTSCOPE(Thread::Current());
793 DARTSCOPE(isolate); 791 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle));
794 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
795 if (obj.IsUnhandledException()) { 792 if (obj.IsUnhandledException()) {
796 const UnhandledException& error = UnhandledException::Cast(obj); 793 const UnhandledException& error = UnhandledException::Cast(obj);
797 return Api::NewHandle(isolate, error.stacktrace()); 794 return Api::NewHandle(I, error.stacktrace());
798 } else if (obj.IsError()) { 795 } else if (obj.IsError()) {
799 return Api::NewError("This error is not an unhandled exception error."); 796 return Api::NewError("This error is not an unhandled exception error.");
800 } else { 797 } else {
801 return Api::NewError("Can only get stacktraces from error handles."); 798 return Api::NewError("Can only get stacktraces from error handles.");
802 } 799 }
803 } 800 }
804 801
805 802
806 // TODO(turnidge): This clones Api::NewError. I need to use va_copy to 803 // TODO(turnidge): This clones Api::NewError. I need to use va_copy to
807 // fix this but not sure if it available on all of our builds. 804 // fix this but not sure if it available on all of our builds.
808 DART_EXPORT Dart_Handle Dart_NewApiError(const char* error) { 805 DART_EXPORT Dart_Handle Dart_NewApiError(const char* error) {
809 Isolate* isolate = Isolate::Current(); 806 DARTSCOPE(Thread::Current());
810 DARTSCOPE(isolate); 807 CHECK_CALLBACK_STATE(I);
811 CHECK_CALLBACK_STATE(isolate);
812 808
813 const String& message = String::Handle(isolate, String::New(error)); 809 const String& message = String::Handle(Z, String::New(error));
814 return Api::NewHandle(isolate, ApiError::New(message)); 810 return Api::NewHandle(I, ApiError::New(message));
815 } 811 }
816 812
817 813
818 DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) { 814 DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) {
819 Isolate* isolate = Isolate::Current(); 815 DARTSCOPE(Thread::Current());
820 DARTSCOPE(isolate); 816 CHECK_CALLBACK_STATE(I);
821 CHECK_CALLBACK_STATE(isolate);
822 817
823 Instance& obj = Instance::Handle(isolate); 818 Instance& obj = Instance::Handle(Z);
824 intptr_t class_id = Api::ClassId(exception); 819 intptr_t class_id = Api::ClassId(exception);
825 if ((class_id == kApiErrorCid) || (class_id == kLanguageErrorCid)) { 820 if ((class_id == kApiErrorCid) || (class_id == kLanguageErrorCid)) {
826 obj = String::New(::Dart_GetError(exception)); 821 obj = String::New(::Dart_GetError(exception));
827 } else { 822 } else {
828 obj = Api::UnwrapInstanceHandle(isolate, exception).raw(); 823 obj = Api::UnwrapInstanceHandle(I, exception).raw();
829 if (obj.IsNull()) { 824 if (obj.IsNull()) {
830 RETURN_TYPE_ERROR(isolate, exception, Instance); 825 RETURN_TYPE_ERROR(I, exception, Instance);
831 } 826 }
832 } 827 }
833 const Stacktrace& stacktrace = Stacktrace::Handle(isolate); 828 const Stacktrace& stacktrace = Stacktrace::Handle(Z);
834 return Api::NewHandle(isolate, UnhandledException::New(obj, stacktrace)); 829 return Api::NewHandle(I, UnhandledException::New(obj, stacktrace));
835 } 830 }
836 831
837 832
838 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) { 833 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) {
839 Isolate* isolate = Isolate::Current(); 834 Isolate* isolate = Isolate::Current();
840 { 835 {
841 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle)); 836 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
842 if (!obj.IsError()) { 837 if (!obj.IsError()) {
843 return Api::NewError( 838 return Api::NewError(
844 "%s expects argument 'handle' to be an error handle. " 839 "%s expects argument 'handle' to be an error handle. "
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 int line, 871 int line,
877 const char* handle, 872 const char* handle,
878 const char* message) { 873 const char* message) {
879 fprintf(stderr, "%s:%d: error handle: '%s':\n '%s'\n", 874 fprintf(stderr, "%s:%d: error handle: '%s':\n '%s'\n",
880 file, line, handle, message); 875 file, line, handle, message);
881 OS::Abort(); 876 OS::Abort();
882 } 877 }
883 878
884 879
885 DART_EXPORT Dart_Handle Dart_ToString(Dart_Handle object) { 880 DART_EXPORT Dart_Handle Dart_ToString(Dart_Handle object) {
886 Isolate* isolate = Isolate::Current(); 881 DARTSCOPE(Thread::Current());
887 DARTSCOPE(isolate); 882 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object));
888 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
889 if (obj.IsString()) { 883 if (obj.IsString()) {
890 return Api::NewHandle(isolate, obj.raw()); 884 return Api::NewHandle(I, obj.raw());
891 } else if (obj.IsInstance()) { 885 } else if (obj.IsInstance()) {
892 CHECK_CALLBACK_STATE(isolate); 886 CHECK_CALLBACK_STATE(I);
893 const Instance& receiver = Instance::Cast(obj); 887 const Instance& receiver = Instance::Cast(obj);
894 return Api::NewHandle(isolate, DartLibraryCalls::ToString(receiver)); 888 return Api::NewHandle(I, DartLibraryCalls::ToString(receiver));
895 } else { 889 } else {
896 CHECK_CALLBACK_STATE(isolate); 890 CHECK_CALLBACK_STATE(I);
897 // This is a VM internal object. Call the C++ method of printing. 891 // This is a VM internal object. Call the C++ method of printing.
898 return Api::NewHandle(isolate, String::New(obj.ToCString())); 892 return Api::NewHandle(I, String::New(obj.ToCString()));
899 } 893 }
900 } 894 }
901 895
902 896
903 DART_EXPORT bool Dart_IdentityEquals(Dart_Handle obj1, Dart_Handle obj2) { 897 DART_EXPORT bool Dart_IdentityEquals(Dart_Handle obj1, Dart_Handle obj2) {
904 Isolate* isolate = Isolate::Current(); 898 DARTSCOPE(Thread::Current());
905 DARTSCOPE(isolate);
906 { 899 {
907 NoSafepointScope no_safepoint_scope; 900 NoSafepointScope no_safepoint_scope;
908 if (Api::UnwrapHandle(obj1) == Api::UnwrapHandle(obj2)) { 901 if (Api::UnwrapHandle(obj1) == Api::UnwrapHandle(obj2)) {
909 return true; 902 return true;
910 } 903 }
911 } 904 }
912 const Object& object1 = Object::Handle(isolate, Api::UnwrapHandle(obj1)); 905 const Object& object1 = Object::Handle(Z, Api::UnwrapHandle(obj1));
913 const Object& object2 = Object::Handle(isolate, Api::UnwrapHandle(obj2)); 906 const Object& object2 = Object::Handle(Z, Api::UnwrapHandle(obj2));
914 if (object1.IsInstance() && object2.IsInstance()) { 907 if (object1.IsInstance() && object2.IsInstance()) {
915 return Instance::Cast(object1).IsIdenticalTo(Instance::Cast(object2)); 908 return Instance::Cast(object1).IsIdenticalTo(Instance::Cast(object2));
916 } 909 }
917 return false; 910 return false;
918 } 911 }
919 912
920 913
921 DART_EXPORT uint64_t Dart_IdentityHash(Dart_Handle obj) { 914 DART_EXPORT uint64_t Dart_IdentityHash(Dart_Handle obj) {
922 Isolate* isolate = Isolate::Current(); 915 DARTSCOPE(Thread::Current());
923 DARTSCOPE(isolate);
924 916
925 const Object& object = Object::Handle(isolate, Api::UnwrapHandle(obj)); 917 const Object& object = Object::Handle(Z, Api::UnwrapHandle(obj));
926 if (!object.IsInstance() && !object.IsNull()) { 918 if (!object.IsInstance() && !object.IsNull()) {
927 return 0; 919 return 0;
928 } 920 }
929 921
930 const Library& libcore = Library::Handle(isolate, Library::CoreLibrary()); 922 const Library& libcore = Library::Handle(Z, Library::CoreLibrary());
931 const String& function_name = String::Handle(isolate, 923 const String& function_name = String::Handle(Z,
932 String::New("identityHashCode")); 924 String::New("identityHashCode"));
933 const Function& function = 925 const Function& function =
934 Function::Handle(isolate, 926 Function::Handle(Z, libcore.LookupFunctionAllowPrivate(function_name));
935 libcore.LookupFunctionAllowPrivate(function_name));
936 if (function.IsNull()) { 927 if (function.IsNull()) {
937 UNREACHABLE(); 928 UNREACHABLE();
938 return 0; 929 return 0;
939 } 930 }
940 931
941 const Array& arguments = Array::Handle(isolate, Array::New(1)); 932 const Array& arguments = Array::Handle(Z, Array::New(1));
942 arguments.SetAt(0, object); 933 arguments.SetAt(0, object);
943 const Object& result = 934 const Object& result =
944 Object::Handle(isolate, DartEntry::InvokeFunction(function, arguments)); 935 Object::Handle(Z, DartEntry::InvokeFunction(function, arguments));
945 936
946 if (result.IsSmi()) { 937 if (result.IsSmi()) {
947 return Smi::Cast(result).Value(); 938 return Smi::Cast(result).Value();
948 } 939 }
949 if (result.IsMint()) { 940 if (result.IsMint()) {
950 const Mint& mint = Mint::Cast(result); 941 const Mint& mint = Mint::Cast(result);
951 if (!mint.IsNegative()) { 942 if (!mint.IsNegative()) {
952 return mint.AsInt64Value(); 943 return mint.AsInt64Value();
953 } 944 }
954 } 945 }
(...skipping 24 matching lines...) Expand all
979 CHECK_ISOLATE(isolate); 970 CHECK_ISOLATE(isolate);
980 ApiState* state = isolate->api_state(); 971 ApiState* state = isolate->api_state();
981 ASSERT(state != NULL); 972 ASSERT(state != NULL);
982 FinalizablePersistentHandle* weak_ref = 973 FinalizablePersistentHandle* weak_ref =
983 FinalizablePersistentHandle::Cast(object); 974 FinalizablePersistentHandle::Cast(object);
984 return Api::NewHandle(isolate, weak_ref->raw()); 975 return Api::NewHandle(isolate, weak_ref->raw());
985 } 976 }
986 977
987 978
988 DART_EXPORT Dart_PersistentHandle Dart_NewPersistentHandle(Dart_Handle object) { 979 DART_EXPORT Dart_PersistentHandle Dart_NewPersistentHandle(Dart_Handle object) {
989 Isolate* isolate = Isolate::Current(); 980 DARTSCOPE(Thread::Current());
990 DARTSCOPE(isolate); 981 ApiState* state = I->api_state();
991 ApiState* state = isolate->api_state();
992 ASSERT(state != NULL); 982 ASSERT(state != NULL);
993 const Object& old_ref = Object::Handle(isolate, Api::UnwrapHandle(object)); 983 const Object& old_ref = Object::Handle(Z, Api::UnwrapHandle(object));
994 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle(); 984 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle();
995 new_ref->set_raw(old_ref); 985 new_ref->set_raw(old_ref);
996 return new_ref->apiHandle(); 986 return new_ref->apiHandle();
997 } 987 }
998 988
999 989
1000 DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1, 990 DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1,
1001 Dart_Handle obj2) { 991 Dart_Handle obj2) {
1002 Isolate* isolate = Isolate::Current(); 992 DARTSCOPE(Thread::Current());
1003 DARTSCOPE(isolate); 993 ApiState* state = I->api_state();
1004 ApiState* state = isolate->api_state();
1005 ASSERT(state != NULL); 994 ASSERT(state != NULL);
1006 ASSERT(state->IsValidPersistentHandle(obj1)); 995 ASSERT(state->IsValidPersistentHandle(obj1));
1007 const Object& obj2_ref = Object::Handle(isolate, Api::UnwrapHandle(obj2)); 996 const Object& obj2_ref = Object::Handle(Z, Api::UnwrapHandle(obj2));
1008 PersistentHandle* obj1_ref = PersistentHandle::Cast(obj1); 997 PersistentHandle* obj1_ref = PersistentHandle::Cast(obj1);
1009 obj1_ref->set_raw(obj2_ref); 998 obj1_ref->set_raw(obj2_ref);
1010 } 999 }
1011 1000
1012 1001
1013 static Dart_WeakPersistentHandle AllocateFinalizableHandle( 1002 static Dart_WeakPersistentHandle AllocateFinalizableHandle(
1014 Isolate* isolate, 1003 Isolate* isolate,
1015 Dart_Handle object, 1004 Dart_Handle object,
1016 bool is_prologue, 1005 bool is_prologue,
1017 void* peer, 1006 void* peer,
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
1358 char* isolate_name = BuildIsolateName(script_uri, main); 1347 char* isolate_name = BuildIsolateName(script_uri, main);
1359 Thread::EnsureInit(); 1348 Thread::EnsureInit();
1360 1349
1361 // Setup default flags in case none were passed. 1350 // Setup default flags in case none were passed.
1362 Dart_IsolateFlags api_flags; 1351 Dart_IsolateFlags api_flags;
1363 if (flags == NULL) { 1352 if (flags == NULL) {
1364 Isolate::Flags vm_flags; 1353 Isolate::Flags vm_flags;
1365 vm_flags.CopyTo(&api_flags); 1354 vm_flags.CopyTo(&api_flags);
1366 flags = &api_flags; 1355 flags = &api_flags;
1367 } 1356 }
1368 Isolate* isolate = Dart::CreateIsolate(isolate_name, *flags); 1357 Isolate* I = Dart::CreateIsolate(isolate_name, *flags);
1369 free(isolate_name); 1358 free(isolate_name);
1370 { 1359 {
1371 StackZone zone(isolate); 1360 Thread* T = Thread::Current();
1372 HANDLESCOPE(isolate); 1361 StackZone zone(T);
1362 HANDLESCOPE(T);
1373 // We enter an API scope here as InitializeIsolate could compile some 1363 // We enter an API scope here as InitializeIsolate could compile some
1374 // bootstrap library files which call out to a tag handler that may create 1364 // bootstrap library files which call out to a tag handler that may create
1375 // Api Handles when an error is encountered. 1365 // Api Handles when an error is encountered.
1376 Dart_EnterScope(); 1366 Dart_EnterScope();
1377 const Error& error_obj = 1367 const Error& error_obj =
1378 Error::Handle(isolate, 1368 Error::Handle(Z, Dart::InitializeIsolate(snapshot, callback_data));
1379 Dart::InitializeIsolate(snapshot, callback_data));
1380 if (error_obj.IsNull()) { 1369 if (error_obj.IsNull()) {
1381 #if defined(DART_NO_SNAPSHOT) 1370 #if defined(DART_NO_SNAPSHOT)
1382 if (FLAG_check_function_fingerprints) { 1371 if (FLAG_check_function_fingerprints) {
1383 Library::CheckFunctionFingerprints(); 1372 Library::CheckFunctionFingerprints();
1384 } 1373 }
1385 #endif // defined(DART_NO_SNAPSHOT). 1374 #endif // defined(DART_NO_SNAPSHOT).
1386 // We exit the API scope entered above. 1375 // We exit the API scope entered above.
1387 Dart_ExitScope(); 1376 Dart_ExitScope();
1388 START_TIMER(isolate, time_total_runtime); 1377 START_TIMER(I, time_total_runtime);
1389 return Api::CastIsolate(isolate); 1378 return Api::CastIsolate(I);
1390 } 1379 }
1391 *error = strdup(error_obj.ToErrorCString()); 1380 *error = strdup(error_obj.ToErrorCString());
1392 // We exit the API scope entered above. 1381 // We exit the API scope entered above.
1393 Dart_ExitScope(); 1382 Dart_ExitScope();
1394 } 1383 }
1395 Dart::ShutdownIsolate(); 1384 Dart::ShutdownIsolate();
1396 return reinterpret_cast<Dart_Isolate>(NULL); 1385 return reinterpret_cast<Dart_Isolate>(NULL);
1397 } 1386 }
1398 1387
1399 1388
1400 DART_EXPORT void Dart_ShutdownIsolate() { 1389 DART_EXPORT void Dart_ShutdownIsolate() {
1401 Isolate* isolate = Isolate::Current(); 1390 Thread* T = Thread::Current();
1402 CHECK_ISOLATE(isolate); 1391 Isolate* I = T->isolate();
1392 CHECK_ISOLATE(I);
1403 { 1393 {
1404 StackZone zone(isolate); 1394 StackZone zone(T);
1405 HandleScope handle_scope(isolate); 1395 HandleScope handle_scope(T);
1406 Dart::RunShutdownCallback(); 1396 Dart::RunShutdownCallback();
1407 } 1397 }
1408 STOP_TIMER(isolate, time_total_runtime); 1398 STOP_TIMER(I, time_total_runtime);
1409 Dart::ShutdownIsolate(); 1399 Dart::ShutdownIsolate();
1410 } 1400 }
1411 1401
1412 1402
1413 DART_EXPORT Dart_Isolate Dart_CurrentIsolate() { 1403 DART_EXPORT Dart_Isolate Dart_CurrentIsolate() {
1414 return Api::CastIsolate(Isolate::Current()); 1404 return Api::CastIsolate(Isolate::Current());
1415 } 1405 }
1416 1406
1417 1407
1418 DART_EXPORT void* Dart_CurrentIsolateData() { 1408 DART_EXPORT void* Dart_CurrentIsolateData() {
1419 Isolate* isolate = Isolate::Current(); 1409 Isolate* isolate = Isolate::Current();
1420 CHECK_ISOLATE(isolate); 1410 CHECK_ISOLATE(isolate);
1421 return isolate->init_callback_data(); 1411 return isolate->init_callback_data();
1422 } 1412 }
1423 1413
1424 1414
1425 DART_EXPORT void* Dart_IsolateData(Dart_Isolate isolate) { 1415 DART_EXPORT void* Dart_IsolateData(Dart_Isolate isolate) {
1426 TRACE_API_CALL(CURRENT_FUNC); 1416 TRACE_API_CALL(CURRENT_FUNC);
1427 if (isolate == NULL) { 1417 if (isolate == NULL) {
1428 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); 1418 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC);
1429 } 1419 }
1430 // TODO(16615): Validate isolate parameter. 1420 // TODO(16615): Validate isolate parameter.
1431 Isolate* iso = reinterpret_cast<Isolate*>(isolate); 1421 Isolate* iso = reinterpret_cast<Isolate*>(isolate);
1432 return iso->init_callback_data(); 1422 return iso->init_callback_data();
1433 } 1423 }
1434 1424
1435 1425
1436 DART_EXPORT Dart_Handle Dart_DebugName() { 1426 DART_EXPORT Dart_Handle Dart_DebugName() {
1437 Isolate* isolate = Isolate::Current(); 1427 DARTSCOPE(Thread::Current());
1438 DARTSCOPE(isolate); 1428 return Api::NewHandle(I, String::New(I->name()));
1439 return Api::NewHandle(isolate, String::New(isolate->name()));
1440 } 1429 }
1441 1430
1442 1431
1443 1432
1444 DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate) { 1433 DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate) {
1445 CHECK_NO_ISOLATE(Isolate::Current()); 1434 CHECK_NO_ISOLATE(Isolate::Current());
1446 // TODO(16615): Validate isolate parameter. 1435 // TODO(16615): Validate isolate parameter.
1447 Isolate* iso = reinterpret_cast<Isolate*>(isolate); 1436 Isolate* iso = reinterpret_cast<Isolate*>(isolate);
1448 if (iso->HasMutatorThread()) { 1437 if (iso->HasMutatorThread()) {
1449 FATAL("Multiple mutators within one isolate is not supported."); 1438 FATAL("Multiple mutators within one isolate is not supported.");
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1505 ptr, old_size, new_size); 1494 ptr, old_size, new_size);
1506 } 1495 }
1507 1496
1508 1497
1509 DART_EXPORT Dart_Handle Dart_CreateSnapshot( 1498 DART_EXPORT Dart_Handle Dart_CreateSnapshot(
1510 uint8_t** vm_isolate_snapshot_buffer, 1499 uint8_t** vm_isolate_snapshot_buffer,
1511 intptr_t* vm_isolate_snapshot_size, 1500 intptr_t* vm_isolate_snapshot_size,
1512 uint8_t** isolate_snapshot_buffer, 1501 uint8_t** isolate_snapshot_buffer,
1513 intptr_t* isolate_snapshot_size) { 1502 intptr_t* isolate_snapshot_size) {
1514 ASSERT(FLAG_load_deferred_eagerly); 1503 ASSERT(FLAG_load_deferred_eagerly);
1515 Thread* thread = Thread::Current(); 1504 DARTSCOPE(Thread::Current());
1516 Isolate* isolate = thread->isolate(); 1505 TIMERSCOPE(T, time_creating_snapshot);
1517 DARTSCOPE(isolate);
1518 TIMERSCOPE(thread, time_creating_snapshot);
1519 if (vm_isolate_snapshot_buffer != NULL && 1506 if (vm_isolate_snapshot_buffer != NULL &&
1520 vm_isolate_snapshot_size == NULL) { 1507 vm_isolate_snapshot_size == NULL) {
1521 RETURN_NULL_ERROR(vm_isolate_snapshot_size); 1508 RETURN_NULL_ERROR(vm_isolate_snapshot_size);
1522 } 1509 }
1523 if (isolate_snapshot_buffer == NULL) { 1510 if (isolate_snapshot_buffer == NULL) {
1524 RETURN_NULL_ERROR(isolate_snapshot_buffer); 1511 RETURN_NULL_ERROR(isolate_snapshot_buffer);
1525 } 1512 }
1526 if (isolate_snapshot_size == NULL) { 1513 if (isolate_snapshot_size == NULL) {
1527 RETURN_NULL_ERROR(isolate_snapshot_size); 1514 RETURN_NULL_ERROR(isolate_snapshot_size);
1528 } 1515 }
1529 // Finalize all classes if needed. 1516 // Finalize all classes if needed.
1530 Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate); 1517 Dart_Handle state = Api::CheckAndFinalizePendingClasses(I);
1531 if (::Dart_IsError(state)) { 1518 if (::Dart_IsError(state)) {
1532 return state; 1519 return state;
1533 } 1520 }
1534 isolate->heap()->CollectAllGarbage(); 1521 I->heap()->CollectAllGarbage();
1535 #if defined(DEBUG) 1522 #if defined(DEBUG)
1536 FunctionVisitor check_canonical(isolate); 1523 FunctionVisitor check_canonical(I);
1537 isolate->heap()->IterateObjects(&check_canonical); 1524 I->heap()->IterateObjects(&check_canonical);
1538 #endif // #if defined(DEBUG). 1525 #endif // #if defined(DEBUG).
1539 1526
1540 // Since this is only a snapshot the root library should not be set. 1527 // Since this is only a snapshot the root library should not be set.
1541 isolate->object_store()->set_root_library(Library::Handle(isolate)); 1528 I->object_store()->set_root_library(Library::Handle(Z));
1542 FullSnapshotWriter writer(vm_isolate_snapshot_buffer, 1529 FullSnapshotWriter writer(vm_isolate_snapshot_buffer,
1543 isolate_snapshot_buffer, 1530 isolate_snapshot_buffer,
1544 ApiReallocate, 1531 ApiReallocate,
1545 false /* snapshot_code */); 1532 false /* snapshot_code */);
1546 writer.WriteFullSnapshot(); 1533 writer.WriteFullSnapshot();
1547 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); 1534 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize();
1548 *isolate_snapshot_size = writer.IsolateSnapshotSize(); 1535 *isolate_snapshot_size = writer.IsolateSnapshotSize();
1549 return Api::Success(); 1536 return Api::Success();
1550 } 1537 }
1551 1538
1552 1539
1553 static Dart_Handle createLibrarySnapshot(Dart_Handle library, 1540 static Dart_Handle createLibrarySnapshot(Dart_Handle library,
1554 uint8_t** buffer, 1541 uint8_t** buffer,
1555 intptr_t* size) { 1542 intptr_t* size) {
1556 Thread* thread = Thread::Current(); 1543 DARTSCOPE(Thread::Current());
1557 Isolate* isolate = thread->isolate(); 1544 TIMERSCOPE(T, time_creating_snapshot);
1558 DARTSCOPE(isolate);
1559 TIMERSCOPE(thread, time_creating_snapshot);
1560 if (buffer == NULL) { 1545 if (buffer == NULL) {
1561 RETURN_NULL_ERROR(buffer); 1546 RETURN_NULL_ERROR(buffer);
1562 } 1547 }
1563 if (size == NULL) { 1548 if (size == NULL) {
1564 RETURN_NULL_ERROR(size); 1549 RETURN_NULL_ERROR(size);
1565 } 1550 }
1566 // Finalize all classes if needed. 1551 // Finalize all classes if needed.
1567 Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate); 1552 Dart_Handle state = Api::CheckAndFinalizePendingClasses(I);
1568 if (::Dart_IsError(state)) { 1553 if (::Dart_IsError(state)) {
1569 return state; 1554 return state;
1570 } 1555 }
1571 Library& lib = Library::Handle(isolate); 1556 Library& lib = Library::Handle(Z);
1572 if (library == Dart_Null()) { 1557 if (library == Dart_Null()) {
1573 lib ^= isolate->object_store()->root_library(); 1558 lib ^= I->object_store()->root_library();
1574 } else { 1559 } else {
1575 lib ^= Api::UnwrapHandle(library); 1560 lib ^= Api::UnwrapHandle(library);
1576 } 1561 }
1577 isolate->heap()->CollectAllGarbage(); 1562 I->heap()->CollectAllGarbage();
1578 #if defined(DEBUG) 1563 #if defined(DEBUG)
1579 FunctionVisitor check_canonical(isolate); 1564 FunctionVisitor check_canonical(I);
1580 isolate->heap()->IterateObjects(&check_canonical); 1565 I->heap()->IterateObjects(&check_canonical);
1581 #endif // #if defined(DEBUG). 1566 #endif // #if defined(DEBUG).
1582 ScriptSnapshotWriter writer(buffer, ApiReallocate); 1567 ScriptSnapshotWriter writer(buffer, ApiReallocate);
1583 writer.WriteScriptSnapshot(lib); 1568 writer.WriteScriptSnapshot(lib);
1584 *size = writer.BytesWritten(); 1569 *size = writer.BytesWritten();
1585 return Api::Success(); 1570 return Api::Success();
1586 } 1571 }
1587 1572
1588 1573
1589 DART_EXPORT Dart_Handle Dart_CreateScriptSnapshot(uint8_t** buffer, 1574 DART_EXPORT Dart_Handle Dart_CreateScriptSnapshot(uint8_t** buffer,
1590 intptr_t* size) { 1575 intptr_t* size) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1653 static void RunLoopDone(uword param) { 1638 static void RunLoopDone(uword param) {
1654 RunLoopData* data = reinterpret_cast<RunLoopData*>(param); 1639 RunLoopData* data = reinterpret_cast<RunLoopData*>(param);
1655 ASSERT(data->monitor != NULL); 1640 ASSERT(data->monitor != NULL);
1656 MonitorLocker ml(data->monitor); 1641 MonitorLocker ml(data->monitor);
1657 data->done = true; 1642 data->done = true;
1658 ml.Notify(); 1643 ml.Notify();
1659 } 1644 }
1660 1645
1661 1646
1662 DART_EXPORT Dart_Handle Dart_RunLoop() { 1647 DART_EXPORT Dart_Handle Dart_RunLoop() {
1663 Isolate* isolate = Isolate::Current(); 1648 Thread* T = Thread::Current();
1664 CHECK_ISOLATE_SCOPE(isolate); 1649 Isolate* I = T->isolate();
1665 CHECK_CALLBACK_STATE(isolate); 1650 CHECK_ISOLATE_SCOPE(I);
1651 CHECK_CALLBACK_STATE(I);
1666 Monitor monitor; 1652 Monitor monitor;
1667 MonitorLocker ml(&monitor); 1653 MonitorLocker ml(&monitor);
1668 { 1654 {
1669 SwitchIsolateScope switch_scope(NULL); 1655 SwitchIsolateScope switch_scope(NULL);
1670 1656
1671 RunLoopData data; 1657 RunLoopData data;
1672 data.monitor = &monitor; 1658 data.monitor = &monitor;
1673 data.done = false; 1659 data.done = false;
1674 isolate->message_handler()->Run( 1660 I->message_handler()->Run(
1675 Dart::thread_pool(), 1661 Dart::thread_pool(),
1676 NULL, RunLoopDone, reinterpret_cast<uword>(&data)); 1662 NULL, RunLoopDone, reinterpret_cast<uword>(&data));
1677 while (!data.done) { 1663 while (!data.done) {
1678 ml.Wait(); 1664 ml.Wait();
1679 } 1665 }
1680 } 1666 }
1681 if (isolate->object_store()->sticky_error() != Object::null()) { 1667 if (I->object_store()->sticky_error() != Object::null()) {
1682 Dart_Handle error = Api::NewHandle(isolate, 1668 Dart_Handle error = Api::NewHandle(I, I->object_store()->sticky_error());
1683 isolate->object_store()->sticky_error()); 1669 I->object_store()->clear_sticky_error();
1684 isolate->object_store()->clear_sticky_error();
1685 return error; 1670 return error;
1686 } 1671 }
1687 if (FLAG_print_class_table) { 1672 if (FLAG_print_class_table) {
1688 HANDLESCOPE(isolate); 1673 HANDLESCOPE(T);
1689 isolate->class_table()->Print(); 1674 I->class_table()->Print();
1690 } 1675 }
1691 return Api::Success(); 1676 return Api::Success();
1692 } 1677 }
1693 1678
1694 1679
1695 DART_EXPORT Dart_Handle Dart_HandleMessage() { 1680 DART_EXPORT Dart_Handle Dart_HandleMessage() {
1696 Isolate* isolate = Isolate::Current(); 1681 Isolate* isolate = Isolate::Current();
1697 CHECK_ISOLATE_SCOPE(isolate); 1682 CHECK_ISOLATE_SCOPE(isolate);
1698 CHECK_CALLBACK_STATE(isolate); 1683 CHECK_CALLBACK_STATE(isolate);
1699 if (!isolate->message_handler()->HandleNextMessage()) { 1684 if (!isolate->message_handler()->HandleNextMessage()) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1731 } 1716 }
1732 1717
1733 1718
1734 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { 1719 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
1735 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); 1720 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
1736 return reinterpret_cast<uint8_t*>(new_ptr); 1721 return reinterpret_cast<uint8_t*>(new_ptr);
1737 } 1722 }
1738 1723
1739 1724
1740 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) { 1725 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) {
1741 Isolate* isolate = Isolate::Current(); 1726 DARTSCOPE(Thread::Current());
1742 DARTSCOPE(isolate);
1743 if (port_id == ILLEGAL_PORT) { 1727 if (port_id == ILLEGAL_PORT) {
1744 return false; 1728 return false;
1745 } 1729 }
1746 const Object& object = Object::Handle(isolate, Api::UnwrapHandle(handle)); 1730 const Object& object = Object::Handle(Z, Api::UnwrapHandle(handle));
1747 uint8_t* data = NULL; 1731 uint8_t* data = NULL;
1748 MessageWriter writer(&data, &allocator, false); 1732 MessageWriter writer(&data, &allocator, false);
1749 writer.WriteMessage(object); 1733 writer.WriteMessage(object);
1750 intptr_t len = writer.BytesWritten(); 1734 intptr_t len = writer.BytesWritten();
1751 return PortMap::PostMessage(new Message( 1735 return PortMap::PostMessage(new Message(
1752 port_id, data, len, Message::kNormalPriority)); 1736 port_id, data, len, Message::kNormalPriority));
1753 } 1737 }
1754 1738
1755 1739
1756 DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id) { 1740 DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id) {
1757 Isolate* isolate = Isolate::Current(); 1741 DARTSCOPE(Thread::Current());
1758 DARTSCOPE(isolate); 1742 CHECK_CALLBACK_STATE(I);
1759 CHECK_CALLBACK_STATE(isolate);
1760 if (port_id == ILLEGAL_PORT) { 1743 if (port_id == ILLEGAL_PORT) {
1761 return Api::NewError("%s: illegal port_id %" Pd64 ".", 1744 return Api::NewError("%s: illegal port_id %" Pd64 ".",
1762 CURRENT_FUNC, 1745 CURRENT_FUNC,
1763 port_id); 1746 port_id);
1764 } 1747 }
1765 return Api::NewHandle(isolate, SendPort::New(port_id)); 1748 return Api::NewHandle(I, SendPort::New(port_id));
1766 } 1749 }
1767 1750
1768 1751
1769 DART_EXPORT Dart_Handle Dart_SendPortGetId(Dart_Handle port, 1752 DART_EXPORT Dart_Handle Dart_SendPortGetId(Dart_Handle port,
1770 Dart_Port* port_id) { 1753 Dart_Port* port_id) {
1771 Isolate* isolate = Isolate::Current(); 1754 DARTSCOPE(Thread::Current());
1772 DARTSCOPE(isolate); 1755 CHECK_CALLBACK_STATE(I);
1773 CHECK_CALLBACK_STATE(isolate); 1756 const SendPort& send_port = Api::UnwrapSendPortHandle(I, port);
1774 const SendPort& send_port = Api::UnwrapSendPortHandle(isolate, port);
1775 if (send_port.IsNull()) { 1757 if (send_port.IsNull()) {
1776 RETURN_TYPE_ERROR(isolate, port, SendPort); 1758 RETURN_TYPE_ERROR(I, port, SendPort);
1777 } 1759 }
1778 if (port_id == NULL) { 1760 if (port_id == NULL) {
1779 RETURN_NULL_ERROR(port_id); 1761 RETURN_NULL_ERROR(port_id);
1780 } 1762 }
1781 *port_id = send_port.Id(); 1763 *port_id = send_port.Id();
1782 return Api::Success(); 1764 return Api::Success();
1783 } 1765 }
1784 1766
1785 1767
1786 DART_EXPORT Dart_Port Dart_GetMainPortId() { 1768 DART_EXPORT Dart_Port Dart_GetMainPortId() {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1862 } 1844 }
1863 1845
1864 1846
1865 DART_EXPORT bool Dart_IsNull(Dart_Handle object) { 1847 DART_EXPORT bool Dart_IsNull(Dart_Handle object) {
1866 return Api::UnwrapHandle(object) == Object::null(); 1848 return Api::UnwrapHandle(object) == Object::null();
1867 } 1849 }
1868 1850
1869 1851
1870 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, 1852 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2,
1871 bool* value) { 1853 bool* value) {
1872 Thread* thread = Thread::Current(); 1854 DARTSCOPE(Thread::Current());
1873 Isolate* isolate = thread->isolate(); 1855 CHECK_CALLBACK_STATE(I);
1874 Zone* zone = thread->zone();
1875 DARTSCOPE(isolate);
1876 CHECK_CALLBACK_STATE(isolate);
1877 const Instance& expected = 1856 const Instance& expected =
1878 Instance::CheckedHandle(zone, Api::UnwrapHandle(obj1)); 1857 Instance::CheckedHandle(Z, Api::UnwrapHandle(obj1));
1879 const Instance& actual = 1858 const Instance& actual =
1880 Instance::CheckedHandle(zone, Api::UnwrapHandle(obj2)); 1859 Instance::CheckedHandle(Z, Api::UnwrapHandle(obj2));
1881 const Object& result = 1860 const Object& result =
1882 Object::Handle(zone, DartLibraryCalls::Equals(expected, actual)); 1861 Object::Handle(Z, DartLibraryCalls::Equals(expected, actual));
1883 if (result.IsBool()) { 1862 if (result.IsBool()) {
1884 *value = Bool::Cast(result).value(); 1863 *value = Bool::Cast(result).value();
1885 return Api::Success(); 1864 return Api::Success();
1886 } else if (result.IsError()) { 1865 } else if (result.IsError()) {
1887 return Api::NewHandle(isolate, result.raw()); 1866 return Api::NewHandle(I, result.raw());
1888 } else { 1867 } else {
1889 return Api::NewError("Expected boolean result from =="); 1868 return Api::NewError("Expected boolean result from ==");
1890 } 1869 }
1891 } 1870 }
1892 1871
1893 1872
1894 // TODO(iposva): This call actually implements IsInstanceOfClass. 1873 // TODO(iposva): This call actually implements IsInstanceOfClass.
1895 // Do we also need a real Dart_IsInstanceOf, which should take an instance 1874 // Do we also need a real Dart_IsInstanceOf, which should take an instance
1896 // rather than an object? 1875 // rather than an object?
1897 DART_EXPORT Dart_Handle Dart_ObjectIsType(Dart_Handle object, 1876 DART_EXPORT Dart_Handle Dart_ObjectIsType(Dart_Handle object,
1898 Dart_Handle type, 1877 Dart_Handle type,
1899 bool* value) { 1878 bool* value) {
1900 Isolate* isolate = Isolate::Current(); 1879 DARTSCOPE(Thread::Current());
1901 DARTSCOPE(isolate);
1902 1880
1903 const Type& type_obj = Api::UnwrapTypeHandle(isolate, type); 1881 const Type& type_obj = Api::UnwrapTypeHandle(I, type);
1904 if (type_obj.IsNull()) { 1882 if (type_obj.IsNull()) {
1905 *value = false; 1883 *value = false;
1906 RETURN_TYPE_ERROR(isolate, type, Type); 1884 RETURN_TYPE_ERROR(I, type, Type);
1907 } 1885 }
1908 if (!type_obj.IsFinalized()) { 1886 if (!type_obj.IsFinalized()) {
1909 return Api::NewError( 1887 return Api::NewError(
1910 "%s expects argument 'type' to be a fully resolved type.", 1888 "%s expects argument 'type' to be a fully resolved type.",
1911 CURRENT_FUNC); 1889 CURRENT_FUNC);
1912 } 1890 }
1913 if (object == Api::Null()) { 1891 if (object == Api::Null()) {
1914 *value = false; 1892 *value = false;
1915 return Api::Success(); 1893 return Api::Success();
1916 } 1894 }
1917 const Instance& instance = Api::UnwrapInstanceHandle(isolate, object); 1895 const Instance& instance = Api::UnwrapInstanceHandle(I, object);
1918 if (instance.IsNull()) { 1896 if (instance.IsNull()) {
1919 *value = false; 1897 *value = false;
1920 RETURN_TYPE_ERROR(isolate, object, Instance); 1898 RETURN_TYPE_ERROR(I, object, Instance);
1921 } 1899 }
1922 CHECK_CALLBACK_STATE(isolate); 1900 CHECK_CALLBACK_STATE(I);
1923 Error& malformed_type_error = Error::Handle(isolate); 1901 Error& malformed_type_error = Error::Handle(Z);
1924 *value = instance.IsInstanceOf(type_obj, 1902 *value = instance.IsInstanceOf(type_obj,
1925 Object::null_type_arguments(), 1903 Object::null_type_arguments(),
1926 &malformed_type_error); 1904 &malformed_type_error);
1927 ASSERT(malformed_type_error.IsNull()); // Type was created from a class. 1905 ASSERT(malformed_type_error.IsNull()); // Type was created from a class.
1928 return Api::Success(); 1906 return Api::Success();
1929 } 1907 }
1930 1908
1931 1909
1932 DART_EXPORT bool Dart_IsInstance(Dart_Handle object) { 1910 DART_EXPORT bool Dart_IsInstance(Dart_Handle object) {
1933 Isolate* isolate = Isolate::Current(); 1911 Isolate* isolate = Isolate::Current();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1980 return RawObject::IsExternalStringClassId(Api::ClassId(object)); 1958 return RawObject::IsExternalStringClassId(Api::ClassId(object));
1981 } 1959 }
1982 1960
1983 1961
1984 DART_EXPORT bool Dart_IsList(Dart_Handle object) { 1962 DART_EXPORT bool Dart_IsList(Dart_Handle object) {
1985 if (RawObject::IsBuiltinListClassId(Api::ClassId(object))) { 1963 if (RawObject::IsBuiltinListClassId(Api::ClassId(object))) {
1986 TRACE_API_CALL(CURRENT_FUNC); 1964 TRACE_API_CALL(CURRENT_FUNC);
1987 return true; 1965 return true;
1988 } 1966 }
1989 1967
1990 Isolate* isolate = Isolate::Current(); 1968 DARTSCOPE(Thread::Current());
1991 DARTSCOPE(isolate); 1969 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object));
1992 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object)); 1970 return GetListInstance(Z, obj) != Instance::null();
1993 return GetListInstance(isolate, obj) != Instance::null();
1994 } 1971 }
1995 1972
1996 1973
1997 DART_EXPORT bool Dart_IsMap(Dart_Handle object) { 1974 DART_EXPORT bool Dart_IsMap(Dart_Handle object) {
1998 Isolate* isolate = Isolate::Current(); 1975 DARTSCOPE(Thread::Current());
1999 DARTSCOPE(isolate); 1976 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object));
2000 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object)); 1977 return GetMapInstance(Z, obj) != Instance::null();
2001 return GetMapInstance(isolate, obj) != Instance::null();
2002 } 1978 }
2003 1979
2004 1980
2005 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) { 1981 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) {
2006 TRACE_API_CALL(CURRENT_FUNC); 1982 TRACE_API_CALL(CURRENT_FUNC);
2007 return Api::ClassId(object) == kLibraryCid; 1983 return Api::ClassId(object) == kLibraryCid;
2008 } 1984 }
2009 1985
2010 1986
2011 DART_EXPORT bool Dart_IsType(Dart_Handle handle) { 1987 DART_EXPORT bool Dart_IsType(Dart_Handle handle) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2054 2030
2055 2031
2056 DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle handle) { 2032 DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle handle) {
2057 TRACE_API_CALL(CURRENT_FUNC); 2033 TRACE_API_CALL(CURRENT_FUNC);
2058 return Api::ClassId(handle) == kByteBufferCid; 2034 return Api::ClassId(handle) == kByteBufferCid;
2059 } 2035 }
2060 2036
2061 2037
2062 DART_EXPORT bool Dart_IsFuture(Dart_Handle handle) { 2038 DART_EXPORT bool Dart_IsFuture(Dart_Handle handle) {
2063 TRACE_API_CALL(CURRENT_FUNC); 2039 TRACE_API_CALL(CURRENT_FUNC);
2064 Isolate* isolate = Isolate::Current(); 2040 DARTSCOPE(Thread::Current());
2065 DARTSCOPE(isolate); 2041 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle));
2066 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
2067 if (obj.IsInstance()) { 2042 if (obj.IsInstance()) {
2068 const Class& future_class = 2043 const Class& future_class =
2069 Class::Handle(isolate->object_store()->future_class()); 2044 Class::Handle(I->object_store()->future_class());
2070 ASSERT(!future_class.IsNull()); 2045 ASSERT(!future_class.IsNull());
2071 const Class& obj_class = Class::Handle(isolate, obj.clazz()); 2046 const Class& obj_class = Class::Handle(Z, obj.clazz());
2072 Error& malformed_type_error = Error::Handle(isolate); 2047 Error& malformed_type_error = Error::Handle(Z);
2073 bool is_future = obj_class.IsSubtypeOf(Object::null_type_arguments(), 2048 bool is_future = obj_class.IsSubtypeOf(Object::null_type_arguments(),
2074 future_class, 2049 future_class,
2075 Object::null_type_arguments(), 2050 Object::null_type_arguments(),
2076 &malformed_type_error); 2051 &malformed_type_error);
2077 ASSERT(malformed_type_error.IsNull()); // Type is a raw Future. 2052 ASSERT(malformed_type_error.IsNull()); // Type is a raw Future.
2078 return is_future; 2053 return is_future;
2079 } 2054 }
2080 return false; 2055 return false;
2081 } 2056 }
2082 2057
2083 2058
2084 // --- Instances ---- 2059 // --- Instances ----
2085 2060
2086 DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) { 2061 DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) {
2087 Isolate* isolate = Isolate::Current(); 2062 DARTSCOPE(Thread::Current());
2088 DARTSCOPE(isolate); 2063 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(instance));
2089 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(instance));
2090 if (obj.IsNull()) { 2064 if (obj.IsNull()) {
2091 return Api::NewHandle(isolate, isolate->object_store()->null_type()); 2065 return Api::NewHandle(I, I->object_store()->null_type());
2092 } 2066 }
2093 if (!obj.IsInstance()) { 2067 if (!obj.IsInstance()) {
2094 RETURN_TYPE_ERROR(isolate, instance, Instance); 2068 RETURN_TYPE_ERROR(I, instance, Instance);
2095 } 2069 }
2096 const Type& type = Type::Handle(Instance::Cast(obj).GetType()); 2070 const Type& type = Type::Handle(Instance::Cast(obj).GetType());
2097 return Api::NewHandle(isolate, type.Canonicalize()); 2071 return Api::NewHandle(I, type.Canonicalize());
2098 } 2072 }
2099 2073
2100 2074
2101 // --- Numbers, Integers and Doubles ---- 2075 // --- Numbers, Integers and Doubles ----
2102 2076
2103 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, 2077 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer,
2104 bool* fits) { 2078 bool* fits) {
2105 // Fast path for Smis and Mints. 2079 // Fast path for Smis and Mints.
2106 Isolate* isolate = Isolate::Current(); 2080 Thread* thread = Thread::Current();
2081 Isolate* isolate = thread->isolate();
2107 CHECK_ISOLATE(isolate); 2082 CHECK_ISOLATE(isolate);
2108 intptr_t class_id = Api::ClassId(integer); 2083 intptr_t class_id = Api::ClassId(integer);
2109 if (class_id == kSmiCid || class_id == kMintCid) { 2084 if (class_id == kSmiCid || class_id == kMintCid) {
2110 *fits = true; 2085 *fits = true;
2111 return Api::Success(); 2086 return Api::Success();
2112 } 2087 }
2113 // Slow path for Mints and Bigints. 2088 // Slow path for Mints and Bigints.
2114 DARTSCOPE(isolate); 2089 DARTSCOPE(thread);
2115 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); 2090 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer);
2116 if (int_obj.IsNull()) { 2091 if (int_obj.IsNull()) {
2117 RETURN_TYPE_ERROR(isolate, integer, Integer); 2092 RETURN_TYPE_ERROR(isolate, integer, Integer);
2118 } 2093 }
2119 ASSERT(!Bigint::Cast(int_obj).FitsIntoInt64()); 2094 ASSERT(!Bigint::Cast(int_obj).FitsIntoInt64());
2120 *fits = false; 2095 *fits = false;
2121 return Api::Success(); 2096 return Api::Success();
2122 } 2097 }
2123 2098
2124 2099
2125 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer, 2100 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer,
2126 bool* fits) { 2101 bool* fits) {
2127 // Fast path for Smis. 2102 // Fast path for Smis.
2128 Isolate* isolate = Isolate::Current(); 2103 Thread* thread = Thread::Current();
2104 Isolate* isolate = thread->isolate();
2129 CHECK_ISOLATE(isolate); 2105 CHECK_ISOLATE(isolate);
2130 if (Api::IsSmi(integer)) { 2106 if (Api::IsSmi(integer)) {
2131 *fits = (Api::SmiValue(integer) >= 0); 2107 *fits = (Api::SmiValue(integer) >= 0);
2132 return Api::Success(); 2108 return Api::Success();
2133 } 2109 }
2134 // Slow path for Mints and Bigints. 2110 // Slow path for Mints and Bigints.
2135 DARTSCOPE(isolate); 2111 DARTSCOPE(thread);
2136 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); 2112 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer);
2137 if (int_obj.IsNull()) { 2113 if (int_obj.IsNull()) {
2138 RETURN_TYPE_ERROR(isolate, integer, Integer); 2114 RETURN_TYPE_ERROR(isolate, integer, Integer);
2139 } 2115 }
2140 ASSERT(!int_obj.IsSmi()); 2116 ASSERT(!int_obj.IsSmi());
2141 if (int_obj.IsMint()) { 2117 if (int_obj.IsMint()) {
2142 *fits = !int_obj.IsNegative(); 2118 *fits = !int_obj.IsNegative();
2143 } else { 2119 } else {
2144 *fits = Bigint::Cast(int_obj).FitsIntoUint64(); 2120 *fits = Bigint::Cast(int_obj).FitsIntoUint64();
2145 } 2121 }
2146 return Api::Success(); 2122 return Api::Success();
2147 } 2123 }
2148 2124
2149 2125
2150 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) { 2126 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) {
2151 // Fast path for Smis. 2127 // Fast path for Smis.
2152 Isolate* isolate = Isolate::Current(); 2128 Thread* thread = Thread::Current();
2129 Isolate* isolate = thread->isolate();
2153 CHECK_ISOLATE(isolate); 2130 CHECK_ISOLATE(isolate);
2154 if (Smi::IsValid(value)) { 2131 if (Smi::IsValid(value)) {
2155 NOHANDLESCOPE(isolate); 2132 NOHANDLESCOPE(thread);
2156 return Api::NewHandle(isolate, Smi::New(static_cast<intptr_t>(value))); 2133 return Api::NewHandle(isolate, Smi::New(static_cast<intptr_t>(value)));
2157 } 2134 }
2158 // Slow path for Mints and Bigints. 2135 // Slow path for Mints and Bigints.
2159 DARTSCOPE(isolate); 2136 DARTSCOPE(thread);
2160 CHECK_CALLBACK_STATE(isolate); 2137 CHECK_CALLBACK_STATE(isolate);
2161 return Api::NewHandle(isolate, Integer::New(value)); 2138 return Api::NewHandle(isolate, Integer::New(value));
2162 } 2139 }
2163 2140
2164 2141
2165 DART_EXPORT Dart_Handle Dart_NewIntegerFromUint64(uint64_t value) { 2142 DART_EXPORT Dart_Handle Dart_NewIntegerFromUint64(uint64_t value) {
2166 Isolate* isolate = Isolate::Current(); 2143 DARTSCOPE(Thread::Current());
2167 DARTSCOPE(isolate); 2144 CHECK_CALLBACK_STATE(I);
2168 CHECK_CALLBACK_STATE(isolate); 2145 return Api::NewHandle(I, Integer::NewFromUint64(value));
2169 return Api::NewHandle(isolate, Integer::NewFromUint64(value));
2170 } 2146 }
2171 2147
2172 2148
2173 DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) { 2149 DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) {
2174 Isolate* isolate = Isolate::Current(); 2150 DARTSCOPE(Thread::Current());
2175 DARTSCOPE(isolate); 2151 CHECK_CALLBACK_STATE(I);
2176 CHECK_CALLBACK_STATE(isolate); 2152 const String& str_obj = String::Handle(Z, String::New(str));
2177 const String& str_obj = String::Handle(isolate, String::New(str)); 2153 return Api::NewHandle(I, Integer::New(str_obj));
2178 return Api::NewHandle(isolate, Integer::New(str_obj));
2179 } 2154 }
2180 2155
2181 2156
2182 DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, 2157 DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer,
2183 int64_t* value) { 2158 int64_t* value) {
2184 // Fast path for Smis. 2159 // Fast path for Smis.
2185 Isolate* isolate = Isolate::Current(); 2160 Thread* thread = Thread::Current();
2161 Isolate* isolate = thread->isolate();
2186 CHECK_ISOLATE(isolate); 2162 CHECK_ISOLATE(isolate);
2187 if (Api::IsSmi(integer)) { 2163 if (Api::IsSmi(integer)) {
2188 *value = Api::SmiValue(integer); 2164 *value = Api::SmiValue(integer);
2189 return Api::Success(); 2165 return Api::Success();
2190 } 2166 }
2191 // Slow path for Mints and Bigints. 2167 // Slow path for Mints and Bigints.
2192 DARTSCOPE(isolate); 2168 DARTSCOPE(thread);
2193 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); 2169 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer);
2194 if (int_obj.IsNull()) { 2170 if (int_obj.IsNull()) {
2195 RETURN_TYPE_ERROR(isolate, integer, Integer); 2171 RETURN_TYPE_ERROR(isolate, integer, Integer);
2196 } 2172 }
2197 ASSERT(!int_obj.IsSmi()); 2173 ASSERT(!int_obj.IsSmi());
2198 if (int_obj.IsMint()) { 2174 if (int_obj.IsMint()) {
2199 *value = int_obj.AsInt64Value(); 2175 *value = int_obj.AsInt64Value();
2200 return Api::Success(); 2176 return Api::Success();
2201 } else { 2177 } else {
2202 const Bigint& bigint = Bigint::Cast(int_obj); 2178 const Bigint& bigint = Bigint::Cast(int_obj);
2203 if (bigint.FitsIntoInt64()) { 2179 if (bigint.FitsIntoInt64()) {
2204 *value = bigint.AsInt64Value(); 2180 *value = bigint.AsInt64Value();
2205 return Api::Success(); 2181 return Api::Success();
2206 } 2182 }
2207 } 2183 }
2208 return Api::NewError("%s: Integer %s cannot be represented as an int64_t.", 2184 return Api::NewError("%s: Integer %s cannot be represented as an int64_t.",
2209 CURRENT_FUNC, int_obj.ToCString()); 2185 CURRENT_FUNC, int_obj.ToCString());
2210 } 2186 }
2211 2187
2212 2188
2213 DART_EXPORT Dart_Handle Dart_IntegerToUint64(Dart_Handle integer, 2189 DART_EXPORT Dart_Handle Dart_IntegerToUint64(Dart_Handle integer,
2214 uint64_t* value) { 2190 uint64_t* value) {
2215 // Fast path for Smis. 2191 // Fast path for Smis.
2216 Isolate* isolate = Isolate::Current(); 2192 Thread* thread = Thread::Current();
2193 Isolate* isolate = thread->isolate();
2217 CHECK_ISOLATE(isolate); 2194 CHECK_ISOLATE(isolate);
2218 if (Api::IsSmi(integer)) { 2195 if (Api::IsSmi(integer)) {
2219 intptr_t smi_value = Api::SmiValue(integer); 2196 intptr_t smi_value = Api::SmiValue(integer);
2220 if (smi_value >= 0) { 2197 if (smi_value >= 0) {
2221 *value = smi_value; 2198 *value = smi_value;
2222 return Api::Success(); 2199 return Api::Success();
2223 } 2200 }
2224 } 2201 }
2225 // Slow path for Mints and Bigints. 2202 // Slow path for Mints and Bigints.
2226 DARTSCOPE(isolate); 2203 DARTSCOPE(thread);
2227 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); 2204 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer);
2228 if (int_obj.IsNull()) { 2205 if (int_obj.IsNull()) {
2229 RETURN_TYPE_ERROR(isolate, integer, Integer); 2206 RETURN_TYPE_ERROR(isolate, integer, Integer);
2230 } 2207 }
2231 if (int_obj.IsSmi()) { 2208 if (int_obj.IsSmi()) {
2232 ASSERT(int_obj.IsNegative()); 2209 ASSERT(int_obj.IsNegative());
2233 } else if (int_obj.IsMint() && !int_obj.IsNegative()) { 2210 } else if (int_obj.IsMint() && !int_obj.IsNegative()) {
2234 *value = int_obj.AsInt64Value(); 2211 *value = int_obj.AsInt64Value();
2235 return Api::Success(); 2212 return Api::Success();
2236 } else { 2213 } else {
2237 const Bigint& bigint = Bigint::Cast(int_obj); 2214 const Bigint& bigint = Bigint::Cast(int_obj);
2238 if (bigint.FitsIntoUint64()) { 2215 if (bigint.FitsIntoUint64()) {
2239 *value = bigint.AsUint64Value(); 2216 *value = bigint.AsUint64Value();
2240 return Api::Success(); 2217 return Api::Success();
2241 } 2218 }
2242 } 2219 }
2243 return Api::NewError("%s: Integer %s cannot be represented as a uint64_t.", 2220 return Api::NewError("%s: Integer %s cannot be represented as a uint64_t.",
2244 CURRENT_FUNC, int_obj.ToCString()); 2221 CURRENT_FUNC, int_obj.ToCString());
2245 } 2222 }
2246 2223
2247 2224
2248 static uword BigintAllocate(intptr_t size) { 2225 static uword BigintAllocate(intptr_t size) {
2249 return Api::TopScope(Isolate::Current())->zone()->AllocUnsafe(size); 2226 return Api::TopScope(Isolate::Current())->zone()->AllocUnsafe(size);
2250 } 2227 }
2251 2228
2252 2229
2253 DART_EXPORT Dart_Handle Dart_IntegerToHexCString(Dart_Handle integer, 2230 DART_EXPORT Dart_Handle Dart_IntegerToHexCString(Dart_Handle integer,
2254 const char** value) { 2231 const char** value) {
2255 Isolate* isolate = Isolate::Current(); 2232 DARTSCOPE(Thread::Current());
2256 DARTSCOPE(isolate); 2233 const Integer& int_obj = Api::UnwrapIntegerHandle(I, integer);
2257 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer);
2258 if (int_obj.IsNull()) { 2234 if (int_obj.IsNull()) {
2259 RETURN_TYPE_ERROR(isolate, integer, Integer); 2235 RETURN_TYPE_ERROR(I, integer, Integer);
2260 } 2236 }
2261 if (int_obj.IsSmi() || int_obj.IsMint()) { 2237 if (int_obj.IsSmi() || int_obj.IsMint()) {
2262 const Bigint& bigint = Bigint::Handle(isolate, 2238 const Bigint& bigint = Bigint::Handle(Z,
2263 Bigint::NewFromInt64(int_obj.AsInt64Value())); 2239 Bigint::NewFromInt64(int_obj.AsInt64Value()));
2264 *value = bigint.ToHexCString(BigintAllocate); 2240 *value = bigint.ToHexCString(BigintAllocate);
2265 } else { 2241 } else {
2266 *value = Bigint::Cast(int_obj).ToHexCString(BigintAllocate); 2242 *value = Bigint::Cast(int_obj).ToHexCString(BigintAllocate);
2267 } 2243 }
2268 return Api::Success(); 2244 return Api::Success();
2269 } 2245 }
2270 2246
2271 2247
2272 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { 2248 DART_EXPORT Dart_Handle Dart_NewDouble(double value) {
2273 Isolate* isolate = Isolate::Current(); 2249 DARTSCOPE(Thread::Current());
2274 DARTSCOPE(isolate); 2250 CHECK_CALLBACK_STATE(I);
2275 CHECK_CALLBACK_STATE(isolate); 2251 return Api::NewHandle(I, Double::New(value));
2276 return Api::NewHandle(isolate, Double::New(value));
2277 } 2252 }
2278 2253
2279 2254
2280 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj, 2255 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj,
2281 double* value) { 2256 double* value) {
2282 Isolate* isolate = Isolate::Current(); 2257 DARTSCOPE(Thread::Current());
2283 DARTSCOPE(isolate); 2258 const Double& obj = Api::UnwrapDoubleHandle(I, double_obj);
2284 const Double& obj = Api::UnwrapDoubleHandle(isolate, double_obj);
2285 if (obj.IsNull()) { 2259 if (obj.IsNull()) {
2286 RETURN_TYPE_ERROR(isolate, double_obj, Double); 2260 RETURN_TYPE_ERROR(I, double_obj, Double);
2287 } 2261 }
2288 *value = obj.value(); 2262 *value = obj.value();
2289 return Api::Success(); 2263 return Api::Success();
2290 } 2264 }
2291 2265
2292 2266
2293 // --- Booleans ---- 2267 // --- Booleans ----
2294 2268
2295 DART_EXPORT Dart_Handle Dart_True() { 2269 DART_EXPORT Dart_Handle Dart_True() {
2296 ASSERT(Isolate::Current() != NULL); 2270 ASSERT(Isolate::Current() != NULL);
2297 return Api::True(); 2271 return Api::True();
2298 } 2272 }
2299 2273
2300 2274
2301 DART_EXPORT Dart_Handle Dart_False() { 2275 DART_EXPORT Dart_Handle Dart_False() {
2302 ASSERT(Isolate::Current() != NULL); 2276 ASSERT(Isolate::Current() != NULL);
2303 return Api::False(); 2277 return Api::False();
2304 } 2278 }
2305 2279
2306 2280
2307 DART_EXPORT Dart_Handle Dart_NewBoolean(bool value) { 2281 DART_EXPORT Dart_Handle Dart_NewBoolean(bool value) {
2308 Isolate* isolate = Isolate::Current(); 2282 Isolate* isolate = Isolate::Current();
2309 CHECK_ISOLATE(isolate); 2283 CHECK_ISOLATE(isolate);
2310 return value ? Api::True() : Api::False(); 2284 return value ? Api::True() : Api::False();
2311 } 2285 }
2312 2286
2313 2287
2314 DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle boolean_obj, 2288 DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle boolean_obj,
2315 bool* value) { 2289 bool* value) {
2316 Isolate* isolate = Isolate::Current(); 2290 DARTSCOPE(Thread::Current());
2317 DARTSCOPE(isolate); 2291 const Bool& obj = Api::UnwrapBoolHandle(I, boolean_obj);
2318 const Bool& obj = Api::UnwrapBoolHandle(isolate, boolean_obj);
2319 if (obj.IsNull()) { 2292 if (obj.IsNull()) {
2320 RETURN_TYPE_ERROR(isolate, boolean_obj, Bool); 2293 RETURN_TYPE_ERROR(I, boolean_obj, Bool);
2321 } 2294 }
2322 *value = obj.value(); 2295 *value = obj.value();
2323 return Api::Success(); 2296 return Api::Success();
2324 } 2297 }
2325 2298
2326 2299
2327 // --- Strings --- 2300 // --- Strings ---
2328 2301
2329 2302
2330 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) { 2303 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) {
2331 Isolate* isolate = Isolate::Current(); 2304 Isolate* isolate = Isolate::Current();
2332 CHECK_ISOLATE(isolate); 2305 CHECK_ISOLATE(isolate);
2333 ReusableObjectHandleScope reused_obj_handle(isolate); 2306 ReusableObjectHandleScope reused_obj_handle(isolate);
2334 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); 2307 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str);
2335 if (str_obj.IsNull()) { 2308 if (str_obj.IsNull()) {
2336 RETURN_TYPE_ERROR(isolate, str, String); 2309 RETURN_TYPE_ERROR(isolate, str, String);
2337 } 2310 }
2338 *len = str_obj.Length(); 2311 *len = str_obj.Length();
2339 return Api::Success(); 2312 return Api::Success();
2340 } 2313 }
2341 2314
2342 2315
2343 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) { 2316 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) {
2344 Isolate* isolate = Isolate::Current(); 2317 DARTSCOPE(Thread::Current());
2345 DARTSCOPE(isolate);
2346 if (str == NULL) { 2318 if (str == NULL) {
2347 RETURN_NULL_ERROR(str); 2319 RETURN_NULL_ERROR(str);
2348 } 2320 }
2349 CHECK_CALLBACK_STATE(isolate); 2321 CHECK_CALLBACK_STATE(I);
2350 return Api::NewHandle(isolate, String::New(str)); 2322 return Api::NewHandle(I, String::New(str));
2351 } 2323 }
2352 2324
2353 2325
2354 DART_EXPORT Dart_Handle Dart_NewStringFromUTF8(const uint8_t* utf8_array, 2326 DART_EXPORT Dart_Handle Dart_NewStringFromUTF8(const uint8_t* utf8_array,
2355 intptr_t length) { 2327 intptr_t length) {
2356 Isolate* isolate = Isolate::Current(); 2328 DARTSCOPE(Thread::Current());
2357 DARTSCOPE(isolate);
2358 if (utf8_array == NULL && length != 0) { 2329 if (utf8_array == NULL && length != 0) {
2359 RETURN_NULL_ERROR(utf8_array); 2330 RETURN_NULL_ERROR(utf8_array);
2360 } 2331 }
2361 CHECK_LENGTH(length, String::kMaxElements); 2332 CHECK_LENGTH(length, String::kMaxElements);
2362 if (!Utf8::IsValid(utf8_array, length)) { 2333 if (!Utf8::IsValid(utf8_array, length)) {
2363 return Api::NewError("%s expects argument 'str' to be valid UTF-8.", 2334 return Api::NewError("%s expects argument 'str' to be valid UTF-8.",
2364 CURRENT_FUNC); 2335 CURRENT_FUNC);
2365 } 2336 }
2366 CHECK_CALLBACK_STATE(isolate); 2337 CHECK_CALLBACK_STATE(I);
2367 return Api::NewHandle(isolate, String::FromUTF8(utf8_array, length)); 2338 return Api::NewHandle(I, String::FromUTF8(utf8_array, length));
2368 } 2339 }
2369 2340
2370 2341
2371 DART_EXPORT Dart_Handle Dart_NewStringFromUTF16(const uint16_t* utf16_array, 2342 DART_EXPORT Dart_Handle Dart_NewStringFromUTF16(const uint16_t* utf16_array,
2372 intptr_t length) { 2343 intptr_t length) {
2373 Isolate* isolate = Isolate::Current(); 2344 DARTSCOPE(Thread::Current());
2374 DARTSCOPE(isolate);
2375 if (utf16_array == NULL && length != 0) { 2345 if (utf16_array == NULL && length != 0) {
2376 RETURN_NULL_ERROR(utf16_array); 2346 RETURN_NULL_ERROR(utf16_array);
2377 } 2347 }
2378 CHECK_LENGTH(length, String::kMaxElements); 2348 CHECK_LENGTH(length, String::kMaxElements);
2379 CHECK_CALLBACK_STATE(isolate); 2349 CHECK_CALLBACK_STATE(I);
2380 return Api::NewHandle(isolate, String::FromUTF16(utf16_array, length)); 2350 return Api::NewHandle(I, String::FromUTF16(utf16_array, length));
2381 } 2351 }
2382 2352
2383 2353
2384 DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const int32_t* utf32_array, 2354 DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const int32_t* utf32_array,
2385 intptr_t length) { 2355 intptr_t length) {
2386 Isolate* isolate = Isolate::Current(); 2356 DARTSCOPE(Thread::Current());
2387 DARTSCOPE(isolate);
2388 if (utf32_array == NULL && length != 0) { 2357 if (utf32_array == NULL && length != 0) {
2389 RETURN_NULL_ERROR(utf32_array); 2358 RETURN_NULL_ERROR(utf32_array);
2390 } 2359 }
2391 CHECK_LENGTH(length, String::kMaxElements); 2360 CHECK_LENGTH(length, String::kMaxElements);
2392 CHECK_CALLBACK_STATE(isolate); 2361 CHECK_CALLBACK_STATE(I);
2393 return Api::NewHandle(isolate, String::FromUTF32(utf32_array, length)); 2362 return Api::NewHandle(I, String::FromUTF32(utf32_array, length));
2394 } 2363 }
2395 2364
2396 2365
2397 DART_EXPORT Dart_Handle Dart_NewExternalLatin1String( 2366 DART_EXPORT Dart_Handle Dart_NewExternalLatin1String(
2398 const uint8_t* latin1_array, 2367 const uint8_t* latin1_array,
2399 intptr_t length, 2368 intptr_t length,
2400 void* peer, 2369 void* peer,
2401 Dart_PeerFinalizer cback) { 2370 Dart_PeerFinalizer cback) {
2402 Isolate* isolate = Isolate::Current(); 2371 DARTSCOPE(Thread::Current());
2403 DARTSCOPE(isolate);
2404 if (latin1_array == NULL && length != 0) { 2372 if (latin1_array == NULL && length != 0) {
2405 RETURN_NULL_ERROR(latin1_array); 2373 RETURN_NULL_ERROR(latin1_array);
2406 } 2374 }
2407 CHECK_LENGTH(length, String::kMaxElements); 2375 CHECK_LENGTH(length, String::kMaxElements);
2408 CHECK_CALLBACK_STATE(isolate); 2376 CHECK_CALLBACK_STATE(I);
2409 return Api::NewHandle(isolate, 2377 return Api::NewHandle(I,
2410 String::NewExternal(latin1_array, 2378 String::NewExternal(latin1_array,
2411 length, 2379 length,
2412 peer, 2380 peer,
2413 cback, 2381 cback,
2414 SpaceForExternal(isolate, length))); 2382 SpaceForExternal(I, length)));
2415 } 2383 }
2416 2384
2417 2385
2418 DART_EXPORT Dart_Handle Dart_NewExternalUTF16String(const uint16_t* utf16_array, 2386 DART_EXPORT Dart_Handle Dart_NewExternalUTF16String(const uint16_t* utf16_array,
2419 intptr_t length, 2387 intptr_t length,
2420 void* peer, 2388 void* peer,
2421 Dart_PeerFinalizer cback) { 2389 Dart_PeerFinalizer cback) {
2422 Isolate* isolate = Isolate::Current(); 2390 DARTSCOPE(Thread::Current());
2423 DARTSCOPE(isolate);
2424 if (utf16_array == NULL && length != 0) { 2391 if (utf16_array == NULL && length != 0) {
2425 RETURN_NULL_ERROR(utf16_array); 2392 RETURN_NULL_ERROR(utf16_array);
2426 } 2393 }
2427 CHECK_LENGTH(length, String::kMaxElements); 2394 CHECK_LENGTH(length, String::kMaxElements);
2428 CHECK_CALLBACK_STATE(isolate); 2395 CHECK_CALLBACK_STATE(I);
2429 intptr_t bytes = length * sizeof(*utf16_array); 2396 intptr_t bytes = length * sizeof(*utf16_array);
2430 return Api::NewHandle(isolate, 2397 return Api::NewHandle(I,
2431 String::NewExternal(utf16_array, 2398 String::NewExternal(utf16_array,
2432 length, 2399 length,
2433 peer, 2400 peer,
2434 cback, 2401 cback,
2435 SpaceForExternal(isolate, bytes))); 2402 SpaceForExternal(I, bytes)));
2436 } 2403 }
2437 2404
2438 2405
2439 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, 2406 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object,
2440 const char** cstr) { 2407 const char** cstr) {
2441 Isolate* isolate = Isolate::Current(); 2408 DARTSCOPE(Thread::Current());
2442 DARTSCOPE(isolate);
2443 if (cstr == NULL) { 2409 if (cstr == NULL) {
2444 RETURN_NULL_ERROR(cstr); 2410 RETURN_NULL_ERROR(cstr);
2445 } 2411 }
2446 const String& str_obj = Api::UnwrapStringHandle(isolate, object); 2412 const String& str_obj = Api::UnwrapStringHandle(I, object);
2447 if (str_obj.IsNull()) { 2413 if (str_obj.IsNull()) {
2448 RETURN_TYPE_ERROR(isolate, object, String); 2414 RETURN_TYPE_ERROR(I, object, String);
2449 } 2415 }
2450 intptr_t string_length = Utf8::Length(str_obj); 2416 intptr_t string_length = Utf8::Length(str_obj);
2451 char* res = Api::TopScope(isolate)->zone()->Alloc<char>(string_length + 1); 2417 char* res = Api::TopScope(I)->zone()->Alloc<char>(string_length + 1);
2452 if (res == NULL) { 2418 if (res == NULL) {
2453 return Api::NewError("Unable to allocate memory"); 2419 return Api::NewError("Unable to allocate memory");
2454 } 2420 }
2455 const char* string_value = str_obj.ToCString(); 2421 const char* string_value = str_obj.ToCString();
2456 memmove(res, string_value, string_length + 1); 2422 memmove(res, string_value, string_length + 1);
2457 ASSERT(res[string_length] == '\0'); 2423 ASSERT(res[string_length] == '\0');
2458 *cstr = res; 2424 *cstr = res;
2459 return Api::Success(); 2425 return Api::Success();
2460 } 2426 }
2461 2427
2462 2428
2463 DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str, 2429 DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str,
2464 uint8_t** utf8_array, 2430 uint8_t** utf8_array,
2465 intptr_t* length) { 2431 intptr_t* length) {
2466 Isolate* isolate = Isolate::Current(); 2432 DARTSCOPE(Thread::Current());
2467 DARTSCOPE(isolate);
2468 if (utf8_array == NULL) { 2433 if (utf8_array == NULL) {
2469 RETURN_NULL_ERROR(utf8_array); 2434 RETURN_NULL_ERROR(utf8_array);
2470 } 2435 }
2471 if (length == NULL) { 2436 if (length == NULL) {
2472 RETURN_NULL_ERROR(length); 2437 RETURN_NULL_ERROR(length);
2473 } 2438 }
2474 const String& str_obj = Api::UnwrapStringHandle(isolate, str); 2439 const String& str_obj = Api::UnwrapStringHandle(I, str);
2475 if (str_obj.IsNull()) { 2440 if (str_obj.IsNull()) {
2476 RETURN_TYPE_ERROR(isolate, str, String); 2441 RETURN_TYPE_ERROR(I, str, String);
2477 } 2442 }
2478 intptr_t str_len = Utf8::Length(str_obj); 2443 intptr_t str_len = Utf8::Length(str_obj);
2479 *utf8_array = Api::TopScope(isolate)->zone()->Alloc<uint8_t>(str_len); 2444 *utf8_array = Api::TopScope(I)->zone()->Alloc<uint8_t>(str_len);
2480 if (*utf8_array == NULL) { 2445 if (*utf8_array == NULL) {
2481 return Api::NewError("Unable to allocate memory"); 2446 return Api::NewError("Unable to allocate memory");
2482 } 2447 }
2483 str_obj.ToUTF8(*utf8_array, str_len); 2448 str_obj.ToUTF8(*utf8_array, str_len);
2484 *length = str_len; 2449 *length = str_len;
2485 return Api::Success(); 2450 return Api::Success();
2486 } 2451 }
2487 2452
2488 2453
2489 DART_EXPORT Dart_Handle Dart_StringToLatin1(Dart_Handle str, 2454 DART_EXPORT Dart_Handle Dart_StringToLatin1(Dart_Handle str,
2490 uint8_t* latin1_array, 2455 uint8_t* latin1_array,
2491 intptr_t* length) { 2456 intptr_t* length) {
2492 Isolate* isolate = Isolate::Current(); 2457 DARTSCOPE(Thread::Current());
2493 DARTSCOPE(isolate);
2494 if (latin1_array == NULL) { 2458 if (latin1_array == NULL) {
2495 RETURN_NULL_ERROR(latin1_array); 2459 RETURN_NULL_ERROR(latin1_array);
2496 } 2460 }
2497 if (length == NULL) { 2461 if (length == NULL) {
2498 RETURN_NULL_ERROR(length); 2462 RETURN_NULL_ERROR(length);
2499 } 2463 }
2500 const String& str_obj = Api::UnwrapStringHandle(isolate, str); 2464 const String& str_obj = Api::UnwrapStringHandle(I, str);
2501 if (str_obj.IsNull() || !str_obj.IsOneByteString()) { 2465 if (str_obj.IsNull() || !str_obj.IsOneByteString()) {
2502 RETURN_TYPE_ERROR(isolate, str, String); 2466 RETURN_TYPE_ERROR(I, str, String);
2503 } 2467 }
2504 intptr_t str_len = str_obj.Length(); 2468 intptr_t str_len = str_obj.Length();
2505 intptr_t copy_len = (str_len > *length) ? *length : str_len; 2469 intptr_t copy_len = (str_len > *length) ? *length : str_len;
2506 2470
2507 // We have already asserted that the string object is a Latin-1 string 2471 // We have already asserted that the string object is a Latin-1 string
2508 // so we can copy the characters over using a simple loop. 2472 // so we can copy the characters over using a simple loop.
2509 for (intptr_t i = 0; i < copy_len; i++) { 2473 for (intptr_t i = 0; i < copy_len; i++) {
2510 latin1_array[i] = str_obj.CharAt(i); 2474 latin1_array[i] = str_obj.CharAt(i);
2511 } 2475 }
2512 *length = copy_len; 2476 *length = copy_len;
2513 return Api::Success(); 2477 return Api::Success();
2514 } 2478 }
2515 2479
2516 2480
2517 DART_EXPORT Dart_Handle Dart_StringToUTF16(Dart_Handle str, 2481 DART_EXPORT Dart_Handle Dart_StringToUTF16(Dart_Handle str,
2518 uint16_t* utf16_array, 2482 uint16_t* utf16_array,
2519 intptr_t* length) { 2483 intptr_t* length) {
2520 Isolate* isolate = Isolate::Current(); 2484 DARTSCOPE(Thread::Current());
2521 DARTSCOPE(isolate); 2485 const String& str_obj = Api::UnwrapStringHandle(I, str);
2522 const String& str_obj = Api::UnwrapStringHandle(isolate, str);
2523 if (str_obj.IsNull()) { 2486 if (str_obj.IsNull()) {
2524 RETURN_TYPE_ERROR(isolate, str, String); 2487 RETURN_TYPE_ERROR(I, str, String);
2525 } 2488 }
2526 intptr_t str_len = str_obj.Length(); 2489 intptr_t str_len = str_obj.Length();
2527 intptr_t copy_len = (str_len > *length) ? *length : str_len; 2490 intptr_t copy_len = (str_len > *length) ? *length : str_len;
2528 for (intptr_t i = 0; i < copy_len; i++) { 2491 for (intptr_t i = 0; i < copy_len; i++) {
2529 utf16_array[i] = str_obj.CharAt(i); 2492 utf16_array[i] = str_obj.CharAt(i);
2530 } 2493 }
2531 *length = copy_len; 2494 *length = copy_len;
2532 return Api::Success(); 2495 return Api::Success();
2533 } 2496 }
2534 2497
(...skipping 13 matching lines...) Expand all
2548 *size = (str_obj.Length() * str_obj.CharSize()); 2511 *size = (str_obj.Length() * str_obj.CharSize());
2549 return Api::Success(); 2512 return Api::Success();
2550 } 2513 }
2551 2514
2552 2515
2553 DART_EXPORT Dart_Handle Dart_MakeExternalString(Dart_Handle str, 2516 DART_EXPORT Dart_Handle Dart_MakeExternalString(Dart_Handle str,
2554 void* array, 2517 void* array,
2555 intptr_t length, 2518 intptr_t length,
2556 void* peer, 2519 void* peer,
2557 Dart_PeerFinalizer cback) { 2520 Dart_PeerFinalizer cback) {
2558 Isolate* isolate = Isolate::Current(); 2521 DARTSCOPE(Thread::Current());
2559 DARTSCOPE(isolate); 2522 const String& str_obj = Api::UnwrapStringHandle(I, str);
2560 const String& str_obj = Api::UnwrapStringHandle(isolate, str);
2561 if (str_obj.IsExternal()) { 2523 if (str_obj.IsExternal()) {
2562 return str; // String is already an external string. 2524 return str; // String is already an external string.
2563 } 2525 }
2564 if (str_obj.IsNull()) { 2526 if (str_obj.IsNull()) {
2565 RETURN_TYPE_ERROR(isolate, str, String); 2527 RETURN_TYPE_ERROR(I, str, String);
2566 } 2528 }
2567 if (array == NULL) { 2529 if (array == NULL) {
2568 RETURN_NULL_ERROR(array); 2530 RETURN_NULL_ERROR(array);
2569 } 2531 }
2570 intptr_t str_size = (str_obj.Length() * str_obj.CharSize()); 2532 intptr_t str_size = (str_obj.Length() * str_obj.CharSize());
2571 if ((length < str_size) || (length > String::kMaxElements)) { 2533 if ((length < str_size) || (length > String::kMaxElements)) {
2572 return Api::NewError("Dart_MakeExternalString " 2534 return Api::NewError("Dart_MakeExternalString "
2573 "expects argument length to be in the range" 2535 "expects argument length to be in the range"
2574 "[%" Pd "..%" Pd "].", 2536 "[%" Pd "..%" Pd "].",
2575 str_size, String::kMaxElements); 2537 str_size, String::kMaxElements);
(...skipping 16 matching lines...) Expand all
2592 ASSERT(str_obj.IsTwoByteString()); 2554 ASSERT(str_obj.IsTwoByteString());
2593 ASSERT(length >= (copy_len * str_obj.CharSize())); 2555 ASSERT(length >= (copy_len * str_obj.CharSize()));
2594 uint16_t* utf16_array = reinterpret_cast<uint16_t*>(array); 2556 uint16_t* utf16_array = reinterpret_cast<uint16_t*>(array);
2595 for (intptr_t i = 0; i < copy_len; i++) { 2557 for (intptr_t i = 0; i < copy_len; i++) {
2596 utf16_array[i] = str_obj.CharAt(i); 2558 utf16_array[i] = str_obj.CharAt(i);
2597 } 2559 }
2598 TwoByteString::SetPeer(str_obj, peer, cback); 2560 TwoByteString::SetPeer(str_obj, peer, cback);
2599 } 2561 }
2600 return str; 2562 return str;
2601 } 2563 }
2602 return Api::NewHandle(isolate, 2564 return Api::NewHandle(I, str_obj.MakeExternal(array, length, peer, cback));
2603 str_obj.MakeExternal(array, length, peer, cback));
2604 } 2565 }
2605 2566
2606 2567
2607 DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle object, 2568 DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle object,
2608 intptr_t* char_size, 2569 intptr_t* char_size,
2609 intptr_t* str_len, 2570 intptr_t* str_len,
2610 void** peer) { 2571 void** peer) {
2611 Isolate* isolate = Isolate::Current(); 2572 Isolate* isolate = Isolate::Current();
2612 CHECK_ISOLATE(isolate); 2573 CHECK_ISOLATE(isolate);
2613 ReusableObjectHandleScope reused_obj_handle(isolate); 2574 ReusableObjectHandleScope reused_obj_handle(isolate);
(...skipping 10 matching lines...) Expand all
2624 } 2585 }
2625 *char_size = str.CharSize(); 2586 *char_size = str.CharSize();
2626 *str_len = str.Length(); 2587 *str_len = str.Length();
2627 return Api::Success(); 2588 return Api::Success();
2628 } 2589 }
2629 2590
2630 2591
2631 // --- Lists --- 2592 // --- Lists ---
2632 2593
2633 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) { 2594 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) {
2634 Isolate* isolate = Isolate::Current(); 2595 DARTSCOPE(Thread::Current());
2635 DARTSCOPE(isolate);
2636 CHECK_LENGTH(length, Array::kMaxElements); 2596 CHECK_LENGTH(length, Array::kMaxElements);
2637 CHECK_CALLBACK_STATE(isolate); 2597 CHECK_CALLBACK_STATE(I);
2638 return Api::NewHandle(isolate, Array::New(length)); 2598 return Api::NewHandle(I, Array::New(length));
2639 } 2599 }
2640 2600
2641 2601
2642 #define GET_LIST_LENGTH(isolate, type, obj, len) \ 2602 #define GET_LIST_LENGTH(zone, type, obj, len) \
2643 type& array = type::Handle(isolate); \ 2603 type& array = type::Handle(zone); \
2644 array ^= obj.raw(); \ 2604 array ^= obj.raw(); \
2645 *len = array.Length(); \ 2605 *len = array.Length(); \
2646 return Api::Success(); \ 2606 return Api::Success(); \
2647 2607
2648 2608
2649 DART_EXPORT Dart_Handle Dart_ListLength(Dart_Handle list, intptr_t* len) { 2609 DART_EXPORT Dart_Handle Dart_ListLength(Dart_Handle list, intptr_t* len) {
2650 Isolate* isolate = Isolate::Current(); 2610 DARTSCOPE(Thread::Current());
2651 DARTSCOPE(isolate); 2611 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(list));
2652 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list));
2653 if (obj.IsError()) { 2612 if (obj.IsError()) {
2654 // Pass through errors. 2613 // Pass through errors.
2655 return list; 2614 return list;
2656 } 2615 }
2657 if (obj.IsTypedData()) { 2616 if (obj.IsTypedData()) {
2658 GET_LIST_LENGTH(isolate, TypedData, obj, len); 2617 GET_LIST_LENGTH(Z, TypedData, obj, len);
2659 } 2618 }
2660 if (obj.IsArray()) { 2619 if (obj.IsArray()) {
2661 GET_LIST_LENGTH(isolate, Array, obj, len); 2620 GET_LIST_LENGTH(Z, Array, obj, len);
2662 } 2621 }
2663 if (obj.IsGrowableObjectArray()) { 2622 if (obj.IsGrowableObjectArray()) {
2664 GET_LIST_LENGTH(isolate, GrowableObjectArray, obj, len); 2623 GET_LIST_LENGTH(Z, GrowableObjectArray, obj, len);
2665 } 2624 }
2666 if (obj.IsExternalTypedData()) { 2625 if (obj.IsExternalTypedData()) {
2667 GET_LIST_LENGTH(isolate, ExternalTypedData, obj, len); 2626 GET_LIST_LENGTH(Z, ExternalTypedData, obj, len);
2668 } 2627 }
2669 CHECK_CALLBACK_STATE(isolate); 2628 CHECK_CALLBACK_STATE(I);
2670 2629
2671 // Now check and handle a dart object that implements the List interface. 2630 // Now check and handle a dart object that implements the List interface.
2672 const Instance& instance = 2631 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj));
2673 Instance::Handle(isolate, GetListInstance(isolate, obj));
2674 if (instance.IsNull()) { 2632 if (instance.IsNull()) {
2675 return Api::NewError("Object does not implement the List interface"); 2633 return Api::NewError("Object does not implement the List interface");
2676 } 2634 }
2677 const String& name = String::Handle(Field::GetterName(Symbols::Length())); 2635 const String& name = String::Handle(Z, Field::GetterName(Symbols::Length()));
2678 const int kNumArgs = 1; 2636 const int kNumArgs = 1;
2679 ArgumentsDescriptor args_desc( 2637 ArgumentsDescriptor args_desc(
2680 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); 2638 Array::Handle(Z, ArgumentsDescriptor::New(kNumArgs)));
2681 const Function& function = 2639 const Function& function =
2682 Function::Handle(isolate, Resolver::ResolveDynamic(instance, 2640 Function::Handle(Z, Resolver::ResolveDynamic(instance, name, args_desc));
2683 name,
2684 args_desc));
2685 if (function.IsNull()) { 2641 if (function.IsNull()) {
2686 return Api::NewError("List object does not have a 'length' field."); 2642 return Api::NewError("List object does not have a 'length' field.");
2687 } 2643 }
2688 2644
2689 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); 2645 const Array& args = Array::Handle(Z, Array::New(kNumArgs));
2690 args.SetAt(0, instance); // Set up the receiver as the first argument. 2646 args.SetAt(0, instance); // Set up the receiver as the first argument.
2691 const Object& retval = 2647 const Object& retval =
2692 Object::Handle(isolate, DartEntry::InvokeFunction(function, args)); 2648 Object::Handle(Z, DartEntry::InvokeFunction(function, args));
2693 if (retval.IsSmi()) { 2649 if (retval.IsSmi()) {
2694 *len = Smi::Cast(retval).Value(); 2650 *len = Smi::Cast(retval).Value();
2695 return Api::Success(); 2651 return Api::Success();
2696 } else if (retval.IsMint() || retval.IsBigint()) { 2652 } else if (retval.IsMint() || retval.IsBigint()) {
2697 if (retval.IsMint()) { 2653 if (retval.IsMint()) {
2698 int64_t mint_value = Mint::Cast(retval).value(); 2654 int64_t mint_value = Mint::Cast(retval).value();
2699 if (mint_value >= kIntptrMin && mint_value <= kIntptrMax) { 2655 if (mint_value >= kIntptrMin && mint_value <= kIntptrMax) {
2700 *len = static_cast<intptr_t>(mint_value); 2656 *len = static_cast<intptr_t>(mint_value);
2701 } 2657 }
2702 } else { 2658 } else {
2703 // Check for a non-canonical Mint range value. 2659 // Check for a non-canonical Mint range value.
2704 ASSERT(retval.IsBigint()); 2660 ASSERT(retval.IsBigint());
2705 const Bigint& bigint = Bigint::Handle(); 2661 const Bigint& bigint = Bigint::Handle();
2706 if (bigint.FitsIntoInt64()) { 2662 if (bigint.FitsIntoInt64()) {
2707 int64_t bigint_value = bigint.AsInt64Value(); 2663 int64_t bigint_value = bigint.AsInt64Value();
2708 if (bigint_value >= kIntptrMin && bigint_value <= kIntptrMax) { 2664 if (bigint_value >= kIntptrMin && bigint_value <= kIntptrMax) {
2709 *len = static_cast<intptr_t>(bigint_value); 2665 *len = static_cast<intptr_t>(bigint_value);
2710 } 2666 }
2711 } 2667 }
2712 } 2668 }
2713 return Api::NewError("Length of List object is greater than the " 2669 return Api::NewError("Length of List object is greater than the "
2714 "maximum value that 'len' parameter can hold"); 2670 "maximum value that 'len' parameter can hold");
2715 } else if (retval.IsError()) { 2671 } else if (retval.IsError()) {
2716 return Api::NewHandle(isolate, retval.raw()); 2672 return Api::NewHandle(I, retval.raw());
2717 } else { 2673 } else {
2718 return Api::NewError("Length of List object is not an integer"); 2674 return Api::NewError("Length of List object is not an integer");
2719 } 2675 }
2720 } 2676 }
2721 2677
2722 2678
2723 #define GET_LIST_ELEMENT(isolate, type, obj, index) \ 2679 #define GET_LIST_ELEMENT(isolate, type, obj, index) \
2724 const type& array_obj = type::Cast(obj); \ 2680 const type& array_obj = type::Cast(obj); \
2725 if ((index >= 0) && (index < array_obj.Length())) { \ 2681 if ((index >= 0) && (index < array_obj.Length())) { \
2726 return Api::NewHandle(isolate, array_obj.At(index)); \ 2682 return Api::NewHandle(isolate, array_obj.At(index)); \
2727 } \ 2683 } \
2728 return Api::NewError("Invalid index passed in to access list element"); \ 2684 return Api::NewError("Invalid index passed in to access list element"); \
2729 2685
2730 2686
2731 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) { 2687 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) {
2732 Isolate* isolate = Isolate::Current(); 2688 DARTSCOPE(Thread::Current());
2733 DARTSCOPE(isolate); 2689 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(list));
2734 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list));
2735 if (obj.IsArray()) { 2690 if (obj.IsArray()) {
2736 GET_LIST_ELEMENT(isolate, Array, obj, index); 2691 GET_LIST_ELEMENT(I, Array, obj, index);
2737 } else if (obj.IsGrowableObjectArray()) { 2692 } else if (obj.IsGrowableObjectArray()) {
2738 GET_LIST_ELEMENT(isolate, GrowableObjectArray, obj, index); 2693 GET_LIST_ELEMENT(I, GrowableObjectArray, obj, index);
2739 } else if (obj.IsError()) { 2694 } else if (obj.IsError()) {
2740 return list; 2695 return list;
2741 } else { 2696 } else {
2742 CHECK_CALLBACK_STATE(isolate); 2697 CHECK_CALLBACK_STATE(I);
2743 // Check and handle a dart object that implements the List interface. 2698 // Check and handle a dart object that implements the List interface.
2744 const Instance& instance = 2699 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj));
2745 Instance::Handle(isolate, GetListInstance(isolate, obj));
2746 if (!instance.IsNull()) { 2700 if (!instance.IsNull()) {
2747 return Api::NewHandle(isolate, Send1Arg( 2701 return Api::NewHandle(I, Send1Arg(
2748 instance, 2702 instance,
2749 Symbols::IndexToken(), 2703 Symbols::IndexToken(),
2750 Instance::Handle(isolate, Integer::New(index)))); 2704 Instance::Handle(Z, Integer::New(index))));
2751 } 2705 }
2752 return Api::NewError("Object does not implement the 'List' interface"); 2706 return Api::NewError("Object does not implement the 'List' interface");
2753 } 2707 }
2754 } 2708 }
2755 2709
2756 2710
2757 #define GET_LIST_RANGE(isolate, type, obj, offset, length) \ 2711 #define GET_LIST_RANGE(isolate, type, obj, offset, length) \
2758 const type& array_obj = type::Cast(obj); \ 2712 const type& array_obj = type::Cast(obj); \
2759 if ((offset >= 0) && (offset + length <= array_obj.Length())) { \ 2713 if ((offset >= 0) && (offset + length <= array_obj.Length())) { \
2760 for (intptr_t index = 0; index < length; ++index) { \ 2714 for (intptr_t index = 0; index < length; ++index) { \
2761 result[index] = Api::NewHandle(isolate, array_obj.At(index + offset)); \ 2715 result[index] = Api::NewHandle(isolate, array_obj.At(index + offset)); \
2762 } \ 2716 } \
2763 return Api::Success(); \ 2717 return Api::Success(); \
2764 } \ 2718 } \
2765 return Api::NewError("Invalid offset/length passed in to access list"); \ 2719 return Api::NewError("Invalid offset/length passed in to access list"); \
2766 2720
2767 2721
2768 DART_EXPORT Dart_Handle Dart_ListGetRange(Dart_Handle list, 2722 DART_EXPORT Dart_Handle Dart_ListGetRange(Dart_Handle list,
2769 intptr_t offset, 2723 intptr_t offset,
2770 intptr_t length, 2724 intptr_t length,
2771 Dart_Handle* result) { 2725 Dart_Handle* result) {
2772 Isolate* isolate = Isolate::Current(); 2726 DARTSCOPE(Thread::Current());
2773 DARTSCOPE(isolate);
2774 if (result == NULL) { 2727 if (result == NULL) {
2775 RETURN_NULL_ERROR(result); 2728 RETURN_NULL_ERROR(result);
2776 } 2729 }
2777 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list)); 2730 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(list));
2778 if (obj.IsArray()) { 2731 if (obj.IsArray()) {
2779 GET_LIST_RANGE(isolate, Array, obj, offset, length); 2732 GET_LIST_RANGE(I, Array, obj, offset, length);
2780 } else if (obj.IsGrowableObjectArray()) { 2733 } else if (obj.IsGrowableObjectArray()) {
2781 GET_LIST_RANGE(isolate, GrowableObjectArray, obj, offset, length); 2734 GET_LIST_RANGE(I, GrowableObjectArray, obj, offset, length);
2782 } else if (obj.IsError()) { 2735 } else if (obj.IsError()) {
2783 return list; 2736 return list;
2784 } else { 2737 } else {
2785 CHECK_CALLBACK_STATE(isolate); 2738 CHECK_CALLBACK_STATE(I);
2786 // Check and handle a dart object that implements the List interface. 2739 // Check and handle a dart object that implements the List interface.
2787 const Instance& instance = 2740 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj));
2788 Instance::Handle(isolate, GetListInstance(isolate, obj));
2789 if (!instance.IsNull()) { 2741 if (!instance.IsNull()) {
2790 const intptr_t kNumArgs = 2; 2742 const intptr_t kNumArgs = 2;
2791 ArgumentsDescriptor args_desc( 2743 ArgumentsDescriptor args_desc(
2792 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); 2744 Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
2793 const Function& function = Function::Handle( 2745 const Function& function = Function::Handle(Z,
2794 isolate,
2795 Resolver::ResolveDynamic(instance, 2746 Resolver::ResolveDynamic(instance,
2796 Symbols::AssignIndexToken(), 2747 Symbols::AssignIndexToken(),
2797 args_desc)); 2748 args_desc));
2798 if (!function.IsNull()) { 2749 if (!function.IsNull()) {
2799 const Array& args = Array::Handle(Array::New(kNumArgs)); 2750 const Array& args = Array::Handle(Array::New(kNumArgs));
2800 args.SetAt(0, instance); 2751 args.SetAt(0, instance);
2801 Instance& index = Instance::Handle(isolate); 2752 Instance& index = Instance::Handle(Z);
2802 for (intptr_t i = 0; i < length; ++i) { 2753 for (intptr_t i = 0; i < length; ++i) {
2803 index = Integer::New(i); 2754 index = Integer::New(i);
2804 args.SetAt(1, index); 2755 args.SetAt(1, index);
2805 Dart_Handle value = Api::NewHandle(isolate, 2756 Dart_Handle value = Api::NewHandle(I,
2806 DartEntry::InvokeFunction(function, args)); 2757 DartEntry::InvokeFunction(function, args));
2807 if (::Dart_IsError(value)) 2758 if (::Dart_IsError(value))
2808 return value; 2759 return value;
2809 result[i] = value; 2760 result[i] = value;
2810 } 2761 }
2811 return Api::Success(); 2762 return Api::Success();
2812 } 2763 }
2813 } 2764 }
2814 return Api::NewError("Object does not implement the 'List' interface"); 2765 return Api::NewError("Object does not implement the 'List' interface");
2815 } 2766 }
2816 } 2767 }
2817 2768
2818 2769
2819 #define SET_LIST_ELEMENT(isolate, type, obj, index, value) \ 2770 #define SET_LIST_ELEMENT(type, obj, index, value) \
2820 const type& array = type::Cast(obj); \ 2771 const type& array = type::Cast(obj); \
2821 const Object& value_obj = Object::Handle(isolate, Api::UnwrapHandle(value)); \ 2772 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); \
2822 if (!value_obj.IsNull() && !value_obj.IsInstance()) { \ 2773 if (!value_obj.IsNull() && !value_obj.IsInstance()) { \
2823 RETURN_TYPE_ERROR(isolate, value, Instance); \ 2774 RETURN_TYPE_ERROR(I, value, Instance); \
2824 } \ 2775 } \
2825 if ((index >= 0) && (index < array.Length())) { \ 2776 if ((index >= 0) && (index < array.Length())) { \
2826 array.SetAt(index, value_obj); \ 2777 array.SetAt(index, value_obj); \
2827 return Api::Success(); \ 2778 return Api::Success(); \
2828 } \ 2779 } \
2829 return Api::NewError("Invalid index passed in to set list element"); \ 2780 return Api::NewError("Invalid index passed in to set list element"); \
2830 2781
2831 2782
2832 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, 2783 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list,
2833 intptr_t index, 2784 intptr_t index,
2834 Dart_Handle value) { 2785 Dart_Handle value) {
2835 Isolate* isolate = Isolate::Current(); 2786 DARTSCOPE(Thread::Current());
2836 DARTSCOPE(isolate); 2787 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(list));
2837 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list));
2838 // If the list is immutable we call into Dart for the indexed setter to 2788 // If the list is immutable we call into Dart for the indexed setter to
2839 // get the unsupported operation exception as the result. 2789 // get the unsupported operation exception as the result.
2840 if (obj.IsArray() && !Array::Cast(obj).IsImmutable()) { 2790 if (obj.IsArray() && !Array::Cast(obj).IsImmutable()) {
2841 SET_LIST_ELEMENT(isolate, Array, obj, index, value); 2791 SET_LIST_ELEMENT(Array, obj, index, value);
2842 } else if (obj.IsGrowableObjectArray()) { 2792 } else if (obj.IsGrowableObjectArray()) {
2843 SET_LIST_ELEMENT(isolate, GrowableObjectArray, obj, index, value); 2793 SET_LIST_ELEMENT(GrowableObjectArray, obj, index, value);
2844 } else if (obj.IsError()) { 2794 } else if (obj.IsError()) {
2845 return list; 2795 return list;
2846 } else { 2796 } else {
2847 CHECK_CALLBACK_STATE(isolate); 2797 CHECK_CALLBACK_STATE(I);
2848 2798
2849 // Check and handle a dart object that implements the List interface. 2799 // Check and handle a dart object that implements the List interface.
2850 const Instance& instance = 2800 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj));
2851 Instance::Handle(isolate, GetListInstance(isolate, obj));
2852 if (!instance.IsNull()) { 2801 if (!instance.IsNull()) {
2853 const intptr_t kNumArgs = 3; 2802 const intptr_t kNumArgs = 3;
2854 ArgumentsDescriptor args_desc( 2803 ArgumentsDescriptor args_desc(
2855 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); 2804 Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
2856 const Function& function = Function::Handle( 2805 const Function& function = Function::Handle(Z,
2857 isolate,
2858 Resolver::ResolveDynamic(instance, 2806 Resolver::ResolveDynamic(instance,
2859 Symbols::AssignIndexToken(), 2807 Symbols::AssignIndexToken(),
2860 args_desc)); 2808 args_desc));
2861 if (!function.IsNull()) { 2809 if (!function.IsNull()) {
2862 const Integer& index_obj = 2810 const Integer& index_obj = Integer::Handle(Z, Integer::New(index));
2863 Integer::Handle(isolate, Integer::New(index)); 2811 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value));
2864 const Object& value_obj =
2865 Object::Handle(isolate, Api::UnwrapHandle(value));
2866 if (!value_obj.IsNull() && !value_obj.IsInstance()) { 2812 if (!value_obj.IsNull() && !value_obj.IsInstance()) {
2867 RETURN_TYPE_ERROR(isolate, value, Instance); 2813 RETURN_TYPE_ERROR(I, value, Instance);
2868 } 2814 }
2869 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); 2815 const Array& args = Array::Handle(Z, Array::New(kNumArgs));
2870 args.SetAt(0, instance); 2816 args.SetAt(0, instance);
2871 args.SetAt(1, index_obj); 2817 args.SetAt(1, index_obj);
2872 args.SetAt(2, value_obj); 2818 args.SetAt(2, value_obj);
2873 return Api::NewHandle(isolate, DartEntry::InvokeFunction(function, 2819 return Api::NewHandle(I, DartEntry::InvokeFunction(function,
2874 args)); 2820 args));
2875 } 2821 }
2876 } 2822 }
2877 return Api::NewError("Object does not implement the 'List' interface"); 2823 return Api::NewError("Object does not implement the 'List' interface");
2878 } 2824 }
2879 } 2825 }
2880 2826
2881 2827
2882 static RawObject* ResolveConstructor(const char* current_func, 2828 static RawObject* ResolveConstructor(const char* current_func,
2883 const Class& cls, 2829 const Class& cls,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
2946 state->UnwindScopes(isolate->top_exit_frame_info()); 2892 state->UnwindScopes(isolate->top_exit_frame_info());
2947 saved_exception = &Instance::Handle(raw_exception); 2893 saved_exception = &Instance::Handle(raw_exception);
2948 } 2894 }
2949 Exceptions::Throw(thread, *saved_exception); 2895 Exceptions::Throw(thread, *saved_exception);
2950 const String& message = String::Handle( 2896 const String& message = String::Handle(
2951 String::New("Exception was not thrown, internal error")); 2897 String::New("Exception was not thrown, internal error"));
2952 return ApiError::New(message); 2898 return ApiError::New(message);
2953 } 2899 }
2954 2900
2955 // TODO(sgjesse): value should always be smaller then 0xff. Add error handling. 2901 // TODO(sgjesse): value should always be smaller then 0xff. Add error handling.
2956 #define GET_LIST_ELEMENT_AS_BYTES(isolate, type, obj, native_array, offset, \ 2902 #define GET_LIST_ELEMENT_AS_BYTES(type, obj, native_array, offset, length) \
2957 length) \
2958 const type& array = type::Cast(obj); \ 2903 const type& array = type::Cast(obj); \
2959 if (Utils::RangeCheck(offset, length, array.Length())) { \ 2904 if (Utils::RangeCheck(offset, length, array.Length())) { \
2960 Object& element = Object::Handle(isolate); \ 2905 Object& element = Object::Handle(Z); \
2961 for (int i = 0; i < length; i++) { \ 2906 for (int i = 0; i < length; i++) { \
2962 element = array.At(offset + i); \ 2907 element = array.At(offset + i); \
2963 if (!element.IsInteger()) { \ 2908 if (!element.IsInteger()) { \
2964 return Api::NewHandle( \ 2909 return Api::NewHandle(I, \
2965 isolate, ThrowArgumentError("List contains non-int elements")); \ 2910 ThrowArgumentError("List contains non-int elements")); \
2966 \ 2911 \
2967 } \ 2912 } \
2968 const Integer& integer = Integer::Cast(element); \ 2913 const Integer& integer = Integer::Cast(element); \
2969 native_array[i] = static_cast<uint8_t>(integer.AsInt64Value() & 0xff); \ 2914 native_array[i] = static_cast<uint8_t>(integer.AsInt64Value() & 0xff); \
2970 ASSERT(integer.AsInt64Value() <= 0xff); \ 2915 ASSERT(integer.AsInt64Value() <= 0xff); \
2971 } \ 2916 } \
2972 return Api::Success(); \ 2917 return Api::Success(); \
2973 } \ 2918 } \
2974 return Api::NewError("Invalid length passed in to access array elements"); \ 2919 return Api::NewError("Invalid length passed in to access array elements"); \
2975 2920
2976 template<typename T> 2921 template<typename T>
2977 static Dart_Handle CopyBytes(const T& array, 2922 static Dart_Handle CopyBytes(const T& array,
2978 intptr_t offset, 2923 intptr_t offset,
2979 uint8_t* native_array, 2924 uint8_t* native_array,
2980 intptr_t length) { 2925 intptr_t length) {
2981 ASSERT(array.ElementSizeInBytes() == 1); 2926 ASSERT(array.ElementSizeInBytes() == 1);
2982 NoSafepointScope no_safepoint; 2927 NoSafepointScope no_safepoint;
2983 memmove(native_array, 2928 memmove(native_array,
2984 reinterpret_cast<uint8_t*>(array.DataAddr(offset)), 2929 reinterpret_cast<uint8_t*>(array.DataAddr(offset)),
2985 length); 2930 length);
2986 return Api::Success(); 2931 return Api::Success();
2987 } 2932 }
2988 2933
2989 2934
2990 DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list, 2935 DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list,
2991 intptr_t offset, 2936 intptr_t offset,
2992 uint8_t* native_array, 2937 uint8_t* native_array,
2993 intptr_t length) { 2938 intptr_t length) {
2994 Isolate* isolate = Isolate::Current(); 2939 DARTSCOPE(Thread::Current());
2995 DARTSCOPE(isolate); 2940 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(list));
2996 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list));
2997 if (obj.IsTypedData()) { 2941 if (obj.IsTypedData()) {
2998 const TypedData& array = TypedData::Cast(obj); 2942 const TypedData& array = TypedData::Cast(obj);
2999 if (array.ElementSizeInBytes() == 1) { 2943 if (array.ElementSizeInBytes() == 1) {
3000 if (!Utils::RangeCheck(offset, length, array.Length())) { 2944 if (!Utils::RangeCheck(offset, length, array.Length())) {
3001 return Api::NewError( 2945 return Api::NewError(
3002 "Invalid length passed in to access list elements"); 2946 "Invalid length passed in to access list elements");
3003 } 2947 }
3004 return CopyBytes(array, offset, native_array, length); 2948 return CopyBytes(array, offset, native_array, length);
3005 } 2949 }
3006 } 2950 }
(...skipping 22 matching lines...) Expand all
3029 intptr_t data_offset = 2973 intptr_t data_offset =
3030 Smi::Value(TypedDataView::OffsetInBytes(view)) + offset; 2974 Smi::Value(TypedDataView::OffsetInBytes(view)) + offset;
3031 // Range check already performed on the view object. 2975 // Range check already performed on the view object.
3032 ASSERT(Utils::RangeCheck(data_offset, length, array.Length())); 2976 ASSERT(Utils::RangeCheck(data_offset, length, array.Length()));
3033 return CopyBytes(array, data_offset, native_array, length); 2977 return CopyBytes(array, data_offset, native_array, length);
3034 } 2978 }
3035 } 2979 }
3036 } 2980 }
3037 } 2981 }
3038 if (obj.IsArray()) { 2982 if (obj.IsArray()) {
3039 GET_LIST_ELEMENT_AS_BYTES(isolate, 2983 GET_LIST_ELEMENT_AS_BYTES(Array, obj, native_array, offset, length);
3040 Array,
3041 obj,
3042 native_array,
3043 offset,
3044 length);
3045 } 2984 }
3046 if (obj.IsGrowableObjectArray()) { 2985 if (obj.IsGrowableObjectArray()) {
3047 GET_LIST_ELEMENT_AS_BYTES(isolate, 2986 GET_LIST_ELEMENT_AS_BYTES(
3048 GrowableObjectArray, 2987 GrowableObjectArray, obj, native_array, offset, length);
3049 obj,
3050 native_array,
3051 offset,
3052 length);
3053 } 2988 }
3054 if (obj.IsError()) { 2989 if (obj.IsError()) {
3055 return list; 2990 return list;
3056 } 2991 }
3057 CHECK_CALLBACK_STATE(isolate); 2992 CHECK_CALLBACK_STATE(I);
3058 2993
3059 // Check and handle a dart object that implements the List interface. 2994 // Check and handle a dart object that implements the List interface.
3060 const Instance& instance = 2995 const Instance& instance =
3061 Instance::Handle(isolate, GetListInstance(isolate, obj)); 2996 Instance::Handle(Z, GetListInstance(Z, obj));
3062 if (!instance.IsNull()) { 2997 if (!instance.IsNull()) {
3063 const int kNumArgs = 2; 2998 const int kNumArgs = 2;
3064 ArgumentsDescriptor args_desc( 2999 ArgumentsDescriptor args_desc(
3065 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); 3000 Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
3066 const Function& function = Function::Handle( 3001 const Function& function = Function::Handle(Z,
3067 isolate,
3068 Resolver::ResolveDynamic(instance, Symbols::IndexToken(), args_desc)); 3002 Resolver::ResolveDynamic(instance, Symbols::IndexToken(), args_desc));
3069 if (!function.IsNull()) { 3003 if (!function.IsNull()) {
3070 Object& result = Object::Handle(isolate); 3004 Object& result = Object::Handle(Z);
3071 Integer& intobj = Integer::Handle(isolate); 3005 Integer& intobj = Integer::Handle(Z);
3072 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); 3006 const Array& args = Array::Handle(Z, Array::New(kNumArgs));
3073 args.SetAt(0, instance); // Set up the receiver as the first argument. 3007 args.SetAt(0, instance); // Set up the receiver as the first argument.
3074 for (int i = 0; i < length; i++) { 3008 for (int i = 0; i < length; i++) {
3075 HANDLESCOPE(isolate); 3009 HANDLESCOPE(T);
3076 intobj = Integer::New(offset + i); 3010 intobj = Integer::New(offset + i);
3077 args.SetAt(1, intobj); 3011 args.SetAt(1, intobj);
3078 result = DartEntry::InvokeFunction(function, args); 3012 result = DartEntry::InvokeFunction(function, args);
3079 if (result.IsError()) { 3013 if (result.IsError()) {
3080 return Api::NewHandle(isolate, result.raw()); 3014 return Api::NewHandle(I, result.raw());
3081 } 3015 }
3082 if (!result.IsInteger()) { 3016 if (!result.IsInteger()) {
3083 return Api::NewError("%s expects the argument 'list' to be " 3017 return Api::NewError("%s expects the argument 'list' to be "
3084 "a List of int", CURRENT_FUNC); 3018 "a List of int", CURRENT_FUNC);
3085 } 3019 }
3086 const Integer& integer_result = Integer::Cast(result); 3020 const Integer& integer_result = Integer::Cast(result);
3087 ASSERT(integer_result.AsInt64Value() <= 0xff); 3021 ASSERT(integer_result.AsInt64Value() <= 0xff);
3088 // TODO(hpayer): value should always be smaller then 0xff. Add error 3022 // TODO(hpayer): value should always be smaller then 0xff. Add error
3089 // handling. 3023 // handling.
3090 native_array[i] = 3024 native_array[i] =
3091 static_cast<uint8_t>(integer_result.AsInt64Value() & 0xff); 3025 static_cast<uint8_t>(integer_result.AsInt64Value() & 0xff);
3092 } 3026 }
3093 return Api::Success(); 3027 return Api::Success();
3094 } 3028 }
3095 } 3029 }
3096 return Api::NewError("Object does not implement the 'List' interface"); 3030 return Api::NewError("Object does not implement the 'List' interface");
3097 } 3031 }
3098 3032
3099 3033
3100 #define SET_LIST_ELEMENT_AS_BYTES(isolate, type, obj, native_array, offset, \ 3034 #define SET_LIST_ELEMENT_AS_BYTES(type, obj, native_array, offset, length) \
3101 length) \
3102 const type& array = type::Cast(obj); \ 3035 const type& array = type::Cast(obj); \
3103 Integer& integer = Integer::Handle(isolate); \ 3036 Integer& integer = Integer::Handle(Z); \
3104 if (Utils::RangeCheck(offset, length, array.Length())) { \ 3037 if (Utils::RangeCheck(offset, length, array.Length())) { \
3105 for (int i = 0; i < length; i++) { \ 3038 for (int i = 0; i < length; i++) { \
3106 integer = Integer::New(native_array[i]); \ 3039 integer = Integer::New(native_array[i]); \
3107 array.SetAt(offset + i, integer); \ 3040 array.SetAt(offset + i, integer); \
3108 } \ 3041 } \
3109 return Api::Success(); \ 3042 return Api::Success(); \
3110 } \ 3043 } \
3111 return Api::NewError("Invalid length passed in to set array elements"); \ 3044 return Api::NewError("Invalid length passed in to set array elements"); \
3112 3045
3113 3046
3114 DART_EXPORT Dart_Handle Dart_ListSetAsBytes(Dart_Handle list, 3047 DART_EXPORT Dart_Handle Dart_ListSetAsBytes(Dart_Handle list,
3115 intptr_t offset, 3048 intptr_t offset,
3116 uint8_t* native_array, 3049 uint8_t* native_array,
3117 intptr_t length) { 3050 intptr_t length) {
3118 Isolate* isolate = Isolate::Current(); 3051 DARTSCOPE(Thread::Current());
3119 DARTSCOPE(isolate); 3052 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(list));
3120 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list));
3121 if (obj.IsTypedData()) { 3053 if (obj.IsTypedData()) {
3122 const TypedData& array = TypedData::Cast(obj); 3054 const TypedData& array = TypedData::Cast(obj);
3123 if (array.ElementSizeInBytes() == 1) { 3055 if (array.ElementSizeInBytes() == 1) {
3124 if (Utils::RangeCheck(offset, length, array.Length())) { 3056 if (Utils::RangeCheck(offset, length, array.Length())) {
3125 NoSafepointScope no_safepoint; 3057 NoSafepointScope no_safepoint;
3126 memmove(reinterpret_cast<uint8_t*>(array.DataAddr(offset)), 3058 memmove(reinterpret_cast<uint8_t*>(array.DataAddr(offset)),
3127 native_array, 3059 native_array,
3128 length); 3060 length);
3129 return Api::Success(); 3061 return Api::Success();
3130 } 3062 }
3131 return Api::NewError("Invalid length passed in to access list elements"); 3063 return Api::NewError("Invalid length passed in to access list elements");
3132 } 3064 }
3133 } 3065 }
3134 if (obj.IsArray() && !Array::Cast(obj).IsImmutable()) { 3066 if (obj.IsArray() && !Array::Cast(obj).IsImmutable()) {
3135 // If the list is immutable we call into Dart for the indexed setter to 3067 // If the list is immutable we call into Dart for the indexed setter to
3136 // get the unsupported operation exception as the result. 3068 // get the unsupported operation exception as the result.
3137 SET_LIST_ELEMENT_AS_BYTES(isolate, 3069 SET_LIST_ELEMENT_AS_BYTES(Array, obj, native_array, offset, length);
3138 Array,
3139 obj,
3140 native_array,
3141 offset,
3142 length);
3143 } 3070 }
3144 if (obj.IsGrowableObjectArray()) { 3071 if (obj.IsGrowableObjectArray()) {
3145 SET_LIST_ELEMENT_AS_BYTES(isolate, 3072 SET_LIST_ELEMENT_AS_BYTES(
3146 GrowableObjectArray, 3073 GrowableObjectArray, obj, native_array, offset, length);
3147 obj,
3148 native_array,
3149 offset,
3150 length);
3151 } 3074 }
3152 if (obj.IsError()) { 3075 if (obj.IsError()) {
3153 return list; 3076 return list;
3154 } 3077 }
3155 CHECK_CALLBACK_STATE(isolate); 3078 CHECK_CALLBACK_STATE(I);
3156 3079
3157 // Check and handle a dart object that implements the List interface. 3080 // Check and handle a dart object that implements the List interface.
3158 const Instance& instance = 3081 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj));
3159 Instance::Handle(isolate, GetListInstance(isolate, obj));
3160 if (!instance.IsNull()) { 3082 if (!instance.IsNull()) {
3161 const int kNumArgs = 3; 3083 const int kNumArgs = 3;
3162 ArgumentsDescriptor args_desc( 3084 ArgumentsDescriptor args_desc(
3163 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); 3085 Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
3164 const Function& function = Function::Handle( 3086 const Function& function = Function::Handle(Z,
3165 isolate,
3166 Resolver::ResolveDynamic(instance, 3087 Resolver::ResolveDynamic(instance,
3167 Symbols::AssignIndexToken(), 3088 Symbols::AssignIndexToken(),
3168 args_desc)); 3089 args_desc));
3169 if (!function.IsNull()) { 3090 if (!function.IsNull()) {
3170 Integer& indexobj = Integer::Handle(isolate); 3091 Integer& indexobj = Integer::Handle(Z);
3171 Integer& valueobj = Integer::Handle(isolate); 3092 Integer& valueobj = Integer::Handle(Z);
3172 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); 3093 const Array& args = Array::Handle(Z, Array::New(kNumArgs));
3173 args.SetAt(0, instance); // Set up the receiver as the first argument. 3094 args.SetAt(0, instance); // Set up the receiver as the first argument.
3174 for (int i = 0; i < length; i++) { 3095 for (int i = 0; i < length; i++) {
3175 indexobj = Integer::New(offset + i); 3096 indexobj = Integer::New(offset + i);
3176 valueobj = Integer::New(native_array[i]); 3097 valueobj = Integer::New(native_array[i]);
3177 args.SetAt(1, indexobj); 3098 args.SetAt(1, indexobj);
3178 args.SetAt(2, valueobj); 3099 args.SetAt(2, valueobj);
3179 const Object& result = Object::Handle( 3100 const Object& result = Object::Handle(Z,
3180 isolate, DartEntry::InvokeFunction(function, args)); 3101 DartEntry::InvokeFunction(function, args));
3181 if (result.IsError()) { 3102 if (result.IsError()) {
3182 return Api::NewHandle(isolate, result.raw()); 3103 return Api::NewHandle(I, result.raw());
3183 } 3104 }
3184 } 3105 }
3185 return Api::Success(); 3106 return Api::Success();
3186 } 3107 }
3187 } 3108 }
3188 return Api::NewError("Object does not implement the 'List' interface"); 3109 return Api::NewError("Object does not implement the 'List' interface");
3189 } 3110 }
3190 3111
3191 3112
3192 // --- Maps --- 3113 // --- Maps ---
3193 3114
3194 DART_EXPORT Dart_Handle Dart_MapGetAt(Dart_Handle map, Dart_Handle key) { 3115 DART_EXPORT Dart_Handle Dart_MapGetAt(Dart_Handle map, Dart_Handle key) {
3195 Isolate* isolate = Isolate::Current(); 3116 DARTSCOPE(Thread::Current());
3196 DARTSCOPE(isolate); 3117 CHECK_CALLBACK_STATE(I);
3197 CHECK_CALLBACK_STATE(isolate); 3118 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(map));
3198 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(map)); 3119 const Instance& instance = Instance::Handle(Z, GetMapInstance(Z, obj));
3199 const Instance& instance =
3200 Instance::Handle(isolate, GetMapInstance(isolate, obj));
3201 if (!instance.IsNull()) { 3120 if (!instance.IsNull()) {
3202 const Object& key_obj = Object::Handle(Api::UnwrapHandle(key)); 3121 const Object& key_obj = Object::Handle(Api::UnwrapHandle(key));
3203 if (!(key_obj.IsInstance() || key_obj.IsNull())) { 3122 if (!(key_obj.IsInstance() || key_obj.IsNull())) {
3204 return Api::NewError("Key is not an instance"); 3123 return Api::NewError("Key is not an instance");
3205 } 3124 }
3206 return Api::NewHandle(isolate, Send1Arg( 3125 return Api::NewHandle(I,
3207 instance, 3126 Send1Arg(instance, Symbols::IndexToken(), Instance::Cast(key_obj)));
3208 Symbols::IndexToken(),
3209 Instance::Cast(key_obj)));
3210 } 3127 }
3211 return Api::NewError("Object does not implement the 'Map' interface"); 3128 return Api::NewError("Object does not implement the 'Map' interface");
3212 } 3129 }
3213 3130
3214 3131
3215 DART_EXPORT Dart_Handle Dart_MapContainsKey(Dart_Handle map, Dart_Handle key) { 3132 DART_EXPORT Dart_Handle Dart_MapContainsKey(Dart_Handle map, Dart_Handle key) {
3216 Isolate* isolate = Isolate::Current(); 3133 DARTSCOPE(Thread::Current());
3217 DARTSCOPE(isolate); 3134 CHECK_CALLBACK_STATE(I);
3218 CHECK_CALLBACK_STATE(isolate); 3135 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(map));
3219 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(map)); 3136 const Instance& instance = Instance::Handle(Z, GetMapInstance(Z, obj));
3220 const Instance& instance =
3221 Instance::Handle(isolate, GetMapInstance(isolate, obj));
3222 if (!instance.IsNull()) { 3137 if (!instance.IsNull()) {
3223 const Object& key_obj = Object::Handle(Api::UnwrapHandle(key)); 3138 const Object& key_obj = Object::Handle(Z, Api::UnwrapHandle(key));
3224 if (!(key_obj.IsInstance() || key_obj.IsNull())) { 3139 if (!(key_obj.IsInstance() || key_obj.IsNull())) {
3225 return Api::NewError("Key is not an instance"); 3140 return Api::NewError("Key is not an instance");
3226 } 3141 }
3227 return Api::NewHandle(isolate, Send1Arg( 3142 return Api::NewHandle(I, Send1Arg(
3228 instance, 3143 instance,
3229 String::Handle(isolate, String::New("containsKey")), 3144 String::Handle(Z, String::New("containsKey")),
3230 Instance::Cast(key_obj))); 3145 Instance::Cast(key_obj)));
3231 } 3146 }
3232 return Api::NewError("Object does not implement the 'Map' interface"); 3147 return Api::NewError("Object does not implement the 'Map' interface");
3233 } 3148 }
3234 3149
3235 3150
3236 DART_EXPORT Dart_Handle Dart_MapKeys(Dart_Handle map) { 3151 DART_EXPORT Dart_Handle Dart_MapKeys(Dart_Handle map) {
3237 Isolate* isolate = Isolate::Current(); 3152 DARTSCOPE(Thread::Current());
3238 DARTSCOPE(isolate); 3153 CHECK_CALLBACK_STATE(I);
3239 CHECK_CALLBACK_STATE(isolate); 3154 Object& obj = Object::Handle(Z, Api::UnwrapHandle(map));
3240 Object& obj = Object::Handle(isolate, Api::UnwrapHandle(map)); 3155 Instance& instance = Instance::Handle(Z, GetMapInstance(Z, obj));
3241 Instance& instance =
3242 Instance::Handle(isolate, GetMapInstance(isolate, obj));
3243 if (!instance.IsNull()) { 3156 if (!instance.IsNull()) {
3244 const Object& iterator = Object::Handle(Send0Arg( 3157 const Object& iterator = Object::Handle(Send0Arg(
3245 instance, String::Handle(String::New("get:keys")))); 3158 instance, String::Handle(Z, String::New("get:keys"))));
3246 if (!iterator.IsInstance()) { 3159 if (!iterator.IsInstance()) {
3247 return Api::NewHandle(isolate, iterator.raw()); 3160 return Api::NewHandle(I, iterator.raw());
3248 } 3161 }
3249 return Api::NewHandle(isolate, Send0Arg( 3162 return Api::NewHandle(I, Send0Arg(
3250 Instance::Cast(iterator), 3163 Instance::Cast(iterator),
3251 String::Handle(String::New("toList")))); 3164 String::Handle(String::New("toList"))));
3252 } 3165 }
3253 return Api::NewError("Object does not implement the 'Map' interface"); 3166 return Api::NewError("Object does not implement the 'Map' interface");
3254 } 3167 }
3255 3168
3256 3169
3257 // --- Typed Data --- 3170 // --- Typed Data ---
3258 3171
3259 // Helper method to get the type of a TypedData object. 3172 // Helper method to get the type of a TypedData object.
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
3455 3368
3456 // Invoke the constructor and return the new object. 3369 // Invoke the constructor and return the new object.
3457 result = DartEntry::InvokeFunction(factory, args); 3370 result = DartEntry::InvokeFunction(factory, args);
3458 ASSERT(result.IsNull() || result.IsInstance() || result.IsError()); 3371 ASSERT(result.IsNull() || result.IsInstance() || result.IsError());
3459 return Api::NewHandle(isolate, result.raw()); 3372 return Api::NewHandle(isolate, result.raw());
3460 } 3373 }
3461 3374
3462 3375
3463 DART_EXPORT Dart_Handle Dart_NewTypedData(Dart_TypedData_Type type, 3376 DART_EXPORT Dart_Handle Dart_NewTypedData(Dart_TypedData_Type type,
3464 intptr_t length) { 3377 intptr_t length) {
3465 Isolate* isolate = Isolate::Current(); 3378 DARTSCOPE(Thread::Current());
3466 DARTSCOPE(isolate); 3379 CHECK_CALLBACK_STATE(I);
3467 CHECK_CALLBACK_STATE(isolate);
3468 switch (type) { 3380 switch (type) {
3469 case Dart_TypedData_kByteData : 3381 case Dart_TypedData_kByteData :
3470 return NewByteData(isolate, length); 3382 return NewByteData(I, length);
3471 case Dart_TypedData_kInt8 : 3383 case Dart_TypedData_kInt8 :
3472 return NewTypedData(isolate, kTypedDataInt8ArrayCid, length); 3384 return NewTypedData(I, kTypedDataInt8ArrayCid, length);
3473 case Dart_TypedData_kUint8 : 3385 case Dart_TypedData_kUint8 :
3474 return NewTypedData(isolate, kTypedDataUint8ArrayCid, length); 3386 return NewTypedData(I, kTypedDataUint8ArrayCid, length);
3475 case Dart_TypedData_kUint8Clamped : 3387 case Dart_TypedData_kUint8Clamped :
3476 return NewTypedData(isolate, kTypedDataUint8ClampedArrayCid, length); 3388 return NewTypedData(I, kTypedDataUint8ClampedArrayCid, length);
3477 case Dart_TypedData_kInt16 : 3389 case Dart_TypedData_kInt16 :
3478 return NewTypedData(isolate, kTypedDataInt16ArrayCid, length); 3390 return NewTypedData(I, kTypedDataInt16ArrayCid, length);
3479 case Dart_TypedData_kUint16 : 3391 case Dart_TypedData_kUint16 :
3480 return NewTypedData(isolate, kTypedDataUint16ArrayCid, length); 3392 return NewTypedData(I, kTypedDataUint16ArrayCid, length);
3481 case Dart_TypedData_kInt32 : 3393 case Dart_TypedData_kInt32 :
3482 return NewTypedData(isolate, kTypedDataInt32ArrayCid, length); 3394 return NewTypedData(I, kTypedDataInt32ArrayCid, length);
3483 case Dart_TypedData_kUint32 : 3395 case Dart_TypedData_kUint32 :
3484 return NewTypedData(isolate, kTypedDataUint32ArrayCid, length); 3396 return NewTypedData(I, kTypedDataUint32ArrayCid, length);
3485 case Dart_TypedData_kInt64 : 3397 case Dart_TypedData_kInt64 :
3486 return NewTypedData(isolate, kTypedDataInt64ArrayCid, length); 3398 return NewTypedData(I, kTypedDataInt64ArrayCid, length);
3487 case Dart_TypedData_kUint64 : 3399 case Dart_TypedData_kUint64 :
3488 return NewTypedData(isolate, kTypedDataUint64ArrayCid, length); 3400 return NewTypedData(I, kTypedDataUint64ArrayCid, length);
3489 case Dart_TypedData_kFloat32 : 3401 case Dart_TypedData_kFloat32 :
3490 return NewTypedData(isolate, kTypedDataFloat32ArrayCid, length); 3402 return NewTypedData(I, kTypedDataFloat32ArrayCid, length);
3491 case Dart_TypedData_kFloat64 : 3403 case Dart_TypedData_kFloat64 :
3492 return NewTypedData(isolate, kTypedDataFloat64ArrayCid, length); 3404 return NewTypedData(I, kTypedDataFloat64ArrayCid, length);
3493 case Dart_TypedData_kFloat32x4: 3405 case Dart_TypedData_kFloat32x4:
3494 return NewTypedData(isolate, kTypedDataFloat32x4ArrayCid, length); 3406 return NewTypedData(I, kTypedDataFloat32x4ArrayCid, length);
3495 default: 3407 default:
3496 return Api::NewError("%s expects argument 'type' to be of 'TypedData'", 3408 return Api::NewError("%s expects argument 'type' to be of 'TypedData'",
3497 CURRENT_FUNC); 3409 CURRENT_FUNC);
3498 } 3410 }
3499 UNREACHABLE(); 3411 UNREACHABLE();
3500 return Api::Null(); 3412 return Api::Null();
3501 } 3413 }
3502 3414
3503 3415
3504 DART_EXPORT Dart_Handle Dart_NewExternalTypedData( 3416 DART_EXPORT Dart_Handle Dart_NewExternalTypedData(
3505 Dart_TypedData_Type type, 3417 Dart_TypedData_Type type,
3506 void* data, 3418 void* data,
3507 intptr_t length) { 3419 intptr_t length) {
3508 Isolate* isolate = Isolate::Current(); 3420 DARTSCOPE(Thread::Current());
3509 DARTSCOPE(isolate);
3510 if (data == NULL && length != 0) { 3421 if (data == NULL && length != 0) {
3511 RETURN_NULL_ERROR(data); 3422 RETURN_NULL_ERROR(data);
3512 } 3423 }
3513 CHECK_CALLBACK_STATE(isolate); 3424 CHECK_CALLBACK_STATE(I);
3514 switch (type) { 3425 switch (type) {
3515 case Dart_TypedData_kByteData: 3426 case Dart_TypedData_kByteData:
3516 return NewExternalByteData(isolate, data, length); 3427 return NewExternalByteData(I, data, length);
3517 case Dart_TypedData_kInt8: 3428 case Dart_TypedData_kInt8:
3518 return NewExternalTypedData(isolate, 3429 return NewExternalTypedData(I,
3519 kExternalTypedDataInt8ArrayCid, 3430 kExternalTypedDataInt8ArrayCid, data, length);
3520 data,
3521 length);
3522 case Dart_TypedData_kUint8: 3431 case Dart_TypedData_kUint8:
3523 return NewExternalTypedData(isolate, 3432 return NewExternalTypedData(I,
3524 kExternalTypedDataUint8ArrayCid, 3433 kExternalTypedDataUint8ArrayCid, data, length);
3525 data,
3526 length);
3527 case Dart_TypedData_kUint8Clamped: 3434 case Dart_TypedData_kUint8Clamped:
3528 return NewExternalTypedData(isolate, 3435 return NewExternalTypedData(I,
3529 kExternalTypedDataUint8ClampedArrayCid, 3436 kExternalTypedDataUint8ClampedArrayCid, data, length);
3530 data,
3531 length);
3532 case Dart_TypedData_kInt16: 3437 case Dart_TypedData_kInt16:
3533 return NewExternalTypedData(isolate, 3438 return NewExternalTypedData(I,
3534 kExternalTypedDataInt16ArrayCid, 3439 kExternalTypedDataInt16ArrayCid, data, length);
3535 data,
3536 length);
3537 case Dart_TypedData_kUint16: 3440 case Dart_TypedData_kUint16:
3538 return NewExternalTypedData(isolate, 3441 return NewExternalTypedData(I,
3539 kExternalTypedDataUint16ArrayCid, 3442 kExternalTypedDataUint16ArrayCid, data, length);
3540 data,
3541 length);
3542 case Dart_TypedData_kInt32: 3443 case Dart_TypedData_kInt32:
3543 return NewExternalTypedData(isolate, 3444 return NewExternalTypedData(I,
3544 kExternalTypedDataInt32ArrayCid, 3445 kExternalTypedDataInt32ArrayCid, data, length);
3545 data,
3546 length);
3547 case Dart_TypedData_kUint32: 3446 case Dart_TypedData_kUint32:
3548 return NewExternalTypedData(isolate, 3447 return NewExternalTypedData(I,
3549 kExternalTypedDataUint32ArrayCid, 3448 kExternalTypedDataUint32ArrayCid, data, length);
3550 data,
3551 length);
3552 case Dart_TypedData_kInt64: 3449 case Dart_TypedData_kInt64:
3553 return NewExternalTypedData(isolate, 3450 return NewExternalTypedData(I,
3554 kExternalTypedDataInt64ArrayCid, 3451 kExternalTypedDataInt64ArrayCid, data, length);
3555 data,
3556 length);
3557 case Dart_TypedData_kUint64: 3452 case Dart_TypedData_kUint64:
3558 return NewExternalTypedData(isolate, 3453 return NewExternalTypedData(I,
3559 kExternalTypedDataUint64ArrayCid, 3454 kExternalTypedDataUint64ArrayCid, data, length);
3560 data,
3561 length);
3562 case Dart_TypedData_kFloat32: 3455 case Dart_TypedData_kFloat32:
3563 return NewExternalTypedData(isolate, 3456 return NewExternalTypedData(I,
3564 kExternalTypedDataFloat32ArrayCid, 3457 kExternalTypedDataFloat32ArrayCid, data, length);
3565 data,
3566 length);
3567 case Dart_TypedData_kFloat64: 3458 case Dart_TypedData_kFloat64:
3568 return NewExternalTypedData(isolate, 3459 return NewExternalTypedData(I,
3569 kExternalTypedDataFloat64ArrayCid, 3460 kExternalTypedDataFloat64ArrayCid, data, length);
3570 data,
3571 length);
3572 case Dart_TypedData_kFloat32x4: 3461 case Dart_TypedData_kFloat32x4:
3573 return NewExternalTypedData(isolate, 3462 return NewExternalTypedData(I,
3574 kExternalTypedDataFloat32x4ArrayCid, 3463 kExternalTypedDataFloat32x4ArrayCid, data, length);
3575 data,
3576 length);
3577 default: 3464 default:
3578 return Api::NewError("%s expects argument 'type' to be of" 3465 return Api::NewError("%s expects argument 'type' to be of"
3579 " 'external TypedData'", CURRENT_FUNC); 3466 " 'external TypedData'", CURRENT_FUNC);
3580 } 3467 }
3581 UNREACHABLE(); 3468 UNREACHABLE();
3582 return Api::Null(); 3469 return Api::Null();
3583 } 3470 }
3584 3471
3585 3472
3586 static RawObject* GetByteBufferConstructor(Isolate* isolate, 3473 static RawObject* GetByteBufferConstructor(Isolate* isolate,
3587 const String& class_name, 3474 const String& class_name,
3588 const String& constructor_name, 3475 const String& constructor_name,
3589 intptr_t num_args) { 3476 intptr_t num_args) {
3590 const Library& lib = 3477 const Library& lib =
3591 Library::Handle(isolate->object_store()->typed_data_library()); 3478 Library::Handle(isolate->object_store()->typed_data_library());
3592 ASSERT(!lib.IsNull()); 3479 ASSERT(!lib.IsNull());
3593 const Class& cls = Class::Handle( 3480 const Class& cls = Class::Handle(
3594 isolate, lib.LookupClassAllowPrivate(class_name)); 3481 isolate, lib.LookupClassAllowPrivate(class_name));
3595 ASSERT(!cls.IsNull()); 3482 ASSERT(!cls.IsNull());
3596 return ResolveConstructor(CURRENT_FUNC, 3483 return ResolveConstructor(CURRENT_FUNC,
3597 cls, 3484 cls,
3598 class_name, 3485 class_name,
3599 constructor_name, 3486 constructor_name,
3600 num_args); 3487 num_args);
3601 } 3488 }
3602 3489
3603 3490
3604 DART_EXPORT Dart_Handle Dart_NewByteBuffer(Dart_Handle typed_data) { 3491 DART_EXPORT Dart_Handle Dart_NewByteBuffer(Dart_Handle typed_data) {
3605 Isolate* isolate = Isolate::Current(); 3492 DARTSCOPE(Thread::Current());
3606 DARTSCOPE(isolate);
3607 intptr_t class_id = Api::ClassId(typed_data); 3493 intptr_t class_id = Api::ClassId(typed_data);
3608 if (!RawObject::IsExternalTypedDataClassId(class_id) && 3494 if (!RawObject::IsExternalTypedDataClassId(class_id) &&
3609 !RawObject::IsTypedDataViewClassId(class_id) && 3495 !RawObject::IsTypedDataViewClassId(class_id) &&
3610 !RawObject::IsTypedDataClassId(class_id)) { 3496 !RawObject::IsTypedDataClassId(class_id)) {
3611 RETURN_TYPE_ERROR(isolate, typed_data, 'TypedData'); 3497 RETURN_TYPE_ERROR(I, typed_data, 'TypedData');
3612 } 3498 }
3613 Object& result = Object::Handle(isolate); 3499 Object& result = Object::Handle(Z);
3614 result = GetByteBufferConstructor(isolate, 3500 result = GetByteBufferConstructor(I,
3615 Symbols::_ByteBuffer(), 3501 Symbols::_ByteBuffer(),
3616 Symbols::_ByteBufferDot_New(), 3502 Symbols::_ByteBufferDot_New(),
3617 1); 3503 1);
3618 ASSERT(!result.IsNull()); 3504 ASSERT(!result.IsNull());
3619 ASSERT(result.IsFunction()); 3505 ASSERT(result.IsFunction());
3620 const Function& factory = Function::Cast(result); 3506 const Function& factory = Function::Cast(result);
3621 ASSERT(!factory.IsGenerativeConstructor()); 3507 ASSERT(!factory.IsGenerativeConstructor());
3622 3508
3623 // Create the argument list. 3509 // Create the argument list.
3624 const Array& args = Array::Handle(isolate, Array::New(2)); 3510 const Array& args = Array::Handle(Z, Array::New(2));
3625 // Factories get type arguments. 3511 // Factories get type arguments.
3626 args.SetAt(0, Object::null_type_arguments()); 3512 args.SetAt(0, Object::null_type_arguments());
3627 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(typed_data)); 3513 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(typed_data));
3628 args.SetAt(1, obj); 3514 args.SetAt(1, obj);
3629 3515
3630 // Invoke the factory constructor and return the new object. 3516 // Invoke the factory constructor and return the new object.
3631 result = DartEntry::InvokeFunction(factory, args); 3517 result = DartEntry::InvokeFunction(factory, args);
3632 ASSERT(result.IsInstance() || result.IsNull() || result.IsError()); 3518 ASSERT(result.IsInstance() || result.IsNull() || result.IsError());
3633 return Api::NewHandle(isolate, result.raw()); 3519 return Api::NewHandle(I, result.raw());
3634 } 3520 }
3635 3521
3636 3522
3637 // Structure to record acquired typed data for verification purposes. 3523 // Structure to record acquired typed data for verification purposes.
3638 class AcquiredData { 3524 class AcquiredData {
3639 public: 3525 public:
3640 AcquiredData(void* data, intptr_t size_in_bytes, bool copy) 3526 AcquiredData(void* data, intptr_t size_in_bytes, bool copy)
3641 : size_in_bytes_(size_in_bytes), data_(data), data_copy_(NULL) { 3527 : size_in_bytes_(size_in_bytes), data_(data), data_copy_(NULL) {
3642 if (copy) { 3528 if (copy) {
3643 data_copy_ = malloc(size_in_bytes_); 3529 data_copy_ = malloc(size_in_bytes_);
(...skipping 20 matching lines...) Expand all
3664 void* data_copy_; 3550 void* data_copy_;
3665 3551
3666 DISALLOW_COPY_AND_ASSIGN(AcquiredData); 3552 DISALLOW_COPY_AND_ASSIGN(AcquiredData);
3667 }; 3553 };
3668 3554
3669 3555
3670 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, 3556 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object,
3671 Dart_TypedData_Type* type, 3557 Dart_TypedData_Type* type,
3672 void** data, 3558 void** data,
3673 intptr_t* len) { 3559 intptr_t* len) {
3674 Thread* thread = Thread::Current(); 3560 DARTSCOPE(Thread::Current());
3675 Isolate* isolate = thread->isolate();
3676 DARTSCOPE(isolate);
3677 intptr_t class_id = Api::ClassId(object); 3561 intptr_t class_id = Api::ClassId(object);
3678 if (!RawObject::IsExternalTypedDataClassId(class_id) && 3562 if (!RawObject::IsExternalTypedDataClassId(class_id) &&
3679 !RawObject::IsTypedDataViewClassId(class_id) && 3563 !RawObject::IsTypedDataViewClassId(class_id) &&
3680 !RawObject::IsTypedDataClassId(class_id)) { 3564 !RawObject::IsTypedDataClassId(class_id)) {
3681 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); 3565 RETURN_TYPE_ERROR(I, object, 'TypedData');
3682 } 3566 }
3683 if (type == NULL) { 3567 if (type == NULL) {
3684 RETURN_NULL_ERROR(type); 3568 RETURN_NULL_ERROR(type);
3685 } 3569 }
3686 if (data == NULL) { 3570 if (data == NULL) {
3687 RETURN_NULL_ERROR(data); 3571 RETURN_NULL_ERROR(data);
3688 } 3572 }
3689 if (len == NULL) { 3573 if (len == NULL) {
3690 RETURN_NULL_ERROR(len); 3574 RETURN_NULL_ERROR(len);
3691 } 3575 }
3692 // Get the type of typed data object. 3576 // Get the type of typed data object.
3693 *type = GetType(class_id); 3577 *type = GetType(class_id);
3694 intptr_t length = 0; 3578 intptr_t length = 0;
3695 intptr_t size_in_bytes = 0; 3579 intptr_t size_in_bytes = 0;
3696 void* data_tmp = NULL; 3580 void* data_tmp = NULL;
3697 bool external = false; 3581 bool external = false;
3698 // If it is an external typed data object just return the data field. 3582 // If it is an external typed data object just return the data field.
3699 if (RawObject::IsExternalTypedDataClassId(class_id)) { 3583 if (RawObject::IsExternalTypedDataClassId(class_id)) {
3700 const ExternalTypedData& obj = 3584 const ExternalTypedData& obj =
3701 Api::UnwrapExternalTypedDataHandle(isolate, object); 3585 Api::UnwrapExternalTypedDataHandle(I, object);
3702 ASSERT(!obj.IsNull()); 3586 ASSERT(!obj.IsNull());
3703 length = obj.Length(); 3587 length = obj.Length();
3704 size_in_bytes = length * ExternalTypedData::ElementSizeInBytes(class_id); 3588 size_in_bytes = length * ExternalTypedData::ElementSizeInBytes(class_id);
3705 data_tmp = obj.DataAddr(0); 3589 data_tmp = obj.DataAddr(0);
3706 external = true; 3590 external = true;
3707 } else if (RawObject::IsTypedDataClassId(class_id)) { 3591 } else if (RawObject::IsTypedDataClassId(class_id)) {
3708 // Regular typed data object, set up some GC and API callback guards. 3592 // Regular typed data object, set up some GC and API callback guards.
3709 const TypedData& obj = Api::UnwrapTypedDataHandle(isolate, object); 3593 const TypedData& obj = Api::UnwrapTypedDataHandle(I, object);
3710 ASSERT(!obj.IsNull()); 3594 ASSERT(!obj.IsNull());
3711 length = obj.Length(); 3595 length = obj.Length();
3712 size_in_bytes = length * TypedData::ElementSizeInBytes(class_id); 3596 size_in_bytes = length * TypedData::ElementSizeInBytes(class_id);
3713 thread->IncrementNoSafepointScopeDepth(); 3597 T->IncrementNoSafepointScopeDepth();
3714 START_NO_CALLBACK_SCOPE(isolate); 3598 START_NO_CALLBACK_SCOPE(I);
3715 data_tmp = obj.DataAddr(0); 3599 data_tmp = obj.DataAddr(0);
3716 } else { 3600 } else {
3717 ASSERT(RawObject::IsTypedDataViewClassId(class_id)); 3601 ASSERT(RawObject::IsTypedDataViewClassId(class_id));
3718 const Instance& view_obj = Api::UnwrapInstanceHandle(isolate, object); 3602 const Instance& view_obj = Api::UnwrapInstanceHandle(I, object);
3719 ASSERT(!view_obj.IsNull()); 3603 ASSERT(!view_obj.IsNull());
3720 Smi& val = Smi::Handle(); 3604 Smi& val = Smi::Handle();
3721 val ^= TypedDataView::Length(view_obj); 3605 val ^= TypedDataView::Length(view_obj);
3722 length = val.Value(); 3606 length = val.Value();
3723 size_in_bytes = length * TypedDataView::ElementSizeInBytes(class_id); 3607 size_in_bytes = length * TypedDataView::ElementSizeInBytes(class_id);
3724 val ^= TypedDataView::OffsetInBytes(view_obj); 3608 val ^= TypedDataView::OffsetInBytes(view_obj);
3725 intptr_t offset_in_bytes = val.Value(); 3609 intptr_t offset_in_bytes = val.Value();
3726 const Instance& obj = Instance::Handle(TypedDataView::Data(view_obj)); 3610 const Instance& obj = Instance::Handle(TypedDataView::Data(view_obj));
3727 thread->IncrementNoSafepointScopeDepth(); 3611 T->IncrementNoSafepointScopeDepth();
3728 START_NO_CALLBACK_SCOPE(isolate); 3612 START_NO_CALLBACK_SCOPE(I);
3729 if (TypedData::IsTypedData(obj)) { 3613 if (TypedData::IsTypedData(obj)) {
3730 const TypedData& data_obj = TypedData::Cast(obj); 3614 const TypedData& data_obj = TypedData::Cast(obj);
3731 data_tmp = data_obj.DataAddr(offset_in_bytes); 3615 data_tmp = data_obj.DataAddr(offset_in_bytes);
3732 } else { 3616 } else {
3733 ASSERT(ExternalTypedData::IsExternalTypedData(obj)); 3617 ASSERT(ExternalTypedData::IsExternalTypedData(obj));
3734 const ExternalTypedData& data_obj = ExternalTypedData::Cast(obj); 3618 const ExternalTypedData& data_obj = ExternalTypedData::Cast(obj);
3735 data_tmp = data_obj.DataAddr(offset_in_bytes); 3619 data_tmp = data_obj.DataAddr(offset_in_bytes);
3736 external = true; 3620 external = true;
3737 } 3621 }
3738 } 3622 }
3739 if (FLAG_verify_acquired_data) { 3623 if (FLAG_verify_acquired_data) {
3740 if (external) { 3624 if (external) {
3741 ASSERT(!isolate->heap()->Contains(reinterpret_cast<uword>(data_tmp))); 3625 ASSERT(!I->heap()->Contains(reinterpret_cast<uword>(data_tmp)));
3742 } else { 3626 } else {
3743 ASSERT(isolate->heap()->Contains(reinterpret_cast<uword>(data_tmp))); 3627 ASSERT(I->heap()->Contains(reinterpret_cast<uword>(data_tmp)));
3744 } 3628 }
3745 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object)); 3629 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object));
3746 WeakTable* table = isolate->api_state()->acquired_table(); 3630 WeakTable* table = I->api_state()->acquired_table();
3747 intptr_t current = table->GetValue(obj.raw()); 3631 intptr_t current = table->GetValue(obj.raw());
3748 if (current != 0) { 3632 if (current != 0) {
3749 return Api::NewError("Data was already acquired for this object."); 3633 return Api::NewError("Data was already acquired for this object.");
3750 } 3634 }
3751 // Do not make a copy if the data is external. Some callers expect external 3635 // Do not make a copy if the data is external. Some callers expect external
3752 // data to remain in place, even though the API spec doesn't guarantee it. 3636 // data to remain in place, even though the API spec doesn't guarantee it.
3753 // TODO(koda/asiva): Make final decision and document it. 3637 // TODO(koda/asiva): Make final decision and document it.
3754 AcquiredData* ad = new AcquiredData(data_tmp, size_in_bytes, !external); 3638 AcquiredData* ad = new AcquiredData(data_tmp, size_in_bytes, !external);
3755 table->SetValue(obj.raw(), reinterpret_cast<intptr_t>(ad)); 3639 table->SetValue(obj.raw(), reinterpret_cast<intptr_t>(ad));
3756 data_tmp = ad->GetData(); 3640 data_tmp = ad->GetData();
3757 } 3641 }
3758 *data = data_tmp; 3642 *data = data_tmp;
3759 *len = length; 3643 *len = length;
3760 return Api::Success(); 3644 return Api::Success();
3761 } 3645 }
3762 3646
3763 3647
3764 DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object) { 3648 DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object) {
3765 Thread* thread = Thread::Current(); 3649 DARTSCOPE(Thread::Current());
3766 Isolate* isolate = thread->isolate();
3767 DARTSCOPE(isolate);
3768 intptr_t class_id = Api::ClassId(object); 3650 intptr_t class_id = Api::ClassId(object);
3769 if (!RawObject::IsExternalTypedDataClassId(class_id) && 3651 if (!RawObject::IsExternalTypedDataClassId(class_id) &&
3770 !RawObject::IsTypedDataViewClassId(class_id) && 3652 !RawObject::IsTypedDataViewClassId(class_id) &&
3771 !RawObject::IsTypedDataClassId(class_id)) { 3653 !RawObject::IsTypedDataClassId(class_id)) {
3772 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); 3654 RETURN_TYPE_ERROR(I, object, 'TypedData');
3773 } 3655 }
3774 if (!RawObject::IsExternalTypedDataClassId(class_id)) { 3656 if (!RawObject::IsExternalTypedDataClassId(class_id)) {
3775 thread->DecrementNoSafepointScopeDepth(); 3657 T->DecrementNoSafepointScopeDepth();
3776 END_NO_CALLBACK_SCOPE(isolate); 3658 END_NO_CALLBACK_SCOPE(I);
3777 } 3659 }
3778 if (FLAG_verify_acquired_data) { 3660 if (FLAG_verify_acquired_data) {
3779 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object)); 3661 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object));
3780 WeakTable* table = isolate->api_state()->acquired_table(); 3662 WeakTable* table = I->api_state()->acquired_table();
3781 intptr_t current = table->GetValue(obj.raw()); 3663 intptr_t current = table->GetValue(obj.raw());
3782 if (current == 0) { 3664 if (current == 0) {
3783 return Api::NewError("Data was not acquired for this object."); 3665 return Api::NewError("Data was not acquired for this object.");
3784 } 3666 }
3785 AcquiredData* ad = reinterpret_cast<AcquiredData*>(current); 3667 AcquiredData* ad = reinterpret_cast<AcquiredData*>(current);
3786 table->SetValue(obj.raw(), 0); // Delete entry from table. 3668 table->SetValue(obj.raw(), 0); // Delete entry from table.
3787 delete ad; 3669 delete ad;
3788 } 3670 }
3789 return Api::Success(); 3671 return Api::Success();
3790 } 3672 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
3850 return ApiError::New(message); 3732 return ApiError::New(message);
3851 } 3733 }
3852 return constructor.raw(); 3734 return constructor.raw();
3853 } 3735 }
3854 3736
3855 3737
3856 DART_EXPORT Dart_Handle Dart_New(Dart_Handle type, 3738 DART_EXPORT Dart_Handle Dart_New(Dart_Handle type,
3857 Dart_Handle constructor_name, 3739 Dart_Handle constructor_name,
3858 int number_of_arguments, 3740 int number_of_arguments,
3859 Dart_Handle* arguments) { 3741 Dart_Handle* arguments) {
3860 Isolate* isolate = Isolate::Current(); 3742 DARTSCOPE(Thread::Current());
3861 DARTSCOPE(isolate); 3743 CHECK_CALLBACK_STATE(I);
3862 CHECK_CALLBACK_STATE(isolate); 3744 Object& result = Object::Handle(Z);
3863 Object& result = Object::Handle(isolate);
3864 3745
3865 if (number_of_arguments < 0) { 3746 if (number_of_arguments < 0) {
3866 return Api::NewError( 3747 return Api::NewError(
3867 "%s expects argument 'number_of_arguments' to be non-negative.", 3748 "%s expects argument 'number_of_arguments' to be non-negative.",
3868 CURRENT_FUNC); 3749 CURRENT_FUNC);
3869 } 3750 }
3870 3751
3871 // Get the class to instantiate. 3752 // Get the class to instantiate.
3872 Object& unchecked_type = Object::Handle(Api::UnwrapHandle(type)); 3753 Object& unchecked_type = Object::Handle(Api::UnwrapHandle(type));
3873 if (unchecked_type.IsNull() || !unchecked_type.IsType()) { 3754 if (unchecked_type.IsNull() || !unchecked_type.IsType()) {
3874 RETURN_TYPE_ERROR(isolate, type, Type); 3755 RETURN_TYPE_ERROR(I, type, Type);
3875 } 3756 }
3876 Type& type_obj = Type::Handle(); 3757 Type& type_obj = Type::Handle();
3877 type_obj ^= unchecked_type.raw(); 3758 type_obj ^= unchecked_type.raw();
3878 if (!type_obj.IsFinalized()) { 3759 if (!type_obj.IsFinalized()) {
3879 return Api::NewError( 3760 return Api::NewError(
3880 "%s expects argument 'type' to be a fully resolved type.", 3761 "%s expects argument 'type' to be a fully resolved type.",
3881 CURRENT_FUNC); 3762 CURRENT_FUNC);
3882 } 3763 }
3883 Class& cls = Class::Handle(isolate, type_obj.type_class()); 3764 Class& cls = Class::Handle(Z, type_obj.type_class());
3884 TypeArguments& type_arguments = 3765 TypeArguments& type_arguments =
3885 TypeArguments::Handle(isolate, type_obj.arguments()); 3766 TypeArguments::Handle(Z, type_obj.arguments());
3886 3767
3887 const String& base_constructor_name = String::Handle(isolate, cls.Name()); 3768 const String& base_constructor_name = String::Handle(Z, cls.Name());
3888 3769
3889 // And get the name of the constructor to invoke. 3770 // And get the name of the constructor to invoke.
3890 String& dot_name = String::Handle(isolate); 3771 String& dot_name = String::Handle(Z);
3891 result = Api::UnwrapHandle(constructor_name); 3772 result = Api::UnwrapHandle(constructor_name);
3892 if (result.IsNull()) { 3773 if (result.IsNull()) {
3893 dot_name = Symbols::Dot().raw(); 3774 dot_name = Symbols::Dot().raw();
3894 } else if (result.IsString()) { 3775 } else if (result.IsString()) {
3895 dot_name = String::Concat(Symbols::Dot(), String::Cast(result)); 3776 dot_name = String::Concat(Symbols::Dot(), String::Cast(result));
3896 } else { 3777 } else {
3897 RETURN_TYPE_ERROR(isolate, constructor_name, String); 3778 RETURN_TYPE_ERROR(I, constructor_name, String);
3898 } 3779 }
3899 3780
3900 // Resolve the constructor. 3781 // Resolve the constructor.
3901 String& constr_name = 3782 String& constr_name =
3902 String::Handle(String::Concat(base_constructor_name, dot_name)); 3783 String::Handle(String::Concat(base_constructor_name, dot_name));
3903 result = ResolveConstructor("Dart_New", 3784 result = ResolveConstructor("Dart_New",
3904 cls, 3785 cls,
3905 base_constructor_name, 3786 base_constructor_name,
3906 constr_name, 3787 constr_name,
3907 number_of_arguments); 3788 number_of_arguments);
3908 if (result.IsError()) { 3789 if (result.IsError()) {
3909 return Api::NewHandle(isolate, result.raw()); 3790 return Api::NewHandle(I, result.raw());
3910 } 3791 }
3911 ASSERT(result.IsFunction()); 3792 ASSERT(result.IsFunction());
3912 Function& constructor = Function::Handle(isolate); 3793 Function& constructor = Function::Handle(Z);
3913 constructor ^= result.raw(); 3794 constructor ^= result.raw();
3914 3795
3915 Instance& new_object = Instance::Handle(isolate); 3796 Instance& new_object = Instance::Handle(Z);
3916 if (constructor.IsRedirectingFactory()) { 3797 if (constructor.IsRedirectingFactory()) {
3917 ClassFinalizer::ResolveRedirectingFactory(cls, constructor); 3798 ClassFinalizer::ResolveRedirectingFactory(cls, constructor);
3918 Type& redirect_type = Type::Handle(constructor.RedirectionType()); 3799 Type& redirect_type = Type::Handle(constructor.RedirectionType());
3919 constructor = constructor.RedirectionTarget(); 3800 constructor = constructor.RedirectionTarget();
3920 if (constructor.IsNull()) { 3801 if (constructor.IsNull()) {
3921 ASSERT(redirect_type.IsMalformed()); 3802 ASSERT(redirect_type.IsMalformed());
3922 return Api::NewHandle(isolate, redirect_type.error()); 3803 return Api::NewHandle(I, redirect_type.error());
3923 } 3804 }
3924 3805
3925 if (!redirect_type.IsInstantiated()) { 3806 if (!redirect_type.IsInstantiated()) {
3926 // The type arguments of the redirection type are instantiated from the 3807 // The type arguments of the redirection type are instantiated from the
3927 // type arguments of the type argument. 3808 // type arguments of the type argument.
3928 Error& bound_error = Error::Handle(); 3809 Error& bound_error = Error::Handle();
3929 redirect_type ^= redirect_type.InstantiateFrom(type_arguments, 3810 redirect_type ^= redirect_type.InstantiateFrom(type_arguments,
3930 &bound_error); 3811 &bound_error);
3931 if (!bound_error.IsNull()) { 3812 if (!bound_error.IsNull()) {
3932 return Api::NewHandle(isolate, bound_error.raw()); 3813 return Api::NewHandle(I, bound_error.raw());
3933 } 3814 }
3934 redirect_type ^= redirect_type.Canonicalize(); 3815 redirect_type ^= redirect_type.Canonicalize();
3935 } 3816 }
3936 3817
3937 type_obj = redirect_type.raw(); 3818 type_obj = redirect_type.raw();
3938 type_arguments = redirect_type.arguments(); 3819 type_arguments = redirect_type.arguments();
3939 3820
3940 cls = type_obj.type_class(); 3821 cls = type_obj.type_class();
3941 } 3822 }
3942 if (constructor.IsGenerativeConstructor()) { 3823 if (constructor.IsGenerativeConstructor()) {
3943 // Create the new object. 3824 // Create the new object.
3944 new_object = Instance::New(cls); 3825 new_object = Instance::New(cls);
3945 } 3826 }
3946 3827
3947 // Create the argument list. 3828 // Create the argument list.
3948 intptr_t arg_index = 0; 3829 intptr_t arg_index = 0;
3949 int extra_args = (constructor.IsGenerativeConstructor() ? 2 : 1); 3830 int extra_args = (constructor.IsGenerativeConstructor() ? 2 : 1);
3950 const Array& args = 3831 const Array& args =
3951 Array::Handle(isolate, Array::New(number_of_arguments + extra_args)); 3832 Array::Handle(Z, Array::New(number_of_arguments + extra_args));
3952 if (constructor.IsGenerativeConstructor()) { 3833 if (constructor.IsGenerativeConstructor()) {
3953 // Constructors get the uninitialized object and a constructor phase. 3834 // Constructors get the uninitialized object and a constructor phase.
3954 if (!type_arguments.IsNull()) { 3835 if (!type_arguments.IsNull()) {
3955 // The type arguments will be null if the class has no type parameters, in 3836 // The type arguments will be null if the class has no type parameters, in
3956 // which case the following call would fail because there is no slot 3837 // which case the following call would fail because there is no slot
3957 // reserved in the object for the type vector. 3838 // reserved in the object for the type vector.
3958 new_object.SetTypeArguments(type_arguments); 3839 new_object.SetTypeArguments(type_arguments);
3959 } 3840 }
3960 args.SetAt(arg_index++, new_object); 3841 args.SetAt(arg_index++, new_object);
3961 args.SetAt(arg_index++, 3842 args.SetAt(arg_index++, Smi::Handle(Z, Smi::New(Function::kCtorPhaseAll)));
3962 Smi::Handle(isolate, Smi::New(Function::kCtorPhaseAll)));
3963 } else { 3843 } else {
3964 // Factories get type arguments. 3844 // Factories get type arguments.
3965 args.SetAt(arg_index++, type_arguments); 3845 args.SetAt(arg_index++, type_arguments);
3966 } 3846 }
3967 Object& argument = Object::Handle(isolate); 3847 Object& argument = Object::Handle(Z);
3968 for (int i = 0; i < number_of_arguments; i++) { 3848 for (int i = 0; i < number_of_arguments; i++) {
3969 argument = Api::UnwrapHandle(arguments[i]); 3849 argument = Api::UnwrapHandle(arguments[i]);
3970 if (!argument.IsNull() && !argument.IsInstance()) { 3850 if (!argument.IsNull() && !argument.IsInstance()) {
3971 if (argument.IsError()) { 3851 if (argument.IsError()) {
3972 return Api::NewHandle(isolate, argument.raw()); 3852 return Api::NewHandle(I, argument.raw());
3973 } else { 3853 } else {
3974 return Api::NewError( 3854 return Api::NewError(
3975 "%s expects arguments[%d] to be an Instance handle.", 3855 "%s expects arguments[%d] to be an Instance handle.",
3976 CURRENT_FUNC, i); 3856 CURRENT_FUNC, i);
3977 } 3857 }
3978 } 3858 }
3979 args.SetAt(arg_index++, argument); 3859 args.SetAt(arg_index++, argument);
3980 } 3860 }
3981 3861
3982 // Invoke the constructor and return the new object. 3862 // Invoke the constructor and return the new object.
3983 result = DartEntry::InvokeFunction(constructor, args); 3863 result = DartEntry::InvokeFunction(constructor, args);
3984 if (result.IsError()) { 3864 if (result.IsError()) {
3985 return Api::NewHandle(isolate, result.raw()); 3865 return Api::NewHandle(I, result.raw());
3986 } 3866 }
3987 3867
3988 if (constructor.IsGenerativeConstructor()) { 3868 if (constructor.IsGenerativeConstructor()) {
3989 ASSERT(result.IsNull()); 3869 ASSERT(result.IsNull());
3990 } else { 3870 } else {
3991 ASSERT(result.IsNull() || result.IsInstance()); 3871 ASSERT(result.IsNull() || result.IsInstance());
3992 new_object ^= result.raw(); 3872 new_object ^= result.raw();
3993 } 3873 }
3994 return Api::NewHandle(isolate, new_object.raw()); 3874 return Api::NewHandle(I, new_object.raw());
3995 } 3875 }
3996 3876
3997 3877
3998 static RawInstance* AllocateObject(Isolate* isolate, const Class& cls) { 3878 static RawInstance* AllocateObject(Isolate* isolate, const Class& cls) {
3999 if (!cls.is_fields_marked_nullable()) { 3879 if (!cls.is_fields_marked_nullable()) {
4000 // Mark all fields as nullable. 3880 // Mark all fields as nullable.
4001 Class& iterate_cls = Class::Handle(isolate, cls.raw()); 3881 Class& iterate_cls = Class::Handle(isolate, cls.raw());
4002 Field& field = Field::Handle(isolate); 3882 Field& field = Field::Handle(isolate);
4003 Array& fields = Array::Handle(isolate); 3883 Array& fields = Array::Handle(isolate);
4004 while (!iterate_cls.IsNull()) { 3884 while (!iterate_cls.IsNull()) {
(...skipping 10 matching lines...) Expand all
4015 } 3895 }
4016 } 3896 }
4017 } 3897 }
4018 3898
4019 // Allocate an object for the given class. 3899 // Allocate an object for the given class.
4020 return Instance::New(cls); 3900 return Instance::New(cls);
4021 } 3901 }
4022 3902
4023 3903
4024 DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type) { 3904 DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type) {
4025 Isolate* isolate = Isolate::Current(); 3905 DARTSCOPE(Thread::Current());
4026 DARTSCOPE(isolate); 3906 CHECK_CALLBACK_STATE(I);
4027 CHECK_CALLBACK_STATE(isolate);
4028 3907
4029 const Type& type_obj = Api::UnwrapTypeHandle(isolate, type); 3908 const Type& type_obj = Api::UnwrapTypeHandle(I, type);
4030 // Get the class to instantiate. 3909 // Get the class to instantiate.
4031 if (type_obj.IsNull()) { 3910 if (type_obj.IsNull()) {
4032 RETURN_TYPE_ERROR(isolate, type, Type); 3911 RETURN_TYPE_ERROR(I, type, Type);
4033 } 3912 }
4034 const Class& cls = Class::Handle(isolate, type_obj.type_class()); 3913 const Class& cls = Class::Handle(Z, type_obj.type_class());
4035 const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate)); 3914 const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(I));
4036 if (!error.IsNull()) { 3915 if (!error.IsNull()) {
4037 // An error occurred, return error object. 3916 // An error occurred, return error object.
4038 return Api::NewHandle(isolate, error.raw()); 3917 return Api::NewHandle(I, error.raw());
4039 } 3918 }
4040 return Api::NewHandle(isolate, AllocateObject(isolate, cls)); 3919 return Api::NewHandle(I, AllocateObject(I, cls));
4041 } 3920 }
4042 3921
4043 3922
4044 DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields( 3923 DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields(
4045 Dart_Handle type, 3924 Dart_Handle type,
4046 intptr_t num_native_fields, 3925 intptr_t num_native_fields,
4047 const intptr_t* native_fields) { 3926 const intptr_t* native_fields) {
4048 Isolate* isolate = Isolate::Current(); 3927 DARTSCOPE(Thread::Current());
4049 DARTSCOPE(isolate); 3928 CHECK_CALLBACK_STATE(I);
4050 CHECK_CALLBACK_STATE(isolate);
4051 3929
4052 const Type& type_obj = Api::UnwrapTypeHandle(isolate, type); 3930 const Type& type_obj = Api::UnwrapTypeHandle(I, type);
4053 // Get the class to instantiate. 3931 // Get the class to instantiate.
4054 if (type_obj.IsNull()) { 3932 if (type_obj.IsNull()) {
4055 RETURN_TYPE_ERROR(isolate, type, Type); 3933 RETURN_TYPE_ERROR(I, type, Type);
4056 } 3934 }
4057 if (native_fields == NULL) { 3935 if (native_fields == NULL) {
4058 RETURN_NULL_ERROR(native_fields); 3936 RETURN_NULL_ERROR(native_fields);
4059 } 3937 }
4060 const Class& cls = Class::Handle(isolate, type_obj.type_class()); 3938 const Class& cls = Class::Handle(Z, type_obj.type_class());
4061 const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate)); 3939 const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(I));
4062 if (!error.IsNull()) { 3940 if (!error.IsNull()) {
4063 // An error occurred, return error object. 3941 // An error occurred, return error object.
4064 return Api::NewHandle(isolate, error.raw()); 3942 return Api::NewHandle(I, error.raw());
4065 } 3943 }
4066 if (num_native_fields != cls.num_native_fields()) { 3944 if (num_native_fields != cls.num_native_fields()) {
4067 return Api::NewError( 3945 return Api::NewError(
4068 "%s: invalid number of native fields %" Pd " passed in, expected %d", 3946 "%s: invalid number of native fields %" Pd " passed in, expected %d",
4069 CURRENT_FUNC, num_native_fields, cls.num_native_fields()); 3947 CURRENT_FUNC, num_native_fields, cls.num_native_fields());
4070 } 3948 }
4071 const Instance& instance = Instance::Handle(isolate, 3949 const Instance& instance = Instance::Handle(Z, AllocateObject(I, cls));
4072 AllocateObject(isolate, cls));
4073 instance.SetNativeFields(num_native_fields, native_fields); 3950 instance.SetNativeFields(num_native_fields, native_fields);
4074 return Api::NewHandle(isolate, instance.raw()); 3951 return Api::NewHandle(I, instance.raw());
4075 } 3952 }
4076 3953
4077 3954
4078 static Dart_Handle SetupArguments(Isolate* isolate, 3955 static Dart_Handle SetupArguments(Isolate* isolate,
4079 int num_args, 3956 int num_args,
4080 Dart_Handle* arguments, 3957 Dart_Handle* arguments,
4081 int extra_args, 3958 int extra_args,
4082 Array* args) { 3959 Array* args) {
4083 // Check for malformed arguments in the arguments list. 3960 // Check for malformed arguments in the arguments list.
4084 *args = Array::New(num_args + extra_args); 3961 *args = Array::New(num_args + extra_args);
(...skipping 13 matching lines...) Expand all
4098 args->SetAt((i + extra_args), arg); 3975 args->SetAt((i + extra_args), arg);
4099 } 3976 }
4100 return Api::Success(); 3977 return Api::Success();
4101 } 3978 }
4102 3979
4103 3980
4104 DART_EXPORT Dart_Handle Dart_InvokeConstructor(Dart_Handle object, 3981 DART_EXPORT Dart_Handle Dart_InvokeConstructor(Dart_Handle object,
4105 Dart_Handle name, 3982 Dart_Handle name,
4106 int number_of_arguments, 3983 int number_of_arguments,
4107 Dart_Handle* arguments) { 3984 Dart_Handle* arguments) {
4108 Isolate* isolate = Isolate::Current(); 3985 DARTSCOPE(Thread::Current());
4109 DARTSCOPE(isolate); 3986 CHECK_CALLBACK_STATE(I);
4110 CHECK_CALLBACK_STATE(isolate);
4111 3987
4112 if (number_of_arguments < 0) { 3988 if (number_of_arguments < 0) {
4113 return Api::NewError( 3989 return Api::NewError(
4114 "%s expects argument 'number_of_arguments' to be non-negative.", 3990 "%s expects argument 'number_of_arguments' to be non-negative.",
4115 CURRENT_FUNC); 3991 CURRENT_FUNC);
4116 } 3992 }
4117 const String& constructor_name = Api::UnwrapStringHandle(isolate, name); 3993 const String& constructor_name = Api::UnwrapStringHandle(I, name);
4118 if (constructor_name.IsNull()) { 3994 if (constructor_name.IsNull()) {
4119 RETURN_TYPE_ERROR(isolate, name, String); 3995 RETURN_TYPE_ERROR(I, name, String);
4120 } 3996 }
4121 const Instance& instance = Api::UnwrapInstanceHandle(isolate, object); 3997 const Instance& instance = Api::UnwrapInstanceHandle(I, object);
4122 if (instance.IsNull()) { 3998 if (instance.IsNull()) {
4123 RETURN_TYPE_ERROR(isolate, object, Instance); 3999 RETURN_TYPE_ERROR(I, object, Instance);
4124 } 4000 }
4125 4001
4126 // Since we have allocated an object it would mean that the type 4002 // Since we have allocated an object it would mean that the type
4127 // is finalized. 4003 // is finalized.
4128 // TODO(asiva): How do we ensure that a constructor is not called more than 4004 // TODO(asiva): How do we ensure that a constructor is not called more than
4129 // once for the same object. 4005 // once for the same object.
4130 4006
4131 // Construct name of the constructor to invoke. 4007 // Construct name of the constructor to invoke.
4132 const Type& type_obj = Type::Handle(isolate, instance.GetType()); 4008 const Type& type_obj = Type::Handle(Z, instance.GetType());
4133 const Class& cls = Class::Handle(isolate, type_obj.type_class()); 4009 const Class& cls = Class::Handle(Z, type_obj.type_class());
4134 const String& class_name = String::Handle(isolate, cls.Name()); 4010 const String& class_name = String::Handle(Z, cls.Name());
4135 const Array& strings = Array::Handle(Array::New(3)); 4011 const Array& strings = Array::Handle(Z, Array::New(3));
4136 strings.SetAt(0, class_name); 4012 strings.SetAt(0, class_name);
4137 strings.SetAt(1, Symbols::Dot()); 4013 strings.SetAt(1, Symbols::Dot());
4138 strings.SetAt(2, constructor_name); 4014 strings.SetAt(2, constructor_name);
4139 const String& dot_name = String::Handle(isolate, String::ConcatAll(strings)); 4015 const String& dot_name = String::Handle(Z, String::ConcatAll(strings));
4140 const TypeArguments& type_arguments = 4016 const TypeArguments& type_arguments =
4141 TypeArguments::Handle(isolate, type_obj.arguments()); 4017 TypeArguments::Handle(Z, type_obj.arguments());
4142 const Function& constructor = 4018 const Function& constructor =
4143 Function::Handle(isolate, cls.LookupFunctionAllowPrivate(dot_name)); 4019 Function::Handle(Z, cls.LookupFunctionAllowPrivate(dot_name));
4144 const int extra_args = 2; 4020 const int extra_args = 2;
4145 if (!constructor.IsNull() && 4021 if (!constructor.IsNull() &&
4146 constructor.IsGenerativeConstructor() && 4022 constructor.IsGenerativeConstructor() &&
4147 constructor.AreValidArgumentCounts(number_of_arguments + extra_args, 4023 constructor.AreValidArgumentCounts(number_of_arguments + extra_args,
4148 0, 4024 0,
4149 NULL)) { 4025 NULL)) {
4150 // Create the argument list. 4026 // Create the argument list.
4151 // Constructors get the uninitialized object and a constructor phase. 4027 // Constructors get the uninitialized object and a constructor phase.
4152 if (!type_arguments.IsNull()) { 4028 if (!type_arguments.IsNull()) {
4153 // The type arguments will be null if the class has no type 4029 // The type arguments will be null if the class has no type
4154 // parameters, in which case the following call would fail 4030 // parameters, in which case the following call would fail
4155 // because there is no slot reserved in the object for the 4031 // because there is no slot reserved in the object for the
4156 // type vector. 4032 // type vector.
4157 instance.SetTypeArguments(type_arguments); 4033 instance.SetTypeArguments(type_arguments);
4158 } 4034 }
4159 Dart_Handle result; 4035 Dart_Handle result;
4160 Array& args = Array::Handle(isolate); 4036 Array& args = Array::Handle(Z);
4161 result = SetupArguments(isolate, 4037 result = SetupArguments(I,
4162 number_of_arguments, 4038 number_of_arguments, arguments, extra_args, &args);
4163 arguments,
4164 extra_args,
4165 &args);
4166 if (!::Dart_IsError(result)) { 4039 if (!::Dart_IsError(result)) {
4167 args.SetAt(0, instance); 4040 args.SetAt(0, instance);
4168 args.SetAt(1, Smi::Handle(isolate, Smi::New(Function::kCtorPhaseAll))); 4041 args.SetAt(1, Smi::Handle(Z, Smi::New(Function::kCtorPhaseAll)));
4169 const Object& retval = Object::Handle( 4042 const Object& retval = Object::Handle(Z,
4170 isolate,
4171 DartEntry::InvokeFunction(constructor, args)); 4043 DartEntry::InvokeFunction(constructor, args));
4172 if (retval.IsError()) { 4044 if (retval.IsError()) {
4173 result = Api::NewHandle(isolate, retval.raw()); 4045 result = Api::NewHandle(I, retval.raw());
4174 } else { 4046 } else {
4175 result = Api::NewHandle(isolate, instance.raw()); 4047 result = Api::NewHandle(I, instance.raw());
4176 } 4048 }
4177 } 4049 }
4178 return result; 4050 return result;
4179 } 4051 }
4180 return Api::NewError( 4052 return Api::NewError(
4181 "%s expects argument 'name' to be a valid constructor.", 4053 "%s expects argument 'name' to be a valid constructor.",
4182 CURRENT_FUNC); 4054 CURRENT_FUNC);
4183 } 4055 }
4184 4056
4185 4057
4186 DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target, 4058 DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target,
4187 Dart_Handle name, 4059 Dart_Handle name,
4188 int number_of_arguments, 4060 int number_of_arguments,
4189 Dart_Handle* arguments) { 4061 Dart_Handle* arguments) {
4190 Thread* thread = Thread::Current(); 4062 DARTSCOPE(Thread::Current());
4191 Isolate* isolate = thread->isolate(); 4063 CHECK_CALLBACK_STATE(I);
4192 DARTSCOPE(isolate);
4193 CHECK_CALLBACK_STATE(isolate);
4194 // TODO(turnidge): This is a bit simplistic. It overcounts when 4064 // TODO(turnidge): This is a bit simplistic. It overcounts when
4195 // other operations (gc, compilation) are active. 4065 // other operations (gc, compilation) are active.
4196 TIMERSCOPE(thread, time_dart_execution); 4066 TIMERSCOPE(T, time_dart_execution);
4197 4067
4198 const String& function_name = Api::UnwrapStringHandle(isolate, name); 4068 const String& function_name = Api::UnwrapStringHandle(I, name);
4199 if (function_name.IsNull()) { 4069 if (function_name.IsNull()) {
4200 RETURN_TYPE_ERROR(isolate, name, String); 4070 RETURN_TYPE_ERROR(I, name, String);
4201 } 4071 }
4202 if (number_of_arguments < 0) { 4072 if (number_of_arguments < 0) {
4203 return Api::NewError( 4073 return Api::NewError(
4204 "%s expects argument 'number_of_arguments' to be non-negative.", 4074 "%s expects argument 'number_of_arguments' to be non-negative.",
4205 CURRENT_FUNC); 4075 CURRENT_FUNC);
4206 } 4076 }
4207 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(target)); 4077 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(target));
4208 if (obj.IsError()) { 4078 if (obj.IsError()) {
4209 return target; 4079 return target;
4210 } 4080 }
4211 Dart_Handle result; 4081 Dart_Handle result;
4212 Array& args = Array::Handle(isolate); 4082 Array& args = Array::Handle(Z);
4213 if (obj.IsType()) { 4083 if (obj.IsType()) {
4214 if (!Type::Cast(obj).IsFinalized()) { 4084 if (!Type::Cast(obj).IsFinalized()) {
4215 return Api::NewError( 4085 return Api::NewError(
4216 "%s expects argument 'target' to be a fully resolved type.", 4086 "%s expects argument 'target' to be a fully resolved type.",
4217 CURRENT_FUNC); 4087 CURRENT_FUNC);
4218 } 4088 }
4219 4089
4220 const Class& cls = Class::Handle(isolate, Type::Cast(obj).type_class()); 4090 const Class& cls = Class::Handle(Z, Type::Cast(obj).type_class());
4221 const Function& function = Function::Handle( 4091 const Function& function = Function::Handle(Z,
4222 isolate,
4223 Resolver::ResolveStaticAllowPrivate(cls, 4092 Resolver::ResolveStaticAllowPrivate(cls,
4224 function_name, 4093 function_name,
4225 number_of_arguments, 4094 number_of_arguments,
4226 Object::empty_array())); 4095 Object::empty_array()));
4227 if (function.IsNull()) { 4096 if (function.IsNull()) {
4228 const String& cls_name = String::Handle(isolate, cls.Name()); 4097 const String& cls_name = String::Handle(Z, cls.Name());
4229 return Api::NewError("%s: did not find static method '%s.%s'.", 4098 return Api::NewError("%s: did not find static method '%s.%s'.",
4230 CURRENT_FUNC, 4099 CURRENT_FUNC,
4231 cls_name.ToCString(), 4100 cls_name.ToCString(),
4232 function_name.ToCString()); 4101 function_name.ToCString());
4233 } 4102 }
4234 // Setup args and check for malformed arguments in the arguments list. 4103 // Setup args and check for malformed arguments in the arguments list.
4235 result = SetupArguments(isolate, number_of_arguments, arguments, 0, &args); 4104 result = SetupArguments(I, number_of_arguments, arguments, 0, &args);
4236 if (!::Dart_IsError(result)) { 4105 if (!::Dart_IsError(result)) {
4237 result = Api::NewHandle(isolate, 4106 result = Api::NewHandle(I, DartEntry::InvokeFunction(function, args));
4238 DartEntry::InvokeFunction(function, args));
4239 } 4107 }
4240 return result; 4108 return result;
4241 } else if (obj.IsNull() || obj.IsInstance()) { 4109 } else if (obj.IsNull() || obj.IsInstance()) {
4242 // Since we have allocated an object it would mean that the type of the 4110 // Since we have allocated an object it would mean that the type of the
4243 // receiver is already resolved and finalized, hence it is not necessary 4111 // receiver is already resolved and finalized, hence it is not necessary
4244 // to check here. 4112 // to check here.
4245 Instance& instance = Instance::Handle(isolate); 4113 Instance& instance = Instance::Handle(Z);
4246 instance ^= obj.raw(); 4114 instance ^= obj.raw();
4247 ArgumentsDescriptor args_desc( 4115 ArgumentsDescriptor args_desc(
4248 Array::Handle(ArgumentsDescriptor::New(number_of_arguments + 1))); 4116 Array::Handle(Z, ArgumentsDescriptor::New(number_of_arguments + 1)));
4249 const Function& function = Function::Handle( 4117 const Function& function = Function::Handle(Z,
4250 isolate,
4251 Resolver::ResolveDynamic(instance, function_name, args_desc)); 4118 Resolver::ResolveDynamic(instance, function_name, args_desc));
4252 if (function.IsNull()) { 4119 if (function.IsNull()) {
4253 // Setup args and check for malformed arguments in the arguments list. 4120 // Setup args and check for malformed arguments in the arguments list.
4254 result = SetupArguments(isolate, 4121 result = SetupArguments(I,
4255 number_of_arguments, 4122 number_of_arguments,
4256 arguments, 4123 arguments,
4257 1, 4124 1,
4258 &args); 4125 &args);
4259 if (!::Dart_IsError(result)) { 4126 if (!::Dart_IsError(result)) {
4260 args.SetAt(0, instance); 4127 args.SetAt(0, instance);
4261 const Array& args_descriptor = 4128 const Array& args_descriptor =
4262 Array::Handle(ArgumentsDescriptor::New(args.Length())); 4129 Array::Handle(Z, ArgumentsDescriptor::New(args.Length()));
4263 result = Api::NewHandle(isolate, 4130 result = Api::NewHandle(I,
4264 DartEntry::InvokeNoSuchMethod(instance, 4131 DartEntry::InvokeNoSuchMethod(instance,
4265 function_name, 4132 function_name,
4266 args, 4133 args,
4267 args_descriptor)); 4134 args_descriptor));
4268 } 4135 }
4269 return result; 4136 return result;
4270 } 4137 }
4271 // Setup args and check for malformed arguments in the arguments list. 4138 // Setup args and check for malformed arguments in the arguments list.
4272 result = SetupArguments(isolate, number_of_arguments, arguments, 1, &args); 4139 result = SetupArguments(I, number_of_arguments, arguments, 1, &args);
4273 if (!::Dart_IsError(result)) { 4140 if (!::Dart_IsError(result)) {
4274 args.SetAt(0, instance); 4141 args.SetAt(0, instance);
4275 result = Api::NewHandle(isolate, 4142 result = Api::NewHandle(I, DartEntry::InvokeFunction(function, args));
4276 DartEntry::InvokeFunction(function, args));
4277 } 4143 }
4278 return result; 4144 return result;
4279 } else if (obj.IsLibrary()) { 4145 } else if (obj.IsLibrary()) {
4280 // Check whether class finalization is needed. 4146 // Check whether class finalization is needed.
4281 const Library& lib = Library::Cast(obj); 4147 const Library& lib = Library::Cast(obj);
4282 4148
4283 // Check that the library is loaded. 4149 // Check that the library is loaded.
4284 if (!lib.Loaded()) { 4150 if (!lib.Loaded()) {
4285 return Api::NewError( 4151 return Api::NewError(
4286 "%s expects library argument 'target' to be loaded.", 4152 "%s expects library argument 'target' to be loaded.",
4287 CURRENT_FUNC); 4153 CURRENT_FUNC);
4288 } 4154 }
4289 4155
4290 const Function& function = 4156 const Function& function =
4291 Function::Handle(isolate, 4157 Function::Handle(Z, lib.LookupFunctionAllowPrivate(function_name));
4292 lib.LookupFunctionAllowPrivate(function_name));
4293 if (function.IsNull()) { 4158 if (function.IsNull()) {
4294 return Api::NewError("%s: did not find top-level function '%s'.", 4159 return Api::NewError("%s: did not find top-level function '%s'.",
4295 CURRENT_FUNC, 4160 CURRENT_FUNC,
4296 function_name.ToCString()); 4161 function_name.ToCString());
4297 } 4162 }
4298 // LookupFunctionAllowPrivate does not check argument arity, so we 4163 // LookupFunctionAllowPrivate does not check argument arity, so we
4299 // do it here. 4164 // do it here.
4300 String& error_message = String::Handle(); 4165 String& error_message = String::Handle(Z);
4301 if (!function.AreValidArgumentCounts(number_of_arguments, 4166 if (!function.AreValidArgumentCounts(number_of_arguments,
4302 0, 4167 0,
4303 &error_message)) { 4168 &error_message)) {
4304 return Api::NewError("%s: wrong argument count for function '%s': %s.", 4169 return Api::NewError("%s: wrong argument count for function '%s': %s.",
4305 CURRENT_FUNC, 4170 CURRENT_FUNC,
4306 function_name.ToCString(), 4171 function_name.ToCString(),
4307 error_message.ToCString()); 4172 error_message.ToCString());
4308 } 4173 }
4309 // Setup args and check for malformed arguments in the arguments list. 4174 // Setup args and check for malformed arguments in the arguments list.
4310 result = SetupArguments(isolate, number_of_arguments, arguments, 0, &args); 4175 result = SetupArguments(I, number_of_arguments, arguments, 0, &args);
4311 if (!::Dart_IsError(result)) { 4176 if (!::Dart_IsError(result)) {
4312 result = Api::NewHandle(isolate, 4177 result = Api::NewHandle(I, DartEntry::InvokeFunction(function, args));
4313 DartEntry::InvokeFunction(function, args));
4314 } 4178 }
4315 return result; 4179 return result;
4316 } else { 4180 } else {
4317 return Api::NewError( 4181 return Api::NewError(
4318 "%s expects argument 'target' to be an object, type, or library.", 4182 "%s expects argument 'target' to be an object, type, or library.",
4319 CURRENT_FUNC); 4183 CURRENT_FUNC);
4320 } 4184 }
4321 } 4185 }
4322 4186
4323 4187
4324 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, 4188 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure,
4325 int number_of_arguments, 4189 int number_of_arguments,
4326 Dart_Handle* arguments) { 4190 Dart_Handle* arguments) {
4327 Isolate* isolate = Isolate::Current(); 4191 DARTSCOPE(Thread::Current());
4328 DARTSCOPE(isolate); 4192 CHECK_CALLBACK_STATE(I);
4329 CHECK_CALLBACK_STATE(isolate); 4193 const Instance& closure_obj = Api::UnwrapInstanceHandle(I, closure);
4330 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, closure);
4331 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL)) { 4194 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL)) {
4332 RETURN_TYPE_ERROR(isolate, closure, Instance); 4195 RETURN_TYPE_ERROR(I, closure, Instance);
4333 } 4196 }
4334 if (number_of_arguments < 0) { 4197 if (number_of_arguments < 0) {
4335 return Api::NewError( 4198 return Api::NewError(
4336 "%s expects argument 'number_of_arguments' to be non-negative.", 4199 "%s expects argument 'number_of_arguments' to be non-negative.",
4337 CURRENT_FUNC); 4200 CURRENT_FUNC);
4338 } 4201 }
4339 4202
4340 // Set up arguments to include the closure as the first argument. 4203 // Set up arguments to include the closure as the first argument.
4341 const Array& args = Array::Handle(isolate, 4204 const Array& args = Array::Handle(Z, Array::New(number_of_arguments + 1));
4342 Array::New(number_of_arguments + 1)); 4205 Object& obj = Object::Handle(Z);
4343 Object& obj = Object::Handle(isolate);
4344 args.SetAt(0, closure_obj); 4206 args.SetAt(0, closure_obj);
4345 for (int i = 0; i < number_of_arguments; i++) { 4207 for (int i = 0; i < number_of_arguments; i++) {
4346 obj = Api::UnwrapHandle(arguments[i]); 4208 obj = Api::UnwrapHandle(arguments[i]);
4347 if (!obj.IsNull() && !obj.IsInstance()) { 4209 if (!obj.IsNull() && !obj.IsInstance()) {
4348 RETURN_TYPE_ERROR(isolate, arguments[i], Instance); 4210 RETURN_TYPE_ERROR(I, arguments[i], Instance);
4349 } 4211 }
4350 args.SetAt(i + 1, obj); 4212 args.SetAt(i + 1, obj);
4351 } 4213 }
4352 // Now try to invoke the closure. 4214 // Now try to invoke the closure.
4353 return Api::NewHandle(isolate, DartEntry::InvokeClosure(args)); 4215 return Api::NewHandle(I, DartEntry::InvokeClosure(args));
4354 } 4216 }
4355 4217
4356 4218
4357 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) { 4219 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) {
4358 Isolate* isolate = Isolate::Current(); 4220 DARTSCOPE(Thread::Current());
4359 DARTSCOPE(isolate); 4221 CHECK_CALLBACK_STATE(I);
4360 CHECK_CALLBACK_STATE(isolate);
4361 4222
4362 const String& field_name = Api::UnwrapStringHandle(isolate, name); 4223 const String& field_name = Api::UnwrapStringHandle(I, name);
4363 if (field_name.IsNull()) { 4224 if (field_name.IsNull()) {
4364 RETURN_TYPE_ERROR(isolate, name, String); 4225 RETURN_TYPE_ERROR(I, name, String);
4365 } 4226 }
4366 4227
4367 Field& field = Field::Handle(isolate); 4228 Field& field = Field::Handle(Z);
4368 Function& getter = Function::Handle(isolate); 4229 Function& getter = Function::Handle(Z);
4369 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(container)); 4230 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(container));
4370 if (obj.IsNull()) { 4231 if (obj.IsNull()) {
4371 return Api::NewError("%s expects argument 'container' to be non-null.", 4232 return Api::NewError("%s expects argument 'container' to be non-null.",
4372 CURRENT_FUNC); 4233 CURRENT_FUNC);
4373 } else if (obj.IsType()) { 4234 } else if (obj.IsType()) {
4374 if (!Type::Cast(obj).IsFinalized()) { 4235 if (!Type::Cast(obj).IsFinalized()) {
4375 return Api::NewError( 4236 return Api::NewError(
4376 "%s expects argument 'container' to be a fully resolved type.", 4237 "%s expects argument 'container' to be a fully resolved type.",
4377 CURRENT_FUNC); 4238 CURRENT_FUNC);
4378 } 4239 }
4379 // To access a static field we may need to use the Field or the 4240 // To access a static field we may need to use the Field or the
4380 // getter Function. 4241 // getter Function.
4381 Class& cls = Class::Handle(isolate, Type::Cast(obj).type_class()); 4242 Class& cls = Class::Handle(Z, Type::Cast(obj).type_class());
4382 4243
4383 field = cls.LookupStaticField(field_name); 4244 field = cls.LookupStaticField(field_name);
4384 if (field.IsNull() || field.IsUninitialized()) { 4245 if (field.IsNull() || field.IsUninitialized()) {
4385 const String& getter_name = 4246 const String& getter_name =
4386 String::Handle(isolate, Field::GetterName(field_name)); 4247 String::Handle(Z, Field::GetterName(field_name));
4387 getter = cls.LookupStaticFunctionAllowPrivate(getter_name); 4248 getter = cls.LookupStaticFunctionAllowPrivate(getter_name);
4388 } 4249 }
4389 4250
4390 if (!getter.IsNull()) { 4251 if (!getter.IsNull()) {
4391 // Invoke the getter and return the result. 4252 // Invoke the getter and return the result.
4392 return Api::NewHandle( 4253 return Api::NewHandle(I,
4393 isolate, DartEntry::InvokeFunction(getter, Object::empty_array())); 4254 DartEntry::InvokeFunction(getter, Object::empty_array()));
4394 } else if (!field.IsNull()) { 4255 } else if (!field.IsNull()) {
4395 return Api::NewHandle(isolate, field.value()); 4256 return Api::NewHandle(I, field.value());
4396 } else { 4257 } else {
4397 return Api::NewError("%s: did not find static field '%s'.", 4258 return Api::NewError("%s: did not find static field '%s'.",
4398 CURRENT_FUNC, field_name.ToCString()); 4259 CURRENT_FUNC, field_name.ToCString());
4399 } 4260 }
4400 4261
4401 } else if (obj.IsInstance()) { 4262 } else if (obj.IsInstance()) {
4402 // Every instance field has a getter Function. Try to find the 4263 // Every instance field has a getter Function. Try to find the
4403 // getter in any superclass and use that function to access the 4264 // getter in any superclass and use that function to access the
4404 // field. 4265 // field.
4405 const Instance& instance = Instance::Cast(obj); 4266 const Instance& instance = Instance::Cast(obj);
4406 Class& cls = Class::Handle(isolate, instance.clazz()); 4267 Class& cls = Class::Handle(Z, instance.clazz());
4407 String& getter_name = 4268 String& getter_name = String::Handle(Z, Field::GetterName(field_name));
4408 String::Handle(isolate, Field::GetterName(field_name));
4409 while (!cls.IsNull()) { 4269 while (!cls.IsNull()) {
4410 getter = cls.LookupDynamicFunctionAllowPrivate(getter_name); 4270 getter = cls.LookupDynamicFunctionAllowPrivate(getter_name);
4411 if (!getter.IsNull()) { 4271 if (!getter.IsNull()) {
4412 break; 4272 break;
4413 } 4273 }
4414 cls = cls.SuperClass(); 4274 cls = cls.SuperClass();
4415 } 4275 }
4416 4276
4417 // Invoke the getter and return the result. 4277 // Invoke the getter and return the result.
4418 const int kNumArgs = 1; 4278 const int kNumArgs = 1;
4419 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); 4279 const Array& args = Array::Handle(Z, Array::New(kNumArgs));
4420 args.SetAt(0, instance); 4280 args.SetAt(0, instance);
4421 if (getter.IsNull()) { 4281 if (getter.IsNull()) {
4422 const Array& args_descriptor = 4282 const Array& args_descriptor =
4423 Array::Handle(ArgumentsDescriptor::New(args.Length())); 4283 Array::Handle(Z, ArgumentsDescriptor::New(args.Length()));
4424 return Api::NewHandle(isolate, 4284 return Api::NewHandle(I,
4425 DartEntry::InvokeNoSuchMethod(instance, 4285 DartEntry::InvokeNoSuchMethod(instance,
4426 getter_name, 4286 getter_name,
4427 args, 4287 args,
4428 args_descriptor)); 4288 args_descriptor));
4429 } 4289 }
4430 return Api::NewHandle(isolate, DartEntry::InvokeFunction(getter, args)); 4290 return Api::NewHandle(I, DartEntry::InvokeFunction(getter, args));
4431 4291
4432 } else if (obj.IsLibrary()) { 4292 } else if (obj.IsLibrary()) {
4433 // To access a top-level we may need to use the Field or the 4293 // To access a top-level we may need to use the Field or the
4434 // getter Function. The getter function may either be in the 4294 // getter Function. The getter function may either be in the
4435 // library or in the field's owner class, depending. 4295 // library or in the field's owner class, depending.
4436 const Library& lib = Library::Cast(obj); 4296 const Library& lib = Library::Cast(obj);
4437 // Check that the library is loaded. 4297 // Check that the library is loaded.
4438 if (!lib.Loaded()) { 4298 if (!lib.Loaded()) {
4439 return Api::NewError( 4299 return Api::NewError(
4440 "%s expects library argument 'container' to be loaded.", 4300 "%s expects library argument 'container' to be loaded.",
4441 CURRENT_FUNC); 4301 CURRENT_FUNC);
4442 } 4302 }
4443 field = lib.LookupFieldAllowPrivate(field_name); 4303 field = lib.LookupFieldAllowPrivate(field_name);
4444 if (field.IsNull()) { 4304 if (field.IsNull()) {
4445 // No field found and no ambiguity error. Check for a getter in the lib. 4305 // No field found and no ambiguity error. Check for a getter in the lib.
4446 const String& getter_name = 4306 const String& getter_name =
4447 String::Handle(isolate, Field::GetterName(field_name)); 4307 String::Handle(Z, Field::GetterName(field_name));
4448 getter = lib.LookupFunctionAllowPrivate(getter_name); 4308 getter = lib.LookupFunctionAllowPrivate(getter_name);
4449 } else if (!field.IsNull() && field.IsUninitialized()) { 4309 } else if (!field.IsNull() && field.IsUninitialized()) {
4450 // A field was found. Check for a getter in the field's owner classs. 4310 // A field was found. Check for a getter in the field's owner classs.
4451 const Class& cls = Class::Handle(isolate, field.owner()); 4311 const Class& cls = Class::Handle(Z, field.owner());
4452 const String& getter_name = 4312 const String& getter_name = String::Handle(Z,
4453 String::Handle(isolate, Field::GetterName(field_name)); 4313 Field::GetterName(field_name));
4454 getter = cls.LookupStaticFunctionAllowPrivate(getter_name); 4314 getter = cls.LookupStaticFunctionAllowPrivate(getter_name);
4455 } 4315 }
4456 4316
4457 if (!getter.IsNull()) { 4317 if (!getter.IsNull()) {
4458 // Invoke the getter and return the result. 4318 // Invoke the getter and return the result.
4459 return Api::NewHandle( 4319 return Api::NewHandle(I,
4460 isolate, DartEntry::InvokeFunction(getter, Object::empty_array())); 4320 DartEntry::InvokeFunction(getter, Object::empty_array()));
4461 } 4321 }
4462 if (!field.IsNull()) { 4322 if (!field.IsNull()) {
4463 return Api::NewHandle(isolate, field.value()); 4323 return Api::NewHandle(I, field.value());
4464 } 4324 }
4465 return Api::NewError("%s: did not find top-level variable '%s'.", 4325 return Api::NewError("%s: did not find top-level variable '%s'.",
4466 CURRENT_FUNC, field_name.ToCString()); 4326 CURRENT_FUNC, field_name.ToCString());
4467 4327
4468 } else if (obj.IsError()) { 4328 } else if (obj.IsError()) {
4469 return container; 4329 return container;
4470 } else { 4330 } else {
4471 return Api::NewError( 4331 return Api::NewError(
4472 "%s expects argument 'container' to be an object, type, or library.", 4332 "%s expects argument 'container' to be an object, type, or library.",
4473 CURRENT_FUNC); 4333 CURRENT_FUNC);
4474 } 4334 }
4475 } 4335 }
4476 4336
4477 4337
4478 DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container, 4338 DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container,
4479 Dart_Handle name, 4339 Dart_Handle name,
4480 Dart_Handle value) { 4340 Dart_Handle value) {
4481 Isolate* isolate = Isolate::Current(); 4341 DARTSCOPE(Thread::Current());
4482 DARTSCOPE(isolate); 4342 CHECK_CALLBACK_STATE(I);
4483 CHECK_CALLBACK_STATE(isolate);
4484 4343
4485 const String& field_name = Api::UnwrapStringHandle(isolate, name); 4344 const String& field_name = Api::UnwrapStringHandle(I, name);
4486 if (field_name.IsNull()) { 4345 if (field_name.IsNull()) {
4487 RETURN_TYPE_ERROR(isolate, name, String); 4346 RETURN_TYPE_ERROR(I, name, String);
4488 } 4347 }
4489 4348
4490 // Since null is allowed for value, we don't use UnwrapInstanceHandle. 4349 // Since null is allowed for value, we don't use UnwrapInstanceHandle.
4491 const Object& value_obj = Object::Handle(isolate, Api::UnwrapHandle(value)); 4350 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value));
4492 if (!value_obj.IsNull() && !value_obj.IsInstance()) { 4351 if (!value_obj.IsNull() && !value_obj.IsInstance()) {
4493 RETURN_TYPE_ERROR(isolate, value, Instance); 4352 RETURN_TYPE_ERROR(I, value, Instance);
4494 } 4353 }
4495 Instance& value_instance = Instance::Handle(isolate); 4354 Instance& value_instance = Instance::Handle(Z);
4496 value_instance ^= value_obj.raw(); 4355 value_instance ^= value_obj.raw();
4497 4356
4498 Field& field = Field::Handle(isolate); 4357 Field& field = Field::Handle(Z);
4499 Function& setter = Function::Handle(isolate); 4358 Function& setter = Function::Handle(Z);
4500 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(container)); 4359 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(container));
4501 if (obj.IsNull()) { 4360 if (obj.IsNull()) {
4502 return Api::NewError("%s expects argument 'container' to be non-null.", 4361 return Api::NewError("%s expects argument 'container' to be non-null.",
4503 CURRENT_FUNC); 4362 CURRENT_FUNC);
4504 } else if (obj.IsType()) { 4363 } else if (obj.IsType()) {
4505 if (!Type::Cast(obj).IsFinalized()) { 4364 if (!Type::Cast(obj).IsFinalized()) {
4506 return Api::NewError( 4365 return Api::NewError(
4507 "%s expects argument 'container' to be a fully resolved type.", 4366 "%s expects argument 'container' to be a fully resolved type.",
4508 CURRENT_FUNC); 4367 CURRENT_FUNC);
4509 } 4368 }
4510 4369
4511 // To access a static field we may need to use the Field or the 4370 // To access a static field we may need to use the Field or the
4512 // setter Function. 4371 // setter Function.
4513 Class& cls = Class::Handle(isolate, Type::Cast(obj).type_class()); 4372 Class& cls = Class::Handle(Z, Type::Cast(obj).type_class());
4514 4373
4515 field = cls.LookupStaticField(field_name); 4374 field = cls.LookupStaticField(field_name);
4516 if (field.IsNull()) { 4375 if (field.IsNull()) {
4517 String& setter_name = 4376 String& setter_name = String::Handle(Z, Field::SetterName(field_name));
4518 String::Handle(isolate, Field::SetterName(field_name));
4519 setter = cls.LookupStaticFunctionAllowPrivate(setter_name); 4377 setter = cls.LookupStaticFunctionAllowPrivate(setter_name);
4520 } 4378 }
4521 4379
4522 if (!setter.IsNull()) { 4380 if (!setter.IsNull()) {
4523 // Invoke the setter and return the result. 4381 // Invoke the setter and return the result.
4524 const int kNumArgs = 1; 4382 const int kNumArgs = 1;
4525 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); 4383 const Array& args = Array::Handle(Z, Array::New(kNumArgs));
4526 args.SetAt(0, value_instance); 4384 args.SetAt(0, value_instance);
4527 const Object& result = 4385 const Object& result = Object::Handle(Z,
4528 Object::Handle(isolate, DartEntry::InvokeFunction(setter, args)); 4386 DartEntry::InvokeFunction(setter, args));
4529 if (result.IsError()) { 4387 if (result.IsError()) {
4530 return Api::NewHandle(isolate, result.raw()); 4388 return Api::NewHandle(I, result.raw());
4531 } else { 4389 } else {
4532 return Api::Success(); 4390 return Api::Success();
4533 } 4391 }
4534 } else if (!field.IsNull()) { 4392 } else if (!field.IsNull()) {
4535 if (field.is_final()) { 4393 if (field.is_final()) {
4536 return Api::NewError("%s: cannot set final field '%s'.", 4394 return Api::NewError("%s: cannot set final field '%s'.",
4537 CURRENT_FUNC, field_name.ToCString()); 4395 CURRENT_FUNC, field_name.ToCString());
4538 } else { 4396 } else {
4539 field.set_value(value_instance); 4397 field.set_value(value_instance);
4540 return Api::Success(); 4398 return Api::Success();
4541 } 4399 }
4542 } else { 4400 } else {
4543 return Api::NewError("%s: did not find static field '%s'.", 4401 return Api::NewError("%s: did not find static field '%s'.",
4544 CURRENT_FUNC, field_name.ToCString()); 4402 CURRENT_FUNC, field_name.ToCString());
4545 } 4403 }
4546 4404
4547 } else if (obj.IsInstance()) { 4405 } else if (obj.IsInstance()) {
4548 // Every instance field has a setter Function. Try to find the 4406 // Every instance field has a setter Function. Try to find the
4549 // setter in any superclass and use that function to access the 4407 // setter in any superclass and use that function to access the
4550 // field. 4408 // field.
4551 const Instance& instance = Instance::Cast(obj); 4409 const Instance& instance = Instance::Cast(obj);
4552 Class& cls = Class::Handle(isolate, instance.clazz()); 4410 Class& cls = Class::Handle(Z, instance.clazz());
4553 String& setter_name = 4411 String& setter_name = String::Handle(Z, Field::SetterName(field_name));
4554 String::Handle(isolate, Field::SetterName(field_name));
4555 while (!cls.IsNull()) { 4412 while (!cls.IsNull()) {
4556 field = cls.LookupInstanceField(field_name); 4413 field = cls.LookupInstanceField(field_name);
4557 if (!field.IsNull() && field.is_final()) { 4414 if (!field.IsNull() && field.is_final()) {
4558 return Api::NewError("%s: cannot set final field '%s'.", 4415 return Api::NewError("%s: cannot set final field '%s'.",
4559 CURRENT_FUNC, field_name.ToCString()); 4416 CURRENT_FUNC, field_name.ToCString());
4560 } 4417 }
4561 setter = cls.LookupDynamicFunctionAllowPrivate(setter_name); 4418 setter = cls.LookupDynamicFunctionAllowPrivate(setter_name);
4562 if (!setter.IsNull()) { 4419 if (!setter.IsNull()) {
4563 break; 4420 break;
4564 } 4421 }
4565 cls = cls.SuperClass(); 4422 cls = cls.SuperClass();
4566 } 4423 }
4567 4424
4568 // Invoke the setter and return the result. 4425 // Invoke the setter and return the result.
4569 const int kNumArgs = 2; 4426 const int kNumArgs = 2;
4570 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); 4427 const Array& args = Array::Handle(Z, Array::New(kNumArgs));
4571 args.SetAt(0, instance); 4428 args.SetAt(0, instance);
4572 args.SetAt(1, value_instance); 4429 args.SetAt(1, value_instance);
4573 if (setter.IsNull()) { 4430 if (setter.IsNull()) {
4574 const Array& args_descriptor = 4431 const Array& args_descriptor =
4575 Array::Handle(ArgumentsDescriptor::New(args.Length())); 4432 Array::Handle(Z, ArgumentsDescriptor::New(args.Length()));
4576 return Api::NewHandle(isolate, 4433 return Api::NewHandle(I, DartEntry::InvokeNoSuchMethod(instance,
4577 DartEntry::InvokeNoSuchMethod(instance, 4434 setter_name,
4578 setter_name, 4435 args,
4579 args, 4436 args_descriptor));
4580 args_descriptor));
4581 } 4437 }
4582 return Api::NewHandle(isolate, DartEntry::InvokeFunction(setter, args)); 4438 return Api::NewHandle(I, DartEntry::InvokeFunction(setter, args));
4583 4439
4584 } else if (obj.IsLibrary()) { 4440 } else if (obj.IsLibrary()) {
4585 // To access a top-level we may need to use the Field or the 4441 // To access a top-level we may need to use the Field or the
4586 // setter Function. The setter function may either be in the 4442 // setter Function. The setter function may either be in the
4587 // library or in the field's owner class, depending. 4443 // library or in the field's owner class, depending.
4588 const Library& lib = Library::Cast(obj); 4444 const Library& lib = Library::Cast(obj);
4589 // Check that the library is loaded. 4445 // Check that the library is loaded.
4590 if (!lib.Loaded()) { 4446 if (!lib.Loaded()) {
4591 return Api::NewError( 4447 return Api::NewError(
4592 "%s expects library argument 'container' to be loaded.", 4448 "%s expects library argument 'container' to be loaded.",
4593 CURRENT_FUNC); 4449 CURRENT_FUNC);
4594 } 4450 }
4595 field = lib.LookupFieldAllowPrivate(field_name); 4451 field = lib.LookupFieldAllowPrivate(field_name);
4596 if (field.IsNull()) { 4452 if (field.IsNull()) {
4597 const String& setter_name = 4453 const String& setter_name =
4598 String::Handle(isolate, Field::SetterName(field_name)); 4454 String::Handle(Z, Field::SetterName(field_name));
4599 setter ^= lib.LookupFunctionAllowPrivate(setter_name); 4455 setter ^= lib.LookupFunctionAllowPrivate(setter_name);
4600 } 4456 }
4601 4457
4602 if (!setter.IsNull()) { 4458 if (!setter.IsNull()) {
4603 // Invoke the setter and return the result. 4459 // Invoke the setter and return the result.
4604 const int kNumArgs = 1; 4460 const int kNumArgs = 1;
4605 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); 4461 const Array& args = Array::Handle(Z, Array::New(kNumArgs));
4606 args.SetAt(0, value_instance); 4462 args.SetAt(0, value_instance);
4607 const Object& result = 4463 const Object& result =
4608 Object::Handle(isolate, DartEntry::InvokeFunction(setter, args)); 4464 Object::Handle(Z, DartEntry::InvokeFunction(setter, args));
4609 if (result.IsError()) { 4465 if (result.IsError()) {
4610 return Api::NewHandle(isolate, result.raw()); 4466 return Api::NewHandle(I, result.raw());
4611 } 4467 }
4612 return Api::Success(); 4468 return Api::Success();
4613 } 4469 }
4614 if (!field.IsNull()) { 4470 if (!field.IsNull()) {
4615 if (field.is_final()) { 4471 if (field.is_final()) {
4616 return Api::NewError("%s: cannot set final top-level variable '%s'.", 4472 return Api::NewError("%s: cannot set final top-level variable '%s'.",
4617 CURRENT_FUNC, field_name.ToCString()); 4473 CURRENT_FUNC, field_name.ToCString());
4618 } 4474 }
4619 field.set_value(value_instance); 4475 field.set_value(value_instance);
4620 return Api::Success(); 4476 return Api::Success();
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
4708 Exceptions::ReThrow(thread, *saved_exception, *saved_stacktrace); 4564 Exceptions::ReThrow(thread, *saved_exception, *saved_stacktrace);
4709 return Api::NewError("Exception was not re thrown, internal error"); 4565 return Api::NewError("Exception was not re thrown, internal error");
4710 } 4566 }
4711 4567
4712 4568
4713 // --- Native fields and functions --- 4569 // --- Native fields and functions ---
4714 4570
4715 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, 4571 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library,
4716 Dart_Handle name, 4572 Dart_Handle name,
4717 int field_count) { 4573 int field_count) {
4718 Isolate* isolate = Isolate::Current(); 4574 DARTSCOPE(Thread::Current());
4719 DARTSCOPE(isolate); 4575 const String& cls_name = Api::UnwrapStringHandle(I, name);
4720 const String& cls_name = Api::UnwrapStringHandle(isolate, name);
4721 if (cls_name.IsNull()) { 4576 if (cls_name.IsNull()) {
4722 RETURN_TYPE_ERROR(isolate, name, String); 4577 RETURN_TYPE_ERROR(I, name, String);
4723 } 4578 }
4724 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 4579 const Library& lib = Api::UnwrapLibraryHandle(I, library);
4725 if (lib.IsNull()) { 4580 if (lib.IsNull()) {
4726 RETURN_TYPE_ERROR(isolate, library, Library); 4581 RETURN_TYPE_ERROR(I, library, Library);
4727 } 4582 }
4728 if (!Utils::IsUint(16, field_count)) { 4583 if (!Utils::IsUint(16, field_count)) {
4729 return Api::NewError( 4584 return Api::NewError(
4730 "Invalid field_count passed to Dart_CreateNativeWrapperClass"); 4585 "Invalid field_count passed to Dart_CreateNativeWrapperClass");
4731 } 4586 }
4732 CHECK_CALLBACK_STATE(isolate); 4587 CHECK_CALLBACK_STATE(I);
4733 4588
4734 String& cls_symbol = String::Handle(isolate, Symbols::New(cls_name)); 4589 String& cls_symbol = String::Handle(Z, Symbols::New(cls_name));
4735 const Class& cls = Class::Handle( 4590 const Class& cls = Class::Handle(Z,
4736 isolate, Class::NewNativeWrapper(lib, cls_symbol, field_count)); 4591 Class::NewNativeWrapper(lib, cls_symbol, field_count));
4737 if (cls.IsNull()) { 4592 if (cls.IsNull()) {
4738 return Api::NewError( 4593 return Api::NewError(
4739 "Unable to create native wrapper class : already exists"); 4594 "Unable to create native wrapper class : already exists");
4740 } 4595 }
4741 return Api::NewHandle(isolate, cls.RareType()); 4596 return Api::NewHandle(I, cls.RareType());
4742 } 4597 }
4743 4598
4744 4599
4745 DART_EXPORT Dart_Handle Dart_GetNativeInstanceFieldCount(Dart_Handle obj, 4600 DART_EXPORT Dart_Handle Dart_GetNativeInstanceFieldCount(Dart_Handle obj,
4746 int* count) { 4601 int* count) {
4747 Isolate* isolate = Isolate::Current(); 4602 Isolate* isolate = Isolate::Current();
4748 CHECK_ISOLATE(isolate); 4603 CHECK_ISOLATE(isolate);
4749 ReusableObjectHandleScope reused_obj_handle(isolate); 4604 ReusableObjectHandleScope reused_obj_handle(isolate);
4750 const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj); 4605 const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj);
4751 if (instance.IsNull()) { 4606 if (instance.IsNull()) {
(...skipping 20 matching lines...) Expand all
4772 CURRENT_FUNC, index); 4627 CURRENT_FUNC, index);
4773 } 4628 }
4774 *value = instance.GetNativeField(index); 4629 *value = instance.GetNativeField(index);
4775 return Api::Success(); 4630 return Api::Success();
4776 } 4631 }
4777 4632
4778 4633
4779 DART_EXPORT Dart_Handle Dart_SetNativeInstanceField(Dart_Handle obj, 4634 DART_EXPORT Dart_Handle Dart_SetNativeInstanceField(Dart_Handle obj,
4780 int index, 4635 int index,
4781 intptr_t value) { 4636 intptr_t value) {
4782 Isolate* isolate = Isolate::Current(); 4637 DARTSCOPE(Thread::Current());
4783 DARTSCOPE(isolate); 4638 const Instance& instance = Api::UnwrapInstanceHandle(I, obj);
4784 const Instance& instance = Api::UnwrapInstanceHandle(isolate, obj);
4785 if (instance.IsNull()) { 4639 if (instance.IsNull()) {
4786 RETURN_TYPE_ERROR(isolate, obj, Instance); 4640 RETURN_TYPE_ERROR(I, obj, Instance);
4787 } 4641 }
4788 if (!instance.IsValidNativeIndex(index)) { 4642 if (!instance.IsValidNativeIndex(index)) {
4789 return Api::NewError( 4643 return Api::NewError(
4790 "%s: invalid index %d passed in to set native instance field", 4644 "%s: invalid index %d passed in to set native instance field",
4791 CURRENT_FUNC, index); 4645 CURRENT_FUNC, index);
4792 } 4646 }
4793 instance.SetNativeField(index, value); 4647 instance.SetNativeField(index, value);
4794 return Api::Success(); 4648 return Api::Success();
4795 } 4649 }
4796 4650
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
5200 // as having failed to load without providing an error instance. 5054 // as having failed to load without providing an error instance.
5201 lib.SetLoadError(Object::null_instance()); 5055 lib.SetLoadError(Object::null_instance());
5202 } 5056 }
5203 } 5057 }
5204 5058
5205 5059
5206 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, 5060 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
5207 Dart_Handle source, 5061 Dart_Handle source,
5208 intptr_t line_offset, 5062 intptr_t line_offset,
5209 intptr_t column_offset) { 5063 intptr_t column_offset) {
5210 Thread* thread = Thread::Current(); 5064 DARTSCOPE(Thread::Current());
5211 Isolate* isolate = thread->isolate(); 5065 TIMERSCOPE(T, time_script_loading);
5212 DARTSCOPE(isolate); 5066 const String& url_str = Api::UnwrapStringHandle(I, url);
5213 TIMERSCOPE(thread, time_script_loading);
5214 const String& url_str = Api::UnwrapStringHandle(isolate, url);
5215 if (url_str.IsNull()) { 5067 if (url_str.IsNull()) {
5216 RETURN_TYPE_ERROR(isolate, url, String); 5068 RETURN_TYPE_ERROR(I, url, String);
5217 } 5069 }
5218 const String& source_str = Api::UnwrapStringHandle(isolate, source); 5070 const String& source_str = Api::UnwrapStringHandle(I, source);
5219 if (source_str.IsNull()) { 5071 if (source_str.IsNull()) {
5220 RETURN_TYPE_ERROR(isolate, source, String); 5072 RETURN_TYPE_ERROR(I, source, String);
5221 } 5073 }
5222 Library& library = 5074 Library& library = Library::Handle(Z, I->object_store()->root_library());
5223 Library::Handle(isolate, isolate->object_store()->root_library());
5224 if (!library.IsNull()) { 5075 if (!library.IsNull()) {
5225 const String& library_url = String::Handle(isolate, library.url()); 5076 const String& library_url = String::Handle(Z, library.url());
5226 return Api::NewError("%s: A script has already been loaded from '%s'.", 5077 return Api::NewError("%s: A script has already been loaded from '%s'.",
5227 CURRENT_FUNC, library_url.ToCString()); 5078 CURRENT_FUNC, library_url.ToCString());
5228 } 5079 }
5229 if (line_offset < 0) { 5080 if (line_offset < 0) {
5230 return Api::NewError("%s: argument 'line_offset' must be positive number", 5081 return Api::NewError("%s: argument 'line_offset' must be positive number",
5231 CURRENT_FUNC); 5082 CURRENT_FUNC);
5232 } 5083 }
5233 if (column_offset < 0) { 5084 if (column_offset < 0) {
5234 return Api::NewError("%s: argument 'column_offset' must be positive number", 5085 return Api::NewError("%s: argument 'column_offset' must be positive number",
5235 CURRENT_FUNC); 5086 CURRENT_FUNC);
5236 } 5087 }
5237 CHECK_CALLBACK_STATE(isolate); 5088 CHECK_CALLBACK_STATE(I);
5238 5089
5239 NoHeapGrowthControlScope no_growth_control; 5090 NoHeapGrowthControlScope no_growth_control;
5240 5091
5241 library = Library::New(url_str); 5092 library = Library::New(url_str);
5242 library.set_debuggable(true); 5093 library.set_debuggable(true);
5243 library.Register(); 5094 library.Register();
5244 isolate->object_store()->set_root_library(library); 5095 I->object_store()->set_root_library(library);
5245 5096
5246 const Script& script = Script::Handle( 5097 const Script& script = Script::Handle(Z,
5247 isolate, Script::New(url_str, source_str, RawScript::kScriptTag)); 5098 Script::New(url_str, source_str, RawScript::kScriptTag));
5248 script.SetLocationOffset(line_offset, column_offset); 5099 script.SetLocationOffset(line_offset, column_offset);
5249 Dart_Handle result; 5100 Dart_Handle result;
5250 CompileSource(isolate, library, script, &result); 5101 CompileSource(I, library, script, &result);
5251 return result; 5102 return result;
5252 } 5103 }
5253 5104
5254 5105
5255 DART_EXPORT Dart_Handle Dart_LoadScriptFromSnapshot(const uint8_t* buffer, 5106 DART_EXPORT Dart_Handle Dart_LoadScriptFromSnapshot(const uint8_t* buffer,
5256 intptr_t buffer_len) { 5107 intptr_t buffer_len) {
5257 Thread* thread = Thread::Current(); 5108 DARTSCOPE(Thread::Current());
5258 Isolate* isolate = thread->isolate(); 5109 TIMERSCOPE(T, time_script_loading);
5259 DARTSCOPE(isolate); 5110 StackZone zone(T);
5260 TIMERSCOPE(thread, time_script_loading);
5261 StackZone zone(isolate);
5262 if (buffer == NULL) { 5111 if (buffer == NULL) {
5263 RETURN_NULL_ERROR(buffer); 5112 RETURN_NULL_ERROR(buffer);
5264 } 5113 }
5265 NoHeapGrowthControlScope no_growth_control; 5114 NoHeapGrowthControlScope no_growth_control;
5266 5115
5267 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); 5116 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
5268 if (!snapshot->IsScriptSnapshot()) { 5117 if (!snapshot->IsScriptSnapshot()) {
5269 return Api::NewError("%s expects parameter 'buffer' to be a script type" 5118 return Api::NewError("%s expects parameter 'buffer' to be a script type"
5270 " snapshot.", CURRENT_FUNC); 5119 " snapshot.", CURRENT_FUNC);
5271 } 5120 }
5272 if (snapshot->length() != buffer_len) { 5121 if (snapshot->length() != buffer_len) {
5273 return Api::NewError("%s: 'buffer_len' of %" Pd " is not equal to %" Pd 5122 return Api::NewError("%s: 'buffer_len' of %" Pd " is not equal to %" Pd
5274 " which is the expected length in the snapshot.", 5123 " which is the expected length in the snapshot.",
5275 CURRENT_FUNC, buffer_len, snapshot->length()); 5124 CURRENT_FUNC, buffer_len, snapshot->length());
5276 } 5125 }
5277 Library& library = 5126 Library& library = Library::Handle(Z, I->object_store()->root_library());
5278 Library::Handle(isolate, isolate->object_store()->root_library());
5279 if (!library.IsNull()) { 5127 if (!library.IsNull()) {
5280 const String& library_url = String::Handle(isolate, library.url()); 5128 const String& library_url = String::Handle(Z, library.url());
5281 return Api::NewError("%s: A script has already been loaded from '%s'.", 5129 return Api::NewError("%s: A script has already been loaded from '%s'.",
5282 CURRENT_FUNC, library_url.ToCString()); 5130 CURRENT_FUNC, library_url.ToCString());
5283 } 5131 }
5284 CHECK_CALLBACK_STATE(isolate); 5132 CHECK_CALLBACK_STATE(I);
5285 5133
5286 ASSERT(snapshot->kind() == Snapshot::kScript); 5134 ASSERT(snapshot->kind() == Snapshot::kScript);
5287 ScriptSnapshotReader reader(snapshot->content(), 5135 ScriptSnapshotReader reader(snapshot->content(), snapshot->length(), T);
5288 snapshot->length(), 5136 const Object& tmp = Object::Handle(Z, reader.ReadScriptSnapshot());
5289 isolate,
5290 zone.GetZone());
5291 const Object& tmp = Object::Handle(isolate, reader.ReadScriptSnapshot());
5292 if (tmp.IsError()) { 5137 if (tmp.IsError()) {
5293 return Api::NewHandle(isolate, tmp.raw()); 5138 return Api::NewHandle(I, tmp.raw());
5294 } 5139 }
5295 library ^= tmp.raw(); 5140 library ^= tmp.raw();
5296 library.set_debuggable(true); 5141 library.set_debuggable(true);
5297 isolate->object_store()->set_root_library(library); 5142 I->object_store()->set_root_library(library);
5298 return Api::NewHandle(isolate, library.raw()); 5143 return Api::NewHandle(I, library.raw());
5299 } 5144 }
5300 5145
5301 5146
5302 DART_EXPORT Dart_Handle Dart_RootLibrary() { 5147 DART_EXPORT Dart_Handle Dart_RootLibrary() {
5303 Isolate* isolate = Isolate::Current(); 5148 Isolate* isolate = Isolate::Current();
5304 CHECK_ISOLATE(isolate); 5149 CHECK_ISOLATE(isolate);
5305 return Api::NewHandle(isolate, isolate->object_store()->root_library()); 5150 return Api::NewHandle(isolate, isolate->object_store()->root_library());
5306 } 5151 }
5307 5152
5308 5153
5309 DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library, 5154 DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library,
5310 Dart_Handle class_name) { 5155 Dart_Handle class_name) {
5311 Isolate* isolate = Isolate::Current(); 5156 DARTSCOPE(Thread::Current());
5312 DARTSCOPE(isolate); 5157 const Library& lib = Api::UnwrapLibraryHandle(I, library);
5313 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
5314 if (lib.IsNull()) { 5158 if (lib.IsNull()) {
5315 RETURN_TYPE_ERROR(isolate, library, Library); 5159 RETURN_TYPE_ERROR(I, library, Library);
5316 } 5160 }
5317 const String& cls_name = Api::UnwrapStringHandle(isolate, class_name); 5161 const String& cls_name = Api::UnwrapStringHandle(I, class_name);
5318 if (cls_name.IsNull()) { 5162 if (cls_name.IsNull()) {
5319 RETURN_TYPE_ERROR(isolate, class_name, String); 5163 RETURN_TYPE_ERROR(I, class_name, String);
5320 } 5164 }
5321 const Class& cls = Class::Handle( 5165 const Class& cls = Class::Handle(Z, lib.LookupClassAllowPrivate(cls_name));
5322 isolate, lib.LookupClassAllowPrivate(cls_name));
5323 if (cls.IsNull()) { 5166 if (cls.IsNull()) {
5324 // TODO(turnidge): Return null or error in this case? 5167 // TODO(turnidge): Return null or error in this case?
5325 const String& lib_name = String::Handle(isolate, lib.name()); 5168 const String& lib_name = String::Handle(Z, lib.name());
5326 return Api::NewError("Class '%s' not found in library '%s'.", 5169 return Api::NewError("Class '%s' not found in library '%s'.",
5327 cls_name.ToCString(), lib_name.ToCString()); 5170 cls_name.ToCString(), lib_name.ToCString());
5328 } 5171 }
5329 return Api::NewHandle(isolate, cls.RareType()); 5172 return Api::NewHandle(I, cls.RareType());
5330 } 5173 }
5331 5174
5332 5175
5333 DART_EXPORT Dart_Handle Dart_GetType(Dart_Handle library, 5176 DART_EXPORT Dart_Handle Dart_GetType(Dart_Handle library,
5334 Dart_Handle class_name, 5177 Dart_Handle class_name,
5335 intptr_t number_of_type_arguments, 5178 intptr_t number_of_type_arguments,
5336 Dart_Handle* type_arguments) { 5179 Dart_Handle* type_arguments) {
5337 Isolate* isolate = Isolate::Current(); 5180 DARTSCOPE(Thread::Current());
5338 DARTSCOPE(isolate);
5339 5181
5340 // Validate the input arguments. 5182 // Validate the input arguments.
5341 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 5183 const Library& lib = Api::UnwrapLibraryHandle(I, library);
5342 if (lib.IsNull()) { 5184 if (lib.IsNull()) {
5343 RETURN_TYPE_ERROR(isolate, library, Library); 5185 RETURN_TYPE_ERROR(I, library, Library);
5344 } 5186 }
5345 if (!lib.Loaded()) { 5187 if (!lib.Loaded()) {
5346 return Api::NewError( 5188 return Api::NewError(
5347 "%s expects library argument 'library' to be loaded.", 5189 "%s expects library argument 'library' to be loaded.",
5348 CURRENT_FUNC); 5190 CURRENT_FUNC);
5349 } 5191 }
5350 const String& name_str = Api::UnwrapStringHandle(isolate, class_name); 5192 const String& name_str = Api::UnwrapStringHandle(I, class_name);
5351 if (name_str.IsNull()) { 5193 if (name_str.IsNull()) {
5352 RETURN_TYPE_ERROR(isolate, class_name, String); 5194 RETURN_TYPE_ERROR(I, class_name, String);
5353 } 5195 }
5354 const Class& cls = 5196 const Class& cls = Class::Handle(Z, lib.LookupClassAllowPrivate(name_str));
5355 Class::Handle(isolate, lib.LookupClassAllowPrivate(name_str));
5356 if (cls.IsNull()) { 5197 if (cls.IsNull()) {
5357 const String& lib_name = String::Handle(isolate, lib.name()); 5198 const String& lib_name = String::Handle(Z, lib.name());
5358 return Api::NewError("Type '%s' not found in library '%s'.", 5199 return Api::NewError("Type '%s' not found in library '%s'.",
5359 name_str.ToCString(), lib_name.ToCString()); 5200 name_str.ToCString(), lib_name.ToCString());
5360 } 5201 }
5361 if (cls.NumTypeArguments() == 0) { 5202 if (cls.NumTypeArguments() == 0) {
5362 if (number_of_type_arguments != 0) { 5203 if (number_of_type_arguments != 0) {
5363 return Api::NewError("Invalid number of type arguments specified, " 5204 return Api::NewError("Invalid number of type arguments specified, "
5364 "got %" Pd " expected 0", number_of_type_arguments); 5205 "got %" Pd " expected 0", number_of_type_arguments);
5365 } 5206 }
5366 return Api::NewHandle(isolate, Type::NewNonParameterizedType(cls)); 5207 return Api::NewHandle(I, Type::NewNonParameterizedType(cls));
5367 } 5208 }
5368 intptr_t num_expected_type_arguments = cls.NumTypeParameters(); 5209 intptr_t num_expected_type_arguments = cls.NumTypeParameters();
5369 TypeArguments& type_args_obj = TypeArguments::Handle(); 5210 TypeArguments& type_args_obj = TypeArguments::Handle();
5370 if (number_of_type_arguments > 0) { 5211 if (number_of_type_arguments > 0) {
5371 if (type_arguments == NULL) { 5212 if (type_arguments == NULL) {
5372 RETURN_NULL_ERROR(type_arguments); 5213 RETURN_NULL_ERROR(type_arguments);
5373 } 5214 }
5374 if (num_expected_type_arguments != number_of_type_arguments) { 5215 if (num_expected_type_arguments != number_of_type_arguments) {
5375 return Api::NewError("Invalid number of type arguments specified, " 5216 return Api::NewError("Invalid number of type arguments specified, "
5376 "got %" Pd " expected %" Pd, 5217 "got %" Pd " expected %" Pd,
5377 number_of_type_arguments, 5218 number_of_type_arguments,
5378 num_expected_type_arguments); 5219 num_expected_type_arguments);
5379 } 5220 }
5380 const Array& array = Api::UnwrapArrayHandle(isolate, *type_arguments); 5221 const Array& array = Api::UnwrapArrayHandle(I, *type_arguments);
5381 if (array.IsNull()) { 5222 if (array.IsNull()) {
5382 RETURN_TYPE_ERROR(isolate, *type_arguments, Array); 5223 RETURN_TYPE_ERROR(I, *type_arguments, Array);
5383 } 5224 }
5384 if (array.Length() != num_expected_type_arguments) { 5225 if (array.Length() != num_expected_type_arguments) {
5385 return Api::NewError("Invalid type arguments specified, expected an " 5226 return Api::NewError("Invalid type arguments specified, expected an "
5386 "array of len %" Pd " but got an array of len %" Pd, 5227 "array of len %" Pd " but got an array of len %" Pd,
5387 number_of_type_arguments, 5228 number_of_type_arguments,
5388 array.Length()); 5229 array.Length());
5389 } 5230 }
5390 // Set up the type arguments array. 5231 // Set up the type arguments array.
5391 type_args_obj ^= TypeArguments::New(num_expected_type_arguments); 5232 type_args_obj ^= TypeArguments::New(num_expected_type_arguments);
5392 AbstractType& type_arg = AbstractType::Handle(); 5233 AbstractType& type_arg = AbstractType::Handle();
5393 for (intptr_t i = 0; i < number_of_type_arguments; i++) { 5234 for (intptr_t i = 0; i < number_of_type_arguments; i++) {
5394 type_arg ^= array.At(i); 5235 type_arg ^= array.At(i);
5395 type_args_obj.SetTypeAt(i, type_arg); 5236 type_args_obj.SetTypeAt(i, type_arg);
5396 } 5237 }
5397 } 5238 }
5398 5239
5399 // Construct the type object, canonicalize it and return. 5240 // Construct the type object, canonicalize it and return.
5400 Type& instantiated_type = Type::Handle( 5241 Type& instantiated_type = Type::Handle(
5401 Type::New(cls, type_args_obj, Scanner::kNoSourcePos)); 5242 Type::New(cls, type_args_obj, Scanner::kNoSourcePos));
5402 instantiated_type ^= ClassFinalizer::FinalizeType( 5243 instantiated_type ^= ClassFinalizer::FinalizeType(
5403 cls, instantiated_type, ClassFinalizer::kCanonicalize); 5244 cls, instantiated_type, ClassFinalizer::kCanonicalize);
5404 return Api::NewHandle(isolate, instantiated_type.raw()); 5245 return Api::NewHandle(I, instantiated_type.raw());
5405 } 5246 }
5406 5247
5407 5248
5408 DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library) { 5249 DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library) {
5409 Isolate* isolate = Isolate::Current(); 5250 DARTSCOPE(Thread::Current());
5410 DARTSCOPE(isolate); 5251 const Library& lib = Api::UnwrapLibraryHandle(I, library);
5411 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
5412 if (lib.IsNull()) { 5252 if (lib.IsNull()) {
5413 RETURN_TYPE_ERROR(isolate, library, Library); 5253 RETURN_TYPE_ERROR(I, library, Library);
5414 } 5254 }
5415 const String& url = String::Handle(isolate, lib.url()); 5255 const String& url = String::Handle(Z, lib.url());
5416 ASSERT(!url.IsNull()); 5256 ASSERT(!url.IsNull());
5417 return Api::NewHandle(isolate, url.raw()); 5257 return Api::NewHandle(I, url.raw());
5418 } 5258 }
5419 5259
5420 5260
5421 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url) { 5261 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url) {
5422 Isolate* isolate = Isolate::Current(); 5262 DARTSCOPE(Thread::Current());
5423 DARTSCOPE(isolate); 5263 const String& url_str = Api::UnwrapStringHandle(I, url);
5424 const String& url_str = Api::UnwrapStringHandle(isolate, url);
5425 if (url_str.IsNull()) { 5264 if (url_str.IsNull()) {
5426 RETURN_TYPE_ERROR(isolate, url, String); 5265 RETURN_TYPE_ERROR(I, url, String);
5427 } 5266 }
5428 const Library& library = 5267 const Library& library = Library::Handle(Z, Library::LookupLibrary(url_str));
5429 Library::Handle(isolate, Library::LookupLibrary(url_str));
5430 if (library.IsNull()) { 5268 if (library.IsNull()) {
5431 return Api::NewError("%s: library '%s' not found.", 5269 return Api::NewError("%s: library '%s' not found.",
5432 CURRENT_FUNC, url_str.ToCString()); 5270 CURRENT_FUNC, url_str.ToCString());
5433 } else { 5271 } else {
5434 return Api::NewHandle(isolate, library.raw()); 5272 return Api::NewHandle(I, library.raw());
5435 } 5273 }
5436 } 5274 }
5437 5275
5438 5276
5439 DART_EXPORT Dart_Handle Dart_LibraryHandleError(Dart_Handle library_in, 5277 DART_EXPORT Dart_Handle Dart_LibraryHandleError(Dart_Handle library_in,
5440 Dart_Handle error_in) { 5278 Dart_Handle error_in) {
5441 Isolate* isolate = Isolate::Current(); 5279 DARTSCOPE(Thread::Current());
5442 DARTSCOPE(isolate);
5443 5280
5444 const Library& lib = Api::UnwrapLibraryHandle(isolate, library_in); 5281 const Library& lib = Api::UnwrapLibraryHandle(I, library_in);
5445 if (lib.IsNull()) { 5282 if (lib.IsNull()) {
5446 RETURN_TYPE_ERROR(isolate, library_in, Library); 5283 RETURN_TYPE_ERROR(I, library_in, Library);
5447 } 5284 }
5448 const Instance& err = Api::UnwrapInstanceHandle(isolate, error_in); 5285 const Instance& err = Api::UnwrapInstanceHandle(I, error_in);
5449 if (err.IsNull()) { 5286 if (err.IsNull()) {
5450 RETURN_TYPE_ERROR(isolate, error_in, Instance); 5287 RETURN_TYPE_ERROR(I, error_in, Instance);
5451 } 5288 }
5452 CHECK_CALLBACK_STATE(isolate); 5289 CHECK_CALLBACK_STATE(I);
5453 5290
5454 const GrowableObjectArray& pending_deferred_loads = 5291 const GrowableObjectArray& pending_deferred_loads =
5455 GrowableObjectArray::Handle( 5292 GrowableObjectArray::Handle(Z,
5456 isolate->object_store()->pending_deferred_loads()); 5293 I->object_store()->pending_deferred_loads());
5457 for (intptr_t i = 0; i < pending_deferred_loads.Length(); i++) { 5294 for (intptr_t i = 0; i < pending_deferred_loads.Length(); i++) {
5458 if (pending_deferred_loads.At(i) == lib.raw()) { 5295 if (pending_deferred_loads.At(i) == lib.raw()) {
5459 lib.SetLoadError(err); 5296 lib.SetLoadError(err);
5460 return Api::Null(); 5297 return Api::Null();
5461 } 5298 }
5462 } 5299 }
5463 return error_in; 5300 return error_in;
5464 } 5301 }
5465 5302
5466 5303
5467 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url, 5304 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url,
5468 Dart_Handle source, 5305 Dart_Handle source,
5469 intptr_t line_offset, 5306 intptr_t line_offset,
5470 intptr_t column_offset) { 5307 intptr_t column_offset) {
5471 Thread* thread = Thread::Current(); 5308 DARTSCOPE(Thread::Current());
5472 Isolate* isolate = thread->isolate(); 5309 TIMERSCOPE(T, time_script_loading);
5473 DARTSCOPE(isolate); 5310 const String& url_str = Api::UnwrapStringHandle(I, url);
5474 TIMERSCOPE(thread, time_script_loading);
5475 const String& url_str = Api::UnwrapStringHandle(isolate, url);
5476 if (url_str.IsNull()) { 5311 if (url_str.IsNull()) {
5477 RETURN_TYPE_ERROR(isolate, url, String); 5312 RETURN_TYPE_ERROR(I, url, String);
5478 } 5313 }
5479 const String& source_str = Api::UnwrapStringHandle(isolate, source); 5314 const String& source_str = Api::UnwrapStringHandle(I, source);
5480 if (source_str.IsNull()) { 5315 if (source_str.IsNull()) {
5481 RETURN_TYPE_ERROR(isolate, source, String); 5316 RETURN_TYPE_ERROR(I, source, String);
5482 } 5317 }
5483 if (line_offset < 0) { 5318 if (line_offset < 0) {
5484 return Api::NewError("%s: argument 'line_offset' must be positive number", 5319 return Api::NewError("%s: argument 'line_offset' must be positive number",
5485 CURRENT_FUNC); 5320 CURRENT_FUNC);
5486 } 5321 }
5487 if (column_offset < 0) { 5322 if (column_offset < 0) {
5488 return Api::NewError("%s: argument 'column_offset' must be positive number", 5323 return Api::NewError("%s: argument 'column_offset' must be positive number",
5489 CURRENT_FUNC); 5324 CURRENT_FUNC);
5490 } 5325 }
5491 CHECK_CALLBACK_STATE(isolate); 5326 CHECK_CALLBACK_STATE(I);
5492 5327
5493 NoHeapGrowthControlScope no_growth_control; 5328 NoHeapGrowthControlScope no_growth_control;
5494 5329
5495 Library& library = Library::Handle(isolate, Library::LookupLibrary(url_str)); 5330 Library& library = Library::Handle(Z, Library::LookupLibrary(url_str));
5496 if (library.IsNull()) { 5331 if (library.IsNull()) {
5497 library = Library::New(url_str); 5332 library = Library::New(url_str);
5498 library.Register(); 5333 library.Register();
5499 } else if (library.LoadInProgress() || 5334 } else if (library.LoadInProgress() ||
5500 library.Loaded() || 5335 library.Loaded() ||
5501 library.LoadFailed()) { 5336 library.LoadFailed()) {
5502 // The source for this library has either been loaded or is in the 5337 // The source for this library has either been loaded or is in the
5503 // process of loading. Return an error. 5338 // process of loading. Return an error.
5504 return Api::NewError("%s: library '%s' has already been loaded.", 5339 return Api::NewError("%s: library '%s' has already been loaded.",
5505 CURRENT_FUNC, url_str.ToCString()); 5340 CURRENT_FUNC, url_str.ToCString());
5506 } 5341 }
5507 const Script& script = Script::Handle( 5342 const Script& script = Script::Handle(Z,
5508 isolate, Script::New(url_str, source_str, RawScript::kLibraryTag)); 5343 Script::New(url_str, source_str, RawScript::kLibraryTag));
5509 script.SetLocationOffset(line_offset, column_offset); 5344 script.SetLocationOffset(line_offset, column_offset);
5510 Dart_Handle result; 5345 Dart_Handle result;
5511 CompileSource(isolate, library, script, &result); 5346 CompileSource(I, library, script, &result);
5512 // Propagate the error out right now. 5347 // Propagate the error out right now.
5513 if (::Dart_IsError(result)) { 5348 if (::Dart_IsError(result)) {
5514 return result; 5349 return result;
5515 } 5350 }
5516 5351
5517 // If this is the dart:_builtin library, register it with the VM. 5352 // If this is the dart:_builtin library, register it with the VM.
5518 if (url_str.Equals("dart:_builtin")) { 5353 if (url_str.Equals("dart:_builtin")) {
5519 isolate->object_store()->set_builtin_library(library); 5354 I->object_store()->set_builtin_library(library);
5520 Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate); 5355 Dart_Handle state = Api::CheckAndFinalizePendingClasses(I);
5521 if (::Dart_IsError(state)) { 5356 if (::Dart_IsError(state)) {
5522 return state; 5357 return state;
5523 } 5358 }
5524 } 5359 }
5525 return result; 5360 return result;
5526 } 5361 }
5527 5362
5528 5363
5529 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library, 5364 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library,
5530 Dart_Handle import, 5365 Dart_Handle import,
5531 Dart_Handle prefix) { 5366 Dart_Handle prefix) {
5532 Isolate* isolate = Isolate::Current(); 5367 DARTSCOPE(Thread::Current());
5533 DARTSCOPE(isolate); 5368 const Library& library_vm = Api::UnwrapLibraryHandle(I, library);
5534 const Library& library_vm = Api::UnwrapLibraryHandle(isolate, library);
5535 if (library_vm.IsNull()) { 5369 if (library_vm.IsNull()) {
5536 RETURN_TYPE_ERROR(isolate, library, Library); 5370 RETURN_TYPE_ERROR(I, library, Library);
5537 } 5371 }
5538 const Library& import_vm = Api::UnwrapLibraryHandle(isolate, import); 5372 const Library& import_vm = Api::UnwrapLibraryHandle(I, import);
5539 if (import_vm.IsNull()) { 5373 if (import_vm.IsNull()) {
5540 RETURN_TYPE_ERROR(isolate, import, Library); 5374 RETURN_TYPE_ERROR(I, import, Library);
5541 } 5375 }
5542 const Object& prefix_object = 5376 const Object& prefix_object = Object::Handle(Z, Api::UnwrapHandle(prefix));
5543 Object::Handle(isolate, Api::UnwrapHandle(prefix));
5544 const String& prefix_vm = prefix_object.IsNull() 5377 const String& prefix_vm = prefix_object.IsNull()
5545 ? Symbols::Empty() 5378 ? Symbols::Empty()
5546 : String::Cast(prefix_object); 5379 : String::Cast(prefix_object);
5547 if (prefix_vm.IsNull()) { 5380 if (prefix_vm.IsNull()) {
5548 RETURN_TYPE_ERROR(isolate, prefix, String); 5381 RETURN_TYPE_ERROR(I, prefix, String);
5549 } 5382 }
5550 CHECK_CALLBACK_STATE(isolate); 5383 CHECK_CALLBACK_STATE(I);
5551 5384
5552 const String& prefix_symbol = 5385 const String& prefix_symbol = String::Handle(Z, Symbols::New(prefix_vm));
5553 String::Handle(isolate, Symbols::New(prefix_vm)); 5386 const Namespace& import_ns = Namespace::Handle(Z,
5554 const Namespace& import_ns = Namespace::Handle(
5555 Namespace::New(import_vm, Object::null_array(), Object::null_array())); 5387 Namespace::New(import_vm, Object::null_array(), Object::null_array()));
5556 if (prefix_vm.Length() == 0) { 5388 if (prefix_vm.Length() == 0) {
5557 library_vm.AddImport(import_ns); 5389 library_vm.AddImport(import_ns);
5558 } else { 5390 } else {
5559 LibraryPrefix& library_prefix = LibraryPrefix::Handle(); 5391 LibraryPrefix& library_prefix = LibraryPrefix::Handle();
5560 library_prefix = library_vm.LookupLocalLibraryPrefix(prefix_symbol); 5392 library_prefix = library_vm.LookupLocalLibraryPrefix(prefix_symbol);
5561 if (!library_prefix.IsNull()) { 5393 if (!library_prefix.IsNull()) {
5562 library_prefix.AddImport(import_ns); 5394 library_prefix.AddImport(import_ns);
5563 } else { 5395 } else {
5564 library_prefix = 5396 library_prefix =
5565 LibraryPrefix::New(prefix_symbol, import_ns, false, library_vm); 5397 LibraryPrefix::New(prefix_symbol, import_ns, false, library_vm);
5566 library_vm.AddObject(library_prefix, prefix_symbol); 5398 library_vm.AddObject(library_prefix, prefix_symbol);
5567 } 5399 }
5568 } 5400 }
5569 return Api::Success(); 5401 return Api::Success();
5570 } 5402 }
5571 5403
5572 5404
5573 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library, 5405 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library,
5574 Dart_Handle url, 5406 Dart_Handle url,
5575 Dart_Handle source, 5407 Dart_Handle source,
5576 intptr_t line_offset, 5408 intptr_t line_offset,
5577 intptr_t column_offset) { 5409 intptr_t column_offset) {
5578 Thread* thread = Thread::Current(); 5410 DARTSCOPE(Thread::Current());
5579 Isolate* isolate = thread->isolate(); 5411 TIMERSCOPE(T, time_script_loading);
5580 DARTSCOPE(isolate); 5412 const Library& lib = Api::UnwrapLibraryHandle(I, library);
5581 TIMERSCOPE(thread, time_script_loading);
5582 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
5583 if (lib.IsNull()) { 5413 if (lib.IsNull()) {
5584 RETURN_TYPE_ERROR(isolate, library, Library); 5414 RETURN_TYPE_ERROR(I, library, Library);
5585 } 5415 }
5586 const String& url_str = Api::UnwrapStringHandle(isolate, url); 5416 const String& url_str = Api::UnwrapStringHandle(I, url);
5587 if (url_str.IsNull()) { 5417 if (url_str.IsNull()) {
5588 RETURN_TYPE_ERROR(isolate, url, String); 5418 RETURN_TYPE_ERROR(I, url, String);
5589 } 5419 }
5590 const String& source_str = Api::UnwrapStringHandle(isolate, source); 5420 const String& source_str = Api::UnwrapStringHandle(I, source);
5591 if (source_str.IsNull()) { 5421 if (source_str.IsNull()) {
5592 RETURN_TYPE_ERROR(isolate, source, String); 5422 RETURN_TYPE_ERROR(I, source, String);
5593 } 5423 }
5594 if (line_offset < 0) { 5424 if (line_offset < 0) {
5595 return Api::NewError("%s: argument 'line_offset' must be positive number", 5425 return Api::NewError("%s: argument 'line_offset' must be positive number",
5596 CURRENT_FUNC); 5426 CURRENT_FUNC);
5597 } 5427 }
5598 if (column_offset < 0) { 5428 if (column_offset < 0) {
5599 return Api::NewError("%s: argument 'column_offset' must be positive number", 5429 return Api::NewError("%s: argument 'column_offset' must be positive number",
5600 CURRENT_FUNC); 5430 CURRENT_FUNC);
5601 } 5431 }
5602 CHECK_CALLBACK_STATE(isolate); 5432 CHECK_CALLBACK_STATE(I);
5603 5433
5604 NoHeapGrowthControlScope no_growth_control; 5434 NoHeapGrowthControlScope no_growth_control;
5605 5435
5606 const Script& script = Script::Handle( 5436 const Script& script = Script::Handle(Z,
5607 isolate, Script::New(url_str, source_str, RawScript::kSourceTag)); 5437 Script::New(url_str, source_str, RawScript::kSourceTag));
5608 script.SetLocationOffset(line_offset, column_offset); 5438 script.SetLocationOffset(line_offset, column_offset);
5609 Dart_Handle result; 5439 Dart_Handle result;
5610 CompileSource(isolate, lib, script, &result); 5440 CompileSource(I, lib, script, &result);
5611 return result; 5441 return result;
5612 } 5442 }
5613 5443
5614 5444
5615 DART_EXPORT Dart_Handle Dart_LibraryLoadPatch(Dart_Handle library, 5445 DART_EXPORT Dart_Handle Dart_LibraryLoadPatch(Dart_Handle library,
5616 Dart_Handle url, 5446 Dart_Handle url,
5617 Dart_Handle patch_source) { 5447 Dart_Handle patch_source) {
5618 Thread* thread = Thread::Current(); 5448 DARTSCOPE(Thread::Current());
5619 Isolate* isolate = thread->isolate(); 5449 TIMERSCOPE(T, time_script_loading);
5620 DARTSCOPE(isolate); 5450 const Library& lib = Api::UnwrapLibraryHandle(I, library);
5621 TIMERSCOPE(thread, time_script_loading);
5622 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
5623 if (lib.IsNull()) { 5451 if (lib.IsNull()) {
5624 RETURN_TYPE_ERROR(isolate, library, Library); 5452 RETURN_TYPE_ERROR(I, library, Library);
5625 } 5453 }
5626 const String& url_str = Api::UnwrapStringHandle(isolate, url); 5454 const String& url_str = Api::UnwrapStringHandle(I, url);
5627 if (url_str.IsNull()) { 5455 if (url_str.IsNull()) {
5628 RETURN_TYPE_ERROR(isolate, url, String); 5456 RETURN_TYPE_ERROR(I, url, String);
5629 } 5457 }
5630 const String& source_str = Api::UnwrapStringHandle(isolate, patch_source); 5458 const String& source_str = Api::UnwrapStringHandle(I, patch_source);
5631 if (source_str.IsNull()) { 5459 if (source_str.IsNull()) {
5632 RETURN_TYPE_ERROR(isolate, patch_source, String); 5460 RETURN_TYPE_ERROR(I, patch_source, String);
5633 } 5461 }
5634 CHECK_CALLBACK_STATE(isolate); 5462 CHECK_CALLBACK_STATE(I);
5635 5463
5636 NoHeapGrowthControlScope no_growth_control; 5464 NoHeapGrowthControlScope no_growth_control;
5637 5465
5638 const Script& script = Script::Handle( 5466 const Script& script = Script::Handle(Z,
5639 isolate, Script::New(url_str, source_str, RawScript::kPatchTag)); 5467 Script::New(url_str, source_str, RawScript::kPatchTag));
5640 Dart_Handle result; 5468 Dart_Handle result;
5641 CompileSource(isolate, lib, script, &result); 5469 CompileSource(I, lib, script, &result);
5642 return result; 5470 return result;
5643 } 5471 }
5644 5472
5645 5473
5646 // Finalizes classes and invokes Dart core library function that completes 5474 // Finalizes classes and invokes Dart core library function that completes
5647 // futures of loadLibrary calls (deferred library loading). 5475 // futures of loadLibrary calls (deferred library loading).
5648 DART_EXPORT Dart_Handle Dart_FinalizeLoading(bool complete_futures) { 5476 DART_EXPORT Dart_Handle Dart_FinalizeLoading(bool complete_futures) {
5649 Isolate* isolate = Isolate::Current(); 5477 DARTSCOPE(Thread::Current());
5650 DARTSCOPE(isolate); 5478 CHECK_CALLBACK_STATE(I);
5651 CHECK_CALLBACK_STATE(isolate);
5652 5479
5653 isolate->DoneLoading(); 5480 I->DoneLoading();
5654 5481
5655 // TODO(hausner): move the remaining code below (finalization and 5482 // TODO(hausner): move the remaining code below (finalization and
5656 // invoing of _completeDeferredLoads) into Isolate::DoneLoading(). 5483 // invoing of _completeDeferredLoads) into Isolate::DoneLoading().
5657 5484
5658 // Finalize all classes if needed. 5485 // Finalize all classes if needed.
5659 Dart_Handle state = Api::CheckAndFinalizePendingClasses(isolate); 5486 Dart_Handle state = Api::CheckAndFinalizePendingClasses(I);
5660 if (::Dart_IsError(state)) { 5487 if (::Dart_IsError(state)) {
5661 return state; 5488 return state;
5662 } 5489 }
5663 5490
5664 // Now that the newly loaded classes are finalized, notify the debugger 5491 // Now that the newly loaded classes are finalized, notify the debugger
5665 // that new code has been loaded. If there are latent breakpoints in 5492 // that new code has been loaded. If there are latent breakpoints in
5666 // the new code, the debugger convert them to unresolved source breakpoints. 5493 // the new code, the debugger convert them to unresolved source breakpoints.
5667 // The code that completes the futures (invoked below) may call into the 5494 // The code that completes the futures (invoked below) may call into the
5668 // newly loaded code and trigger one of these breakpoints. 5495 // newly loaded code and trigger one of these breakpoints.
5669 isolate->debugger()->NotifyDoneLoading(); 5496 I->debugger()->NotifyDoneLoading();
5670 5497
5671 // Notify mirrors that MirrorSystem.libraries needs to be recomputed. 5498 // Notify mirrors that MirrorSystem.libraries needs to be recomputed.
5672 const Library& libmirrors = 5499 const Library& libmirrors = Library::Handle(Z, Library::MirrorsLibrary());
5673 Library::Handle(isolate, Library::MirrorsLibrary()); 5500 const Field& dirty_bit = Field::Handle(Z,
5674 const Field& dirty_bit = Field::Handle(isolate,
5675 libmirrors.LookupLocalField(String::Handle(String::New("dirty")))); 5501 libmirrors.LookupLocalField(String::Handle(String::New("dirty"))));
5676 ASSERT(!dirty_bit.IsNull() && dirty_bit.is_static()); 5502 ASSERT(!dirty_bit.IsNull() && dirty_bit.is_static());
5677 dirty_bit.set_value(Bool::True()); 5503 dirty_bit.set_value(Bool::True());
5678 5504
5679 if (complete_futures) { 5505 if (complete_futures) {
5680 const Library& corelib = Library::Handle(isolate, Library::CoreLibrary()); 5506 const Library& corelib = Library::Handle(Z, Library::CoreLibrary());
5681 const String& function_name = 5507 const String& function_name =
5682 String::Handle(isolate, String::New("_completeDeferredLoads")); 5508 String::Handle(Z, String::New("_completeDeferredLoads"));
5683 const Function& function = 5509 const Function& function = Function::Handle(Z,
5684 Function::Handle(isolate, 5510 corelib.LookupFunctionAllowPrivate(function_name));
5685 corelib.LookupFunctionAllowPrivate(function_name));
5686 ASSERT(!function.IsNull()); 5511 ASSERT(!function.IsNull());
5687 const Array& args = Array::empty_array(); 5512 const Array& args = Array::empty_array();
5688 5513
5689 const Object& res = 5514 const Object& res =
5690 Object::Handle(isolate, DartEntry::InvokeFunction(function, args)); 5515 Object::Handle(Z, DartEntry::InvokeFunction(function, args));
5691 isolate->object_store()->clear_pending_deferred_loads(); 5516 I->object_store()->clear_pending_deferred_loads();
5692 if (res.IsError() || res.IsUnhandledException()) { 5517 if (res.IsError() || res.IsUnhandledException()) {
5693 return Api::NewHandle(isolate, res.raw()); 5518 return Api::NewHandle(I, res.raw());
5694 } 5519 }
5695 } 5520 }
5696 return Api::Success(); 5521 return Api::Success();
5697 } 5522 }
5698 5523
5699 5524
5700 DART_EXPORT Dart_Handle Dart_SetNativeResolver( 5525 DART_EXPORT Dart_Handle Dart_SetNativeResolver(
5701 Dart_Handle library, 5526 Dart_Handle library,
5702 Dart_NativeEntryResolver resolver, 5527 Dart_NativeEntryResolver resolver,
5703 Dart_NativeEntrySymbol symbol) { 5528 Dart_NativeEntrySymbol symbol) {
5704 Isolate* isolate = Isolate::Current(); 5529 DARTSCOPE(Thread::Current());
5705 DARTSCOPE(isolate); 5530 const Library& lib = Api::UnwrapLibraryHandle(I, library);
5706 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
5707 if (lib.IsNull()) { 5531 if (lib.IsNull()) {
5708 RETURN_TYPE_ERROR(isolate, library, Library); 5532 RETURN_TYPE_ERROR(I, library, Library);
5709 } 5533 }
5710 lib.set_native_entry_resolver(resolver); 5534 lib.set_native_entry_resolver(resolver);
5711 lib.set_native_entry_symbol_resolver(symbol); 5535 lib.set_native_entry_symbol_resolver(symbol);
5712 return Api::Success(); 5536 return Api::Success();
5713 } 5537 }
5714 5538
5715 5539
5716 // --- Peer support --- 5540 // --- Peer support ---
5717 5541
5718 DART_EXPORT Dart_Handle Dart_GetPeer(Dart_Handle object, void** peer) { 5542 DART_EXPORT Dart_Handle Dart_GetPeer(Dart_Handle object, void** peer) {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
5820 } 5644 }
5821 Service::SetEmbedderStreamCallbacks(listen_callback, cancel_callback); 5645 Service::SetEmbedderStreamCallbacks(listen_callback, cancel_callback);
5822 return Api::Success(); 5646 return Api::Success();
5823 } 5647 }
5824 5648
5825 5649
5826 DART_EXPORT Dart_Handle Dart_ServiceSendDataEvent(const char* stream_id, 5650 DART_EXPORT Dart_Handle Dart_ServiceSendDataEvent(const char* stream_id,
5827 const char* event_kind, 5651 const char* event_kind,
5828 const uint8_t* bytes, 5652 const uint8_t* bytes,
5829 intptr_t bytes_length) { 5653 intptr_t bytes_length) {
5830 Isolate* isolate = Isolate::Current(); 5654 DARTSCOPE(Thread::Current());
5831 DARTSCOPE(isolate);
5832 if (stream_id == NULL) { 5655 if (stream_id == NULL) {
5833 RETURN_NULL_ERROR(stream_id); 5656 RETURN_NULL_ERROR(stream_id);
5834 } 5657 }
5835 if (event_kind == NULL) { 5658 if (event_kind == NULL) {
5836 RETURN_NULL_ERROR(event_kind); 5659 RETURN_NULL_ERROR(event_kind);
5837 } 5660 }
5838 if (bytes == NULL) { 5661 if (bytes == NULL) {
5839 RETURN_NULL_ERROR(bytes); 5662 RETURN_NULL_ERROR(bytes);
5840 } 5663 }
5841 if (bytes_length < 0) { 5664 if (bytes_length < 0) {
5842 return Api::NewError("%s expects argument 'bytes_length' to be >= 0.", 5665 return Api::NewError("%s expects argument 'bytes_length' to be >= 0.",
5843 CURRENT_FUNC); 5666 CURRENT_FUNC);
5844 } 5667 }
5845 Service::SendEmbedderEvent(isolate, stream_id, event_kind, 5668 Service::SendEmbedderEvent(I, stream_id, event_kind,
5846 bytes, bytes_length); 5669 bytes, bytes_length);
5847 return Api::Success(); 5670 return Api::Success();
5848 } 5671 }
5849 5672
5850 5673
5851 DART_EXPORT void Dart_TimelineSetRecordedStreams(int64_t stream_mask) { 5674 DART_EXPORT void Dart_TimelineSetRecordedStreams(int64_t stream_mask) {
5852 Isolate* isolate = Isolate::Current(); 5675 Isolate* isolate = Isolate::Current();
5853 CHECK_ISOLATE(isolate); 5676 CHECK_ISOLATE(isolate);
5854 isolate->GetAPIStream()->set_enabled( 5677 isolate->GetAPIStream()->set_enabled(
5855 (stream_mask & DART_TIMELINE_STREAM_API) != 0); 5678 (stream_mask & DART_TIMELINE_STREAM_API) != 0);
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
6038 ASSERT(stream != NULL); 5861 ASSERT(stream != NULL);
6039 TimelineEvent* event = stream->StartEvent(); 5862 TimelineEvent* event = stream->StartEvent();
6040 if (event != NULL) { 5863 if (event != NULL) {
6041 event->AsyncEnd(label, async_id); 5864 event->AsyncEnd(label, async_id);
6042 event->Complete(); 5865 event->Complete();
6043 } 5866 }
6044 return Api::Success(); 5867 return Api::Success();
6045 } 5868 }
6046 5869
6047 } // namespace dart 5870 } // 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