Skip to content

Commit 468ebe9

Browse files
committed
faster conversion to slice
1 parent 081701d commit 468ebe9

File tree

1 file changed

+36
-6
lines changed

1 file changed

+36
-6
lines changed

binding.cc

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
#include <map>
1313
#include <vector>
14+
#include <array>
15+
#include <memory>
1416

1517
/**
1618
* Forward declarations.
@@ -249,6 +251,37 @@ static size_t StringOrBufferLength (napi_env env, napi_value value) {
249251
return size;
250252
}
251253

254+
struct NapiSlice {
255+
NapiSlice(napi_env env, napi_value from) {
256+
if (IsString(env, from)) {
257+
NAPI_STATUS_THROWS_VOID(napi_get_value_string_utf8(env, from, nullptr, 0, &size_));
258+
char* data;
259+
if (size_ + 1 < stack_.size()) {
260+
data = stack_.data();
261+
} else {
262+
heap_.reset(new char[size_ + 1]);
263+
data = heap_.get();
264+
}
265+
data[size_] = 0;
266+
NAPI_STATUS_THROWS_VOID(napi_get_value_string_utf8(env, from, data, size_ + 1, &size_));
267+
data_ = data;
268+
} else if (IsBuffer(env, from)) {
269+
void* data;
270+
NAPI_STATUS_THROWS_VOID(napi_get_buffer_info(env, from, &data, &size_));
271+
data_ = static_cast<char*>(data);
272+
}
273+
}
274+
275+
operator leveldb::Slice() const {
276+
return leveldb::Slice(data_, size_);
277+
}
278+
279+
std::unique_ptr<char[]> heap_;
280+
std::array<char, 1024> stack_;
281+
char* data_;
282+
size_t size_;
283+
};
284+
252285
/**
253286
* Takes a Buffer or string property 'name' from 'opts'.
254287
* Returns null if the property does not exist or is zero-length.
@@ -1977,11 +2010,9 @@ NAPI_METHOD(batch_put) {
19772010
NAPI_ARGV(3);
19782011
NAPI_BATCH_CONTEXT();
19792012

1980-
leveldb::Slice key = ToSlice(env, argv[1]);
1981-
leveldb::Slice value = ToSlice(env, argv[2]);
2013+
const auto key = NapiSlice(env, argv[1]);
2014+
const auto value = NapiSlice(env, argv[2]);
19822015
batch->Put(key, value);
1983-
DisposeSliceBuffer(key);
1984-
DisposeSliceBuffer(value);
19852016

19862017
NAPI_RETURN_UNDEFINED();
19872018
}
@@ -1993,9 +2024,8 @@ NAPI_METHOD(batch_del) {
19932024
NAPI_ARGV(2);
19942025
NAPI_BATCH_CONTEXT();
19952026

1996-
leveldb::Slice key = ToSlice(env, argv[1]);
2027+
const auto key = NapiSlice(env, argv[1]);
19972028
batch->Del(key);
1998-
DisposeSliceBuffer(key);
19992029

20002030
NAPI_RETURN_UNDEFINED();
20012031
}

0 commit comments

Comments
 (0)