Skip to content

Commit 87f3f5a

Browse files
committed
test: plug AliasedBuffer cctest memory leak
No need to heap-allocate values here. PR-URL: #20665 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Daniel Bevenius <[email protected]>
1 parent 57dfd64 commit 87f3f5a

File tree

1 file changed

+37
-42
lines changed

1 file changed

+37
-42
lines changed

test/cctest/test_aliased_buffer.cc

+37-42
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,26 @@ using node::AliasedBuffer;
88
class AliasBufferTest : public NodeTestFixture {};
99

1010
template<class NativeT>
11-
void CreateOracleValues(NativeT* buf, size_t count) {
12-
for (size_t i = 0, j = count; i < count; i++, j--) {
13-
buf[i] = static_cast<NativeT>(j);
11+
void CreateOracleValues(std::vector<NativeT>* buf) {
12+
for (size_t i = 0, j = buf->size(); i < buf->size(); i++, j--) {
13+
(*buf)[i] = static_cast<NativeT>(j);
1414
}
1515
}
1616

1717
template<class NativeT, class V8T>
1818
void WriteViaOperator(AliasedBuffer<NativeT, V8T>* aliasedBuffer,
19-
size_t size,
20-
NativeT* oracle) {
19+
const std::vector<NativeT>& oracle) {
2120
// write through the API
22-
for (size_t i = 0; i < size; i++) {
21+
for (size_t i = 0; i < oracle.size(); i++) {
2322
(*aliasedBuffer)[i] = oracle[i];
2423
}
2524
}
2625

2726
template<class NativeT, class V8T>
2827
void WriteViaSetValue(AliasedBuffer<NativeT, V8T>* aliasedBuffer,
29-
size_t size,
30-
NativeT* oracle) {
28+
const std::vector<NativeT>& oracle) {
3129
// write through the API
32-
for (size_t i = 0; i < size; i++) {
30+
for (size_t i = 0; i < oracle.size(); i++) {
3331
aliasedBuffer->SetValue(i, oracle[i]);
3432
}
3533
}
@@ -38,27 +36,26 @@ template<class NativeT, class V8T>
3836
void ReadAndValidate(v8::Isolate* isolate,
3937
v8::Local<v8::Context> context,
4038
AliasedBuffer<NativeT, V8T>* aliasedBuffer,
41-
size_t size,
42-
NativeT* oracle) {
39+
const std::vector<NativeT>& oracle) {
4340
// read through the API
44-
for (size_t i = 0; i < size; i++) {
41+
for (size_t i = 0; i < oracle.size(); i++) {
4542
NativeT v1 = (*aliasedBuffer)[i];
4643
NativeT v2 = aliasedBuffer->GetValue(i);
4744
EXPECT_TRUE(v1 == oracle[i]);
4845
EXPECT_TRUE(v2 == oracle[i]);
4946
}
5047

5148
// validate size of JS Buffer
52-
EXPECT_TRUE(aliasedBuffer->GetJSArray()->Length() == size);
49+
EXPECT_TRUE(aliasedBuffer->GetJSArray()->Length() == oracle.size());
5350
EXPECT_TRUE(
5451
aliasedBuffer->GetJSArray()->ByteLength() ==
55-
(size * sizeof(NativeT)));
52+
(oracle.size() * sizeof(NativeT)));
5653

5754
// validate operator * and GetBuffer are the same
5855
EXPECT_TRUE(aliasedBuffer->GetNativeBuffer() == *(*aliasedBuffer));
5956

6057
// read through the JS API
61-
for (size_t i = 0; i < size; i++) {
58+
for (size_t i = 0; i < oracle.size(); i++) {
6259
v8::Local<V8T> v8TypedArray = aliasedBuffer->GetJSArray();
6360
v8::MaybeLocal<v8::Value> v = v8TypedArray->Get(context, i);
6461
EXPECT_TRUE(v.IsEmpty() == false);
@@ -80,21 +77,19 @@ void ReadWriteTest(v8::Isolate* isolate) {
8077

8178
const size_t size = 100;
8279
AliasedBuffer<NativeT, V8T> ab(isolate, size);
83-
NativeT* oracle = new NativeT[size];
84-
CreateOracleValues(oracle, size);
85-
WriteViaOperator(&ab, size, oracle);
86-
ReadAndValidate(isolate, context, &ab, size, oracle);
80+
std::vector<NativeT> oracle(size);
81+
CreateOracleValues(&oracle);
82+
WriteViaOperator(&ab, oracle);
83+
ReadAndValidate(isolate, context, &ab, oracle);
8784

88-
WriteViaSetValue(&ab, size, oracle);
85+
WriteViaSetValue(&ab, oracle);
8986

9087
// validate copy constructor
9188
{
9289
AliasedBuffer<NativeT, V8T> ab2(ab);
93-
ReadAndValidate(isolate, context, &ab2, size, oracle);
90+
ReadAndValidate(isolate, context, &ab2, oracle);
9491
}
95-
ReadAndValidate(isolate, context, &ab, size, oracle);
96-
97-
delete[] oracle;
92+
ReadAndValidate(isolate, context, &ab, oracle);
9893
}
9994

10095
template<
@@ -124,28 +119,28 @@ void SharedBufferTest(
124119
AliasedBuffer<NativeT_C, V8T_C> ab_C(
125120
isolate, sizeInBytes_A + sizeInBytes_B, count_C, rootBuffer);
126121

127-
NativeT_A* oracle_A = new NativeT_A[count_A];
128-
NativeT_B* oracle_B = new NativeT_B[count_B];
129-
NativeT_C* oracle_C = new NativeT_C[count_C];
130-
CreateOracleValues(oracle_A, count_A);
131-
CreateOracleValues(oracle_B, count_B);
132-
CreateOracleValues(oracle_C, count_C);
122+
std::vector<NativeT_A> oracle_A(count_A);
123+
std::vector<NativeT_B> oracle_B(count_B);
124+
std::vector<NativeT_C> oracle_C(count_C);
125+
CreateOracleValues(&oracle_A);
126+
CreateOracleValues(&oracle_B);
127+
CreateOracleValues(&oracle_C);
133128

134-
WriteViaOperator(&ab_A, count_A, oracle_A);
135-
WriteViaOperator(&ab_B, count_B, oracle_B);
136-
WriteViaOperator(&ab_C, count_C, oracle_C);
129+
WriteViaOperator(&ab_A, oracle_A);
130+
WriteViaOperator(&ab_B, oracle_B);
131+
WriteViaOperator(&ab_C, oracle_C);
137132

138-
ReadAndValidate(isolate, context, &ab_A, count_A, oracle_A);
139-
ReadAndValidate(isolate, context, &ab_B, count_B, oracle_B);
140-
ReadAndValidate(isolate, context, &ab_C, count_C, oracle_C);
133+
ReadAndValidate(isolate, context, &ab_A, oracle_A);
134+
ReadAndValidate(isolate, context, &ab_B, oracle_B);
135+
ReadAndValidate(isolate, context, &ab_C, oracle_C);
141136

142-
WriteViaSetValue(&ab_A, count_A, oracle_A);
143-
WriteViaSetValue(&ab_B, count_B, oracle_B);
144-
WriteViaSetValue(&ab_C, count_C, oracle_C);
137+
WriteViaSetValue(&ab_A, oracle_A);
138+
WriteViaSetValue(&ab_B, oracle_B);
139+
WriteViaSetValue(&ab_C, oracle_C);
145140

146-
ReadAndValidate(isolate, context, &ab_A, count_A, oracle_A);
147-
ReadAndValidate(isolate, context, &ab_B, count_B, oracle_B);
148-
ReadAndValidate(isolate, context, &ab_C, count_C, oracle_C);
141+
ReadAndValidate(isolate, context, &ab_A, oracle_A);
142+
ReadAndValidate(isolate, context, &ab_B, oracle_B);
143+
ReadAndValidate(isolate, context, &ab_C, oracle_C);
149144
}
150145

151146
TEST_F(AliasBufferTest, Uint8Array) {

0 commit comments

Comments
 (0)