| 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 "bin/builtin.h" | 5 #include "bin/builtin.h" |
| 6 #include "include/dart_api.h" | 6 #include "include/dart_api.h" |
| 7 #include "include/dart_debugger_api.h" | 7 #include "include/dart_debugger_api.h" |
| 8 #include "include/dart_mirrors_api.h" | 8 #include "include/dart_mirrors_api.h" |
| 9 #include "include/dart_native_api.h" | 9 #include "include/dart_native_api.h" |
| 10 #include "platform/assert.h" | 10 #include "platform/assert.h" |
| (...skipping 2863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2874 global_epilogue_callback_status *= 4; | 2874 global_epilogue_callback_status *= 4; |
| 2875 } | 2875 } |
| 2876 | 2876 |
| 2877 | 2877 |
| 2878 static void EpilogueCallbackTimes5() { | 2878 static void EpilogueCallbackTimes5() { |
| 2879 global_epilogue_callback_status *= 5; | 2879 global_epilogue_callback_status *= 5; |
| 2880 } | 2880 } |
| 2881 | 2881 |
| 2882 | 2882 |
| 2883 TEST_CASE(AddGarbageCollectionCallbacks) { | 2883 TEST_CASE(AddGarbageCollectionCallbacks) { |
| 2884 // Prologue callback addition testing. |
| 2885 |
| 2884 // Add a prologue callback. | 2886 // Add a prologue callback. |
| 2885 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); | 2887 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); |
| 2886 | 2888 |
| 2887 // Add the same prologue callback again. This is an error. | 2889 // Add the same prologue callback again. This is an error. |
| 2888 EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2))); | 2890 EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2))); |
| 2889 | 2891 |
| 2890 // Add another prologue callback. | 2892 // Add another prologue callback. This is an error. |
| 2891 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3)); | 2893 EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3))); |
| 2892 | 2894 |
| 2893 // Add the same prologue callback again. This is an error. | 2895 // Epilogue callback addition testing. |
| 2894 EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3))); | |
| 2895 | 2896 |
| 2896 // Add an epilogue callback. | 2897 // Add an epilogue callback. |
| 2897 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); | 2898 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); |
| 2898 | 2899 |
| 2899 // Add the same epilogue callback again. This is an error. | 2900 // Add the same epilogue callback again. This is an error. |
| 2900 EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4))); | 2901 EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4))); |
| 2901 | 2902 |
| 2902 // Add annother epilogue callback. | 2903 // Add annother epilogue callback. This is an error. |
| 2903 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5)); | |
| 2904 | |
| 2905 // Add the same epilogue callback again. This is an error. | |
| 2906 EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5))); | 2904 EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5))); |
| 2907 } | 2905 } |
| 2908 | 2906 |
| 2909 | 2907 |
| 2910 TEST_CASE(RemoveGarbageCollectionCallbacks) { | 2908 TEST_CASE(RemoveGarbageCollectionCallbacks) { |
| 2909 // Prologue callback removal testing. |
| 2910 |
| 2911 // Remove a prologue callback that has not been added. This is an error. | 2911 // Remove a prologue callback that has not been added. This is an error. |
| 2912 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2))); | 2912 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2))); |
| 2913 | 2913 |
| 2914 // Add a prologue callback. | 2914 // Add a prologue callback. |
| 2915 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); | 2915 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); |
| 2916 | 2916 |
| 2917 // Remove a prologue callback. | 2917 // Remove a prologue callback. |
| 2918 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)); | 2918 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)); |
| 2919 | 2919 |
| 2920 // Remove a prologue callback again. This is an error. | 2920 // Remove a prologue callback again. This is an error. |
| 2921 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2))); | 2921 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2))); |
| 2922 | 2922 |
| 2923 // Add two prologue callbacks. | 2923 // Add a prologue callback. |
| 2924 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); | 2924 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); |
| 2925 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3)); | |
| 2926 | 2925 |
| 2927 // Remove two prologue callbacks. | 2926 // Remove a prolog callback that was not added. This is an error. |
| 2928 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes3)); | 2927 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes3))); |
| 2929 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)); | |
| 2930 | 2928 |
| 2931 // Remove epilogue callbacks again. This is an error. | 2929 // Epilogue callback removal testing. |
| 2930 |
| 2931 // Remove epilogue callback that was not added. This is an error. |
| 2932 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4))); | 2932 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4))); |
| 2933 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5))); | |
| 2934 | 2933 |
| 2935 // Remove a epilogue callback that has not been added. This is an error. | 2934 // Add an epilogue callback. |
| 2936 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5))); | |
| 2937 | |
| 2938 // Add a epilogue callback. | |
| 2939 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); | 2935 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); |
| 2940 | 2936 |
| 2941 // Remove a epilogue callback. | 2937 // Remove an epilogue callback. |
| 2942 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)); | 2938 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)); |
| 2943 | 2939 |
| 2944 // Remove a epilogue callback again. This is an error. | 2940 // Remove an epilogue callback again. This is an error. |
| 2945 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4))); | 2941 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4))); |
| 2946 | 2942 |
| 2947 // Add two epilogue callbacks. | 2943 // Add an epilogue callbacks. |
| 2948 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); | 2944 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); |
| 2949 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5)); | |
| 2950 | 2945 |
| 2951 // Remove two epilogue callbacks. | 2946 // Remove an epilogue callback that was not added. This is an error. |
| 2952 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)); | |
| 2953 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)); | |
| 2954 | |
| 2955 // Remove epilogue callbacks again. This is an error. | |
| 2956 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4))); | |
| 2957 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5))); | 2947 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5))); |
| 2958 } | 2948 } |
| 2959 | 2949 |
| 2960 | 2950 |
| 2961 TEST_CASE(SingleGarbageCollectionCallback) { | 2951 TEST_CASE(SingleGarbageCollectionCallback) { |
| 2962 // Add a prologue callback. | 2952 // Add a prologue callback. |
| 2963 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); | 2953 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); |
| 2964 | 2954 |
| 2965 // Garbage collect new space ignoring callbacks. This should not | 2955 // Garbage collect new space ignoring callbacks. This should not |
| 2966 // invoke the prologue callback. No status values should change. | 2956 // invoke the prologue callback. No status values should change. |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3047 | 3037 |
| 3048 // Garbage collect old space. No callbacks should be invoked. No | 3038 // Garbage collect old space. No callbacks should be invoked. No |
| 3049 // status values should change. | 3039 // status values should change. |
| 3050 global_prologue_callback_status = 3; | 3040 global_prologue_callback_status = 3; |
| 3051 global_epilogue_callback_status = 7; | 3041 global_epilogue_callback_status = 7; |
| 3052 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 3042 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 3053 EXPECT_EQ(3, global_prologue_callback_status); | 3043 EXPECT_EQ(3, global_prologue_callback_status); |
| 3054 EXPECT_EQ(7, global_epilogue_callback_status); | 3044 EXPECT_EQ(7, global_epilogue_callback_status); |
| 3055 } | 3045 } |
| 3056 | 3046 |
| 3057 TEST_CASE(MultipleGarbageCollectionCallbacks) { | |
| 3058 // Add prologue callbacks. | |
| 3059 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); | |
| 3060 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3)); | |
| 3061 | |
| 3062 // Add an epilogue callback. | |
| 3063 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); | |
| 3064 | |
| 3065 // Garbage collect new space. This should not invoke the prologue | |
| 3066 // or epilogue callbacks. No status values should change. | |
| 3067 global_prologue_callback_status = 3; | |
| 3068 global_epilogue_callback_status = 7; | |
| 3069 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | |
| 3070 EXPECT_EQ(3, global_prologue_callback_status); | |
| 3071 EXPECT_EQ(7, global_epilogue_callback_status); | |
| 3072 | |
| 3073 // Garbage collect old space. This should invoke both prologue | |
| 3074 // callbacks and the epilogue callback. The prologue and epilogue | |
| 3075 // status values should change. | |
| 3076 global_prologue_callback_status = 3; | |
| 3077 global_epilogue_callback_status = 7; | |
| 3078 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | |
| 3079 EXPECT_EQ(18, global_prologue_callback_status); | |
| 3080 EXPECT_EQ(28, global_epilogue_callback_status); | |
| 3081 | |
| 3082 // Add another GC epilogue callback. | |
| 3083 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5)); | |
| 3084 | |
| 3085 // Garbage collect old space. This should invoke both prologue | |
| 3086 // callbacks and both epilogue callbacks. The prologue and epilogue | |
| 3087 // status values should change. | |
| 3088 global_prologue_callback_status = 3; | |
| 3089 global_epilogue_callback_status = 7; | |
| 3090 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | |
| 3091 EXPECT_EQ(18, global_prologue_callback_status); | |
| 3092 EXPECT_EQ(140, global_epilogue_callback_status); | |
| 3093 | |
| 3094 // Remove an epilogue callback. | |
| 3095 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)); | |
| 3096 | |
| 3097 // Garbage collect old space. This should invoke both prologue | |
| 3098 // callbacks and the remaining epilogue callback. The prologue and | |
| 3099 // epilogue status values should change. | |
| 3100 global_prologue_callback_status = 3; | |
| 3101 global_epilogue_callback_status = 7; | |
| 3102 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | |
| 3103 EXPECT_EQ(18, global_prologue_callback_status); | |
| 3104 EXPECT_EQ(35, global_epilogue_callback_status); | |
| 3105 | |
| 3106 // Remove the remaining epilogue callback. | |
| 3107 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)); | |
| 3108 | |
| 3109 // Garbage collect old space. This should invoke both prologue | |
| 3110 // callbacks. The prologue status value should change. | |
| 3111 global_prologue_callback_status = 3; | |
| 3112 global_epilogue_callback_status = 7; | |
| 3113 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | |
| 3114 EXPECT_EQ(18, global_prologue_callback_status); | |
| 3115 EXPECT_EQ(7, global_epilogue_callback_status); | |
| 3116 | |
| 3117 // Remove a prologue callback. | |
| 3118 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes3)); | |
| 3119 | |
| 3120 // Garbage collect old space. This should invoke the remaining | |
| 3121 // prologue callback. The prologue status value should change. | |
| 3122 global_prologue_callback_status = 3; | |
| 3123 global_epilogue_callback_status = 7; | |
| 3124 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | |
| 3125 EXPECT_EQ(6, global_prologue_callback_status); | |
| 3126 EXPECT_EQ(7, global_epilogue_callback_status); | |
| 3127 | |
| 3128 // Remove the remaining prologue callback. | |
| 3129 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)); | |
| 3130 | |
| 3131 // Garbage collect old space. No callbacks should be invoked. No | |
| 3132 // status values should change. | |
| 3133 global_prologue_callback_status = 3; | |
| 3134 global_epilogue_callback_status = 7; | |
| 3135 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | |
| 3136 EXPECT_EQ(3, global_prologue_callback_status); | |
| 3137 EXPECT_EQ(7, global_epilogue_callback_status); | |
| 3138 } | |
| 3139 | |
| 3140 | 3047 |
| 3141 // Unit test for creating multiple scopes and local handles within them. | 3048 // Unit test for creating multiple scopes and local handles within them. |
| 3142 // Ensure that the local handles get all cleaned out when exiting the | 3049 // Ensure that the local handles get all cleaned out when exiting the |
| 3143 // scope. | 3050 // scope. |
| 3144 UNIT_TEST_CASE(LocalHandles) { | 3051 UNIT_TEST_CASE(LocalHandles) { |
| 3145 TestCase::CreateTestIsolate(); | 3052 TestCase::CreateTestIsolate(); |
| 3146 Isolate* isolate = Isolate::Current(); | 3053 Isolate* isolate = Isolate::Current(); |
| 3147 EXPECT(isolate != NULL); | 3054 EXPECT(isolate != NULL); |
| 3148 ApiState* state = isolate->api_state(); | 3055 ApiState* state = isolate->api_state(); |
| 3149 EXPECT(state != NULL); | 3056 EXPECT(state != NULL); |
| (...skipping 4986 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8136 NewString("main"), | 8043 NewString("main"), |
| 8137 1, | 8044 1, |
| 8138 dart_args); | 8045 dart_args); |
| 8139 int64_t value = 0; | 8046 int64_t value = 0; |
| 8140 result = Dart_IntegerToInt64(result, &value); | 8047 result = Dart_IntegerToInt64(result, &value); |
| 8141 EXPECT_VALID(result); | 8048 EXPECT_VALID(result); |
| 8142 EXPECT_EQ(6, value); | 8049 EXPECT_EQ(6, value); |
| 8143 } | 8050 } |
| 8144 | 8051 |
| 8145 } // namespace dart | 8052 } // namespace dart |
| OLD | NEW |