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

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

Issue 197963002: Remove the ability to allow multiple gc prologue and gc epilogue callbacks (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698