| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
| 6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
| 7 #include "platform/utils.h" | 7 #include "platform/utils.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
| 10 #include "vm/dart_api_state.h" | 10 #include "vm/dart_api_state.h" |
| (...skipping 2139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2150 EXPECT_EQ(iso_2, Dart_CurrentIsolate()); | 2150 EXPECT_EQ(iso_2, Dart_CurrentIsolate()); |
| 2151 Dart_ShutdownIsolate(); | 2151 Dart_ShutdownIsolate(); |
| 2152 EXPECT(NULL == Dart_CurrentIsolate()); | 2152 EXPECT(NULL == Dart_CurrentIsolate()); |
| 2153 Dart_EnterIsolate(iso_1); | 2153 Dart_EnterIsolate(iso_1); |
| 2154 EXPECT_EQ(iso_1, Dart_CurrentIsolate()); | 2154 EXPECT_EQ(iso_1, Dart_CurrentIsolate()); |
| 2155 Dart_ShutdownIsolate(); | 2155 Dart_ShutdownIsolate(); |
| 2156 EXPECT(NULL == Dart_CurrentIsolate()); | 2156 EXPECT(NULL == Dart_CurrentIsolate()); |
| 2157 } | 2157 } |
| 2158 | 2158 |
| 2159 | 2159 |
| 2160 TEST_CASE(DebugName) { |
| 2161 Dart_Handle debug_name = Dart_DebugName(); |
| 2162 EXPECT_VALID(debug_name); |
| 2163 EXPECT(Dart_IsString(debug_name)); |
| 2164 } |
| 2165 |
| 2166 |
| 2160 static void MyMessageNotifyCallback(Dart_Isolate dest_isolate) { | 2167 static void MyMessageNotifyCallback(Dart_Isolate dest_isolate) { |
| 2161 } | 2168 } |
| 2162 | 2169 |
| 2163 | 2170 |
| 2164 UNIT_TEST_CASE(SetMessageCallbacks) { | 2171 UNIT_TEST_CASE(SetMessageCallbacks) { |
| 2165 Dart_Isolate dart_isolate = TestCase::CreateTestIsolate(); | 2172 Dart_Isolate dart_isolate = TestCase::CreateTestIsolate(); |
| 2166 Dart_SetMessageNotifyCallback(&MyMessageNotifyCallback); | 2173 Dart_SetMessageNotifyCallback(&MyMessageNotifyCallback); |
| 2167 Isolate* isolate = reinterpret_cast<Isolate*>(dart_isolate); | 2174 Isolate* isolate = reinterpret_cast<Isolate*>(dart_isolate); |
| 2168 EXPECT_EQ(&MyMessageNotifyCallback, isolate->message_notify_callback()); | 2175 EXPECT_EQ(&MyMessageNotifyCallback, isolate->message_notify_callback()); |
| 2169 Dart_ShutdownIsolate(); | 2176 Dart_ShutdownIsolate(); |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2691 EXPECT_VALID(result); | 2698 EXPECT_VALID(result); |
| 2692 result = Dart_IntegerToInt64(result, &value); | 2699 result = Dart_IntegerToInt64(result, &value); |
| 2693 EXPECT_EQ(40, value); | 2700 EXPECT_EQ(40, value); |
| 2694 | 2701 |
| 2695 // Now access and set various native instance fields of the returned object. | 2702 // Now access and set various native instance fields of the returned object. |
| 2696 const int kNativeFld0 = 0; | 2703 const int kNativeFld0 = 0; |
| 2697 const int kNativeFld1 = 1; | 2704 const int kNativeFld1 = 1; |
| 2698 const int kNativeFld2 = 2; | 2705 const int kNativeFld2 = 2; |
| 2699 const int kNativeFld3 = 3; | 2706 const int kNativeFld3 = 3; |
| 2700 const int kNativeFld4 = 4; | 2707 const int kNativeFld4 = 4; |
| 2708 int field_count = 0; |
| 2701 intptr_t field_value = 0; | 2709 intptr_t field_value = 0; |
| 2710 EXPECT_VALID(Dart_GetNativeInstanceFieldCount(retobj, &field_count)); |
| 2711 EXPECT_EQ(4, field_count); |
| 2702 result = Dart_GetNativeInstanceField(retobj, kNativeFld4, &field_value); | 2712 result = Dart_GetNativeInstanceField(retobj, kNativeFld4, &field_value); |
| 2703 EXPECT(Dart_IsError(result)); | 2713 EXPECT(Dart_IsError(result)); |
| 2704 result = Dart_GetNativeInstanceField(retobj, kNativeFld0, &field_value); | 2714 result = Dart_GetNativeInstanceField(retobj, kNativeFld0, &field_value); |
| 2705 EXPECT_VALID(result); | 2715 EXPECT_VALID(result); |
| 2706 EXPECT_EQ(0, field_value); | 2716 EXPECT_EQ(0, field_value); |
| 2707 result = Dart_GetNativeInstanceField(retobj, kNativeFld1, &field_value); | 2717 result = Dart_GetNativeInstanceField(retobj, kNativeFld1, &field_value); |
| 2708 EXPECT_VALID(result); | 2718 EXPECT_VALID(result); |
| 2709 EXPECT_EQ(0, field_value); | 2719 EXPECT_EQ(0, field_value); |
| 2710 result = Dart_GetNativeInstanceField(retobj, kNativeFld2, &field_value); | 2720 result = Dart_GetNativeInstanceField(retobj, kNativeFld2, &field_value); |
| 2711 EXPECT_VALID(result); | 2721 EXPECT_VALID(result); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2768 EXPECT_VALID(result); | 2778 EXPECT_VALID(result); |
| 2769 | 2779 |
| 2770 // Load up a test script in it. | 2780 // Load up a test script in it. |
| 2771 | 2781 |
| 2772 // Invoke a function which returns an object of type NativeFields. | 2782 // Invoke a function which returns an object of type NativeFields. |
| 2773 Dart_Handle retobj = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL); | 2783 Dart_Handle retobj = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL); |
| 2774 EXPECT_VALID(retobj); | 2784 EXPECT_VALID(retobj); |
| 2775 | 2785 |
| 2776 // Now access and set various instance fields of the returned object. | 2786 // Now access and set various instance fields of the returned object. |
| 2777 TestNativeFields(retobj); | 2787 TestNativeFields(retobj); |
| 2788 |
| 2789 // Test that accessing an error handle propagates the error. |
| 2790 Dart_Handle error = Api::NewError("myerror"); |
| 2791 intptr_t field_value = 0; |
| 2792 |
| 2793 result = Dart_GetNativeInstanceField(error, 0, &field_value); |
| 2794 EXPECT(Dart_IsError(result)); |
| 2795 EXPECT_STREQ("myerror", Dart_GetError(result)); |
| 2796 |
| 2797 result = Dart_SetNativeInstanceField(error, 0, 1); |
| 2798 EXPECT(Dart_IsError(result)); |
| 2799 EXPECT_STREQ("myerror", Dart_GetError(result)); |
| 2778 } | 2800 } |
| 2779 | 2801 |
| 2780 | 2802 |
| 2781 TEST_CASE(ImplicitNativeFieldAccess) { | 2803 TEST_CASE(ImplicitNativeFieldAccess) { |
| 2782 const char* kScriptChars = | 2804 const char* kScriptChars = |
| 2783 "#import('dart:nativewrappers');" | 2805 "#import('dart:nativewrappers');" |
| 2784 "class NativeFields extends NativeFieldWrapperClass4 {\n" | 2806 "class NativeFields extends NativeFieldWrapperClass4 {\n" |
| 2785 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" | 2807 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" |
| 2786 " int fld0;\n" | 2808 " int fld0;\n" |
| 2787 " int fld1;\n" | 2809 " int fld1;\n" |
| (...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3293 result = Dart_StringToCString(result, &str); | 3315 result = Dart_StringToCString(result, &str); |
| 3294 EXPECT_STREQ("hidden top !!!", str); | 3316 EXPECT_STREQ("hidden top !!!", str); |
| 3295 } | 3317 } |
| 3296 | 3318 |
| 3297 | 3319 |
| 3298 TEST_CASE(Invoke_FunnyArgs) { | 3320 TEST_CASE(Invoke_FunnyArgs) { |
| 3299 const char* kScriptChars = | 3321 const char* kScriptChars = |
| 3300 "test(arg) => 'hello $arg';\n"; | 3322 "test(arg) => 'hello $arg';\n"; |
| 3301 | 3323 |
| 3302 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 3324 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 3325 Dart_Handle func_name = Dart_NewString("test"); |
| 3303 Dart_Handle args[1]; | 3326 Dart_Handle args[1]; |
| 3304 const char* str; | 3327 const char* str; |
| 3305 | 3328 |
| 3306 // Make sure that valid args yield valid results. | 3329 // Make sure that valid args yield valid results. |
| 3307 args[0] = Dart_NewString("!!!"); | 3330 args[0] = Dart_NewString("!!!"); |
| 3308 Dart_Handle result = Dart_Invoke(lib, Dart_NewString("test"), 1, args); | 3331 Dart_Handle result = Dart_Invoke(lib, func_name, 1, args); |
| 3309 EXPECT_VALID(result); | 3332 EXPECT_VALID(result); |
| 3310 result = Dart_StringToCString(result, &str); | 3333 result = Dart_StringToCString(result, &str); |
| 3311 EXPECT_STREQ("hello !!!", str); | 3334 EXPECT_STREQ("hello !!!", str); |
| 3312 | 3335 |
| 3313 // Make sure that null is legal. | 3336 // Make sure that null is legal. |
| 3314 args[0] = Dart_Null(); | 3337 args[0] = Dart_Null(); |
| 3315 result = Dart_Invoke(lib, Dart_NewString("test"), 1, args); | 3338 result = Dart_Invoke(lib, func_name, 1, args); |
| 3316 EXPECT_VALID(result); | 3339 EXPECT_VALID(result); |
| 3317 result = Dart_StringToCString(result, &str); | 3340 result = Dart_StringToCString(result, &str); |
| 3318 EXPECT_STREQ("hello null", str); | 3341 EXPECT_STREQ("hello null", str); |
| 3319 | 3342 |
| 3320 // Pass a non-instance handle. | 3343 // Pass an error handle as the target. The error is propagated. |
| 3344 result = Dart_Invoke(Api::NewError("myerror"), |
| 3345 func_name, 1, args); |
| 3346 EXPECT(Dart_IsError(result)); |
| 3347 EXPECT_STREQ("myerror", Dart_GetError(result)); |
| 3348 |
| 3349 // Pass an error handle as the function name. The error is propagated. |
| 3350 result = Dart_Invoke(lib, Api::NewError("myerror"), 1, args); |
| 3351 EXPECT(Dart_IsError(result)); |
| 3352 EXPECT_STREQ("myerror", Dart_GetError(result)); |
| 3353 |
| 3354 // Pass a non-instance handle as a parameter.. |
| 3321 args[0] = lib; | 3355 args[0] = lib; |
| 3322 result = Dart_Invoke(lib, Dart_NewString("test"), 1, args); | 3356 result = Dart_Invoke(lib, func_name, 1, args); |
| 3323 EXPECT(Dart_IsError(result)); | 3357 EXPECT(Dart_IsError(result)); |
| 3324 EXPECT_STREQ("Dart_Invoke expects argument 0 to be an instance of Object.", | 3358 EXPECT_STREQ("Dart_Invoke expects argument 0 to be an instance of Object.", |
| 3325 Dart_GetError(result)); | 3359 Dart_GetError(result)); |
| 3326 | 3360 |
| 3327 // Pass an error handle. The error is contagious. | 3361 // Pass an error handle as a parameter. The error is propagated. |
| 3328 args[0] = Api::NewError("myerror"); | 3362 args[0] = Api::NewError("myerror"); |
| 3329 result = Dart_Invoke(lib, Dart_NewString("test"), 1, args); | 3363 result = Dart_Invoke(lib, func_name, 1, args); |
| 3330 EXPECT(Dart_IsError(result)); | 3364 EXPECT(Dart_IsError(result)); |
| 3331 EXPECT_STREQ("myerror", Dart_GetError(result)); | 3365 EXPECT_STREQ("myerror", Dart_GetError(result)); |
| 3332 } | 3366 } |
| 3333 | 3367 |
| 3334 | 3368 |
| 3335 TEST_CASE(Invoke_Null) { | 3369 TEST_CASE(Invoke_Null) { |
| 3336 Dart_Handle result = Dart_Invoke(Dart_Null(), | 3370 Dart_Handle result = Dart_Invoke(Dart_Null(), |
| 3337 Dart_NewString("toString"), | 3371 Dart_NewString("toString"), |
| 3338 0, | 3372 0, |
| 3339 NULL); | 3373 NULL); |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3743 | 3777 |
| 3744 // Further calls to LoadScript are errors. | 3778 // Further calls to LoadScript are errors. |
| 3745 result = Dart_LoadScript(url, source); | 3779 result = Dart_LoadScript(url, source); |
| 3746 EXPECT(Dart_IsError(result)); | 3780 EXPECT(Dart_IsError(result)); |
| 3747 EXPECT_STREQ("Dart_LoadScript: " | 3781 EXPECT_STREQ("Dart_LoadScript: " |
| 3748 "A script has already been loaded from 'dart:test-lib'.", | 3782 "A script has already been loaded from 'dart:test-lib'.", |
| 3749 Dart_GetError(result)); | 3783 Dart_GetError(result)); |
| 3750 } | 3784 } |
| 3751 | 3785 |
| 3752 | 3786 |
| 3787 TEST_CASE(RootLibrary) { |
| 3788 const char* kScriptChars = |
| 3789 "main() {" |
| 3790 " return 12345;" |
| 3791 "}"; |
| 3792 |
| 3793 Dart_Handle root_lib = Dart_RootLibrary(); |
| 3794 EXPECT_VALID(root_lib); |
| 3795 EXPECT(Dart_IsNull(root_lib)); |
| 3796 |
| 3797 // Load a script. |
| 3798 Dart_Handle url = Dart_NewString(TestCase::url()); |
| 3799 Dart_Handle source = Dart_NewString(kScriptChars); |
| 3800 EXPECT_VALID(Dart_LoadScript(url, source)); |
| 3801 |
| 3802 root_lib = Dart_RootLibrary(); |
| 3803 Dart_Handle lib_name = Dart_LibraryName(root_lib); |
| 3804 EXPECT_VALID(lib_name); |
| 3805 EXPECT(!Dart_IsNull(root_lib)); |
| 3806 const char* name_cstr = ""; |
| 3807 EXPECT_VALID(Dart_StringToCString(lib_name, &name_cstr)); |
| 3808 EXPECT_STREQ(TestCase::url(), name_cstr); |
| 3809 } |
| 3810 |
| 3811 |
| 3753 static const char* var_mapping[] = { | 3812 static const char* var_mapping[] = { |
| 3754 "GOOGLE3", ".", | 3813 "GOOGLE3", ".", |
| 3755 "ABC", "lala", | 3814 "ABC", "lala", |
| 3756 "var1", "", | 3815 "var1", "", |
| 3757 "var2", "winner", | 3816 "var2", "winner", |
| 3758 }; | 3817 }; |
| 3759 static int index = 0; | 3818 static int index = 0; |
| 3760 | 3819 |
| 3761 | 3820 |
| 3762 static Dart_Handle import_library_handler(Dart_LibraryTag tag, | 3821 static Dart_Handle import_library_handler(Dart_LibraryTag tag, |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3912 EXPECT_STREQ("incoming error", Dart_GetError(result)); | 3971 EXPECT_STREQ("incoming error", Dart_GetError(result)); |
| 3913 | 3972 |
| 3914 url = Dart_NewString("noodles.dart"); | 3973 url = Dart_NewString("noodles.dart"); |
| 3915 result = Dart_LookupLibrary(url); | 3974 result = Dart_LookupLibrary(url); |
| 3916 EXPECT(Dart_IsError(result)); | 3975 EXPECT(Dart_IsError(result)); |
| 3917 EXPECT_STREQ("Dart_LookupLibrary: library 'noodles.dart' not found.", | 3976 EXPECT_STREQ("Dart_LookupLibrary: library 'noodles.dart' not found.", |
| 3918 Dart_GetError(result)); | 3977 Dart_GetError(result)); |
| 3919 } | 3978 } |
| 3920 | 3979 |
| 3921 | 3980 |
| 3981 TEST_CASE(LibraryName) { |
| 3982 const char* kLibrary1Chars = |
| 3983 "#library('library1_name');"; |
| 3984 Dart_Handle url = Dart_NewString("library1_url"); |
| 3985 Dart_Handle source = Dart_NewString(kLibrary1Chars); |
| 3986 Dart_Handle lib = Dart_LoadLibrary(url, source); |
| 3987 Dart_Handle error = Dart_Error("incoming error"); |
| 3988 EXPECT_VALID(lib); |
| 3989 |
| 3990 Dart_Handle result = Dart_LibraryName(Dart_Null()); |
| 3991 EXPECT(Dart_IsError(result)); |
| 3992 EXPECT_STREQ("Dart_LibraryName expects argument 'library' to be non-null.", |
| 3993 Dart_GetError(result)); |
| 3994 |
| 3995 result = Dart_LibraryName(Dart_True()); |
| 3996 EXPECT(Dart_IsError(result)); |
| 3997 EXPECT_STREQ( |
| 3998 "Dart_LibraryName expects argument 'library' to be of type Library.", |
| 3999 Dart_GetError(result)); |
| 4000 |
| 4001 result = Dart_LibraryName(error); |
| 4002 EXPECT(Dart_IsError(result)); |
| 4003 EXPECT_STREQ("incoming error", Dart_GetError(result)); |
| 4004 |
| 4005 result = Dart_LibraryName(lib); |
| 4006 EXPECT_VALID(result); |
| 4007 EXPECT(Dart_IsString(result)); |
| 4008 const char* cstr = NULL; |
| 4009 EXPECT_VALID(Dart_StringToCString(result, &cstr)); |
| 4010 EXPECT_STREQ("library1_name", cstr); |
| 4011 } |
| 4012 |
| 4013 |
| 3922 TEST_CASE(LibraryUrl) { | 4014 TEST_CASE(LibraryUrl) { |
| 3923 const char* kLibrary1Chars = | 4015 const char* kLibrary1Chars = |
| 3924 "#library('library1_name');"; | 4016 "#library('library1_name');"; |
| 3925 Dart_Handle url = Dart_NewString("library1_url"); | 4017 Dart_Handle url = Dart_NewString("library1_url"); |
| 3926 Dart_Handle source = Dart_NewString(kLibrary1Chars); | 4018 Dart_Handle source = Dart_NewString(kLibrary1Chars); |
| 3927 Dart_Handle lib = Dart_LoadLibrary(url, source); | 4019 Dart_Handle lib = Dart_LoadLibrary(url, source); |
| 3928 Dart_Handle error = Dart_Error("incoming error"); | 4020 Dart_Handle error = Dart_Error("incoming error"); |
| 3929 EXPECT_VALID(lib); | 4021 EXPECT_VALID(lib); |
| 3930 | 4022 |
| 3931 Dart_Handle result = Dart_LibraryUrl(Dart_Null()); | 4023 Dart_Handle result = Dart_LibraryUrl(Dart_Null()); |
| (...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4799 // We should have received the expected number of interrupts. | 4891 // We should have received the expected number of interrupts. |
| 4800 EXPECT_EQ(kInterruptCount, interrupt_count); | 4892 EXPECT_EQ(kInterruptCount, interrupt_count); |
| 4801 | 4893 |
| 4802 // Give the spawned thread enough time to properly exit. | 4894 // Give the spawned thread enough time to properly exit. |
| 4803 Isolate::SetInterruptCallback(saved); | 4895 Isolate::SetInterruptCallback(saved); |
| 4804 } | 4896 } |
| 4805 | 4897 |
| 4806 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 4898 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
| 4807 | 4899 |
| 4808 } // namespace dart | 4900 } // namespace dart |
| OLD | NEW |