| 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 13135 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 13146     some_object.Reset(isolate, v8::Object::New()); | 13146     some_object.Reset(isolate, v8::Object::New()); | 
| 13147     handle1.Reset(isolate, v8::Object::New()); | 13147     handle1.Reset(isolate, v8::Object::New()); | 
| 13148     handle2.Reset(isolate, v8::Object::New()); | 13148     handle2.Reset(isolate, v8::Object::New()); | 
| 13149   } | 13149   } | 
| 13150   // Note: order is implementation dependent alas: currently | 13150   // Note: order is implementation dependent alas: currently | 
| 13151   // global handle nodes are processed by PostGarbageCollectionProcessing | 13151   // global handle nodes are processed by PostGarbageCollectionProcessing | 
| 13152   // in reverse allocation order, so if second allocated handle is deleted, | 13152   // in reverse allocation order, so if second allocated handle is deleted, | 
| 13153   // weak callback of the first handle would be able to 'reallocate' it. | 13153   // weak callback of the first handle would be able to 'reallocate' it. | 
| 13154   handle1.SetWeak(&handle1, NewPersistentHandleCallback); | 13154   handle1.SetWeak(&handle1, NewPersistentHandleCallback); | 
| 13155   handle2.Reset(); | 13155   handle2.Reset(); | 
| 13156   CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 13156   CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 
| 13157 } | 13157 } | 
| 13158 | 13158 | 
| 13159 | 13159 | 
| 13160 v8::Persistent<v8::Object> to_be_disposed; | 13160 v8::Persistent<v8::Object> to_be_disposed; | 
| 13161 | 13161 | 
| 13162 void DisposeAndForceGcCallback( | 13162 void DisposeAndForceGcCallback( | 
| 13163     const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) { | 13163     const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) { | 
| 13164   to_be_disposed.Reset(); | 13164   to_be_disposed.Reset(); | 
| 13165   CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 13165   CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 
| 13166   data.GetParameter()->Reset(); | 13166   data.GetParameter()->Reset(); | 
| 13167 } | 13167 } | 
| 13168 | 13168 | 
| 13169 | 13169 | 
| 13170 THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) { | 13170 THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) { | 
| 13171   LocalContext context; | 13171   LocalContext context; | 
| 13172   v8::Isolate* isolate = context->GetIsolate(); | 13172   v8::Isolate* isolate = context->GetIsolate(); | 
| 13173 | 13173 | 
| 13174   v8::Persistent<v8::Object> handle1, handle2; | 13174   v8::Persistent<v8::Object> handle1, handle2; | 
| 13175   { | 13175   { | 
| 13176     v8::HandleScope scope(isolate); | 13176     v8::HandleScope scope(isolate); | 
| 13177     handle1.Reset(isolate, v8::Object::New()); | 13177     handle1.Reset(isolate, v8::Object::New()); | 
| 13178     handle2.Reset(isolate, v8::Object::New()); | 13178     handle2.Reset(isolate, v8::Object::New()); | 
| 13179   } | 13179   } | 
| 13180   handle1.SetWeak(&handle1, DisposeAndForceGcCallback); | 13180   handle1.SetWeak(&handle1, DisposeAndForceGcCallback); | 
| 13181   to_be_disposed.Reset(isolate, handle2); | 13181   to_be_disposed.Reset(isolate, handle2); | 
| 13182   CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 13182   CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 
| 13183 } | 13183 } | 
| 13184 | 13184 | 
| 13185 void DisposingCallback( | 13185 void DisposingCallback( | 
| 13186     const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) { | 13186     const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) { | 
| 13187   data.GetParameter()->Reset(); | 13187   data.GetParameter()->Reset(); | 
| 13188 } | 13188 } | 
| 13189 | 13189 | 
| 13190 void HandleCreatingCallback( | 13190 void HandleCreatingCallback( | 
| 13191     const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) { | 13191     const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) { | 
| 13192   v8::HandleScope scope(data.GetIsolate()); | 13192   v8::HandleScope scope(data.GetIsolate()); | 
| 13193   v8::Persistent<v8::Object>(data.GetIsolate(), v8::Object::New()); | 13193   v8::Persistent<v8::Object>(data.GetIsolate(), v8::Object::New()); | 
| 13194   data.GetParameter()->Reset(); | 13194   data.GetParameter()->Reset(); | 
| 13195 } | 13195 } | 
| 13196 | 13196 | 
| 13197 | 13197 | 
| 13198 THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) { | 13198 THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) { | 
| 13199   LocalContext context; | 13199   LocalContext context; | 
| 13200   v8::Isolate* isolate = context->GetIsolate(); | 13200   v8::Isolate* isolate = context->GetIsolate(); | 
| 13201 | 13201 | 
| 13202   v8::Persistent<v8::Object> handle1, handle2, handle3; | 13202   v8::Persistent<v8::Object> handle1, handle2, handle3; | 
| 13203   { | 13203   { | 
| 13204     v8::HandleScope scope(isolate); | 13204     v8::HandleScope scope(isolate); | 
| 13205     handle3.Reset(isolate, v8::Object::New()); | 13205     handle3.Reset(isolate, v8::Object::New()); | 
| 13206     handle2.Reset(isolate, v8::Object::New()); | 13206     handle2.Reset(isolate, v8::Object::New()); | 
| 13207     handle1.Reset(isolate, v8::Object::New()); | 13207     handle1.Reset(isolate, v8::Object::New()); | 
| 13208   } | 13208   } | 
| 13209   handle2.SetWeak(&handle2, DisposingCallback); | 13209   handle2.SetWeak(&handle2, DisposingCallback); | 
| 13210   handle3.SetWeak(&handle3, HandleCreatingCallback); | 13210   handle3.SetWeak(&handle3, HandleCreatingCallback); | 
| 13211   CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 13211   CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 
| 13212 } | 13212 } | 
| 13213 | 13213 | 
| 13214 | 13214 | 
| 13215 THREADED_TEST(CheckForCrossContextObjectLiterals) { | 13215 THREADED_TEST(CheckForCrossContextObjectLiterals) { | 
| 13216   v8::V8::Initialize(); | 13216   v8::V8::Initialize(); | 
| 13217 | 13217 | 
| 13218   const int nof = 2; | 13218   const int nof = 2; | 
| 13219   const char* sources[nof] = { | 13219   const char* sources[nof] = { | 
| 13220     "try { [ 2, 3, 4 ].forEach(5); } catch(e) { e.toString(); }", | 13220     "try { [ 2, 3, 4 ].forEach(5); } catch(e) { e.toString(); }", | 
| 13221     "Object()" | 13221     "Object()" | 
| (...skipping 7650 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 20872   } | 20872   } | 
| 20873   for (int i = 0; i < runs; i++) { | 20873   for (int i = 0; i < runs; i++) { | 
| 20874     Local<String> expected; | 20874     Local<String> expected; | 
| 20875     if (i != 0) { | 20875     if (i != 0) { | 
| 20876       CHECK_EQ(v8_str("escape value"), values[i]); | 20876       CHECK_EQ(v8_str("escape value"), values[i]); | 
| 20877     } else { | 20877     } else { | 
| 20878       CHECK(values[i].IsEmpty()); | 20878       CHECK(values[i].IsEmpty()); | 
| 20879     } | 20879     } | 
| 20880   } | 20880   } | 
| 20881 } | 20881 } | 
| OLD | NEW | 
|---|