OLD | NEW |
1 // Copyright 2007-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2009 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 7997 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8008 v8_compile("gc();")->Run(); | 8008 v8_compile("gc();")->Run(); |
8009 } | 8009 } |
8010 CHECK_EQ(count, GetSurvivingGlobalObjectsCount()); | 8010 CHECK_EQ(count, GetSurvivingGlobalObjectsCount()); |
8011 } | 8011 } |
8012 } | 8012 } |
8013 | 8013 |
8014 | 8014 |
8015 v8::Persistent<v8::Object> some_object; | 8015 v8::Persistent<v8::Object> some_object; |
8016 v8::Persistent<v8::Object> bad_handle; | 8016 v8::Persistent<v8::Object> bad_handle; |
8017 | 8017 |
8018 void NewPersistentHandleCallback(v8::Persistent<v8::Value>, void*) { | 8018 void NewPersistentHandleCallback(v8::Persistent<v8::Value> handle, void*) { |
8019 v8::HandleScope scope; | 8019 v8::HandleScope scope; |
8020 bad_handle = v8::Persistent<v8::Object>::New(some_object); | 8020 bad_handle = v8::Persistent<v8::Object>::New(some_object); |
| 8021 handle.Dispose(); |
8021 } | 8022 } |
8022 | 8023 |
8023 | 8024 |
8024 THREADED_TEST(NewPersistentHandleFromWeakCallback) { | 8025 THREADED_TEST(NewPersistentHandleFromWeakCallback) { |
8025 LocalContext context; | 8026 LocalContext context; |
8026 | 8027 |
8027 v8::Persistent<v8::Object> handle1, handle2; | 8028 v8::Persistent<v8::Object> handle1, handle2; |
8028 { | 8029 { |
8029 v8::HandleScope scope; | 8030 v8::HandleScope scope; |
8030 some_object = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8031 some_object = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8031 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8032 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8032 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8033 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8033 } | 8034 } |
8034 // Note: order is implementation dependent alas: currently | 8035 // Note: order is implementation dependent alas: currently |
8035 // global handle nodes are processed by PostGarbageCollectionProcessing | 8036 // global handle nodes are processed by PostGarbageCollectionProcessing |
8036 // in reverse allocation order, so if second allocated handle is deleted, | 8037 // in reverse allocation order, so if second allocated handle is deleted, |
8037 // weak callback of the first handle would be able to 'reallocate' it. | 8038 // weak callback of the first handle would be able to 'reallocate' it. |
8038 handle1.MakeWeak(NULL, NewPersistentHandleCallback); | 8039 handle1.MakeWeak(NULL, NewPersistentHandleCallback); |
8039 handle2.Dispose(); | 8040 handle2.Dispose(); |
8040 i::Heap::CollectAllGarbage(false); | 8041 i::Heap::CollectAllGarbage(false); |
8041 } | 8042 } |
8042 | 8043 |
8043 | 8044 |
8044 v8::Persistent<v8::Object> to_be_disposed; | 8045 v8::Persistent<v8::Object> to_be_disposed; |
8045 | 8046 |
8046 void DisposeAndForceGcCallback(v8::Persistent<v8::Value> handle, void*) { | 8047 void DisposeAndForceGcCallback(v8::Persistent<v8::Value> handle, void*) { |
8047 to_be_disposed.Dispose(); | 8048 to_be_disposed.Dispose(); |
8048 i::Heap::CollectAllGarbage(false); | 8049 i::Heap::CollectAllGarbage(false); |
| 8050 handle.Dispose(); |
8049 } | 8051 } |
8050 | 8052 |
8051 | 8053 |
8052 THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) { | 8054 THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) { |
8053 LocalContext context; | 8055 LocalContext context; |
8054 | 8056 |
8055 v8::Persistent<v8::Object> handle1, handle2; | 8057 v8::Persistent<v8::Object> handle1, handle2; |
8056 { | 8058 { |
8057 v8::HandleScope scope; | 8059 v8::HandleScope scope; |
8058 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8060 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8059 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8061 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8060 } | 8062 } |
8061 handle1.MakeWeak(NULL, DisposeAndForceGcCallback); | 8063 handle1.MakeWeak(NULL, DisposeAndForceGcCallback); |
8062 to_be_disposed = handle2; | 8064 to_be_disposed = handle2; |
8063 i::Heap::CollectAllGarbage(false); | 8065 i::Heap::CollectAllGarbage(false); |
8064 } | 8066 } |
8065 | 8067 |
8066 void DisposingCallback(v8::Persistent<v8::Value> handle, void*) { | 8068 void DisposingCallback(v8::Persistent<v8::Value> handle, void*) { |
8067 handle.Dispose(); | 8069 handle.Dispose(); |
8068 } | 8070 } |
8069 | 8071 |
8070 void HandleCreatingCallback(v8::Persistent<v8::Value> handle, void*) { | 8072 void HandleCreatingCallback(v8::Persistent<v8::Value> handle, void*) { |
8071 v8::HandleScope scope; | 8073 v8::HandleScope scope; |
8072 v8::Persistent<v8::Object>::New(v8::Object::New()); | 8074 v8::Persistent<v8::Object>::New(v8::Object::New()); |
| 8075 handle.Dispose(); |
8073 } | 8076 } |
8074 | 8077 |
8075 | 8078 |
8076 THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) { | 8079 THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) { |
8077 LocalContext context; | 8080 LocalContext context; |
8078 | 8081 |
8079 v8::Persistent<v8::Object> handle1, handle2, handle3; | 8082 v8::Persistent<v8::Object> handle1, handle2, handle3; |
8080 { | 8083 { |
8081 v8::HandleScope scope; | 8084 v8::HandleScope scope; |
8082 handle3 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8085 handle3 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
(...skipping 3094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11177 | 11180 |
11178 ExpectString("str2.substring(2, 10);", "elspenda"); | 11181 ExpectString("str2.substring(2, 10);", "elspenda"); |
11179 | 11182 |
11180 ExpectString("str2.substring(2, 20);", "elspendabelabelspe"); | 11183 ExpectString("str2.substring(2, 20);", "elspendabelabelspe"); |
11181 | 11184 |
11182 ExpectString("str2.charAt(2);", "e"); | 11185 ExpectString("str2.charAt(2);", "e"); |
11183 | 11186 |
11184 reresult = CompileRun("str2.charCodeAt(2);"); | 11187 reresult = CompileRun("str2.charCodeAt(2);"); |
11185 CHECK_EQ(static_cast<int32_t>('e'), reresult->Int32Value()); | 11188 CHECK_EQ(static_cast<int32_t>('e'), reresult->Int32Value()); |
11186 } | 11189 } |
OLD | NEW |