GCC Code Coverage Report
Directory: ../ Exec Total Coverage
File: /home/iojs/build/workspace/node-test-commit-linux-coverage-daily/nodes/benchmark/out/../src/allocated_buffer-inl.h Lines: 56 56 100.0 %
Date: 2020-07-19 22:14:24 Branches: 14 20 70.0 %

Line Branch Exec Source
1
#ifndef SRC_ALLOCATED_BUFFER_INL_H_
2
#define SRC_ALLOCATED_BUFFER_INL_H_
3
4
#include "allocated_buffer.h"
5
#include "base_object-inl.h"
6
#include "node_buffer.h"
7
#include "env-inl.h"
8
#include "uv.h"
9
#include "v8.h"
10
#include "util-inl.h"
11
#include "node_internals.h"
12
13
namespace node {
14
15
// It's a bit awkward to define this Buffer::New() overload here, but it
16
// avoids a circular dependency with node_internals.h.
17
namespace Buffer {
18
v8::MaybeLocal<v8::Uint8Array> New(Environment* env,
19
                                   v8::Local<v8::ArrayBuffer> ab,
20
                                   size_t byte_offset,
21
                                   size_t length);
22
}
23
24
732079
NoArrayBufferZeroFillScope::NoArrayBufferZeroFillScope(
25
732079
    IsolateData* isolate_data)
26
732079
  : node_allocator_(isolate_data->node_allocator()) {
27
732079
  if (node_allocator_ != nullptr) node_allocator_->zero_fill_field()[0] = 0;
28
732079
}
29
30
1464158
NoArrayBufferZeroFillScope::~NoArrayBufferZeroFillScope() {
31
732079
  if (node_allocator_ != nullptr) node_allocator_->zero_fill_field()[0] = 1;
32
732079
}
33
34
406636
AllocatedBuffer AllocatedBuffer::AllocateManaged(
35
    Environment* env,
36
    size_t size) {
37
813272
  NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data());
38
  std::unique_ptr<v8::BackingStore> bs =
39
813272
      v8::ArrayBuffer::NewBackingStore(env->isolate(), size);
40
813272
  return AllocatedBuffer(env, std::move(bs));
41
}
42
43
406636
AllocatedBuffer::AllocatedBuffer(
44
406636
    Environment* env, std::unique_ptr<v8::BackingStore> bs)
45
406636
    : env_(env), backing_store_(std::move(bs)) {}
46
47
347766
AllocatedBuffer::AllocatedBuffer(
48
347766
    Environment* env, uv_buf_t buffer)
49
347766
    : env_(env) {
50
347766
  if (buffer.base == nullptr) return;
51
333052
  auto map = env->released_allocated_buffers();
52
333052
  auto it = map->find(buffer.base);
53
333052
  CHECK_NE(it, map->end());
54
333052
  backing_store_ = std::move(it->second);
55
333052
  map->erase(it);
56
}
57
58
325670
void AllocatedBuffer::Resize(size_t len) {
59
325670
  if (len == 0) {
60
227
    backing_store_ = v8::ArrayBuffer::NewBackingStore(env_->isolate(), 0);
61
227
    return;
62
  }
63
650886
  NoArrayBufferZeroFillScope no_zero_fill_scope(env_->isolate_data());
64
976329
  backing_store_ = v8::BackingStore::Reallocate(
65
976329
      env_->isolate(), std::move(backing_store_), len);
66
}
67
68
333052
uv_buf_t AllocatedBuffer::release() {
69
333052
  if (data() == nullptr) return uv_buf_init(nullptr, 0);
70
71
333052
  CHECK_NOT_NULL(env_);
72
333052
  uv_buf_t ret = uv_buf_init(data(), size());
73
333052
  env_->released_allocated_buffers()->emplace(
74
666104
      ret.base, std::move(backing_store_));
75
333052
  return ret;
76
}
77
78
8050212
char* AllocatedBuffer::data() {
79
8050212
  if (!backing_store_) return nullptr;
80
8046483
  return static_cast<char*>(backing_store_->Data());
81
}
82
83
5
const char* AllocatedBuffer::data() const {
84
5
  if (!backing_store_) return nullptr;
85
5
  return static_cast<char*>(backing_store_->Data());
86
}
87
88
89
806575
size_t AllocatedBuffer::size() const {
90
806575
  if (!backing_store_) return 0;
91
783031
  return backing_store_->ByteLength();
92
}
93
94
31900
void AllocatedBuffer::clear() {
95
31900
  backing_store_.reset();
96
31900
}
97
98
21538
v8::MaybeLocal<v8::Object> AllocatedBuffer::ToBuffer() {
99
21538
  v8::Local<v8::ArrayBuffer> ab = ToArrayBuffer();
100
43076
  return Buffer::New(env_, ab, 0, ab->ByteLength())
101
43076
      .FromMaybe(v8::Local<v8::Uint8Array>());
102
}
103
104
317744
v8::Local<v8::ArrayBuffer> AllocatedBuffer::ToArrayBuffer() {
105
317744
  return v8::ArrayBuffer::New(env_->isolate(), std::move(backing_store_));
106
}
107
108
}  // namespace node
109
110
#endif  // SRC_ALLOCATED_BUFFER_INL_H_