| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index c8f67de0abfc857747de6893320715eab7601cd1..675ac7fd7e9a1806c79e5c7b3367a9c2c5bd8c5a 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -2493,7 +2493,7 @@ THREADED_TEST(SymbolProperties) {
|
| }
|
|
|
|
|
| -THREADED_TEST(ArrayBuffer) {
|
| +THREADED_TEST(ArrayBuffer_ApiInternalToExternal) {
|
| i::FLAG_harmony_array_buffer = true;
|
| i::FLAG_harmony_typed_arrays = true;
|
|
|
| @@ -2502,10 +2502,16 @@ THREADED_TEST(ArrayBuffer) {
|
| v8::HandleScope handle_scope(isolate);
|
|
|
| Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(1024);
|
| + CHECK_EQ(1024, ab->ByteLength());
|
| + CHECK(!ab->IsExternal());
|
| HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
|
|
|
| - CHECK_EQ(1024, static_cast<int>(ab->ByteLength()));
|
| - uint8_t* data = static_cast<uint8_t*>(ab->Data());
|
| + v8::ArrayBufferContents ab_contents;
|
| + ab->Externalize(&ab_contents);
|
| + CHECK(ab->IsExternal());
|
| +
|
| + CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength()));
|
| + uint8_t* data = static_cast<uint8_t*>(ab_contents.Data());
|
| ASSERT(data != NULL);
|
| env->Global()->Set(v8_str("ab"), ab);
|
|
|
| @@ -2523,27 +2529,73 @@ THREADED_TEST(ArrayBuffer) {
|
| data[1] = 0x11;
|
| result = CompileRun("u8[0] + u8[1]");
|
| CHECK_EQ(0xDD, result->Int32Value());
|
| +}
|
| +
|
|
|
| - result = CompileRun("var ab1 = new ArrayBuffer(2);"
|
| - "var u8_a = new Uint8Array(ab1);"
|
| - "u8_a[0] = 0xAA;"
|
| - "u8_a[1] = 0xFF; u8_a.buffer");
|
| +THREADED_TEST(ArrayBuffer_JSInternalToExternal) {
|
| + i::FLAG_harmony_array_buffer = true;
|
| + i::FLAG_harmony_typed_arrays = true;
|
| +
|
| + LocalContext env;
|
| + v8::Isolate* isolate = env->GetIsolate();
|
| + v8::HandleScope handle_scope(isolate);
|
| +
|
| +
|
| + v8::Handle<v8::Value> result =
|
| + CompileRun("var ab1 = new ArrayBuffer(2);"
|
| + "var u8_a = new Uint8Array(ab1);"
|
| + "u8_a[0] = 0xAA;"
|
| + "u8_a[1] = 0xFF; u8_a.buffer");
|
| Local<v8::ArrayBuffer> ab1 = v8::ArrayBuffer::Cast(*result);
|
| CHECK_EQ(2, static_cast<int>(ab1->ByteLength()));
|
| - uint8_t* ab1_data = static_cast<uint8_t*>(ab1->Data());
|
| - CHECK_EQ(0xAA, ab1_data[0]);
|
| + CHECK(!ab1->IsExternal());
|
| + v8::ArrayBufferContents ab1_contents;
|
| + ab1->Externalize(&ab1_contents);
|
| + CHECK(ab1->IsExternal());
|
| +
|
| + result = CompileRun("ab1.byteLength");
|
| + CHECK_EQ(2, result->Int32Value());
|
| + result = CompileRun("u8_a[0]");
|
| + CHECK_EQ(0xAA, result->Int32Value());
|
| + result = CompileRun("u8_a[1]");
|
| + CHECK_EQ(0xFF, result->Int32Value());
|
| + result = CompileRun("var u8_b = new Uint8Array(ab1);"
|
| + "u8_b[0] = 0xBB;"
|
| + "u8_a[0]");
|
| + CHECK_EQ(0xBB, result->Int32Value());
|
| + result = CompileRun("u8_b[1]");
|
| + CHECK_EQ(0xFF, result->Int32Value());
|
| +
|
| + CHECK_EQ(2, static_cast<int>(ab1_contents.ByteLength()));
|
| + uint8_t* ab1_data = static_cast<uint8_t*>(ab1_contents.Data());
|
| + CHECK_EQ(0xBB, ab1_data[0]);
|
| CHECK_EQ(0xFF, ab1_data[1]);
|
| ab1_data[0] = 0xCC;
|
| ab1_data[1] = 0x11;
|
| result = CompileRun("u8_a[0] + u8_a[1]");
|
| CHECK_EQ(0xDD, result->Int32Value());
|
| +}
|
| +
|
|
|
| - uint8_t* my_data = new uint8_t[100];
|
| - memset(my_data, 0, 100);
|
| - Local<v8::ArrayBuffer> ab3 = v8::ArrayBuffer::New(my_data, 100);
|
| +THREADED_TEST(ArrayBuffer_External) {
|
| + i::FLAG_harmony_array_buffer = true;
|
| + i::FLAG_harmony_typed_arrays = true;
|
| +
|
| + LocalContext env;
|
| + v8::Isolate* isolate = env->GetIsolate();
|
| + v8::HandleScope handle_scope(isolate);
|
| +
|
| + i::ScopedVector<uint8_t> my_data(100);
|
| + memset(my_data.start(), 0, 100);
|
| + Local<v8::ArrayBuffer> ab3 = v8::ArrayBuffer::New(my_data.start(), 100);
|
| CHECK_EQ(100, static_cast<int>(ab3->ByteLength()));
|
| - CHECK_EQ(my_data, ab3->Data());
|
| + CHECK(ab3->IsExternal());
|
| +
|
| env->Global()->Set(v8_str("ab3"), ab3);
|
| +
|
| + v8::Handle<v8::Value> result = CompileRun("ab3.byteLength");
|
| + CHECK_EQ(100, result->Int32Value());
|
| +
|
| result = CompileRun("var u8_b = new Uint8Array(ab3);"
|
| "u8_b[0] = 0xBB;"
|
| "u8_b[1] = 0xCC;"
|
| @@ -2555,14 +2607,9 @@ THREADED_TEST(ArrayBuffer) {
|
| my_data[1] = 0x11;
|
| result = CompileRun("u8_b[0] + u8_b[1]");
|
| CHECK_EQ(0xDD, result->Int32Value());
|
| -
|
| - delete[] my_data;
|
| }
|
|
|
|
|
| -
|
| -
|
| -
|
| THREADED_TEST(HiddenProperties) {
|
| LocalContext env;
|
| v8::HandleScope scope(env->GetIsolate());
|
| @@ -15460,12 +15507,14 @@ void TypedArrayTestHelper(v8::ExternalArrayType array_type,
|
| i::FLAG_harmony_array_buffer = true;
|
| i::FLAG_harmony_typed_arrays = true;
|
|
|
| + i::ScopedVector<ElementType> backing_store(kElementCount+2);
|
| +
|
| LocalContext env;
|
| v8::Isolate* isolate = env->GetIsolate();
|
| v8::HandleScope handle_scope(isolate);
|
|
|
| - Local<v8::ArrayBuffer> ab =
|
| - v8::ArrayBuffer::New((kElementCount+2)*sizeof(ElementType));
|
| + Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(
|
| + backing_store.start(), (kElementCount+2)*sizeof(ElementType));
|
| Local<TypedArray> ta =
|
| TypedArray::New(ab, 2*sizeof(ElementType), kElementCount);
|
| CHECK_EQ(kElementCount, static_cast<int>(ta->Length()));
|
| @@ -15474,7 +15523,7 @@ void TypedArrayTestHelper(v8::ExternalArrayType array_type,
|
| static_cast<int>(ta->ByteLength()));
|
| CHECK_EQ(ab, ta->Buffer());
|
|
|
| - ElementType* data = static_cast<ElementType*>(ab->Data()) + 2;
|
| + ElementType* data = backing_store.start() + 2;
|
| for (int i = 0; i < kElementCount; i++) {
|
| data[i] = static_cast<ElementType>(i);
|
| }
|
|
|