Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 1 | // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include <stdlib.h> |
| 6 | |
| 7 | #include "src/v8.h" |
| 8 | #include "test/cctest/cctest.h" |
| 9 | |
| 10 | #include "src/api.h" |
| 11 | #include "src/heap/heap.h" |
| 12 | #include "src/objects.h" |
| 13 | |
| 14 | using namespace v8::internal; |
| 15 | |
| 16 | void TestArrayBufferViewContents(LocalContext& env, bool should_use_buffer) { |
| 17 | v8::Local<v8::Object> obj_a = v8::Local<v8::Object>::Cast( |
| 18 | env->Global() |
| 19 | ->Get(v8::Isolate::GetCurrent()->GetCurrentContext(), v8_str("a")) |
| 20 | .ToLocalChecked()); |
| 21 | CHECK(obj_a->IsArrayBufferView()); |
| 22 | v8::Local<v8::ArrayBufferView> array_buffer_view = |
| 23 | v8::Local<v8::ArrayBufferView>::Cast(obj_a); |
| 24 | CHECK_EQ(array_buffer_view->HasBuffer(), should_use_buffer); |
| 25 | unsigned char contents[4] = {23, 23, 23, 23}; |
| 26 | CHECK_EQ(sizeof(contents), |
| 27 | array_buffer_view->CopyContents(contents, sizeof(contents))); |
| 28 | CHECK_EQ(array_buffer_view->HasBuffer(), should_use_buffer); |
| 29 | for (size_t i = 0; i < sizeof(contents); ++i) { |
| 30 | CHECK_EQ(i, contents[i]); |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | |
| 35 | TEST(CopyContentsTypedArray) { |
| 36 | LocalContext env; |
| 37 | v8::HandleScope scope(env->GetIsolate()); |
| 38 | CompileRun( |
| 39 | "var a = new Uint8Array(4);" |
| 40 | "a[0] = 0;" |
| 41 | "a[1] = 1;" |
| 42 | "a[2] = 2;" |
| 43 | "a[3] = 3;"); |
| 44 | TestArrayBufferViewContents(env, false); |
| 45 | } |
| 46 | |
| 47 | |
| 48 | TEST(CopyContentsArray) { |
| 49 | LocalContext env; |
| 50 | v8::HandleScope scope(env->GetIsolate()); |
| 51 | CompileRun("var a = new Uint8Array([0, 1, 2, 3]);"); |
| 52 | TestArrayBufferViewContents(env, false); |
| 53 | } |
| 54 | |
| 55 | |
| 56 | TEST(CopyContentsView) { |
| 57 | LocalContext env; |
| 58 | v8::HandleScope scope(env->GetIsolate()); |
| 59 | CompileRun( |
| 60 | "var b = new ArrayBuffer(6);" |
| 61 | "var c = new Uint8Array(b);" |
| 62 | "c[0] = -1;" |
| 63 | "c[1] = -1;" |
| 64 | "c[2] = 0;" |
| 65 | "c[3] = 1;" |
| 66 | "c[4] = 2;" |
| 67 | "c[5] = 3;" |
| 68 | "var a = new DataView(b, 2);"); |
| 69 | TestArrayBufferViewContents(env, true); |
| 70 | } |
| 71 | |
| 72 | |
| 73 | TEST(AllocateNotExternal) { |
| 74 | LocalContext env; |
| 75 | v8::HandleScope scope(env->GetIsolate()); |
| 76 | void* memory = reinterpret_cast<Isolate*>(env->GetIsolate()) |
| 77 | ->array_buffer_allocator() |
| 78 | ->Allocate(1024); |
| 79 | v8::Local<v8::ArrayBuffer> buffer = |
| 80 | v8::ArrayBuffer::New(env->GetIsolate(), memory, 1024, |
| 81 | v8::ArrayBufferCreationMode::kInternalized); |
| 82 | CHECK(!buffer->IsExternal()); |
| 83 | CHECK_EQ(memory, buffer->GetContents().Data()); |
| 84 | } |