Revision: 14570
Author: [email protected]
Date: Tue May 7 05:37:22 2013
Log: Add Persistent<T>::Reset which disposes the handle and redirects
it to point to another object.
BUG=
[email protected], [email protected]
Review URL: https://codereview.chromium.org/14788013
Patch from Marja Hölttä <[email protected]>.
http://code.google.com/p/v8/source/detail?r=14570
Modified:
/branches/bleeding_edge/include/v8.h
/branches/bleeding_edge/test/cctest/test-api.cc
=======================================
--- /branches/bleeding_edge/include/v8.h Tue May 7 03:44:30 2013
+++ /branches/bleeding_edge/include/v8.h Tue May 7 05:37:22 2013
@@ -690,6 +690,11 @@
// TODO(dcarney): remove before cutover
V8_INLINE(uint16_t WrapperClassId(Isolate* isolate) const);
+ /**
+ * Disposes the current contents of the handle and replaces it.
+ */
+ V8_INLINE(void Reset(Isolate* isolate, const Handle<T>& other));
+
#ifndef V8_USE_UNSAFE_HANDLES
#ifndef V8_ALLOW_ACCESS_TO_PERSISTENT_IMPLICIT
@@ -5378,6 +5383,22 @@
void Persistent<T>::SetWrapperClassId(uint16_t class_id) {
SetWrapperClassId(Isolate::GetCurrent(), class_id);
}
+
+template <class T>
+void Persistent<T>::Reset(Isolate* isolate, const Handle<T>& other) {
+ Dispose(isolate);
+#ifdef V8_USE_UNSAFE_HANDLES
+ *this = *New(isolate, other);
+#else
+ if (other.IsEmpty()) {
+ this->val_ = NULL;
+ return;
+ }
+ internal::Object** p = reinterpret_cast<internal::Object**>(other.val_);
+ this->val_ = reinterpret_cast<T*>(
+
V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), p));
+#endif
+}
template <class T>
void Persistent<T>::SetWrapperClassId(Isolate* isolate, uint16_t class_id)
{
=======================================
--- /branches/bleeding_edge/test/cctest/test-api.cc Tue May 7 03:44:30 2013
+++ /branches/bleeding_edge/test/cctest/test-api.cc Tue May 7 05:37:22 2013
@@ -2485,6 +2485,58 @@
CHECK_EQ(global->Length(), 3);
global.Dispose(isolate);
}
+
+
+THREADED_TEST(ResettingGlobalHandle) {
+ v8::Isolate* isolate = v8::Isolate::GetCurrent();
+ v8::internal::GlobalHandles* global_handles = NULL;
+ int initial_handle_count = 0;
+ v8::Persistent<String> global;
+ {
+ v8::HandleScope scope(isolate);
+ Local<String> str = v8_str("str");
+ global_handles =
+
reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
+ initial_handle_count = global_handles->NumberOfGlobalHandles();
+ global = v8::Persistent<String>::New(isolate, str);
+ }
+ CHECK_EQ(global->Length(), 3);
+ CHECK_EQ(global_handles->NumberOfGlobalHandles(), initial_handle_count +
1);
+ {
+ v8::HandleScope scope(isolate);
+ Local<String> str = v8_str("longer");
+ global.Reset(isolate, str);
+ }
+ CHECK_EQ(global->Length(), 6);
+ CHECK_EQ(global_handles->NumberOfGlobalHandles(), initial_handle_count +
1);
+ global.Dispose(isolate);
+ CHECK_EQ(global_handles->NumberOfGlobalHandles(), initial_handle_count);
+}
+
+
+THREADED_TEST(ResettingGlobalHandleToEmpty) {
+ v8::Isolate* isolate = v8::Isolate::GetCurrent();
+ v8::internal::GlobalHandles* global_handles = NULL;
+ int initial_handle_count = 0;
+ v8::Persistent<String> global;
+ {
+ v8::HandleScope scope(isolate);
+ Local<String> str = v8_str("str");
+ global_handles =
+
reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
+ initial_handle_count = global_handles->NumberOfGlobalHandles();
+ global = v8::Persistent<String>::New(isolate, str);
+ }
+ CHECK_EQ(global->Length(), 3);
+ CHECK_EQ(global_handles->NumberOfGlobalHandles(), initial_handle_count +
1);
+ {
+ v8::HandleScope scope(isolate);
+ Local<String> empty;
+ global.Reset(isolate, empty);
+ }
+ CHECK(global.IsEmpty());
+ CHECK_EQ(global_handles->NumberOfGlobalHandles(), initial_handle_count);
+}
THREADED_TEST(LocalHandle) {
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.