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 "platform/assert.h" | 5 #include "platform/assert.h" |
6 #include "vm/assembler.h" | 6 #include "vm/assembler.h" |
7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
8 #include "vm/isolate.h" | 8 #include "vm/isolate.h" |
9 #include "vm/object.h" | 9 #include "vm/object.h" |
10 #include "vm/object_store.h" | 10 #include "vm/object_store.h" |
(...skipping 2844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2855 "#3 _bar (dart:test-lib:16:3)\n" | 2855 "#3 _bar (dart:test-lib:16:3)\n" |
2856 "#4 MyClass.field (dart:test-lib:25:9)\n" | 2856 "#4 MyClass.field (dart:test-lib:25:9)\n" |
2857 "#5 MyClass.foo.fooHelper (dart:test-lib:30:7)\n" | 2857 "#5 MyClass.foo.fooHelper (dart:test-lib:30:7)\n" |
2858 "#6 MyClass.foo (dart:test-lib:32:14)\n" | 2858 "#6 MyClass.foo (dart:test-lib:32:14)\n" |
2859 "#7 MyClass.MyClass.<anonymous closure> (dart:test-lib:21:15)\n" | 2859 "#7 MyClass.MyClass.<anonymous closure> (dart:test-lib:21:15)\n" |
2860 "#8 MyClass.MyClass (dart:test-lib:21:18)\n" | 2860 "#8 MyClass.MyClass (dart:test-lib:21:18)\n" |
2861 "#9 main.<anonymous closure> (dart:test-lib:37:10)\n" | 2861 "#9 main.<anonymous closure> (dart:test-lib:37:10)\n" |
2862 "#10 main (dart:test-lib:37:24)"); | 2862 "#10 main (dart:test-lib:37:24)"); |
2863 } | 2863 } |
2864 | 2864 |
| 2865 |
| 2866 TEST_CASE(WeakProperty_PreserveOne_NewSpace) { |
| 2867 Isolate* isolate = Isolate::Current(); |
| 2868 WeakProperty& weak = WeakProperty::Handle(); |
| 2869 OneByteString& key = OneByteString::Handle(); |
| 2870 key ^= OneByteString::New("key"); |
| 2871 { |
| 2872 HANDLESCOPE(isolate); |
| 2873 OneByteString& value = OneByteString::Handle(); |
| 2874 value ^= OneByteString::New("value"); |
| 2875 weak ^= WeakProperty::New(); |
| 2876 weak.set_key(key); |
| 2877 weak.set_value(value); |
| 2878 } |
| 2879 isolate->heap()->CollectAllGarbage(); |
| 2880 EXPECT(weak.key() != Object::null()); |
| 2881 EXPECT(weak.value() != Object::null()); |
| 2882 } |
| 2883 |
| 2884 |
| 2885 TEST_CASE(WeakProperty_PreserveTwo_NewSpace) { |
| 2886 Isolate* isolate = Isolate::Current(); |
| 2887 WeakProperty& weak1 = WeakProperty::Handle(); |
| 2888 OneByteString& key1 = OneByteString::Handle(); |
| 2889 key1 ^= OneByteString::New("key1"); |
| 2890 WeakProperty& weak2 = WeakProperty::Handle(); |
| 2891 OneByteString& key2 = OneByteString::Handle(); |
| 2892 key2 ^= OneByteString::New("key2"); |
| 2893 { |
| 2894 HANDLESCOPE(isolate); |
| 2895 OneByteString& value1 = OneByteString::Handle(); |
| 2896 value1 ^= OneByteString::New("value1"); |
| 2897 weak1 ^= WeakProperty::New(); |
| 2898 weak1.set_key(key1); |
| 2899 weak1.set_value(value1); |
| 2900 OneByteString& value2 = OneByteString::Handle(); |
| 2901 value2 ^= OneByteString::New("value2"); |
| 2902 weak2 ^= WeakProperty::New(); |
| 2903 weak2.set_key(key2); |
| 2904 weak2.set_value(value2); |
| 2905 } |
| 2906 isolate->heap()->CollectAllGarbage(); |
| 2907 EXPECT(weak1.key() != Object::null()); |
| 2908 EXPECT(weak1.value() != Object::null()); |
| 2909 EXPECT(weak2.key() != Object::null()); |
| 2910 EXPECT(weak2.value() != Object::null()); |
| 2911 } |
| 2912 |
| 2913 |
| 2914 TEST_CASE(WeakProperty_PreserveTwoShared_NewSpace) { |
| 2915 Isolate* isolate = Isolate::Current(); |
| 2916 WeakProperty& weak1 = WeakProperty::Handle(); |
| 2917 WeakProperty& weak2 = WeakProperty::Handle(); |
| 2918 OneByteString& key = OneByteString::Handle(); |
| 2919 key ^= OneByteString::New("key"); |
| 2920 { |
| 2921 HANDLESCOPE(isolate); |
| 2922 OneByteString& value1 = OneByteString::Handle(); |
| 2923 value1 ^= OneByteString::New("value1"); |
| 2924 weak1 ^= WeakProperty::New(); |
| 2925 weak1.set_key(key); |
| 2926 weak1.set_value(value1); |
| 2927 OneByteString& value2 = OneByteString::Handle(); |
| 2928 value2 ^= OneByteString::New("value2"); |
| 2929 weak2 ^= WeakProperty::New(); |
| 2930 weak2.set_key(key); |
| 2931 weak2.set_value(value2); |
| 2932 } |
| 2933 isolate->heap()->CollectAllGarbage(); |
| 2934 EXPECT(weak1.key() != Object::null()); |
| 2935 EXPECT(weak1.value() != Object::null()); |
| 2936 EXPECT(weak2.key() != Object::null()); |
| 2937 EXPECT(weak2.value() != Object::null()); |
| 2938 } |
| 2939 |
| 2940 |
| 2941 TEST_CASE(WeakProperty_PreserveOne_OldSpace) { |
| 2942 Isolate* isolate = Isolate::Current(); |
| 2943 WeakProperty& weak = WeakProperty::Handle(); |
| 2944 OneByteString& key = OneByteString::Handle(); |
| 2945 key ^= OneByteString::New("key", Heap::kOld); |
| 2946 { |
| 2947 HANDLESCOPE(isolate); |
| 2948 OneByteString& value = OneByteString::Handle(); |
| 2949 value ^= OneByteString::New("value", Heap::kOld); |
| 2950 weak ^= WeakProperty::New(Heap::kOld); |
| 2951 weak.set_key(key); |
| 2952 weak.set_value(value); |
| 2953 } |
| 2954 isolate->heap()->CollectAllGarbage(); |
| 2955 EXPECT(weak.key() != Object::null()); |
| 2956 EXPECT(weak.value() != Object::null()); |
| 2957 } |
| 2958 |
| 2959 |
| 2960 TEST_CASE(WeakProperty_PreserveTwo_OldSpace) { |
| 2961 Isolate* isolate = Isolate::Current(); |
| 2962 WeakProperty& weak1 = WeakProperty::Handle(); |
| 2963 OneByteString& key1 = OneByteString::Handle(); |
| 2964 key1 ^= OneByteString::New("key1", Heap::kOld); |
| 2965 WeakProperty& weak2 = WeakProperty::Handle(); |
| 2966 OneByteString& key2 = OneByteString::Handle(); |
| 2967 key2 ^= OneByteString::New("key2", Heap::kOld); |
| 2968 { |
| 2969 HANDLESCOPE(isolate); |
| 2970 OneByteString& value1 = OneByteString::Handle(); |
| 2971 value1 ^= OneByteString::New("value1", Heap::kOld); |
| 2972 weak1 ^= WeakProperty::New(Heap::kOld); |
| 2973 weak1.set_key(key1); |
| 2974 weak1.set_value(value1); |
| 2975 OneByteString& value2 = OneByteString::Handle(); |
| 2976 value2 ^= OneByteString::New("value2", Heap::kOld); |
| 2977 weak2 ^= WeakProperty::New(Heap::kOld); |
| 2978 weak2.set_key(key2); |
| 2979 weak2.set_value(value2); |
| 2980 } |
| 2981 isolate->heap()->CollectAllGarbage(); |
| 2982 EXPECT(weak1.key() != Object::null()); |
| 2983 EXPECT(weak1.value() != Object::null()); |
| 2984 EXPECT(weak2.key() != Object::null()); |
| 2985 EXPECT(weak2.value() != Object::null()); |
| 2986 } |
| 2987 |
| 2988 |
| 2989 TEST_CASE(WeakProperty_PreserveTwoShared_OldSpace) { |
| 2990 Isolate* isolate = Isolate::Current(); |
| 2991 WeakProperty& weak1 = WeakProperty::Handle(); |
| 2992 WeakProperty& weak2 = WeakProperty::Handle(); |
| 2993 OneByteString& key = OneByteString::Handle(); |
| 2994 key ^= OneByteString::New("key", Heap::kOld); |
| 2995 { |
| 2996 HANDLESCOPE(isolate); |
| 2997 OneByteString& value1 = OneByteString::Handle(); |
| 2998 value1 ^= OneByteString::New("value1", Heap::kOld); |
| 2999 weak1 ^= WeakProperty::New(Heap::kOld); |
| 3000 weak1.set_key(key); |
| 3001 weak1.set_value(value1); |
| 3002 OneByteString& value2 = OneByteString::Handle(); |
| 3003 value2 ^= OneByteString::New("value2", Heap::kOld); |
| 3004 weak2 ^= WeakProperty::New(Heap::kOld); |
| 3005 weak2.set_key(key); |
| 3006 weak2.set_value(value2); |
| 3007 } |
| 3008 isolate->heap()->CollectAllGarbage(); |
| 3009 EXPECT(weak1.key() != Object::null()); |
| 3010 EXPECT(weak1.value() != Object::null()); |
| 3011 EXPECT(weak2.key() != Object::null()); |
| 3012 EXPECT(weak2.value() != Object::null()); |
| 3013 } |
| 3014 |
| 3015 |
| 3016 TEST_CASE(WeakProperty_ClearOne_NewSpace) { |
| 3017 Isolate* isolate = Isolate::Current(); |
| 3018 WeakProperty& weak = WeakProperty::Handle(); |
| 3019 { |
| 3020 HANDLESCOPE(isolate); |
| 3021 OneByteString& key = OneByteString::Handle(); |
| 3022 key ^= OneByteString::New("key"); |
| 3023 OneByteString& value = OneByteString::Handle(); |
| 3024 value ^= OneByteString::New("value"); |
| 3025 weak ^= WeakProperty::New(); |
| 3026 weak.set_key(key); |
| 3027 weak.set_value(value); |
| 3028 key ^= OneByteString::null(); |
| 3029 value ^= OneByteString::null(); |
| 3030 } |
| 3031 isolate->heap()->CollectAllGarbage(); |
| 3032 EXPECT(weak.key() == Object::null()); |
| 3033 EXPECT(weak.value() == Object::null()); |
| 3034 } |
| 3035 |
| 3036 |
| 3037 TEST_CASE(WeakProperty_ClearTwoShared_NewSpace) { |
| 3038 Isolate* isolate = Isolate::Current(); |
| 3039 WeakProperty& weak1 = WeakProperty::Handle(); |
| 3040 WeakProperty& weak2 = WeakProperty::Handle(); |
| 3041 { |
| 3042 HANDLESCOPE(isolate); |
| 3043 OneByteString& key = OneByteString::Handle(); |
| 3044 key ^= OneByteString::New("key"); |
| 3045 OneByteString& value1 = OneByteString::Handle(); |
| 3046 value1 ^= OneByteString::New("value1"); |
| 3047 weak1 ^= WeakProperty::New(); |
| 3048 weak1.set_key(key); |
| 3049 weak1.set_value(value1); |
| 3050 OneByteString& value2 = OneByteString::Handle(); |
| 3051 value2 ^= OneByteString::New("value2"); |
| 3052 weak2 ^= WeakProperty::New(); |
| 3053 weak2.set_key(key); |
| 3054 weak2.set_value(value2); |
| 3055 } |
| 3056 isolate->heap()->CollectAllGarbage(); |
| 3057 EXPECT(weak1.key() == Object::null()); |
| 3058 EXPECT(weak1.value() == Object::null()); |
| 3059 EXPECT(weak2.key() == Object::null()); |
| 3060 EXPECT(weak2.value() == Object::null()); |
| 3061 } |
| 3062 |
| 3063 |
| 3064 TEST_CASE(WeakProperty_ClearOne_OldSpace) { |
| 3065 Isolate* isolate = Isolate::Current(); |
| 3066 WeakProperty& weak = WeakProperty::Handle(); |
| 3067 { |
| 3068 HANDLESCOPE(isolate); |
| 3069 OneByteString& key = OneByteString::Handle(); |
| 3070 key ^= OneByteString::New("key", Heap::kOld); |
| 3071 OneByteString& value = OneByteString::Handle(); |
| 3072 value ^= OneByteString::New("value", Heap::kOld); |
| 3073 weak ^= WeakProperty::New(Heap::kOld); |
| 3074 weak.set_key(key); |
| 3075 weak.set_value(value); |
| 3076 key ^= OneByteString::null(); |
| 3077 value ^= OneByteString::null(); |
| 3078 } |
| 3079 isolate->heap()->CollectAllGarbage(); |
| 3080 EXPECT(weak.key() == Object::null()); |
| 3081 EXPECT(weak.value() == Object::null()); |
| 3082 } |
| 3083 |
| 3084 |
| 3085 TEST_CASE(WeakProperty_ClearTwoShared_OldSpace) { |
| 3086 Isolate* isolate = Isolate::Current(); |
| 3087 WeakProperty& weak1 = WeakProperty::Handle(); |
| 3088 WeakProperty& weak2 = WeakProperty::Handle(); |
| 3089 { |
| 3090 HANDLESCOPE(isolate); |
| 3091 OneByteString& key = OneByteString::Handle(); |
| 3092 key ^= OneByteString::New("key", Heap::kOld); |
| 3093 OneByteString& value1 = OneByteString::Handle(); |
| 3094 value1 ^= OneByteString::New("value1"); |
| 3095 weak1 ^= WeakProperty::New(Heap::kOld); |
| 3096 weak1.set_key(key); |
| 3097 weak1.set_value(value1); |
| 3098 OneByteString& value2 = OneByteString::Handle(); |
| 3099 value2 ^= OneByteString::New("value2", Heap::kOld); |
| 3100 weak2 ^= WeakProperty::New(Heap::kOld); |
| 3101 weak2.set_key(key); |
| 3102 weak2.set_value(value2); |
| 3103 } |
| 3104 isolate->heap()->CollectAllGarbage(); |
| 3105 EXPECT(weak1.key() == Object::null()); |
| 3106 EXPECT(weak1.value() == Object::null()); |
| 3107 EXPECT(weak2.key() == Object::null()); |
| 3108 EXPECT(weak2.value() == Object::null()); |
| 3109 } |
| 3110 |
2865 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 3111 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
2866 | 3112 |
2867 } // namespace dart | 3113 } // namespace dart |
OLD | NEW |