Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index e876689c431f60e9eedc619ba24205e33be9b0ed..ea0c345e2ddb5a7ed1dc877901402b1fda7094ca 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -7702,8 +7702,7 @@ struct FlagAndPersistent { |
}; |
-static void SetFlag( |
- const v8::WeakCallbackData<v8::Object, FlagAndPersistent>& data) { |
+static void SetFlag(const v8::PhantomCallbackData<FlagAndPersistent>& data) { |
data.GetParameter()->flag = true; |
} |
@@ -7769,6 +7768,98 @@ THREADED_TEST(IndependentWeakHandle) { |
} |
+class Trivial { |
+ public: |
+ explicit Trivial(int x) : x_(x) {} |
+ |
+ int x() { return x_; } |
+ void set_x(int x) { x_ = x; } |
+ |
+ private: |
+ int x_; |
+}; |
+ |
+ |
+class Trivial2 { |
+ public: |
+ Trivial2(int x, int y) : y_(y), x_(x) {} |
+ |
+ int x() { return x_; } |
+ void set_x(int x) { x_ = x; } |
+ |
+ int y() { return y_; } |
+ void set_y(int y) { y_ = y; } |
+ |
+ private: |
+ int y_; |
+ int x_; |
+}; |
+ |
+ |
+void CheckInternalFields( |
+ const v8::InternalFieldsCallbackData<Trivial, Trivial2>& data) { |
+ Trivial* t1 = data.GetInternalField1(); |
+ Trivial2* t2 = data.GetInternalField2(); |
+ CHECK_EQ(42, t1->x()); |
+ CHECK_EQ(103, t2->x()); |
+ t1->set_x(1729); |
+ t2->set_x(33550336); |
+} |
+ |
+ |
+void InternalFieldCallback(bool global_gc) { |
+ LocalContext env; |
+ v8::Isolate* isolate = env->GetIsolate(); |
+ v8::HandleScope scope(isolate); |
+ |
+ Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
+ Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); |
+ Trivial* t1; |
+ Trivial2* t2; |
+ instance_templ->SetInternalFieldCount(2); |
+ { |
+ v8::HandleScope scope(isolate); |
+ Local<v8::Object> obj = templ->GetFunction()->NewInstance(); |
+ v8::Persistent<v8::Object> handle(isolate, obj); |
+ CHECK_EQ(2, obj->InternalFieldCount()); |
+ CHECK(obj->GetInternalField(0)->IsUndefined()); |
+ t1 = new Trivial(42); |
+ t2 = new Trivial2(103, 9); |
+ |
+ obj->SetAlignedPointerInInternalField(0, t1); |
+ t1 = reinterpret_cast<Trivial*>(obj->GetAlignedPointerFromInternalField(0)); |
+ CHECK_EQ(42, t1->x()); |
+ |
+ obj->SetAlignedPointerInInternalField(1, t2); |
+ t2 = |
+ reinterpret_cast<Trivial2*>(obj->GetAlignedPointerFromInternalField(1)); |
+ CHECK_EQ(103, t2->x()); |
+ |
+ handle.SetPhantom(CheckInternalFields, 0, 1); |
+ if (!global_gc) { |
+ handle.MarkIndependent(); |
+ } |
+ } |
+ if (global_gc) { |
+ CcTest::heap()->CollectAllGarbage(TestHeap::Heap::kNoGCFlags); |
+ } else { |
+ CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
+ } |
+ |
+ CHECK_EQ(1729, t1->x()); |
+ CHECK_EQ(33550336, t2->x()); |
+ |
+ delete t1; |
+ delete t2; |
+} |
+ |
+ |
+THREADED_TEST(InternalFieldCallback) { |
+ InternalFieldCallback(false); |
+ InternalFieldCallback(true); |
+} |
+ |
+ |
static void ResetUseValueAndSetFlag( |
const v8::WeakCallbackData<v8::Object, FlagAndPersistent>& data) { |
// Blink will reset the handle, and then use the other handle, so they |