OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 3175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3186 TestPersistentValueMap<v8::StdPersistentValueMap<int, v8::Object>>(); | 3186 TestPersistentValueMap<v8::StdPersistentValueMap<int, v8::Object>>(); |
3187 | 3187 |
3188 // Custom traits with weak callbacks: | 3188 // Custom traits with weak callbacks: |
3189 typedef v8::PersistentValueMap<int, v8::Object, | 3189 typedef v8::PersistentValueMap<int, v8::Object, |
3190 WeakStdMapTraits<int, v8::Object>> | 3190 WeakStdMapTraits<int, v8::Object>> |
3191 WeakPersistentValueMap; | 3191 WeakPersistentValueMap; |
3192 TestPersistentValueMap<WeakPersistentValueMap>(); | 3192 TestPersistentValueMap<WeakPersistentValueMap>(); |
3193 } | 3193 } |
3194 | 3194 |
3195 | 3195 |
3196 namespace { | |
3197 | |
3198 void* IntKeyToVoidPointer(int key) { return reinterpret_cast<void*>(key << 1); } | |
3199 | |
3200 | |
3201 Local<v8::Object> NewObjectForIntKey( | |
3202 v8::Isolate* isolate, const v8::Global<v8::ObjectTemplate>& templ, | |
3203 int key) { | |
3204 auto local = Local<v8::ObjectTemplate>::New(isolate, templ); | |
3205 auto obj = local->NewInstance(); | |
3206 obj->SetAlignedPointerInInternalField(0, IntKeyToVoidPointer(key)); | |
3207 return obj; | |
3208 } | |
3209 | |
3210 | |
3211 template <typename K, typename V> | |
3212 class PhantomStdMapTraits : public v8::StdMapTraits<K, V> { | |
3213 public: | |
3214 typedef typename v8::GlobalValueMap<K, V, PhantomStdMapTraits<K, V>> MapType; | |
3215 static const v8::PersistentContainerCallbackType kCallbackType = | |
3216 v8::kWeakWithInternalFields; | |
3217 struct WeakCallbackDataType { | |
3218 MapType* map; | |
3219 K key; | |
3220 }; | |
3221 static WeakCallbackDataType* WeakCallbackParameter(MapType* map, const K& key, | |
3222 Local<V> value) { | |
3223 WeakCallbackDataType* data = new WeakCallbackDataType; | |
3224 data->map = map; | |
3225 data->key = key; | |
3226 return data; | |
3227 } | |
3228 static MapType* MapFromWeakCallbackInfo( | |
3229 const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { | |
3230 return data.GetParameter()->map; | |
3231 } | |
3232 static K KeyFromWeakCallbackInfo( | |
3233 const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { | |
3234 return data.GetParameter()->key; | |
3235 } | |
3236 static void DisposeCallbackData(WeakCallbackDataType* data) { delete data; } | |
3237 static void Dispose(v8::Isolate* isolate, v8::Global<V> value, K key) { | |
3238 CHECK_EQ(IntKeyToVoidPointer(key), | |
3239 v8::Object::GetAlignedPointerFromInternalField(value, 0)); | |
3240 } | |
3241 static void DisposeWeak( | |
3242 v8::Isolate* isolate, | |
3243 const v8::WeakCallbackInfo<WeakCallbackDataType>& info, K key) { | |
3244 CHECK_EQ(IntKeyToVoidPointer(key), info.GetInternalField1()); | |
Erik Corry
2015/03/24 12:16:20
The test only uses the deprecated version, not the
| |
3245 } | |
3246 }; | |
3247 } | |
3248 | |
3249 | |
3250 TEST(GlobalValueMap) { | |
3251 typedef v8::GlobalValueMap<int, v8::Object, | |
3252 PhantomStdMapTraits<int, v8::Object>> Map; | |
3253 LocalContext env; | |
3254 v8::Isolate* isolate = env->GetIsolate(); | |
3255 v8::Global<ObjectTemplate> templ; | |
3256 { | |
3257 HandleScope scope(isolate); | |
3258 auto t = ObjectTemplate::New(isolate); | |
3259 t->SetInternalFieldCount(1); | |
3260 templ.Reset(isolate, t); | |
3261 } | |
3262 Map map(isolate); | |
3263 v8::internal::GlobalHandles* global_handles = | |
3264 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles(); | |
3265 int initial_handle_count = global_handles->global_handles_count(); | |
3266 CHECK_EQ(0, static_cast<int>(map.Size())); | |
3267 { | |
3268 HandleScope scope(isolate); | |
3269 Local<v8::Object> obj = map.Get(7); | |
3270 CHECK(obj.IsEmpty()); | |
3271 Local<v8::Object> expected = v8::Object::New(isolate); | |
3272 map.Set(7, expected); | |
3273 CHECK_EQ(1, static_cast<int>(map.Size())); | |
3274 obj = map.Get(7); | |
3275 CHECK(expected->Equals(obj)); | |
3276 { | |
3277 typename Map::PersistentValueReference ref = map.GetReference(7); | |
3278 CHECK(expected->Equals(ref.NewLocal(isolate))); | |
3279 } | |
3280 v8::Global<v8::Object> removed = map.Remove(7); | |
3281 CHECK_EQ(0, static_cast<int>(map.Size())); | |
3282 CHECK(expected == removed); | |
3283 removed = map.Remove(7); | |
3284 CHECK(removed.IsEmpty()); | |
3285 map.Set(8, expected); | |
3286 CHECK_EQ(1, static_cast<int>(map.Size())); | |
3287 map.Set(8, expected); | |
3288 CHECK_EQ(1, static_cast<int>(map.Size())); | |
3289 { | |
3290 typename Map::PersistentValueReference ref; | |
3291 | |
3292 Local<v8::Object> expected2 = NewObjectForIntKey(isolate, templ, 8); | |
3293 removed = map.Set(8, v8::Global<v8::Object>(isolate, expected2), &ref); | |
3294 CHECK_EQ(1, static_cast<int>(map.Size())); | |
3295 CHECK(expected == removed); | |
3296 CHECK(expected2->Equals(ref.NewLocal(isolate))); | |
3297 } | |
3298 } | |
3299 CHECK_EQ(initial_handle_count + 1, global_handles->global_handles_count()); | |
3300 CcTest::i_isolate()->heap()->CollectAllGarbage( | |
3301 i::Heap::kAbortIncrementalMarkingMask); | |
3302 CHECK_EQ(0, static_cast<int>(map.Size())); | |
3303 CHECK_EQ(initial_handle_count, global_handles->global_handles_count()); | |
3304 { | |
3305 HandleScope scope(isolate); | |
3306 Local<v8::Object> value = NewObjectForIntKey(isolate, templ, 9); | |
3307 map.Set(9, value); | |
3308 map.Clear(); | |
3309 } | |
3310 CHECK_EQ(0, static_cast<int>(map.Size())); | |
3311 CHECK_EQ(initial_handle_count, global_handles->global_handles_count()); | |
3312 } | |
3313 | |
3314 | |
3196 TEST(PersistentValueVector) { | 3315 TEST(PersistentValueVector) { |
3197 LocalContext env; | 3316 LocalContext env; |
3198 v8::Isolate* isolate = env->GetIsolate(); | 3317 v8::Isolate* isolate = env->GetIsolate(); |
3199 v8::internal::GlobalHandles* global_handles = | 3318 v8::internal::GlobalHandles* global_handles = |
3200 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles(); | 3319 reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles(); |
3201 int handle_count = global_handles->global_handles_count(); | 3320 int handle_count = global_handles->global_handles_count(); |
3202 HandleScope scope(isolate); | 3321 HandleScope scope(isolate); |
3203 | 3322 |
3204 v8::PersistentValueVector<v8::Object> vector(isolate); | 3323 v8::PersistentValueVector<v8::Object> vector(isolate); |
3205 | 3324 |
(...skipping 18428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
21634 } | 21753 } |
21635 { | 21754 { |
21636 v8::TryCatch try_catch; | 21755 v8::TryCatch try_catch; |
21637 uint16_t* data = reinterpret_cast<uint16_t*>(buffer); | 21756 uint16_t* data = reinterpret_cast<uint16_t*>(buffer); |
21638 CHECK(v8::String::NewFromTwoByte(isolate, data, v8::String::kNormalString, | 21757 CHECK(v8::String::NewFromTwoByte(isolate, data, v8::String::kNormalString, |
21639 length).IsEmpty()); | 21758 length).IsEmpty()); |
21640 CHECK(!try_catch.HasCaught()); | 21759 CHECK(!try_catch.HasCaught()); |
21641 } | 21760 } |
21642 free(buffer); | 21761 free(buffer); |
21643 } | 21762 } |
OLD | NEW |