-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnative.cc
45 lines (37 loc) · 1.33 KB
/
native.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <node.h>
#include <node_buffer.h>
#include <v8.h>
#define BUFFERS 1000000
#define BUFFER_SIZE 1
using namespace v8;
char many_datas[BUFFERS][BUFFER_SIZE];
static void FreeCallback(void* data, size_t length, void* hint) {}
void RawArrayBuffers(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
Local<Value> values[BUFFERS];
for (size_t i = 0; i < BUFFERS; i++) {
char* data = many_datas[i];
auto bs =
ArrayBuffer::NewBackingStore(data, BUFFER_SIZE, FreeCallback, nullptr);
values[i] = ArrayBuffer::New(isolate, std::move(bs));
}
args.GetReturnValue().Set(Array::New(isolate, values, BUFFERS));
}
static void FreeCallback2(char* _data, void* _hint) {}
void NodeBuffers(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
Local<Value> values[BUFFERS];
for (size_t i = 0; i < BUFFERS; i++) {
char* data = many_datas[i];
auto buf =
node::Buffer::New(isolate, data, BUFFER_SIZE, FreeCallback2, nullptr)
.ToLocalChecked();
values[i] = buf;
}
args.GetReturnValue().Set(Array::New(isolate, values, BUFFERS));
}
void Initialize(Local<Object> exports) {
NODE_SET_METHOD(exports, "rawArrayBuffers", RawArrayBuffers);
NODE_SET_METHOD(exports, "nodeBuffers", NodeBuffers);
}
NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)